From c2f446b2d406494d0312ca2d2b95395e6488e5fa Mon Sep 17 00:00:00 2001 From: zab Date: Thu, 3 Jul 2003 22:36:21 +0000 Subject: [PATCH] ok, no, really, commit the qla2xxx driver. --- .../patches/qla2xxx-v8.00.00b1-2.5.73.patch | 58373 ++++++++++++++++++- .../kernel_patches/pc/qla2xxx-v8.00.00b1-2.5.73.pc | 80 +- 2 files changed, 58409 insertions(+), 44 deletions(-) diff --git a/lustre/kernel_patches/patches/qla2xxx-v8.00.00b1-2.5.73.patch b/lustre/kernel_patches/patches/qla2xxx-v8.00.00b1-2.5.73.patch index ca6cea2..88726a3 100644 --- a/lustre/kernel_patches/patches/qla2xxx-v8.00.00b1-2.5.73.patch +++ b/lustre/kernel_patches/patches/qla2xxx-v8.00.00b1-2.5.73.patch @@ -1,6 +1,49 @@ + drivers/scsi/Kconfig | 2 + drivers/scsi/Makefile | 1 + drivers/scsi/qla2xxx/Kconfig | 37 + drivers/scsi/qla2xxx/Makefile | 56 + drivers/scsi/qla2xxx/README.qla2x00 | 744 ++++ + drivers/scsi/qla2xxx/exioct.h | 947 +++++ + drivers/scsi/qla2xxx/exioctln.h | 255 + + drivers/scsi/qla2xxx/inioct.h | 129 + drivers/scsi/qla2xxx/ql2100tp_fw.c | 4866 ++++++++++++++++++++++++++ + drivers/scsi/qla2xxx/ql2200ip_fw.c | 5884 ++++++++++++++++++++++++++++++++ + drivers/scsi/qla2xxx/ql2300tpx_fw.c | 6494 +++++++++++++++++++++++++++++++++++ + drivers/scsi/qla2xxx/qla_cfg.c | 2780 +++++++++++++++ + drivers/scsi/qla2xxx/qla_cfg.h | 181 + drivers/scsi/qla2xxx/qla_cfgln.c | 726 +++ + drivers/scsi/qla2xxx/qla_dbg.c | 1000 +++++ + drivers/scsi/qla2xxx/qla_dbg.h | 138 + drivers/scsi/qla2xxx/qla_def.h | 2484 +++++++++++++ + drivers/scsi/qla2xxx/qla_fo.c | 1681 +++++++++ + drivers/scsi/qla2xxx/qla_fo.cfg | 31 + drivers/scsi/qla2xxx/qla_fo.h | 75 + drivers/scsi/qla2xxx/qla_gbl.h | 395 ++ + drivers/scsi/qla2xxx/qla_inioct.c | 495 ++ + drivers/scsi/qla2xxx/qla_init.c | 5945 ++++++++++++++++++++++++++++++++ + drivers/scsi/qla2xxx/qla_inline.h | 375 ++ + drivers/scsi/qla2xxx/qla_iocb.c | 1276 ++++++ + drivers/scsi/qla2xxx/qla_ip.c | 1769 +++++++++ + drivers/scsi/qla2xxx/qla_ip.h | 420 ++ + drivers/scsi/qla2xxx/qla_isr.c | 1474 ++++++++ + drivers/scsi/qla2xxx/qla_listops.h | 397 ++ + drivers/scsi/qla2xxx/qla_mbx.c | 2884 +++++++++++++++ + drivers/scsi/qla2xxx/qla_os.c | 5879 ++++++++++++++++++++++++++++++++ + drivers/scsi/qla2xxx/qla_os.h | 156 + drivers/scsi/qla2xxx/qla_settings.h | 80 + drivers/scsi/qla2xxx/qla_sup.c | 560 +++ + drivers/scsi/qla2xxx/qla_vendor.c | 193 + + drivers/scsi/qla2xxx/qla_version.h | 31 + drivers/scsi/qla2xxx/qla_xioct.c | 6589 ++++++++++++++++++++++++++++++++++++ + drivers/scsi/qla2xxx/qlfo.h | 413 ++ + drivers/scsi/qla2xxx/qlfolimits.h | 92 + drivers/scsi/qla2xxx/qlfoln.h | 76 + drivers/scsi/qla2xxx/release.txt | 22 + drivers/scsi/qla2xxx/revision.notes | 167 + 42 files changed, 58199 insertions(+) ---- linux-2.5.73/drivers/scsi/Makefile~qla2xxx-v8.00.00b1-2.5.73 2003-06-22 11:33:08.000000000 -0700 -+++ linux-2.5.73-n9560/drivers/scsi/Makefile 2003-07-01 16:29:54.000000000 -0700 +--- linux-2.5.73/drivers/scsi/Makefile~qla2xxx-v8.00.00b1-2.5.73 Sun Jun 22 11:33:08 2003 ++++ linux-2.5.73-n9560/drivers/scsi/Makefile Thu Jul 3 15:34:28 2003 @@ -73,6 +73,7 @@ obj-$(CONFIG_SCSI_QLOGIC_FAS) += qlogicf obj-$(CONFIG_SCSI_QLOGIC_ISP) += qlogicisp.o obj-$(CONFIG_SCSI_QLOGIC_FC) += qlogicfc.o @@ -9,8 +52,8 @@ obj-$(CONFIG_SCSI_PAS16) += pas16.o obj-$(CONFIG_SCSI_SEAGATE) += seagate.o obj-$(CONFIG_SCSI_FD_8xx) += seagate.o ---- linux-2.5.73/drivers/scsi/Kconfig~qla2xxx-v8.00.00b1-2.5.73 2003-06-22 11:33:16.000000000 -0700 -+++ linux-2.5.73-n9560/drivers/scsi/Kconfig 2003-07-01 16:29:54.000000000 -0700 +--- linux-2.5.73/drivers/scsi/Kconfig~qla2xxx-v8.00.00b1-2.5.73 Sun Jun 22 11:33:16 2003 ++++ linux-2.5.73-n9560/drivers/scsi/Kconfig Thu Jul 3 15:34:28 2003 @@ -1283,6 +1283,8 @@ config SCSI_QLOGIC_1280 The module will be called qla1280. If you want to compile it as a module, say M here and read . @@ -20,5 +63,58327 @@ config SCSI_QLOGICPTI tristate "PTI Qlogic, ISP Driver" depends on SBUS && SCSI +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/Kconfig Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,37 @@ ++config SCSI_QLA2XXX ++ bool "QLogic QLA2XXX FC-SCSI support (v8)" ++ ---help--- ++ help here... ++ ++config SCSI_QLA2XXX_QLA21XX ++ tristate "QLogic QLA21xx FC-SCSI support (v8)" ++ depends on SCSI_QLA2XXX ++ ---help--- ++ help here... ++ ++ If you want to compile the driver as a module ( = code which can be ++ inserted in and removed from the running kernel whenever you want), ++ say M here and read . The module ++ will be called qla2100. ++ ++config SCSI_QLA2XXX_QLA22XX ++ tristate "QLogic QLA22xx FC-SCSI support (v8)" ++ depends on SCSI_QLA2XXX ++ ---help--- ++ help here... ++ ++ If you want to compile the driver as a module ( = code which can be ++ inserted in and removed from the running kernel whenever you want), ++ say M here and read . The module ++ will be called qla2200. ++ ++config SCSI_QLA2XXX_QLA23XX ++ tristate "QLogic QLA23xx FC-SCSI support (v8)" ++ depends on SCSI_QLA2XXX ++ ---help--- ++ help here... ++ ++ If you want to compile the driver as a module ( = code which can be ++ inserted in and removed from the running kernel whenever you want), ++ say M here and read . The module ++ will be called qla2300. +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/Makefile Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,56 @@ ++# Kernel makefile for 8.x series QLogic Fibre Channel driver. ++# ++EXTRA_CFLAGS += -Idrivers/scsi -I$(obj) -DUNIQUE_FW_NAME ++ ++ISPTYPES := qla2100 qla2200 qla2300 ++ISPDIRS := $(foreach dir, $(ISPTYPES), $(addsuffix /, $(addprefix .,$(dir)))) ++ ++ISP2100_FW := ql2100tp_fw.o ++ISP2200_FW := ql2200ip_fw.o ++ISP2300_FW := ql2300tpx_fw.o #ql2322tpx_fw.o ++ ++COMMON_SRCS := qla_os.c qla_init.c qla_mbx.c qla_iocb.c qla_isr.c qla_xioct.c qla_inioct.c \ ++ qla_dbg.c qla_sup.c qla_fo.c qla_cfg.c qla_cfgln.c qla_vendor.c ++COMMON_OBJS := $(foreach file, $(COMMON_SRCS), $(patsubst %.c, %.o, $(file))) ++ ++ISP2100_DIR_SRCS := $(foreach file, $(COMMON_SRCS), $(addprefix .qla2100/,$(file))) ++ISP2100_DIR_OBJS := $(foreach file, $(COMMON_OBJS), $(addprefix .qla2100/,$(file))) ++ISP2200_DIR_SRCS := $(foreach file, $(COMMON_SRCS), $(addprefix .qla2200/,$(file))) ++ISP2200_DIR_OBJS := $(foreach file, $(COMMON_OBJS), $(addprefix .qla2200/,$(file))) ++ISP2300_DIR_SRCS := $(foreach file, $(COMMON_SRCS), $(addprefix .qla2300/,$(file))) ++ISP2300_DIR_OBJS := $(foreach file, $(COMMON_OBJS), $(addprefix .qla2300/,$(file))) ++ ++PREPALL := $(shell for dir in $(ISPDIRS) ; \ ++ do \ ++ if [ ! -d $(obj)/$${dir} ] ; then \ ++ mkdir $(obj)/$${dir} ; \ ++ fi ; \ ++ for link in $(foreach file, $(COMMON_OBJS), $(patsubst %.o, %.c, $(file))) ; \ ++ do \ ++ if [ ! -h $(obj)/$${dir}$${link} ] ; then \ ++ ln -sf ../$${link} $(obj)/$${dir}$${link} ; \ ++ fi ; \ ++ done \ ++ done) ++ ++obj-$(CONFIG_SCSI_QLA2XXX_QLA21XX) += qla2100.o ++obj-$(CONFIG_SCSI_QLA2XXX_QLA22XX) += qla2200.o ++obj-$(CONFIG_SCSI_QLA2XXX_QLA23XX) += qla2300.o ++ ++$(obj)/qla2100.o: $(PREPALL) ++$(obj)/qla2100.o: ISPTYPE := qla21xx ++$(obj)/qla2100.o: EXTRA_CFLAGS += -D$(ISPTYPE) ++ ++$(obj)/qla2200.o: $(PREPALL) ++$(obj)/qla2200.o: ISPTYPE := qla22xx ++$(obj)/qla2200.o: EXTRA_CFLAGS += -D$(ISPTYPE) ++ ++$(obj)/qla2300.o: $(PREPALL) ++$(obj)/qla2300.o: ISPTYPE := qla23xx ++$(obj)/qla2300.o: EXTRA_CFLAGS += -D$(ISPTYPE) -DTPX -DEXTENDED_IDS ++ ++qla2100-objs := $(ISP2100_DIR_OBJS) $(ISP2100_FW) ++qla2200-objs := $(ISP2200_DIR_OBJS) $(ISP2200_FW) ++qla2300-objs := $(ISP2300_DIR_OBJS) $(ISP2300_FW) ++ ++clean-files := $(ISP2100_DIR_SRCS) $(ISP2200_DIR_SRCS) $(ISP2300_DIR_SRCS) +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/README.qla2x00 Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,744 @@ ++ QLogic Fibre Channel Driver ++ for Red Hat Linux 7.2, 7.3, and Advanced Server 2.1 ++ and Suse Linux 7.3, and Enterprise 7 ++ ++Products supported: QLA22XX, QLA23XX ++ ++09/10/2002 ++ ++Contents ++-------- ++ ++1. OS Support ++ ++2. Supported Features ++ ++3. Release History ++ ++4. Saving the Driver Source to Diskette ++ ++5. Installing the Driver ++ ++ 5.1 Building the driver from the Source ++ 5.1.1. Building a Uni-Processor (UP) version of the driver ++ 5.1.2. Building a Symmetric Multi-Processor(SMP) version of the ++ Driver ++ 5.2 Load the Driver Manually using INSMOD or MODPROBE ++ 5.3 Making a RAMDISK Image to Load the Driver ++ ++6. Driver Parameters ++ ++ 6.1 System Parameters ++ 6.1.1 Multiple LUN Support ++ 6.2 NVRAM Parameters ++ 6.3 Driver Command Line Parameters ++ ++7. Limitations ++ ++8. Additional Notes ++ ++ 8.1 Proc Filesystem Support ++ 8.2 Co-existence of QLogic 4.x and 6.x Linux Drivers ++ 8.3 Failover Support ++ 8.3.1 How to enable the Failover support in the Driver ++ 8.3.2 Using SANsurfer with QLA2XXX Driver the First Time ++ 8.3.3 Configuration Changes Made via SANsurfer ++ 8.4 Persistent Binding ++ ++9. Diskette Content ++ ++10. Contacting QLogic ++ ++ ++********************************************************************** ++ ++ ++1. OS Support ++------------- ++ ++This driver works with Red Hat Linux 7.2, 7.3, and Advanced Server ++2.1 and Suse Linux 7.3 and Enterprise 7. Earlier or later versions ++of Linux may be supported but were not tested at the time of this ++release. Refer to the SUPPORTED_KERNEL_VERSION.txt file for a list ++of kernel versions tested with this release. ++ ++ ++********************************************************************** ++ ++ ++2. Supported Features ++--------------------- ++ ++* FCAL - direct attach loop ++* Point-to-point ++* Fabric support ++* Initiator mode only ++* Fault recovery on down loops ++* Persistent binding ++* Extended LUN support up to 255 LUNs ++* FC tape support ++* IPFC support ++* Non Failover and Failover capability ++ ++ ++********************************************************************** ++ ++ ++3. Release History ++------------------ ++ ++Please refer to Release Notes (release.txt). ++ ++ ++********************************************************************** ++ ++ ++4. Saving the Driver Source to Diskette ++--------------------------------------- ++ ++1. Download the failover or non-failover qla2x00src-vx.yy-*.tgz file ++ from QLogic's website. ++ ++ * Failover compressed file has suffix "fo" while non failover ++ does not. ++ ++2. If prompted "What would you like to do with this file?" choose ++ "Save this file to disk." ++3. Insert a blank diskette and download to the diskette directly. ++ ++ ++********************************************************************** ++ ++ ++5. Installing the Driver ++------------------------ ++ ++NOTE: Refer to the file BUILD_KERNEL.txt for instructions on how ++ to build a custom kernel with the QLogic Driver embedded. ++ ++5.1 Building a Driver from the Source Code ++------------------------------------------- ++ ++From the source code, you can build a qla2200.o or qla2300.o for ++your UP or SMP system, and load the driver manually or automatically ++using a RAMDISK image during system boot time. ++ ++ ++5.1.1 Building a Uni-Processor (UP) Version of the Driver ++--------------------------------------------------------- ++ ++1. Extract the kernel-headers and kernel-sources RPM files from the ++ first RedHat CD: ++ ++ # cd /mnt/cdrom/RedHat/RPMS ++ # rpm -iv kernel-headers*.rpm (not required for Red Hat 7.3) ++ # rpm -iv kernel-source*.rpm ++ ++2. Using the diskette you created in Section 4, copy the ++ qla2x00src-vx.yy-*.tgz file to /qla2x00. Follow these steps from ++ the "/" (root) directory: ++ ++ # mkdir qla2x00 ++ # cd qla2x00 ++ # mount /mnt/floppy ++ # cp /mnt/floppy/*.tgz . (the period at the end is required) ++ # tar -xvzf *.tgz ++ # cd qlogic ++ # ./drvsetup (this will extract the source files in to the ++ current directory) ++ ++3. Build the Driver qla2200.o and qla2300.o from the source code by ++ typing: ++ ++ # make all ++ ++ For SuSE Distribution: ++ ++ # make all OSVER=linux ++ ++4. To load the driver manually, see section 5.2. To make a RAMDISK ++ image to load the driver during system boot time, see section 5.3. ++ ++ ++5.1.2. Building a Symmetric Multi-Processor (SMP) Version of the Driver ++----------------------------------------------------------------------- ++ ++1. Extract the kernel-headers and kernel-source RPM files from the ++ first RedHat CD: ++ ++ # cd /mnt/cdrom/RedHat/RPMS ++ # rpm -iv kernel-headers*.rpm (not required for Red Hat 7.3) ++ # rpm -iv kernel-source*.rpm ++ ++2. Using the diskette you created in Section 4, copy the ++ qla2x00src-vx.yy-*.tgz file to /qla2x00. Follow these steps from ++ the "/" (root) directory: ++ ++ # mkdir qla2x00 ++ # cd qla2x00 ++ # mount /mnt/floppy ++ # cp /mnt/floppy/*.tgz . (the period at the end is required) ++ # tar -xvzf *.tgz ++ # cd qlogic ++ # ./drvsetup (this will extract the source files in to the ++ current directory) ++ ++3. Build the Driver qla2200.o and qla2300.o from the source code by ++ typing: ++ ++ # make all SMP=1 ++ ++ For SuSE Distribution: ++ ++ # make all SMP=1 OSVER=linux ++ ++4. To load the driver manually, see section 5.2. To make a RAMDISK ++ image to load the driver during system boot time, see section 5.3. ++ ++ ++5.2 Load the Driver Manually using INSMOD or MODPROBE ++------------------------------------------------------ ++ ++Before loading the driver manually, first build the driver binary from ++the driver source files as described in sections 5.1.1 and 5.1.2. ++ ++- To load the driver directly from the local build directory, type ++ the following: ++ ++ # insmod qla2200.o ++ or ++ # insmod qla2300.o ++ ++- To load the driver using modprobe: ++ ++ 1. Build the driver qla2200.o and qla2300.o from the source ++ code by typing: ++ ++ # make all install ++ ++ For SuSE Distribution: ++ ++ # make all OSVER=linux install ++ ++ 2. To ensure that the older driver binary included in the ++ original distribution does not interfere with the updated ++ version, please rename the old driver binary as follows: ++ ++ # cd /lib/modules//kernel/drivers/addon/qla2200 ++ # mv qla2200.o qla2200_rh.o ++ # mv qla2300.o qla2300_rh.o ++ ++ 3. Type the following to load the Driver: ++ ++ # modprobe qla2200 ++ or ++ # modprobe qla2300 ++ ++ ++5.3 Making a RAMDISK Image to Load the Driver ++---------------------------------------------- ++ ++1. Build the Driver binary files (see 5.1.1 and 5.1.2). ++ ++2. Copy the files to: ++ ++ /lib/modules//kernel/drivers/scsi/ ++ ++ ++NOTE: To ensure that the older Driver binary included in the original ++ distribution does not interfere with the updated version, ++ please rename the old Driver binary as follows: ++ ++ # cd /lib/modules//kernel/drivers/addon/qla2200 ++ # mv qla2200.o qla2200_rh.o ++ # mv qla2300.o qla2300_rh.o ++ ++3. Add the following line to /etc/modules.conf. ++ ++ alias scsi_hostadapter0 qla2200 ++ or ++ alias scsi_hostadapter0 qla2300 ++ ++NOTE: Must add one entry for each HBA in the system. For example, ++ If two QLA2200 hbas are installed add the following: ++ ++ alias scsi_hostadapter0 qla2200 ++ alias scsi_hostadapter1 qla2200 ++ ++4. Type the following command: ++ ++ # mkinitrd -f ++ ++NOTE: This step will overwrite the original ramdisk image file if ++ executed within the /boot directory. Specify a unique ramdisk ++ image name to preserve the original ramdisk image. ++ ++ - Copy the file to /boot. ++ ++ For SuSE Distribution: ++ ++ - Type the following command: ++ ++ # /sbin/mk_initrd ++ ++ NOTE: By default, the RAMDISK images created are: ++ ++ /boot/initrd ++ /boot/initrd.suse ++ ++5. Configure the boot loader with the new RAMDISK image. ++ ++ For LILO: ++ ++ Add "initrd=/boot/" in ++ /etc/lilo.conf under one of the kernel entries ++ to use the RAMDISK image. ++ ++ Run "lilo" and reboot system. Select the kernel ++ with the new RAMDISK image to come up. ++ ++ For GRUB: ++ ++ Add "initrd=/boot/" in ++ /etc/grub.conf under one of the kernel entries ++ to use the RAMDISK image. ++ ++********************************************************************** ++ ++ ++6. Driver Parameters ++-------------------- ++ ++The Driver parameters are divided into System Parameters and NVRAM ++Parameters sections. ++ ++ ++6.1 System Parameters ++---------------------- ++ ++6.1.1 Multiple LUN Support ++-------------------------- ++ ++Support for multiple LUNs can be configured in one of three ways. ++Currently, the maximum number of LUNs that can be scanned for each ++device is 128. ++ ++The kernel must be configured to have multiple LUN support enabled ++in order for non-zero LUNs to be configured and accessible. Use ++"make menuconfig" (as described in step 6, section 5.1) to build a ++kernel which has the option under SCSI Support enabled to probe all ++LUNs on SCSI devices. ++ ++ ++NOTE: If you have multiple adapters, set max_scsi_luns to the ++ largest number of LUNs supported by any one of these adapters. ++ ++- To configure multiple LUN support during boot time, type the ++following at the boot prompt: ++ ++boot: linux max_scsi_luns=128 ++ ++- If the SCSI Mid-Layer is compiled as a module, add the following ++line to the /etc/modules.conf file to scan for multiple LUNs at ++each boot: ++ ++options scsi_mod max_scsi_luns=128 ++ ++- If the SCSI Mid-Layer is not compiled as a module, the boot loader ++can be configured to scan for multiple LUNs each time the system ++boots. ++ ++For LILO, perform the following steps: ++ ++a) Add the following line to each of the kernel images listed in the ++ /etc/lilo.conf file: ++ ++append="max_scsi_luns=128" ++ ++b) Run "lilo" and reboot the system. ++ ++For GRUB, perform the following steps: ++ ++a) Append the max_scsi_luns parameters to each of the kernel images ++listed in the /etc/grub.conf file. For example: ++ ++kernel /vmlinux-2.4.7-10 ro root=/dev/hda2 max_scsi_luns=128 ++ ++b) Reboot the system. ++ ++ ++6.2 NVRAM Parameters ++--------------------- ++ ++The NVRAM features described below are hard-coded in the Driver. The ++changes made for the particular NVRAM feature in the Fast!Util do not ++take effect unless otherwise noted. ++ ++None. ++ ++ ++6.3 Driver Command Line Parameters ++----------------------------------- ++ ++'verbose' and 'quiet' are the available command line options. ++ ++ verbose - Verbose detail debug information ++ ++ quiet - Driver does not display: ++ Waiting for LIP to complete.... ++ scsi%d: Topology - %s, Host Loop address 0x%x ++ scsi(%d): LIP occurred ++ scsi(%d): LIP reset occurred ++ ++ Usage examples: ++ ++ # insmod qla2200.o options = verbose ++ # insmod qla2300.o options = verbose ++ # insmod qla2200.o ql2xopts = quiet ++ # insmod qla2300.o ql2xopts = quiet ++ ++ ++********************************************************************** ++ ++ ++7. Limitations ++-------------- ++ ++ N/A ++ ++ ++********************************************************************** ++ ++ ++8. Additional Notes ++--------------------- ++ ++ ++8.1 Proc Filesystem Support ++----------------------------- ++ ++The /proc filesystem for the QLA2200 and QLA2300 driver can be found ++in the /proc/scsi/qla2200/ and /proc/scsi/qla2300/ directories. These ++directories contain a file for each QLogic Fibre Channel adapter ++in the system. Each file will present information about the adapter ++and transfer statistics for each discovered LUN. ++ ++ ++8.2 Co-existence of QLogic 4.x and 6.x Linux Drivers ++----------------------------------------------------- ++ ++The 4.x driver provides support for QLA2100, QLA2200, and QLA23xx. ++The 6.x driver supports the QLA2200 and QLA23xx only. To make the ++drivers "co-exist", perform the following: ++ ++ Option 1. 4.x support for QLA2100 ++ 6.x support for QLA2200 and QLA23xx ++ ++ o Remove QLA2200/QLA2300/QLA2312 support from the 4.x series ++ driver: ++ ++ - Edit the qla2x00.c file ++ ++ - Look for the following line: ++ ++ {"QLA2300 ", QLA2300_DEVICE_ID, MAX_BUSES, ++ ++ OR ++ ++ {"QLA2312 ", QLA2312_DEVICE_ID, MAX_BUSES, ++ ++ - Above the found line, add this line: ++ ++ #if 0 ++ ++ - The resulting lines should read as: ++ ++ #if 0 ++ {"QLA2300 ", QLA2300_DEVICE_ID, MAX_BUSES, ++ ++ OR ++ ++ #if 0 ++ {"QLA2312 ", QLA2312_DEVICE_ID, MAX_BUSES, ++ ++ - Look for the following line: ++ ++ {"QLA2100 ", QLA2100_DEVICE_ID, MAX_BUSES, ++ ++ - Above the found line, add this line: ++ ++ #endif ++ ++ - The resulting lines should read as: ++ ++ #endif ++ {"QLA2100 ", QLA2100_DEVICE_ID, MAX_BUSES, ++ ++ Option 2. 4.x support for QLA2100 and QLA2200 ++ 6.x support for QLA23xx ++ ++ o Remove QLA2300/QLA2312 support from the 4.x series driver: ++ ++ - Edit the qla2x00.c file ++ ++ - Look for the following line: ++ ++ {"QLA2300 ", QLA2300_DEVICE_ID, MAX_BUSES, ++ ++ OR ++ ++ {"QLA2312 ", QLA2312_DEVICE_ID, MAX_BUSES, ++ ++ - Above the found line, add this line: ++ ++ #if 0 ++ ++ - The resulting lines should read as: ++ ++ #if 0 ++ {"QLA2300 ", QLA2300_DEVICE_ID, MAX_BUSES, ++ ++ OR ++ ++ #if 0 ++ {"QLA2312 ", QLA2312_DEVICE_ID, MAX_BUSES, ++ ++ - Look for the following line: ++ ++ {"QLA2200 ", QLA2200_DEVICE_ID, MAX_BUSES, ++ ++ - Above the found line, add this line: ++ ++ #endif ++ ++ - The resulting lines should read as: ++ ++ #endif ++ {"QLA2200 ", QLA2200_DEVICE_ID, MAX_BUSES, ++ ++ ++8.3 Failover Support ++--------------------- ++ ++8.3.1 How to enable the Failover support in the Driver ++------------------------------------------------------- ++ ++Failover support can be enabled in the QLA2XXX driver by enabling the ++macro MPIO_SUPPORT in qla_settings.h file ie ++ ++#define MPIO_SUPPORT 1 ++ ++Note: The failover distribution package, qla2x00src-vx.yy.zz-fo.tgz, ++has the above macro enabled by default. ++ ++ ++8.3.2 Using SANsurfer with QLA2XXX Driver the First Time ++________________________________________________________ ++ ++1. To work with SANsurfer, the driver should always be built ++ with MPIO_SUPPORT set to 1 in qla_settings.h. ++ ++2. Add the following parameter in modules.conf file: ++ ++ options qla2200 ConfigRequired=1 ql2xopts= ++ or ++ options qla2300 ConfigRequired=1 ql2xopts= ++ ++3. Now you can load the driver and SANsurfer. ++ ++ ++8.3.3 Configuration Changes Made via SANsurfer ++-------------------------------------------- ++ ++1. LUN Masking ++ ++ For the new LUN masking configuration to take effect, the ++ driver must be reloaded. The following is an example of ++ the sequence of actions to take: ++ ++ - Load the driver: ++ ++ modprobe ++ ++ - Load the qlremote agent. ++ ++ - Start the GUI and connect it to the destination system. ++ ++ - Make LUN masking changes. ++ ++ - Disconnect the host from GUI and stop qlremote agent. ++ ++ - Unload the driver: ++ ++ modprobe -r ++ ++ - Reload the driver: ++ ++ modprobe ++ ++ - Load qlremote agent again. ++ ++ - Start the GUI and connect it to the destination system. ++ ++ Now you should see the updated LUN masking configuration. ++ ++Please note that when using modprobe to load the driver, the ++length of the option line specified in /etc/modules.conf file ++has a limit of 2K characters. Any longer option line will cause ++a string overflow error from modprobe. ++ ++ ++8.4 Persistent Binding ++______________________ ++ ++ ++The Persistent Binding information consists of some adapter parameter ++entries along with some target entries. However, the Linux entries ++have been shorten to save space on the command line. Currently, there ++is no limit on the size of the command line when using modprobe. But, ++if you embedded the driver in the kernel you are using lilo that has ++a string size limitation. ++ ++Persistent Binding can be specified in two ways. Manually or using ++SANsurfer. We recommend using SANsurfer for ease of use. Reference ++section 8.3.3 for additonal information about SANsurfer. The ++following is the procedure to manually add persistent binding ++commands: ++ ++The driver displays the current configuration when the displayConfig ++command line option is specified. The persistent binding ++configuration is found in /var/log/messages file. It prints the ++configuration information in the format required by the driver. ++The best way to extract configuration messages is to use grep and ++direct the output to a file. You need to remove the Linux timestamp at ++the beginning of each message and combine them together on single line. ++For example ++ #insmod qla2200 displayConfig=1 ++ #grep "scsi-qla" /var/log/messages > /tmp/info.cfg ++ ++The format of the persistent binding commands is as follows: ++ ++Device descriptions ++ ++scsi-qla<#>-adapter-port=; ++The designated by qla<#>, where the <#> is the adapter instance number. ++ ++The parameter specifies the FC port name to be used for the adapter. ++where is the FC port name value in hexa- ++ decimal format. If this entry is not specified in the conf file, ++ the default value is the adapter's port name as saved in the NVRAM. ++Example: ++scsi-qla00-adapter-port=210000e08b01158d\; ++ ++host adapter instance 0 has a portname of 210000e08b01158d ++ ++scsi-qla<#1>-tgt-<#2>-di-<#3>-node=; ++This parameter associates the specified with the ++SCSI target ID value specified by <#2> and a device id value specified ++by <#3>. where type is the FC node name of the ++device, and <#2> is the SCSI target ID to be assigned to the device ++and <#3> is the device unique id. ++Where ++ <#1> Specifies the adapter instance number ++ <#2> Specifies the SCSI ID of Target ++ <#3> Specifies the path/device id ++ ++scsi-qla<#1>-tgt-<#2>-di-<#3>-port=; ++This parameter associates the specified with the ++SCSI target ID value specified by <#2> and a device id value specified ++by <#3>. where type is the FC port ++Where ++ <#1> Specifies the adapter instance number ++ <#2> Specifies the SCSI ID of Target ++ <#3> Specifies the path/device id (always 0 for non-failover) ++ ++name of the device, and <#2> is the SCSI target ID to be assigned to ++the device and <#3> is the device unique id. ++ ++scsi-qla<#1>-tgt-<#2>-di-<#3>-disabled=<256 bit mask>; ++This parameter associates the specified <256 bit mask> with the ++SCSI target ID value specified by <#2> and a device id value specified ++by <#3>. ++ ++Where ++ <#1> Specifies the adapter instance number ++ <#2> Specifies the SCSI ID of Target ++ <#3> Specifies the path/device id ++ ++<256 bit mask> ++msb lsb ++ 000000000000000000000000000000000000000000000000000000000000000F ++ ++the mask above will make the first four luns, 3, 2, 1, and 0 of a ++given Target disabled on that target/path. ++ ++This mask specification is heavily type checked to be a sequence of ++64 hex digits. ++ ++********************************************************************** ++ ++ ++9. Diskette Content ++-------------------- ++ ++The qla2x00src-vx.yy.zz-*.tgz files can be extracted into the ++following files: ++ ++ listops.h ++ Makefile.kernel ++ Config.in ++ makefile ++ qla_settings.h ++ qla_debug.h ++ ql2100_fw.h ++ ql2200_fw.h ++ ql2300_fw.h ++ ql2200ip_fw.h ++ ql2300ip_fw.h ++ qla2100.c ++ qla2200.c ++ qla2300.c ++ qla2x00.c ++ qla2x00.h ++ qla2x00_ioctl.c ++ qla_vendor.c ++ qla_cfg.c ++ qla_cfgln.c ++ qla_fo.c ++ qla_fo.cfg ++ qla_inioct.c ++ qla_ip.c ++ qla_mbx.c ++ qla_mbx.h ++ exioctln.h ++ exioct.h ++ inioct.h ++ qla_cfg.h ++ qla_fo.h ++ qla_gbl.h ++ qla_ip.h ++ qlfo.h ++ qlfolimits.h ++ qlfoln.h ++ qla_version.h ++ revision.notes - Revision history ++ release.txt - Release notes ++ README.qla2x00 - This file ++ ++ ++********************************************************************** ++ ++ ++10. Contacting QLogic ++--------------------- ++ ++Please visit QLogic's website (www.qlogic.com). On this site you will ++find product information, our latest drivers, and links for technical ++assistance if needed. ++ ++ ++====================================================================== ++ ++ ++ Copyright (c) 2003 QLogic Corporation. All rights reserved ++ worldwide. +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/exioct.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,947 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++/* ++ * File Name: exioct.h ++ * ++ * San/Device Management Ioctl Header ++ * File is created to adhere to Solaris requirement using 8-space tabs. ++ * ++ * !!!!! PLEASE DO NOT REMOVE THE TABS !!!!! ++ * !!!!! PLEASE NO SINGLE LINE COMMENTS: // !!!!! ++ * !!!!! PLEASE NO MORE THAN 80 CHARS PER LINE !!!!! ++ * ++ * Revision History: ++ * ++ * Rev. 0 March 1, 2000 ++ * YPL - Created. ++ * ++ * Rev. 1 March 2, 2000 ++ * RLU - Updated with latest definitions. Added more comments. ++ * ++ * Rev. 2 May 16, 2000 ++ * SP - Updated definitions and changed structures (March 27, 2000) ++ * SP - Addded structures ++ * ++ * Rev. 3 June 1, 2000 ++ * THL - Made major changes to include all changes talked in our meeting. ++ * ++ * Rev. 4 June 5, 2000 ++ * RLU - Added new definitions/structures for SDM_GET_AEN and SDM_REG_AEN ++ * functions. ++ * - Major definition/structure name changes as discussed in meetings. ++ * - Deleted duplicated command code and structure definitions. ++ * ++ * Rev. 4.1 June 14, 2000 ++ * WTR - Moved Solaris specific defines to exioctso.h. This makes it ++ * possible for application developers to include only exioct.h ++ * in their Solaris application development. ++ * ++ * Rev. 4.2 June 15, 2000 ++ * THL - Changed UINT16 and UINT32 back to WORD and DWORD for NT; otherwise, ++ * NT will get a compilation error for redefining UINT16 and UINT32. ++ * Added RISC_CODE/FLASH_RAM macros. ++ * ++ * Rev. 4.3 June 22, 2000 ++ * THL - Changed SDM_FC_ADDR according to External Ioctls document. ++ * Added SDM_DEF_TYPE macros. ++ * ++ * Rev. 4.4 June 22, 2000 ++ * THL - Moved NT specific defines to exioctnt.h. ++ * ++ * Rev. 4.5 August 15, 2000 ++ * SP - Rolled back some changes made by Todd R. ++ * Kept new status code SDM_STATUS_NO_MEMORY ++ * Port types fabric and tape device ++ * ++ * Rev. 4.7 Sep 6, 2000 ++ * YPL - Replace SDM_ with EXT_, _ISP with _CHIP. ++ * Add vendor specific statuses, device update, config defines. ++ * ++ * Rev. 5.0 Sep 13, 2000 ++ * YPL - Update version to 5, remove max defines, make port type bit. ++ * Change HBA_PORT_PROPERTY to have bus/target/lun defined as UINT16 ++ * ++ * Rev. 5.1 Sep 22, 2000 ++ * THL - Add destination address for specify scsi address or FC address. ++ * Remove "not support" comment and add more macros. ++ * ++ * Rev. 5.2 Sep 27, 2000 ++ * THL - Add new macros and structure for add and swap target device. ++ * Create new data structure for get port database. ++ * TLE - Merge changes needed for FailOver ++ * ++ * Rev. 5.3 Sep 29, 2000 ++ * THL - Add access mode for NVRAM. ++ * ++ * Rev. 5.4 Oct 03, 2000 ++ * THL - Add EXT_SC_GET_FC_STATISTICS. ++ * ++ * Rev. 5.5 Oct 18, 2000 ++ * THL - Remove duplicated EXT_DEF_ADDR_MODE_32 and EXT_DEF_ADDR_MODE_16. ++ * Reformat new data structures and defines. ++ * ++ * Rev. 5.6 Oct 19, 2000 ++ * RLU - Changed file name from ExIoct.h to exioct.h. ++ * - Added definition of EXT_RNID_DATA for API implementation. ++ * - Reformat some lines to conform to the format agreed ++ * upon in IOCTL meeting (and mentioned at beginning of ++ * this file). ++ * ++ * Rev. 5.7 Oct 25, 2000 ++ * BN - Added LUN bitmask structure and macros ++ * ++ * Rev. 5.8 Oct 25, 2000 ++ * BN - Added EXT_CC_DRIVER_PROP define ++ * ++ * Rev. 5.9 Oct 26, 2000 ++ * BN - Sync with UnixApi project ++ * ++ * Rev. 5.10 Oct 30, 2000 ++ * BN - Remove not needed #define for EXT_CC_DRIVER_PROP ++ * - Add EXT_ to IS_LUN_BIT_SET, SET_LUN_BIT, CLR_LUN_BIT ++ * ++ * Rev. 5.11 Nov 1, 2000 ++ * BN - Increased [1] of EXT_DEVICEDATA to [EXT_MAX_TARGET] ++ * TLE - Decreased [EXT_MAX_TARGET] of EXT_DEVICEDATA to [1] ++ * ++ * Rev. 5.12 Nov 7, 2000 ++ * RLU - Deleted EXT_DEF_MAX_LUNS define and changed all references ++ * to it to use EXT_MAX_LUN. ++ * - Changed the revision numbers for the last 2 revisions down ++ * to use 5.x. ++ * ++ * Rev. 5.13 Nov 14, 2000 ++ * WTR - Fixed pointer referencing problem in the LUN_BIT_MASK macros. ++ * Updated comment at bit mask definition. ++ * ++ * Rev. 5.14 Dec 6, 2000 ++ * THL - Added Local and LoopID to discovered port/target property. ++ * ++ * Rev. 5.15 Dec 24, 2000 ++ * YPL - Enhance port connection modes and driver attrib ++ * ++ * Rev. 5.16 Dec 27, 2000 ++ * TLE - Add BufferHandle member to _EXT_ASYNC_EVENT data structure for ++ * SCTP support ++ * ++ * Rev. 5.17 Jan 10, 2001 ++ * YPL - Add edtov, ratov & fabric name in port property ++ * ++ * Rev. 5.18 Feb 28, 2001 ++ * YPL - Remove SCTP fields and add fabric parameter flags in port property ++ * ++ * Rev. 5.19 Mar 08, 2001 ++ * YPL - Remove SCTP fields from hba port prop ++ * ++ * Rev. 5.20 June 11, 2001 ++ * YPL - Change to reserved fields and add fabric name field in port property ++ * ++ * Rev. 5.21 June 29, 2001 ++ * YPL - Merge in changes decided long time ago (use _DEF_ for defines) & ++ * reserved some EXT_CC for legacy ioctls, plus add RNID dataformat ++ * values definition ++ * ++ * Rev. 5.21 Sep 18, 2001 ++ * SP - Added New return status codes ++ * ++ * Rev. 5.22 Oct 23, 2001 ++ * SP - Change reserve fields to add fields to EXT_HBA_PORT ++ * Added port speeds and FC4Types fields and related definitions ++ * ++ * Rev. 5.23 Dec 04, 2001 ++ * RL - Added port speed value definition. ++ * ++ * Rev. 5.24 Jan 20, 2002 ++ * JJ - Added PCI device function bits field in EXT_CHIP structure. ++ * ++ * Rev. 5.25 Feb 04, 2002 ++ * JJ - Added 16 bytes CDB support. Also added SenseLength field ++ * in SCSI_PASSTHRU structure. ++ * ++ * Rev. 5.26 Feb 12, 2002 ++ * AV - Changed type size used in SCSI_PASSTHRU structure definitions ++ * to re-enable gcc's automatic structure padding for backward ++ * compatibility. ++ * ++ * Rev. 5.27 Mar 01, 2002 ++ * RL - Added new SC value for SCSI3 command passthru. ++ * ++ * Rev. 5.28 Dec 09, 2002 ++ * Sync up with NT version of exioct.h: ++ * TLE - Modify EXT_RNID_REQ data structure for IBM SendRNID workaround ++ * YPL - Add firmware state (online diagnostics) ++ * YPL - Add ELS PS ++ * YPL - Add els event, # of els buffers & size ++ */ ++ ++#ifndef _EXIOCT_H ++#define _EXIOCT_H ++ ++/* ++ * NOTE: the following version defines must be updated each time the ++ * changes made may affect the backward compatibility of the ++ * input/output relations of the SDM IOCTL functions. ++ */ ++#define EXT_VERSION 5 ++ ++ ++/* ++ * OS independent General definitions ++ */ ++#define EXT_DEF_SIGNATURE_SIZE 8 ++#define EXT_DEF_WWN_NAME_SIZE 8 ++#define EXT_DEF_WWP_NAME_SIZE 8 ++#define EXT_DEF_SERIAL_NUM_SIZE 4 ++#define EXT_DEF_PORTID_SIZE 4 ++#define EXT_DEF_PORTID_SIZE_ACTUAL 3 ++#define EXT_DEF_MAX_STR_SIZE 128 ++#define EXT_DEF_SCSI_PASSTHRU_CDB_LENGTH 16 ++ ++#define EXT_DEF_ADDR_MODE_32 1 ++#define EXT_DEF_ADDR_MODE_64 2 ++ ++/* ++ * *********************************************************************** ++ * X OS type definitions ++ * *********************************************************************** ++ */ ++#ifdef _MSC_VER /* NT */ ++ ++#pragma pack(1) ++#include "ExIoctNT.h" ++ ++#elif defined(linux) /* Linux */ ++ ++#include "exioctln.h" ++ ++#elif defined(sun) || defined(__sun) /* Solaris */ ++ ++#include "exioctso.h" ++ ++#endif ++ ++/* ++ * *********************************************************************** ++ * OS dependent General configuration defines ++ * *********************************************************************** ++ */ ++#define EXT_DEF_MAX_HBA EXT_DEF_MAX_HBA_OS ++#define EXT_DEF_MAX_BUS EXT_DEF_MAX_BUS_OS ++#define EXT_DEF_MAX_TARGET EXT_DEF_MAX_TARGET_OS ++#define EXT_DEF_MAX_LUN EXT_DEF_MAX_LUN_OS ++ ++/* ++ * *********************************************************************** ++ * Common header struct definitions for San/Device Mgmt ++ * *********************************************************************** ++ */ ++typedef struct { ++ UINT64 Signature; /* 8 chars string */ ++ UINT16 AddrMode; /* 2 */ ++ UINT16 Version; /* 2 */ ++ UINT16 SubCode; /* 2 */ ++ UINT16 Instance; /* 2 */ ++ UINT32 Status; /* 4 */ ++ UINT32 DetailStatus; /* 4 */ ++ UINT32 Reserved1; /* 4 */ ++ UINT32 RequestLen; /* 4 */ ++ UINT32 ResponseLen; /* 4 */ ++ UINT64 RequestAdr; /* 8 */ ++ UINT64 ResponseAdr; /* 8 */ ++ UINT16 HbaSelect; /* 2 */ ++ UINT16 VendorSpecificStatus[11]; /* 22 */ ++ UINT64 VendorSpecificData; /* 8 chars string */ ++} EXT_IOCTL, *PEXT_IOCTL; /* 84 / 0x54 */ ++ ++/* ++ * Addressing mode used by the user application ++ */ ++#define EXT_ADDR_MODE EXT_ADDR_MODE_OS ++ ++/* ++ * Status. These macros are being used for setting Status field in ++ * EXT_IOCTL structure. ++ */ ++#define EXT_STATUS_OK 0 ++#define EXT_STATUS_ERR 1 ++#define EXT_STATUS_BUSY 2 ++#define EXT_STATUS_PENDING 3 ++#define EXT_STATUS_SUSPENDED 4 ++#define EXT_STATUS_RETRY_PENDING 5 ++#define EXT_STATUS_INVALID_PARAM 6 ++#define EXT_STATUS_DATA_OVERRUN 7 ++#define EXT_STATUS_DATA_UNDERRUN 8 ++#define EXT_STATUS_DEV_NOT_FOUND 9 ++#define EXT_STATUS_COPY_ERR 10 ++#define EXT_STATUS_MAILBOX 11 ++#define EXT_STATUS_UNSUPPORTED_SUBCODE 12 ++#define EXT_STATUS_UNSUPPORTED_VERSION 13 ++#define EXT_STATUS_MS_NO_RESPONSE 14 ++#define EXT_STATUS_SCSI_STATUS 15 ++#define EXT_STATUS_BUFFER_TOO_SMALL 16 ++#define EXT_STATUS_NO_MEMORY 17 ++#define EXT_STATUS_UNKNOWN 18 ++#define EXT_STATUS_UNKNOWN_DSTATUS 19 ++#define EXT_STATUS_INVALID_REQUEST 20 ++ ++#define EXT_STATUS_DEVICE_NOT_READY 21 ++#define EXT_STATUS_DEVICE_OFFLINE 22 ++#define EXT_STATUS_HBA_NOT_READY 23 ++#define EXT_STATUS_HBA_QUEUE_FULL 24 ++ ++/* ++ * Detail Status contains the SCSI bus status codes. ++ */ ++ ++#define EXT_DSTATUS_GOOD 0x00 ++#define EXT_DSTATUS_CHECK_CONDITION 0x02 ++#define EXT_DSTATUS_CONDITION_MET 0x04 ++#define EXT_DSTATUS_BUSY 0x08 ++#define EXT_DSTATUS_INTERMEDIATE 0x10 ++#define EXT_DSTATUS_INTERMEDIATE_COND_MET 0x14 ++#define EXT_DSTATUS_RESERVATION_CONFLICT 0x18 ++#define EXT_DSTATUS_COMMAND_TERMINATED 0x22 ++#define EXT_DSTATUS_QUEUE_FULL 0x28 ++ ++/* ++ * Detail Status contains the needed Response buffer space(bytes) ++ * when Status = EXT_STATUS_BUFFER_TOO_SMALL ++ */ ++ ++ ++/* ++ * Detail Status contains one of the following codes ++ * when Status = EXT_STATUS_INVALID_PARAM or ++ * = EXT_STATUS_DEV_NOT_FOUND ++ */ ++#define EXT_DSTATUS_NOADNL_INFO 0x00 ++#define EXT_DSTATUS_HBA_INST 0x01 ++#define EXT_DSTATUS_TARGET 0x02 ++#define EXT_DSTATUS_LUN 0x03 ++#define EXT_DSTATUS_REQUEST_LEN 0x04 ++#define EXT_DSTATUS_PATH_INDEX 0x05 ++ ++/* ++ * Currently supported DeviceControl / ioctl command codes ++ */ ++#define EXT_CC_QUERY EXT_CC_QUERY_OS ++#define EXT_CC_SEND_FCCT_PASSTHRU EXT_CC_SEND_FCCT_PASSTHRU_OS ++#define EXT_CC_REG_AEN EXT_CC_REG_AEN_OS ++#define EXT_CC_GET_AEN EXT_CC_GET_AEN_OS ++#define EXT_CC_SEND_ELS_RNID EXT_CC_SEND_ELS_RNID_OS ++#define EXT_CC_SEND_SCSI_PASSTHRU EXT_CC_SCSI_PASSTHRU_OS ++#define EXT_CC_SEND_ELS_PASSTHRU EXT_CC_SEND_ELS_PASSTHRU_OS ++ ++/* ++ * HBA port operations ++ */ ++#define EXT_CC_GET_DATA EXT_CC_GET_DATA_OS ++#define EXT_CC_SET_DATA EXT_CC_SET_DATA_OS ++ ++ ++/* Reserved command codes. */ ++#define EXT_CC_RESERVED0A EXT_CC_RESERVED0A_OS ++#define EXT_CC_RESERVED0B EXT_CC_RESERVED0B_OS ++#define EXT_CC_RESERVED0C EXT_CC_RESERVED0C_OS ++#define EXT_CC_RESERVED0D EXT_CC_RESERVED0D_OS ++#define EXT_CC_RESERVED0E EXT_CC_RESERVED0E_OS ++#define EXT_CC_RESERVED0F EXT_CC_RESERVED0F_OS ++#define EXT_CC_RESERVED0G EXT_CC_RESERVED0G_OS ++#define EXT_CC_RESERVED0H EXT_CC_RESERVED0H_OS ++#define EXT_CC_RESERVED0I EXT_CC_RESERVED0I_OS ++#define EXT_CC_RESERVED0J EXT_CC_RESERVED0J_OS ++#define EXT_CC_RESERVED0Z EXT_CC_RESERVED0Z_OS ++ ++ ++/* ++ * *********************************************************************** ++ * EXT_IOCTL SubCode definition. ++ * These macros are being used for setting SubCode field in EXT_IOCTL ++ * structure. ++ * *********************************************************************** ++ */ ++ ++/* ++ * Query. ++ * Uses with EXT_QUERY as the ioctl code. ++ */ ++#define EXT_SC_QUERY_HBA_NODE 1 ++#define EXT_SC_QUERY_HBA_PORT 2 ++#define EXT_SC_QUERY_DISC_PORT 3 ++#define EXT_SC_QUERY_DISC_TGT 4 ++#define EXT_SC_QUERY_DISC_LUN 5 /* Currently Not Supported */ ++#define EXT_SC_QUERY_DRIVER 6 ++#define EXT_SC_QUERY_FW 7 ++#define EXT_SC_QUERY_CHIP 8 ++ ++/* ++ * Sub codes for Get Data. ++ * Use in combination with EXT_GET_DATA as the ioctl code ++ */ ++/* 1 - 99 Common */ ++#define EXT_SC_GET_SCSI_ADDR 1 /* Currently Not Supported */ ++#define EXT_SC_GET_ERR_DETECTIONS 2 /* Currently Not Supported */ ++#define EXT_SC_GET_STATISTICS 3 ++#define EXT_SC_GET_BUS_MODE 4 /* Currently Not Supported */ ++#define EXT_SC_GET_DR_DUMP_BUF 5 /* Currently Not Supported */ ++#define EXT_SC_GET_RISC_CODE 6 /* Currently Not Supported */ ++#define EXT_SC_GET_FLASH_RAM 7 /* for backward compatible */ ++ ++/* 100 - 199 FC_INTF_TYPE */ ++#define EXT_SC_GET_LINK_STATUS 101 /* Currently Not Supported */ ++#define EXT_SC_GET_LOOP_ID 102 /* Currently Not Supported */ ++#define EXT_SC_GET_LUN_BITMASK 103 ++#define EXT_SC_GET_PORT_DATABASE 104 /* Currently Not Supported */ ++#define EXT_SC_GET_PORT_DATABASE_MEM 105 /* Currently Not Supported */ ++#define EXT_SC_GET_PORT_SUMMARY 106 ++#define EXT_SC_GET_POSITION_MAP 107 ++#define EXT_SC_GET_RETRY_CNT 108 /* Currently Not Supported */ ++#define EXT_SC_GET_RNID 109 ++#define EXT_SC_GET_RTIN 110 /* Currently Not Supported */ ++#define EXT_SC_GET_FC_LUN_BITMASK 111 ++#define EXT_SC_GET_FC_STATISTICS 112 /* for backward compatible */ ++ ++/* 200 - 299 SCSI_INTF_TYPE */ ++#define EXT_SC_GET_SEL_TIMEOUT 201 /* Currently Not Supported */ ++ ++ ++/* ++ * Sub codes for Set Data. ++ * Use in combination with EXT_SET_DATA as the ioctl code ++ */ ++/* 1 - 99 Common */ ++#define EXT_SC_RST_STATISTICS 3 ++#define EXT_SC_RESERVED_BC7 7 ++ ++/* 100 - 199 FC_INTF_TYPE */ ++#define EXT_SC_SET_LUN_BITMASK 103 ++#define EXT_SC_SET_RNID 109 ++#define EXT_SC_SET_FC_LUN_BITMASK 111 ++#define EXT_SC_RESERVED_BC112 112 ++#define EXT_SC_RESERVED_BC113 113 ++ ++/* 200 - 299 SCSI_INTF_TYPE */ ++ ++/* SCSI passthrough */ ++#define EXT_SC_SEND_SCSI_PASSTHRU 0 ++#define EXT_SC_SEND_FC_SCSI_PASSTHRU 1 ++#define EXT_SC_SCSI3_PASSTHRU 2 ++ ++/* Read */ ++ ++/* Write */ ++ ++/* Reset */ ++ ++/* Request struct */ ++ ++ ++/* ++ * Response struct ++ */ ++typedef struct _EXT_HBA_NODE { ++ UINT8 WWNN [EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Manufacturer [EXT_DEF_MAX_STR_SIZE]; /* 128; "QLOGIC" */ ++ UINT8 Model [EXT_DEF_MAX_STR_SIZE]; /* 128; "QLA2200" */ ++ UINT8 SerialNum [EXT_DEF_SERIAL_NUM_SIZE];/* 4; 123 */ ++ UINT8 DriverVersion[EXT_DEF_MAX_STR_SIZE]; /* 128; "7.4.3" */ ++ UINT8 FWVersion [EXT_DEF_MAX_STR_SIZE]; /* 128; "2.1.6" */ ++ ++ /* The following field is currently not supported */ ++ UINT8 OptRomVersion[EXT_DEF_MAX_STR_SIZE]; /* 128; "1.44" */ ++ ++ UINT16 PortCount; /* 2; 1 */ ++ UINT16 InterfaceType; /* 2; FC/SCSI */ ++ ++ /* The following two fields are not yet supported */ ++ UINT32 DriverAttr; /* 4 */ ++ UINT32 FWAttr; /* 4 */ ++ ++ UINT32 Reserved[8]; /* 32 */ ++} EXT_HBA_NODE, *PEXT_HBA_NODE; /* 696 */ ++ ++/* HBA node query interface type */ ++#define EXT_DEF_FC_INTF_TYPE 1 ++#define EXT_DEF_SCSI_INTF_TYPE 2 ++ ++typedef struct _EXT_HBA_PORT { ++ UINT8 WWPN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Id [EXT_DEF_PORTID_SIZE]; /* 4; 3 bytes valid Port Id. */ ++ UINT16 Type; /* 2; Port Type */ ++ UINT16 State; /* 2; Port State */ ++ UINT16 Mode; /* 2 */ ++ UINT16 DiscPortCount; /* 2 */ ++ UINT16 DiscPortNameType; /* 2; USE_NODE_NAME or */ ++ /* USE_PORT_NAME */ ++ UINT16 DiscTargetCount; /* 2 */ ++ UINT16 Bus; /* 2 */ ++ UINT16 Target; /* 2 */ ++ UINT16 Lun; /* 2 */ ++ /* 2 */ ++ UINT8 PortSupportedFC4Types; ++ UINT8 PortActiveFC4Types; ++ UINT8 FabricName[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ ++ /* 2*/ ++ UINT8 PortSupportedSpeed; ++ UINT8 PortSpeed; ++ UINT16 Unused; /* 2 */ ++ UINT32 Reserved[3]; /* 12 */ ++} EXT_HBA_PORT, *PEXT_HBA_PORT; /* 56 */ ++ ++/* port type */ ++#define EXT_DEF_INITIATOR_DEV 1 ++#define EXT_DEF_TARGET_DEV 2 ++#define EXT_DEF_TAPE_DEV 4 ++#define EXT_DEF_FABRIC_DEV 8 ++ ++ ++/* HBA port state */ ++#define EXT_DEF_HBA_OK 0 ++#define EXT_DEF_HBA_SUSPENDED 1 ++#define EXT_DEF_HBA_LOOP_DOWN 2 ++ ++/* Connection mode */ ++#define EXT_DEF_UNKNOWN_MODE 0 ++#define EXT_DEF_P2P_MODE 1 ++#define EXT_DEF_LOOP_MODE 2 ++#define EXT_DEF_FL_MODE 3 ++#define EXT_DEF_N_MODE 4 ++ ++/* Valid name type for Disc. port/target */ ++#define EXT_DEF_USE_NODE_NAME 1 ++#define EXT_DEF_USE_PORT_NAME 2 ++ ++/* FC4 type values */ ++#define EXT_DEF_FC4_TYPE_SCSI 0x1 ++#define EXT_DEF_FC4_TYPE_IP 0x2 ++#define EXT_DEF_FC4_TYPE_SCTP 0x4 ++#define EXT_DEF_FC4_TYPE_VI 0x8 ++ ++/* Port Speed values */ ++#define EXT_DEF_PORTSPEED_1GBIT 1 ++#define EXT_DEF_PORTSPEED_2GBIT 2 ++#define EXT_DEF_PORTSPEED_10GBIT 4 ++ ++typedef struct _EXT_DISC_PORT { ++ UINT8 WWNN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 WWPN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Id [EXT_DEF_PORTID_SIZE]; ++ /* 4; last 3 bytes used. big endian */ ++ ++ /* The following fields currently are not supported */ ++ UINT16 Type; /* 2; Port Type */ ++ UINT16 Status; /* 2; Port Status */ ++ UINT16 Bus; /* 2; n/a for Solaris */ ++ ++ UINT16 TargetId; /* 2 */ ++ UINT8 Local; /* 1; Local or Remote */ ++ UINT8 ReservedByte[1]; /* 1 */ ++ ++ UINT16 LoopID; /* 2; Loop ID */ ++ ++ UINT32 Reserved[7]; /* 28 */ ++} EXT_DISC_PORT, *PEXT_DISC_PORT; /* 60 */ ++ ++typedef struct _EXT_DISC_TARGET { ++ UINT8 WWNN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 WWPN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Id [EXT_DEF_PORTID_SIZE]; ++ /* 4; last 3 bytes used. big endian */ ++ ++ /* The following fields currently are not supported */ ++ UINT16 Type; /* 2; Target Type */ ++ UINT16 Status; /* 2; Target Status*/ ++ UINT16 Bus; /* 2; n/a for Solaris */ ++ ++ UINT16 TargetId; /* 2 */ ++ ++ /* The following field is currently not supported */ ++ UINT16 LunCount; /* 2; n/a for nt */ ++ ++ UINT8 Local; /* 1; Local or Remote */ ++ UINT8 ReservedByte[1]; /* 1 */ ++ ++ UINT16 LoopID; /* 2; Loop ID */ ++ ++ UINT16 Reserved[13]; /* 26 */ ++} EXT_DISC_TARGET, *PEXT_DISC_TARGET; /* 60 */ ++ ++/* The following command is not supported */ ++typedef struct _EXT_DISC_LUN { /* n/a for nt */ ++ UINT16 Id; /* 2 */ ++ UINT16 State; /* 2 */ ++ UINT16 IoCount; /* 2 */ ++ UINT16 Reserved[15]; /* 30 */ ++} EXT_DISC_LUN, *PEXT_DISC_LUN; /* 36 */ ++ ++ ++/* SCSI address */ ++typedef struct _EXT_SCSI_ADDR { ++ UINT16 Bus; /* 2 */ ++ UINT16 Target; /* 2 */ ++ UINT16 Lun; /* 2 */ ++ UINT16 Padding[5]; /* 10 */ ++} EXT_SCSI_ADDR, *PEXT_SCSI_ADDR; /* 16 */ ++ ++ ++/* Fibre Channel address */ ++typedef struct _EXT_FC_ADDR { ++ union { ++ UINT8 WWNN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 WWPN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Id[EXT_DEF_PORTID_SIZE]; /* 4 */ ++ } FcAddr; ++ UINT16 Type; /* 2 */ ++ UINT16 Padding[2]; /* 2 */ ++} EXT_FC_ADDR, *PEXT_FC_ADDR; /* 24 */ ++ ++#define EXT_DEF_TYPE_WWNN 1 ++#define EXT_DEF_TYPE_WWPN 2 ++#define EXT_DEF_TYPE_PORTID 3 ++#define EXT_DEF_TYPE_FABRIC 4 ++ ++ ++/* Destination address */ ++typedef struct _EXT_DEST_ADDR { ++ union { ++ UINT8 WWNN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 WWPN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Id[EXT_DEF_PORTID_SIZE]; /* 4 */ ++ struct { ++ UINT16 Bus; /* 2 */ ++ UINT16 Target; /* 2 */ ++ } ScsiAddr; ++ } DestAddr; ++ UINT16 DestType; /* 2 */ ++ UINT16 Lun; /* 2 */ ++ UINT16 Padding[2]; /* 4 */ ++} EXT_DEST_ADDR, *PEXT_DEST_ADDR; /* 16 */ ++ ++ ++#define EXT_DEF_DESTTYPE_WWNN 1 ++#define EXT_DEF_DESTTYPE_WWPN 2 ++#define EXT_DEF_DESTTYPE_PORTID 3 ++#define EXT_DEF_DESTTYPE_FABRIC 4 ++#define EXT_DEF_DESTTYPE_SCSI 5 ++ ++/* Statistic */ ++typedef struct _EXT_HBA_PORT_STAT { ++ UINT32 ControllerErrorCount; /* 4 */ ++ UINT32 DeviceErrorCount; /* 4 */ ++ UINT32 TotalIoCount; /* 4 */ ++ UINT32 TotalMBytes; /* 4; MB of data processed */ ++ UINT32 TotalLipResets; /* 4; Total no. of LIP Reset */ ++ UINT32 Reserved2; /* 4 */ ++ UINT32 TotalLinkFailures; /* 4 */ ++ UINT32 TotalLossOfSync; /* 4 */ ++ UINT32 TotalLossOfSignals; /* 4 */ ++ UINT32 PrimitiveSeqProtocolErrorCount;/* 4 */ ++ UINT32 InvalidTransmissionWordCount; /* 4 */ ++ UINT32 InvalidCRCCount; /* 4 */ ++ UINT32 Reserved[16]; /* 64 */ ++} EXT_HBA_PORT_STAT, *PEXT_HBA_PORT_STAT; /* 112 */ ++ ++ ++/* Driver property */ ++typedef struct _EXT_DRIVER { ++ UINT8 Version[EXT_DEF_MAX_STR_SIZE];/* 128 */ ++ UINT16 NumOfBus; /* 2; Port Type */ ++ UINT16 TargetsPerBus; /* 2; Port Status */ ++ UINT16 LunsPerTarget; /* 2 */ ++ UINT32 MaxTransferLen; /* 4 */ ++ UINT32 MaxDataSegments; /* 4 */ ++ UINT16 DmaBitAddresses; /* 2 */ ++ UINT16 IoMapType; /* 2 */ ++ UINT32 Attrib; /* 4 */ ++ UINT32 InternalFlags[4]; /* 16 */ ++ UINT32 Reserved[8]; /* 32 */ ++} EXT_DRIVER, *PEXT_DRIVER; /* 198 */ ++ ++ ++/* Firmware property */ ++typedef struct _EXT_FW { ++ UINT8 Version[EXT_DEF_MAX_STR_SIZE];/* 128 */ ++ UINT32 Attrib; /* 4 */ ++ UINT16 Reserved[33]; /* 66 */ ++} EXT_FW, *PEXT_FW; /* 198 */ ++ ++ ++/* ISP/Chip property */ ++typedef struct _EXT_CHIP { ++ UINT16 VendorId; /* 2 */ ++ UINT16 DeviceId; /* 2 */ ++ UINT16 SubVendorId; /* 2 */ ++ UINT16 SubSystemId; /* 2 */ ++ UINT16 PciBusNumber; /* 2 */ ++ UINT16 PciSlotNumber; /* 2 */ ++ UINT32 IoAddr; /* 4 */ ++ UINT32 IoAddrLen; /* 4 */ ++ UINT32 MemAddr; /* 4 */ ++ UINT32 MemAddrLen; /* 4 */ ++ UINT16 ChipType; /* 2 */ ++ UINT16 InterruptLevel; /* 2 */ ++ UINT16 OutMbx[8]; /* 16 */ ++ UINT16 PciDevFunc; /* 2 */ ++ UINT16 Reserved[15]; /* 30 */ ++} EXT_CHIP, *PEXT_CHIP; /* 80 */ ++ ++ ++/* Request Buffer for RNID */ ++typedef struct _EXT_RNID_REQ { ++ EXT_FC_ADDR Addr; /* 14 */ ++ UINT8 DataFormat; /* 1 */ ++ UINT8 Pad; /* 1 */ ++ UINT8 OptWWN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 OptPortId[EXT_DEF_PORTID_SIZE]; /* 4 */ ++ UINT32 Reserved[12]; /* 48 */ ++ UINT8 Pad1[3]; /* 3 */ ++} EXT_RNID_REQ, *PEXT_RNID_REQ; /* 79 */ ++ ++#define EXT_DEF_RNID_DFORMAT_NONE 0 ++#define EXT_DEF_RNID_DFORMAT_TOPO_DISC 0xDF ++ ++/* Request Buffer for Set RNID */ ++typedef struct _EXT_SET_RNID_REQ { ++ UINT8 IPVersion[2]; ++ UINT8 UDPPortNumber[2]; ++ UINT8 IPAddress[16]; ++ UINT32 Reserved[16]; ++} EXT_SET_RNID_REQ, *PEXT_SET_RNID_REQ; ++ ++/* RNID definition and data struct */ ++#define SEND_RNID_RSP_SIZE 72 ++ ++typedef struct _RNID_DATA ++{ ++ UINT8 WWN[16]; /* 16 */ ++ UINT32 UnitType; /* 4 */ ++ UINT8 PortId[4]; /* 4 */ ++ UINT32 NumOfAttachedNodes; /* 4 */ ++ UINT8 IPVersion[2]; /* 2 */ ++ UINT8 UDPPortNumber[2]; /* 2 */ ++ UINT8 IPAddress[16]; /* 16 */ ++ UINT16 Reserved; /* 2 */ ++ UINT16 TopoDiscFlags; /* 2 */ ++} EXT_RNID_DATA, *PEXT_RNID_DATA; /* 52 */ ++ ++ ++/* SCSI pass-through */ ++typedef struct _EXT_SCSI_PASSTHRU { ++ EXT_SCSI_ADDR TargetAddr; ++ UINT8 Direction; ++ UINT8 CdbLength; ++ UINT8 Cdb[EXT_DEF_SCSI_PASSTHRU_CDB_LENGTH]; ++ UINT32 Reserved[14]; ++ UINT16 Reserved2; ++ UINT16 SenseLength; ++ UINT8 SenseData[256]; ++} EXT_SCSI_PASSTHRU, *PEXT_SCSI_PASSTHRU; ++ ++/* FC SCSI pass-through */ ++typedef struct _EXT_FC_SCSI_PASSTHRU { ++ EXT_DEST_ADDR FCScsiAddr; ++ UINT8 Direction; ++ UINT8 CdbLength; ++ UINT8 Cdb[EXT_DEF_SCSI_PASSTHRU_CDB_LENGTH]; ++ UINT32 Reserved[14]; ++ UINT16 Reserved2; ++ UINT16 SenseLength; ++ UINT8 SenseData[256]; ++} EXT_FC_SCSI_PASSTHRU, *PEXT_FC_SCSI_PASSTHRU; ++ ++/* SCSI pass-through direction */ ++#define EXT_DEF_SCSI_PASSTHRU_DATA_IN 1 ++#define EXT_DEF_SCSI_PASSTHRU_DATA_OUT 2 ++ ++ ++/* EXT_REG_AEN Request struct */ ++typedef struct _EXT_REG_AEN { ++ UINT32 Enable; /* 4; non-0 to enable, 0 to disable. */ ++ UINT32 Reserved; /* 4 */ ++} EXT_REG_AEN, *PEXT_REG_AEN; /* 8 */ ++ ++/* EXT_GET_AEN Response struct */ ++typedef struct _EXT_ASYNC_EVENT { ++ UINT32 AsyncEventCode; /* 4 */ ++ union { ++ struct { ++ UINT8 RSCNInfo[EXT_DEF_PORTID_SIZE_ACTUAL];/* 3, BE */ ++ UINT8 AddrFormat; /* 1 */ ++ UINT32 Rsvd_1[2]; /* 8 */ ++ } RSCN; ++ ++ UINT32 Reserved[3]; /* 12 */ ++ } Payload; ++} EXT_ASYNC_EVENT, *PEXT_ASYNC_EVENT; /* 16 */ ++ ++ ++/* Asynchronous Event Codes */ ++#define EXT_DEF_LIP_OCCURRED 0x8010 ++#define EXT_DEF_LINK_UP 0x8011 ++#define EXT_DEF_LINK_DOWN 0x8012 ++#define EXT_DEF_LIP_RESET 0x8013 ++#define EXT_DEF_RSCN 0x8015 ++#define EXT_DEF_DEVICE_UPDATE 0x8014 ++#define EXT_DEF_ELS 0x8200 ++ ++/* Required # of entries in the queue buffer allocated. */ ++#define EXT_DEF_MAX_AEN_QUEUE EXT_DEF_MAX_AEN_QUEUE_OS ++#define EXT_DEF_MAX_ELS_BUFS EXT_DEF_MAX_ELS_BUFS_OS ++#define EXT_DEF_SIZE_ELS_BUF EXT_DEF_SIZE_ELS_BUF_OS ++ ++/* Device type to get for EXT_SC_GET_PORT_SUMMARY */ ++#define EXT_DEF_GET_KNOWN_DEVICE 0x1 ++#define EXT_DEF_GET_VISIBLE_DEVICE 0x2 ++#define EXT_DEF_GET_HIDDEN_DEVICE 0x4 ++#define EXT_DEF_GET_FABRIC_DEVICE 0x8 ++#define EXT_DEF_GET_LOOP_DEVICE 0x10 ++ ++/* Each entry in device database */ ++typedef struct _EXT_DEVICEDATAENTRY ++{ ++ UINT8 NodeWWN[8]; /* Node World Wide Name for device */ ++ UINT8 PortWWN[8]; /* Port World Wide Name for device */ ++ UINT8 PortID[3]; /* Current PortId for device */ ++ UINT8 ControlFlags; /* Control flag */ ++ EXT_SCSI_ADDR TargetAddress; /* scsi address */ ++ UINT32 DeviceFlags; /* Flags for device */ ++ UINT16 LoopID; /* Loop ID */ ++ UINT16 BaseLunNumber; ++ UINT32 Reserved[32]; ++} EXT_DEVICEDATAENTRY, *PEXT_DEVICEDATAENTRY; ++ ++/* Device database information */ ++typedef struct _EXT_DEVICEDATA ++{ ++ UINT32 TotalDevices; /* Set to total number of device. */ ++ UINT32 ReturnListEntryCount; /* Set to number of device entries */ ++ /* returned in list. */ ++ ++ EXT_DEVICEDATAENTRY EntryList[1]; /* Variable length */ ++} EXT_DEVICEDATA, *PEXT_DEVICEDATA; ++ ++ ++/* Swap Target Device Data structure */ ++typedef struct _EXT_SWAPTARGETDEVICE ++{ ++ EXT_DEVICEDATAENTRY CurrentExistDevice; ++ EXT_DEVICEDATAENTRY NewDevice; ++} EXT_SWAPTARGETDEVICE, *PEXT_SWAPTARGETDEVICE; ++ ++/* LUN BitMask structure definition, array of 8bit bytes, ++ * 1 bit per lun. When bit == 1, the lun is masked. ++ * Most significant bit of mask[0] is lun 0. ++ * Least significant bit of mask[0] is lun 7. ++ */ ++typedef struct _EXT_LUN_BIT_MASK { ++#if ((EXT_DEF_MAX_LUN & 0x7) == 0) ++ UINT8 mask[EXT_DEF_MAX_LUN >> 3]; ++#else ++ UINT8 mask[(EXT_DEF_MAX_LUN + 8) >> 3 ]; ++#endif ++} EXT_LUN_BIT_MASK, *PEXT_LUN_BIT_MASK; ++ ++/* ++ * LUN mask bit manipulation macros ++ * ++ * P = Pointer to an EXT_LUN_BIT_MASK union. ++ * L = LUN number. ++ */ ++#define EXT_IS_LUN_BIT_SET(P,L) \ ++ (((P)->mask[L/8] & (0x80 >> (L%8)))?1:0) ++ ++#define EXT_SET_LUN_BIT(P,L) \ ++ ((P)->mask[L/8] |= (0x80 >> (L%8))) ++ ++#define EXT_CLR_LUN_BIT(P,L) \ ++ ((P)->mask[L/8] &= ~(0x80 >> (L%8))) ++ ++#define EXT_DEF_LUN_BITMASK_LIST_MIN_ENTRIES 1 ++#define EXT_DEF_LUN_BITMASK_LIST_MAX_ENTRIES 256 ++ ++#ifdef _WIN64 ++#define EXT_DEF_LUN_BITMASK_LIST_HEADER_SIZE 32 ++#else ++#define EXT_DEF_LUN_BITMASK_LIST_HEADER_SIZE \ ++ offsetof(LUN_BITMASK_LIST_BUFFER, asBitmaskEntry) ++#endif ++ ++#define EXT_DEF_LUN_COUNT 2048 ++#define EXT_DEF_LUN_BITMASK_BYTES (EXT_DEF_LUN_COUNT / 8) ++ ++typedef struct _EXT_LUN_BITMASK_ENTRY ++{ ++ UINT8 NodeName[EXT_DEF_WWN_NAME_SIZE]; ++ UINT8 PortName[EXT_DEF_WWN_NAME_SIZE]; ++ ++ UINT32 Reserved2; ++ UINT32 Reserved3; ++ UINT32 Reserved4; ++ UINT32 Reserved5; /* Pad to 32-byte header.*/ ++ ++ UINT8 Bitmask[EXT_DEF_LUN_BITMASK_BYTES]; ++} EXT_LUN_BITMASK_ENTRY, *PEXT_LUN_BITMASK_ENTRY; ++ ++/* Structure as it is stored in the config file.*/ ++typedef struct _LUN_BITMASK_LIST ++{ ++ UINT16 Version; /* Should be LUN_BITMASK_REGISTRY_VERSION */ ++ UINT16 EntryCount; /* Count of variable entries following.*/ ++ UINT32 Reserved1; ++ UINT32 Reserved2; ++ UINT32 Reserved3; ++ UINT32 Reserved4; ++ UINT32 Reserved5; ++ UINT32 Reserved6; ++ UINT32 Reserved7; /* Pad to 32-byte header.*/ ++ ++ EXT_LUN_BITMASK_ENTRY BitmaskEntry[1]; /* Variable-length data.*/ ++ ++} EXT_LUN_BITMASK_LIST, *PEXT_LUN_BITMASK_LIST; ++ ++ ++#define EXT_DEF_LUN_BITMASK_LIST_MIN_SIZE \ ++ (EXT_DEF_LUN_BITMASK_LIST_HEADER_SIZE + \ ++ (sizeof(EXT_DEF_LUN_BITMASK_ENTRY) * EXT_DEF_LUN_BITMASK_LIST_MIN_ENTRIES)) ++#define EXT_DEF_LUN_BITMASK_LIST_MAX_SIZE \ ++ (EXT_DEF_LUN_BITMASK_LIST_HEADER_SIZE + \ ++ (sizeof(EXT_DEF_LUN_BITMASK_ENTRY) * EXT_DEF_LUN_BITMASK_LIST_MAX_ENTRIES)) ++ ++/* Request Buffer for ELS PT*/ ++#define EXT_DEF_WWPN_VALID 1 ++#define EXT_DEF_WWNN_VALID 2 ++#define EXT_DEF_PID_VALID 4 ++typedef struct _EXT_ELS_PT_REQ { ++ UINT8 WWNN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 WWPN[EXT_DEF_WWN_NAME_SIZE]; /* 8 */ ++ UINT8 Id[EXT_DEF_PORTID_SIZE]; /* 4 */ ++ UINT16 ValidMask; /* 2 */ ++ UINT16 Lid; /* 2 */ ++ UINT16 Rxid; /* 2 */ ++ UINT16 AccRjt; /* 2 */ ++ UINT32 Reserved; /* 4 */ ++} EXT_ELS_PT_REQ, *PEXT_ELS_PT_REQ; /* 32 */ ++ ++#ifdef _MSC_VER ++#pragma pack() ++#endif ++ ++#endif /* _EXIOCT_H */ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/exioctln.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,255 @@ ++/***************************************************************************** ++* QLOGIC LINUX SOFTWARE ++* ++* QLogic ISP2x00 device driver for Linux 2.5.x ++* Copyright (C) 2003 QLogic Corporation ++* (www.qlogic.com) ++* ++* This program is free software; you can redistribute it and/or modify it ++* under the terms of the GNU General Public License as published by the ++* Free Software Foundation; either version 2, or (at your option) any ++* later version. ++* ++* This program is distributed in the hope that it will be useful, but ++* WITHOUT ANY WARRANTY; without even the implied warranty of ++* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++* General Public License for more details. ++****************************************************************************/ ++ ++/* ++ * File Name: exioctln.h ++ ++ Rev 14 February 25, 2003 RL ++ - Added EXT_CC_DRIVER_SPECIFIC ioctl command to return ++ some driver specific data that can be used by API library ++ to determine how to maintain backward compatibility ++ of certain features. ++ ++ Rev 13 January 31, 2003 RL ++ - Changed the value of EXT_DEF_USE_HBASELECT to avoid ++ conflicting with older implementation of FO API lib. ++ ++ Rev 12 January 20, 2003 RL ++ - Added EXT_DEF_USE_HBASELECT definition for use by ++ the SETINSTANCE command. ++ ++ Rev 11 December 10, 2002 RL ++ - Added EXT_CC_SEND_ELS_PASSTHRU_OS definition. ++ ++ Rev 10 October 26, 2001 RL ++ - Corrected MAX_HBA, MAX_TARGET and MAX_LUN values to 255. ++ ++ Rev 9 July 26, 2001 RL ++ - Added definition of signed types. ++ ++ Rev 8 July 05, 2001 RL ++ - Redefined ioctl command values. ++ ++ Rev 7 Nov 06, 2000 BN ++ - Added EXT_DEF_MAX_AEN_QUEUE_OS define ++ - Added define for handle_hba_t ++ ++ Rev 6 Oct 25, 2000 BN ++ - Added EXT_CC_DRIVER_PROP_OS define ++ ++ Rev 5 Oct 25, 2000 BN ++ - Redo the copyright header and add AEN details ++ ++ Rev 4 Oct 23, 2000 BN ++ - Added definition for BOOLEAN ++ ++ Rev 3 Oct 23, 2000 BN ++ - Added definitions for EXT_ADDR_MODE_OS ++ and also include of ++ ++ Rev 2 Oct 18, 2000 BN ++ - Enable API Exention support ++ ++ Rev 1 Original version Sep 7, 2000 BN ++ ++*/ ++ ++ ++#ifndef _EXIOCT_LN_H_ ++#define _EXIOCT_LN_H_ ++ ++#include ++ ++#ifdef APILIB ++#include ++#endif ++ ++ ++#define INT8 int8_t ++#define INT16 int16_t ++#define INT32 int32_t ++#define UINT8 uint8_t ++#define UINT16 uint16_t ++#define UINT32 uint32_t ++#define UINT64 void * ++#define BOOLEAN uint8_t ++ ++typedef struct track_instance { ++ int handle; ++} track_instance_t; ++ ++ ++#if BITS_PER_LONG <= 32 ++#define EXT_ADDR_MODE_OS EXT_DEF_ADDR_MODE_32 ++#else ++#define EXT_ADDR_MODE_OS EXT_DEF_ADDR_MODE_64 ++#endif ++ ++ ++#define QLMULTIPATH_MAGIC 'y' ++ ++#define _QLBUILD /* for exioct.h to enable include of qinsdmgt.h */ ++ ++ ++ ++#define EXT_DEF_MAX_HBA_OS 255 /* 0 - 0xFE */ ++#define EXT_DEF_MAX_BUS_OS 1 ++#define EXT_DEF_MAX_TARGET_OS 255 /* 0 - 0xFE */ ++#define EXT_DEF_MAX_LUN_OS 255 /* 0 - 0xFE */ ++ ++#define EXT_DEF_MAX_AEN_QUEUE_OS 64 ++ ++#define EXT_DEF_FC_HEADER_LEN 24 ++#define EXT_DEF_ELS_RJT_LENGTH 0x08 /* 8 */ ++#define EXT_DEF_ELS_RPS_ACC_LENGTH 0x40 /* 64 */ ++#define EXT_DEF_ELS_RLS_ACC_LENGTH 0x1C /* 28 */ ++ ++#define EXT_DEF_USE_HBASELECT 0x02 /* bit 1: HbaSelect field now ++ * used to specify destination ++ * HBA of each command. ++ * SetInstance cmd is now ++ * issued only once during ++ * API initialization. ++ */ ++ ++ ++/*****************/ ++/* Command codes */ ++/*****************/ ++ ++/*************************************************************/ ++/* These are regular/external command codes, starting from 0 */ ++/*************************************************************/ ++#define EXT_CC_QUERY_OS /* QUERY */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x00, sizeof(EXT_IOCTL)) ++#define EXT_CC_SEND_FCCT_PASSTHRU_OS /* FCCT_PASSTHRU */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x01, sizeof(EXT_IOCTL)) ++#define EXT_CC_REG_AEN_OS /* REG_AEN */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x02, sizeof(EXT_IOCTL)) ++#define EXT_CC_GET_AEN_OS /* GET_AEN */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x03, sizeof(EXT_IOCTL)) ++#define EXT_CC_SEND_ELS_RNID_OS /* SEND_ELS_RNID */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x04, sizeof(EXT_IOCTL)) ++#define EXT_CC_SCSI_PASSTHRU_OS /* SCSI_PASSTHRU */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x05, sizeof(EXT_IOCTL)) ++ ++#define EXT_CC_GET_DATA_OS /* GET_DATA */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x06, sizeof(EXT_IOCTL)) ++#define EXT_CC_SET_DATA_OS /* SET_DATA */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x07, sizeof(EXT_IOCTL)) ++ ++/*****************************************/ ++/* following are internal command codes. */ ++/*****************************************/ ++#define EXT_CC_RESERVED0A_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x08, sizeof(EXT_IOCTL)) ++#define EXT_CC_RESERVED0B_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x09, sizeof(EXT_IOCTL)) ++ ++#define EXT_CC_RESERVED0C_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x0a, sizeof(EXT_IOCTL)) ++#define EXT_CC_RESERVED0D_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x0b, sizeof(EXT_IOCTL)) ++ ++#define EXT_CC_RESERVED0E_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x0c, sizeof(EXT_IOCTL)) ++#define EXT_CC_RESERVED0F_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x0d, sizeof(EXT_IOCTL)) ++ ++#define EXT_CC_RESERVED0G_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x0e, sizeof(EXT_IOCTL)) ++#define EXT_CC_RESERVED0H_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x0f, sizeof(EXT_IOCTL)) ++ ++#define EXT_CC_RESERVED0I_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x10, sizeof(EXT_IOCTL)) ++#define EXT_CC_RESERVED0J_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x11, sizeof(EXT_IOCTL)) ++ ++#define EXT_CC_RESERVED0Z_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x21, sizeof(EXT_IOCTL)) ++ ++/********************************************************/ ++/* These are additional regular/external command codes. */ ++/********************************************************/ ++#define EXT_CC_SEND_ELS_PASSTHRU_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 0x30, sizeof(EXT_IOCTL)) ++ ++ ++/********************************************************/ ++/* Failover ioctl command codes range from 0xc0 to 0xdf */ ++/********************************************************/ ++ ++ ++/*******************************************************************/ ++/* These are Linux driver implementation specific commands. Values */ ++/* start from highest possible value and in decreasing order. */ ++/*******************************************************************/ ++ ++#define EXT_CC_STARTIOCTL /* STARTIOCTL */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0xff, sizeof(EXT_IOCTL)) ++#define EXT_CC_SETINSTANCE /* SETINSTANCE */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0xfe, sizeof(EXT_IOCTL)) ++#define EXT_CC_WWPN_TO_SCSIADDR /* WWPN_TO_SCSIADDR */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0xfd, sizeof(EXT_IOCTL)) ++#define EXT_CC_DRIVER_SPECIFIC /* DRIVER_SPECIFIC */ \ ++ _IOWR(QLMULTIPATH_MAGIC, 0xfc, sizeof(EXT_IOCTL)) ++ ++ ++/* ++ * Response struct definition ++ */ ++typedef struct _EXT_LN_DRV_VERSION { ++ UINT8 Major; ++ UINT8 Minor; ++ UINT8 Patch; ++ UINT8 Beta; ++ UINT8 Reserved[4]; ++} EXT_LN_DRV_VERSION; /* 8 */ ++ ++typedef struct _EXT_LN_DRIVER_DATA { ++ EXT_LN_DRV_VERSION DrvVer; /* 8 */ ++ UINT32 Reserved[14]; /* 56 */ ++} EXT_LN_DRIVER_DATA, *PEXT_LN_DRIVER_DATA; /* 64 */ ++ ++ ++ ++ ++ ++ ++/* ++ * Overrides for Emacs so that we almost follow Linus's tabbing style. ++ * Emacs will notice this stuff at the end of the file and automatically ++ * adjust the settings for this buffer only. This must remain at the end ++ * of the file. ++ * --------------------------------------------------------------------------- ++ * Local variables: ++ * c-indent-level: 2 ++ * c-brace-imaginary-offset: 0 ++ * c-brace-offset: -2 ++ * c-argdecl-indent: 2 ++ * c-label-offset: -2 ++ * c-continued-statement-offset: 4 ++ * c-continued-brace-offset: 0 ++ * indent-tabs-mode: nil ++ * tab-width: 8 ++ * End: ++ */ ++ ++#endif /* _EXIOCT_LN_H_ */ ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/inioct.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,129 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++/* ++ * File Name: inioct.h ++ * ++ * San/Device Management Ioctl Header ++ * File is created to adhere to Solaris requirement using 8-space tabs. ++ * ++ * !!!!! PLEASE DO NOT REMOVE THE TABS !!!!! ++ * !!!!! PLEASE NO SINGLE LINE COMMENTS: // !!!!! ++ * !!!!! PLEASE NO MORE THAN 80 CHARS PER LINE !!!!! ++ * ++ * ++ * Revision History: ++ * ++ * Rev. 0 June 15, 2001 ++ * YPL - Created. ++ * ++ * Rev. 1 June 26, 2001 ++ * YPL - Change the loop back structure and delete cc that is not used. ++ * ++ * Rev. 2 June 29, 2001 ++ * YPL - Use new EXT_CC defines from exioct.h ++ * ++ * Rev. 3 July 12, 2001 ++ * RL - Added definitions for loopback mbx command completion codes. ++ * ++ * Rev. 4 July 12, 2001 ++ * RL - Added definitions for loopback mbx command completion codes. ++ * ++ * Rev. 5 October 9, 2002 ++ * AV - Added definition for Read Option ROM IOCTL. ++ * ++ */ ++ ++#ifndef _INIOCT_H ++#define _INIOCT_H ++ ++/* ++ * *********************************************************************** ++ * X OS type definitions ++ * *********************************************************************** ++ */ ++#ifdef _MSC_VER /* NT */ ++#pragma pack(1) ++#endif ++ ++/* ++ * *********************************************************************** ++ * INT_IOCTL SubCode definition. ++ * These macros are being used for setting SubCode field in EXT_IOCTL ++ * structure. ++ * *********************************************************************** ++ */ ++ ++/* ++ * Currently supported DeviceControl / ioctl command codes ++ */ ++#define INT_CC_GET_PORT_STAT_FC EXT_CC_RESERVED0A_OS ++#define INT_CC_LOOPBACK EXT_CC_RESERVED0B_OS ++#define INT_CC_UPDATE_OPTION_ROM EXT_CC_RESERVED0C_OS ++#define INT_CC_ADD_TARGET_DEVICE EXT_CC_RESERVED0D_OS ++#define INT_CC_READ_NVRAM EXT_CC_RESERVED0E_OS ++#define INT_CC_UPDATE_NVRAM EXT_CC_RESERVED0F_OS ++#define INT_CC_SWAP_TARGET_DEVICE EXT_CC_RESERVED0G_OS ++#define INT_CC_READ_OPTION_ROM EXT_CC_RESERVED0H_OS ++#define INT_CC_LEGACY_LOOPBACK EXT_CC_RESERVED0Z_OS ++ ++ ++ ++/* NVRAM */ ++#define INT_SC_NVRAM_HARDWARE 0 /* Save */ ++#define INT_SC_NVRAM_DRIVER 1 /* Driver (Apply) */ ++#define INT_SC_NVRAM_ALL 2 /* NVRAM/Driver (Save+Apply) */ ++ ++/* Loopback */ ++typedef struct _INT_LOOPBACK_REQ ++{ ++ UINT16 Options; /* 2 */ ++ UINT32 TransferCount; /* 4 */ ++ UINT32 IterationCount; /* 4 */ ++ UINT64 BufferAddress; /* 8 */ ++ UINT32 BufferLength; /* 4 */ ++ UINT16 Reserved[9]; /* 18 */ ++} ++INT_LOOPBACK_REQ, *PINT_LOOPBACK_REQ; /* 408 */ ++ ++typedef struct _INT_LOOPBACK_RSP ++{ ++ UINT64 BufferAddress; /* 8 */ ++ UINT32 BufferLength; /* 4 */ ++ UINT16 CompletionStatus; /* 2 */ ++ UINT16 CrcErrorCount; /* 2 */ ++ UINT16 DisparityErrorCount; /* 2 */ ++ UINT16 FrameLengthErrorCount; /* 2 */ ++ UINT32 IterationCountLastError; /* 4 */ ++ UINT16 Reserved[8]; /* 16 */ ++} ++INT_LOOPBACK_RSP, *PINT_LOOPBACK_RSP; /* 40 */ ++ ++/* definition for interpreting CompletionStatus values */ ++#define INT_DEF_LB_COMPLETE 0x4000 ++#define INT_DEF_LB_PARAM_ERR 0x4006 ++#define INT_DEF_LB_LOOP_DOWN 0x400b ++#define INT_DEF_LB_CMD_ERROR 0x400c ++ ++ ++#ifdef _MSC_VER ++#pragma pack() ++#endif ++ ++#endif /* _INIOCT_H */ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/ql2100tp_fw.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,4866 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ *************************************************************************/ ++ ++/************************************************************************ ++ * * ++ * --- ISP2100 Fabric Initiator/Target Firmware --- * ++ * with expanded LUN addressing * ++ * and FcTape (FCP-2) support * ++ * * ++ * * ++ ************************************************************************/ ++/* ++ * Firmware Version 1.19.24 (14:02 Jul 16, 2002) ++ */ ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2100tp_version = 1*1024+19; ++#else ++unsigned short risc_code_version = 1*1024+19; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned char fw2100tp_version_str[] = {1,19,24}; ++#else ++unsigned char firmware_version[] = {1,19,24}; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++#define fw2100tp_VERSION_STRING "1.19.24" ++#else ++#define FW_VERSION_STRING "1.19.24" ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2100tp_addr01 = 0x1000 ; ++#else ++unsigned short risc_code_addr01 = 0x1000 ; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2100tp_code01[] = { ++#else ++unsigned short risc_code01[] = { ++#endif ++ 0x0078, 0x102d, 0x0000, 0x95f1, 0x0000, 0x0001, 0x0013, 0x0018, ++ 0x0017, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030, ++ 0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241, ++ 0x5449, 0x4f4e, 0x2049, 0x5350, 0x3231, 0x3030, 0x2046, 0x6972, ++ 0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, ++ 0x312e, 0x3139, 0x2020, 0x2020, 0x2400, 0x2091, 0x2000, 0x20c1, ++ 0x0021, 0x2039, 0xffff, 0x2019, 0xaaaa, 0x2760, 0x2069, 0x7fff, ++ 0x20c1, 0x0020, 0x2c2c, 0x2d34, 0x2762, 0x236a, 0x2c24, 0x2d04, ++ 0x266a, 0x2562, 0xa406, 0x00c0, 0x1052, 0x20c1, 0x0021, 0x2c2c, ++ 0x2362, 0x2c04, 0x2562, 0xa306, 0x0040, 0x1052, 0x20c1, 0x0020, ++ 0x2039, 0x8fff, 0x20a1, 0xad00, 0x2708, 0x810d, 0x810d, 0x810d, ++ 0x810d, 0xa18c, 0x000f, 0x2001, 0x000a, 0xa112, 0xa00e, 0x21a8, ++ 0x41a4, 0x3400, 0x8211, 0x00c0, 0x105f, 0x2708, 0x3400, 0xa102, ++ 0x0040, 0x106f, 0x0048, 0x106f, 0x20a8, 0xa00e, 0x41a4, 0x20a1, ++ 0xa5f1, 0x2009, 0x0000, 0x20a9, 0x070f, 0x41a4, 0x3400, 0x20c9, ++ 0xaaff, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x25c7, ++ 0x2051, 0xa600, 0x2a70, 0x7762, 0xa786, 0x8fff, 0x0040, 0x1092, ++ 0x705f, 0xcd00, 0x705b, 0xccf1, 0x7067, 0x0200, 0x706b, 0x0200, ++ 0x0078, 0x109a, 0x705b, 0xbd01, 0x7067, 0x0100, 0x706b, 0x0100, ++ 0x705f, 0xbd00, 0x1078, 0x12df, 0x1078, 0x13ca, 0x1078, 0x1577, ++ 0x1078, 0x1ce9, 0x1078, 0x42ec, 0x1078, 0x76bf, 0x1078, 0x1355, ++ 0x1078, 0x2ac0, 0x1078, 0x4e93, 0x1078, 0x49a3, 0x1078, 0x594a, ++ 0x1078, 0x2263, 0x1078, 0x5c43, 0x1078, 0x5485, 0x1078, 0x2162, ++ 0x1078, 0x2240, 0x2091, 0x3009, 0x7823, 0x0000, 0x0090, 0x10cf, ++ 0x7820, 0xa086, 0x0002, 0x00c0, 0x10cf, 0x7823, 0x4000, 0x0068, ++ 0x10c7, 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, ++ 0x7003, 0x0000, 0x2001, 0x017f, 0x2003, 0x0000, 0x2a70, 0x7000, ++ 0xa08e, 0x0003, 0x00c0, 0x10ef, 0x1078, 0x365e, 0x1078, 0x2ae8, ++ 0x1078, 0x4ee3, 0x1078, 0x4b66, 0x2009, 0x0100, 0x2104, 0xa082, ++ 0x0002, 0x0048, 0x10f3, 0x1078, 0x5966, 0x0078, 0x10d6, 0x1079, ++ 0x10f7, 0x0078, 0x10dc, 0x1078, 0x7197, 0x0078, 0x10eb, 0x1101, ++ 0x1102, 0x11be, 0x10ff, 0x1246, 0x12dc, 0x12dd, 0x12de, 0x1078, ++ 0x1332, 0x007c, 0x127e, 0x0f7e, 0x2091, 0x8000, 0x7000, 0xa086, ++ 0x0001, 0x00c0, 0x1198, 0x1078, 0x3aec, 0x2079, 0x0100, 0x7844, ++ 0xa005, 0x00c0, 0x1198, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x1078, ++ 0x1adf, 0x780f, 0x00ff, 0x7840, 0xa084, 0xfffb, 0x7842, 0x2011, ++ 0x8010, 0x73c4, 0x1078, 0x361b, 0x2001, 0xffff, 0x1078, 0x5ae6, ++ 0x723c, 0xc284, 0x723e, 0x2001, 0xa60c, 0x2014, 0xc2ac, 0x2202, ++ 0x1078, 0x6f9f, 0x2011, 0x0004, 0x1078, 0x8d1b, 0x1078, 0x489e, ++ 0x1078, 0x42d4, 0x0040, 0x1144, 0x7087, 0x0001, 0x70bf, 0x0000, ++ 0x1078, 0x3c9e, 0x0078, 0x1198, 0x1078, 0x4967, 0x0040, 0x114d, ++ 0x7a0c, 0xc2b4, 0x7a0e, 0x0078, 0x1159, 0x1078, 0x90a6, 0x70cc, ++ 0xd09c, 0x00c0, 0x1159, 0x7098, 0xa005, 0x0040, 0x1159, 0x1078, ++ 0x42b8, 0x70d7, 0x0000, 0x70d3, 0x0000, 0x72cc, 0x2079, 0xa652, ++ 0x7804, 0xd0ac, 0x0040, 0x1165, 0xc295, 0x72ce, 0xa296, 0x0004, ++ 0x0040, 0x1186, 0x2011, 0x0001, 0x1078, 0x8d1b, 0x7093, 0x0000, ++ 0x7097, 0xffff, 0x7003, 0x0002, 0x0f7f, 0x1078, 0x2677, 0x2011, ++ 0x0005, 0x1078, 0x70e0, 0x1078, 0x62d1, 0x0c7e, 0x2061, 0x0100, ++ 0x60e3, 0x0008, 0x0c7f, 0x127f, 0x0078, 0x119a, 0x7093, 0x0000, ++ 0x7097, 0xffff, 0x7003, 0x0002, 0x2011, 0x0005, 0x1078, 0x70e0, ++ 0x1078, 0x62d1, 0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f, ++ 0x0f7f, 0x127f, 0x007c, 0x0c7e, 0x20a9, 0x0082, 0x2009, 0x007e, ++ 0x017e, 0x027e, 0x037e, 0x2110, 0x027e, 0x2019, 0x0029, 0x1078, ++ 0x73d0, 0x027f, 0x1078, 0xa4f1, 0x037f, 0x027f, 0x017f, 0x1078, ++ 0x298e, 0x8108, 0x00f0, 0x11a0, 0x0c7f, 0x706f, 0x0000, 0x7070, ++ 0xa084, 0x00ff, 0x7072, 0x709b, 0x0000, 0x007c, 0x127e, 0x2091, ++ 0x8000, 0x7000, 0xa086, 0x0002, 0x00c0, 0x1244, 0x7094, 0xa086, ++ 0xffff, 0x0040, 0x11d1, 0x1078, 0x2677, 0x1078, 0x62d1, 0x0078, ++ 0x1244, 0x70cc, 0xd09c, 0x0040, 0x11fd, 0xd084, 0x0040, 0x11fd, ++ 0x0f7e, 0x2079, 0x0100, 0x790c, 0xc1b5, 0x790e, 0x0f7f, 0xd08c, ++ 0x0040, 0x11fd, 0x70d0, 0xa086, 0xffff, 0x0040, 0x11f9, 0x1078, ++ 0x27f7, 0x1078, 0x62d1, 0x70cc, 0xd094, 0x00c0, 0x1244, 0x2011, ++ 0x0001, 0x2019, 0x0000, 0x1078, 0x282f, 0x1078, 0x62d1, 0x0078, ++ 0x1244, 0x70d4, 0xa005, 0x00c0, 0x1244, 0x7090, 0xa005, 0x00c0, ++ 0x1244, 0x1078, 0x4967, 0x00c0, 0x1244, 0x2001, 0xa653, 0x2004, ++ 0xd0ac, 0x0040, 0x1227, 0x157e, 0x0c7e, 0x20a9, 0x007f, 0x2009, ++ 0x0000, 0x017e, 0x1078, 0x45c4, 0x00c0, 0x121a, 0x6000, 0xd0ec, ++ 0x00c0, 0x1222, 0x017f, 0x8108, 0x00f0, 0x1211, 0x0c7f, 0x157f, ++ 0x0078, 0x1227, 0x017f, 0x0c7f, 0x157f, 0x0078, 0x1244, 0x7003, ++ 0x0003, 0x7097, 0xffff, 0x2001, 0x0000, 0x1078, 0x24e8, 0x1078, ++ 0x3699, 0x2001, 0xa8b2, 0x2004, 0xa086, 0x0005, 0x00c0, 0x123c, ++ 0x2011, 0x0000, 0x1078, 0x70e0, 0x2011, 0x0000, 0x1078, 0x70ea, ++ 0x1078, 0x62d1, 0x1078, 0x639b, 0x127f, 0x007c, 0x017e, 0x0f7e, ++ 0x127e, 0x2091, 0x8000, 0x2079, 0x0100, 0x2009, 0x00f7, 0x1078, ++ 0x42a1, 0x7940, 0xa18c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0040, ++ 0x125b, 0x7827, 0x0040, 0xd19c, 0x0040, 0x1260, 0x7827, 0x0008, ++ 0x007e, 0x037e, 0x157e, 0xa006, 0x1078, 0x5ae6, 0x7900, 0xa18a, ++ 0x0003, 0x0050, 0x1289, 0x7954, 0xd1ac, 0x00c0, 0x1289, 0x2009, ++ 0x00f8, 0x1078, 0x42a1, 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, ++ 0x09c4, 0x7820, 0xd09c, 0x00c0, 0x1281, 0x7824, 0xd0ac, 0x00c0, ++ 0x12ca, 0x00f0, 0x1279, 0x2001, 0x0001, 0x1078, 0x24e8, 0x0078, ++ 0x12d5, 0x7853, 0x0000, 0x782f, 0x0020, 0x20a9, 0x0050, 0x00e0, ++ 0x128f, 0x2091, 0x6000, 0x00f0, 0x128f, 0x7853, 0x0400, 0x782f, ++ 0x0000, 0x2009, 0x00f8, 0x1078, 0x42a1, 0x20a9, 0x000e, 0x0005, ++ 0x00f0, 0x129f, 0x7853, 0x1400, 0x7843, 0x0090, 0x7843, 0x0010, ++ 0x2019, 0x61a8, 0x7854, 0x0005, 0x0005, 0xd08c, 0x0040, 0x12b4, ++ 0x7824, 0xd0ac, 0x00c0, 0x12ca, 0x8319, 0x00c0, 0x12aa, 0x2009, ++ 0xa632, 0x2104, 0x8000, 0x200a, 0xa084, 0xfff0, 0x0040, 0x12c4, ++ 0x200b, 0x0000, 0x1078, 0x2588, 0x2001, 0x0001, 0x1078, 0x24e8, ++ 0x0078, 0x12d3, 0x2001, 0xa632, 0x2003, 0x0000, 0x7828, 0xc09d, ++ 0x782a, 0x7827, 0x0048, 0x7853, 0x0400, 0x157f, 0x037f, 0x007f, ++ 0x127f, 0x0f7f, 0x017f, 0x007c, 0x007c, 0x007c, 0x007c, 0x2a70, ++ 0x2061, 0xa8ad, 0x2063, 0x0001, 0x6007, 0x0013, 0x600b, 0x0018, ++ 0x600f, 0x0017, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048, ++ 0x12f5, 0x7053, 0xffff, 0x0078, 0x12f7, 0x7053, 0x0000, 0x7057, ++ 0xffff, 0x706f, 0x0000, 0x7073, 0x0000, 0x1078, 0x90a6, 0x2061, ++ 0xa88d, 0x6003, 0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f, ++ 0x0200, 0x6013, 0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f, ++ 0x07d0, 0x2061, 0xa895, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b, ++ 0x0000, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b, ++ 0x0001, 0x601f, 0x0000, 0x2061, 0xa8a5, 0x6003, 0x514c, 0x6007, ++ 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001, 0xa626, 0x2003, ++ 0x0000, 0x007c, 0x2091, 0x8000, 0x0068, 0x1334, 0x007e, 0x017e, ++ 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, 0x133a, 0x017f, 0x792e, ++ 0x007f, 0x782a, 0x007f, 0x7826, 0x3900, 0x783a, 0x7823, 0x8002, ++ 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2079, 0xa600, ++ 0x7803, 0x0005, 0x0078, 0x1352, 0x007c, 0x2071, 0xa600, 0x715c, ++ 0x712e, 0x2021, 0x0001, 0xa190, 0x002d, 0xa298, 0x002d, 0x0048, ++ 0x136b, 0x7060, 0xa302, 0x00c8, 0x136b, 0x220a, 0x2208, 0x2310, ++ 0x8420, 0x0078, 0x135d, 0x200b, 0x0000, 0x74aa, 0x74ae, 0x007c, ++ 0x0e7e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa600, 0x70ac, 0xa0ea, ++ 0x0010, 0x00c8, 0x137e, 0xa06e, 0x0078, 0x1388, 0x8001, 0x70ae, ++ 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000, ++ 0x127f, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa600, 0x127e, 0x2091, ++ 0x8000, 0x70ac, 0x8001, 0x00c8, 0x1398, 0xa06e, 0x0078, 0x13a1, ++ 0x70ae, 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, ++ 0x0000, 0x127f, 0x0e7f, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000, ++ 0x2071, 0xa600, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70ac, 0x8000, ++ 0x70ae, 0x127f, 0x0e7f, 0x007c, 0x8dff, 0x0040, 0x13c0, 0x6804, ++ 0x6807, 0x0000, 0x007e, 0x1078, 0x13a4, 0x0d7f, 0x0078, 0x13b4, ++ 0x007c, 0x0e7e, 0x2071, 0xa600, 0x70ac, 0xa08a, 0x0010, 0xa00d, ++ 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa8d6, 0x7007, 0x0000, 0x701b, ++ 0x0000, 0x701f, 0x0000, 0x2071, 0x0000, 0x7010, 0xa085, 0x8004, ++ 0x7012, 0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x0e7e, 0x2270, ++ 0x700b, 0x0000, 0x2071, 0xa8d6, 0x7018, 0xa088, 0xa8df, 0x220a, ++ 0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005, 0x00c0, 0x13f6, ++ 0x0f7e, 0x2079, 0x0010, 0x1078, 0x1408, 0x0f7f, 0x0e7f, 0x127f, ++ 0x007c, 0x0e7e, 0x2071, 0xa8d6, 0x7004, 0xa005, 0x00c0, 0x1406, ++ 0x0f7e, 0x2079, 0x0010, 0x1078, 0x1408, 0x0f7f, 0x0e7f, 0x007c, ++ 0x7000, 0x0079, 0x140b, 0x140f, 0x1479, 0x1496, 0x1496, 0x7018, ++ 0x711c, 0xa106, 0x00c0, 0x1417, 0x7007, 0x0000, 0x007c, 0x0d7e, ++ 0xa180, 0xa8df, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007, ++ 0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c, ++ 0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804, ++ 0x0d7f, 0xd084, 0x0040, 0x1439, 0x7007, 0x0001, 0x1078, 0x143e, ++ 0x007c, 0x7007, 0x0002, 0x1078, 0x1454, 0x007c, 0x017e, 0x027e, ++ 0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1449, 0x2110, ++ 0xa006, 0x700e, 0x7212, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803, ++ 0x0041, 0x027f, 0x017f, 0x007c, 0x017e, 0x027e, 0x137e, 0x147e, ++ 0x157e, 0x7014, 0x2098, 0x20a1, 0x0014, 0x7803, 0x0026, 0x710c, ++ 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1468, 0x2110, 0xa006, ++ 0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, 0x7803, 0x0020, 0x3300, ++ 0x7016, 0x7803, 0x0001, 0x157f, 0x147f, 0x137f, 0x027f, 0x017f, ++ 0x007c, 0x137e, 0x147e, 0x157e, 0x2099, 0xa6fa, 0x20a1, 0x0018, ++ 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000, ++ 0x7803, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, 0x700b, ++ 0xa6f5, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x137e, 0x147e, ++ 0x157e, 0x2001, 0xa729, 0x209c, 0x20a1, 0x0014, 0x7803, 0x0026, ++ 0x2001, 0xa72a, 0x20ac, 0x53a6, 0x2099, 0xa72b, 0x20a1, 0x0018, ++ 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000, ++ 0x7803, 0x0001, 0x7007, 0x0004, 0x7000, 0xc08c, 0x7002, 0x700b, ++ 0xa726, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x017e, 0x0e7e, ++ 0x2071, 0xa8d6, 0x0f7e, 0x2079, 0x0010, 0x7904, 0x7803, 0x0002, ++ 0xd1fc, 0x0040, 0x14d0, 0xa18c, 0x0700, 0x7004, 0x1079, 0x14d4, ++ 0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x1408, 0x14dc, 0x1509, 0x1531, ++ 0x1564, 0x14da, 0x0078, 0x14da, 0xa18c, 0x0700, 0x00c0, 0x1502, ++ 0x137e, 0x147e, 0x157e, 0x7014, 0x20a0, 0x2099, 0x0014, 0x7803, ++ 0x0040, 0x7010, 0x20a8, 0x53a5, 0x3400, 0x7016, 0x157f, 0x147f, ++ 0x137f, 0x700c, 0xa005, 0x0040, 0x151e, 0x1078, 0x143e, 0x007c, ++ 0x7008, 0xa080, 0x0002, 0x2003, 0x0100, 0x7007, 0x0000, 0x1078, ++ 0x1408, 0x007c, 0x7008, 0xa080, 0x0002, 0x2003, 0x0200, 0x0078, ++ 0x14fd, 0xa18c, 0x0700, 0x00c0, 0x1514, 0x700c, 0xa005, 0x0040, ++ 0x151e, 0x1078, 0x1454, 0x007c, 0x7008, 0xa080, 0x0002, 0x2003, ++ 0x0200, 0x7007, 0x0000, 0x1078, 0x1408, 0x007c, 0x0d7e, 0x7008, ++ 0x2068, 0x7830, 0x6826, 0x7834, 0x682a, 0x7838, 0x682e, 0x783c, ++ 0x6832, 0x680b, 0x0100, 0x0d7f, 0x7007, 0x0000, 0x1078, 0x1408, ++ 0x007c, 0xa18c, 0x0700, 0x00c0, 0x155e, 0x137e, 0x147e, 0x157e, ++ 0x2001, 0xa6f8, 0x2004, 0xa080, 0x000d, 0x20a0, 0x2099, 0x0014, ++ 0x7803, 0x0040, 0x20a9, 0x0020, 0x53a5, 0x2001, 0xa6fa, 0x2004, ++ 0xd0bc, 0x0040, 0x1554, 0x2001, 0xa703, 0x2004, 0xa080, 0x000d, ++ 0x20a0, 0x20a9, 0x0020, 0x53a5, 0x157f, 0x147f, 0x137f, 0x7007, ++ 0x0000, 0x1078, 0x4f8c, 0x1078, 0x1408, 0x007c, 0x2011, 0x8003, ++ 0x1078, 0x361b, 0x0078, 0x1562, 0xa18c, 0x0700, 0x00c0, 0x1571, ++ 0x2001, 0xa728, 0x2003, 0x0100, 0x7007, 0x0000, 0x1078, 0x1408, ++ 0x007c, 0x2011, 0x8004, 0x1078, 0x361b, 0x0078, 0x1575, 0x127e, ++ 0x2091, 0x2100, 0x2079, 0x0030, 0x2071, 0xa8e7, 0x7803, 0x0004, ++ 0x7003, 0x0000, 0x700f, 0xa8ed, 0x7013, 0xa8ed, 0x780f, 0x0076, ++ 0x7803, 0x0004, 0x127f, 0x007c, 0x6934, 0xa184, 0x0007, 0x0079, ++ 0x1591, 0x1599, 0x15df, 0x1599, 0x1599, 0x1599, 0x15c4, 0x15a8, ++ 0x159d, 0xa085, 0x0001, 0x0078, 0x15f9, 0x684c, 0xd0bc, 0x0040, ++ 0x1599, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, 0x0078, 0x15e7, ++ 0xa18c, 0x00ff, 0xa186, 0x001e, 0x00c0, 0x1599, 0x684c, 0xd0bc, ++ 0x0040, 0x1599, 0x6860, 0x682e, 0x685c, 0x682a, 0x6804, 0x681a, ++ 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, ++ 0x6832, 0x6858, 0x0078, 0x15ef, 0xa18c, 0x00ff, 0xa186, 0x0015, ++ 0x00c0, 0x1599, 0x684c, 0xd0ac, 0x0040, 0x1599, 0x6804, 0x681a, ++ 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, ++ 0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0078, 0x15ef, 0x684c, ++ 0xd0ac, 0x0040, 0x1599, 0xa006, 0x682e, 0x682a, 0x6858, 0xa18c, ++ 0x000f, 0xa188, 0x206a, 0x210c, 0x6932, 0x2d08, 0x691a, 0x6826, ++ 0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, 0x6912, 0x6980, ++ 0x6916, 0x007c, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a, ++ 0x2004, 0x82ff, 0x0040, 0x161c, 0xa280, 0x0004, 0x0d7e, 0x206c, ++ 0x684c, 0xd0dc, 0x00c0, 0x1618, 0x1078, 0x158c, 0x0040, 0x1618, ++ 0x0d7f, 0xa280, 0x0000, 0x2003, 0x0002, 0xa016, 0x0078, 0x161c, ++ 0x6808, 0x8000, 0x680a, 0x0d7f, 0x127e, 0x047e, 0x037e, 0x027e, ++ 0x2091, 0x2100, 0x027f, 0x037f, 0x047f, 0x7000, 0xa005, 0x00c0, ++ 0x1630, 0x7206, 0x2001, 0x1651, 0x007e, 0x2260, 0x0078, 0x17e0, ++ 0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, 0x8108, 0xa182, ++ 0xa908, 0x0048, 0x163d, 0x2009, 0xa8ed, 0x710e, 0x7010, 0xa102, ++ 0xa082, 0x0009, 0x0040, 0x1648, 0xa080, 0x001b, 0x00c0, 0x164b, ++ 0x2009, 0x0138, 0x200a, 0x7000, 0xa005, 0x00c0, 0x1651, 0x1078, ++ 0x17c1, 0x127f, 0x007c, 0x127e, 0x027e, 0x037e, 0x0c7e, 0x007e, ++ 0x2091, 0x2100, 0x007f, 0x047f, 0x037f, 0x027f, 0x0d7e, 0x0c7e, ++ 0x2460, 0x6110, 0x2168, 0x6a62, 0x6b5e, 0xa005, 0x0040, 0x16dd, ++ 0x6808, 0xa005, 0x0040, 0x174a, 0x7000, 0xa005, 0x00c0, 0x1672, ++ 0x0078, 0x16d2, 0x700c, 0x7110, 0xa106, 0x00c0, 0x1753, 0x7004, ++ 0xa406, 0x00c0, 0x16d2, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0040, ++ 0x168f, 0x047e, 0x1078, 0x1913, 0x047f, 0x2460, 0x6010, 0xa080, ++ 0x0002, 0x2004, 0xa005, 0x0040, 0x174a, 0x0078, 0x166c, 0x2001, ++ 0x0207, 0x2004, 0xd09c, 0x00c0, 0x167b, 0x7804, 0xa084, 0x6000, ++ 0x0040, 0x16a0, 0xa086, 0x6000, 0x0040, 0x16a0, 0x0078, 0x167b, ++ 0x7100, 0xa186, 0x0002, 0x00c0, 0x16c0, 0x0e7e, 0x2b68, 0x6818, ++ 0x2060, 0x1078, 0x203f, 0x2804, 0xac70, 0x6034, 0xd09c, 0x00c0, ++ 0x16b5, 0x7108, 0x720c, 0x0078, 0x16b7, 0x7110, 0x7214, 0x6810, ++ 0xa100, 0x6812, 0x6814, 0xa201, 0x6816, 0x0e7f, 0x0078, 0x16c4, ++ 0xa186, 0x0001, 0x00c0, 0x16cc, 0x7820, 0x6910, 0xa100, 0x6812, ++ 0x7824, 0x6914, 0xa101, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000, ++ 0x7004, 0x2060, 0x6100, 0xa18e, 0x0004, 0x00c0, 0x1753, 0x2009, ++ 0x0048, 0x1078, 0x775c, 0x0078, 0x1753, 0x6808, 0xa005, 0x0040, ++ 0x174a, 0x7000, 0xa005, 0x00c0, 0x16e7, 0x0078, 0x174a, 0x700c, ++ 0x7110, 0xa106, 0x00c0, 0x16f0, 0x7004, 0xa406, 0x00c0, 0x174a, ++ 0x2001, 0x0005, 0x2004, 0xd08c, 0x0040, 0x1704, 0x047e, 0x1078, ++ 0x1913, 0x047f, 0x2460, 0x6010, 0xa080, 0x0002, 0x2004, 0xa005, ++ 0x0040, 0x174a, 0x0078, 0x16e1, 0x2001, 0x0207, 0x2004, 0xd09c, ++ 0x00c0, 0x16f0, 0x2001, 0x0005, 0x2004, 0xd08c, 0x00c0, 0x16f6, ++ 0x7804, 0xa084, 0x6000, 0x0040, 0x171b, 0xa086, 0x6000, 0x0040, ++ 0x171b, 0x0078, 0x16f0, 0x7007, 0x0000, 0xa016, 0x2218, 0x7000, ++ 0xa08e, 0x0001, 0x0040, 0x173c, 0xa08e, 0x0002, 0x00c0, 0x174a, ++ 0x0c7e, 0x0e7e, 0x6818, 0x2060, 0x1078, 0x203f, 0x2804, 0xac70, ++ 0x6034, 0xd09c, 0x00c0, 0x1738, 0x7308, 0x720c, 0x0078, 0x173a, ++ 0x7310, 0x7214, 0x0e7f, 0x0c7f, 0x7820, 0xa318, 0x7824, 0xa211, ++ 0x6810, 0xa300, 0x6812, 0x6814, 0xa201, 0x6816, 0x7803, 0x0004, ++ 0x7003, 0x0000, 0x6100, 0xa18e, 0x0004, 0x00c0, 0x1753, 0x2009, ++ 0x0048, 0x1078, 0x775c, 0x0c7f, 0x0d7f, 0x127f, 0x007c, 0x0f7e, ++ 0x0e7e, 0x027e, 0x037e, 0x047e, 0x057e, 0x2071, 0xa8e7, 0x7000, ++ 0xa086, 0x0000, 0x0040, 0x17ba, 0x7004, 0xac06, 0x00c0, 0x17ab, ++ 0x2079, 0x0030, 0x7000, 0xa086, 0x0003, 0x0040, 0x17ab, 0x7804, ++ 0xd0fc, 0x00c0, 0x17a7, 0x20e1, 0x6000, 0x2011, 0x0032, 0x2001, ++ 0x0208, 0x200c, 0x2001, 0x0209, 0x2004, 0xa106, 0x00c0, 0x176f, ++ 0x8211, 0x00c0, 0x1777, 0x7804, 0xd0fc, 0x00c0, 0x17a7, 0x1078, ++ 0x1b22, 0x027e, 0x057e, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0, ++ 0x178d, 0x7803, 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, 0x7007, ++ 0x0000, 0x057f, 0x027f, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, ++ 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0078, 0x17ab, 0x1078, ++ 0x1913, 0x0078, 0x175f, 0x157e, 0x20a9, 0x0009, 0x2009, 0xa8ed, ++ 0x2104, 0xac06, 0x00c0, 0x17b5, 0x200a, 0xa188, 0x0003, 0x00f0, ++ 0x17b0, 0x157f, 0x057f, 0x047f, 0x037f, 0x027f, 0x0e7f, 0x0f7f, ++ 0x007c, 0x700c, 0x7110, 0xa106, 0x00c0, 0x17c9, 0x7003, 0x0000, ++ 0x007c, 0x2104, 0x7006, 0x2060, 0x8108, 0x211c, 0x8108, 0x2124, ++ 0x8108, 0xa182, 0xa908, 0x0048, 0x17d7, 0x2009, 0xa8ed, 0x7112, ++ 0x700c, 0xa106, 0x00c0, 0x17e0, 0x2001, 0x0138, 0x2003, 0x0008, ++ 0x8cff, 0x00c0, 0x17e7, 0x1078, 0x1b4d, 0x0078, 0x1854, 0x6010, ++ 0x2068, 0x2d58, 0x6828, 0xa406, 0x00c0, 0x17f2, 0x682c, 0xa306, ++ 0x0040, 0x182f, 0x601c, 0xa086, 0x0008, 0x0040, 0x182f, 0x6024, ++ 0xd0f4, 0x00c0, 0x181c, 0xd0d4, 0x0040, 0x1818, 0x6038, 0xa402, ++ 0x6034, 0xa303, 0x0040, 0x1806, 0x00c8, 0x1818, 0x643a, 0x6336, ++ 0x6c2a, 0x6b2e, 0x047e, 0x037e, 0x2400, 0x6c7c, 0xa402, 0x6812, ++ 0x2300, 0x6b80, 0xa303, 0x6816, 0x037f, 0x047f, 0x0078, 0x181c, ++ 0x1078, 0x9053, 0x0040, 0x17e3, 0x2001, 0xa674, 0x2004, 0xd0b4, ++ 0x00c0, 0x182b, 0x6018, 0x2004, 0xd0bc, 0x00c0, 0x182b, 0x6817, ++ 0x7fff, 0x6813, 0xffff, 0x1078, 0x208a, 0x00c0, 0x17e3, 0x0c7e, ++ 0x7004, 0x2060, 0x6024, 0xc0d4, 0x6026, 0x0c7f, 0x684c, 0xd0f4, ++ 0x0040, 0x1840, 0x6817, 0xffff, 0x6813, 0xffff, 0x0078, 0x17e3, ++ 0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, ++ 0x000f, 0x2009, 0x0011, 0x1078, 0x1855, 0x0040, 0x1853, 0x2009, ++ 0x0001, 0x1078, 0x1855, 0x2d58, 0x007c, 0x8aff, 0x0040, 0x18ec, ++ 0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0, 0x1877, 0xd0f4, 0x00c0, ++ 0x1887, 0x0d7e, 0x2804, 0xac68, 0x2900, 0x0079, 0x1867, 0x18ce, ++ 0x188e, 0x188e, 0x18ce, 0x18ce, 0x18c6, 0x18ce, 0x188e, 0x18ce, ++ 0x1894, 0x1894, 0x18ce, 0x18ce, 0x18ce, 0x18bd, 0x1894, 0xc0fc, ++ 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0x0d7e, 0xd99c, 0x0040, ++ 0x18d1, 0x2804, 0xac68, 0x6f08, 0x6e0c, 0x0078, 0x18d1, 0xc0f4, ++ 0x6852, 0x6b6c, 0x6a70, 0x0d7e, 0x0078, 0x18d8, 0x6b08, 0x6a0c, ++ 0x6d00, 0x6c04, 0x0078, 0x18d1, 0x7b0c, 0xd3bc, 0x0040, 0x18b5, ++ 0x7004, 0x0e7e, 0x2070, 0x701c, 0x0e7f, 0xa086, 0x0008, 0x00c0, ++ 0x18b5, 0x7b08, 0xa39c, 0x0fff, 0x2d20, 0x0d7f, 0x0d7e, 0x6a14, ++ 0x82ff, 0x00c0, 0x18b0, 0x6810, 0xa302, 0x0048, 0x18b0, 0x6b10, ++ 0x2011, 0x0000, 0x2468, 0x0078, 0x18b7, 0x6b10, 0x6a14, 0x6d00, ++ 0x6c04, 0x6f08, 0x6e0c, 0x0078, 0x18d1, 0x0d7f, 0x0d7e, 0x6834, ++ 0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x18ce, 0x0d7f, 0x1078, ++ 0x2026, 0x00c0, 0x1855, 0xa00e, 0x0078, 0x18ec, 0x0d7f, 0x1078, ++ 0x1332, 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, ++ 0x7000, 0x8000, 0x7002, 0x0d7f, 0x6828, 0xa300, 0x682a, 0x682c, ++ 0xa201, 0x682e, 0x2300, 0x6b10, 0xa302, 0x6812, 0x2200, 0x6a14, ++ 0xa203, 0x6816, 0x1078, 0x2026, 0x007c, 0x1078, 0x1332, 0x1078, ++ 0x1c97, 0x7004, 0x2060, 0x0d7e, 0x6010, 0x2068, 0x7003, 0x0000, ++ 0x1078, 0x1af4, 0x1078, 0x8d06, 0x0040, 0x190c, 0x6808, 0x8001, ++ 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x682b, 0xffff, 0x682f, ++ 0xffff, 0x6850, 0xc0bd, 0x6852, 0x0d7f, 0x1078, 0x8a01, 0x0078, ++ 0x1adb, 0x1078, 0x1332, 0x127e, 0x2091, 0x2100, 0x007e, 0x017e, ++ 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, ++ 0x00c0, 0x18ef, 0xa184, 0x0003, 0xa086, 0x0003, 0x0040, 0x1911, ++ 0x7000, 0x0079, 0x192b, 0x1933, 0x1935, 0x1a34, 0x1ab2, 0x1ac9, ++ 0x1933, 0x1933, 0x1933, 0x1078, 0x1332, 0x8001, 0x7002, 0xa184, ++ 0x0880, 0x00c0, 0x194a, 0x8aff, 0x0040, 0x19d4, 0x2009, 0x0001, ++ 0x1078, 0x1855, 0x0040, 0x1adb, 0x2009, 0x0001, 0x1078, 0x1855, ++ 0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x00c0, ++ 0x19b2, 0x027e, 0x037e, 0x017e, 0x7808, 0xd0ec, 0x00c0, 0x1962, ++ 0x7c20, 0x7d24, 0x7e30, 0x7f34, 0x7803, 0x0009, 0x7003, 0x0004, ++ 0x0078, 0x1964, 0x1078, 0x1bd7, 0x017f, 0xd194, 0x0040, 0x196b, ++ 0x8aff, 0x0040, 0x19a1, 0x6b28, 0x6a2c, 0x2400, 0x686e, 0xa31a, ++ 0x2500, 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x0c7e, 0x7004, 0x2060, ++ 0x6024, 0xd0f4, 0x00c0, 0x197e, 0x633a, 0x6236, 0x0c7f, 0x2400, ++ 0x6910, 0xa100, 0x6812, 0x2500, 0x6914, 0xa101, 0x6816, 0x037f, ++ 0x027f, 0x2600, 0x681e, 0x2700, 0x6822, 0x1078, 0x203f, 0x2a00, ++ 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6850, 0xc0fd, 0x6852, ++ 0x6808, 0x8001, 0x680a, 0x00c0, 0x19a7, 0x684c, 0xd0e4, 0x0040, ++ 0x19a7, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x7000, ++ 0xa086, 0x0004, 0x0040, 0x1adb, 0x7003, 0x0000, 0x1078, 0x17c1, ++ 0x0078, 0x1adb, 0x057e, 0x7d0c, 0xd5bc, 0x00c0, 0x19b9, 0x1078, ++ 0xa57e, 0x057f, 0x1078, 0x1af4, 0x0f7e, 0x7004, 0x2078, 0x1078, ++ 0x4963, 0x0040, 0x19c6, 0x7824, 0xc0f5, 0x7826, 0x0f7f, 0x682b, ++ 0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912, ++ 0x6980, 0x6916, 0x0078, 0x1adb, 0x7004, 0x0c7e, 0x2060, 0x6024, ++ 0x0c7f, 0xd0f4, 0x0040, 0x19e1, 0x6808, 0x8001, 0x680a, 0x0078, ++ 0x19f5, 0x684c, 0xc0f5, 0x684e, 0x7814, 0xa005, 0x00c0, 0x19f9, ++ 0x7003, 0x0000, 0x6808, 0x8001, 0x680a, 0x00c0, 0x19f5, 0x7004, ++ 0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x1078, 0x17c1, 0x0078, ++ 0x1adb, 0x7814, 0x6910, 0xa102, 0x6812, 0x6914, 0xa183, 0x0000, ++ 0x6816, 0x7814, 0x7908, 0xa18c, 0x0fff, 0xa192, 0x0841, 0x00c8, ++ 0x18ef, 0xa188, 0x0007, 0x8114, 0x8214, 0x8214, 0xa10a, 0x8104, ++ 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, 0x810b, 0x1078, 0x1b5e, ++ 0x7803, 0x0004, 0x780f, 0xffff, 0x7803, 0x0001, 0x7804, 0xd0fc, ++ 0x0040, 0x1a1e, 0x7803, 0x0002, 0x7803, 0x0004, 0x780f, 0x0076, ++ 0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048, 0x1078, 0x775c, ++ 0x1078, 0x1b92, 0x0040, 0x19f5, 0x8001, 0x7002, 0xd194, 0x0040, ++ 0x1a46, 0x7804, 0xd0fc, 0x00c0, 0x191b, 0x8aff, 0x0040, 0x1adb, ++ 0x2009, 0x0001, 0x1078, 0x1855, 0x0078, 0x1adb, 0xa184, 0x0880, ++ 0x00c0, 0x1a53, 0x8aff, 0x0040, 0x1adb, 0x2009, 0x0001, 0x1078, ++ 0x1855, 0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, ++ 0x00c0, 0x1a93, 0x027e, 0x037e, 0x7808, 0xd0ec, 0x00c0, 0x1a66, ++ 0x7803, 0x0009, 0x7003, 0x0004, 0x0078, 0x1a68, 0x1078, 0x1bd7, ++ 0x6b28, 0x6a2c, 0x1078, 0x203f, 0x0d7e, 0x0f7e, 0x2d78, 0x2804, ++ 0xac68, 0x6034, 0xd09c, 0x00c0, 0x1a83, 0x6808, 0x2008, 0xa31a, ++ 0x680c, 0xa213, 0x7810, 0xa100, 0x7812, 0x690c, 0x7814, 0xa101, ++ 0x7816, 0x0078, 0x1a8f, 0x6810, 0x2008, 0xa31a, 0x6814, 0xa213, ++ 0x7810, 0xa100, 0x7812, 0x6914, 0x7814, 0xa101, 0x7816, 0x0f7f, ++ 0x0d7f, 0x0078, 0x196d, 0x057e, 0x7d0c, 0x1078, 0xa57e, 0x057f, ++ 0x1078, 0x1af4, 0x0f7e, 0x7004, 0x2078, 0x1078, 0x4963, 0x0040, ++ 0x1aa4, 0x7824, 0xc0f5, 0x7826, 0x0f7f, 0x682b, 0xffff, 0x682f, ++ 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, ++ 0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0xa00d, ++ 0x0040, 0x1ac5, 0x6808, 0x8001, 0x680a, 0x00c0, 0x1ac5, 0x7004, ++ 0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x1078, 0x17c1, 0x0078, ++ 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x6010, ++ 0xa005, 0x0040, 0x1ac5, 0x2068, 0x6808, 0x8000, 0x680a, 0x6c28, ++ 0x6b2c, 0x1078, 0x17e0, 0x017f, 0x007f, 0x127f, 0x007c, 0x127e, ++ 0x2091, 0x2100, 0x7000, 0xa086, 0x0003, 0x00c0, 0x1af2, 0x700c, ++ 0x7110, 0xa106, 0x0040, 0x1af2, 0x20e1, 0x9028, 0x700f, 0xa8ed, ++ 0x7013, 0xa8ed, 0x127f, 0x007c, 0x0c7e, 0x1078, 0x1b22, 0x20e1, ++ 0x9028, 0x700c, 0x7110, 0xa106, 0x0040, 0x1b19, 0x2104, 0xa005, ++ 0x0040, 0x1b08, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001, 0x600a, ++ 0xa188, 0x0003, 0xa182, 0xa908, 0x0048, 0x1b10, 0x2009, 0xa8ed, ++ 0x7112, 0x700c, 0xa106, 0x00c0, 0x1af9, 0x2011, 0x0008, 0x0078, ++ 0x1af9, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0138, 0x2202, ++ 0x0c7f, 0x007c, 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2021, ++ 0xb015, 0x2001, 0x0141, 0x201c, 0xd3dc, 0x00c0, 0x1b3f, 0x2001, ++ 0x0109, 0x201c, 0xa39c, 0x0048, 0x00c0, 0x1b3f, 0x2001, 0x0111, ++ 0x201c, 0x83ff, 0x00c0, 0x1b3f, 0x8421, 0x00c0, 0x1b29, 0x007c, ++ 0x2011, 0x0201, 0x2009, 0x003c, 0x2204, 0xa005, 0x00c0, 0x1b4c, ++ 0x8109, 0x00c0, 0x1b44, 0x007c, 0x007c, 0x1078, 0x1b40, 0x0040, ++ 0x1b55, 0x780c, 0xd0a4, 0x0040, 0x1b5b, 0x1078, 0x1af4, 0xa085, ++ 0x0001, 0x0078, 0x1b5d, 0x1078, 0x1b92, 0x007c, 0x0e7e, 0x2071, ++ 0x0200, 0x7808, 0xa084, 0xf000, 0xa10d, 0x1078, 0x1b22, 0x2019, ++ 0x5000, 0x8319, 0x0040, 0x1b7c, 0x2001, 0xa908, 0x2004, 0xa086, ++ 0x0000, 0x0040, 0x1b7c, 0x2001, 0x0021, 0xd0fc, 0x0040, 0x1b69, ++ 0x1078, 0x1eaa, 0x0078, 0x1b67, 0x20e1, 0x7000, 0x7324, 0x7420, ++ 0x7028, 0x7028, 0x7426, 0x7037, 0x0001, 0x810f, 0x712e, 0x702f, ++ 0x0100, 0x7037, 0x0008, 0x7326, 0x7422, 0x2001, 0x0138, 0x2202, ++ 0x0e7f, 0x007c, 0x027e, 0x2001, 0x015d, 0x2001, 0x0000, 0x7908, ++ 0xa18c, 0x0fff, 0xa182, 0x0ffd, 0x0048, 0x1ba0, 0x2009, 0x0000, ++ 0xa190, 0x0007, 0xa294, 0x1ff8, 0x8214, 0x8214, 0x8214, 0x2001, ++ 0x020a, 0x82ff, 0x0040, 0x1bb5, 0x20e1, 0x6000, 0x200c, 0x200c, ++ 0x200c, 0x200c, 0x8211, 0x00c0, 0x1bae, 0x20e1, 0x7000, 0x200c, ++ 0x200c, 0x7003, 0x0000, 0x20e1, 0x6000, 0x2001, 0x0208, 0x200c, ++ 0x2001, 0x0209, 0x2004, 0xa106, 0x0040, 0x1bd4, 0x1078, 0x1b40, ++ 0x0040, 0x1bd2, 0x7908, 0xd1ec, 0x00c0, 0x1bd4, 0x790c, 0xd1a4, ++ 0x0040, 0x1b97, 0x1078, 0x1af4, 0xa006, 0x027f, 0x007c, 0x7c20, ++ 0x7d24, 0x7e30, 0x7f34, 0x700c, 0x7110, 0xa106, 0x0040, 0x1c69, ++ 0x7004, 0x017e, 0x210c, 0xa106, 0x017f, 0x0040, 0x1c69, 0x0d7e, ++ 0x0c7e, 0x216c, 0x2d00, 0xa005, 0x0040, 0x1c67, 0x681c, 0xa086, ++ 0x0008, 0x0040, 0x1c67, 0x6824, 0xd0d4, 0x00c0, 0x1c67, 0x6810, ++ 0x2068, 0x6850, 0xd0fc, 0x0040, 0x1c29, 0x8108, 0x2104, 0x6b2c, ++ 0xa306, 0x00c0, 0x1c67, 0x8108, 0x2104, 0x6a28, 0xa206, 0x00c0, ++ 0x1c67, 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c, 0x7822, 0x6870, ++ 0x7826, 0x681c, 0x7832, 0x6820, 0x7836, 0x6818, 0x2060, 0x6034, ++ 0xd09c, 0x0040, 0x1c24, 0x6830, 0x2004, 0xac68, 0x6808, 0x783a, ++ 0x680c, 0x783e, 0x0078, 0x1c65, 0xa006, 0x783a, 0x783e, 0x0078, ++ 0x1c65, 0x8108, 0x2104, 0xa005, 0x00c0, 0x1c67, 0x6b2c, 0xa306, ++ 0x00c0, 0x1c67, 0x8108, 0x2104, 0xa005, 0x00c0, 0x1c67, 0x6a28, ++ 0xa206, 0x00c0, 0x1c67, 0x6850, 0xc0f5, 0x6852, 0x6830, 0x2004, ++ 0x6918, 0xa160, 0xa180, 0x000d, 0x2004, 0xd09c, 0x00c0, 0x1c57, ++ 0x6008, 0x7822, 0x686e, 0x600c, 0x7826, 0x6872, 0x6000, 0x7832, ++ 0x6004, 0x7836, 0xa006, 0x783a, 0x783e, 0x0078, 0x1c65, 0x6010, ++ 0x7822, 0x686e, 0x6014, 0x7826, 0x6872, 0x6000, 0x7832, 0x6004, ++ 0x7836, 0x6008, 0x783a, 0x600c, 0x783e, 0x7803, 0x0011, 0x0c7f, ++ 0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x017e, 0x027e, 0x2071, 0xa8e7, ++ 0x2079, 0x0030, 0x2011, 0x0050, 0x7000, 0xa086, 0x0000, 0x0040, ++ 0x1c92, 0x8211, 0x0040, 0x1c90, 0x2001, 0x0005, 0x2004, 0xd08c, ++ 0x0040, 0x1c79, 0x7904, 0xa18c, 0x0780, 0x017e, 0x1078, 0x1913, ++ 0x017f, 0x81ff, 0x00c0, 0x1c90, 0x2011, 0x0050, 0x0078, 0x1c74, ++ 0xa085, 0x0001, 0x027f, 0x017f, 0x0e7f, 0x0f7f, 0x007c, 0x7803, ++ 0x0004, 0x2009, 0x0064, 0x7804, 0xd0ac, 0x0040, 0x1ce8, 0x8109, ++ 0x00c0, 0x1c9b, 0x2009, 0x0100, 0x210c, 0xa18a, 0x0003, 0x1048, ++ 0x1332, 0x1078, 0x1fca, 0x0e7e, 0x0f7e, 0x2071, 0xa8d6, 0x2079, ++ 0x0010, 0x7004, 0xa086, 0x0000, 0x0040, 0x1ce0, 0x7800, 0x007e, ++ 0x7820, 0x007e, 0x7830, 0x007e, 0x7834, 0x007e, 0x7838, 0x007e, ++ 0x783c, 0x007e, 0x7803, 0x0004, 0x7823, 0x0000, 0x0005, 0x0005, ++ 0x2079, 0x0030, 0x7804, 0xd0ac, 0x10c0, 0x1332, 0x2079, 0x0010, ++ 0x007f, 0x783e, 0x007f, 0x783a, 0x007f, 0x7836, 0x007f, 0x7832, ++ 0x007f, 0x7822, 0x007f, 0x7802, 0x0f7f, 0x0e7f, 0x0078, 0x1ce6, ++ 0x0f7f, 0x0e7f, 0x7804, 0xd0ac, 0x10c0, 0x1332, 0x1078, 0x639b, ++ 0x007c, 0x0e7e, 0x2071, 0xa908, 0x7003, 0x0000, 0x0e7f, 0x007c, ++ 0x0d7e, 0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x00c0, 0x1d6b, ++ 0x6934, 0xa184, 0x0007, 0x0079, 0x1cfd, 0x1d05, 0x1d56, 0x1d05, ++ 0x1d05, 0x1d05, 0x1d3b, 0x1d18, 0x1d07, 0x1078, 0x1332, 0x684c, ++ 0xd0b4, 0x0040, 0x1e79, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, ++ 0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6958, 0x0078, 0x1d5e, ++ 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x1d05, 0x684c, ++ 0xd0b4, 0x0040, 0x1e79, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, ++ 0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6804, 0x681a, 0xa080, ++ 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832, ++ 0x6958, 0x0078, 0x1d67, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x00c0, ++ 0x1d6b, 0x684c, 0xd0b4, 0x0040, 0x1e79, 0x6804, 0x681a, 0xa080, ++ 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832, ++ 0x6958, 0xa006, 0x682e, 0x682a, 0x0078, 0x1d67, 0x684c, 0xd0b4, ++ 0x0040, 0x18ed, 0x6958, 0xa006, 0x682e, 0x682a, 0x2d00, 0x681a, ++ 0x6834, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832, 0x6926, ++ 0x684c, 0xc0dd, 0x684e, 0x0d7f, 0x007c, 0x0f7e, 0x2079, 0x0020, ++ 0x7804, 0xd0fc, 0x10c0, 0x1eaa, 0x0e7e, 0x0d7e, 0x2071, 0xa908, ++ 0x7000, 0xa005, 0x00c0, 0x1df0, 0x0c7e, 0x7206, 0xa280, 0x0004, ++ 0x205c, 0x7004, 0x2068, 0x7803, 0x0004, 0x6818, 0x0d7e, 0x2068, ++ 0x686c, 0x7812, 0x6890, 0x0f7e, 0x20e1, 0x9040, 0x2079, 0x0200, ++ 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x0f7f, 0x0d7f, 0x2b68, ++ 0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, ++ 0x000f, 0x6908, 0x2001, 0x04fd, 0x2004, 0xa086, 0x0007, 0x0040, ++ 0x1db2, 0xa184, 0x0007, 0x0040, 0x1db2, 0x017e, 0x2009, 0x0008, ++ 0xa102, 0x017f, 0xa108, 0x791a, 0x7116, 0x701e, 0x680c, 0xa081, ++ 0x0000, 0x781e, 0x701a, 0xa006, 0x700e, 0x7012, 0x7004, 0x692c, ++ 0x6814, 0xa106, 0x00c0, 0x1dc9, 0x6928, 0x6810, 0xa106, 0x0040, ++ 0x1dd6, 0x037e, 0x047e, 0x6b14, 0x6c10, 0x1078, 0x208a, 0x047f, ++ 0x037f, 0x0040, 0x1dd6, 0x0c7f, 0x0078, 0x1df0, 0x8aff, 0x00c0, ++ 0x1dde, 0x0c7f, 0xa085, 0x0001, 0x0078, 0x1df0, 0x127e, 0x2091, ++ 0x8000, 0x2079, 0x0020, 0x2009, 0x0001, 0x1078, 0x1df4, 0x0040, ++ 0x1ded, 0x2009, 0x0001, 0x1078, 0x1df4, 0x127f, 0x0c7f, 0xa006, ++ 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x077e, 0x067e, 0x057e, 0x047e, ++ 0x037e, 0x027e, 0x8aff, 0x0040, 0x1e72, 0x700c, 0x7214, 0xa23a, ++ 0x7010, 0x7218, 0xa203, 0x0048, 0x1e71, 0xa705, 0x0040, 0x1e71, ++ 0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0, 0x1e24, 0x0d7e, 0x2804, ++ 0xac68, 0x2900, 0x0079, 0x1e14, 0x1e53, 0x1e34, 0x1e34, 0x1e53, ++ 0x1e53, 0x1e4b, 0x1e53, 0x1e34, 0x1e53, 0x1e3a, 0x1e3a, 0x1e53, ++ 0x1e53, 0x1e53, 0x1e42, 0x1e3a, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, ++ 0x6d1c, 0x6c20, 0xd99c, 0x0040, 0x1e57, 0x0d7e, 0x2804, 0xac68, ++ 0x6f08, 0x6e0c, 0x0078, 0x1e56, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, ++ 0x0078, 0x1e56, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, ++ 0x0078, 0x1e56, 0x0d7f, 0x0d7e, 0x6834, 0xa084, 0x00ff, 0xa086, ++ 0x001e, 0x00c0, 0x1e53, 0x0d7f, 0x1078, 0x2026, 0x00c0, 0x1dfa, ++ 0xa00e, 0x0078, 0x1e72, 0x0d7f, 0x1078, 0x1332, 0x0d7f, 0x7b22, ++ 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000, ++ 0x7002, 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x700c, ++ 0xa300, 0x700e, 0x7010, 0xa201, 0x7012, 0x1078, 0x2026, 0x0078, ++ 0x1e72, 0xa006, 0x027f, 0x037f, 0x047f, 0x057f, 0x067f, 0x077f, ++ 0x007c, 0x1078, 0x1332, 0x027e, 0x2001, 0x0105, 0x2003, 0x0010, ++ 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, ++ 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x1e92, 0x6850, ++ 0xc0bd, 0x6852, 0x0d7f, 0x0c7e, 0x1078, 0x8a01, 0x0c7f, 0x2001, ++ 0xa8c0, 0x2004, 0xac06, 0x00c0, 0x1ea7, 0x20e1, 0x9040, 0x1078, ++ 0x738a, 0x2011, 0x0000, 0x1078, 0x70ea, 0x1078, 0x639b, 0x027f, ++ 0x0078, 0x1f76, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x0f7e, ++ 0x0e7e, 0x0d7e, 0x0c7e, 0x2079, 0x0020, 0x2071, 0xa908, 0x2b68, ++ 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, 0x00c0, ++ 0x1e7b, 0x7000, 0x0079, 0x1ec4, 0x1f76, 0x1ec8, 0x1f43, 0x1f74, ++ 0x8001, 0x7002, 0xd19c, 0x00c0, 0x1edc, 0x8aff, 0x0040, 0x1efb, ++ 0x2009, 0x0001, 0x1078, 0x1df4, 0x0040, 0x1f76, 0x2009, 0x0001, ++ 0x1078, 0x1df4, 0x0078, 0x1f76, 0x7803, 0x0004, 0xd194, 0x0040, ++ 0x1eec, 0x6850, 0xc0fc, 0x6852, 0x8aff, 0x00c0, 0x1ef1, 0x684c, ++ 0xc0f5, 0x684e, 0x0078, 0x1ef1, 0x1078, 0x203f, 0x6850, 0xc0fd, ++ 0x6852, 0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, ++ 0x0000, 0x0078, 0x1f76, 0x711c, 0x81ff, 0x0040, 0x1f11, 0x7918, ++ 0x7922, 0x7827, 0x0000, 0x7803, 0x0001, 0x7000, 0x8000, 0x7002, ++ 0x700c, 0xa100, 0x700e, 0x7010, 0xa081, 0x0000, 0x7012, 0x0078, ++ 0x1f76, 0x0f7e, 0x027e, 0x781c, 0x007e, 0x7818, 0x007e, 0x2079, ++ 0x0100, 0x7a14, 0xa284, 0x0004, 0xa085, 0x0012, 0x7816, 0x037e, ++ 0x2019, 0x1000, 0x8319, 0x1040, 0x1332, 0x7820, 0xd0bc, 0x00c0, ++ 0x1f22, 0x037f, 0x79c8, 0x007f, 0xa102, 0x017f, 0x007e, 0x017e, ++ 0x79c4, 0x007f, 0xa103, 0x78c6, 0x007f, 0x78ca, 0xa284, 0x0004, ++ 0xa085, 0x0012, 0x7816, 0x027f, 0x0f7f, 0x7803, 0x0008, 0x7003, ++ 0x0000, 0x0078, 0x1f76, 0x8001, 0x7002, 0xd194, 0x0040, 0x1f58, ++ 0x7804, 0xd0fc, 0x00c0, 0x1eba, 0xd19c, 0x00c0, 0x1f72, 0x8aff, ++ 0x0040, 0x1f76, 0x2009, 0x0001, 0x1078, 0x1df4, 0x0078, 0x1f76, ++ 0x027e, 0x037e, 0x6b28, 0x6a2c, 0x1078, 0x203f, 0x0d7e, 0x2804, ++ 0xac68, 0x6034, 0xd09c, 0x00c0, 0x1f6b, 0x6808, 0xa31a, 0x680c, ++ 0xa213, 0x0078, 0x1f6f, 0x6810, 0xa31a, 0x6814, 0xa213, 0x0d7f, ++ 0x0078, 0x1eec, 0x0078, 0x1eec, 0x1078, 0x1332, 0x0c7f, 0x0d7f, ++ 0x0e7f, 0x0f7f, 0x017f, 0x007f, 0x127f, 0x007c, 0x0f7e, 0x0e7e, ++ 0x2071, 0xa908, 0x7000, 0xa086, 0x0000, 0x0040, 0x1fc7, 0x2079, ++ 0x0020, 0x017e, 0x2009, 0x0207, 0x210c, 0xd194, 0x0040, 0x1fa4, ++ 0x2009, 0x020c, 0x210c, 0xa184, 0x0003, 0x0040, 0x1fa4, 0x1078, ++ 0xa5d2, 0x2001, 0x0133, 0x2004, 0xa005, 0x1040, 0x1332, 0x20e1, ++ 0x9040, 0x2001, 0x020c, 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, ++ 0x0203, 0x210c, 0xa106, 0x00c0, 0x1faf, 0x20e1, 0x9040, 0x7804, ++ 0xd0fc, 0x0040, 0x1f8a, 0x1078, 0x1eaa, 0x7000, 0xa086, 0x0000, ++ 0x00c0, 0x1f8a, 0x017f, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0, ++ 0x1fbd, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x0e7f, ++ 0x0f7f, 0x007c, 0x027e, 0x0c7e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2071, ++ 0xa908, 0x2079, 0x0020, 0x7000, 0xa086, 0x0000, 0x0040, 0x2003, ++ 0x7004, 0x2060, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x1fed, ++ 0x6850, 0xc0b5, 0x6852, 0x680c, 0x7a1c, 0xa206, 0x00c0, 0x1fed, ++ 0x6808, 0x7a18, 0xa206, 0x0040, 0x2009, 0x2001, 0x0105, 0x2003, ++ 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, ++ 0x2060, 0x1078, 0x8a01, 0x20e1, 0x9040, 0x1078, 0x738a, 0x2011, ++ 0x0000, 0x1078, 0x70ea, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x027f, ++ 0x007c, 0x6810, 0x6a14, 0xa205, 0x00c0, 0x1fed, 0x684c, 0xc0dc, ++ 0x684e, 0x2c10, 0x1078, 0x1cf0, 0x2001, 0x0105, 0x2003, 0x0010, ++ 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x2069, 0xa8b1, ++ 0x6833, 0x0000, 0x683f, 0x0000, 0x0078, 0x2003, 0x8840, 0x2804, ++ 0xa005, 0x00c0, 0x203a, 0x6004, 0xa005, 0x0040, 0x203c, 0x681a, ++ 0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x206a, 0x2044, 0x88ff, ++ 0x1040, 0x1332, 0x8a51, 0x007c, 0x2051, 0x0000, 0x007c, 0x8a50, ++ 0x8841, 0x2804, 0xa005, 0x00c0, 0x2059, 0x2c00, 0xad06, 0x0040, ++ 0x204e, 0x6000, 0xa005, 0x00c0, 0x204e, 0x2d00, 0x2060, 0x681a, ++ 0x6034, 0xa084, 0x000f, 0xa080, 0x207a, 0x2044, 0x88ff, 0x1040, ++ 0x1332, 0x007c, 0x0000, 0x0011, 0x0015, 0x0019, 0x001d, 0x0021, ++ 0x0025, 0x0029, 0x0000, 0x000f, 0x0015, 0x001b, 0x0021, 0x0027, ++ 0x0000, 0x0000, 0x0000, 0x205f, 0x205b, 0x0000, 0x0000, 0x2069, ++ 0x0000, 0x205f, 0x0000, 0x2066, 0x2063, 0x0000, 0x0000, 0x0000, ++ 0x2069, 0x2066, 0x0000, 0x2061, 0x2061, 0x0000, 0x0000, 0x2069, ++ 0x0000, 0x2061, 0x0000, 0x2067, 0x2067, 0x0000, 0x0000, 0x0000, ++ 0x2069, 0x2067, 0x0a7e, 0x097e, 0x087e, 0x6b2e, 0x6c2a, 0x6858, ++ 0xa055, 0x0040, 0x212d, 0x2d60, 0x6034, 0xa0cc, 0x000f, 0xa9c0, ++ 0x206a, 0xa986, 0x0007, 0x0040, 0x20a5, 0xa986, 0x000e, 0x0040, ++ 0x20a5, 0xa986, 0x000f, 0x00c0, 0x20a9, 0x605c, 0xa422, 0x6060, ++ 0xa31a, 0x2804, 0xa045, 0x00c0, 0x20b7, 0x0050, 0x20b1, 0x0078, ++ 0x212d, 0x6004, 0xa065, 0x0040, 0x212d, 0x0078, 0x2094, 0x2804, ++ 0xa005, 0x0040, 0x20d5, 0xac68, 0xd99c, 0x00c0, 0x20c5, 0x6808, ++ 0xa422, 0x680c, 0xa31b, 0x0078, 0x20c9, 0x6810, 0xa422, 0x6814, ++ 0xa31b, 0x0048, 0x20f4, 0x2300, 0xa405, 0x0040, 0x20db, 0x8a51, ++ 0x0040, 0x212d, 0x8840, 0x0078, 0x20b7, 0x6004, 0xa065, 0x0040, ++ 0x212d, 0x0078, 0x2094, 0x8a51, 0x0040, 0x212d, 0x8840, 0x2804, ++ 0xa005, 0x00c0, 0x20ee, 0x6004, 0xa065, 0x0040, 0x212d, 0x6034, ++ 0xa0cc, 0x000f, 0xa9c0, 0x206a, 0x2804, 0x2040, 0x2b68, 0x6850, ++ 0xc0fc, 0x6852, 0x0078, 0x2121, 0x8422, 0x8420, 0x831a, 0xa399, ++ 0x0000, 0x0d7e, 0x2b68, 0x6c6e, 0x6b72, 0x0d7f, 0xd99c, 0x00c0, ++ 0x210f, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x1048, ++ 0x1332, 0x6800, 0xa420, 0x6804, 0xa319, 0x0078, 0x211b, 0x6910, ++ 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x1048, 0x1332, 0x6800, ++ 0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22, 0x6850, 0xc0fd, ++ 0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, 0x2a00, 0x6826, 0x007f, ++ 0x007f, 0x007f, 0xa006, 0x0078, 0x2132, 0x087f, 0x097f, 0x0a7f, ++ 0xa085, 0x0001, 0x007c, 0x2001, 0x0005, 0x2004, 0xa084, 0x0007, ++ 0x0079, 0x213a, 0x2142, 0x2143, 0x2146, 0x2149, 0x214e, 0x2151, ++ 0x2156, 0x215b, 0x007c, 0x1078, 0x1eaa, 0x007c, 0x1078, 0x1913, ++ 0x007c, 0x1078, 0x1913, 0x1078, 0x1eaa, 0x007c, 0x1078, 0x14be, ++ 0x007c, 0x1078, 0x1eaa, 0x1078, 0x14be, 0x007c, 0x1078, 0x1913, ++ 0x1078, 0x14be, 0x007c, 0x1078, 0x1913, 0x1078, 0x1eaa, 0x1078, ++ 0x14be, 0x007c, 0x127e, 0x2091, 0x2300, 0x2079, 0x0200, 0x2071, ++ 0xab80, 0x2069, 0xa600, 0x2009, 0x0004, 0x7912, 0x7817, 0x0004, ++ 0x1078, 0x251f, 0x781b, 0x0002, 0x20e1, 0x8700, 0x127f, 0x007c, ++ 0x127e, 0x2091, 0x2300, 0x781c, 0xa084, 0x0007, 0x0079, 0x2180, ++ 0x21a4, 0x2188, 0x218c, 0x2190, 0x2196, 0x219a, 0x219e, 0x21a2, ++ 0x1078, 0x548e, 0x0078, 0x21a4, 0x1078, 0x54da, 0x0078, 0x21a4, ++ 0x1078, 0x548e, 0x1078, 0x54da, 0x0078, 0x21a4, 0x1078, 0x21a6, ++ 0x0078, 0x21a4, 0x1078, 0x21a6, 0x0078, 0x21a4, 0x1078, 0x21a6, ++ 0x0078, 0x21a4, 0x1078, 0x21a6, 0x127f, 0x007c, 0x007e, 0x017e, ++ 0x027e, 0x1078, 0xa5d2, 0x7930, 0xa184, 0x0003, 0x0040, 0x21c9, ++ 0x2001, 0xa8c0, 0x2004, 0xa005, 0x0040, 0x21c5, 0x2001, 0x0133, ++ 0x2004, 0xa005, 0x1040, 0x1332, 0x0c7e, 0x2001, 0xa8c0, 0x2064, ++ 0x1078, 0x8a01, 0x0c7f, 0x0078, 0x21f2, 0x20e1, 0x9040, 0x0078, ++ 0x21f2, 0xa184, 0x0030, 0x0040, 0x21da, 0x6a00, 0xa286, 0x0003, ++ 0x00c0, 0x21d4, 0x0078, 0x21d6, 0x1078, 0x4224, 0x20e1, 0x9010, ++ 0x0078, 0x21f2, 0xa184, 0x00c0, 0x0040, 0x21ec, 0x0e7e, 0x037e, ++ 0x047e, 0x057e, 0x2071, 0xa8e7, 0x1078, 0x1af4, 0x057f, 0x047f, ++ 0x037f, 0x0e7f, 0x0078, 0x21f2, 0xa184, 0x0300, 0x0040, 0x21f2, ++ 0x20e1, 0x9020, 0x7932, 0x027f, 0x017f, 0x007f, 0x007c, 0x017e, ++ 0x0e7e, 0x0f7e, 0x2071, 0xa600, 0x7128, 0x2001, 0xa890, 0x2102, ++ 0x2001, 0xa898, 0x2102, 0xa182, 0x0211, 0x00c8, 0x220b, 0x2009, ++ 0x0008, 0x0078, 0x2235, 0xa182, 0x0259, 0x00c8, 0x2213, 0x2009, ++ 0x0007, 0x0078, 0x2235, 0xa182, 0x02c1, 0x00c8, 0x221b, 0x2009, ++ 0x0006, 0x0078, 0x2235, 0xa182, 0x0349, 0x00c8, 0x2223, 0x2009, ++ 0x0005, 0x0078, 0x2235, 0xa182, 0x0421, 0x00c8, 0x222b, 0x2009, ++ 0x0004, 0x0078, 0x2235, 0xa182, 0x0581, 0x00c8, 0x2233, 0x2009, ++ 0x0003, 0x0078, 0x2235, 0x2009, 0x0002, 0x2079, 0x0200, 0x7912, ++ 0x7817, 0x0004, 0x1078, 0x251f, 0x0f7f, 0x0e7f, 0x017f, 0x007c, ++ 0x127e, 0x2091, 0x2200, 0x2061, 0x0100, 0x2071, 0xa600, 0x6024, ++ 0x6026, 0x6053, 0x0030, 0x6033, 0x00ef, 0x60e7, 0x0000, 0x60eb, ++ 0x00ef, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, ++ 0x0080, 0x602f, 0x0000, 0x6007, 0x0eaf, 0x600f, 0x00ff, 0x602b, ++ 0x002f, 0x127f, 0x007c, 0x2001, 0xa630, 0x2003, 0x0000, 0x2001, ++ 0xa62f, 0x2003, 0x0001, 0x007c, 0x127e, 0x2091, 0x2200, 0x007e, ++ 0x017e, 0x027e, 0x6124, 0xa184, 0x002c, 0x00c0, 0x227b, 0xa184, ++ 0x0007, 0x0079, 0x2281, 0xa195, 0x0004, 0xa284, 0x0007, 0x0079, ++ 0x2281, 0x22ad, 0x2289, 0x228d, 0x2291, 0x2297, 0x229b, 0x22a1, ++ 0x22a7, 0x1078, 0x5c56, 0x0078, 0x22ad, 0x1078, 0x5d45, 0x0078, ++ 0x22ad, 0x1078, 0x5d45, 0x1078, 0x5c56, 0x0078, 0x22ad, 0x1078, ++ 0x22b2, 0x0078, 0x22ad, 0x1078, 0x5c56, 0x1078, 0x22b2, 0x0078, ++ 0x22ad, 0x1078, 0x5d45, 0x1078, 0x22b2, 0x0078, 0x22ad, 0x1078, ++ 0x5d45, 0x1078, 0x5c56, 0x1078, 0x22b2, 0x027f, 0x017f, 0x007f, ++ 0x127f, 0x007c, 0x6124, 0xd1ac, 0x0040, 0x23ac, 0x017e, 0x047e, ++ 0x0c7e, 0x644c, 0xa486, 0xf0f0, 0x00c0, 0x22c5, 0x2061, 0x0100, ++ 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74c6, 0xa48c, 0xff00, ++ 0x7034, 0xd084, 0x0040, 0x22dd, 0xa186, 0xf800, 0x00c0, 0x22dd, ++ 0x703c, 0xd084, 0x00c0, 0x22dd, 0xc085, 0x703e, 0x037e, 0x2418, ++ 0x2011, 0x8016, 0x1078, 0x361b, 0x037f, 0xa196, 0xff00, 0x0040, ++ 0x231f, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa116, 0x0040, 0x231f, ++ 0x7130, 0xd184, 0x00c0, 0x231f, 0x2011, 0xa653, 0x2214, 0xd2ec, ++ 0x0040, 0x22fa, 0xc18d, 0x7132, 0x2011, 0xa653, 0x2214, 0xd2ac, ++ 0x00c0, 0x231f, 0x6240, 0xa294, 0x0010, 0x0040, 0x2306, 0x6248, ++ 0xa294, 0xff00, 0xa296, 0xff00, 0x0040, 0x231f, 0x7030, 0xd08c, ++ 0x0040, 0x2371, 0x7034, 0xd08c, 0x00c0, 0x2316, 0x2001, 0xa60c, ++ 0x200c, 0xd1ac, 0x00c0, 0x2371, 0xc1ad, 0x2102, 0x037e, 0x73c4, ++ 0x2011, 0x8013, 0x1078, 0x361b, 0x037f, 0x0078, 0x2371, 0x7034, ++ 0xd08c, 0x00c0, 0x232b, 0x2001, 0xa60c, 0x200c, 0xd1ac, 0x00c0, ++ 0x2371, 0xc1ad, 0x2102, 0x037e, 0x73c4, 0x2011, 0x8013, 0x1078, ++ 0x361b, 0x037f, 0x7130, 0xc185, 0x7132, 0x2011, 0xa653, 0x220c, ++ 0xd1a4, 0x0040, 0x2355, 0x017e, 0x2009, 0x0001, 0x2011, 0x0100, ++ 0x1078, 0x5bf1, 0x2019, 0x000e, 0x1078, 0xa195, 0xa484, 0x00ff, ++ 0xa080, 0x29c0, 0x200c, 0xa18c, 0xff00, 0x810f, 0x8127, 0xa006, ++ 0x2009, 0x000e, 0x1078, 0xa21d, 0x017f, 0xd1ac, 0x00c0, 0x2362, ++ 0x017e, 0x2009, 0x0000, 0x2019, 0x0004, 0x1078, 0x284f, 0x017f, ++ 0x0078, 0x2371, 0x157e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x1078, ++ 0x45c4, 0x00c0, 0x236d, 0x1078, 0x42f8, 0x8108, 0x00f0, 0x2367, ++ 0x157f, 0x0c7f, 0x047f, 0x0f7e, 0x2079, 0xa8c4, 0x783c, 0xa086, ++ 0x0000, 0x0040, 0x2383, 0x6027, 0x0004, 0x783f, 0x0000, 0x2079, ++ 0x0140, 0x7803, 0x0000, 0x0f7f, 0x2011, 0x0003, 0x1078, 0x70e0, ++ 0x2011, 0x0002, 0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e, 0x2019, ++ 0x0000, 0x1078, 0x7058, 0x037f, 0x60e3, 0x0000, 0x017f, 0x2001, ++ 0xa600, 0x2014, 0xa296, 0x0004, 0x00c0, 0x23a4, 0xd19c, 0x00c0, ++ 0x23ac, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0xa622, ++ 0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0040, 0x2490, 0x0f7e, ++ 0x2079, 0xa8c4, 0x783c, 0xa086, 0x0001, 0x00c0, 0x23d0, 0x017e, ++ 0x6027, 0x0004, 0x783f, 0x0000, 0x2079, 0x0140, 0x7803, 0x1000, ++ 0x7803, 0x0000, 0x2079, 0xa8b1, 0x7807, 0x0000, 0x7833, 0x0000, ++ 0x1078, 0x62d1, 0x1078, 0x639b, 0x017f, 0x0f7f, 0x0078, 0x2490, ++ 0x0f7f, 0x017e, 0x3900, 0xa082, 0xa9e3, 0x00c8, 0x23db, 0x017e, ++ 0x1078, 0x747a, 0x017f, 0x6220, 0xd2b4, 0x0040, 0x2446, 0x1078, ++ 0x5acb, 0x1078, 0x6e0f, 0x6027, 0x0004, 0x0f7e, 0x2019, 0xa8ba, ++ 0x2304, 0xa07d, 0x0040, 0x241c, 0x7804, 0xa086, 0x0032, 0x00c0, ++ 0x241c, 0x0d7e, 0x0c7e, 0x0e7e, 0x2069, 0x0140, 0x618c, 0x6288, ++ 0x7818, 0x608e, 0x7808, 0x608a, 0x6043, 0x0002, 0x2001, 0x0003, ++ 0x8001, 0x00c0, 0x2400, 0x6043, 0x0000, 0x6803, 0x1000, 0x6803, ++ 0x0000, 0x618e, 0x628a, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x7810, ++ 0x2070, 0x7037, 0x0103, 0x2f60, 0x1078, 0x772d, 0x0e7f, 0x0c7f, ++ 0x0d7f, 0x0f7f, 0x017f, 0x007c, 0x0f7f, 0x0d7e, 0x2069, 0x0140, ++ 0x6804, 0xa084, 0x4000, 0x0040, 0x2429, 0x6803, 0x1000, 0x6803, ++ 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0xa8b1, 0x6028, 0xa09a, 0x00c8, ++ 0x00c8, 0x2439, 0x8000, 0x602a, 0x0c7f, 0x1078, 0x6e01, 0x0078, ++ 0x248f, 0x2019, 0xa8ba, 0x2304, 0xa065, 0x0040, 0x2443, 0x2009, ++ 0x0027, 0x1078, 0x775c, 0x0c7f, 0x0078, 0x248f, 0xd2bc, 0x0040, ++ 0x248f, 0x1078, 0x5ad8, 0x6017, 0x0010, 0x6027, 0x0004, 0x0d7e, ++ 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0040, 0x245b, 0x6803, ++ 0x1000, 0x6803, 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0xa8b1, 0x6044, ++ 0xa09a, 0x00c8, 0x00c8, 0x247e, 0x8000, 0x6046, 0x603c, 0x0c7f, ++ 0xa005, 0x0040, 0x248f, 0x2009, 0x07d0, 0x1078, 0x5ad0, 0xa080, ++ 0x0007, 0x2004, 0xa086, 0x0006, 0x00c0, 0x247a, 0x6017, 0x0012, ++ 0x0078, 0x248f, 0x6017, 0x0016, 0x0078, 0x248f, 0x037e, 0x2019, ++ 0x0001, 0x1078, 0x7058, 0x037f, 0x2019, 0xa8c0, 0x2304, 0xa065, ++ 0x0040, 0x248e, 0x2009, 0x004f, 0x1078, 0x775c, 0x0c7f, 0x017f, ++ 0xd19c, 0x0040, 0x24e4, 0x7034, 0xd0ac, 0x00c0, 0x24c1, 0x017e, ++ 0x157e, 0x6027, 0x0008, 0x602f, 0x0020, 0x20a9, 0x000a, 0x00f0, ++ 0x249f, 0x602f, 0x0000, 0x6150, 0xa185, 0x1400, 0x6052, 0x20a9, ++ 0x0320, 0x00e0, 0x24a9, 0x2091, 0x6000, 0x6020, 0xd09c, 0x00c0, ++ 0x24b8, 0x157f, 0x6152, 0x017f, 0x6027, 0x0008, 0x0078, 0x24e4, ++ 0x1078, 0x2577, 0x00f0, 0x24a9, 0x157f, 0x6152, 0x017f, 0x6027, ++ 0x0008, 0x017e, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x1078, ++ 0x70e0, 0x2011, 0x0002, 0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e, ++ 0x2019, 0x0000, 0x1078, 0x7058, 0x037f, 0x60e3, 0x0000, 0x1078, ++ 0xa5ad, 0x1078, 0xa5cb, 0x2001, 0xa600, 0x2003, 0x0004, 0x6027, ++ 0x0008, 0x1078, 0x1246, 0x017f, 0xa18c, 0xffd0, 0x6126, 0x007c, ++ 0x007e, 0x017e, 0x027e, 0x0e7e, 0x0f7e, 0x127e, 0x2091, 0x8000, ++ 0x2071, 0xa600, 0x71bc, 0x70be, 0xa116, 0x0040, 0x2518, 0x81ff, ++ 0x0040, 0x2500, 0x2011, 0x8011, 0x1078, 0x361b, 0x0078, 0x2518, ++ 0x2011, 0x8012, 0x1078, 0x361b, 0x2001, 0xa672, 0x2004, 0xd0fc, ++ 0x00c0, 0x2518, 0x037e, 0x0c7e, 0x1078, 0x6f9f, 0x2061, 0x0100, ++ 0x2019, 0x0028, 0x2009, 0x0000, 0x1078, 0x284f, 0x0c7f, 0x037f, ++ 0x127f, 0x0f7f, 0x0e7f, 0x027f, 0x017f, 0x007f, 0x007c, 0x0c7e, ++ 0x0f7e, 0x007e, 0x027e, 0x2061, 0x0100, 0xa190, 0x253b, 0x2204, ++ 0x60f2, 0x2011, 0x2548, 0x6000, 0xa082, 0x0003, 0x00c8, 0x2534, ++ 0x2001, 0x00ff, 0x0078, 0x2535, 0x2204, 0x60ee, 0x027f, 0x007f, ++ 0x0f7f, 0x0c7f, 0x007c, 0x0840, 0x0840, 0x0840, 0x0580, 0x0420, ++ 0x0348, 0x02c0, 0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8, ++ 0x0140, 0x00f8, 0x00d0, 0x00b0, 0x00a0, 0x2028, 0xa18c, 0x00ff, ++ 0x2130, 0xa094, 0xff00, 0x00c0, 0x2558, 0x81ff, 0x0040, 0x255c, ++ 0x1078, 0x5761, 0x0078, 0x2563, 0xa080, 0x29c0, 0x200c, 0xa18c, ++ 0xff00, 0x810f, 0xa006, 0x007c, 0xa080, 0x29c0, 0x200c, 0xa18c, ++ 0x00ff, 0x007c, 0x0c7e, 0x2061, 0xa600, 0x6030, 0x0040, 0x2573, ++ 0xc09d, 0x0078, 0x2574, 0xc09c, 0x6032, 0x0c7f, 0x007c, 0x007e, ++ 0x157e, 0x0f7e, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd08c, ++ 0x00c0, 0x2584, 0x00f0, 0x257e, 0x0f7f, 0x157f, 0x007f, 0x007c, ++ 0x0c7e, 0x007e, 0x2061, 0x0100, 0x6030, 0x007e, 0x6048, 0x007e, ++ 0x60e4, 0x007e, 0x60e8, 0x007e, 0x6050, 0x007e, 0x60f0, 0x007e, ++ 0x60ec, 0x007e, 0x600c, 0x007e, 0x6004, 0x007e, 0x6028, 0x007e, ++ 0x60e0, 0x007e, 0x602f, 0x0100, 0x602f, 0x0000, 0x0005, 0x0005, ++ 0x0005, 0x0005, 0x602f, 0x0040, 0x602f, 0x0000, 0x007f, 0x60e2, ++ 0x007f, 0x602a, 0x007f, 0x6006, 0x007f, 0x600e, 0x007f, 0x60ee, ++ 0x007f, 0x60f2, 0x007f, 0x6052, 0x007f, 0x60ea, 0x007f, 0x60e6, ++ 0x007f, 0x604a, 0x007f, 0x6032, 0x007f, 0x0c7f, 0x007c, 0x25e7, ++ 0x25eb, 0x25ef, 0x25f5, 0x25fb, 0x2601, 0x2607, 0x260f, 0x2617, ++ 0x261d, 0x2623, 0x262b, 0x2633, 0x263b, 0x2643, 0x264d, 0x2657, ++ 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, ++ 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x107e, ++ 0x007e, 0x0078, 0x2670, 0x107e, 0x007e, 0x0078, 0x2670, 0x107e, ++ 0x007e, 0x1078, 0x226c, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, ++ 0x226c, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x0078, ++ 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e, ++ 0x007e, 0x1078, 0x226c, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e, ++ 0x007e, 0x1078, 0x226c, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e, ++ 0x007e, 0x1078, 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, ++ 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078, ++ 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078, ++ 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x1078, ++ 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x1078, ++ 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078, ++ 0x2133, 0x1078, 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, ++ 0x226c, 0x1078, 0x2133, 0x1078, 0x2178, 0x0078, 0x2670, 0x0005, ++ 0x0078, 0x2657, 0xb084, 0x003c, 0x8004, 0x8004, 0x0079, 0x2660, ++ 0x2670, 0x25ed, 0x25f1, 0x25f7, 0x25fd, 0x2603, 0x2609, 0x2611, ++ 0x2619, 0x261f, 0x2625, 0x262d, 0x2635, 0x263d, 0x2645, 0x264f, ++ 0x0008, 0x265a, 0x007f, 0x107f, 0x2091, 0x8001, 0x007c, 0x0c7e, ++ 0x027e, 0x047e, 0x2021, 0x0000, 0x1078, 0x4967, 0x00c0, 0x2772, ++ 0x70cc, 0xd09c, 0x0040, 0x268e, 0xd084, 0x00c0, 0x268e, 0xd0bc, ++ 0x00c0, 0x2772, 0x1078, 0x2776, 0x0078, 0x2772, 0xd0cc, 0x00c0, ++ 0x2772, 0xd094, 0x0040, 0x2698, 0x7097, 0xffff, 0x0078, 0x2772, ++ 0x2001, 0x010c, 0x203c, 0x7284, 0xd284, 0x0040, 0x2701, 0xd28c, ++ 0x00c0, 0x2701, 0x037e, 0x7394, 0xa38e, 0xffff, 0x0040, 0x26ab, ++ 0x83ff, 0x00c0, 0x26ad, 0x2019, 0x0001, 0x8314, 0xa2e0, 0xacc0, ++ 0x2c04, 0xa38c, 0x0001, 0x0040, 0x26ba, 0xa084, 0xff00, 0x8007, ++ 0x0078, 0x26bc, 0xa084, 0x00ff, 0xa70e, 0x0040, 0x26f6, 0xa08e, ++ 0x0000, 0x0040, 0x26f6, 0xa08e, 0x00ff, 0x00c0, 0x26d3, 0x7230, ++ 0xd284, 0x00c0, 0x26fc, 0x7284, 0xc28d, 0x7286, 0x7097, 0xffff, ++ 0x037f, 0x0078, 0x2701, 0x2009, 0x0000, 0x1078, 0x254d, 0x1078, ++ 0x455c, 0x00c0, 0x26f9, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, ++ 0x00c0, 0x26f0, 0x7030, 0xd08c, 0x0040, 0x26ea, 0x6000, 0xd0bc, ++ 0x0040, 0x26f0, 0x1078, 0x278c, 0x0040, 0x26f9, 0x0078, 0x26f6, ++ 0x1078, 0x28c4, 0x1078, 0x27b9, 0x0040, 0x26f9, 0x8318, 0x0078, ++ 0x26ad, 0x7396, 0x0078, 0x26fe, 0x7097, 0xffff, 0x037f, 0x0078, ++ 0x2772, 0xa780, 0x29c0, 0x203c, 0xa7bc, 0xff00, 0x873f, 0x2041, ++ 0x007e, 0x7094, 0xa096, 0xffff, 0x00c0, 0x2713, 0x2009, 0x0000, ++ 0x28a8, 0x0078, 0x271f, 0xa812, 0x0048, 0x271b, 0x2008, 0xa802, ++ 0x20a8, 0x0078, 0x271f, 0x7097, 0xffff, 0x0078, 0x2772, 0x2700, ++ 0x157e, 0x017e, 0xa106, 0x0040, 0x2766, 0xc484, 0x1078, 0x45c4, ++ 0x0040, 0x2730, 0x1078, 0x455c, 0x00c0, 0x276f, 0x0078, 0x2731, ++ 0xc485, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2740, ++ 0x7030, 0xd08c, 0x0040, 0x275e, 0x6000, 0xd0bc, 0x00c0, 0x275e, ++ 0x7284, 0xd28c, 0x0040, 0x2756, 0x6004, 0xa084, 0x00ff, 0xa082, ++ 0x0006, 0x0048, 0x2766, 0xd484, 0x00c0, 0x2752, 0x1078, 0x457f, ++ 0x0078, 0x2754, 0x1078, 0x298e, 0x0078, 0x2766, 0x1078, 0x28c4, ++ 0x1078, 0x27b9, 0x0040, 0x276f, 0x0078, 0x2766, 0x1078, 0x2959, ++ 0x0040, 0x2766, 0x1078, 0x278c, 0x0040, 0x276f, 0x017f, 0x8108, ++ 0x157f, 0x00f0, 0x271f, 0x7097, 0xffff, 0x0078, 0x2772, 0x017f, ++ 0x157f, 0x7196, 0x047f, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x017e, ++ 0x7097, 0x0001, 0x2009, 0x007e, 0x1078, 0x455c, 0x00c0, 0x2789, ++ 0x1078, 0x28c4, 0x1078, 0x27b9, 0x0040, 0x2789, 0x70cc, 0xc0bd, ++ 0x70ce, 0x017f, 0x0c7f, 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e, ++ 0x2c68, 0x2001, 0xa657, 0x2004, 0xa084, 0x00ff, 0x6842, 0x1078, ++ 0x76c7, 0x0040, 0x27b4, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, ++ 0x0000, 0x1078, 0x44ee, 0x2001, 0x0000, 0x1078, 0x4502, 0x127e, ++ 0x2091, 0x8000, 0x7090, 0x8000, 0x7092, 0x127f, 0x2009, 0x0004, ++ 0x1078, 0x775c, 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, ++ 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x2001, 0xa657, ++ 0x2004, 0xa084, 0x00ff, 0x6842, 0x1078, 0x9187, 0x0040, 0x27f2, ++ 0x2d00, 0x601a, 0x6800, 0xc0c4, 0x6802, 0x68a0, 0xa086, 0x007e, ++ 0x0040, 0x27db, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, ++ 0x27db, 0x1078, 0x2880, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, ++ 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x127e, 0x2091, 0x8000, ++ 0x7090, 0x8000, 0x7092, 0x127f, 0x2009, 0x0002, 0x1078, 0x775c, ++ 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e, ++ 0x027e, 0x2009, 0x0080, 0x1078, 0x455c, 0x00c0, 0x2805, 0x1078, ++ 0x2808, 0x0040, 0x2805, 0x70d3, 0xffff, 0x027f, 0x0c7f, 0x007c, ++ 0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x76c7, 0x0040, ++ 0x282a, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, ++ 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x127e, 0x2091, 0x8000, ++ 0x70d4, 0x8000, 0x70d6, 0x127f, 0x2009, 0x0002, 0x1078, 0x775c, ++ 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e, ++ 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2009, 0x007f, 0x1078, 0x455c, ++ 0x00c0, 0x284b, 0x2c68, 0x1078, 0x76c7, 0x0040, 0x284b, 0x2d00, ++ 0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x2009, 0x0022, 0x1078, ++ 0x775c, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x0c7f, 0x007c, 0x0e7e, ++ 0x0c7e, 0x067e, 0x037e, 0x027e, 0x1078, 0x5f0e, 0x1078, 0x5eae, ++ 0x1078, 0x8068, 0x2130, 0x81ff, 0x0040, 0x2864, 0x20a9, 0x007e, ++ 0x2009, 0x0000, 0x0078, 0x2868, 0x20a9, 0x007f, 0x2009, 0x0000, ++ 0x017e, 0x1078, 0x45c4, 0x00c0, 0x2871, 0x1078, 0x47e9, 0x1078, ++ 0x42f8, 0x017f, 0x8108, 0x00f0, 0x2868, 0x86ff, 0x00c0, 0x287a, ++ 0x1078, 0x119b, 0x027f, 0x037f, 0x067f, 0x0c7f, 0x0e7f, 0x007c, ++ 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x6218, 0x2270, 0x72a0, ++ 0x027e, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, ++ 0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f8b, 0x077f, 0x017f, 0x2e60, ++ 0x1078, 0x47e9, 0x6210, 0x6314, 0x1078, 0x42f8, 0x6212, 0x6316, ++ 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x007e, ++ 0x6018, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x00c0, 0x28ba, 0x2071, ++ 0xa600, 0x7090, 0xa005, 0x0040, 0x28b7, 0x8001, 0x7092, 0x007f, ++ 0x0e7f, 0x007c, 0x2071, 0xa600, 0x70d4, 0xa005, 0x0040, 0x28b7, ++ 0x8001, 0x70d6, 0x0078, 0x28b7, 0x6000, 0xc08c, 0x6002, 0x007c, ++ 0x0f7e, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x157e, 0x2178, ++ 0x81ff, 0x00c0, 0x28d7, 0x20a9, 0x0001, 0x0078, 0x28f2, 0x2001, ++ 0xa653, 0x2004, 0xd0c4, 0x0040, 0x28ee, 0xd0a4, 0x0040, 0x28ee, ++ 0x047e, 0x6018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, ++ 0xa006, 0x2009, 0x002d, 0x1078, 0xa21d, 0x047f, 0x20a9, 0x00ff, ++ 0x2011, 0x0000, 0x027e, 0xa28e, 0x007e, 0x0040, 0x2936, 0xa28e, ++ 0x007f, 0x0040, 0x2936, 0xa28e, 0x0080, 0x0040, 0x2936, 0xa288, ++ 0xa735, 0x210c, 0x81ff, 0x0040, 0x2936, 0x8fff, 0x1040, 0x2942, ++ 0x0c7e, 0x2160, 0x2001, 0x0001, 0x1078, 0x4972, 0x0c7f, 0x2019, ++ 0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, ++ 0x0c7e, 0x027e, 0x2160, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, ++ 0x00c0, 0x2926, 0x6007, 0x0404, 0x0078, 0x292b, 0x2001, 0x0004, ++ 0x8007, 0xa215, 0x6206, 0x027f, 0x0c7f, 0x017e, 0x2c08, 0x1078, ++ 0x9f8b, 0x017f, 0x077f, 0x2160, 0x1078, 0x47e9, 0x027f, 0x8210, ++ 0x00f0, 0x28f2, 0x157f, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, ++ 0x0f7f, 0x007c, 0x047e, 0x027e, 0x017e, 0x2001, 0xa653, 0x2004, ++ 0xd0c4, 0x0040, 0x2955, 0xd0a4, 0x0040, 0x2955, 0xa006, 0x2220, ++ 0x8427, 0x2009, 0x0029, 0x1078, 0xa21d, 0x017f, 0x027f, 0x047f, ++ 0x007c, 0x017e, 0x027e, 0x037e, 0x0c7e, 0x7284, 0x82ff, 0x0040, ++ 0x2987, 0xa290, 0xa653, 0x2214, 0xd2ac, 0x00c0, 0x2987, 0x2100, ++ 0x1078, 0x2564, 0x81ff, 0x0040, 0x2989, 0x2019, 0x0001, 0x8314, ++ 0xa2e0, 0xacc0, 0x2c04, 0xd384, 0x0040, 0x297b, 0xa084, 0xff00, ++ 0x8007, 0x0078, 0x297d, 0xa084, 0x00ff, 0xa116, 0x0040, 0x2989, ++ 0xa096, 0x00ff, 0x0040, 0x2987, 0x8318, 0x0078, 0x296f, 0xa085, ++ 0x0001, 0x0c7f, 0x037f, 0x027f, 0x017f, 0x007c, 0x017e, 0x0c7e, ++ 0x127e, 0x2091, 0x8000, 0x017e, 0x027e, 0x037e, 0x2110, 0x027e, ++ 0x2019, 0x0029, 0x1078, 0x73d0, 0x027f, 0x1078, 0xa4f1, 0x037f, ++ 0x027f, 0x017f, 0xa180, 0xa735, 0x2004, 0xa065, 0x0040, 0x29b7, ++ 0x017e, 0x0c7e, 0x1078, 0x9187, 0x017f, 0x1040, 0x1332, 0x611a, ++ 0x1078, 0x2880, 0x1078, 0x772d, 0x017f, 0x1078, 0x457f, 0x127f, ++ 0x0c7f, 0x017f, 0x007c, 0x2001, 0xa633, 0x2004, 0xd0cc, 0x007c, ++ 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, ++ 0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, ++ 0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, ++ 0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, ++ 0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, ++ 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, ++ 0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, ++ 0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, ++ 0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, ++ 0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, ++ 0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, ++ 0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, ++ 0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, ++ 0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, ++ 0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, ++ 0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, ++ 0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, ++ 0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, ++ 0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, ++ 0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, ++ 0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, ++ 0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, ++ 0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, ++ 0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, ++ 0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, ++ 0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, ++ 0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, ++ 0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, ++ 0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, ++ 0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, ++ 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, ++ 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, ++ 0x2071, 0xa682, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a, ++ 0x703e, 0x7033, 0xa692, 0x7037, 0xa692, 0x7007, 0x0001, 0x2061, ++ 0xa6d2, 0x6003, 0x0002, 0x007c, 0x0090, 0x2ae7, 0x0068, 0x2ae7, ++ 0x2071, 0xa682, 0x2b78, 0x7818, 0xd084, 0x00c0, 0x2ae7, 0x2a60, ++ 0x7820, 0xa08e, 0x0069, 0x00c0, 0x2bd7, 0x0079, 0x2b6b, 0x007c, ++ 0x2071, 0xa682, 0x7004, 0x0079, 0x2aed, 0x2af1, 0x2af2, 0x2afc, ++ 0x2b0e, 0x007c, 0x0090, 0x2afb, 0x0068, 0x2afb, 0x2b78, 0x7818, ++ 0xd084, 0x0040, 0x2b1a, 0x007c, 0x2b78, 0x2061, 0xa6d2, 0x6008, ++ 0xa08e, 0x0100, 0x0040, 0x2b09, 0xa086, 0x0200, 0x0040, 0x2bcf, ++ 0x007c, 0x7014, 0x2068, 0x2a60, 0x7018, 0x007a, 0x7010, 0x2068, ++ 0x6834, 0xa086, 0x0103, 0x0040, 0x2b16, 0x007c, 0x2a60, 0x2b78, ++ 0x7018, 0x007a, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x00c8, 0x2b23, ++ 0x61bc, 0x0079, 0x2b2b, 0x2100, 0xa08a, 0x003f, 0x00c8, 0x2bcb, ++ 0x61bc, 0x0079, 0x2b6b, 0x2bad, 0x2bdf, 0x2be7, 0x2beb, 0x2bf3, ++ 0x2bf9, 0x2bfd, 0x2c09, 0x2c0d, 0x2c17, 0x2c1b, 0x2bcb, 0x2bcb, ++ 0x2bcb, 0x2c1f, 0x2bcb, 0x2c2f, 0x2c46, 0x2c5d, 0x2cdd, 0x2ce2, ++ 0x2d0f, 0x2d69, 0x2d7a, 0x2d98, 0x2dd9, 0x2de3, 0x2df0, 0x2e03, ++ 0x2e22, 0x2e2b, 0x2e68, 0x2e6e, 0x2bcb, 0x2e8a, 0x2bcb, 0x2bcb, ++ 0x2bcb, 0x2bcb, 0x2bcb, 0x2e91, 0x2e9b, 0x2bcb, 0x2bcb, 0x2bcb, ++ 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2ea3, 0x2bcb, 0x2bcb, ++ 0x2bcb, 0x2bcb, 0x2bcb, 0x2eb5, 0x2ece, 0x2bcb, 0x2bcb, 0x2bcb, ++ 0x2bcb, 0x2bcb, 0x2bcb, 0x2ee0, 0x2f37, 0x2f95, 0x2fa9, 0x2bcb, ++ 0x2bcb, 0x2bcb, 0x398e, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, ++ 0x2bcb, 0x2bcb, 0x2bcb, 0x2c17, 0x2c1b, 0x2fc0, 0x2bcb, 0x2fcd, ++ 0x3a26, 0x3a83, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, ++ 0x2bcb, 0x2bcb, 0x2bcb, 0x301a, 0x314f, 0x316b, 0x3177, 0x31da, ++ 0x3233, 0x323e, 0x327d, 0x328c, 0x329b, 0x329e, 0x2fd1, 0x32c2, ++ 0x331e, 0x332b, 0x343c, 0x356f, 0x3599, 0x36a6, 0x2bcb, 0x36b6, ++ 0x36f0, 0x37bf, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x3827, 0x3843, ++ 0x38bd, 0x3977, 0x713c, 0x0078, 0x2bad, 0x2021, 0x4000, 0x1078, ++ 0x35f5, 0x127e, 0x2091, 0x8000, 0x0068, 0x2bba, 0x7818, 0xd084, ++ 0x0040, 0x2bbd, 0x127f, 0x0078, 0x2bb1, 0x7c22, 0x7926, 0x7a2a, ++ 0x7b2e, 0x781b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x2091, ++ 0x5000, 0x127f, 0x007c, 0x2021, 0x4001, 0x0078, 0x2baf, 0x2021, ++ 0x4002, 0x0078, 0x2baf, 0x2021, 0x4003, 0x0078, 0x2baf, 0x2021, ++ 0x4005, 0x0078, 0x2baf, 0x2021, 0x4006, 0x0078, 0x2baf, 0xa02e, ++ 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0078, 0x3604, 0x7823, ++ 0x0004, 0x7824, 0x007a, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, ++ 0x7930, 0x0078, 0x3608, 0x7924, 0x7828, 0x2114, 0x200a, 0x0078, ++ 0x2bad, 0x7924, 0x2114, 0x0078, 0x2bad, 0x2099, 0x0009, 0x20a1, ++ 0x0009, 0x20a9, 0x0007, 0x53a3, 0x7924, 0x7a28, 0x7b2c, 0x0078, ++ 0x2bad, 0x7824, 0x2060, 0x0078, 0x2c21, 0x2009, 0x0001, 0x2011, ++ 0x0013, 0x2019, 0x0018, 0x783b, 0x0017, 0x0078, 0x2bad, 0x7d38, ++ 0x7c3c, 0x0078, 0x2be1, 0x7d38, 0x7c3c, 0x0078, 0x2bed, 0x2061, ++ 0x1000, 0x610c, 0xa006, 0x2c14, 0xa200, 0x8c60, 0x8109, 0x00c0, ++ 0x2c23, 0x2010, 0xa005, 0x0040, 0x2bad, 0x0078, 0x2bd3, 0x2069, ++ 0xa652, 0x7824, 0x7930, 0xa11a, 0x00c8, 0x2bdb, 0x8019, 0x0040, ++ 0x2bdb, 0x684a, 0x6942, 0x782c, 0x6852, 0x7828, 0x6856, 0xa006, ++ 0x685a, 0x685e, 0x1078, 0x4eae, 0x0078, 0x2bad, 0x2069, 0xa652, ++ 0x7824, 0x7934, 0xa11a, 0x00c8, 0x2bdb, 0x8019, 0x0040, 0x2bdb, ++ 0x684e, 0x6946, 0x782c, 0x6862, 0x7828, 0x6866, 0xa006, 0x686a, ++ 0x686e, 0x1078, 0x4a3e, 0x0078, 0x2bad, 0xa02e, 0x2520, 0x81ff, ++ 0x00c0, 0x2bd7, 0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005, 0x20a1, ++ 0xa689, 0x41a1, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x2009, 0x0020, ++ 0x1078, 0x3604, 0x701b, 0x2c75, 0x007c, 0x6834, 0x2008, 0xa084, ++ 0x00ff, 0xa096, 0x0011, 0x0040, 0x2c85, 0xa096, 0x0019, 0x0040, ++ 0x2c85, 0xa096, 0x0015, 0x00c0, 0x2bd7, 0x810f, 0xa18c, 0x00ff, ++ 0x0040, 0x2bd7, 0x710e, 0x700c, 0x8001, 0x0040, 0x2cb6, 0x700e, ++ 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x2009, 0x0020, 0x2061, 0xa6d2, ++ 0x6224, 0x6328, 0x642c, 0x6530, 0xa290, 0x0040, 0xa399, 0x0000, ++ 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x1078, 0x3604, 0x701b, 0x2ca9, ++ 0x007c, 0x6834, 0xa084, 0x00ff, 0xa096, 0x0002, 0x0040, 0x2cb4, ++ 0xa096, 0x000a, 0x00c0, 0x2bd7, 0x0078, 0x2c8b, 0x7010, 0x2068, ++ 0x6838, 0xc0fd, 0x683a, 0x1078, 0x4431, 0x00c0, 0x2cc4, 0x7007, ++ 0x0003, 0x701b, 0x2cc6, 0x007c, 0x1078, 0x4b51, 0x127e, 0x2091, ++ 0x8000, 0x20a9, 0x0005, 0x2099, 0xa689, 0x530a, 0x2100, 0xa210, ++ 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d, ++ 0x2009, 0x0020, 0x127f, 0x0078, 0x3608, 0x61a4, 0x7824, 0x60a6, ++ 0x0078, 0x2bad, 0x2091, 0x8000, 0x7823, 0x4000, 0x7827, 0x4953, ++ 0x782b, 0x5020, 0x782f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7832, ++ 0x3f00, 0x7836, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c, ++ 0x8007, 0xa205, 0x783a, 0x2009, 0x04fd, 0x2104, 0x783e, 0x781b, ++ 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2071, 0x0010, 0x20c1, ++ 0x00f0, 0xa08a, 0x0003, 0x00c8, 0x0427, 0x0078, 0x0423, 0x81ff, ++ 0x00c0, 0x2bd7, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x45c4, ++ 0x00c0, 0x2bdb, 0x7e38, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048, ++ 0x2d23, 0x0078, 0x2bdb, 0x7c28, 0x7d2c, 0x1078, 0x47a4, 0xd28c, ++ 0x00c0, 0x2d2e, 0x1078, 0x4736, 0x0078, 0x2d30, 0x1078, 0x4772, ++ 0x00c0, 0x2d5a, 0x2061, 0xad00, 0x127e, 0x2091, 0x8000, 0x6000, ++ 0xa086, 0x0000, 0x0040, 0x2d48, 0x6010, 0xa06d, 0x0040, 0x2d48, ++ 0x683c, 0xa406, 0x00c0, 0x2d48, 0x6840, 0xa506, 0x0040, 0x2d53, ++ 0x127f, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, 0xac02, 0x00c8, ++ 0x2bd7, 0x0078, 0x2d34, 0x1078, 0x8a01, 0x127f, 0x0040, 0x2bd7, ++ 0x0078, 0x2bad, 0xa00e, 0x2001, 0x0005, 0x1078, 0x4b51, 0x127e, ++ 0x2091, 0x8000, 0x1078, 0x8f85, 0x1078, 0x4a73, 0x127f, 0x0078, ++ 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, 0x0040, 0x2bdb, ++ 0x1078, 0x4673, 0x0040, 0x2bd7, 0x1078, 0x47b2, 0x0040, 0x2bd7, ++ 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, ++ 0x2bdb, 0x1078, 0x482f, 0x0040, 0x2bd7, 0x2019, 0x0005, 0x1078, ++ 0x47d3, 0x0040, 0x2bd7, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb, ++ 0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x5a52, 0x0078, 0x2bad, ++ 0x127e, 0x2091, 0x8000, 0x81ff, 0x0040, 0x2da2, 0x2009, 0x0001, ++ 0x0078, 0x2dd3, 0x2029, 0x00ff, 0x6450, 0x2400, 0xa506, 0x0040, ++ 0x2dcd, 0x2508, 0x1078, 0x45c4, 0x00c0, 0x2dcd, 0x1078, 0x482f, ++ 0x00c0, 0x2db8, 0x2009, 0x0002, 0x62ac, 0x2518, 0x0078, 0x2dd3, ++ 0x2019, 0x0004, 0x1078, 0x47d3, 0x00c0, 0x2dc2, 0x2009, 0x0006, ++ 0x0078, 0x2dd3, 0x7824, 0xa08a, 0x1000, 0x00c8, 0x2dd6, 0x8003, ++ 0x800b, 0x810b, 0xa108, 0x1078, 0x5a52, 0x8529, 0x00c8, 0x2da5, ++ 0x127f, 0x0078, 0x2bad, 0x127f, 0x0078, 0x2bd7, 0x127f, 0x0078, ++ 0x2bdb, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x46e7, 0x1078, ++ 0x47a4, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, ++ 0x0040, 0x2bdb, 0x1078, 0x46d6, 0x1078, 0x47a4, 0x0078, 0x2bad, ++ 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, ++ 0x4775, 0x0040, 0x2bd7, 0x1078, 0x4484, 0x1078, 0x472f, 0x1078, ++ 0x47a4, 0x0078, 0x2bad, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, ++ 0x4673, 0x0040, 0x2bd7, 0x62a0, 0x2019, 0x0005, 0x0c7e, 0x1078, ++ 0x47e9, 0x0c7f, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, ++ 0x5e0a, 0x2009, 0x0000, 0x1078, 0x9f8b, 0x077f, 0x1078, 0x47a4, ++ 0x0078, 0x2bad, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x47a4, ++ 0x2208, 0x0078, 0x2bad, 0x157e, 0x0d7e, 0x0e7e, 0x2069, 0xa714, ++ 0x6810, 0x6914, 0xa10a, 0x00c8, 0x2e37, 0x2009, 0x0000, 0x6816, ++ 0x2011, 0x0000, 0x2019, 0x0000, 0x20a9, 0x00ff, 0x2069, 0xa735, ++ 0x2d04, 0xa075, 0x0040, 0x2e4c, 0x704c, 0x1078, 0x2e56, 0xa210, ++ 0x7080, 0x1078, 0x2e56, 0xa318, 0x8d68, 0x00f0, 0x2e40, 0x2300, ++ 0xa218, 0x0e7f, 0x0d7f, 0x157f, 0x0078, 0x2bad, 0x0f7e, 0x017e, ++ 0xa07d, 0x0040, 0x2e65, 0x2001, 0x0000, 0x8000, 0x2f0c, 0x81ff, ++ 0x0040, 0x2e65, 0x2178, 0x0078, 0x2e5d, 0x017f, 0x0f7f, 0x007c, ++ 0x2069, 0xa714, 0x6910, 0x62a8, 0x0078, 0x2bad, 0x81ff, 0x00c0, ++ 0x2bd7, 0x6150, 0xa190, 0x29c0, 0x2214, 0xa294, 0x00ff, 0x6070, ++ 0xa084, 0xff00, 0xa215, 0x636c, 0x67cc, 0xd79c, 0x0040, 0x2e84, ++ 0x2031, 0x0001, 0x0078, 0x2e86, 0x2031, 0x0000, 0x7e3a, 0x7f3e, ++ 0x0078, 0x2bad, 0x6140, 0x6244, 0x2019, 0xa8a2, 0x231c, 0x0078, ++ 0x2bad, 0x127e, 0x2091, 0x8000, 0x6134, 0x6338, 0xa006, 0x2010, ++ 0x127f, 0x0078, 0x2bad, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x6244, ++ 0x6338, 0x0078, 0x2bad, 0x6140, 0x6244, 0x7824, 0x6042, 0x7b28, ++ 0x6346, 0x2069, 0xa652, 0x831f, 0xa305, 0x6816, 0x782c, 0x2069, ++ 0xa8a2, 0x2d1c, 0x206a, 0x0078, 0x2bad, 0x017e, 0x127e, 0x2091, ++ 0x8000, 0x7824, 0x6036, 0xd094, 0x0040, 0x2ec8, 0x7828, 0xa085, ++ 0x0001, 0x2009, 0xa8ab, 0x200a, 0x2001, 0xffff, 0x1078, 0x5ae6, ++ 0x782c, 0x603a, 0x127f, 0x017f, 0x0078, 0x2bad, 0x1078, 0x35e4, ++ 0x0040, 0x2bdb, 0x7828, 0xa00d, 0x0040, 0x2bdb, 0x782c, 0xa005, ++ 0x0040, 0x2bdb, 0x6244, 0x6146, 0x6338, 0x603a, 0x0078, 0x2bad, ++ 0x2001, 0xa600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x0c7e, ++ 0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff, ++ 0x00c0, 0x2ef7, 0x6030, 0xa085, 0xff00, 0x0078, 0x2f06, 0xa182, ++ 0x007f, 0x00c8, 0x2f30, 0xa188, 0x29c0, 0x210c, 0xa18c, 0x00ff, ++ 0x6030, 0xa116, 0x0040, 0x2f30, 0x810f, 0xa105, 0x127e, 0x2091, ++ 0x8000, 0x007e, 0x1078, 0x76c7, 0x007f, 0x0040, 0x2f2c, 0x601a, ++ 0x600b, 0xbc09, 0x601f, 0x0001, 0x1078, 0x35ba, 0x0040, 0x2f33, ++ 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, ++ 0x683a, 0x701b, 0x2f8e, 0x2d00, 0x6012, 0x2009, 0x0032, 0x1078, ++ 0x775c, 0x127f, 0x0c7f, 0x007c, 0x127f, 0x0c7f, 0x0078, 0x2bd7, ++ 0x0c7f, 0x0078, 0x2bdb, 0x1078, 0x772d, 0x0078, 0x2f2c, 0x2001, ++ 0xa600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x0c7e, 0x2061, ++ 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff, 0x00c0, ++ 0x2f4e, 0x6030, 0xa085, 0xff00, 0x0078, 0x2f5d, 0xa182, 0x007f, ++ 0x00c8, 0x2f87, 0xa188, 0x29c0, 0x210c, 0xa18c, 0x00ff, 0x6030, ++ 0xa116, 0x0040, 0x2f87, 0x810f, 0xa105, 0x127e, 0x2091, 0x8000, ++ 0x007e, 0x1078, 0x76c7, 0x007f, 0x0040, 0x2f83, 0x601a, 0x600b, ++ 0xbc05, 0x601f, 0x0001, 0x1078, 0x35ba, 0x0040, 0x2f8a, 0x6837, ++ 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, ++ 0x701b, 0x2f8e, 0x2d00, 0x6012, 0x2009, 0x0032, 0x1078, 0x775c, ++ 0x127f, 0x0c7f, 0x007c, 0x127f, 0x0c7f, 0x0078, 0x2bd7, 0x0c7f, ++ 0x0078, 0x2bdb, 0x1078, 0x772d, 0x0078, 0x2f83, 0x6830, 0xa086, ++ 0x0100, 0x0040, 0x2bd7, 0x0078, 0x2bad, 0x2061, 0xa933, 0x127e, ++ 0x2091, 0x8000, 0x6000, 0xd084, 0x0040, 0x2fa6, 0x6104, 0x6208, ++ 0x2019, 0xa612, 0x231c, 0x127f, 0x0078, 0x2bad, 0x127f, 0x0078, ++ 0x2bdb, 0x81ff, 0x00c0, 0x2bd7, 0x127e, 0x2091, 0x8000, 0x6248, ++ 0x6064, 0xa202, 0x0048, 0x2fbd, 0xa085, 0x0001, 0x1078, 0x256a, ++ 0x1078, 0x3c9e, 0x127f, 0x0078, 0x2bad, 0x127f, 0x0078, 0x2bdb, ++ 0x127e, 0x2091, 0x8000, 0x20a9, 0x0012, 0x2001, 0xa640, 0x20a0, ++ 0xa006, 0x40a4, 0x127f, 0x0078, 0x2bad, 0x7d38, 0x7c3c, 0x0078, ++ 0x2c5f, 0x7824, 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x00c8, 0x2bd7, ++ 0x6250, 0xa084, 0xff00, 0x8007, 0xa206, 0x00c0, 0x2fe9, 0x2001, ++ 0xa640, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, ++ 0x3608, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb, ++ 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2bd7, 0x0c7e, ++ 0x1078, 0x35ba, 0x0c7f, 0x0040, 0x2bd7, 0x6837, 0x0000, 0x6838, ++ 0xc0fd, 0x683a, 0x1078, 0x8e4a, 0x0040, 0x2bd7, 0x7007, 0x0003, ++ 0x701b, 0x300b, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7, ++ 0xad80, 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, ++ 0x0078, 0x3608, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x1078, 0x42dd, ++ 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604, ++ 0x701b, 0x302b, 0x007c, 0xade8, 0x000d, 0x6800, 0xa005, 0x0040, ++ 0x2bdb, 0x6804, 0xd0ac, 0x0040, 0x3038, 0xd0a4, 0x0040, 0x2bdb, ++ 0xd094, 0x0040, 0x3043, 0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18c, ++ 0xffdf, 0x6106, 0x0c7f, 0xd08c, 0x0040, 0x304e, 0x0c7e, 0x2061, ++ 0x0100, 0x6104, 0xa18d, 0x0010, 0x6106, 0x0c7f, 0x2009, 0x0100, ++ 0x210c, 0xa18a, 0x0002, 0x0048, 0x3063, 0xd084, 0x0040, 0x3063, ++ 0x6a28, 0xa28a, 0x007f, 0x00c8, 0x2bdb, 0xa288, 0x29c0, 0x210c, ++ 0xa18c, 0x00ff, 0x6156, 0xd0dc, 0x0040, 0x306c, 0x6828, 0xa08a, ++ 0x007f, 0x00c8, 0x2bdb, 0x6052, 0x6808, 0xa08a, 0x0100, 0x0048, ++ 0x2bdb, 0xa08a, 0x0841, 0x00c8, 0x2bdb, 0xa084, 0x0007, 0x00c0, ++ 0x2bdb, 0x680c, 0xa005, 0x0040, 0x2bdb, 0x6810, 0xa005, 0x0040, ++ 0x2bdb, 0x6848, 0x6940, 0xa10a, 0x00c8, 0x2bdb, 0x8001, 0x0040, ++ 0x2bdb, 0x684c, 0x6944, 0xa10a, 0x00c8, 0x2bdb, 0x8001, 0x0040, ++ 0x2bdb, 0x6804, 0xd0fc, 0x0040, 0x30c2, 0x1078, 0x35ba, 0x0040, ++ 0x2bd7, 0x2009, 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0xa290, ++ 0x0038, 0xa399, 0x0000, 0x1078, 0x3604, 0x701b, 0x30a8, 0x007c, ++ 0xade8, 0x000d, 0x20a9, 0x0014, 0x2d98, 0x2069, 0xa66e, 0x2da0, ++ 0x53a3, 0x7010, 0xa0e8, 0x000d, 0x2001, 0xa672, 0x200c, 0xd1e4, ++ 0x0040, 0x30c2, 0x0c7e, 0x2061, 0x0100, 0x6004, 0xa085, 0x0b00, ++ 0x6006, 0x0c7f, 0x20a9, 0x001c, 0x2d98, 0x2069, 0xa652, 0x2da0, ++ 0x53a3, 0x6814, 0xa08c, 0x00ff, 0x6142, 0x8007, 0xa084, 0x00ff, ++ 0x6046, 0x1078, 0x4eae, 0x1078, 0x49ce, 0x1078, 0x4a3e, 0x6000, ++ 0xa086, 0x0000, 0x00c0, 0x314d, 0x6808, 0x602a, 0x1078, 0x21f7, ++ 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, ++ 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0040, 0x30fa, ++ 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, ++ 0x0078, 0x30fc, 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, ++ 0x1078, 0x5b19, 0x6904, 0xd1fc, 0x0040, 0x312f, 0x0c7e, 0x2009, ++ 0x0000, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x0040, 0x312c, 0x0078, ++ 0x3116, 0x839d, 0x00c8, 0x312c, 0x3508, 0x8109, 0x1078, 0x5480, ++ 0x6878, 0x6016, 0x6874, 0x2008, 0xa084, 0xff00, 0x8007, 0x600a, ++ 0xa184, 0x00ff, 0x6006, 0x8108, 0x00c0, 0x312a, 0x6003, 0x0003, ++ 0x0078, 0x312c, 0x6003, 0x0001, 0x00f0, 0x3111, 0x0c7f, 0x0c7e, ++ 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x0c7f, 0x1078, ++ 0x3819, 0x0040, 0x313d, 0x1078, 0x256a, 0x60c0, 0xa005, 0x0040, ++ 0x3149, 0x6003, 0x0001, 0x2091, 0x301d, 0x1078, 0x4224, 0x0078, ++ 0x314d, 0x6003, 0x0004, 0x2091, 0x301d, 0x0078, 0x2bad, 0x6000, ++ 0xa086, 0x0000, 0x0040, 0x2bd7, 0x2069, 0xa652, 0x7830, 0x6842, ++ 0x7834, 0x6846, 0x6804, 0xd0fc, 0x0040, 0x3162, 0x2009, 0x0030, ++ 0x0078, 0x3164, 0x2009, 0x001c, 0x2d00, 0x7a2c, 0x7b28, 0x7c3c, ++ 0x7d38, 0x0078, 0x3608, 0xa006, 0x1078, 0x256a, 0x81ff, 0x00c0, ++ 0x2bd7, 0x1078, 0x42dd, 0x1078, 0x4224, 0x0078, 0x2bad, 0x81ff, ++ 0x00c0, 0x2bd7, 0x6184, 0x81ff, 0x0040, 0x3191, 0x703f, 0x0000, ++ 0x2001, 0xacc0, 0x2009, 0x0040, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, ++ 0x127e, 0x2091, 0x8000, 0x1078, 0x3608, 0x701b, 0x2baa, 0x127f, ++ 0x007c, 0x703f, 0x0001, 0x0d7e, 0x2069, 0xacc0, 0x20a9, 0x0040, ++ 0x20a1, 0xacc0, 0x2019, 0xffff, 0x43a4, 0x6550, 0xa588, 0x29c0, ++ 0x210c, 0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011, 0x0002, 0x2100, ++ 0xa506, 0x0040, 0x31c3, 0x1078, 0x45c4, 0x00c0, 0x31c3, 0x6014, ++ 0x821c, 0x0048, 0x31bb, 0xa398, 0xacc0, 0xa085, 0xff00, 0x8007, ++ 0x201a, 0x0078, 0x31c2, 0xa398, 0xacc0, 0x2324, 0xa4a4, 0xff00, ++ 0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x00c8, 0x31ca, ++ 0x0078, 0x31a7, 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a, 0x0d7f, ++ 0x20a9, 0x0040, 0x20a1, 0xacc0, 0x2099, 0xacc0, 0x1078, 0x4281, ++ 0x0078, 0x3180, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x0c7e, 0x1078, ++ 0x35ba, 0x0c7f, 0x00c0, 0x31e8, 0x2009, 0x0002, 0x0078, 0x2bd7, ++ 0x2001, 0xa653, 0x2004, 0xd0b4, 0x0040, 0x320f, 0x6000, 0xd08c, ++ 0x00c0, 0x320f, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, ++ 0x320f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x8e9e, ++ 0x00c0, 0x3206, 0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003, ++ 0x701b, 0x320b, 0x007c, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x20a9, ++ 0x002b, 0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004, ++ 0xac80, 0x0006, 0x2098, 0xad80, 0x0006, 0x20a0, 0x1078, 0x4281, ++ 0x20a9, 0x0004, 0xac80, 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0, ++ 0x1078, 0x4281, 0x2d00, 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c, ++ 0x7d38, 0x0078, 0x3608, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, ++ 0x0040, 0x2bdb, 0x1078, 0x47bd, 0x0078, 0x2bad, 0x81ff, 0x00c0, ++ 0x2bd7, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb, 0x1078, 0x35e4, ++ 0x0040, 0x2bdb, 0x1078, 0x482f, 0x0040, 0x2bd7, 0x2019, 0x0004, ++ 0x1078, 0x47d3, 0x7924, 0x810f, 0x7a28, 0x1078, 0x3259, 0x0078, ++ 0x2bad, 0xa186, 0x00ff, 0x0040, 0x3261, 0x1078, 0x3271, 0x0078, ++ 0x3270, 0x2029, 0x007e, 0x2061, 0xa600, 0x6450, 0x2400, 0xa506, ++ 0x0040, 0x326d, 0x2508, 0x1078, 0x3271, 0x8529, 0x00c8, 0x3266, ++ 0x007c, 0x1078, 0x45c4, 0x00c0, 0x327c, 0x2200, 0x8003, 0x800b, ++ 0x810b, 0xa108, 0x1078, 0x5a52, 0x007c, 0x81ff, 0x00c0, 0x2bd7, ++ 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7, ++ 0x1078, 0x47c8, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, ++ 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7, 0x1078, ++ 0x47b2, 0x0078, 0x2bad, 0x6100, 0x0078, 0x2bad, 0x1078, 0x35e4, ++ 0x0040, 0x2bdb, 0x2001, 0xa600, 0x2004, 0xa086, 0x0003, 0x00c0, ++ 0x2bd7, 0x0d7e, 0xace8, 0x000a, 0x7924, 0xd184, 0x0040, 0x32b2, ++ 0xace8, 0x0006, 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a, ++ 0x6b04, 0x831f, 0x6a00, 0x8217, 0x0d7f, 0x6100, 0xa18c, 0x0200, ++ 0x0078, 0x2bad, 0xa006, 0x1078, 0x256a, 0x7824, 0xa084, 0x00ff, ++ 0xa086, 0x00ff, 0x0040, 0x32cf, 0x81ff, 0x00c0, 0x2bd7, 0x1078, ++ 0x42dd, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb, 0x7924, 0xa18c, ++ 0xff00, 0x810f, 0xa186, 0x00ff, 0x0040, 0x32e5, 0xa182, 0x007f, ++ 0x00c8, 0x2bdb, 0x2100, 0x1078, 0x2564, 0x027e, 0x0c7e, 0x127e, ++ 0x2091, 0x8000, 0x2061, 0xa8c4, 0x601b, 0x0000, 0x601f, 0x0000, ++ 0x2011, 0x0003, 0x1078, 0x70e0, 0x2011, 0x0002, 0x1078, 0x70ea, ++ 0x1078, 0x6fc4, 0x037e, 0x2019, 0x0000, 0x1078, 0x7058, 0x037f, ++ 0x2061, 0x0100, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa105, 0x604a, ++ 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, 0x4259, ++ 0x1078, 0x5add, 0x7924, 0xa18c, 0xff00, 0x810f, 0x7a28, 0x1078, ++ 0x3259, 0x127f, 0x0c7f, 0x027f, 0x0078, 0x2bad, 0x7924, 0xa18c, ++ 0xff00, 0x810f, 0x0c7e, 0x1078, 0x455c, 0x2c08, 0x0c7f, 0x00c0, ++ 0x2bdb, 0x0078, 0x2bad, 0x81ff, 0x0040, 0x3332, 0x2009, 0x0001, ++ 0x0078, 0x2bd7, 0x60cc, 0xd09c, 0x00c0, 0x333a, 0x2009, 0x0005, ++ 0x0078, 0x2bd7, 0x1078, 0x35ba, 0x00c0, 0x3342, 0x2009, 0x0002, ++ 0x0078, 0x2bd7, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, ++ 0x3604, 0x701b, 0x334c, 0x007c, 0x2009, 0x0080, 0x1078, 0x45c4, ++ 0x00c0, 0x3359, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0040, ++ 0x335d, 0x2021, 0x400a, 0x0078, 0x2baf, 0x0d7e, 0xade8, 0x000d, ++ 0x6900, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be, ++ 0x0100, 0x0040, 0x33d0, 0xa0be, 0x0112, 0x0040, 0x33d0, 0xa0be, ++ 0x0113, 0x0040, 0x33d0, 0xa0be, 0x0114, 0x0040, 0x33d0, 0xa0be, ++ 0x0117, 0x0040, 0x33d0, 0xa0be, 0x011a, 0x0040, 0x33d0, 0xa0be, ++ 0x0121, 0x0040, 0x33c6, 0xa0be, 0x0131, 0x0040, 0x33c6, 0xa0be, ++ 0x0171, 0x0040, 0x33d0, 0xa0be, 0x0173, 0x0040, 0x33d0, 0xa0be, ++ 0x01a1, 0x00c0, 0x3398, 0x6830, 0x8007, 0x6832, 0x0078, 0x33d6, ++ 0xa0be, 0x0212, 0x0040, 0x33cc, 0xa0be, 0x0213, 0x0040, 0x33cc, ++ 0xa0be, 0x0214, 0x0040, 0x33be, 0xa0be, 0x0217, 0x0040, 0x33b8, ++ 0xa0be, 0x021a, 0x00c0, 0x33b1, 0x6838, 0x8007, 0x683a, 0x0078, ++ 0x33d0, 0xa0be, 0x0300, 0x0040, 0x33d0, 0x0d7f, 0x0078, 0x2bdb, ++ 0xad80, 0x0010, 0x20a9, 0x0007, 0x1078, 0x3418, 0xad80, 0x000e, ++ 0x20a9, 0x0001, 0x1078, 0x3418, 0x0078, 0x33d0, 0xad80, 0x000c, ++ 0x1078, 0x3426, 0x0078, 0x33d6, 0xad80, 0x000e, 0x1078, 0x3426, ++ 0xad80, 0x000c, 0x20a9, 0x0001, 0x1078, 0x3418, 0x0c7e, 0x1078, ++ 0x35ba, 0x0040, 0x3409, 0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119, ++ 0x6853, 0x0000, 0x684f, 0x0020, 0x685b, 0x0001, 0x810b, 0x697e, ++ 0x6883, 0x0000, 0x6a86, 0x6b8a, 0x6c8e, 0x6d92, 0x6996, 0x689b, ++ 0x0000, 0x0c7f, 0x0d7f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, ++ 0x6823, 0x0000, 0x6804, 0x2068, 0x1078, 0x8e66, 0x00c0, 0x3404, ++ 0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x340f, ++ 0x007c, 0x0c7f, 0x0d7f, 0x2009, 0x0002, 0x0078, 0x2bd7, 0x6820, ++ 0xa086, 0x8001, 0x00c0, 0x2bad, 0x2009, 0x0004, 0x0078, 0x2bd7, ++ 0x017e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a, 0x8108, ++ 0x280a, 0x8108, 0x00f0, 0x341a, 0x017f, 0x007c, 0x017e, 0x0a7e, ++ 0x0b7e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x2054, 0x8000, ++ 0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108, 0x280a, ++ 0x0b7f, 0x0a7f, 0x017f, 0x007c, 0x81ff, 0x0040, 0x3443, 0x2009, ++ 0x0001, 0x0078, 0x2bd7, 0x60cc, 0xd09c, 0x00c0, 0x344b, 0x2009, ++ 0x0005, 0x0078, 0x2bd7, 0x7924, 0x2140, 0xa18c, 0xff00, 0x810f, ++ 0xa182, 0x0080, 0x0048, 0x2bdb, 0xa182, 0x00ff, 0x00c8, 0x2bdb, ++ 0x7a2c, 0x7b28, 0x606c, 0xa306, 0x00c0, 0x3466, 0x6070, 0xa24e, ++ 0x0040, 0x2bdb, 0xa9cc, 0xff00, 0x0040, 0x2bdb, 0x0c7e, 0x1078, ++ 0x350f, 0x2c68, 0x0c7f, 0x0040, 0x349e, 0xa0c6, 0x4000, 0x00c0, ++ 0x3484, 0x0c7e, 0x007e, 0x2d60, 0x2009, 0x0000, 0x1078, 0x489b, ++ 0x00c0, 0x347b, 0xc185, 0x6000, 0xd0bc, 0x0040, 0x3480, 0xc18d, ++ 0x007f, 0x0c7f, 0x0078, 0x349b, 0xa0c6, 0x4007, 0x00c0, 0x348b, ++ 0x2408, 0x0078, 0x349b, 0xa0c6, 0x4008, 0x00c0, 0x3493, 0x2708, ++ 0x2610, 0x0078, 0x349b, 0xa0c6, 0x4009, 0x00c0, 0x3499, 0x0078, ++ 0x349b, 0x2001, 0x4006, 0x2020, 0x0078, 0x2baf, 0x2d00, 0x7022, ++ 0x017e, 0x0b7e, 0x0c7e, 0x0e7e, 0x2c70, 0x1078, 0x76c7, 0x0040, ++ 0x34e4, 0x2d00, 0x601a, 0x2001, 0xa657, 0x2004, 0xa084, 0x00ff, ++ 0x6842, 0x2e58, 0x0e7f, 0x0e7e, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, ++ 0x2b70, 0x00c0, 0x34c5, 0x1078, 0x772d, 0x0e7f, 0x0c7f, 0x0b7f, ++ 0x017f, 0x2009, 0x0002, 0x0078, 0x2bd7, 0x6837, 0x0000, 0x2d00, ++ 0x6012, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x127e, 0x2091, ++ 0x8000, 0x1078, 0x2880, 0x127f, 0x601f, 0x0001, 0x2001, 0x0000, ++ 0x1078, 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x2009, 0x0002, ++ 0x1078, 0x775c, 0xa085, 0x0001, 0x0e7f, 0x0c7f, 0x0b7f, 0x017f, ++ 0x00c0, 0x34ee, 0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003, ++ 0x701b, 0x34f3, 0x007c, 0x6830, 0xa086, 0x0100, 0x7020, 0x2060, ++ 0x00c0, 0x3501, 0x2009, 0x0004, 0x6204, 0xa294, 0x00ff, 0x0078, ++ 0x2bd7, 0x2009, 0x0000, 0x1078, 0x489b, 0x00c0, 0x3508, 0xc185, ++ 0x6000, 0xd0bc, 0x0040, 0x350d, 0xc18d, 0x0078, 0x2bad, 0x0e7e, ++ 0x0d7e, 0x2029, 0x0000, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071, ++ 0xa7b5, 0x2e04, 0xa005, 0x00c0, 0x3524, 0x2100, 0xa406, 0x00c0, ++ 0x3555, 0x2428, 0x0078, 0x3555, 0x2068, 0x6f10, 0x2700, 0xa306, ++ 0x00c0, 0x3546, 0x6e14, 0x2600, 0xa206, 0x00c0, 0x3546, 0x2400, ++ 0xa106, 0x00c0, 0x3542, 0x2d60, 0xd884, 0x0040, 0x356a, 0x6004, ++ 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x356a, 0x2001, 0x4000, ++ 0x0078, 0x356b, 0x2001, 0x4007, 0x0078, 0x356b, 0x2400, 0xa106, ++ 0x00c0, 0x3555, 0x6e14, 0x87ff, 0x00c0, 0x3551, 0x86ff, 0x0040, ++ 0x3521, 0x2001, 0x4008, 0x0078, 0x356b, 0x8420, 0x8e70, 0x00f0, ++ 0x3519, 0x85ff, 0x00c0, 0x3564, 0x2001, 0x4009, 0x0078, 0x356b, ++ 0x2001, 0x0001, 0x0078, 0x356b, 0x1078, 0x455c, 0x00c0, 0x3560, ++ 0x6312, 0x6216, 0xa006, 0xa005, 0x0d7f, 0x0e7f, 0x007c, 0x81ff, ++ 0x00c0, 0x2bd7, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x6837, 0x0000, ++ 0x6838, 0xc0fd, 0x683a, 0x7824, 0xa005, 0x0040, 0x2bdb, 0xa096, ++ 0x00ff, 0x0040, 0x3587, 0xa092, 0x0004, 0x00c8, 0x2bdb, 0x2010, ++ 0x2d18, 0x1078, 0x282f, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, ++ 0x3592, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7, 0x0078, ++ 0x2bad, 0x7924, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0080, 0x0048, ++ 0x2bdb, 0xa182, 0x00ff, 0x00c8, 0x2bdb, 0x127e, 0x2091, 0x8000, ++ 0x1078, 0x8d4b, 0x00c0, 0x35b7, 0xa190, 0xa735, 0x2204, 0xa065, ++ 0x0040, 0x35b7, 0x1078, 0x42f8, 0x127f, 0x0078, 0x2bad, 0x127f, ++ 0x0078, 0x2bd7, 0x1078, 0x138b, 0x0040, 0x35d1, 0xa006, 0x6802, ++ 0x7010, 0xa005, 0x00c0, 0x35c9, 0x2d00, 0x7012, 0x7016, 0x0078, ++ 0x35cf, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80, ++ 0x000d, 0x007c, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x45c4, ++ 0x00c0, 0x35e1, 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048, ++ 0x35e2, 0xa066, 0x8cff, 0x007c, 0x7e24, 0x860f, 0xa18c, 0x00ff, ++ 0x1078, 0x45c4, 0x00c0, 0x35f2, 0xa6b4, 0x00ff, 0xa682, 0x4000, ++ 0x0048, 0x35f3, 0xa066, 0x8cff, 0x007c, 0x017e, 0x7110, 0x81ff, ++ 0x0040, 0x3600, 0x2168, 0x6904, 0x1078, 0x13a4, 0x0078, 0x35f7, ++ 0x7112, 0x7116, 0x017f, 0x007c, 0x2031, 0x0001, 0x0078, 0x360a, ++ 0x2031, 0x0000, 0x2061, 0xa6d2, 0x6606, 0x6112, 0x600e, 0x6226, ++ 0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x13db, 0x7007, 0x0002, ++ 0x701b, 0x2bad, 0x007c, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079, ++ 0x0000, 0x2001, 0xa690, 0x2004, 0xa005, 0x00c0, 0x3636, 0x0068, ++ 0x3636, 0x7818, 0xd084, 0x00c0, 0x3636, 0x7a22, 0x7b26, 0x7c2a, ++ 0x781b, 0x0001, 0x2091, 0x4080, 0x0078, 0x365b, 0x017e, 0x0c7e, ++ 0x0e7e, 0x2071, 0xa682, 0x7138, 0xa182, 0x0008, 0x0048, 0x3644, ++ 0x7030, 0x2060, 0x0078, 0x3655, 0x7030, 0xa0e0, 0x0008, 0xac82, ++ 0xa6d2, 0x0048, 0x364d, 0x2061, 0xa692, 0x2c00, 0x7032, 0x81ff, ++ 0x00c0, 0x3653, 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a, ++ 0x0e7f, 0x0c7f, 0x017f, 0x127f, 0x0f7f, 0x007c, 0x0e7e, 0x2071, ++ 0xa682, 0x7038, 0xa005, 0x0040, 0x3697, 0x127e, 0x2091, 0x8000, ++ 0x0068, 0x3696, 0x0f7e, 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, ++ 0x3695, 0x0c7e, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, 0x7826, ++ 0x6008, 0x782a, 0x781b, 0x0001, 0x2091, 0x4080, 0x7038, 0x8001, ++ 0x703a, 0xa005, 0x00c0, 0x368b, 0x7033, 0xa692, 0x7037, 0xa692, ++ 0x0c7f, 0x0078, 0x3695, 0xac80, 0x0008, 0xa0fa, 0xa6d2, 0x0048, ++ 0x3693, 0x2001, 0xa692, 0x7036, 0x0c7f, 0x0f7f, 0x127f, 0x0e7f, ++ 0x007c, 0x027e, 0x2001, 0xa653, 0x2004, 0xd0c4, 0x0040, 0x36a4, ++ 0x2011, 0x8014, 0x1078, 0x361b, 0x027f, 0x007c, 0x81ff, 0x00c0, ++ 0x2bd7, 0x127e, 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, ++ 0x6032, 0x1078, 0x4224, 0x127f, 0x0078, 0x2bad, 0x81ff, 0x00c0, ++ 0x2bd7, 0x6000, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x2001, 0xa653, ++ 0x2004, 0xd0ac, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb, ++ 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x36d3, 0x7828, ++ 0xa005, 0x0040, 0x2bad, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, 0x0040, ++ 0x2bd7, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, ++ 0x1078, 0x8f12, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x36e9, ++ 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7, 0x0078, 0x2bad, ++ 0x2001, 0xa600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x7f24, ++ 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x35ba, 0x0040, 0x2bd7, ++ 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000, ++ 0xad80, 0x0005, 0x7026, 0x20a0, 0x1078, 0x45c4, 0x00c0, 0x376d, ++ 0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0040, 0x371d, 0xa0c4, ++ 0xff00, 0xa8c6, 0x0600, 0x00c0, 0x376d, 0x2001, 0xa653, 0x2004, ++ 0xd0ac, 0x00c0, 0x372a, 0x1078, 0x489b, 0x00c0, 0x372a, 0xd79c, ++ 0x0040, 0x376d, 0xd794, 0x00c0, 0x3730, 0xd784, 0x0040, 0x373c, ++ 0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x1078, ++ 0x3426, 0xd794, 0x0040, 0x3745, 0xac80, 0x000a, 0x2098, 0x3400, ++ 0x20a9, 0x0004, 0x53a3, 0x1078, 0x3426, 0x21a2, 0xd794, 0x0040, ++ 0x3765, 0xac80, 0x0000, 0x2098, 0x94a0, 0x20a9, 0x0002, 0x53a3, ++ 0xac80, 0x0003, 0x20a6, 0x94a0, 0xac80, 0x0004, 0x2098, 0x3400, ++ 0x20a9, 0x0002, 0x53a3, 0x1078, 0x3418, 0xac80, 0x0026, 0x2098, ++ 0x20a9, 0x0002, 0x53a3, 0x0078, 0x3766, 0x94a0, 0xd794, 0x0040, ++ 0x376b, 0xa6b0, 0x000b, 0xa6b0, 0x0005, 0x8108, 0xd78c, 0x0040, ++ 0x3777, 0xa186, 0x0100, 0x0040, 0x3788, 0x0078, 0x377b, 0xa186, ++ 0x007e, 0x0040, 0x3788, 0xd794, 0x0040, 0x3782, 0xa686, 0x0020, ++ 0x0078, 0x3784, 0xa686, 0x0028, 0x0040, 0x3791, 0x0078, 0x370c, ++ 0x86ff, 0x00c0, 0x378f, 0x7120, 0x810b, 0x0078, 0x2bad, 0x702f, ++ 0x0001, 0x711e, 0x7020, 0xa600, 0x7022, 0x772a, 0x2061, 0xa6d2, ++ 0x6007, 0x0000, 0x6612, 0x7024, 0x600e, 0x6226, 0x632a, 0x642e, ++ 0x6532, 0x2c10, 0x1078, 0x13db, 0x7007, 0x0002, 0x701b, 0x37a9, ++ 0x007c, 0x702c, 0xa005, 0x00c0, 0x37bb, 0x711c, 0x7024, 0x20a0, ++ 0x7728, 0x2031, 0x0000, 0x2061, 0xa6d2, 0x6224, 0x6328, 0x642c, ++ 0x6530, 0x0078, 0x370c, 0x7120, 0x810b, 0x0078, 0x2bad, 0x2029, ++ 0x007e, 0x7924, 0x7a28, 0x7b2c, 0x7c38, 0xa184, 0xff00, 0x8007, ++ 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa184, ++ 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, ++ 0xa284, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, ++ 0x0048, 0x2bdb, 0xa284, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb, ++ 0xa502, 0x0048, 0x2bdb, 0xa384, 0xff00, 0x8007, 0xa0e2, 0x0020, ++ 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa384, 0x00ff, 0xa0e2, ++ 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa484, 0xff00, ++ 0x8007, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, ++ 0xa484, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, ++ 0x2bdb, 0x2061, 0xa8a5, 0x6102, 0x6206, 0x630a, 0x640e, 0x0078, ++ 0x2bad, 0x007e, 0x2001, 0xa653, 0x2004, 0xd0cc, 0x007f, 0x007c, ++ 0x007e, 0x2001, 0xa672, 0x2004, 0xd0bc, 0x007f, 0x007c, 0x6164, ++ 0x7a24, 0x6300, 0x82ff, 0x00c0, 0x3830, 0x7926, 0x0078, 0x2bad, ++ 0x83ff, 0x00c0, 0x2bdb, 0x2001, 0xfff0, 0xa200, 0x00c8, 0x2bdb, ++ 0x2019, 0xffff, 0x6068, 0xa302, 0xa200, 0x0048, 0x2bdb, 0x7926, ++ 0x6266, 0x0078, 0x2bad, 0x2001, 0xa600, 0x2004, 0xa086, 0x0003, ++ 0x00c0, 0x2bd7, 0x7c28, 0x7d24, 0x7e38, 0x7f2c, 0x1078, 0x35ba, ++ 0x0040, 0x2bd7, 0x2009, 0x0000, 0x2019, 0x0000, 0x7023, 0x0000, ++ 0x702f, 0x0000, 0xad80, 0x0003, 0x7026, 0x20a0, 0xa1e0, 0xa735, ++ 0x2c64, 0x8cff, 0x0040, 0x387d, 0x6004, 0xa084, 0x00ff, 0xa086, ++ 0x0006, 0x0040, 0x3872, 0x6004, 0xa084, 0xff00, 0xa086, 0x0600, ++ 0x00c0, 0x387d, 0x6014, 0x20a2, 0x94a0, 0x6010, 0x8007, 0xa105, ++ 0x8007, 0x20a2, 0x94a0, 0xa398, 0x0002, 0x8108, 0xa182, 0x00ff, ++ 0x0040, 0x3888, 0xa386, 0x002a, 0x0040, 0x3891, 0x0078, 0x385e, ++ 0x83ff, 0x00c0, 0x388f, 0x7120, 0x810c, 0x0078, 0x2bad, 0x702f, ++ 0x0001, 0x711e, 0x7020, 0xa300, 0x7022, 0x2061, 0xa6d2, 0x6007, ++ 0x0000, 0x6312, 0x7024, 0x600e, 0x6426, 0x652a, 0x662e, 0x6732, ++ 0x2c10, 0x1078, 0x13db, 0x7007, 0x0002, 0x701b, 0x38a8, 0x007c, ++ 0x702c, 0xa005, 0x00c0, 0x38b9, 0x711c, 0x7024, 0x20a0, 0x2019, ++ 0x0000, 0x2061, 0xa6d2, 0x6424, 0x6528, 0x662c, 0x6730, 0x0078, ++ 0x385e, 0x7120, 0x810c, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, ++ 0x60cc, 0xd09c, 0x0040, 0x2bd7, 0x1078, 0x35ba, 0x0040, 0x2bd7, ++ 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604, 0x701b, ++ 0x38d2, 0x007c, 0x0d7e, 0xade8, 0x000d, 0x6828, 0xa0be, 0x7000, ++ 0x0040, 0x38e5, 0xa0be, 0x7100, 0x0040, 0x38e5, 0xa0be, 0x7200, ++ 0x0040, 0x38e5, 0x0d7f, 0x0078, 0x2bdb, 0x6820, 0x6924, 0x1078, ++ 0x254d, 0x00c0, 0x3910, 0x1078, 0x455c, 0x00c0, 0x3910, 0x7122, ++ 0x6612, 0x6516, 0x6e18, 0x0c7e, 0x1078, 0x35ba, 0x0040, 0x3910, ++ 0x1078, 0x35ba, 0x0040, 0x3910, 0x0c7f, 0x0d7f, 0x6837, 0x0000, ++ 0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x6804, 0x2068, 0x1078, ++ 0x8e82, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x3913, 0x007c, ++ 0x0d7f, 0x0078, 0x2bd7, 0x7120, 0x1078, 0x298e, 0x6820, 0xa086, ++ 0x8001, 0x0040, 0x2bd7, 0x2d00, 0x701e, 0x6804, 0xa080, 0x0002, ++ 0x007e, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x1078, 0x4281, 0x007f, ++ 0xade8, 0x000d, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061, 0xa6d2, ++ 0x6007, 0x0000, 0x6e00, 0x6f28, 0xa7c6, 0x7000, 0x00c0, 0x393a, ++ 0x0078, 0x393e, 0xa7c6, 0x7100, 0x00c0, 0x3946, 0xa6c2, 0x0004, ++ 0x0048, 0x2bdb, 0x2009, 0x0004, 0x0078, 0x3608, 0xa7c6, 0x7200, ++ 0x00c0, 0x2bdb, 0xa6c2, 0x0054, 0x0048, 0x2bdb, 0x600e, 0x6013, ++ 0x002a, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x13db, ++ 0x7007, 0x0002, 0x701b, 0x395d, 0x007c, 0x701c, 0x2068, 0x6804, ++ 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x007e, 0x20a9, 0x002a, ++ 0x2098, 0x20a0, 0x1078, 0x4281, 0x007f, 0x2009, 0x002a, 0x2061, ++ 0xa6d2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0078, 0x3608, 0x81ff, ++ 0x00c0, 0x2bd7, 0x792c, 0x2001, 0xa89d, 0x2102, 0x1078, 0x35d2, ++ 0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7, 0x127e, 0x2091, ++ 0x8000, 0x1078, 0x47de, 0x127f, 0x0078, 0x2bad, 0x7824, 0xd08c, ++ 0x00c0, 0x3995, 0xd084, 0x0040, 0x31da, 0x1078, 0x35e4, 0x0040, ++ 0x2bdb, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, 0x00c0, 0x39a3, 0x2009, ++ 0x0002, 0x0078, 0x2bd7, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, ++ 0x0040, 0x39b0, 0xa08e, 0x0004, 0x0040, 0x39b0, 0xa08e, 0x0005, ++ 0x00c0, 0x39dd, 0x7824, 0xd08c, 0x0040, 0x39bb, 0x6000, 0xc08c, ++ 0x6002, 0x0078, 0x39c5, 0x2001, 0xa653, 0x2004, 0xd0b4, 0x0040, ++ 0x320f, 0x6000, 0xd08c, 0x00c0, 0x320f, 0x6837, 0x0000, 0x6838, ++ 0xc0fd, 0x683a, 0x1078, 0x8e9e, 0x00c0, 0x39d2, 0x2009, 0x0003, ++ 0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x39d7, 0x007c, 0x1078, ++ 0x35e4, 0x0040, 0x2bdb, 0x0078, 0x320f, 0x2009, 0xa62f, 0x210c, ++ 0x81ff, 0x0040, 0x39e7, 0x2009, 0x0001, 0x0078, 0x2bd7, 0x2001, ++ 0xa600, 0x2004, 0xa086, 0x0003, 0x0040, 0x39f2, 0x2009, 0x0007, ++ 0x0078, 0x2bd7, 0x2001, 0xa653, 0x2004, 0xd0ac, 0x0040, 0x39fc, ++ 0x2009, 0x0008, 0x0078, 0x2bd7, 0x609c, 0xd0a4, 0x00c0, 0x3a03, ++ 0xd0ac, 0x00c0, 0x320f, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, ++ 0xc0fd, 0x683a, 0x1078, 0x8f12, 0x00c0, 0x3a12, 0x2009, 0x0003, ++ 0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x3a17, 0x007c, 0x6830, ++ 0xa086, 0x0100, 0x00c0, 0x3a20, 0x2009, 0x0004, 0x0078, 0x2bd7, ++ 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x0078, 0x39b2, 0x81ff, 0x2009, ++ 0x0001, 0x00c0, 0x2bd7, 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, ++ 0x00c0, 0x2bd7, 0x2001, 0xa653, 0x2004, 0xd0ac, 0x2009, 0x0008, ++ 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x6004, 0xa084, ++ 0x00ff, 0xa086, 0x0006, 0x2009, 0x0009, 0x00c0, 0x2bd7, 0x0c7e, ++ 0x1078, 0x35ba, 0x0c7f, 0x2009, 0x0002, 0x0040, 0x2bd7, 0x6837, ++ 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7928, 0xa194, ++ 0xff00, 0xa18c, 0x00ff, 0xa006, 0x82ff, 0x00c0, 0x3a65, 0xc0ed, ++ 0x6952, 0x792c, 0x6956, 0x0078, 0x3a6e, 0xa28e, 0x0100, 0x00c0, ++ 0x2bdb, 0xc0e5, 0x6853, 0x0000, 0x6857, 0x0000, 0x683e, 0x1078, ++ 0x90bd, 0x2009, 0x0003, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, ++ 0x3a7a, 0x007c, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0040, ++ 0x2bd7, 0x0078, 0x2bad, 0x81ff, 0x2009, 0x0001, 0x00c0, 0x2bd7, ++ 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x00c0, 0x2bd7, 0x1078, ++ 0x35e4, 0x0040, 0x2bdb, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, ++ 0x2009, 0x0009, 0x00c0, 0x2bd7, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, ++ 0x2009, 0x0002, 0x0040, 0x2bd7, 0xad80, 0x000f, 0x2009, 0x0008, ++ 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604, 0x701b, 0x3ab1, ++ 0x007c, 0x0d7e, 0xade8, 0x000f, 0x6800, 0xa086, 0x0500, 0x00c0, ++ 0x3ac4, 0x6804, 0xa005, 0x00c0, 0x3ac4, 0x6808, 0xa084, 0xff00, ++ 0x00c0, 0x3ac4, 0x0078, 0x3ac7, 0x0d7f, 0x00c0, 0x2bdb, 0x0d7f, ++ 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x0c7e, ++ 0x1078, 0x35e4, 0x00c0, 0x3ad7, 0x0c7f, 0x0078, 0x2bdb, 0x1078, ++ 0x9119, 0x2009, 0x0003, 0x0c7f, 0x0040, 0x2bd7, 0x7007, 0x0003, ++ 0x701b, 0x3ae3, 0x007c, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, ++ 0x0040, 0x2bd7, 0x0078, 0x2bad, 0x127e, 0x0c7e, 0x0e7e, 0x2061, ++ 0x0100, 0x2071, 0xa600, 0x6044, 0xd0a4, 0x00c0, 0x3b15, 0xd084, ++ 0x0040, 0x3afe, 0x1078, 0x3c75, 0x0078, 0x3b11, 0xd08c, 0x0040, ++ 0x3b05, 0x1078, 0x3b8c, 0x0078, 0x3b11, 0xd094, 0x0040, 0x3b0c, ++ 0x1078, 0x3b60, 0x0078, 0x3b11, 0xd09c, 0x0040, 0x3b11, 0x1078, ++ 0x3b1f, 0x0e7f, 0x0c7f, 0x127f, 0x007c, 0x017e, 0x6128, 0xd19c, ++ 0x00c0, 0x3b1c, 0xc19d, 0x612a, 0x017f, 0x0078, 0x3b11, 0x624c, ++ 0xa286, 0xf0f0, 0x00c0, 0x3b30, 0x6048, 0xa086, 0xf0f0, 0x0040, ++ 0x3b30, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0078, 0x3b5f, ++ 0xa294, 0xff00, 0xa296, 0xf700, 0x0040, 0x3b45, 0x7134, 0xd1a4, ++ 0x00c0, 0x3b45, 0x6240, 0xa294, 0x0010, 0x0040, 0x3b45, 0x2009, ++ 0x00f7, 0x1078, 0x42a1, 0x0078, 0x3b5f, 0x6043, 0x0040, 0x6043, ++ 0x0000, 0x7077, 0x0000, 0x708f, 0x0001, 0x70b3, 0x0000, 0x70cf, ++ 0x0000, 0x2009, 0xacc0, 0x200b, 0x0000, 0x7087, 0x0000, 0x707b, ++ 0x000f, 0x2009, 0x000f, 0x2011, 0x41d5, 0x1078, 0x5add, 0x007c, ++ 0x157e, 0x7078, 0xa005, 0x00c0, 0x3b8a, 0x2011, 0x41d5, 0x1078, ++ 0x5a45, 0x6040, 0xa094, 0x0010, 0xa285, 0x0020, 0x6042, 0x20a9, ++ 0x00c8, 0x6044, 0xd08c, 0x00c0, 0x3b83, 0x00f0, 0x3b71, 0x6242, ++ 0x708b, 0x0000, 0x6040, 0xa094, 0x0010, 0xa285, 0x0080, 0x6042, ++ 0x6242, 0x0078, 0x3b8a, 0x6242, 0x708b, 0x0000, 0x707f, 0x0000, ++ 0x0078, 0x3b8a, 0x157f, 0x007c, 0x707c, 0xa08a, 0x0003, 0x00c8, ++ 0x3b95, 0x1079, 0x3b98, 0x0078, 0x3b97, 0x1078, 0x1332, 0x007c, ++ 0x3b9b, 0x3bea, 0x3c74, 0x0f7e, 0x707f, 0x0001, 0x20e1, 0xa000, ++ 0x20e1, 0x8700, 0x1078, 0x21f7, 0x20e1, 0x9080, 0x20e1, 0x4000, ++ 0x2079, 0xab00, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000, ++ 0x780f, 0x00ef, 0x7813, 0x0138, 0x7817, 0x0000, 0x781b, 0x0000, ++ 0x781f, 0x0000, 0x7823, 0xffff, 0x7827, 0xffff, 0x782b, 0x0000, ++ 0x782f, 0x0000, 0x2079, 0xab0c, 0x207b, 0x1101, 0x7807, 0x0000, ++ 0x2099, 0xa605, 0x20a1, 0xab0e, 0x20a9, 0x0004, 0x53a3, 0x2079, ++ 0xab12, 0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0xab00, 0x20a1, ++ 0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000, ++ 0x1078, 0x420b, 0x0f7f, 0x7083, 0x0000, 0x6043, 0x0008, 0x6043, ++ 0x0000, 0x007c, 0x0d7e, 0x7080, 0x7083, 0x0000, 0xa025, 0x0040, ++ 0x3c5e, 0x6020, 0xd0b4, 0x00c0, 0x3c5c, 0x718c, 0x81ff, 0x0040, ++ 0x3c4b, 0xa486, 0x000c, 0x00c0, 0x3c56, 0xa480, 0x0018, 0x8004, ++ 0x20a8, 0x2011, 0xab80, 0x2019, 0xab00, 0x220c, 0x2304, 0xa106, ++ 0x00c0, 0x3c22, 0x8210, 0x8318, 0x00f0, 0x3c05, 0x6043, 0x0004, ++ 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x707f, 0x0002, ++ 0x708b, 0x0002, 0x2009, 0x07d0, 0x2011, 0x41dc, 0x1078, 0x5add, ++ 0x0078, 0x3c5c, 0x2069, 0xab80, 0x6930, 0xa18e, 0x1101, 0x00c0, ++ 0x3c56, 0x6834, 0xa005, 0x00c0, 0x3c56, 0x6900, 0xa18c, 0x00ff, ++ 0x00c0, 0x3c36, 0x6804, 0xa005, 0x0040, 0x3c4b, 0x2011, 0xab8e, ++ 0x2019, 0xa605, 0x20a9, 0x0004, 0x220c, 0x2304, 0xa102, 0x0048, ++ 0x3c49, 0x00c0, 0x3c56, 0x8210, 0x8318, 0x00f0, 0x3c3c, 0x0078, ++ 0x3c56, 0x708f, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, ++ 0xab80, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043, 0x0008, ++ 0x6043, 0x0000, 0x0078, 0x3c5e, 0x0d7f, 0x007c, 0x6020, 0xd0b4, ++ 0x00c0, 0x3c5c, 0x60c3, 0x000c, 0x2011, 0xa8bb, 0x2013, 0x0000, ++ 0x7083, 0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, ++ 0x1078, 0x6e06, 0x0078, 0x3c5c, 0x007c, 0x7088, 0xa08a, 0x001d, ++ 0x00c8, 0x3c7e, 0x1079, 0x3c81, 0x0078, 0x3c80, 0x1078, 0x1332, ++ 0x007c, 0x3cab, 0x3cba, 0x3ce9, 0x3d02, 0x3d2e, 0x3d5a, 0x3d86, ++ 0x3dbc, 0x3de8, 0x3e10, 0x3e53, 0x3e7d, 0x3e9f, 0x3eb5, 0x3edb, ++ 0x3eee, 0x3ef7, 0x3f2b, 0x3f57, 0x3f83, 0x3faf, 0x3fe5, 0x4030, ++ 0x405f, 0x4081, 0x40c3, 0x40e9, 0x4102, 0x4103, 0x0c7e, 0x2061, ++ 0xa600, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0xa084, 0xfff9, ++ 0x6006, 0x0c7f, 0x007c, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, ++ 0x0002, 0x708b, 0x0001, 0x2009, 0x07d0, 0x2011, 0x41dc, 0x1078, ++ 0x5add, 0x007c, 0x0f7e, 0x7080, 0xa086, 0x0014, 0x00c0, 0x3ce7, ++ 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x3ce7, 0x2079, 0xab80, ++ 0x7a30, 0xa296, 0x1102, 0x00c0, 0x3ce5, 0x7834, 0xa005, 0x00c0, ++ 0x3ce5, 0x7a38, 0xd2fc, 0x0040, 0x3cdb, 0x70b0, 0xa005, 0x00c0, ++ 0x3cdb, 0x70b3, 0x0001, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x708b, ++ 0x0010, 0x1078, 0x3ef7, 0x0078, 0x3ce7, 0x1078, 0x4224, 0x0f7f, ++ 0x007c, 0x708b, 0x0003, 0x6043, 0x0004, 0x2011, 0x41dc, 0x1078, ++ 0x5a45, 0x1078, 0x4289, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9, ++ 0x000a, 0x20a3, 0x0000, 0x00f0, 0x3cf9, 0x60c3, 0x0014, 0x1078, ++ 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3d2c, 0x2011, ++ 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3d2a, 0x2079, ++ 0xab80, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x3d2a, 0x7834, 0xa005, ++ 0x00c0, 0x3d2a, 0x7a38, 0xd2fc, 0x0040, 0x3d24, 0x70b0, 0xa005, ++ 0x00c0, 0x3d24, 0x70b3, 0x0001, 0x708b, 0x0004, 0x1078, 0x3d2e, ++ 0x0078, 0x3d2c, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, 0x0005, ++ 0x1078, 0x4289, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011, ++ 0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3d4c, 0x7074, 0xa005, 0x00c0, ++ 0x3d4c, 0x7150, 0xa186, 0xffff, 0x0040, 0x3d4c, 0x1078, 0x419d, ++ 0x0040, 0x3d4c, 0x1078, 0x42b8, 0x20a9, 0x0008, 0x2298, 0x26a0, ++ 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, ++ 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3d84, 0x2011, ++ 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3d82, 0x2079, ++ 0xab80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x3d82, 0x7834, 0xa005, ++ 0x00c0, 0x3d82, 0x7a38, 0xd2fc, 0x0040, 0x3d7c, 0x70b0, 0xa005, ++ 0x00c0, 0x3d7c, 0x70b3, 0x0001, 0x708b, 0x0006, 0x1078, 0x3d86, ++ 0x0078, 0x3d84, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, 0x0007, ++ 0x1078, 0x4289, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, ++ 0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3dae, 0x7074, 0xa005, 0x00c0, ++ 0x3dae, 0x7154, 0xa186, 0xffff, 0x0040, 0x3dae, 0xa180, 0x29c0, ++ 0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x419d, 0x0040, 0x3dae, ++ 0x1078, 0x3820, 0x0040, 0x3dae, 0x1078, 0x256a, 0x20a9, 0x0008, ++ 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, ++ 0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, ++ 0x3de6, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, ++ 0x3de4, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3de4, ++ 0x7834, 0xa005, 0x00c0, 0x3de4, 0x7a38, 0xd2fc, 0x0040, 0x3dde, ++ 0x70b0, 0xa005, 0x00c0, 0x3dde, 0x70b3, 0x0001, 0x708b, 0x0008, ++ 0x1078, 0x3de8, 0x0078, 0x3de6, 0x1078, 0x4224, 0x0f7f, 0x007c, ++ 0x708b, 0x0009, 0x1078, 0x4289, 0x20a3, 0x1105, 0x20a3, 0x0100, ++ 0x3430, 0x1078, 0x42d4, 0x00c0, 0x3e01, 0x7074, 0xa005, 0x00c0, ++ 0x3e01, 0x1078, 0x4104, 0x00c0, 0x3e0b, 0xa085, 0x0001, 0x1078, ++ 0x256a, 0x20a9, 0x0008, 0x2099, 0xab8e, 0x26a0, 0x53a6, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x420b, 0x007c, ++ 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3e51, 0x2011, 0x41dc, 0x1078, ++ 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3e4f, 0x2079, 0xab80, 0x7a30, ++ 0xa296, 0x1105, 0x00c0, 0x3e4f, 0x7834, 0x2011, 0x0100, 0xa21e, ++ 0x00c0, 0x3e3a, 0x7a38, 0xd2fc, 0x0040, 0x3e34, 0x70b0, 0xa005, ++ 0x00c0, 0x3e34, 0x70b3, 0x0001, 0x708b, 0x000a, 0x1078, 0x3e53, ++ 0x0078, 0x3e51, 0xa005, 0x00c0, 0x3e4f, 0x7a38, 0xd2fc, 0x0040, ++ 0x3e47, 0x70b0, 0xa005, 0x00c0, 0x3e47, 0x70b3, 0x0001, 0x7087, ++ 0x0000, 0x708b, 0x000e, 0x1078, 0x3edb, 0x0078, 0x3e51, 0x1078, ++ 0x4224, 0x0f7f, 0x007c, 0x708b, 0x000b, 0x2011, 0xab0e, 0x22a0, ++ 0x20a9, 0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009, ++ 0x0000, 0x41a4, 0x1078, 0x4289, 0x20a3, 0x1106, 0x20a3, 0x0000, ++ 0x1078, 0x42d4, 0x0040, 0x3e70, 0x2013, 0x0000, 0x0078, 0x3e74, ++ 0x6030, 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6, ++ 0x60c3, 0x0084, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, ++ 0x0040, 0x3e9d, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084, ++ 0x00c0, 0x3e9b, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1106, 0x00c0, ++ 0x3e9b, 0x7834, 0xa005, 0x00c0, 0x3e9b, 0x708b, 0x000c, 0x1078, ++ 0x3e9f, 0x0078, 0x3e9d, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, ++ 0x000d, 0x1078, 0x4289, 0x20a3, 0x1107, 0x20a3, 0x0000, 0x2099, ++ 0xab8e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x60c3, 0x0084, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, ++ 0x0040, 0x3ed9, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084, ++ 0x00c0, 0x3ed7, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1107, 0x00c0, ++ 0x3ed7, 0x7834, 0xa005, 0x00c0, 0x3ed7, 0x7087, 0x0001, 0x1078, ++ 0x427b, 0x708b, 0x000e, 0x1078, 0x3edb, 0x0078, 0x3ed9, 0x1078, ++ 0x4224, 0x0f7f, 0x007c, 0x708b, 0x000f, 0x7083, 0x0000, 0x608b, ++ 0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, ++ 0x07d0, 0x2011, 0x41dc, 0x1078, 0x5a38, 0x007c, 0x7080, 0xa005, ++ 0x0040, 0x3ef6, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x007c, 0x708b, ++ 0x0011, 0x1078, 0x42d4, 0x00c0, 0x3f14, 0x716c, 0x81ff, 0x0040, ++ 0x3f14, 0x2009, 0x0000, 0x7070, 0xa084, 0x00ff, 0x1078, 0x254d, ++ 0xa186, 0x007e, 0x0040, 0x3f14, 0xa186, 0x0080, 0x0040, 0x3f14, ++ 0x2011, 0xab8e, 0x1078, 0x419d, 0x20e1, 0x9080, 0x20e1, 0x4000, ++ 0x2099, 0xab80, 0x20a1, 0x020b, 0x7480, 0xa480, 0x0018, 0xa080, ++ 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014, ++ 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3f55, ++ 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3f53, ++ 0x2079, 0xab80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x3f53, 0x7834, ++ 0xa005, 0x00c0, 0x3f53, 0x7a38, 0xd2fc, 0x0040, 0x3f4d, 0x70b0, ++ 0xa005, 0x00c0, 0x3f4d, 0x70b3, 0x0001, 0x708b, 0x0012, 0x1078, ++ 0x3f57, 0x0078, 0x3f55, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, ++ 0x0013, 0x1078, 0x4295, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, ++ 0x2011, 0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3f75, 0x7074, 0xa005, ++ 0x00c0, 0x3f75, 0x7150, 0xa186, 0xffff, 0x0040, 0x3f75, 0x1078, ++ 0x419d, 0x0040, 0x3f75, 0x1078, 0x42b8, 0x20a9, 0x0008, 0x2298, ++ 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, ++ 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3fad, ++ 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3fab, ++ 0x2079, 0xab80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3fab, 0x7834, ++ 0xa005, 0x00c0, 0x3fab, 0x7a38, 0xd2fc, 0x0040, 0x3fa5, 0x70b0, ++ 0xa005, 0x00c0, 0x3fa5, 0x70b3, 0x0001, 0x708b, 0x0014, 0x1078, ++ 0x3faf, 0x0078, 0x3fad, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, ++ 0x0015, 0x1078, 0x4295, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, ++ 0x2011, 0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3fd7, 0x7074, 0xa005, ++ 0x00c0, 0x3fd7, 0x7154, 0xa186, 0xffff, 0x0040, 0x3fd7, 0xa180, ++ 0x29c0, 0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x419d, 0x0040, ++ 0x3fd7, 0x1078, 0x3820, 0x0040, 0x3fd7, 0x1078, 0x256a, 0x20a9, ++ 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x60c3, 0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, ++ 0x0040, 0x402e, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, ++ 0x00c0, 0x402c, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1105, 0x00c0, ++ 0x402c, 0x7834, 0x2011, 0x0100, 0xa21e, 0x00c0, 0x400b, 0x7a38, ++ 0xd2fc, 0x0040, 0x4009, 0x70b0, 0xa005, 0x00c0, 0x4009, 0x70b3, ++ 0x0001, 0x0078, 0x401a, 0xa005, 0x00c0, 0x402c, 0x7a38, 0xd2fc, ++ 0x0040, 0x4018, 0x70b0, 0xa005, 0x00c0, 0x4018, 0x70b3, 0x0001, ++ 0x7087, 0x0000, 0x7a38, 0xd2f4, 0x0040, 0x4026, 0x2001, 0xa674, ++ 0x2004, 0xd0a4, 0x00c0, 0x4026, 0x70cf, 0x0008, 0x708b, 0x0016, ++ 0x1078, 0x4030, 0x0078, 0x402e, 0x1078, 0x4224, 0x0f7f, 0x007c, ++ 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xab80, 0x20a1, 0x020b, ++ 0x20a9, 0x000e, 0x53a6, 0x3430, 0x2011, 0xab8e, 0x708b, 0x0017, ++ 0x1078, 0x42d4, 0x00c0, 0x4050, 0x7074, 0xa005, 0x00c0, 0x4050, ++ 0x1078, 0x4104, 0x00c0, 0x405a, 0xa085, 0x0001, 0x1078, 0x256a, ++ 0x20a9, 0x0008, 0x2099, 0xab8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e, ++ 0x7080, 0xa005, 0x0040, 0x407f, 0x2011, 0x41dc, 0x1078, 0x5a45, ++ 0xa086, 0x0084, 0x00c0, 0x407d, 0x2079, 0xab80, 0x7a30, 0xa296, ++ 0x1106, 0x00c0, 0x407d, 0x7834, 0xa005, 0x00c0, 0x407d, 0x708b, ++ 0x0018, 0x1078, 0x4081, 0x0078, 0x407f, 0x1078, 0x4224, 0x0f7f, ++ 0x007c, 0x708b, 0x0019, 0x1078, 0x4295, 0x20a3, 0x1106, 0x20a3, ++ 0x0000, 0x3430, 0x2099, 0xab8e, 0x2039, 0xab0e, 0x27a0, 0x20a9, ++ 0x0040, 0x53a3, 0x1078, 0x42d4, 0x00c0, 0x40b5, 0x2728, 0x2514, ++ 0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007, ++ 0xa205, 0x202a, 0x6030, 0x2310, 0x8214, 0xa2a0, 0xab0e, 0x2414, ++ 0xa38c, 0x0001, 0x0040, 0x40b0, 0xa294, 0xff00, 0x0078, 0x40b3, ++ 0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9, ++ 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, ++ 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x40e7, ++ 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084, 0x00c0, 0x40e5, ++ 0x2079, 0xab80, 0x7a30, 0xa296, 0x1107, 0x00c0, 0x40e5, 0x7834, ++ 0xa005, 0x00c0, 0x40e5, 0x7087, 0x0001, 0x1078, 0x427b, 0x708b, ++ 0x001a, 0x1078, 0x40e9, 0x0078, 0x40e7, 0x1078, 0x4224, 0x0f7f, ++ 0x007c, 0x708b, 0x001b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, ++ 0xab80, 0x20a1, 0x020b, 0x7480, 0xa480, 0x0018, 0xa080, 0x0007, ++ 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x1078, ++ 0x420b, 0x007c, 0x007c, 0x007c, 0x087e, 0x097e, 0x2029, 0xa653, ++ 0x252c, 0x20a9, 0x0008, 0x2041, 0xab0e, 0x28a0, 0x2099, 0xab8e, ++ 0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0040, 0x411a, ++ 0x2011, 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6, 0xffff, 0x00c0, ++ 0x412c, 0xd5d4, 0x0040, 0x4127, 0x8210, 0x0078, 0x4128, 0x8211, ++ 0x00f0, 0x411a, 0x0078, 0x4194, 0x82ff, 0x00c0, 0x413e, 0xd5d4, ++ 0x0040, 0x4138, 0xa1a6, 0x3fff, 0x0040, 0x4124, 0x0078, 0x413c, ++ 0xa1a6, 0x3fff, 0x0040, 0x4194, 0xa18d, 0xc000, 0x20a9, 0x0010, ++ 0x2019, 0x0001, 0xd5d4, 0x0040, 0x4147, 0x2019, 0x0010, 0x2120, ++ 0xd5d4, 0x0040, 0x414e, 0x8423, 0x0078, 0x414f, 0x8424, 0x00c8, ++ 0x415c, 0xd5d4, 0x0040, 0x4157, 0x8319, 0x0078, 0x4158, 0x8318, ++ 0x00f0, 0x4148, 0x0078, 0x4194, 0x23a8, 0x2021, 0x0001, 0x8426, ++ 0x8425, 0x00f0, 0x4160, 0x2328, 0x8529, 0xa2be, 0x0007, 0x0040, ++ 0x4174, 0x007e, 0x2039, 0x0007, 0x2200, 0xa73a, 0x007f, 0x27a8, ++ 0xa5a8, 0x0010, 0x00f0, 0x4170, 0x7552, 0xa5c8, 0x29c0, 0x292c, ++ 0xa5ac, 0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0000, ++ 0x7572, 0x2018, 0x2304, 0xa405, 0x201a, 0x7077, 0x0001, 0x26a0, ++ 0x2898, 0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0xa085, 0x0001, 0x0078, 0x419a, 0xa006, 0x0078, 0x419a, 0xa006, ++ 0x1078, 0x1332, 0x097f, 0x087f, 0x007c, 0x2118, 0x2021, 0x0000, ++ 0x2001, 0x0007, 0xa39a, 0x0010, 0x0048, 0x41aa, 0x8420, 0x8001, ++ 0x0078, 0x41a2, 0x2118, 0x84ff, 0x0040, 0x41b3, 0xa39a, 0x0010, ++ 0x8421, 0x00c0, 0x41ae, 0x2021, 0x0001, 0x83ff, 0x0040, 0x41bc, ++ 0x8423, 0x8319, 0x00c0, 0x41b8, 0xa238, 0x2704, 0xa42c, 0x00c0, ++ 0x41d4, 0xa405, 0x203a, 0x7152, 0xa1a0, 0x29c0, 0x242c, 0xa5ac, ++ 0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0000, 0x7572, ++ 0x7077, 0x0001, 0xa084, 0x0000, 0x007c, 0x0e7e, 0x2071, 0xa600, ++ 0x707b, 0x0000, 0x0e7f, 0x007c, 0x0e7e, 0x0f7e, 0x2001, 0x0002, ++ 0x1078, 0x5ae6, 0x2079, 0x0100, 0x2071, 0x0140, 0x1078, 0x6e0f, ++ 0x7004, 0xa084, 0x4000, 0x0040, 0x41f1, 0x7003, 0x1000, 0x7003, ++ 0x0000, 0x127e, 0x2091, 0x8000, 0x2071, 0xa622, 0x2073, 0x0000, ++ 0x7840, 0x027e, 0x017e, 0x2009, 0x00f7, 0x1078, 0x42a1, 0x017f, ++ 0xa094, 0x0010, 0xa285, 0x0080, 0x7842, 0x7a42, 0x027f, 0x127f, ++ 0x0f7f, 0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x2011, 0xa8bb, ++ 0x2013, 0x0000, 0x7083, 0x0000, 0x127f, 0x20e1, 0x9080, 0x60a3, ++ 0x0056, 0x60a7, 0x9575, 0x1078, 0x6e06, 0x2009, 0x07d0, 0x2011, ++ 0x41dc, 0x1078, 0x5add, 0x007c, 0x017e, 0x027e, 0x0c7e, 0x127e, ++ 0x2091, 0x8000, 0x2011, 0x0003, 0x1078, 0x70e0, 0x2011, 0x0002, ++ 0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e, 0x2019, 0x0000, 0x1078, ++ 0x7058, 0x037f, 0x2009, 0x00f7, 0x1078, 0x42a1, 0x2061, 0xa8c4, ++ 0x601b, 0x0000, 0x601f, 0x0000, 0x2061, 0xa600, 0x6003, 0x0001, ++ 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d, ++ 0x2011, 0x4259, 0x1078, 0x5a38, 0x127f, 0x0c7f, 0x027f, 0x017f, ++ 0x007c, 0x0e7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2001, 0x0001, ++ 0x1078, 0x5ae6, 0x2071, 0x0100, 0x1078, 0x6e0f, 0x2071, 0x0140, ++ 0x7004, 0xa084, 0x4000, 0x0040, 0x4271, 0x7003, 0x1000, 0x7003, ++ 0x0000, 0x2001, 0x0001, 0x1078, 0x24e8, 0x1078, 0x4224, 0x127f, ++ 0x007f, 0x0e7f, 0x007c, 0x20a9, 0x0040, 0x20a1, 0xacc0, 0x2099, ++ 0xab8e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0, 0x00f0, 0x4281, ++ 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xab00, 0x20a1, ++ 0x020b, 0x20a9, 0x000c, 0x53a6, 0x007c, 0x20e1, 0x9080, 0x20e1, ++ 0x4000, 0x2099, 0xab80, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, ++ 0x007c, 0x0c7e, 0x007e, 0x2061, 0x0100, 0x810f, 0x2001, 0xa62f, ++ 0x2004, 0xa005, 0x00c0, 0x42b2, 0x6030, 0xa084, 0x00ff, 0xa105, ++ 0x0078, 0x42b4, 0xa185, 0x00f7, 0x604a, 0x007f, 0x0c7f, 0x007c, ++ 0x017e, 0x047e, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x42cb, ++ 0xa006, 0x2020, 0x2009, 0x002a, 0x1078, 0xa21d, 0x2001, 0xa60c, ++ 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0000, 0x1078, ++ 0x284f, 0x047f, 0x017f, 0x007c, 0x007e, 0x2001, 0xa60c, 0x2004, ++ 0xd09c, 0x0040, 0x42db, 0x007f, 0x007c, 0x007e, 0x017e, 0x127e, ++ 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0xa18d, 0x0006, 0x2102, ++ 0x127f, 0x017f, 0x007f, 0x007c, 0x157e, 0x20a9, 0x00ff, 0x2009, ++ 0xa735, 0xa006, 0x200a, 0x8108, 0x00f0, 0x42f2, 0x157f, 0x007c, ++ 0x0d7e, 0x037e, 0x157e, 0x137e, 0x147e, 0x2069, 0xa652, 0xa006, ++ 0x6002, 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x29c0, ++ 0x231c, 0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006, ++ 0x23a0, 0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4, ++ 0x603e, 0x6042, 0x604e, 0x6052, 0x6056, 0x605a, 0x605e, 0x6062, ++ 0x6066, 0x606a, 0x606e, 0x6072, 0x6076, 0x607a, 0x607e, 0x6082, ++ 0x6086, 0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x60ae, ++ 0x61a2, 0x0d7e, 0x60a4, 0xa06d, 0x0040, 0x4338, 0x1078, 0x13a4, ++ 0x60a7, 0x0000, 0x60a8, 0xa06d, 0x0040, 0x4340, 0x1078, 0x13a4, ++ 0x60ab, 0x0000, 0x0d7f, 0xa006, 0x604a, 0x6810, 0x603a, 0x680c, ++ 0x6046, 0x6814, 0xa084, 0x00ff, 0x6042, 0x147f, 0x137f, 0x157f, ++ 0x037f, 0x0d7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x6944, 0x6e48, ++ 0xa684, 0x3fff, 0xa082, 0x4000, 0x00c8, 0x4424, 0xa18c, 0xff00, ++ 0x810f, 0xa182, 0x00ff, 0x00c8, 0x442a, 0x2001, 0xa60c, 0x2004, ++ 0xa084, 0x0003, 0x0040, 0x4385, 0x2001, 0xa60c, 0x2004, 0xd084, ++ 0x00c0, 0x4405, 0xa188, 0xa735, 0x2104, 0xa065, 0x0040, 0x4405, ++ 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x4405, 0x6000, ++ 0xd0c4, 0x0040, 0x4405, 0x0078, 0x4392, 0xa188, 0xa735, 0x2104, ++ 0xa065, 0x0040, 0x43e9, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, ++ 0x00c0, 0x43ef, 0x60a4, 0xa00d, 0x0040, 0x439a, 0x1078, 0x4817, ++ 0x0040, 0x43e3, 0x60a8, 0xa00d, 0x0040, 0x43b4, 0x1078, 0x486a, ++ 0x00c0, 0x43b4, 0x694c, 0xd1fc, 0x00c0, 0x43aa, 0x1078, 0x44df, ++ 0x0078, 0x43de, 0x1078, 0x4484, 0x694c, 0xd1ec, 0x00c0, 0x43de, ++ 0x1078, 0x46d6, 0x0078, 0x43de, 0x694c, 0xa184, 0xa000, 0x0040, ++ 0x43ce, 0xd1ec, 0x0040, 0x43c7, 0xd1fc, 0x0040, 0x43c3, 0x1078, ++ 0x46e7, 0x0078, 0x43ca, 0x1078, 0x46e7, 0x0078, 0x43ce, 0xd1fc, ++ 0x0040, 0x43ce, 0x1078, 0x4484, 0x0078, 0x43de, 0x6050, 0xa00d, ++ 0x0040, 0x43d9, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, 0x0078, ++ 0x43de, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x1078, 0x5da9, ++ 0xa006, 0x127f, 0x007c, 0x2001, 0x0005, 0x2009, 0x0000, 0x0078, ++ 0x442e, 0x2001, 0x0028, 0x2009, 0x0000, 0x0078, 0x442e, 0xa082, ++ 0x0006, 0x00c8, 0x4405, 0x60a0, 0xd0bc, 0x00c0, 0x4401, 0x6100, ++ 0xd1fc, 0x0040, 0x4392, 0x2001, 0x0029, 0x2009, 0x1000, 0x0078, ++ 0x442e, 0x2001, 0x0028, 0x0078, 0x4420, 0x2009, 0xa60c, 0x210c, ++ 0xd18c, 0x0040, 0x440f, 0x2001, 0x0004, 0x0078, 0x4420, 0xd184, ++ 0x0040, 0x4416, 0x2001, 0x0004, 0x0078, 0x4420, 0x2001, 0x0029, ++ 0x6100, 0xd1fc, 0x0040, 0x4420, 0x2009, 0x1000, 0x0078, 0x442e, ++ 0x2009, 0x0000, 0x0078, 0x442e, 0x2001, 0x0029, 0x2009, 0x0000, ++ 0x0078, 0x442e, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x127f, ++ 0x007c, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, 0x4000, 0x00c8, ++ 0x447e, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x00c8, 0x4464, ++ 0xa188, 0xa735, 0x2104, 0xa065, 0x0040, 0x4464, 0x6004, 0xa084, ++ 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x446a, 0x684c, 0xd0ec, 0x0040, ++ 0x4457, 0x1078, 0x46e7, 0x1078, 0x4484, 0x0078, 0x445f, 0x1078, ++ 0x4484, 0x684c, 0xd0fc, 0x0040, 0x445f, 0x1078, 0x46d6, 0x1078, ++ 0x472f, 0xa006, 0x0078, 0x4482, 0x2001, 0x0028, 0x2009, 0x0000, ++ 0x0078, 0x4482, 0xa082, 0x0006, 0x00c8, 0x4478, 0x6100, 0xd1fc, ++ 0x0040, 0x444d, 0x2001, 0x0029, 0x2009, 0x1000, 0x0078, 0x4482, ++ 0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x4482, 0x2001, 0x0029, ++ 0x2009, 0x0000, 0xa005, 0x007c, 0x127e, 0x2091, 0x8000, 0x6050, ++ 0xa00d, 0x0040, 0x4492, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, ++ 0x127f, 0x007c, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0078, ++ 0x4490, 0x127e, 0x2091, 0x8000, 0x604c, 0xa005, 0x0040, 0x44af, ++ 0x0e7e, 0x2071, 0xa8b1, 0x7004, 0xa086, 0x0002, 0x0040, 0x44b6, ++ 0x0e7f, 0x604c, 0x6802, 0x2d00, 0x604e, 0x127f, 0x007c, 0x2d00, ++ 0x6052, 0x604e, 0x6803, 0x0000, 0x0078, 0x44ad, 0x701c, 0xac06, ++ 0x00c0, 0x44a8, 0x604c, 0x2070, 0x7000, 0x6802, 0x2d00, 0x7002, ++ 0x0e7f, 0x127f, 0x007c, 0x127e, 0x2091, 0x8000, 0x604c, 0xa06d, ++ 0x0040, 0x44d1, 0x6800, 0xa005, 0x00c0, 0x44cf, 0x6052, 0x604e, ++ 0xad05, 0x127f, 0x007c, 0x604c, 0xa06d, 0x0040, 0x44de, 0x6800, ++ 0xa005, 0x00c0, 0x44dc, 0x6052, 0x604e, 0xad05, 0x007c, 0x6803, ++ 0x0000, 0x6084, 0xa00d, 0x0040, 0x44e9, 0x2d00, 0x200a, 0x6086, ++ 0x007c, 0x2d00, 0x6086, 0x6082, 0x0078, 0x44e8, 0x127e, 0x0c7e, ++ 0x027e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005, 0x0040, ++ 0x44fc, 0xc285, 0x0078, 0x44fd, 0xc284, 0x6202, 0x027f, 0x0c7f, ++ 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x6218, 0x2260, ++ 0x6204, 0x007e, 0xa086, 0x0006, 0x00c0, 0x4521, 0x609c, 0xd0ac, ++ 0x0040, 0x4521, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x4521, ++ 0xa284, 0xff00, 0x8007, 0xa086, 0x0007, 0x00c0, 0x4521, 0x2011, ++ 0x0600, 0x007f, 0xa294, 0xff00, 0xa215, 0x6206, 0x007e, 0xa086, ++ 0x0006, 0x00c0, 0x4531, 0x6290, 0x82ff, 0x00c0, 0x4531, 0x1078, ++ 0x1332, 0x007f, 0x0c7f, 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, ++ 0x8000, 0x6218, 0x2260, 0x6204, 0x007e, 0xa086, 0x0006, 0x00c0, ++ 0x4553, 0x609c, 0xd0a4, 0x0040, 0x4553, 0x2001, 0xa653, 0x2004, ++ 0xd0ac, 0x00c0, 0x4553, 0xa284, 0x00ff, 0xa086, 0x0007, 0x00c0, ++ 0x4553, 0x2011, 0x0006, 0x007f, 0xa294, 0x00ff, 0x8007, 0xa215, ++ 0x6206, 0x0c7f, 0x127f, 0x007c, 0x027e, 0xa182, 0x00ff, 0x0048, ++ 0x4565, 0xa085, 0x0001, 0x0078, 0x457d, 0xa190, 0xa735, 0x2204, ++ 0xa065, 0x00c0, 0x457c, 0x017e, 0x0d7e, 0x1078, 0x1370, 0x2d60, ++ 0x0d7f, 0x017f, 0x0040, 0x4561, 0x2c00, 0x2012, 0x60a7, 0x0000, ++ 0x60ab, 0x0000, 0x1078, 0x42f8, 0xa006, 0x027f, 0x007c, 0x127e, ++ 0x2091, 0x8000, 0x027e, 0xa182, 0x00ff, 0x0048, 0x458b, 0xa085, ++ 0x0001, 0x0078, 0x45c1, 0x0d7e, 0xa190, 0xa735, 0x2204, 0xa06d, ++ 0x0040, 0x45bf, 0x2013, 0x0000, 0x0d7e, 0x0c7e, 0x2d60, 0x60a4, ++ 0xa06d, 0x0040, 0x459d, 0x1078, 0x13a4, 0x60a8, 0xa06d, 0x0040, ++ 0x45a3, 0x1078, 0x13a4, 0x0c7f, 0x0d7f, 0x0d7e, 0x0c7e, 0x68ac, ++ 0x2060, 0x8cff, 0x0040, 0x45bb, 0x600c, 0x007e, 0x6010, 0x2068, ++ 0x1078, 0x8d06, 0x0040, 0x45b6, 0x1078, 0x13b4, 0x1078, 0x772d, ++ 0x0c7f, 0x0078, 0x45a9, 0x0c7f, 0x0d7f, 0x1078, 0x13a4, 0x0d7f, ++ 0xa006, 0x027f, 0x127f, 0x007c, 0x017e, 0xa182, 0x00ff, 0x0048, ++ 0x45cd, 0xa085, 0x0001, 0x0078, 0x45d4, 0xa188, 0xa735, 0x2104, ++ 0xa065, 0x0040, 0x45c9, 0xa006, 0x017f, 0x007c, 0x0d7e, 0x157e, ++ 0x137e, 0x147e, 0x600b, 0x0000, 0x600f, 0x0000, 0x6000, 0xc08c, ++ 0x6002, 0x2069, 0xab8e, 0x6808, 0x605e, 0x6810, 0x6062, 0x6138, ++ 0xa10a, 0x0048, 0x45ec, 0x603a, 0x6814, 0x6066, 0x2099, 0xab96, ++ 0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099, 0xab9a, ++ 0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069, 0xabae, ++ 0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818, 0x6076, ++ 0x60a0, 0xa086, 0x007e, 0x00c0, 0x4611, 0x2069, 0xab8e, 0x690c, ++ 0x616e, 0xa182, 0x0211, 0x00c8, 0x4619, 0x2009, 0x0008, 0x0078, ++ 0x4643, 0xa182, 0x0259, 0x00c8, 0x4621, 0x2009, 0x0007, 0x0078, ++ 0x4643, 0xa182, 0x02c1, 0x00c8, 0x4629, 0x2009, 0x0006, 0x0078, ++ 0x4643, 0xa182, 0x0349, 0x00c8, 0x4631, 0x2009, 0x0005, 0x0078, ++ 0x4643, 0xa182, 0x0421, 0x00c8, 0x4639, 0x2009, 0x0004, 0x0078, ++ 0x4643, 0xa182, 0x0581, 0x00c8, 0x4641, 0x2009, 0x0003, 0x0078, ++ 0x4643, 0x2009, 0x0002, 0x6192, 0x147f, 0x137f, 0x157f, 0x0d7f, ++ 0x007c, 0x017e, 0x027e, 0x0e7e, 0x2071, 0xab8d, 0x2e04, 0x6896, ++ 0x2071, 0xab8e, 0x7004, 0x689a, 0x701c, 0x689e, 0x6a00, 0x2009, ++ 0xa672, 0x210c, 0xd0bc, 0x0040, 0x4663, 0xd1ec, 0x0040, 0x4663, ++ 0xc2ad, 0x0078, 0x4664, 0xc2ac, 0xd0c4, 0x0040, 0x466d, 0xd1e4, ++ 0x0040, 0x466d, 0xc2bd, 0x0078, 0x466e, 0xc2bc, 0x6a02, 0x0e7f, ++ 0x027f, 0x017f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4, ++ 0xa06d, 0x0040, 0x4697, 0x6900, 0x81ff, 0x00c0, 0x46ab, 0x6a04, ++ 0xa282, 0x0010, 0x00c8, 0x46b0, 0xad88, 0x0004, 0x20a9, 0x0010, ++ 0x2104, 0xa086, 0xffff, 0x0040, 0x4692, 0x8108, 0x00f0, 0x4688, ++ 0x1078, 0x1332, 0x260a, 0x8210, 0x6a06, 0x0078, 0x46ab, 0x1078, ++ 0x138b, 0x0040, 0x46b0, 0x2d00, 0x60a6, 0x6803, 0x0000, 0xad88, ++ 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x00f0, 0x46a3, ++ 0x6807, 0x0001, 0x6e12, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, ++ 0xa006, 0x0078, 0x46ad, 0x127e, 0x2091, 0x8000, 0x0d7e, 0x60a4, ++ 0xa00d, 0x0040, 0x46d3, 0x2168, 0x6800, 0xa005, 0x00c0, 0x46cf, ++ 0x1078, 0x4817, 0x00c0, 0x46d3, 0x200b, 0xffff, 0x6804, 0xa08a, ++ 0x0002, 0x0048, 0x46cf, 0x8001, 0x6806, 0x0078, 0x46d3, 0x1078, ++ 0x13a4, 0x60a7, 0x0000, 0x0d7f, 0x127f, 0x007c, 0x127e, 0x2091, ++ 0x8000, 0x1078, 0x487f, 0x0078, 0x46df, 0x1078, 0x4484, 0x1078, ++ 0x4775, 0x00c0, 0x46dd, 0x1078, 0x472f, 0x127f, 0x007c, 0x0d7e, ++ 0x127e, 0x2091, 0x8000, 0x60a8, 0xa06d, 0x0040, 0x470b, 0x6950, ++ 0x81ff, 0x00c0, 0x471f, 0x6a54, 0xa282, 0x0010, 0x00c8, 0x472c, ++ 0xad88, 0x0018, 0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0040, ++ 0x4706, 0x8108, 0x00f0, 0x46fc, 0x1078, 0x1332, 0x260a, 0x8210, ++ 0x6a56, 0x0078, 0x471f, 0x1078, 0x138b, 0x0040, 0x472c, 0x2d00, ++ 0x60aa, 0x6853, 0x0000, 0xad88, 0x0018, 0x20a9, 0x0010, 0x200b, ++ 0xffff, 0x8108, 0x00f0, 0x4717, 0x6857, 0x0001, 0x6e62, 0x0078, ++ 0x4723, 0x1078, 0x44df, 0x1078, 0x4739, 0x00c0, 0x4721, 0xa085, ++ 0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006, 0x0078, 0x4729, 0x127e, ++ 0x2091, 0x8000, 0x1078, 0x5da9, 0x127f, 0x007c, 0xa01e, 0x0078, ++ 0x473b, 0x2019, 0x0001, 0xa00e, 0x127e, 0x2091, 0x8000, 0x604c, ++ 0x2068, 0x6000, 0xd0dc, 0x00c0, 0x4759, 0x8dff, 0x0040, 0x4770, ++ 0x83ff, 0x0040, 0x4751, 0x6848, 0xa606, 0x0040, 0x475e, 0x0078, ++ 0x4759, 0x683c, 0xa406, 0x00c0, 0x4759, 0x6840, 0xa506, 0x0040, ++ 0x475e, 0x2d08, 0x6800, 0x2068, 0x0078, 0x4745, 0x1078, 0x7233, ++ 0x6a00, 0x604c, 0xad06, 0x00c0, 0x4768, 0x624e, 0x0078, 0x476b, ++ 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, 0x4770, 0x6152, 0x8dff, ++ 0x127f, 0x007c, 0xa01e, 0x0078, 0x4777, 0x2019, 0x0001, 0xa00e, ++ 0x6080, 0x2068, 0x8dff, 0x0040, 0x47a3, 0x83ff, 0x0040, 0x4786, ++ 0x6848, 0xa606, 0x0040, 0x4793, 0x0078, 0x478e, 0x683c, 0xa406, ++ 0x00c0, 0x478e, 0x6840, 0xa506, 0x0040, 0x4793, 0x2d08, 0x6800, ++ 0x2068, 0x0078, 0x477a, 0x6a00, 0x6080, 0xad06, 0x00c0, 0x479b, ++ 0x6282, 0x0078, 0x479e, 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, ++ 0x47a3, 0x6186, 0x8dff, 0x007c, 0xa016, 0x1078, 0x4810, 0x00c0, ++ 0x47ab, 0x2011, 0x0001, 0x1078, 0x4863, 0x00c0, 0x47b1, 0xa295, ++ 0x0002, 0x007c, 0x1078, 0x489b, 0x0040, 0x47ba, 0x1078, 0x8dca, ++ 0x0078, 0x47bc, 0xa085, 0x0001, 0x007c, 0x1078, 0x489b, 0x0040, ++ 0x47c5, 0x1078, 0x8d62, 0x0078, 0x47c7, 0xa085, 0x0001, 0x007c, ++ 0x1078, 0x489b, 0x0040, 0x47d0, 0x1078, 0x8dac, 0x0078, 0x47d2, ++ 0xa085, 0x0001, 0x007c, 0x1078, 0x489b, 0x0040, 0x47db, 0x1078, ++ 0x8d7e, 0x0078, 0x47dd, 0xa085, 0x0001, 0x007c, 0x1078, 0x489b, ++ 0x0040, 0x47e6, 0x1078, 0x8de8, 0x0078, 0x47e8, 0xa085, 0x0001, ++ 0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x8000, 0x6080, 0xa06d, ++ 0x0040, 0x4808, 0x6800, 0x007e, 0x6837, 0x0103, 0x6b4a, 0x6847, ++ 0x0000, 0x1078, 0x8f7d, 0x007e, 0x6000, 0xd0fc, 0x0040, 0x4802, ++ 0x1078, 0xa4ed, 0x007f, 0x1078, 0x4a73, 0x007f, 0x0078, 0x47ef, ++ 0x6083, 0x0000, 0x6087, 0x0000, 0x0d7f, 0x007f, 0x127f, 0x007c, ++ 0x60a4, 0xa00d, 0x00c0, 0x4817, 0xa085, 0x0001, 0x007c, 0x0e7e, ++ 0x2170, 0x7000, 0xa005, 0x00c0, 0x482c, 0x20a9, 0x0010, 0xae88, ++ 0x0004, 0x2104, 0xa606, 0x0040, 0x482c, 0x8108, 0x00f0, 0x4821, ++ 0xa085, 0x0001, 0x0078, 0x482d, 0xa006, 0x0e7f, 0x007c, 0x0d7e, ++ 0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x00c0, 0x483d, 0x1078, ++ 0x138b, 0x0040, 0x484f, 0x2d00, 0x60a6, 0x6803, 0x0001, 0x6807, ++ 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, ++ 0x00f0, 0x4845, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006, ++ 0x0078, 0x484c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, ++ 0x0040, 0x4860, 0x60a7, 0x0000, 0x1078, 0x13a4, 0xa085, 0x0001, ++ 0x127f, 0x0d7f, 0x007c, 0x60a8, 0xa00d, 0x00c0, 0x486a, 0xa085, ++ 0x0001, 0x007c, 0x0e7e, 0x2170, 0x7050, 0xa005, 0x00c0, 0x487d, ++ 0x20a9, 0x0010, 0xae88, 0x0018, 0x2104, 0xa606, 0x0040, 0x487d, ++ 0x8108, 0x00f0, 0x4874, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x127e, ++ 0x2091, 0x8000, 0x1078, 0x4863, 0x00c0, 0x4899, 0x200b, 0xffff, ++ 0x0d7e, 0x60a8, 0x2068, 0x6854, 0xa08a, 0x0002, 0x0048, 0x4894, ++ 0x8001, 0x6856, 0x0078, 0x4898, 0x1078, 0x13a4, 0x60ab, 0x0000, ++ 0x0d7f, 0x127f, 0x007c, 0x609c, 0xd0a4, 0x007c, 0x0f7e, 0x71b0, ++ 0x81ff, 0x00c0, 0x48b9, 0x71cc, 0xd19c, 0x0040, 0x48b9, 0x2001, ++ 0x007e, 0xa080, 0xa735, 0x2004, 0xa07d, 0x0040, 0x48b9, 0x7804, ++ 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x48b9, 0x7800, 0xc0ed, ++ 0x7802, 0x2079, 0xa652, 0x7804, 0xd0a4, 0x0040, 0x48df, 0x157e, ++ 0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x45c4, ++ 0x00c0, 0x48d9, 0x6004, 0xa084, 0xff00, 0x8007, 0xa096, 0x0004, ++ 0x0040, 0x48d6, 0xa086, 0x0006, 0x00c0, 0x48d9, 0x6000, 0xc0ed, ++ 0x6002, 0x017f, 0x8108, 0x00f0, 0x48c5, 0x0c7f, 0x157f, 0x1078, ++ 0x4967, 0x0040, 0x48e8, 0x2001, 0xa8a1, 0x200c, 0x0078, 0x48f0, ++ 0x2079, 0xa652, 0x7804, 0xd0a4, 0x0040, 0x48f4, 0x2009, 0x07d0, ++ 0x2011, 0x48f6, 0x1078, 0x5add, 0x0f7f, 0x007c, 0x2011, 0x48f6, ++ 0x1078, 0x5a45, 0x1078, 0x4967, 0x0040, 0x491e, 0x2001, 0xa7b3, ++ 0x2004, 0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102, 0x2001, 0xa653, ++ 0x2004, 0xd0a4, 0x0040, 0x4912, 0x2009, 0x07d0, 0x2011, 0x48f6, ++ 0x1078, 0x5add, 0x0e7e, 0x2071, 0xa600, 0x706f, 0x0000, 0x7073, ++ 0x0000, 0x1078, 0x2677, 0x0e7f, 0x0078, 0x4956, 0x157e, 0x0c7e, ++ 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x45c4, 0x00c0, ++ 0x4950, 0x6000, 0xd0ec, 0x0040, 0x4950, 0x047e, 0x62a0, 0xa294, ++ 0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x1078, 0xa21d, 0x6000, ++ 0xc0e5, 0xc0ec, 0x6002, 0x6004, 0xa084, 0x00ff, 0xa085, 0x0700, ++ 0x6006, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, ++ 0x1078, 0x5e0a, 0x2009, 0x0000, 0x1078, 0x9f8b, 0x077f, 0x047f, ++ 0x017f, 0x8108, 0x00f0, 0x4924, 0x0c7f, 0x157f, 0x007c, 0x0c7e, ++ 0x6018, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x0c7f, 0x007c, 0x7818, ++ 0x2004, 0xd0ac, 0x007c, 0x7818, 0x2004, 0xd0bc, 0x007c, 0x0f7e, ++ 0x2001, 0xa7b3, 0x2004, 0xa07d, 0x0040, 0x4970, 0x7800, 0xd0ec, ++ 0x0f7f, 0x007c, 0x127e, 0x027e, 0x2091, 0x8000, 0x007e, 0x62a0, ++ 0xa290, 0xa735, 0x2204, 0xac06, 0x10c0, 0x1332, 0x007f, 0x6200, ++ 0xa005, 0x0040, 0x4986, 0xc2fd, 0x0078, 0x4987, 0xc2fc, 0x6202, ++ 0x027f, 0x127f, 0x007c, 0x2011, 0xa633, 0x2204, 0xd0cc, 0x0040, ++ 0x4998, 0x2001, 0xa89f, 0x200c, 0x2011, 0x4999, 0x1078, 0x5add, ++ 0x007c, 0x2011, 0x4999, 0x1078, 0x5a45, 0x2011, 0xa633, 0x2204, ++ 0xc0cc, 0x2012, 0x007c, 0x2071, 0xa714, 0x7003, 0x0001, 0x7007, ++ 0x0000, 0x7013, 0x0000, 0x7017, 0x0000, 0x701b, 0x0000, 0x701f, ++ 0x0000, 0x700b, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000, 0x705b, ++ 0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x2071, 0xa87d, 0x7003, ++ 0xa714, 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0xa85d, 0x7013, ++ 0x0020, 0x7017, 0x0040, 0x7037, 0x0000, 0x007c, 0x017e, 0x0e7e, ++ 0x2071, 0xa835, 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001, ++ 0xa653, 0x2004, 0xd0fc, 0x00c0, 0x49e8, 0x2001, 0xa653, 0x2004, ++ 0xa00e, 0xd09c, 0x0040, 0x49e5, 0x8108, 0x7102, 0x0078, 0x4a3b, ++ 0x2001, 0xa672, 0x200c, 0xa184, 0x000f, 0x2009, 0xa673, 0x210c, ++ 0x0079, 0x49f2, 0x49dd, 0x4a13, 0x4a1b, 0x4a26, 0x4a2c, 0x49dd, ++ 0x49dd, 0x49dd, 0x4a02, 0x49dd, 0x49dd, 0x49dd, 0x49dd, 0x49dd, ++ 0x49dd, 0x49dd, 0x7003, 0x0004, 0x137e, 0x147e, 0x157e, 0x2099, ++ 0xa676, 0x20a1, 0xa886, 0x20a9, 0x0004, 0x53a3, 0x157f, 0x147f, ++ 0x137f, 0x0078, 0x4a3b, 0x708f, 0x0005, 0x7007, 0x0122, 0x2001, ++ 0x0002, 0x0078, 0x4a21, 0x708f, 0x0002, 0x7007, 0x0121, 0x2001, ++ 0x0003, 0x7002, 0x7097, 0x0001, 0x0078, 0x4a38, 0x7007, 0x0122, ++ 0x2001, 0x0002, 0x0078, 0x4a30, 0x7007, 0x0121, 0x2001, 0x0003, ++ 0x7002, 0xa006, 0x7096, 0x708e, 0xa184, 0xff00, 0x8007, 0x709a, ++ 0xa184, 0x00ff, 0x7092, 0x0e7f, 0x017f, 0x007c, 0x0e7e, 0x2071, ++ 0xa714, 0x684c, 0xa005, 0x00c0, 0x4a4c, 0x7028, 0xc085, 0x702a, ++ 0xa085, 0x0001, 0x0078, 0x4a71, 0x6a60, 0x7236, 0x6b64, 0x733a, ++ 0x6868, 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e, ++ 0x6844, 0x7032, 0x2009, 0x000d, 0x200a, 0x700b, 0x0000, 0x8007, ++ 0x8006, 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, ++ 0xa319, 0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, ++ 0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x027e, 0x6838, 0xd0fc, 0x00c0, ++ 0x4ac9, 0x6804, 0xa00d, 0x0040, 0x4a8f, 0x0d7e, 0x2071, 0xa600, ++ 0xa016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, ++ 0x00c0, 0x4a82, 0x702e, 0x70ac, 0xa200, 0x70ae, 0x0d7f, 0x2071, ++ 0xa714, 0x701c, 0xa005, 0x00c0, 0x4adb, 0x0068, 0x4ad9, 0x2071, ++ 0xa835, 0x7200, 0x82ff, 0x0040, 0x4ad9, 0x6934, 0xa186, 0x0103, ++ 0x00c0, 0x4aec, 0x6948, 0x6844, 0xa105, 0x00c0, 0x4acc, 0x2009, ++ 0x8020, 0x2200, 0x0079, 0x4aac, 0x4ad9, 0x4ab1, 0x4b09, 0x4b17, ++ 0x4ad9, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4ad9, 0x7122, ++ 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080, ++ 0x2071, 0xa600, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70ac, 0x8000, ++ 0x70ae, 0x027f, 0x0e7f, 0x007c, 0x6844, 0xa086, 0x0100, 0x00c0, ++ 0x4ad9, 0x6868, 0xa005, 0x00c0, 0x4ad9, 0x2009, 0x8020, 0x0078, ++ 0x4aa9, 0x2071, 0xa714, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000, ++ 0x7012, 0x7018, 0xa06d, 0x711a, 0x0040, 0x4ae9, 0x6902, 0x0078, ++ 0x4aea, 0x711e, 0x0078, 0x4ac9, 0xa18c, 0x00ff, 0xa186, 0x0017, ++ 0x0040, 0x4afa, 0xa186, 0x001e, 0x0040, 0x4afa, 0xa18e, 0x001f, ++ 0x00c0, 0x4ad9, 0x684c, 0xd0cc, 0x0040, 0x4ad9, 0x6850, 0xa084, ++ 0x00ff, 0xa086, 0x0001, 0x00c0, 0x4ad9, 0x2009, 0x8021, 0x0078, ++ 0x4aa9, 0x7084, 0x8008, 0xa092, 0x001e, 0x00c8, 0x4ad9, 0x7186, ++ 0xae90, 0x0003, 0xa210, 0x683c, 0x2012, 0x0078, 0x4b27, 0x7084, ++ 0x8008, 0xa092, 0x000f, 0x00c8, 0x4ad9, 0x7186, 0xae90, 0x0003, ++ 0x8003, 0xa210, 0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7088, ++ 0xa10a, 0x0048, 0x4ac0, 0x718c, 0x7084, 0xa10a, 0x0048, 0x4ac0, ++ 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4ac0, 0x2071, 0xa835, ++ 0x7000, 0xa086, 0x0002, 0x00c0, 0x4b47, 0x1078, 0x4dc3, 0x2071, ++ 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4ac0, 0x1078, ++ 0x4dee, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, ++ 0x4ac0, 0x007e, 0x684c, 0x007e, 0x6837, 0x0103, 0x20a9, 0x001c, ++ 0xad80, 0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x007f, 0xa084, ++ 0x00ff, 0x684e, 0x007f, 0x684a, 0x6952, 0x007c, 0x2071, 0xa714, ++ 0x7004, 0x0079, 0x4b6b, 0x4b75, 0x4b86, 0x4d94, 0x4d95, 0x4dbc, ++ 0x4dc2, 0x4b76, 0x4d82, 0x4d23, 0x4da5, 0x007c, 0x127e, 0x2091, ++ 0x8000, 0x0068, 0x4b85, 0x2009, 0x000d, 0x7030, 0x200a, 0x2091, ++ 0x4080, 0x7007, 0x0001, 0x700b, 0x0000, 0x127f, 0x2069, 0xa8c4, ++ 0x6844, 0xa005, 0x0050, 0x4bae, 0x00c0, 0x4bae, 0x127e, 0x2091, ++ 0x8000, 0x2069, 0x0000, 0x6934, 0x2001, 0xa720, 0x2004, 0xa10a, ++ 0x0040, 0x4ba9, 0x0068, 0x4bad, 0x2069, 0x0000, 0x6818, 0xd084, ++ 0x00c0, 0x4bad, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, ++ 0x4080, 0x2069, 0xa8c4, 0x6847, 0xffff, 0x127f, 0x2069, 0xa600, ++ 0x6848, 0x6964, 0xa102, 0x2069, 0xa835, 0x688a, 0x6984, 0x701c, ++ 0xa06d, 0x0040, 0x4bc0, 0x81ff, 0x0040, 0x4c08, 0x0078, 0x4bd6, ++ 0x81ff, 0x0040, 0x4cda, 0x2071, 0xa835, 0x7184, 0x7088, 0xa10a, ++ 0x00c8, 0x4bd6, 0x7190, 0x2071, 0xa8c4, 0x7040, 0xa005, 0x0040, ++ 0x4bd6, 0x00d0, 0x4cda, 0x7142, 0x0078, 0x4cda, 0x2071, 0xa835, ++ 0x718c, 0x127e, 0x2091, 0x8000, 0x7084, 0xa10a, 0x0048, 0x4cf7, ++ 0x0068, 0x4c8c, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4c8c, ++ 0x2001, 0xffff, 0x2071, 0xa8c4, 0x7042, 0x2071, 0xa835, 0x7000, ++ 0xa086, 0x0002, 0x00c0, 0x4bfe, 0x1078, 0x4dc3, 0x2071, 0x0000, ++ 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4c8c, 0x1078, 0x4dee, ++ 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4c8c, ++ 0x2071, 0xa835, 0x7000, 0xa005, 0x0040, 0x4cb9, 0x6934, 0xa186, ++ 0x0103, 0x00c0, 0x4c8f, 0x684c, 0xd0bc, 0x00c0, 0x4cb9, 0x6948, ++ 0x6844, 0xa105, 0x00c0, 0x4cac, 0x2009, 0x8020, 0x2071, 0xa835, ++ 0x7000, 0x0079, 0x4c23, 0x4cb9, 0x4c71, 0x4c49, 0x4c5b, 0x4c28, ++ 0x137e, 0x147e, 0x157e, 0x2099, 0xa676, 0x20a1, 0xa886, 0x20a9, ++ 0x0004, 0x53a3, 0x157f, 0x147f, 0x137f, 0x2071, 0xa87d, 0xad80, ++ 0x000f, 0x700e, 0x7013, 0x0002, 0x7007, 0x0002, 0x700b, 0x0000, ++ 0x2e10, 0x1078, 0x13db, 0x2071, 0xa714, 0x7007, 0x0009, 0x0078, ++ 0x4cda, 0x7084, 0x8008, 0xa092, 0x001e, 0x00c8, 0x4cda, 0xae90, ++ 0x0003, 0xa210, 0x683c, 0x2012, 0x7186, 0x2071, 0xa714, 0x1078, ++ 0x4e4c, 0x0078, 0x4cda, 0x7084, 0x8008, 0xa092, 0x000f, 0x00c8, ++ 0x4cda, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, 0x8210, ++ 0x6840, 0x2012, 0x7186, 0x2071, 0xa714, 0x1078, 0x4e4c, 0x0078, ++ 0x4cda, 0x127e, 0x2091, 0x8000, 0x0068, 0x4c8c, 0x2071, 0x0000, ++ 0x7018, 0xd084, 0x00c0, 0x4c8c, 0x7122, 0x683c, 0x7026, 0x6840, ++ 0x702a, 0x701b, 0x0001, 0x2091, 0x4080, 0x127f, 0x2071, 0xa714, ++ 0x1078, 0x4e4c, 0x0078, 0x4cda, 0x127f, 0x0078, 0x4cda, 0xa18c, ++ 0x00ff, 0xa186, 0x0017, 0x0040, 0x4c9d, 0xa186, 0x001e, 0x0040, ++ 0x4c9d, 0xa18e, 0x001f, 0x00c0, 0x4cb9, 0x684c, 0xd0cc, 0x0040, ++ 0x4cb9, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0, 0x4cb9, ++ 0x2009, 0x8021, 0x0078, 0x4c1e, 0x6844, 0xa086, 0x0100, 0x00c0, ++ 0x4cb9, 0x6868, 0xa005, 0x00c0, 0x4cb9, 0x2009, 0x8020, 0x0078, ++ 0x4c1e, 0x2071, 0xa714, 0x1078, 0x4e60, 0x0040, 0x4cda, 0x2071, ++ 0xa714, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003, ++ 0x00c0, 0x4cd1, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0040, 0x4cd1, ++ 0x710e, 0x7007, 0x0003, 0x1078, 0x4e80, 0x7050, 0xa086, 0x0100, ++ 0x0040, 0x4d95, 0x127e, 0x2091, 0x8000, 0x2071, 0xa714, 0x7008, ++ 0xa086, 0x0001, 0x00c0, 0x4cf5, 0x0068, 0x4cf5, 0x2009, 0x000d, ++ 0x7030, 0x200a, 0x2091, 0x4080, 0x700b, 0x0000, 0x7004, 0xa086, ++ 0x0006, 0x00c0, 0x4cf5, 0x7007, 0x0001, 0x127f, 0x007c, 0x2071, ++ 0xa714, 0x1078, 0x4e60, 0x0040, 0x4d20, 0x2071, 0xa835, 0x7084, ++ 0x700a, 0x20a9, 0x0020, 0x2099, 0xa836, 0x20a1, 0xa85d, 0x53a3, ++ 0x7087, 0x0000, 0x2071, 0xa714, 0x2069, 0xa87d, 0x706c, 0x6826, ++ 0x7070, 0x682a, 0x7074, 0x682e, 0x7078, 0x6832, 0x2d10, 0x1078, ++ 0x13db, 0x7007, 0x0008, 0x2001, 0xffff, 0x2071, 0xa8c4, 0x7042, ++ 0x127f, 0x0078, 0x4cda, 0x2069, 0xa87d, 0x6808, 0xa08e, 0x0000, ++ 0x0040, 0x4d81, 0xa08e, 0x0200, 0x0040, 0x4d7f, 0xa08e, 0x0100, ++ 0x00c0, 0x4d81, 0x127e, 0x2091, 0x8000, 0x0068, 0x4d7c, 0x2069, ++ 0x0000, 0x6818, 0xd084, 0x00c0, 0x4d7c, 0x702c, 0x7130, 0x8108, ++ 0xa102, 0x0048, 0x4d4a, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072, ++ 0x0078, 0x4d54, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, 0x4d54, ++ 0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x6936, 0x700b, 0x0000, ++ 0x2001, 0xa85a, 0x2004, 0xa005, 0x00c0, 0x4d73, 0x6934, 0x2069, ++ 0xa835, 0x689c, 0x699e, 0x2069, 0xa8c4, 0xa102, 0x00c0, 0x4d6c, ++ 0x6844, 0xa005, 0x00d0, 0x4d7a, 0x2001, 0xa85b, 0x200c, 0x810d, ++ 0x6946, 0x0078, 0x4d7a, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, ++ 0x2091, 0x4080, 0x7007, 0x0001, 0x127f, 0x0078, 0x4d81, 0x7007, ++ 0x0005, 0x007c, 0x701c, 0xa06d, 0x0040, 0x4d93, 0x1078, 0x4e60, ++ 0x0040, 0x4d93, 0x7007, 0x0003, 0x1078, 0x4e80, 0x7050, 0xa086, ++ 0x0100, 0x0040, 0x4d95, 0x007c, 0x007c, 0x7050, 0xa09e, 0x0100, ++ 0x00c0, 0x4d9e, 0x7007, 0x0004, 0x0078, 0x4dbc, 0xa086, 0x0200, ++ 0x00c0, 0x4da4, 0x7007, 0x0005, 0x007c, 0x2001, 0xa87f, 0x2004, ++ 0xa08e, 0x0100, 0x00c0, 0x4db1, 0x7007, 0x0001, 0x1078, 0x4e4c, ++ 0x007c, 0xa08e, 0x0000, 0x0040, 0x4db0, 0xa08e, 0x0200, 0x00c0, ++ 0x4db0, 0x7007, 0x0005, 0x007c, 0x1078, 0x4e16, 0x7006, 0x1078, ++ 0x4e4c, 0x007c, 0x007c, 0x0e7e, 0x157e, 0x2071, 0xa835, 0x7184, ++ 0x81ff, 0x0040, 0x4deb, 0xa006, 0x7086, 0xae80, 0x0003, 0x2071, ++ 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x0070, 0x4de8, 0x2014, ++ 0x722a, 0x8000, 0x0070, 0x4de8, 0x2014, 0x722e, 0x8000, 0x0070, ++ 0x4de8, 0x2014, 0x723a, 0x8000, 0x0070, 0x4de8, 0x2014, 0x723e, ++ 0xa180, 0x8030, 0x7022, 0x157f, 0x0e7f, 0x007c, 0x0e7e, 0x157e, ++ 0x2071, 0xa835, 0x7184, 0x81ff, 0x0040, 0x4e13, 0xa006, 0x7086, ++ 0xae80, 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, ++ 0x2014, 0x722a, 0x8000, 0x0070, 0x4e0c, 0x2014, 0x723a, 0x8000, ++ 0x2014, 0x723e, 0x0078, 0x4e10, 0x2001, 0x8020, 0x0078, 0x4e12, ++ 0x2001, 0x8042, 0x7022, 0x157f, 0x0e7f, 0x007c, 0x702c, 0x7130, ++ 0x8108, 0xa102, 0x0048, 0x4e23, 0xa00e, 0x7034, 0x706e, 0x7038, ++ 0x7072, 0x0078, 0x4e2d, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, ++ 0x4e2d, 0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x700c, 0x8001, ++ 0x700e, 0x00c0, 0x4e43, 0x127e, 0x2091, 0x8000, 0x0068, 0x4e46, ++ 0x2001, 0x000d, 0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x700b, ++ 0x0000, 0x127f, 0x007c, 0x2001, 0x0007, 0x007c, 0x2001, 0x0006, ++ 0x700b, 0x0001, 0x127f, 0x007c, 0x701c, 0xa06d, 0x0040, 0x4e5f, ++ 0x127e, 0x2091, 0x8000, 0x7010, 0x8001, 0x7012, 0x2d04, 0x701e, ++ 0xa005, 0x00c0, 0x4e5c, 0x701a, 0x127f, 0x1078, 0x13a4, 0x007c, ++ 0x2019, 0x000d, 0x2304, 0x230c, 0xa10e, 0x0040, 0x4e6f, 0x2304, ++ 0x230c, 0xa10e, 0x0040, 0x4e6f, 0xa006, 0x0078, 0x4e7f, 0x732c, ++ 0x8319, 0x7130, 0xa102, 0x00c0, 0x4e79, 0x2300, 0xa005, 0x0078, ++ 0x4e7f, 0x0048, 0x4e7e, 0xa302, 0x0078, 0x4e7f, 0x8002, 0x007c, ++ 0x2d00, 0x7026, 0xa080, 0x000d, 0x7056, 0x7053, 0x0000, 0x127e, ++ 0x2091, 0x8000, 0x2009, 0xa8d6, 0x2104, 0xc08d, 0x200a, 0x127f, ++ 0x1078, 0x13f9, 0x007c, 0x2071, 0xa6e2, 0x7003, 0x0000, 0x7007, ++ 0x0000, 0x700f, 0x0000, 0x702b, 0x0001, 0x704f, 0x0000, 0x7053, ++ 0x0001, 0x705f, 0x0020, 0x7063, 0x0040, 0x7083, 0x0000, 0x708b, ++ 0x0000, 0x708f, 0x0001, 0x70bf, 0x0000, 0x007c, 0x0e7e, 0x2071, ++ 0xa6e2, 0x6848, 0xa005, 0x00c0, 0x4ebc, 0x7028, 0xc085, 0x702a, ++ 0xa085, 0x0001, 0x0078, 0x4ee1, 0x6a50, 0x7236, 0x6b54, 0x733a, ++ 0x6858, 0x703e, 0x707a, 0x685c, 0x7042, 0x707e, 0x6848, 0x702e, ++ 0x6840, 0x7032, 0x2009, 0x000c, 0x200a, 0x8007, 0x8006, 0x8006, ++ 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x7272, ++ 0x7376, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700f, 0x0000, ++ 0xa006, 0x0e7f, 0x007c, 0x2b78, 0x2071, 0xa6e2, 0x7004, 0x1079, ++ 0x4f41, 0x700c, 0x0079, 0x4eec, 0x4ef1, 0x4ee6, 0x4ee6, 0x4ee6, ++ 0x4ee6, 0x007c, 0x700c, 0x0079, 0x4ef5, 0x4efa, 0x4f3f, 0x4f3f, ++ 0x4f40, 0x4f40, 0x7830, 0x7930, 0xa106, 0x0040, 0x4f04, 0x7830, ++ 0x7930, 0xa106, 0x00c0, 0x4f2a, 0x7030, 0xa10a, 0x0040, 0x4f2a, ++ 0x00c8, 0x4f0c, 0x712c, 0xa10a, 0xa18a, 0x0002, 0x00c8, 0x4f2b, ++ 0x1078, 0x1370, 0x0040, 0x4f2a, 0x2d00, 0x705a, 0x7063, 0x0040, ++ 0x2001, 0x0003, 0x7057, 0x0000, 0x127e, 0x007e, 0x2091, 0x8000, ++ 0x2009, 0xa8d6, 0x2104, 0xc085, 0x200a, 0x007f, 0x700e, 0x127f, ++ 0x1078, 0x13f9, 0x007c, 0x1078, 0x1370, 0x0040, 0x4f2a, 0x2d00, ++ 0x705a, 0x1078, 0x1370, 0x00c0, 0x4f37, 0x0078, 0x4f16, 0x2d00, ++ 0x7086, 0x7063, 0x0080, 0x2001, 0x0004, 0x0078, 0x4f1a, 0x007c, ++ 0x007c, 0x4f52, 0x4f53, 0x4f8a, 0x4f8b, 0x4f3f, 0x4fc1, 0x4fc6, ++ 0x4ffd, 0x4ffe, 0x5019, 0x501a, 0x501b, 0x501c, 0x501d, 0x501e, ++ 0x509e, 0x50c8, 0x007c, 0x700c, 0x0079, 0x4f56, 0x4f5b, 0x4f5e, ++ 0x4f6e, 0x4f89, 0x4f89, 0x1078, 0x4ef2, 0x007c, 0x127e, 0x8001, ++ 0x700e, 0x7058, 0x007e, 0x1078, 0x5464, 0x0040, 0x4f6b, 0x2091, ++ 0x8000, 0x1078, 0x4ef2, 0x0d7f, 0x0078, 0x4f77, 0x127e, 0x8001, ++ 0x700e, 0x1078, 0x5464, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, ++ 0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x0020, ++ 0x00c8, 0x4f86, 0x1079, 0x4fa1, 0x127f, 0x007c, 0x127f, 0x1078, ++ 0x501f, 0x007c, 0x007c, 0x007c, 0x0e7e, 0x2071, 0xa6e2, 0x700c, ++ 0x0079, 0x4f92, 0x4f97, 0x4f97, 0x4f97, 0x4f99, 0x4f9d, 0x0e7f, ++ 0x007c, 0x700f, 0x0001, 0x0078, 0x4f9f, 0x700f, 0x0002, 0x0e7f, ++ 0x007c, 0x501f, 0x501f, 0x503b, 0x501f, 0x5171, 0x501f, 0x501f, ++ 0x501f, 0x501f, 0x501f, 0x503b, 0x51bb, 0x5208, 0x5261, 0x5277, ++ 0x501f, 0x501f, 0x5057, 0x503b, 0x501f, 0x501f, 0x5078, 0x5338, ++ 0x5356, 0x501f, 0x5057, 0x501f, 0x501f, 0x501f, 0x501f, 0x506d, ++ 0x5356, 0x7020, 0x2068, 0x1078, 0x13a4, 0x007c, 0x700c, 0x0079, ++ 0x4fc9, 0x4fce, 0x4fd1, 0x4fe1, 0x4ffc, 0x4ffc, 0x1078, 0x4ef2, ++ 0x007c, 0x127e, 0x8001, 0x700e, 0x7058, 0x007e, 0x1078, 0x5464, ++ 0x0040, 0x4fde, 0x2091, 0x8000, 0x1078, 0x4ef2, 0x0d7f, 0x0078, ++ 0x4fea, 0x127e, 0x8001, 0x700e, 0x1078, 0x5464, 0x7058, 0x2068, ++ 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084, ++ 0x00ff, 0xa08a, 0x001a, 0x00c8, 0x4ff9, 0x1079, 0x4fff, 0x127f, ++ 0x007c, 0x127f, 0x1078, 0x501f, 0x007c, 0x007c, 0x007c, 0x501f, ++ 0x503b, 0x515b, 0x501f, 0x503b, 0x501f, 0x503b, 0x503b, 0x501f, ++ 0x503b, 0x515b, 0x503b, 0x503b, 0x503b, 0x503b, 0x503b, 0x501f, ++ 0x503b, 0x515b, 0x501f, 0x501f, 0x503b, 0x501f, 0x501f, 0x501f, ++ 0x503b, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x7007, ++ 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a, 0x127e, 0x2091, ++ 0x8000, 0x1078, 0x4a73, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, ++ 0xa084, 0x00ff, 0xc0e5, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, ++ 0x4a73, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, ++ 0xc0ed, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x4a73, 0x127f, ++ 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a, ++ 0x127e, 0x2091, 0x8000, 0x1078, 0x4a73, 0x127f, 0x007c, 0x6834, ++ 0x8007, 0xa084, 0x00ff, 0x0040, 0x502d, 0x8001, 0x00c0, 0x5064, ++ 0x7007, 0x0001, 0x0078, 0x513a, 0x7007, 0x0006, 0x7012, 0x2d00, ++ 0x7016, 0x701a, 0x704b, 0x513a, 0x007c, 0x684c, 0xa084, 0x00c0, ++ 0xa086, 0x00c0, 0x00c0, 0x5078, 0x7007, 0x0001, 0x0078, 0x5373, ++ 0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, ++ 0x20a1, 0xa70d, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x00c8, ++ 0x5049, 0x6884, 0xa08a, 0x0002, 0x00c8, 0x5049, 0x82ff, 0x00c0, ++ 0x509a, 0x6888, 0x698c, 0xa105, 0x0040, 0x509a, 0x2001, 0x510a, ++ 0x0078, 0x509d, 0xa280, 0x5100, 0x2004, 0x70c6, 0x7010, 0xa015, ++ 0x0040, 0x50e8, 0x1078, 0x1370, 0x00c0, 0x50a9, 0x7007, 0x000f, ++ 0x007c, 0x2d00, 0x7022, 0x70c4, 0x2060, 0x6000, 0x6836, 0x6004, ++ 0xad00, 0x7096, 0x6008, 0xa20a, 0x00c8, 0x50b8, 0xa00e, 0x2200, ++ 0x7112, 0x620c, 0x8003, 0x800b, 0xa296, 0x0004, 0x0040, 0x50c1, ++ 0xa108, 0x719a, 0x810b, 0x719e, 0xae90, 0x0022, 0x1078, 0x13db, ++ 0x7090, 0xa08e, 0x0100, 0x0040, 0x50dc, 0xa086, 0x0200, 0x0040, ++ 0x50d4, 0x7007, 0x0010, 0x007c, 0x7020, 0x2068, 0x1078, 0x13a4, ++ 0x7014, 0x2068, 0x0078, 0x5049, 0x7020, 0x2068, 0x7018, 0x6802, ++ 0x6807, 0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0078, 0x509e, ++ 0x7014, 0x2068, 0x7007, 0x0001, 0x6884, 0xa005, 0x00c0, 0x50f7, ++ 0x6888, 0x698c, 0xa105, 0x0040, 0x50f7, 0x1078, 0x510e, 0x6834, ++ 0xa084, 0x00ff, 0xa086, 0x001e, 0x0040, 0x5373, 0x0078, 0x513a, ++ 0x5102, 0x5106, 0x0002, 0x0011, 0x0007, 0x0004, 0x000a, 0x000f, ++ 0x0005, 0x0006, 0x000a, 0x0011, 0x0005, 0x0004, 0x0f7e, 0x0e7e, ++ 0x0c7e, 0x077e, 0x067e, 0x6f88, 0x6e8c, 0x6804, 0x2060, 0xacf0, ++ 0x0021, 0xacf8, 0x0027, 0x2009, 0x0005, 0x700c, 0x7816, 0x7008, ++ 0x7812, 0x7004, 0x7806, 0x7000, 0x7802, 0x7e0e, 0x7f0a, 0x8109, ++ 0x0040, 0x5130, 0xaef2, 0x0004, 0xaffa, 0x0006, 0x0078, 0x511d, ++ 0x6004, 0xa065, 0x00c0, 0x5117, 0x067f, 0x077f, 0x0c7f, 0x0e7f, ++ 0x0f7f, 0x007c, 0x2009, 0xa62f, 0x210c, 0x81ff, 0x00c0, 0x5155, ++ 0x6838, 0xa084, 0x00ff, 0x683a, 0x1078, 0x4353, 0x00c0, 0x5149, ++ 0x007c, 0x1078, 0x4b51, 0x127e, 0x2091, 0x8000, 0x1078, 0x8f7d, ++ 0x1078, 0x4a73, 0x127f, 0x0078, 0x5148, 0x2001, 0x0028, 0x2009, ++ 0x0000, 0x0078, 0x5149, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906, ++ 0x711a, 0x7010, 0x8001, 0x7012, 0x0040, 0x516a, 0x7007, 0x0006, ++ 0x0078, 0x5170, 0x7014, 0x2068, 0x7007, 0x0001, 0x7048, 0x107a, ++ 0x007c, 0x7007, 0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848, ++ 0xa084, 0x00ff, 0x20a9, 0x0001, 0xa096, 0x0001, 0x0040, 0x519a, ++ 0x2009, 0x0000, 0x20a9, 0x00ff, 0xa096, 0x0002, 0x0040, 0x519a, ++ 0xa005, 0x00c0, 0x51ad, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x1078, ++ 0x45c4, 0x00c0, 0x51ad, 0x067e, 0x6e50, 0x1078, 0x46b3, 0x067f, ++ 0x0078, 0x51ad, 0x047e, 0x2011, 0xa60c, 0x2224, 0xc484, 0xc48c, ++ 0x2412, 0x047f, 0x0c7e, 0x1078, 0x45c4, 0x00c0, 0x51a9, 0x1078, ++ 0x4852, 0x8108, 0x00f0, 0x51a3, 0x0c7f, 0x684c, 0xd084, 0x00c0, ++ 0x51b4, 0x1078, 0x13a4, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078, ++ 0x4a73, 0x127f, 0x007c, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, ++ 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x51ff, 0x2061, 0xa933, ++ 0x6100, 0xd184, 0x0040, 0x51df, 0x6858, 0xa084, 0x00ff, 0x00c0, ++ 0x5202, 0x6000, 0xd084, 0x0040, 0x51ff, 0x6004, 0xa005, 0x00c0, ++ 0x5205, 0x6003, 0x0000, 0x600b, 0x0000, 0x0078, 0x51fc, 0x2011, ++ 0x0001, 0x6860, 0xa005, 0x00c0, 0x51e7, 0x2001, 0x001e, 0x8000, ++ 0x6016, 0x6858, 0xa084, 0x00ff, 0x0040, 0x51ff, 0x6006, 0x6858, ++ 0x8007, 0xa084, 0x00ff, 0x0040, 0x51ff, 0x600a, 0x6858, 0x8000, ++ 0x00c0, 0x51fb, 0xc28d, 0x6202, 0x127f, 0x0078, 0x5453, 0x127f, ++ 0x0078, 0x544b, 0x127f, 0x0078, 0x5443, 0x127f, 0x0078, 0x5447, ++ 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xa653, 0x2004, ++ 0xd0a4, 0x0040, 0x525e, 0x2061, 0xa933, 0x6000, 0xd084, 0x0040, ++ 0x525e, 0x6204, 0x6308, 0xd08c, 0x00c0, 0x5250, 0x6c48, 0xa484, ++ 0x0003, 0x0040, 0x5236, 0x6958, 0xa18c, 0x00ff, 0x8001, 0x00c0, ++ 0x522f, 0x2100, 0xa210, 0x0048, 0x525b, 0x0078, 0x5236, 0x8001, ++ 0x00c0, 0x525b, 0x2100, 0xa212, 0x0048, 0x525b, 0xa484, 0x000c, ++ 0x0040, 0x5250, 0x6958, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004, ++ 0x00c0, 0x5248, 0x2100, 0xa318, 0x0048, 0x525b, 0x0078, 0x5250, ++ 0xa082, 0x0004, 0x00c0, 0x525b, 0x2100, 0xa31a, 0x0048, 0x525b, ++ 0x6860, 0xa005, 0x0040, 0x5256, 0x8000, 0x6016, 0x6206, 0x630a, ++ 0x127f, 0x0078, 0x5453, 0x127f, 0x0078, 0x544f, 0x127f, 0x0078, ++ 0x544b, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0xa933, ++ 0x6300, 0xd38c, 0x00c0, 0x5271, 0x6308, 0x8318, 0x0048, 0x5274, ++ 0x630a, 0x127f, 0x0078, 0x5461, 0x127f, 0x0078, 0x544f, 0x127e, ++ 0x0c7e, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac, 0x0040, ++ 0x528b, 0x0c7e, 0x2061, 0xa933, 0x6000, 0xa084, 0xfcff, 0x6002, ++ 0x0c7f, 0x0078, 0x52ba, 0x6858, 0xa005, 0x0040, 0x52d1, 0x685c, ++ 0xa065, 0x0040, 0x52cd, 0x2001, 0xa62f, 0x2004, 0xa005, 0x0040, ++ 0x529d, 0x1078, 0x8ec6, 0x0078, 0x52ab, 0x6013, 0x0400, 0x6037, ++ 0x0000, 0x694c, 0xd1a4, 0x0040, 0x52a7, 0x6950, 0x6136, 0x2009, ++ 0x0041, 0x1078, 0x775c, 0x6958, 0xa18c, 0xff00, 0xa186, 0x2000, ++ 0x00c0, 0x52ba, 0x027e, 0x2009, 0x0000, 0x2011, 0xfdff, 0x1078, ++ 0x5bf1, 0x027f, 0x684c, 0xd0c4, 0x0040, 0x52c9, 0x2061, 0xa933, ++ 0x6000, 0xd08c, 0x00c0, 0x52c9, 0x6008, 0x8000, 0x0048, 0x52cd, ++ 0x600a, 0x0c7f, 0x127f, 0x0078, 0x5453, 0x0c7f, 0x127f, 0x0078, ++ 0x544b, 0x6954, 0xa186, 0x0045, 0x0040, 0x5306, 0xa186, 0x002a, ++ 0x00c0, 0x52e1, 0x2001, 0xa60c, 0x200c, 0xc194, 0x2102, 0x0078, ++ 0x52ba, 0xa186, 0x0020, 0x0040, 0x52fa, 0xa186, 0x0029, 0x0040, ++ 0x52ed, 0xa186, 0x002d, 0x00c0, 0x52cd, 0x6944, 0xa18c, 0xff00, ++ 0x810f, 0x1078, 0x45c4, 0x00c0, 0x52ba, 0x6000, 0xc0e4, 0x6002, ++ 0x0078, 0x52ba, 0x685c, 0xa065, 0x0040, 0x52cd, 0x6007, 0x0024, ++ 0x2001, 0xa8a3, 0x2004, 0x6016, 0x0078, 0x52ba, 0x685c, 0xa065, ++ 0x0040, 0x52cd, 0x0e7e, 0x6860, 0xa075, 0x2001, 0xa62f, 0x2004, ++ 0xa005, 0x0040, 0x531e, 0x1078, 0x8ec6, 0x8eff, 0x0040, 0x531b, ++ 0x2e60, 0x1078, 0x8ec6, 0x0e7f, 0x0078, 0x52ba, 0x6024, 0xc0dc, ++ 0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0x6870, 0xa005, 0x0040, ++ 0x532f, 0x6007, 0x003b, 0x6874, 0x602a, 0x6878, 0x6012, 0x6003, ++ 0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0e7f, 0x0078, 0x52ba, ++ 0x2061, 0xa933, 0x6000, 0xd084, 0x0040, 0x5352, 0xd08c, 0x00c0, ++ 0x5461, 0x2091, 0x8000, 0x6204, 0x8210, 0x0048, 0x534c, 0x6206, ++ 0x2091, 0x8001, 0x0078, 0x5461, 0x2091, 0x8001, 0x6853, 0x0016, ++ 0x0078, 0x545a, 0x6853, 0x0007, 0x0078, 0x545a, 0x6834, 0x8007, ++ 0xa084, 0x00ff, 0x00c0, 0x5360, 0x1078, 0x502d, 0x0078, 0x5372, ++ 0x2030, 0x8001, 0x00c0, 0x536a, 0x7007, 0x0001, 0x1078, 0x5373, ++ 0x0078, 0x5372, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, ++ 0x704b, 0x5373, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000, 0xa03e, ++ 0x2009, 0xa62f, 0x210c, 0x81ff, 0x00c0, 0x53ff, 0x2009, 0xa60c, ++ 0x210c, 0xd194, 0x00c0, 0x5431, 0x6848, 0x2070, 0xae82, 0xad00, ++ 0x0048, 0x53ef, 0x2001, 0xa616, 0x2004, 0xae02, 0x00c8, 0x53ef, ++ 0x2061, 0xa933, 0x6100, 0xa184, 0x0301, 0xa086, 0x0001, 0x00c0, ++ 0x53d2, 0x711c, 0xa186, 0x0006, 0x00c0, 0x53da, 0x7018, 0xa005, ++ 0x0040, 0x53ff, 0x2004, 0xd0e4, 0x00c0, 0x542b, 0x7024, 0xd0dc, ++ 0x00c0, 0x5435, 0x6853, 0x0000, 0x6803, 0x0000, 0x2d08, 0x7010, ++ 0xa005, 0x00c0, 0x53be, 0x7112, 0x684c, 0xd0f4, 0x00c0, 0x5439, ++ 0x2e60, 0x1078, 0x5b27, 0x127f, 0x0e7f, 0x007c, 0x2068, 0x6800, ++ 0xa005, 0x00c0, 0x53be, 0x6902, 0x2168, 0x684c, 0xd0f4, 0x00c0, ++ 0x5439, 0x127f, 0x0e7f, 0x007c, 0x127f, 0x0e7f, 0x6853, 0x0006, ++ 0x0078, 0x545a, 0xd184, 0x0040, 0x53cc, 0xd1c4, 0x00c0, 0x53f3, ++ 0x0078, 0x53f7, 0x6944, 0xa18c, 0xff00, 0x810f, 0x1078, 0x45c4, ++ 0x00c0, 0x542b, 0x6000, 0xd0e4, 0x00c0, 0x542b, 0x711c, 0xa186, ++ 0x0007, 0x00c0, 0x53ef, 0x6853, 0x0002, 0x0078, 0x542d, 0x6853, ++ 0x0008, 0x0078, 0x542d, 0x6853, 0x000e, 0x0078, 0x542d, 0x6853, ++ 0x0017, 0x0078, 0x542d, 0x6853, 0x0035, 0x0078, 0x542d, 0x2001, ++ 0xa672, 0x2004, 0xd0fc, 0x0040, 0x5427, 0x6848, 0x2070, 0xae82, ++ 0xad00, 0x0048, 0x5427, 0x6058, 0xae02, 0x00c8, 0x5427, 0x711c, ++ 0xa186, 0x0006, 0x00c0, 0x5427, 0x7018, 0xa005, 0x0040, 0x5427, ++ 0x2004, 0xd0bc, 0x0040, 0x5427, 0x2039, 0x0001, 0x7000, 0xa086, ++ 0x0007, 0x00c0, 0x537e, 0x7003, 0x0002, 0x0078, 0x537e, 0x6853, ++ 0x0028, 0x0078, 0x542d, 0x6853, 0x0029, 0x127f, 0x0e7f, 0x0078, ++ 0x545a, 0x6853, 0x002a, 0x0078, 0x542d, 0x6853, 0x0045, 0x0078, ++ 0x542d, 0x2e60, 0x2019, 0x0002, 0x6017, 0x0014, 0x1078, 0x9dc7, ++ 0x127f, 0x0e7f, 0x007c, 0x2009, 0x003e, 0x0078, 0x5455, 0x2009, ++ 0x0004, 0x0078, 0x5455, 0x2009, 0x0006, 0x0078, 0x5455, 0x2009, ++ 0x0016, 0x0078, 0x5455, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00, ++ 0xa105, 0x6856, 0x2091, 0x8000, 0x1078, 0x4a73, 0x2091, 0x8001, ++ 0x007c, 0x1078, 0x13a4, 0x007c, 0x702c, 0x7130, 0x8108, 0xa102, ++ 0x0048, 0x5471, 0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0078, ++ 0x547d, 0x7070, 0xa080, 0x0040, 0x7072, 0x00c8, 0x547d, 0x7074, ++ 0xa081, 0x0000, 0x7076, 0xa085, 0x0001, 0x7932, 0x7132, 0x007c, ++ 0x0d7e, 0x1078, 0x5b1e, 0x0d7f, 0x007c, 0x0d7e, 0x2011, 0x0004, ++ 0x2204, 0xa085, 0x8002, 0x2012, 0x0d7f, 0x007c, 0x20e1, 0x0002, ++ 0x3d08, 0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0x0040, 0x549c, ++ 0xa086, 0x1000, 0x00c0, 0x54d3, 0x20e1, 0x0000, 0x3d00, 0xa094, ++ 0xff00, 0x8217, 0xa084, 0xf000, 0xa086, 0x3000, 0x00c0, 0x54b7, ++ 0xa184, 0xff00, 0x8007, 0xa086, 0x0008, 0x00c0, 0x54d3, 0x1078, ++ 0x29bb, 0x00c0, 0x54d3, 0x1078, 0x56b2, 0x0078, 0x54ce, 0x20e1, ++ 0x0004, 0x3d60, 0xd1bc, 0x00c0, 0x54be, 0x3e60, 0xac84, 0x000f, ++ 0x00c0, 0x54d3, 0xac82, 0xad00, 0x0048, 0x54d3, 0x6858, 0xac02, ++ 0x00c8, 0x54d3, 0x2009, 0x0047, 0x1078, 0x775c, 0x7a1c, 0xd284, ++ 0x00c0, 0x548e, 0x007c, 0xa016, 0x1078, 0x15fa, 0x0078, 0x54ce, ++ 0x0078, 0x54d3, 0x781c, 0xd08c, 0x0040, 0x5502, 0x157e, 0x137e, ++ 0x147e, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, 0x0076, 0x00c0, ++ 0x5518, 0xa484, 0x7000, 0xa086, 0x1000, 0x00c0, 0x5507, 0x1078, ++ 0x554e, 0x0040, 0x5518, 0x20e1, 0x3000, 0x7828, 0x7828, 0x1078, ++ 0x556c, 0x147f, 0x137f, 0x157f, 0x2009, 0xa8b9, 0x2104, 0xa005, ++ 0x00c0, 0x5503, 0x007c, 0x1078, 0x62d1, 0x0078, 0x5502, 0xa484, ++ 0x7000, 0x00c0, 0x5518, 0x1078, 0x554e, 0x0040, 0x552c, 0x7000, ++ 0xa084, 0xff00, 0xa086, 0x8100, 0x0040, 0x54f3, 0x0078, 0x552c, ++ 0x1078, 0xa54f, 0xd5a4, 0x0040, 0x5528, 0x047e, 0x1078, 0x1b22, ++ 0x047f, 0x20e1, 0x9010, 0x2001, 0x0138, 0x2202, 0x0078, 0x5530, ++ 0x1078, 0x554e, 0x6883, 0x0000, 0x20e1, 0x3000, 0x7828, 0x7828, ++ 0x1078, 0x5537, 0x147f, 0x137f, 0x157f, 0x0078, 0x5502, 0x2001, ++ 0xa60e, 0x2004, 0xd08c, 0x0040, 0x554d, 0x2001, 0xa600, 0x2004, ++ 0xa086, 0x0003, 0x00c0, 0x554d, 0x027e, 0x037e, 0x2011, 0x8048, ++ 0x2518, 0x1078, 0x361b, 0x037f, 0x027f, 0x007c, 0xa484, 0x01ff, ++ 0x6882, 0xa005, 0x0040, 0x5560, 0xa080, 0x001f, 0xa084, 0x03f8, ++ 0x80ac, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x007c, ++ 0x20a9, 0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, ++ 0xa085, 0x0001, 0x0078, 0x555f, 0x7000, 0xa084, 0xff00, 0xa08c, ++ 0xf000, 0x8007, 0xa196, 0x0000, 0x00c0, 0x5579, 0x0078, 0x57ba, ++ 0x007c, 0xa196, 0x2000, 0x00c0, 0x558a, 0x6900, 0xa18e, 0x0001, ++ 0x00c0, 0x5586, 0x1078, 0x3aec, 0x0078, 0x5578, 0x1078, 0x5592, ++ 0x0078, 0x5578, 0xa196, 0x8000, 0x00c0, 0x5578, 0x1078, 0x5871, ++ 0x0078, 0x5578, 0x0c7e, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa196, ++ 0x0001, 0x0040, 0x559f, 0xa196, 0x0023, 0x00c0, 0x56aa, 0xa08e, ++ 0x0023, 0x00c0, 0x55d4, 0x1078, 0x591d, 0x0040, 0x56aa, 0x7124, ++ 0x610a, 0x7030, 0xa08e, 0x0200, 0x00c0, 0x55b8, 0x7034, 0xa005, ++ 0x00c0, 0x56aa, 0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x56aa, ++ 0xa08e, 0x0214, 0x0040, 0x55c0, 0xa08e, 0x0210, 0x00c0, 0x55c6, ++ 0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x56aa, 0xa08e, 0x0100, ++ 0x00c0, 0x56aa, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x0016, ++ 0x1078, 0x775c, 0x0078, 0x56aa, 0xa08e, 0x0022, 0x00c0, 0x56aa, ++ 0x7030, 0xa08e, 0x0300, 0x00c0, 0x55e5, 0x7034, 0xa005, 0x00c0, ++ 0x56aa, 0x2009, 0x0017, 0x0078, 0x5676, 0xa08e, 0x0500, 0x00c0, ++ 0x55f1, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x0018, 0x0078, ++ 0x5676, 0xa08e, 0x2010, 0x00c0, 0x55f9, 0x2009, 0x0019, 0x0078, ++ 0x5676, 0xa08e, 0x2110, 0x00c0, 0x5601, 0x2009, 0x001a, 0x0078, ++ 0x5676, 0xa08e, 0x5200, 0x00c0, 0x560d, 0x7034, 0xa005, 0x00c0, ++ 0x56aa, 0x2009, 0x001b, 0x0078, 0x5676, 0xa08e, 0x5000, 0x00c0, ++ 0x5619, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x001c, 0x0078, ++ 0x5676, 0xa08e, 0x1300, 0x00c0, 0x5621, 0x2009, 0x0034, 0x0078, ++ 0x5676, 0xa08e, 0x1200, 0x00c0, 0x562d, 0x7034, 0xa005, 0x00c0, ++ 0x56aa, 0x2009, 0x0024, 0x0078, 0x5676, 0xa08c, 0xff00, 0xa18e, ++ 0x2400, 0x00c0, 0x5637, 0x2009, 0x002d, 0x0078, 0x5676, 0xa08c, ++ 0xff00, 0xa18e, 0x5300, 0x00c0, 0x5641, 0x2009, 0x002a, 0x0078, ++ 0x5676, 0xa08e, 0x0f00, 0x00c0, 0x5649, 0x2009, 0x0020, 0x0078, ++ 0x5676, 0xa08e, 0x5300, 0x00c0, 0x564f, 0x0078, 0x566c, 0xa08e, ++ 0x6104, 0x00c0, 0x566c, 0x2011, 0xab8d, 0x8208, 0x2204, 0xa082, ++ 0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, 0x8108, ++ 0x047e, 0x2124, 0x1078, 0x361b, 0x047f, 0x8108, 0x00f0, 0x565c, ++ 0x2009, 0x0023, 0x0078, 0x5676, 0xa08e, 0x6000, 0x00c0, 0x5674, ++ 0x2009, 0x003f, 0x0078, 0x5676, 0x2009, 0x001d, 0x017e, 0x2011, ++ 0xab83, 0x2204, 0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x56ac, ++ 0x1078, 0x455c, 0x00c0, 0x56ac, 0x6612, 0x6516, 0x86ff, 0x0040, ++ 0x569c, 0x017f, 0x017e, 0xa186, 0x0017, 0x00c0, 0x569c, 0x686c, ++ 0xa606, 0x00c0, 0x569c, 0x6870, 0xa506, 0xa084, 0xff00, 0x00c0, ++ 0x569c, 0x6000, 0xc0f5, 0x6002, 0x0c7e, 0x1078, 0x76c7, 0x0040, ++ 0x56af, 0x017f, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x017f, ++ 0x1078, 0x775c, 0x0c7f, 0x007c, 0x017f, 0x0078, 0x56aa, 0x0c7f, ++ 0x0078, 0x56ac, 0x0c7e, 0x1078, 0x570f, 0x00c0, 0x570d, 0xa28e, ++ 0x0033, 0x00c0, 0x56de, 0x1078, 0x591d, 0x0040, 0x570d, 0x7124, ++ 0x610a, 0x7030, 0xa08e, 0x0200, 0x00c0, 0x56d0, 0x7034, 0xa005, ++ 0x00c0, 0x570d, 0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x570d, ++ 0xa08e, 0x0100, 0x00c0, 0x570d, 0x7034, 0xa005, 0x00c0, 0x570d, ++ 0x2009, 0x0016, 0x1078, 0x775c, 0x0078, 0x570d, 0xa28e, 0x0032, ++ 0x00c0, 0x570d, 0x7030, 0xa08e, 0x1400, 0x00c0, 0x570d, 0x2009, ++ 0x0038, 0x017e, 0x2011, 0xab83, 0x2204, 0x8211, 0x220c, 0x1078, ++ 0x254d, 0x00c0, 0x570c, 0x1078, 0x455c, 0x00c0, 0x570c, 0x6612, ++ 0x6516, 0x0c7e, 0x1078, 0x76c7, 0x0040, 0x570b, 0x017f, 0x611a, ++ 0x601f, 0x0004, 0x7120, 0x610a, 0x017f, 0x1078, 0x775c, 0x1078, ++ 0x62d1, 0x0078, 0x570d, 0x0c7f, 0x017f, 0x0c7f, 0x007c, 0x0f7e, ++ 0x0d7e, 0x027e, 0x017e, 0x137e, 0x147e, 0x157e, 0x3c00, 0x007e, ++ 0x2079, 0x0030, 0x2069, 0x0200, 0x1078, 0x1c6a, 0x00c0, 0x5750, ++ 0x1078, 0x1b40, 0x0040, 0x575d, 0x7908, 0xa18c, 0x1fff, 0xa182, ++ 0x0011, 0x00c8, 0x575a, 0x20a9, 0x000c, 0x20e1, 0x0000, 0x2ea0, ++ 0x2099, 0x020a, 0x53a5, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004, ++ 0x7a0c, 0x7808, 0xa080, 0x0007, 0xa084, 0x1ff8, 0xa08a, 0x0140, ++ 0x10c8, 0x1332, 0x80ac, 0x20e1, 0x6000, 0x2099, 0x020a, 0x53a5, ++ 0x20e1, 0x7000, 0x6828, 0x6828, 0x7803, 0x0004, 0xa294, 0x0070, ++ 0x007f, 0x20e0, 0x157f, 0x147f, 0x137f, 0x017f, 0x027f, 0x0d7f, ++ 0x0f7f, 0x007c, 0xa016, 0x1078, 0x15fa, 0xa085, 0x0001, 0x0078, ++ 0x5750, 0x047e, 0x0e7e, 0x0d7e, 0x2028, 0x2130, 0xa696, 0x00ff, ++ 0x00c0, 0x5782, 0xa596, 0xfffd, 0x00c0, 0x5772, 0x2009, 0x007f, ++ 0x0078, 0x57b5, 0xa596, 0xfffe, 0x00c0, 0x577a, 0x2009, 0x007e, ++ 0x0078, 0x57b5, 0xa596, 0xfffc, 0x00c0, 0x5782, 0x2009, 0x0080, ++ 0x0078, 0x57b5, 0x2011, 0x0000, 0x2021, 0x0081, 0x20a9, 0x007e, ++ 0x2071, 0xa7b6, 0x2e1c, 0x83ff, 0x00c0, 0x5794, 0x82ff, 0x00c0, ++ 0x57a9, 0x2410, 0x0078, 0x57a9, 0x2368, 0x6f10, 0x007e, 0x2100, ++ 0xa706, 0x007f, 0x6b14, 0x00c0, 0x57a3, 0xa346, 0x00c0, 0x57a3, ++ 0x2408, 0x0078, 0x57b5, 0x87ff, 0x00c0, 0x57a9, 0x83ff, 0x0040, ++ 0x578e, 0x8420, 0x8e70, 0x00f0, 0x578a, 0x82ff, 0x00c0, 0x57b4, ++ 0xa085, 0x0001, 0x0078, 0x57b6, 0x2208, 0xa006, 0x0d7f, 0x0e7f, ++ 0x047f, 0x007c, 0xa084, 0x0007, 0x0079, 0x57bf, 0x007c, 0x57c7, ++ 0x57c7, 0x57c7, 0x5933, 0x57c7, 0x57c8, 0x57e1, 0x5858, 0x007c, ++ 0x7110, 0xd1bc, 0x0040, 0x57e0, 0x7120, 0x2160, 0xac8c, 0x000f, ++ 0x00c0, 0x57e0, 0xac8a, 0xad00, 0x0048, 0x57e0, 0x6858, 0xac02, ++ 0x00c8, 0x57e0, 0x7124, 0x610a, 0x2009, 0x0046, 0x1078, 0x775c, ++ 0x007c, 0x0c7e, 0xa484, 0x01ff, 0x0040, 0x5833, 0x7110, 0xd1bc, ++ 0x00c0, 0x5833, 0x2011, 0xab83, 0x2204, 0x8211, 0x220c, 0x1078, ++ 0x254d, 0x00c0, 0x5833, 0x1078, 0x455c, 0x00c0, 0x5833, 0x6612, ++ 0x6516, 0x6000, 0xd0ec, 0x00c0, 0x5833, 0x6204, 0xa294, 0xff00, ++ 0x8217, 0xa286, 0x0006, 0x00c0, 0x5818, 0x0c7e, 0x1078, 0x76c7, ++ 0x017f, 0x0040, 0x5835, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, ++ 0x7130, 0x6122, 0x2009, 0x0044, 0x1078, 0x775c, 0x0078, 0x5833, ++ 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x5833, 0x611a, 0x601f, ++ 0x0004, 0x7120, 0x610a, 0xa286, 0x0004, 0x00c0, 0x582b, 0x6007, ++ 0x0005, 0x0078, 0x582d, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078, ++ 0x5dd7, 0x1078, 0x62d1, 0x0c7f, 0x007c, 0x2001, 0xa60d, 0x2004, ++ 0xd0ec, 0x0040, 0x583f, 0x2011, 0x8049, 0x1078, 0x361b, 0x0c7e, ++ 0x1078, 0x9187, 0x017f, 0x0040, 0x5833, 0x611a, 0x601f, 0x0006, ++ 0x7120, 0x610a, 0x7130, 0x6122, 0x6013, 0x0300, 0x6003, 0x0001, ++ 0x6007, 0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x5833, ++ 0x7110, 0xd1bc, 0x0040, 0x5870, 0x7020, 0x2060, 0xac84, 0x000f, ++ 0x00c0, 0x5870, 0xac82, 0xad00, 0x0048, 0x5870, 0x6858, 0xac02, ++ 0x00c8, 0x5870, 0x7124, 0x610a, 0x2009, 0x0045, 0x1078, 0x775c, ++ 0x007c, 0x007e, 0x1078, 0x29bb, 0x007f, 0x00c0, 0x5887, 0x7110, ++ 0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x00c0, 0x5887, 0xa084, ++ 0x000f, 0xa08a, 0x0006, 0x00c8, 0x5887, 0x1079, 0x5888, 0x007c, ++ 0x588e, 0x588f, 0x588e, 0x588e, 0x58ff, 0x590e, 0x007c, 0x7110, ++ 0xd1bc, 0x0040, 0x5897, 0x702c, 0xd084, 0x0040, 0x58fe, 0x700c, ++ 0x7108, 0x1078, 0x254d, 0x00c0, 0x58fe, 0x1078, 0x455c, 0x00c0, ++ 0x58fe, 0x6612, 0x6516, 0x6204, 0x7110, 0xd1bc, 0x0040, 0x58c9, ++ 0xa28c, 0x00ff, 0xa186, 0x0004, 0x0040, 0x58b2, 0xa186, 0x0006, ++ 0x00c0, 0x58ef, 0x0c7e, 0x1078, 0x591d, 0x0c7f, 0x0040, 0x58fe, ++ 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f, ++ 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x1078, 0x775c, 0x0078, ++ 0x58fe, 0xa28c, 0x00ff, 0xa186, 0x0006, 0x0040, 0x58de, 0xa186, ++ 0x0004, 0x0040, 0x58de, 0xa294, 0xff00, 0x8217, 0xa286, 0x0004, ++ 0x0040, 0x58de, 0xa286, 0x0006, 0x00c0, 0x58ef, 0x0c7e, 0x1078, ++ 0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f, 0x0005, 0x7120, ++ 0x610a, 0x2009, 0x0088, 0x1078, 0x775c, 0x0078, 0x58fe, 0x0c7e, ++ 0x1078, 0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f, 0x0004, ++ 0x7120, 0x610a, 0x2009, 0x0001, 0x1078, 0x775c, 0x007c, 0x7110, ++ 0xd1bc, 0x0040, 0x590d, 0x1078, 0x591d, 0x0040, 0x590d, 0x7124, ++ 0x610a, 0x2009, 0x0089, 0x1078, 0x775c, 0x007c, 0x7110, 0xd1bc, ++ 0x0040, 0x591c, 0x1078, 0x591d, 0x0040, 0x591c, 0x7124, 0x610a, ++ 0x2009, 0x008a, 0x1078, 0x775c, 0x007c, 0x7020, 0x2060, 0xac84, ++ 0x000f, 0x00c0, 0x5930, 0xac82, 0xad00, 0x0048, 0x5930, 0x2001, ++ 0xa616, 0x2004, 0xac02, 0x00c8, 0x5930, 0xa085, 0x0001, 0x007c, ++ 0xa006, 0x0078, 0x592f, 0x7110, 0xd1bc, 0x00c0, 0x5949, 0x7024, ++ 0x2060, 0xac84, 0x000f, 0x00c0, 0x5949, 0xac82, 0xad00, 0x0048, ++ 0x5949, 0x6858, 0xac02, 0x00c8, 0x5949, 0x2009, 0x0051, 0x1078, ++ 0x775c, 0x007c, 0x2071, 0xa8c4, 0x7003, 0x0003, 0x700f, 0x0361, ++ 0xa006, 0x701a, 0x7012, 0x7017, 0xad00, 0x7007, 0x0000, 0x7026, ++ 0x702b, 0x6e1c, 0x7032, 0x7037, 0x6e70, 0x703b, 0x0002, 0x703f, ++ 0x0000, 0x7043, 0xffff, 0x7047, 0xffff, 0x007c, 0x2071, 0xa8c4, ++ 0x00e0, 0x5a32, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x00c0, ++ 0x59de, 0x700f, 0x0361, 0x7007, 0x0001, 0x127e, 0x2091, 0x8000, ++ 0x7138, 0x8109, 0x713a, 0x00c0, 0x59dc, 0x703b, 0x0002, 0x2009, ++ 0x0100, 0x2104, 0xa082, 0x0003, 0x00c8, 0x59dc, 0x703c, 0xa086, ++ 0x0001, 0x00c0, 0x59b9, 0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, ++ 0x4000, 0x0040, 0x5997, 0x6803, 0x1000, 0x0078, 0x599e, 0x6804, ++ 0xa084, 0x1000, 0x0040, 0x599e, 0x6803, 0x0100, 0x6803, 0x0000, ++ 0x703f, 0x0000, 0x2069, 0xa8b1, 0x6804, 0xa082, 0x0006, 0x00c0, ++ 0x59ab, 0x6807, 0x0000, 0x6830, 0xa082, 0x0003, 0x00c0, 0x59b2, ++ 0x6833, 0x0000, 0x1078, 0x62d1, 0x1078, 0x639b, 0x0d7f, 0x0078, ++ 0x59dc, 0x0d7e, 0x2069, 0xa600, 0x6948, 0x6864, 0xa102, 0x00c8, ++ 0x59db, 0x2069, 0xa8b1, 0x6804, 0xa086, 0x0000, 0x00c0, 0x59db, ++ 0x6830, 0xa086, 0x0000, 0x00c0, 0x59db, 0x703f, 0x0001, 0x6807, ++ 0x0006, 0x6833, 0x0003, 0x2069, 0x0100, 0x6830, 0x689e, 0x2069, ++ 0x0140, 0x6803, 0x0600, 0x0d7f, 0x0078, 0x59e1, 0x127e, 0x2091, ++ 0x8000, 0x7024, 0xa00d, 0x0040, 0x59f9, 0x7020, 0x8001, 0x7022, ++ 0x00c0, 0x59f9, 0x7023, 0x0009, 0x8109, 0x7126, 0xa186, 0x03e8, ++ 0x00c0, 0x59f4, 0x7028, 0x107a, 0x81ff, 0x00c0, 0x59f9, 0x7028, ++ 0x107a, 0x7030, 0xa00d, 0x0040, 0x5a10, 0x702c, 0x8001, 0x702e, ++ 0x00c0, 0x5a10, 0x702f, 0x0009, 0x8109, 0x7132, 0x0040, 0x5a0e, ++ 0xa184, 0x007f, 0x1040, 0x6ea2, 0x0078, 0x5a10, 0x7034, 0x107a, ++ 0x7040, 0xa005, 0x0040, 0x5a18, 0x0050, 0x5a18, 0x8001, 0x7042, ++ 0x7044, 0xa005, 0x0040, 0x5a20, 0x0050, 0x5a20, 0x8001, 0x7046, ++ 0x7018, 0xa00d, 0x0040, 0x5a31, 0x7008, 0x8001, 0x700a, 0x00c0, ++ 0x5a31, 0x700b, 0x0009, 0x8109, 0x711a, 0x00c0, 0x5a31, 0x701c, ++ 0x107a, 0x127f, 0x7004, 0x0079, 0x5a35, 0x5a5c, 0x5a5d, 0x5a79, ++ 0x0e7e, 0x2071, 0xa8c4, 0x7018, 0xa005, 0x00c0, 0x5a43, 0x711a, ++ 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x0e7e, 0x007e, 0x2071, ++ 0xa8c4, 0x701c, 0xa206, 0x00c0, 0x5a4f, 0x701a, 0x701e, 0x007f, ++ 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa8c4, 0x6088, 0xa102, 0x0048, ++ 0x5a5a, 0x618a, 0x0e7f, 0x007c, 0x007c, 0x7110, 0x1078, 0x45c4, ++ 0x00c0, 0x5a6f, 0x6088, 0x8001, 0x0048, 0x5a6f, 0x608a, 0x00c0, ++ 0x5a6f, 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x8108, ++ 0xa182, 0x00ff, 0x0048, 0x5a77, 0xa00e, 0x7007, 0x0002, 0x7112, ++ 0x007c, 0x7014, 0x2060, 0x127e, 0x2091, 0x8000, 0x603c, 0xa005, ++ 0x0040, 0x5a88, 0x8001, 0x603e, 0x00c0, 0x5a88, 0x1078, 0x8f9c, ++ 0x6014, 0xa005, 0x0040, 0x5ab2, 0x8001, 0x6016, 0x00c0, 0x5ab2, ++ 0x611c, 0xa186, 0x0003, 0x0040, 0x5a99, 0xa186, 0x0006, 0x00c0, ++ 0x5ab0, 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a, 0x0048, 0x5ab0, ++ 0xa082, 0x1999, 0x6856, 0xa08a, 0x199a, 0x0048, 0x5aa9, 0x2001, ++ 0x1999, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x0078, 0x5ab2, ++ 0x1078, 0x8abe, 0x127f, 0xac88, 0x0010, 0x7116, 0x2001, 0xcd00, ++ 0xa102, 0x0048, 0x5abf, 0x7017, 0xad00, 0x7007, 0x0000, 0x007c, ++ 0x0e7e, 0x2071, 0xa8c4, 0x7027, 0x07d0, 0x7023, 0x0009, 0x703b, ++ 0x0002, 0x0e7f, 0x007c, 0x2001, 0xa8cd, 0x2003, 0x0000, 0x007c, ++ 0x0e7e, 0x2071, 0xa8c4, 0x7132, 0x702f, 0x0009, 0x0e7f, 0x007c, ++ 0x2011, 0xa8d0, 0x2013, 0x0000, 0x007c, 0x0e7e, 0x2071, 0xa8c4, ++ 0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x027e, 0x0e7e, ++ 0x0f7e, 0x2079, 0xa600, 0x7a34, 0xd294, 0x0040, 0x5b15, 0x2071, ++ 0xa8ac, 0x2e14, 0xa0fe, 0x0000, 0x0040, 0x5b02, 0xa0fe, 0x0001, ++ 0x0040, 0x5b06, 0xa0fe, 0x0002, 0x00c0, 0x5b11, 0xa292, 0x0085, ++ 0x0078, 0x5b08, 0xa292, 0x0005, 0x0078, 0x5b08, 0xa292, 0x0002, ++ 0x2272, 0x0040, 0x5b0d, 0x00c8, 0x5b15, 0x2011, 0x8037, 0x1078, ++ 0x361b, 0x2011, 0xa8ab, 0x2204, 0x2072, 0x0f7f, 0x0e7f, 0x027f, ++ 0x007c, 0x0c7e, 0x2061, 0xa933, 0x0c7f, 0x007c, 0xa184, 0x000f, ++ 0x8003, 0x8003, 0x8003, 0xa080, 0xa933, 0x2060, 0x007c, 0x6854, ++ 0xa08a, 0x199a, 0x0048, 0x5b2e, 0x2001, 0x1999, 0xa005, 0x00c0, ++ 0x5b3d, 0x0c7e, 0x2061, 0xa933, 0x6014, 0x0c7f, 0xa005, 0x00c0, ++ 0x5b42, 0x2001, 0x001e, 0x0078, 0x5b42, 0xa08e, 0xffff, 0x00c0, ++ 0x5b42, 0xa006, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c, ++ 0xa08c, 0x00c0, 0xa18e, 0x00c0, 0x0040, 0x5b9e, 0xd0b4, 0x00c0, ++ 0x5b59, 0xd0bc, 0x00c0, 0x5b8b, 0x2009, 0x0006, 0x1078, 0x5bc3, ++ 0x007c, 0xd0fc, 0x0040, 0x5b64, 0xa084, 0x0003, 0x0040, 0x5b64, ++ 0xa086, 0x0003, 0x00c0, 0x5bbc, 0x6024, 0xd0d4, 0x0040, 0x5b6e, ++ 0xc0d4, 0x6026, 0x6860, 0x602a, 0x685c, 0x602e, 0x2009, 0xa674, ++ 0x2104, 0xd084, 0x0040, 0x5b83, 0x6118, 0xa188, 0x0027, 0x2104, ++ 0xd08c, 0x00c0, 0x5b83, 0x87ff, 0x00c0, 0x5b82, 0x2009, 0x0042, ++ 0x1078, 0x775c, 0x007c, 0x87ff, 0x00c0, 0x5b8a, 0x2009, 0x0043, ++ 0x1078, 0x775c, 0x007c, 0xd0fc, 0x0040, 0x5b96, 0xa084, 0x0003, ++ 0x0040, 0x5b96, 0xa086, 0x0003, 0x00c0, 0x5bbc, 0x87ff, 0x00c0, ++ 0x5b9d, 0x2009, 0x0042, 0x1078, 0x775c, 0x007c, 0xd0fc, 0x0040, ++ 0x5baf, 0xa084, 0x0003, 0xa08e, 0x0002, 0x0040, 0x5bb3, 0x87ff, ++ 0x00c0, 0x5bae, 0x2009, 0x0041, 0x1078, 0x775c, 0x007c, 0x1078, ++ 0x5bc1, 0x0078, 0x5bae, 0x87ff, 0x00c0, 0x5bae, 0x2009, 0x0043, ++ 0x1078, 0x775c, 0x0078, 0x5bae, 0x2009, 0x0004, 0x1078, 0x5bc3, ++ 0x007c, 0x2009, 0x0001, 0x0d7e, 0x6010, 0xa0ec, 0xf000, 0x0040, ++ 0x5bef, 0x2068, 0x6952, 0x6800, 0x6012, 0xa186, 0x0001, 0x00c0, ++ 0x5be5, 0x694c, 0xa18c, 0x8100, 0xa18e, 0x8100, 0x00c0, 0x5be5, ++ 0x0c7e, 0x2061, 0xa933, 0x6200, 0xd28c, 0x00c0, 0x5be4, 0x6204, ++ 0x8210, 0x0048, 0x5be4, 0x6206, 0x0c7f, 0x1078, 0x4a73, 0x6010, ++ 0xa06d, 0x077e, 0x2039, 0x0000, 0x10c0, 0x5b27, 0x077f, 0x0d7f, ++ 0x007c, 0x157e, 0x0c7e, 0x2061, 0xa933, 0x6000, 0x81ff, 0x0040, ++ 0x5bfc, 0xa205, 0x0078, 0x5bfd, 0xa204, 0x6002, 0x0c7f, 0x157f, ++ 0x007c, 0x6800, 0xd08c, 0x00c0, 0x5c0d, 0x6808, 0xa005, 0x0040, ++ 0x5c0d, 0x8001, 0x680a, 0xa085, 0x0001, 0x007c, 0x20a9, 0x0010, ++ 0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x5c17, 0xa200, 0x00f0, ++ 0x5c12, 0x8086, 0x818e, 0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, ++ 0x0040, 0x5c3d, 0xa11a, 0x00c8, 0x5c3d, 0x8213, 0x818d, 0x0048, ++ 0x5c30, 0xa11a, 0x00c8, 0x5c31, 0x00f0, 0x5c25, 0x0078, 0x5c35, ++ 0xa11a, 0x2308, 0x8210, 0x00f0, 0x5c25, 0x007e, 0x3200, 0xa084, ++ 0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085, ++ 0x0800, 0x0078, 0x5c39, 0x127e, 0x2091, 0x2200, 0x2079, 0xa8b1, ++ 0x127f, 0x0d7e, 0x2069, 0xa8b1, 0x6803, 0x0005, 0x2069, 0x0004, ++ 0x2d04, 0xa085, 0x8001, 0x206a, 0x0d7f, 0x007c, 0x0c7e, 0x6027, ++ 0x0001, 0x7804, 0xa084, 0x0007, 0x0079, 0x5c5e, 0x5c68, 0x5c8d, ++ 0x5ce8, 0x5c6e, 0x5c8d, 0x5c68, 0x5c66, 0x5c66, 0x1078, 0x1332, ++ 0x1078, 0x5acb, 0x1078, 0x62d1, 0x0c7f, 0x007c, 0x62c0, 0x82ff, ++ 0x00c0, 0x5c74, 0x0c7f, 0x007c, 0x2011, 0x41dc, 0x1078, 0x5a45, ++ 0x7828, 0xa092, 0x00c8, 0x00c8, 0x5c83, 0x8000, 0x782a, 0x1078, ++ 0x421b, 0x0078, 0x5c72, 0x1078, 0x41dc, 0x7807, 0x0003, 0x7827, ++ 0x0000, 0x782b, 0x0000, 0x0078, 0x5c72, 0x1078, 0x5acb, 0x3c00, ++ 0x007e, 0x2011, 0x0209, 0x20e1, 0x4000, 0x2214, 0x007f, 0x20e0, ++ 0x82ff, 0x0040, 0x5cab, 0x62c0, 0x82ff, 0x00c0, 0x5cab, 0x782b, ++ 0x0000, 0x7824, 0xa065, 0x1040, 0x1332, 0x2009, 0x0013, 0x1078, ++ 0x775c, 0x0c7f, 0x007c, 0x3900, 0xa082, 0xa9e3, 0x00c8, 0x5cb2, ++ 0x1078, 0x747a, 0x0c7e, 0x7824, 0xa065, 0x1040, 0x1332, 0x7804, ++ 0xa086, 0x0004, 0x0040, 0x5d2d, 0x7828, 0xa092, 0x2710, 0x00c8, ++ 0x5cc8, 0x8000, 0x782a, 0x0c7f, 0x1078, 0x6e01, 0x0078, 0x5ca9, ++ 0x6104, 0xa186, 0x0003, 0x00c0, 0x5cdf, 0x0e7e, 0x2071, 0xa600, ++ 0x70d8, 0x0e7f, 0xd08c, 0x0040, 0x5cdf, 0x0c7e, 0x0e7e, 0x2061, ++ 0x0100, 0x2071, 0xa600, 0x1078, 0x4224, 0x0e7f, 0x0c7f, 0x1078, ++ 0xa5c4, 0x2009, 0x0014, 0x1078, 0x775c, 0x0c7f, 0x0078, 0x5ca9, ++ 0x2001, 0xa8cd, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x00c0, 0x5cfc, ++ 0x782b, 0x0000, 0x7824, 0xa065, 0x1040, 0x1332, 0x2009, 0x0013, ++ 0x1078, 0x77b3, 0x0c7f, 0x007c, 0x0c7e, 0x0d7e, 0x3900, 0xa082, ++ 0xa9e3, 0x00c8, 0x5d05, 0x1078, 0x747a, 0x7824, 0xa005, 0x1040, ++ 0x1332, 0x781c, 0xa06d, 0x1040, 0x1332, 0x6800, 0xc0dc, 0x6802, ++ 0x7924, 0x2160, 0x1078, 0x772d, 0x693c, 0x81ff, 0x1040, 0x1332, ++ 0x8109, 0x693e, 0x6854, 0xa015, 0x0040, 0x5d21, 0x7a1e, 0x0078, ++ 0x5d23, 0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x0d7f, ++ 0x0c7f, 0x1078, 0x62d1, 0x0078, 0x5cfa, 0x6104, 0xa186, 0x0002, ++ 0x0040, 0x5d38, 0xa186, 0x0004, 0x0040, 0x5d38, 0x0078, 0x5cbc, ++ 0x7808, 0xac06, 0x0040, 0x5cbc, 0x1078, 0x61cd, 0x1078, 0x5dd7, ++ 0x0c7f, 0x1078, 0x62d1, 0x0078, 0x5ca9, 0x0c7e, 0x6027, 0x0002, ++ 0x62c8, 0x82ff, 0x00c0, 0x5d61, 0x62c4, 0x82ff, 0x00c0, 0x5d61, ++ 0x793c, 0xa1e5, 0x0000, 0x0040, 0x5d5b, 0x2009, 0x0049, 0x1078, ++ 0x775c, 0x0c7f, 0x007c, 0x2011, 0xa8d0, 0x2013, 0x0000, 0x0078, ++ 0x5d59, 0x3908, 0xa192, 0xa9e3, 0x00c8, 0x5d68, 0x1078, 0x747a, ++ 0x6017, 0x0010, 0x793c, 0x81ff, 0x0040, 0x5d5b, 0x7944, 0xa192, ++ 0x7530, 0x00c8, 0x5d85, 0x8108, 0x7946, 0x793c, 0xa188, 0x0007, ++ 0x210c, 0xa18e, 0x0006, 0x00c0, 0x5d81, 0x6017, 0x0012, 0x0078, ++ 0x5d59, 0x6017, 0x0016, 0x0078, 0x5d59, 0x7848, 0xc085, 0x784a, ++ 0x0078, 0x5d59, 0x007e, 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000, ++ 0x600f, 0x0000, 0x2c08, 0x2061, 0xa8b1, 0x6020, 0x8000, 0x6022, ++ 0x6010, 0xa005, 0x0040, 0x5da5, 0xa080, 0x0003, 0x2102, 0x6112, ++ 0x127f, 0x0c7f, 0x017f, 0x007f, 0x007c, 0x6116, 0x6112, 0x0078, ++ 0x5da0, 0x0d7e, 0x2069, 0xa8b1, 0x6000, 0xd0d4, 0x0040, 0x5dbe, ++ 0x6820, 0x8000, 0x6822, 0xa086, 0x0001, 0x00c0, 0x5db9, 0x2c00, ++ 0x681e, 0x6804, 0xa084, 0x0007, 0x0079, 0x62d9, 0xc0d5, 0x6002, ++ 0x6818, 0xa005, 0x0040, 0x5dd0, 0x6056, 0x605b, 0x0000, 0x007e, ++ 0x2c00, 0x681a, 0x0d7f, 0x685a, 0x2069, 0xa8b1, 0x0078, 0x5db0, ++ 0x6056, 0x605a, 0x2c00, 0x681a, 0x681e, 0x0078, 0x5db0, 0x007e, ++ 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, ++ 0x2061, 0xa8b1, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0040, ++ 0x5df2, 0xa080, 0x0003, 0x2102, 0x610a, 0x127f, 0x0c7f, 0x017f, ++ 0x007f, 0x007c, 0x610e, 0x610a, 0x0078, 0x5ded, 0x0c7e, 0x600f, ++ 0x0000, 0x2c08, 0x2061, 0xa8b1, 0x6034, 0xa005, 0x0040, 0x5e06, ++ 0xa080, 0x0003, 0x2102, 0x6136, 0x0c7f, 0x007c, 0x613a, 0x6136, ++ 0x0078, 0x5e04, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x057e, ++ 0x037e, 0x027e, 0x017e, 0x007e, 0x127e, 0xa02e, 0x2071, 0xa8b1, ++ 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0040, 0x5e8c, ++ 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x5e87, 0x87ff, ++ 0x0040, 0x5e2e, 0x6020, 0xa106, 0x00c0, 0x5e87, 0x703c, 0xac06, ++ 0x00c0, 0x5e44, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x7033, ++ 0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x704b, ++ 0x0000, 0x037f, 0x2029, 0x0001, 0x7038, 0xac36, 0x00c0, 0x5e4a, ++ 0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x5e58, 0x2c00, 0xaf36, ++ 0x0040, 0x5e56, 0x2f00, 0x7036, 0x0078, 0x5e58, 0x7037, 0x0000, ++ 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5e61, 0x7e0e, 0x0078, ++ 0x5e62, 0x2678, 0x600f, 0x0000, 0x1078, 0x8d06, 0x0040, 0x5e82, ++ 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5e9d, 0x6837, ++ 0x0103, 0x6b4a, 0x6847, 0x0000, 0x017e, 0x037e, 0x077e, 0x1078, ++ 0x8f7d, 0x1078, 0xa4e2, 0x1078, 0x4a73, 0x077f, 0x037f, 0x017f, ++ 0x1078, 0x8eb9, 0x1078, 0x8ec6, 0x0c7f, 0x0078, 0x5e1d, 0x2c78, ++ 0x600c, 0x2060, 0x0078, 0x5e1d, 0x85ff, 0x0040, 0x5e91, 0x1078, ++ 0x639b, 0x127f, 0x007f, 0x017f, 0x027f, 0x037f, 0x057f, 0x067f, ++ 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006, ++ 0x00c0, 0x5e6f, 0x017e, 0x037e, 0x077e, 0x1078, 0xa4e2, 0x1078, ++ 0xa1ca, 0x077f, 0x037f, 0x017f, 0x0078, 0x5e82, 0x007e, 0x067e, ++ 0x0c7e, 0x0d7e, 0x0f7e, 0x2031, 0x0000, 0x127e, 0x2091, 0x8000, ++ 0x2079, 0xa8b1, 0x7838, 0xa065, 0x0040, 0x5eef, 0x600c, 0x007e, ++ 0x600f, 0x0000, 0x783c, 0xac06, 0x00c0, 0x5ed6, 0x037e, 0x2019, ++ 0x0001, 0x1078, 0x7058, 0x7833, 0x0000, 0x783f, 0x0000, 0x7843, ++ 0x0000, 0x7847, 0x0000, 0x784b, 0x0000, 0x037f, 0x1078, 0x8d06, ++ 0x0040, 0x5eea, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, ++ 0x5ef8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73, ++ 0x1078, 0x8eb9, 0x1078, 0x8ec6, 0x007f, 0x0078, 0x5ebb, 0x7e3a, ++ 0x7e36, 0x127f, 0x0f7f, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, ++ 0x601c, 0xa086, 0x0006, 0x00c0, 0x5ee1, 0x1078, 0xa1ca, 0x0078, ++ 0x5eea, 0x017e, 0x027e, 0x087e, 0x2041, 0x0000, 0x1078, 0x5f1b, ++ 0x1078, 0x5fdb, 0x087f, 0x027f, 0x017f, 0x007c, 0x0f7e, 0x127e, ++ 0x2079, 0xa8b1, 0x2091, 0x8000, 0x1078, 0x6076, 0x1078, 0x60ec, ++ 0x127f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, ++ 0x017e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x7614, ++ 0x2660, 0x2678, 0x8cff, 0x0040, 0x5fb5, 0x6018, 0xa080, 0x0028, ++ 0x2004, 0xa206, 0x00c0, 0x5fb0, 0x88ff, 0x0040, 0x5f3b, 0x6020, ++ 0xa106, 0x00c0, 0x5fb0, 0x7024, 0xac06, 0x00c0, 0x5f6b, 0x2069, ++ 0x0100, 0x68c0, 0xa005, 0x0040, 0x5f66, 0x1078, 0x5acb, 0x1078, ++ 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7027, 0x0000, 0x037e, ++ 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x5f5b, 0x6803, ++ 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, ++ 0x5f63, 0x6827, 0x0001, 0x037f, 0x0078, 0x5f6b, 0x6003, 0x0009, ++ 0x630a, 0x0078, 0x5fb0, 0x7014, 0xac36, 0x00c0, 0x5f71, 0x660c, ++ 0x7616, 0x7010, 0xac36, 0x00c0, 0x5f7f, 0x2c00, 0xaf36, 0x0040, ++ 0x5f7d, 0x2f00, 0x7012, 0x0078, 0x5f7f, 0x7013, 0x0000, 0x660c, ++ 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5f88, 0x7e0e, 0x0078, 0x5f89, ++ 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, ++ 0x5fa9, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5fbe, 0x6837, 0x0103, ++ 0x6b4a, 0x6847, 0x0000, 0x017e, 0x037e, 0x087e, 0x1078, 0x8f7d, ++ 0x1078, 0xa4e2, 0x1078, 0x4a73, 0x087f, 0x037f, 0x017f, 0x1078, ++ 0x8eb9, 0x1078, 0x8ec6, 0x1078, 0x7233, 0x0c7f, 0x0078, 0x5f2a, ++ 0x2c78, 0x600c, 0x2060, 0x0078, 0x5f2a, 0x127f, 0x007f, 0x017f, ++ 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, ++ 0x0006, 0x00c0, 0x5fcf, 0x017e, 0x037e, 0x087e, 0x1078, 0xa4e2, ++ 0x1078, 0xa1ca, 0x087f, 0x037f, 0x017f, 0x0078, 0x5fa9, 0x601c, ++ 0xa086, 0x0002, 0x00c0, 0x5fa9, 0x6004, 0xa086, 0x0085, 0x0040, ++ 0x5f96, 0x0078, 0x5fa9, 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000, ++ 0xa280, 0xa735, 0x2004, 0xa065, 0x0040, 0x6072, 0x0f7e, 0x0e7e, ++ 0x0d7e, 0x067e, 0x2071, 0xa8b1, 0x6654, 0x7018, 0xac06, 0x00c0, ++ 0x5ff2, 0x761a, 0x701c, 0xac06, 0x00c0, 0x5ffe, 0x86ff, 0x00c0, ++ 0x5ffd, 0x7018, 0x701e, 0x0078, 0x5ffe, 0x761e, 0x6058, 0xa07d, ++ 0x0040, 0x6003, 0x7e56, 0xa6ed, 0x0000, 0x0040, 0x6009, 0x2f00, ++ 0x685a, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, ++ 0x6002, 0x1078, 0x44d3, 0x0040, 0x606e, 0x7624, 0x86ff, 0x0040, ++ 0x605c, 0xa680, 0x0004, 0x2004, 0xad06, 0x00c0, 0x605c, 0x0d7e, ++ 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x6053, 0x1078, 0x5acb, ++ 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7027, 0x0000, ++ 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x603c, ++ 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, ++ 0x0040, 0x6044, 0x6827, 0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c, ++ 0xa005, 0x0040, 0x604d, 0x8001, 0x603e, 0x2660, 0x1078, 0x8ec6, ++ 0x0c7f, 0x0078, 0x605c, 0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009, ++ 0x630a, 0x0c7f, 0x0078, 0x6011, 0x8dff, 0x0040, 0x606a, 0x6837, ++ 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x8f7d, 0x1078, 0xa4e2, ++ 0x1078, 0x4a73, 0x1078, 0x7233, 0x0078, 0x6011, 0x067f, 0x0d7f, ++ 0x0e7f, 0x0f7f, 0x127f, 0x007f, 0x0c7f, 0x007c, 0x007e, 0x067e, ++ 0x0c7e, 0x0d7e, 0x2031, 0x0000, 0x7814, 0xa065, 0x0040, 0x60d0, ++ 0x600c, 0x007e, 0x600f, 0x0000, 0x7824, 0xac06, 0x00c0, 0x60b5, ++ 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x60af, 0x1078, 0x5acb, ++ 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7827, 0x0000, ++ 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x60a4, ++ 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, ++ 0x0040, 0x60ac, 0x6827, 0x0001, 0x037f, 0x0078, 0x60b5, 0x6003, ++ 0x0009, 0x630a, 0x2c30, 0x0078, 0x60cd, 0x6010, 0x2068, 0x1078, ++ 0x8d06, 0x0040, 0x60c9, 0x601c, 0xa086, 0x0003, 0x00c0, 0x60d7, ++ 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078, ++ 0x8eb9, 0x1078, 0x8ec6, 0x1078, 0x7233, 0x007f, 0x0078, 0x607d, ++ 0x7e16, 0x7e12, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x601c, ++ 0xa086, 0x0006, 0x00c0, 0x60e0, 0x1078, 0xa1ca, 0x0078, 0x60c9, ++ 0x601c, 0xa086, 0x0002, 0x00c0, 0x60c9, 0x6004, 0xa086, 0x0085, ++ 0x0040, 0x60c0, 0x0078, 0x60c9, 0x007e, 0x067e, 0x0c7e, 0x0d7e, ++ 0x7818, 0xa065, 0x0040, 0x615a, 0x6054, 0x007e, 0x6057, 0x0000, ++ 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x44d3, ++ 0x0040, 0x6157, 0x7e24, 0x86ff, 0x0040, 0x6149, 0xa680, 0x0004, ++ 0x2004, 0xad06, 0x00c0, 0x6149, 0x0d7e, 0x2069, 0x0100, 0x68c0, ++ 0xa005, 0x0040, 0x6140, 0x1078, 0x5acb, 0x1078, 0x6e0f, 0x68c3, ++ 0x0000, 0x1078, 0x7378, 0x7827, 0x0000, 0x037e, 0x2069, 0x0140, ++ 0x6b04, 0xa384, 0x1000, 0x0040, 0x6129, 0x6803, 0x0100, 0x6803, ++ 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x6131, 0x6827, ++ 0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c, 0xa005, 0x0040, 0x613a, ++ 0x8001, 0x603e, 0x2660, 0x1078, 0x8ec6, 0x0c7f, 0x0078, 0x6149, ++ 0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078, ++ 0x60fe, 0x8dff, 0x0040, 0x6153, 0x6837, 0x0103, 0x6b4a, 0x6847, ++ 0x0000, 0x1078, 0x4a73, 0x1078, 0x7233, 0x0078, 0x60fe, 0x007f, ++ 0x0078, 0x60f1, 0x781e, 0x781a, 0x0d7f, 0x0c7f, 0x067f, 0x007f, ++ 0x007c, 0x0e7e, 0x0d7e, 0x067e, 0x6000, 0xd0dc, 0x0040, 0x6181, ++ 0x604c, 0xa06d, 0x0040, 0x6181, 0x6848, 0xa606, 0x00c0, 0x6181, ++ 0x2071, 0xa8b1, 0x7024, 0xa035, 0x0040, 0x6181, 0xa080, 0x0004, ++ 0x2004, 0xad06, 0x00c0, 0x6181, 0x6000, 0xc0dc, 0x6002, 0x1078, ++ 0x6185, 0x067f, 0x0d7f, 0x0e7f, 0x007c, 0x0f7e, 0x2079, 0x0100, ++ 0x78c0, 0xa005, 0x00c0, 0x6194, 0x0c7e, 0x2660, 0x6003, 0x0009, ++ 0x630a, 0x0c7f, 0x0078, 0x61cb, 0x1078, 0x6e0f, 0x78c3, 0x0000, ++ 0x1078, 0x7378, 0x7027, 0x0000, 0x037e, 0x2079, 0x0140, 0x7b04, ++ 0xa384, 0x1000, 0x0040, 0x61a8, 0x7803, 0x0100, 0x7803, 0x0000, ++ 0x2079, 0x0100, 0x7824, 0xd084, 0x0040, 0x61b0, 0x7827, 0x0001, ++ 0x1078, 0x7378, 0x037f, 0x1078, 0x44d3, 0x0c7e, 0x603c, 0xa005, ++ 0x0040, 0x61bc, 0x8001, 0x603e, 0x2660, 0x1078, 0x772d, 0x0c7f, ++ 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x8f7d, 0x1078, ++ 0x4a73, 0x1078, 0x7233, 0x0f7f, 0x007c, 0x0e7e, 0x0c7e, 0x2071, ++ 0xa8b1, 0x7004, 0xa084, 0x0007, 0x0079, 0x61d6, 0x61e0, 0x61e3, ++ 0x61fc, 0x6218, 0x6262, 0x61e0, 0x61e0, 0x61de, 0x1078, 0x1332, ++ 0x0c7f, 0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040, 0x61f1, 0x7020, ++ 0x8001, 0x7022, 0x600c, 0xa015, 0x0040, 0x61f8, 0x7216, 0x600f, ++ 0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, ++ 0x7216, 0x7212, 0x0078, 0x61f1, 0x6018, 0x2060, 0x1078, 0x44d3, ++ 0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, 0x7022, 0x0040, 0x620d, ++ 0x6054, 0xa015, 0x0040, 0x6214, 0x721e, 0x7007, 0x0000, 0x7027, ++ 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7218, 0x721e, 0x0078, 0x620d, ++ 0x7024, 0xa065, 0x0040, 0x625f, 0x700c, 0xac06, 0x00c0, 0x622f, ++ 0x1078, 0x7233, 0x600c, 0xa015, 0x0040, 0x622b, 0x720e, 0x600f, ++ 0x0000, 0x0078, 0x625d, 0x720e, 0x720a, 0x0078, 0x625d, 0x7014, ++ 0xac06, 0x00c0, 0x6242, 0x1078, 0x7233, 0x600c, 0xa015, 0x0040, ++ 0x623e, 0x7216, 0x600f, 0x0000, 0x0078, 0x625d, 0x7216, 0x7212, ++ 0x0078, 0x625d, 0x601c, 0xa086, 0x0003, 0x00c0, 0x625d, 0x6018, ++ 0x2060, 0x1078, 0x44d3, 0x6000, 0xc0dc, 0x6002, 0x1078, 0x7233, ++ 0x701c, 0xa065, 0x0040, 0x625d, 0x6054, 0xa015, 0x0040, 0x625b, ++ 0x721e, 0x0078, 0x625d, 0x7218, 0x721e, 0x7027, 0x0000, 0x0c7f, ++ 0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040, 0x626f, 0x1078, 0x7233, ++ 0x600c, 0xa015, 0x0040, 0x6276, 0x720e, 0x600f, 0x0000, 0x1078, ++ 0x7378, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x720e, 0x720a, ++ 0x0078, 0x626f, 0x0d7e, 0x2069, 0xa8b1, 0x6830, 0xa084, 0x0003, ++ 0x0079, 0x6282, 0x6288, 0x628a, 0x62b4, 0x6288, 0x1078, 0x1332, ++ 0x0d7f, 0x007c, 0x0c7e, 0x6840, 0xa086, 0x0001, 0x0040, 0x62aa, ++ 0x683c, 0xa065, 0x0040, 0x629b, 0x600c, 0xa015, 0x0040, 0x62a6, ++ 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, ++ 0xa8d0, 0x2013, 0x0000, 0x0c7f, 0x0d7f, 0x007c, 0x683a, 0x6836, ++ 0x0078, 0x629b, 0x6843, 0x0000, 0x6838, 0xa065, 0x0040, 0x629b, ++ 0x6003, 0x0003, 0x0078, 0x629b, 0x0c7e, 0x6843, 0x0000, 0x6847, ++ 0x0000, 0x684b, 0x0000, 0x683c, 0xa065, 0x0040, 0x62ce, 0x600c, ++ 0xa015, 0x0040, 0x62ca, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000, ++ 0x0078, 0x62ce, 0x683f, 0x0000, 0x683a, 0x6836, 0x0c7f, 0x0d7f, ++ 0x007c, 0x0d7e, 0x2069, 0xa8b1, 0x6804, 0xa084, 0x0007, 0x0079, ++ 0x62d9, 0x62e3, 0x638a, 0x638a, 0x638a, 0x638a, 0x638c, 0x638a, ++ 0x62e1, 0x1078, 0x1332, 0x6820, 0xa005, 0x00c0, 0x62e9, 0x0d7f, ++ 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x62f8, 0x6807, 0x0004, ++ 0x6826, 0x682b, 0x0000, 0x1078, 0x63d4, 0x0c7f, 0x0d7f, 0x007c, ++ 0x6814, 0xa065, 0x0040, 0x6306, 0x6807, 0x0001, 0x6826, 0x682b, ++ 0x0000, 0x1078, 0x63d4, 0x0c7f, 0x0d7f, 0x007c, 0x0e7e, 0x037e, ++ 0x6a1c, 0xa2f5, 0x0000, 0x0040, 0x6385, 0x704c, 0xa00d, 0x0040, ++ 0x6315, 0x7088, 0xa005, 0x0040, 0x632d, 0x7054, 0xa075, 0x0040, ++ 0x631e, 0xa20e, 0x0040, 0x6385, 0x0078, 0x6323, 0x6818, 0xa20e, ++ 0x0040, 0x6385, 0x2070, 0x704c, 0xa00d, 0x0040, 0x6315, 0x7088, ++ 0xa005, 0x00c0, 0x6315, 0x2e00, 0x681e, 0x733c, 0x7038, 0xa302, ++ 0x00c8, 0x6315, 0x1078, 0x76fc, 0x0040, 0x6385, 0x8318, 0x733e, ++ 0x6112, 0x2e10, 0x621a, 0xa180, 0x0014, 0x2004, 0xa084, 0x00ff, ++ 0x6032, 0xa180, 0x0014, 0x2003, 0x0000, 0xa180, 0x0015, 0x2004, ++ 0xa08a, 0x199a, 0x0048, 0x634e, 0x2001, 0x1999, 0x8003, 0x801b, ++ 0x831b, 0xa318, 0x6316, 0x037f, 0x0f7e, 0x2c78, 0x71a0, 0xd1bc, ++ 0x0040, 0x6367, 0x7100, 0xd1f4, 0x0040, 0x6363, 0x7114, 0xa18c, ++ 0x00ff, 0x0078, 0x636c, 0x2009, 0x0000, 0x0078, 0x636c, 0xa1e0, ++ 0x29c0, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x1078, ++ 0x6965, 0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26, ++ 0x682b, 0x0000, 0x781f, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040, ++ 0x0f7f, 0x0e7f, 0x0c7f, 0x0d7f, 0x007c, 0x037f, 0x0e7f, 0x0c7f, ++ 0x0078, 0x6383, 0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, ++ 0x6398, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x63d4, ++ 0x0c7f, 0x0d7f, 0x007c, 0x0f7e, 0x0d7e, 0x2069, 0xa8b1, 0x6830, ++ 0xa086, 0x0000, 0x00c0, 0x63bb, 0x6838, 0xa07d, 0x0040, 0x63bb, ++ 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x127e, ++ 0x0f7e, 0x2091, 0x2200, 0x027f, 0x1078, 0x1d6d, 0x00c0, 0x63be, ++ 0x127f, 0x1078, 0x6cb3, 0x0d7f, 0x0f7f, 0x007c, 0x127f, 0x6843, ++ 0x0000, 0x7803, 0x0002, 0x780c, 0xa015, 0x0040, 0x63d0, 0x6a3a, ++ 0x780f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0078, 0x63bb, ++ 0x683a, 0x6836, 0x0078, 0x63ca, 0x601c, 0xa084, 0x000f, 0x1079, ++ 0x63da, 0x007c, 0x63e3, 0x63e8, 0x6809, 0x6922, 0x63e8, 0x6809, ++ 0x6922, 0x63e3, 0x63e8, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x007c, ++ 0x157e, 0x137e, 0x147e, 0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0044, ++ 0x10c8, 0x1332, 0x6118, 0x2178, 0x79a0, 0xd1bc, 0x0040, 0x6405, ++ 0x7900, 0xd1f4, 0x0040, 0x6401, 0x7914, 0xa18c, 0x00ff, 0x0078, ++ 0x640a, 0x2009, 0x0000, 0x0078, 0x640a, 0xa1f8, 0x29c0, 0x2f0c, ++ 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa08a, 0x0040, ++ 0x00c8, 0x645c, 0x1079, 0x641a, 0x0f7f, 0x0c7f, 0x147f, 0x137f, ++ 0x157f, 0x007c, 0x64c2, 0x650a, 0x6532, 0x65cd, 0x65fd, 0x6605, ++ 0x662c, 0x663d, 0x664e, 0x6656, 0x666e, 0x6656, 0x66d9, 0x663d, ++ 0x66fa, 0x6702, 0x664e, 0x6702, 0x6713, 0x645a, 0x645a, 0x645a, ++ 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, ++ 0x6eef, 0x6f14, 0x6f29, 0x6f4c, 0x6f6d, 0x662c, 0x645a, 0x662c, ++ 0x6656, 0x645a, 0x6532, 0x65cd, 0x645a, 0x749c, 0x6656, 0x645a, ++ 0x74bc, 0x6656, 0x645a, 0x645a, 0x64bd, 0x646b, 0x645a, 0x74e1, ++ 0x7558, 0x7640, 0x645a, 0x7651, 0x6626, 0x766d, 0x645a, 0x6f82, ++ 0x645a, 0x645a, 0x1078, 0x1332, 0x2100, 0x1079, 0x6465, 0x0f7f, ++ 0x0c7f, 0x147f, 0x137f, 0x157f, 0x007c, 0x6469, 0x6469, 0x6469, ++ 0x649f, 0x1078, 0x1332, 0x0d7e, 0x20a1, 0x020b, 0x1078, 0x6731, ++ 0x7810, 0x2068, 0x20a3, 0x2414, 0x20a3, 0x0018, 0x20a3, 0x0800, ++ 0x683c, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x6850, 0x20a2, 0x6854, 0x20a2, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x60c3, 0x0018, 0x1078, 0x6dfb, 0x0d7f, 0x007c, ++ 0x0d7e, 0x7818, 0x2068, 0x68a0, 0xa082, 0x007e, 0x0048, 0x649c, ++ 0xa085, 0x0001, 0x0d7f, 0x007c, 0xa006, 0x0078, 0x649a, 0x0d7e, ++ 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x0500, 0x20a3, 0x0000, ++ 0x7810, 0xa0e8, 0x000f, 0x6808, 0x20a2, 0x680c, 0x20a2, 0x6810, ++ 0x20a2, 0x6814, 0x20a2, 0x6818, 0x20a2, 0x681c, 0x20a2, 0x60c3, ++ 0x0010, 0x1078, 0x6dfb, 0x0d7f, 0x007c, 0x6030, 0x609a, 0x1078, ++ 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x5200, ++ 0x20a3, 0x0000, 0x0d7e, 0x2069, 0xa652, 0x6804, 0xd084, 0x0040, ++ 0x64dc, 0x6828, 0x20a3, 0x0000, 0x017e, 0x1078, 0x2564, 0x21a2, ++ 0x017f, 0x0d7f, 0x0078, 0x64e1, 0x0d7f, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x20a9, 0x0004, 0x2099, 0xa605, 0x53a6, 0x20a9, 0x0004, ++ 0x2099, 0xa601, 0x53a6, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, ++ 0x007f, 0x0048, 0x64fb, 0x2001, 0xa61b, 0x20a6, 0x2001, 0xa61c, ++ 0x20a6, 0x0078, 0x6501, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, ++ 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078, ++ 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x0500, ++ 0x20a3, 0x0000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f, ++ 0x0048, 0x6522, 0x2001, 0xa61b, 0x20a6, 0x2001, 0xa61c, 0x20a6, ++ 0x0078, 0x6528, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, 0x20a2, ++ 0x20a9, 0x0004, 0x2099, 0xa605, 0x53a6, 0x60c3, 0x0010, 0x1078, ++ 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x0c7e, 0x7818, ++ 0x2060, 0x2001, 0x0000, 0x1078, 0x4972, 0x0c7f, 0x7818, 0xa080, ++ 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0, 0x654d, 0x20a3, 0x0400, ++ 0x620c, 0xc2b4, 0x620e, 0x0078, 0x654f, 0x20a3, 0x0300, 0x20a3, ++ 0x0000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0, ++ 0x659c, 0x2099, 0xa88d, 0x33a6, 0x9398, 0x33a6, 0x9398, 0x3304, ++ 0xa084, 0x3fff, 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, ++ 0xa605, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xa601, 0x53a6, 0x20a9, ++ 0x0010, 0x20a3, 0x0000, 0x00f0, 0x6579, 0x2099, 0xa895, 0x3304, ++ 0xc0dd, 0x20a2, 0x2001, 0xa672, 0x2004, 0xd0e4, 0x0040, 0x6594, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x9398, 0x9398, 0x9398, 0x33a6, ++ 0x20a9, 0x0004, 0x0078, 0x6596, 0x20a9, 0x0007, 0x20a3, 0x0000, ++ 0x00f0, 0x6596, 0x0078, 0x65bc, 0x2099, 0xa88d, 0x20a9, 0x0008, ++ 0x53a6, 0x20a9, 0x0004, 0x2099, 0xa605, 0x53a6, 0x20a9, 0x0004, ++ 0x2099, 0xa601, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, ++ 0x65ad, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x65b3, 0x2099, ++ 0xa895, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, ++ 0x00f0, 0x65be, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x00f0, 0x65c4, ++ 0x60c3, 0x0074, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, ++ 0x6731, 0x20a3, 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x20a3, ++ 0x2000, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e, ++ 0x2079, 0xa652, 0x7904, 0x0f7f, 0xd1ac, 0x00c0, 0x65e9, 0xa085, ++ 0x0020, 0xd1a4, 0x0040, 0x65ee, 0xa085, 0x0010, 0xa085, 0x0002, ++ 0x0d7e, 0x0078, 0x66b7, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x60c3, 0x0014, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, ++ 0x6731, 0x20a3, 0x5000, 0x0078, 0x654f, 0x20a1, 0x020b, 0x1078, ++ 0x6731, 0x20a3, 0x2110, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x60c3, 0x0014, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, ++ 0x1078, 0x67b9, 0x0078, 0x6630, 0x20a1, 0x020b, 0x1078, 0x67c2, ++ 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x60c3, 0x0004, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, ++ 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, ++ 0x2a00, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, ++ 0x1078, 0x67c2, 0x20a3, 0x0200, 0x0078, 0x654f, 0x20a1, 0x020b, ++ 0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0xa005, ++ 0x0040, 0x6665, 0x20a2, 0x0078, 0x6667, 0x20a3, 0x0003, 0x7810, ++ 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x0d7e, 0x20a1, ++ 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, ++ 0x0800, 0x7818, 0x2068, 0x6894, 0xa086, 0x0014, 0x00c0, 0x6694, ++ 0x6998, 0xa184, 0xc000, 0x00c0, 0x6690, 0xd1ec, 0x0040, 0x668c, ++ 0x20a3, 0x2100, 0x0078, 0x6696, 0x20a3, 0x0100, 0x0078, 0x6696, ++ 0x20a3, 0x0400, 0x0078, 0x6696, 0x20a3, 0x0700, 0xa006, 0x20a2, ++ 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e, 0x2079, 0xa652, 0x7904, ++ 0x0f7f, 0xd1ac, 0x00c0, 0x66a6, 0xa085, 0x0020, 0xd1a4, 0x0040, ++ 0x66ab, 0xa085, 0x0010, 0x2009, 0xa674, 0x210c, 0xd184, 0x0040, ++ 0x66b5, 0x699c, 0xd18c, 0x0040, 0x66b7, 0xa085, 0x0002, 0x027e, ++ 0x2009, 0xa672, 0x210c, 0xd1e4, 0x0040, 0x66c5, 0xc0c5, 0xa094, ++ 0x0030, 0xa296, 0x0010, 0x0040, 0x66cf, 0xd1ec, 0x0040, 0x66cf, ++ 0xa094, 0x0030, 0xa296, 0x0010, 0x0040, 0x66cf, 0xc0bd, 0x027f, ++ 0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x0014, 0x1078, 0x6dfb, 0x0d7f, ++ 0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0210, 0x20a3, ++ 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, ++ 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0200, ++ 0x0078, 0x64c8, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100, ++ 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, ++ 0x1078, 0x6dfb, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1, ++ 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, ++ 0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, ++ 0x027e, 0x037e, 0x047e, 0x2019, 0x3200, 0x2021, 0x0800, 0x0078, ++ 0x6738, 0x027e, 0x037e, 0x047e, 0x2019, 0x2200, 0x2021, 0x0100, ++ 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2014, ++ 0xa286, 0x007e, 0x00c0, 0x674b, 0xa385, 0x00ff, 0x20a2, 0x20a3, ++ 0xfffe, 0x0078, 0x6780, 0xa286, 0x007f, 0x00c0, 0x6757, 0x0d7e, ++ 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffd, 0x0078, 0x676e, 0xd2bc, ++ 0x0040, 0x6776, 0xa286, 0x0080, 0x0d7e, 0x00c0, 0x6766, 0xa385, ++ 0x00ff, 0x20a2, 0x20a3, 0xfffc, 0x0078, 0x676e, 0xa2e8, 0xa735, ++ 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, ++ 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6784, 0x0d7e, 0xa2e8, ++ 0xa735, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x0d7f, ++ 0x20a3, 0x0000, 0x6230, 0x22a2, 0xa485, 0x0029, 0x20a2, 0x047f, ++ 0x037f, 0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, ++ 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, ++ 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff, ++ 0x2011, 0xfffc, 0x22a2, 0x0d7e, 0x2069, 0xa61b, 0x2da6, 0x8d68, ++ 0x2da6, 0x0d7f, 0x20a3, 0x2029, 0x20a3, 0x0000, 0x0078, 0x678b, ++ 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, 0x0000, ++ 0x007c, 0x027e, 0x037e, 0x047e, 0x2019, 0x3300, 0x2021, 0x0800, ++ 0x0078, 0x67c9, 0x027e, 0x037e, 0x047e, 0x2019, 0x2300, 0x2021, ++ 0x0100, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0xa092, 0x007e, 0x0048, 0x67e6, 0x0d7e, 0xa0e8, 0xa735, ++ 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, ++ 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x67f4, 0x0d7e, 0xa0e8, ++ 0xa735, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x0d7f, ++ 0x20a3, 0x0000, 0x6230, 0x22a2, 0xa485, 0x0098, 0x20a2, 0x20a3, ++ 0x0000, 0x047f, 0x037f, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, ++ 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, ++ 0x007c, 0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0085, 0x1048, 0x1332, ++ 0xa08a, 0x008c, 0x10c8, 0x1332, 0x6118, 0x2178, 0x79a0, 0xd1bc, ++ 0x0040, 0x6827, 0x7900, 0xd1f4, 0x0040, 0x6823, 0x7914, 0xa18c, ++ 0x00ff, 0x0078, 0x682c, 0x2009, 0x0000, 0x0078, 0x682c, 0xa1f8, ++ 0x29c0, 0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, ++ 0xa082, 0x0085, 0x1079, 0x6837, 0x0f7f, 0x0c7f, 0x007c, 0x6840, ++ 0x684b, 0x6866, 0x683e, 0x683e, 0x683e, 0x6840, 0x1078, 0x1332, ++ 0x147e, 0x20a1, 0x020b, 0x1078, 0x6879, 0x60c3, 0x0000, 0x1078, ++ 0x6dfb, 0x147f, 0x007c, 0x147e, 0x20a1, 0x020b, 0x1078, 0x68ad, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x7810, 0x20a2, ++ 0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x60c3, 0x000c, 0x1078, 0x6dfb, 0x147f, 0x007c, 0x147e, 0x20a1, ++ 0x020b, 0x1078, 0x68ee, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x1078, 0x6dfb, 0x147f, ++ 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, ++ 0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x6898, 0x0d7e, 0xa0e8, ++ 0xa735, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, ++ 0x2069, 0xa61b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x68a7, ++ 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, ++ 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, ++ 0x0009, 0x20a3, 0x0000, 0x0078, 0x678b, 0x027e, 0x20e1, 0x9080, ++ 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e, ++ 0x0048, 0x68cc, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, ++ 0x8400, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, 0x2da6, 0x8d68, ++ 0x2da6, 0x0d7f, 0x0078, 0x68db, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, ++ 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, ++ 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0099, 0x20a3, 0x0000, 0x1078, ++ 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x7a10, 0x22a2, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x027e, 0x20e1, ++ 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, ++ 0x007e, 0x0048, 0x690d, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, ++ 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, 0x2da6, ++ 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x691c, 0x0d7e, 0xa0e8, 0xa735, ++ 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x0d7f, ++ 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0099, 0x20a3, 0x0000, ++ 0x0078, 0x68df, 0x0c7e, 0x0f7e, 0x2c78, 0x7804, 0xa08a, 0x0040, ++ 0x1048, 0x1332, 0xa08a, 0x0053, 0x10c8, 0x1332, 0x7918, 0x2160, ++ 0x61a0, 0xd1bc, 0x0040, 0x6941, 0x6100, 0xd1f4, 0x0040, 0x693d, ++ 0x6114, 0xa18c, 0x00ff, 0x0078, 0x6946, 0x2009, 0x0000, 0x0078, ++ 0x6946, 0xa1e0, 0x29c0, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100, ++ 0x619a, 0xa082, 0x0040, 0x1079, 0x6950, 0x0f7f, 0x0c7f, 0x007c, ++ 0x6965, 0x6a73, 0x6a14, 0x6c27, 0x6963, 0x6963, 0x6963, 0x6963, ++ 0x6963, 0x6963, 0x6963, 0x714c, 0x715d, 0x716e, 0x717f, 0x6963, ++ 0x767e, 0x6963, 0x713b, 0x1078, 0x1332, 0x0d7e, 0x157e, 0x147e, ++ 0x780b, 0xffff, 0x20a1, 0x020b, 0x1078, 0x69d0, 0x7910, 0x2168, ++ 0x6948, 0x7922, 0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c, ++ 0xa184, 0x000f, 0x00c0, 0x6980, 0x2001, 0x0005, 0x0078, 0x698a, ++ 0xd184, 0x0040, 0x6987, 0x2001, 0x0004, 0x0078, 0x698a, 0xa084, ++ 0x0006, 0x8004, 0x017e, 0x2008, 0x7830, 0xa084, 0x00ff, 0x8007, ++ 0xa105, 0x017f, 0x20a2, 0xd1ac, 0x0040, 0x699a, 0x20a3, 0x0002, ++ 0x0078, 0x69a6, 0xd1b4, 0x0040, 0x69a1, 0x20a3, 0x0001, 0x0078, ++ 0x69a6, 0x20a3, 0x0000, 0x2230, 0x0078, 0x69a8, 0x6a80, 0x6e7c, ++ 0x20a9, 0x0008, 0xad80, 0x0017, 0x200c, 0x810f, 0x21a2, 0x8000, ++ 0x00f0, 0x69ac, 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080, ++ 0x6014, 0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0xa8cd, ++ 0x2003, 0x07d0, 0x2001, 0xa8cc, 0x2003, 0x0009, 0x2001, 0xa8d2, ++ 0x2003, 0x0002, 0x1078, 0x158c, 0x147f, 0x157f, 0x0d7f, 0x007c, ++ 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014, ++ 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0xd0bc, 0x0040, 0x69f6, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, ++ 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, ++ 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6a05, 0x0d7e, 0xa0e8, ++ 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, ++ 0x0d7f, 0x20a3, 0x0000, 0x6130, 0x21a2, 0x20a3, 0x0829, 0x20a3, ++ 0x0000, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, ++ 0x20a1, 0x020b, 0x1078, 0x6a34, 0x7810, 0x2068, 0x6860, 0x20a2, ++ 0x685c, 0x20a2, 0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2, ++ 0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x000c, 0x1078, 0x6dfb, 0x147f, ++ 0x137f, 0x157f, 0x0d7f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, ++ 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x6a52, ++ 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, ++ 0x6814, 0x20a2, 0x2069, 0xa61b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, ++ 0x0078, 0x6a61, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, ++ 0x0500, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, ++ 0x22a2, 0x20a3, 0x0889, 0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2, ++ 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x7810, ++ 0xa0ec, 0xf000, 0x0040, 0x6a8b, 0xa06d, 0x1078, 0x495f, 0x0040, ++ 0x6a8b, 0x684c, 0xa084, 0x2020, 0xa086, 0x2020, 0x00c0, 0x6a8b, ++ 0x7824, 0xc0cd, 0x7826, 0x20a1, 0x020b, 0x1078, 0x6be0, 0xa016, ++ 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000, ++ 0x00c0, 0x6aa2, 0x7810, 0xa084, 0x0700, 0x8007, 0x1079, 0x6aaa, ++ 0x0078, 0x6aa5, 0xa006, 0x1079, 0x6aaa, 0x147f, 0x137f, 0x157f, ++ 0x0d7f, 0x007c, 0x6ab4, 0x6b4c, 0x6b57, 0x6b81, 0x6b95, 0x6bb1, ++ 0x6bbc, 0x6ab2, 0x1078, 0x1332, 0x017e, 0x037e, 0x694c, 0xa18c, ++ 0x0003, 0x0040, 0x6abf, 0xa186, 0x0003, 0x00c0, 0x6ace, 0x6b78, ++ 0x7824, 0xd0cc, 0x0040, 0x6ac5, 0xc3e5, 0x23a2, 0x6868, 0x20a2, ++ 0x6864, 0x20a2, 0x037f, 0x017f, 0x0078, 0x6b8c, 0xa186, 0x0001, ++ 0x10c0, 0x1332, 0x6b78, 0x7824, 0xd0cc, 0x0040, 0x6ad8, 0xc3e5, ++ 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874, 0x20a2, ++ 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, 0x0300, 0x0040, ++ 0x6b46, 0xd3c4, 0x0040, 0x6aee, 0x687c, 0xa108, 0xd3cc, 0x0040, ++ 0x6af3, 0x6874, 0xa108, 0x157e, 0x20a9, 0x000d, 0xad80, 0x0020, ++ 0x201c, 0x831f, 0x23a2, 0x8000, 0x00f0, 0x6af8, 0x157f, 0x22a2, ++ 0x22a2, 0x22a2, 0xa184, 0x0003, 0x0040, 0x6b46, 0x20a1, 0x020b, ++ 0x20e1, 0x9080, 0x20e1, 0x4000, 0x007e, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0xd0bc, 0x0040, 0x6b26, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, ++ 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, ++ 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6b35, 0x0d7e, 0xa0e8, ++ 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, ++ 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x007f, 0x7b24, 0xd3cc, ++ 0x0040, 0x6b3e, 0x20a3, 0x0889, 0x0078, 0x6b40, 0x20a3, 0x0898, ++ 0x20a2, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x61c2, 0x037f, ++ 0x017f, 0x1078, 0x6dfb, 0x007c, 0x2011, 0x0008, 0x7824, 0xd0cc, ++ 0x0040, 0x6b53, 0xc2e5, 0x22a2, 0xa016, 0x0078, 0x6b8a, 0x2011, ++ 0x0302, 0x7824, 0xd0cc, 0x0040, 0x6b5e, 0xc2e5, 0x22a2, 0xa016, ++ 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012, 0x22a2, 0x20a3, 0x0008, ++ 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, 0x20a3, 0x0500, ++ 0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, 0x2500, 0x22a2, ++ 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, 0x1078, 0x6dfb, ++ 0x007c, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x0040, 0x6b88, 0xc2e5, ++ 0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, ++ 0x60c3, 0x0018, 0x1078, 0x6dfb, 0x007c, 0x2011, 0x0100, 0x7824, ++ 0xd0cc, 0x0040, 0x6b9c, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2, ++ 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0008, 0x22a2, 0x7834, 0xa084, ++ 0x00ff, 0x20a2, 0x22a2, 0x22a2, 0x60c3, 0x0020, 0x1078, 0x6dfb, ++ 0x007c, 0x2011, 0x0008, 0x7824, 0xd0cc, 0x0040, 0x6bb8, 0xc2e5, ++ 0x22a2, 0xa016, 0x0078, 0x6b8a, 0x037e, 0x7b10, 0xa384, 0xff00, ++ 0x7812, 0xa384, 0x00ff, 0x8001, 0x00c0, 0x6bcf, 0x7824, 0xd0cc, ++ 0x0040, 0x6bcb, 0xc2e5, 0x22a2, 0x037f, 0x0078, 0x6b8a, 0x047e, ++ 0x2021, 0x0800, 0x007e, 0x7824, 0xd0cc, 0x007f, 0x0040, 0x6bd9, ++ 0xc4e5, 0x24a2, 0x047f, 0x22a2, 0x20a2, 0x037f, 0x0078, 0x6b8c, ++ 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0xd0bc, 0x0040, 0x6bfe, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, ++ 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, ++ 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6c0d, 0x0d7e, 0xa0e8, ++ 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, ++ 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x7824, 0xd0cc, 0x0040, ++ 0x6c15, 0x20a3, 0x0889, 0x0078, 0x6c17, 0x20a3, 0x0898, 0x20a3, ++ 0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, ++ 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x0d7e, ++ 0x157e, 0x137e, 0x147e, 0x017e, 0x037e, 0x7810, 0xa084, 0x0700, ++ 0x8007, 0x1079, 0x6c3a, 0x037f, 0x017f, 0x147f, 0x137f, 0x157f, ++ 0x0d7f, 0x007c, 0x6c42, 0x6c42, 0x6c44, 0x6c42, 0x6c42, 0x6c42, ++ 0x6c69, 0x6c42, 0x1078, 0x1332, 0x7910, 0xa18c, 0xf8ff, 0xa18d, ++ 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, 0x6c73, ++ 0x0d7e, 0x2069, 0xa652, 0x6804, 0xd0bc, 0x0040, 0x6c5e, 0x682c, ++ 0xa084, 0x00ff, 0x8007, 0x20a2, 0x0078, 0x6c60, 0x20a3, 0x3f00, ++ 0x0d7f, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0001, 0x1078, 0x6dfb, ++ 0x007c, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, 0x6c73, 0x20a3, ++ 0x7f00, 0x0078, 0x6c61, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, ++ 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x6c91, 0x0d7e, ++ 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, ++ 0x20a2, 0x2069, 0xa61b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, ++ 0x6ca0, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0100, ++ 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, ++ 0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x1078, 0x6dea, 0x22a2, ++ 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x0c7e, 0x057e, 0x047e, ++ 0x037e, 0x2061, 0x0100, 0x2071, 0xa600, 0x6130, 0x7818, 0x2068, ++ 0x68a0, 0x2028, 0xd0bc, 0x00c0, 0x6cca, 0x6910, 0x6a14, 0x6430, ++ 0x0078, 0x6cce, 0x6910, 0x6a14, 0x736c, 0x7470, 0x781c, 0xa086, ++ 0x0006, 0x0040, 0x6d2d, 0xd5bc, 0x0040, 0x6cde, 0xa185, 0x0100, ++ 0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x6ce5, 0xa185, 0x0100, ++ 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x6073, 0x0809, 0x6077, ++ 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, ++ 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7810, 0x2070, ++ 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, ++ 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, ++ 0xa582, 0x0080, 0x0048, 0x6d17, 0x6a00, 0xd2f4, 0x0040, 0x6d15, ++ 0x6a14, 0xa294, 0x00ff, 0x0078, 0x6d17, 0x2011, 0x0000, 0x629e, ++ 0x6017, 0x0016, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005, ++ 0x0040, 0x6d24, 0x2009, 0x1b58, 0x1078, 0x5ad0, 0x037f, 0x047f, ++ 0x057f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x7810, 0x2070, 0x704c, ++ 0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x6d85, 0xd5bc, 0x0040, ++ 0x6d41, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078, ++ 0x6d48, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, ++ 0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, ++ 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, ++ 0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080, 0x60c6, 0x707c, ++ 0x60ca, 0x707c, 0x792c, 0xa108, 0x792e, 0x7080, 0x7928, 0xa109, ++ 0x792a, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, ++ 0x0000, 0xa582, 0x0080, 0x0048, 0x6d80, 0x6a00, 0xd2f4, 0x0040, ++ 0x6d7e, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x6d80, 0x2011, 0x0000, ++ 0x629e, 0x6017, 0x0012, 0x0078, 0x6d1a, 0xd5bc, 0x0040, 0x6d90, ++ 0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x6d97, ++ 0xa185, 0x0700, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x1078, ++ 0x495f, 0x0040, 0x6dad, 0x0d7e, 0x7810, 0xa06d, 0x684c, 0x0d7f, ++ 0xa084, 0x2020, 0xa086, 0x2020, 0x00c0, 0x6dad, 0x7824, 0xc0cd, ++ 0x7826, 0x6073, 0x0889, 0x0078, 0x6daf, 0x6073, 0x0898, 0x6077, ++ 0x0000, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, ++ 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, 0x7014, 0x608a, ++ 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, ++ 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, ++ 0x0048, 0x6ddd, 0x6a00, 0xd2f4, 0x0040, 0x6ddb, 0x6a14, 0xa294, ++ 0x00ff, 0x0078, 0x6ddd, 0x2011, 0x0000, 0x629e, 0x7824, 0xd0cc, ++ 0x0040, 0x6de6, 0x6017, 0x0016, 0x0078, 0x6d1a, 0x6017, 0x0012, ++ 0x0078, 0x6d1a, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, ++ 0x00ff, 0x2202, 0x8217, 0x007c, 0x0d7e, 0x2069, 0xa8b1, 0x6843, ++ 0x0001, 0x0d7f, 0x007c, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, ++ 0x9575, 0x1078, 0x6e06, 0x1078, 0x5ac0, 0x007c, 0x007e, 0x6014, ++ 0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x007f, 0x007c, 0x007e, ++ 0x0c7e, 0x2061, 0x0100, 0x6014, 0xa084, 0x0004, 0xa085, 0x0008, ++ 0x6016, 0x0c7f, 0x007f, 0x007c, 0x0c7e, 0x0d7e, 0x017e, 0x027e, ++ 0x2061, 0x0100, 0x2069, 0x0140, 0x6904, 0xa194, 0x4000, 0x0040, ++ 0x6e59, 0x1078, 0x6e0f, 0x6803, 0x1000, 0x6803, 0x0000, 0x0c7e, ++ 0x2061, 0xa8b1, 0x6128, 0xa192, 0x00c8, 0x00c8, 0x6e44, 0x8108, ++ 0x612a, 0x6124, 0x0c7f, 0x81ff, 0x0040, 0x6e54, 0x1078, 0x5ac0, ++ 0x1078, 0x6e06, 0x0078, 0x6e54, 0x6124, 0xa1e5, 0x0000, 0x0040, ++ 0x6e51, 0x1078, 0xa5c4, 0x1078, 0x5acb, 0x2009, 0x0014, 0x1078, ++ 0x775c, 0x0c7f, 0x0078, 0x6e54, 0x027f, 0x017f, 0x0d7f, 0x0c7f, ++ 0x007c, 0x2001, 0xa8cd, 0x2004, 0xa005, 0x00c0, 0x6e54, 0x0c7e, ++ 0x2061, 0xa8b1, 0x6128, 0xa192, 0x0003, 0x00c8, 0x6e44, 0x8108, ++ 0x612a, 0x0c7f, 0x1078, 0x5ac0, 0x1078, 0x4224, 0x0078, 0x6e54, ++ 0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x027e, 0x1078, 0x5ad8, 0x2071, ++ 0xa8b1, 0x713c, 0x81ff, 0x0040, 0x6e9a, 0x2061, 0x0100, 0x2069, ++ 0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x6ea0, 0x6803, 0x1000, ++ 0x6803, 0x0000, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x037f, ++ 0x713c, 0x2160, 0x1078, 0xa5c4, 0x2009, 0x004a, 0x1078, 0x775c, ++ 0x0078, 0x6e9a, 0x027f, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c, ++ 0x0078, 0x6e8a, 0x0e7e, 0x2071, 0xa8b1, 0x7048, 0xd084, 0x0040, ++ 0x6ebc, 0x713c, 0x81ff, 0x0040, 0x6ebc, 0x2071, 0x0100, 0xa188, ++ 0x0007, 0x210c, 0xa18e, 0x0006, 0x00c0, 0x6eba, 0x7017, 0x0012, ++ 0x0078, 0x6ebc, 0x7017, 0x0016, 0x0e7f, 0x007c, 0x0e7e, 0x0d7e, ++ 0x0c7e, 0x067e, 0x057e, 0x047e, 0x007e, 0x127e, 0x2091, 0x8000, ++ 0x6018, 0x2068, 0x6ca0, 0x2071, 0xa8b1, 0x7018, 0x2068, 0x8dff, ++ 0x0040, 0x6ee6, 0x68a0, 0xa406, 0x0040, 0x6eda, 0x6854, 0x2068, ++ 0x0078, 0x6ecf, 0x6010, 0x2060, 0x643c, 0x6540, 0x6648, 0x2d60, ++ 0x1078, 0x4736, 0x0040, 0x6ee6, 0xa085, 0x0001, 0x127f, 0x007f, ++ 0x047f, 0x057f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x20a1, ++ 0x020b, 0x1078, 0x6731, 0x20a3, 0x1200, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x781c, 0xa086, 0x0004, 0x00c0, 0x6f01, 0x6098, 0x0078, ++ 0x6f02, 0x6030, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a9, ++ 0x0010, 0xa006, 0x20a2, 0x00f0, 0x6f0a, 0x20a2, 0x20a2, 0x60c3, ++ 0x002c, 0x1078, 0x6dfb, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, ++ 0x1078, 0x6731, 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x147f, 0x157f, ++ 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, ++ 0x0200, 0x20a3, 0x0000, 0x20a9, 0x0006, 0x2011, 0xa640, 0x2019, ++ 0xa641, 0x23a6, 0x22a6, 0xa398, 0x0002, 0xa290, 0x0002, 0x00f0, ++ 0x6f39, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078, ++ 0x6dfb, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x017e, 0x027e, ++ 0x20a1, 0x020b, 0x1078, 0x6799, 0x1078, 0x67b0, 0x7810, 0xa080, ++ 0x0000, 0x2004, 0xa080, 0x0015, 0x2098, 0x7808, 0xa088, 0x0002, ++ 0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2, 0x1078, 0x6dfb, ++ 0x027f, 0x017f, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1, ++ 0x020b, 0x1078, 0x6731, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x147f, ++ 0x157f, 0x007c, 0x157e, 0x147e, 0x017e, 0x027e, 0x20a1, 0x020b, ++ 0x1078, 0x6731, 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0017, ++ 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, 0x8003, 0x60c2, ++ 0x1078, 0x6dfb, 0x027f, 0x017f, 0x147f, 0x157f, 0x007c, 0x0e7e, ++ 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x700c, ++ 0x2060, 0x8cff, 0x0040, 0x6fbb, 0x1078, 0x8f00, 0x00c0, 0x6fb2, ++ 0x1078, 0x7c83, 0x600c, 0x007e, 0x1078, 0x772d, 0x1078, 0x7233, ++ 0x0c7f, 0x0078, 0x6fa9, 0x700f, 0x0000, 0x700b, 0x0000, 0x127f, ++ 0x007f, 0x0c7f, 0x0e7f, 0x007c, 0x127e, 0x157e, 0x0f7e, 0x0e7e, ++ 0x0d7e, 0x0c7e, 0x027e, 0x017e, 0x007e, 0x2091, 0x8000, 0x2069, ++ 0x0100, 0x2079, 0x0140, 0x2071, 0xa8b1, 0x7024, 0x2060, 0x8cff, ++ 0x0040, 0x7014, 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x5acb, ++ 0x2009, 0x0013, 0x1078, 0x775c, 0x20a9, 0x01f4, 0x6824, 0xd094, ++ 0x0040, 0x6ff7, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x0040, ++ 0x7009, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0x7009, 0xd084, ++ 0x0040, 0x6ffe, 0x6827, 0x0001, 0x0078, 0x7000, 0x00f0, 0x6fe6, ++ 0x7804, 0xa084, 0x1000, 0x0040, 0x7009, 0x7803, 0x0100, 0x7803, ++ 0x0000, 0x6824, 0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, ++ 0x0f7f, 0x157f, 0x127f, 0x007c, 0x2001, 0xa600, 0x2004, 0xa096, ++ 0x0001, 0x0040, 0x704e, 0xa096, 0x0004, 0x0040, 0x704e, 0x1078, ++ 0x5acb, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x41dc, 0x1078, ++ 0x5a45, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040, 0x703c, 0x6827, ++ 0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x704e, 0x7803, 0x1000, ++ 0x7803, 0x0000, 0x0078, 0x704e, 0xd084, 0x0040, 0x7043, 0x6827, ++ 0x0001, 0x0078, 0x7045, 0x00f0, 0x702b, 0x7804, 0xa084, 0x1000, ++ 0x0040, 0x704e, 0x7803, 0x0100, 0x7803, 0x0000, 0x007f, 0x017f, ++ 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c, ++ 0x127e, 0x157e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e, ++ 0x007e, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, ++ 0xa8b1, 0x703c, 0x2060, 0x8cff, 0x0040, 0x70d6, 0x68af, 0x95f5, ++ 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x00c0, 0x7074, 0x68c7, ++ 0x0000, 0x68cb, 0x0008, 0x1078, 0x5ad8, 0x1078, 0x1f7e, 0x047e, ++ 0x057e, 0x2009, 0x017f, 0x212c, 0x200b, 0x00a5, 0x2021, 0x0169, ++ 0x2404, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x70a5, 0x68c7, ++ 0x0000, 0x68cb, 0x0008, 0x0e7e, 0x0f7e, 0x2079, 0x0020, 0x2071, ++ 0xa908, 0x6814, 0xa084, 0x0004, 0xa085, 0x0012, 0x6816, 0x7803, ++ 0x0008, 0x7003, 0x0000, 0x0f7f, 0x0e7f, 0x250a, 0x057f, 0x047f, ++ 0xa39d, 0x0000, 0x00c0, 0x70b0, 0x2009, 0x0049, 0x1078, 0x775c, ++ 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0040, 0x70c3, 0x6827, 0x0004, ++ 0x7804, 0xa084, 0x4000, 0x0040, 0x70d5, 0x7803, 0x1000, 0x7803, ++ 0x0000, 0x0078, 0x70d5, 0xd08c, 0x0040, 0x70ca, 0x6827, 0x0002, ++ 0x0078, 0x70cc, 0x00f0, 0x70b2, 0x7804, 0xa084, 0x1000, 0x0040, ++ 0x70d5, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f, ++ 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c, ++ 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0xa8b1, 0x6a06, 0x127f, ++ 0x0d7f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0xa8b1, ++ 0x6a32, 0x127f, 0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e, ++ 0x007e, 0x127e, 0x2071, 0xa8b1, 0x7614, 0x2660, 0x2678, 0x2091, ++ 0x8000, 0x8cff, 0x0040, 0x7134, 0x601c, 0xa206, 0x00c0, 0x712f, ++ 0x7014, 0xac36, 0x00c0, 0x710e, 0x660c, 0x7616, 0x7010, 0xac36, ++ 0x00c0, 0x711c, 0x2c00, 0xaf36, 0x0040, 0x711a, 0x2f00, 0x7012, ++ 0x0078, 0x711c, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, ++ 0x0040, 0x7125, 0x7e0e, 0x0078, 0x7126, 0x2678, 0x600f, 0x0000, ++ 0x1078, 0x8ec6, 0x1078, 0x7233, 0x0c7f, 0x0078, 0x7101, 0x2c78, ++ 0x600c, 0x2060, 0x0078, 0x7101, 0x127f, 0x007f, 0x067f, 0x0c7f, ++ 0x0e7f, 0x0f7f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, ++ 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, ++ 0x20a3, 0x1000, 0x0078, 0x718e, 0x157e, 0x147e, 0x20a1, 0x020b, ++ 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, ++ 0x20a2, 0x20a3, 0x4000, 0x0078, 0x718e, 0x157e, 0x147e, 0x20a1, ++ 0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, ++ 0x20a2, 0x20a2, 0x20a3, 0x2000, 0x0078, 0x718e, 0x157e, 0x147e, ++ 0x20a1, 0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, ++ 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x718e, 0x157e, ++ 0x147e, 0x20a1, 0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, ++ 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x1078, 0x723e, ++ 0x60c3, 0x0020, 0x1078, 0x6dfb, 0x147f, 0x157f, 0x007c, 0x127e, ++ 0x0c7e, 0x2091, 0x8000, 0x2061, 0x0100, 0x6120, 0xd1b4, 0x00c0, ++ 0x71a6, 0xd1bc, 0x00c0, 0x71f0, 0x0078, 0x7230, 0x2009, 0x017f, ++ 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140, 0x20a9, ++ 0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040, 0x71e7, ++ 0x6020, 0xd0b4, 0x0040, 0x71e7, 0x6024, 0xd094, 0x00c0, 0x71e7, ++ 0x2104, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x71e7, 0x00f0, ++ 0x71b3, 0x027e, 0x6198, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, ++ 0x00ff, 0xa10d, 0x6088, 0x628c, 0x618e, 0x608b, 0xbc91, 0x6043, ++ 0x0001, 0x6043, 0x0000, 0x608a, 0x628e, 0x6024, 0xd094, 0x00c0, ++ 0x71e6, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x71dd, 0x027f, 0x0d7f, ++ 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0078, 0x7230, ++ 0x2009, 0x017f, 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, ++ 0x0140, 0x20a9, 0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000, ++ 0x0040, 0x7229, 0x6020, 0xd0bc, 0x0040, 0x7229, 0x2104, 0xa084, ++ 0x000f, 0xa086, 0x0004, 0x00c0, 0x7229, 0x00f0, 0x71fd, 0x027e, ++ 0x6164, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff, 0xa10d, ++ 0x6088, 0x628c, 0x608b, 0xbc91, 0x618e, 0x6043, 0x0001, 0x6043, ++ 0x0000, 0x608a, 0x628e, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x7223, ++ 0x027f, 0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, ++ 0x0c7f, 0x127f, 0x007c, 0x0e7e, 0x2071, 0xa8b1, 0x7020, 0xa005, ++ 0x0040, 0x723c, 0x8001, 0x7022, 0x0e7f, 0x007c, 0x20a9, 0x0008, ++ 0x20a2, 0x00f0, 0x7240, 0x20a2, 0x20a2, 0x007c, 0x0f7e, 0x0e7e, ++ 0x0d7e, 0x0c7e, 0x077e, 0x067e, 0x007e, 0x127e, 0x2091, 0x8000, ++ 0x2071, 0xa8b1, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, ++ 0x0040, 0x72e2, 0x8cff, 0x0040, 0x72e2, 0x601c, 0xa086, 0x0006, ++ 0x00c0, 0x72dd, 0x88ff, 0x0040, 0x726d, 0x2800, 0xac06, 0x00c0, ++ 0x72dd, 0x2039, 0x0000, 0x0078, 0x7278, 0x6018, 0xa206, 0x00c0, ++ 0x72dd, 0x85ff, 0x0040, 0x7278, 0x6020, 0xa106, 0x00c0, 0x72dd, ++ 0x7024, 0xac06, 0x00c0, 0x72a8, 0x2069, 0x0100, 0x68c0, 0xa005, ++ 0x0040, 0x72a3, 0x1078, 0x5acb, 0x6817, 0x0008, 0x68c3, 0x0000, ++ 0x1078, 0x7378, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, ++ 0xa384, 0x1000, 0x0040, 0x7298, 0x6803, 0x0100, 0x6803, 0x0000, ++ 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x72a0, 0x6827, 0x0001, ++ 0x037f, 0x0078, 0x72a8, 0x6003, 0x0009, 0x630a, 0x0078, 0x72dd, ++ 0x7014, 0xac36, 0x00c0, 0x72ae, 0x660c, 0x7616, 0x7010, 0xac36, ++ 0x00c0, 0x72bc, 0x2c00, 0xaf36, 0x0040, 0x72ba, 0x2f00, 0x7012, ++ 0x0078, 0x72bc, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, ++ 0x0040, 0x72c5, 0x7e0e, 0x0078, 0x72c6, 0x2678, 0x89ff, 0x00c0, ++ 0x72d5, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, ++ 0x72d3, 0x1078, 0xa1ca, 0x1078, 0x8ec6, 0x1078, 0x7233, 0x88ff, ++ 0x00c0, 0x72ec, 0x0c7f, 0x0078, 0x7257, 0x2c78, 0x600c, 0x2060, ++ 0x0078, 0x7257, 0xa006, 0x127f, 0x007f, 0x067f, 0x077f, 0x0c7f, ++ 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x6017, 0x0000, 0x0c7f, 0xa8c5, ++ 0x0001, 0x0078, 0x72e3, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, ++ 0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x7638, ++ 0x2660, 0x2678, 0x8cff, 0x0040, 0x7367, 0x601c, 0xa086, 0x0006, ++ 0x00c0, 0x7362, 0x87ff, 0x0040, 0x7313, 0x2700, 0xac06, 0x00c0, ++ 0x7362, 0x0078, 0x731e, 0x6018, 0xa206, 0x00c0, 0x7362, 0x85ff, ++ 0x0040, 0x731e, 0x6020, 0xa106, 0x00c0, 0x7362, 0x703c, 0xac06, ++ 0x00c0, 0x7332, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x7033, ++ 0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x704b, ++ 0x0000, 0x037f, 0x7038, 0xac36, 0x00c0, 0x7338, 0x660c, 0x763a, ++ 0x7034, 0xac36, 0x00c0, 0x7346, 0x2c00, 0xaf36, 0x0040, 0x7344, ++ 0x2f00, 0x7036, 0x0078, 0x7346, 0x7037, 0x0000, 0x660c, 0x067e, ++ 0x2c00, 0xaf06, 0x0040, 0x734f, 0x7e0e, 0x0078, 0x7350, 0x2678, ++ 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x735a, ++ 0x1078, 0xa1ca, 0x1078, 0x8ec6, 0x87ff, 0x00c0, 0x7371, 0x0c7f, ++ 0x0078, 0x7302, 0x2c78, 0x600c, 0x2060, 0x0078, 0x7302, 0xa006, ++ 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, ++ 0x007c, 0x6017, 0x0000, 0x0c7f, 0xa7bd, 0x0001, 0x0078, 0x7368, ++ 0x0e7e, 0x2071, 0xa8b1, 0x2001, 0xa600, 0x2004, 0xa086, 0x0002, ++ 0x00c0, 0x7386, 0x7007, 0x0005, 0x0078, 0x7388, 0x7007, 0x0000, ++ 0x0e7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e, 0x027e, 0x007e, ++ 0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x2c10, 0x7638, 0x2660, ++ 0x2678, 0x8cff, 0x0040, 0x73c8, 0x2200, 0xac06, 0x00c0, 0x73c3, ++ 0x7038, 0xac36, 0x00c0, 0x73a6, 0x660c, 0x763a, 0x7034, 0xac36, ++ 0x00c0, 0x73b4, 0x2c00, 0xaf36, 0x0040, 0x73b2, 0x2f00, 0x7036, ++ 0x0078, 0x73b4, 0x7037, 0x0000, 0x660c, 0x2c00, 0xaf06, 0x0040, ++ 0x73bc, 0x7e0e, 0x0078, 0x73bd, 0x2678, 0x600f, 0x0000, 0xa085, ++ 0x0001, 0x0078, 0x73c8, 0x2c78, 0x600c, 0x2060, 0x0078, 0x7399, ++ 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, ++ 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e, 0x127e, 0x2091, ++ 0x8000, 0x2071, 0xa8b1, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0040, ++ 0x7469, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x7464, ++ 0x7024, 0xac06, 0x00c0, 0x740f, 0x2069, 0x0100, 0x68c0, 0xa005, ++ 0x0040, 0x743d, 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, ++ 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, ++ 0x0040, 0x7406, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, ++ 0x6824, 0xd084, 0x0040, 0x740e, 0x6827, 0x0001, 0x037f, 0x700c, ++ 0xac36, 0x00c0, 0x7415, 0x660c, 0x760e, 0x7008, 0xac36, 0x00c0, ++ 0x7423, 0x2c00, 0xaf36, 0x0040, 0x7421, 0x2f00, 0x700a, 0x0078, ++ 0x7423, 0x700b, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, ++ 0x742c, 0x7e0e, 0x0078, 0x742d, 0x2678, 0x600f, 0x0000, 0x1078, ++ 0x8eec, 0x00c0, 0x7441, 0x1078, 0x28a6, 0x1078, 0x8f00, 0x00c0, ++ 0x745d, 0x1078, 0x7c83, 0x0078, 0x745d, 0x1078, 0x7378, 0x0078, ++ 0x740f, 0x1078, 0x8f00, 0x00c0, 0x7449, 0x1078, 0x7c83, 0x0078, ++ 0x745d, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x745d, 0x601c, ++ 0xa086, 0x0003, 0x00c0, 0x7471, 0x6837, 0x0103, 0x6b4a, 0x6847, ++ 0x0000, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x1078, 0x8ec6, 0x1078, ++ 0x7233, 0x0c7f, 0x0078, 0x73de, 0x2c78, 0x600c, 0x2060, 0x0078, ++ 0x73de, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, ++ 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x745d, 0x1078, 0xa1ca, ++ 0x0078, 0x745d, 0x037e, 0x157e, 0x137e, 0x147e, 0x3908, 0xa006, ++ 0xa190, 0x0020, 0x221c, 0xa39e, 0x2676, 0x00c0, 0x748b, 0x8210, ++ 0x8000, 0x0078, 0x7482, 0xa005, 0x0040, 0x7497, 0x20a9, 0x0020, ++ 0x2198, 0x8211, 0xa282, 0x0020, 0x20c8, 0x20a0, 0x53a3, 0x147f, ++ 0x137f, 0x157f, 0x037f, 0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078, ++ 0x67c2, 0x20a3, 0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x2099, 0xa8a5, 0x20a9, 0x0004, 0x53a6, ++ 0x20a3, 0x0004, 0x20a3, 0x7878, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x1078, 0x6dfb, 0x0d7f, 0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2, ++ 0x20a3, 0x0214, 0x20a3, 0x0018, 0x20a3, 0x0800, 0x7810, 0xa084, ++ 0xff00, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x7810, 0xa084, 0x00ff, 0x20a2, 0x7828, 0x20a2, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0018, 0x1078, 0x6dfb, ++ 0x007c, 0x0d7e, 0x017e, 0x2f68, 0x2009, 0x0035, 0x1078, 0x91bc, ++ 0x00c0, 0x7551, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x1300, ++ 0x20a3, 0x0000, 0x7828, 0x2068, 0x681c, 0xa086, 0x0003, 0x0040, ++ 0x752d, 0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, 0x00c0, ++ 0x7507, 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x0078, 0x7542, 0xa286, ++ 0x007f, 0x00c0, 0x7511, 0x20a3, 0x00ff, 0x20a3, 0xfffd, 0x0078, ++ 0x7542, 0xd2bc, 0x0040, 0x7527, 0xa286, 0x0080, 0x00c0, 0x751e, ++ 0x20a3, 0x00ff, 0x20a3, 0xfffc, 0x0078, 0x7542, 0xa2e8, 0xa735, ++ 0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x0078, 0x7542, 0x20a3, ++ 0x0000, 0x6098, 0x20a2, 0x0078, 0x7542, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0xa082, 0x007e, 0x0048, 0x753e, 0x0d7e, 0x2069, 0xa61b, ++ 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x7542, 0x20a3, 0x0000, ++ 0x6030, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x60c3, 0x000c, 0x1078, 0x6dfb, 0x017f, 0x0d7f, ++ 0x007c, 0x7817, 0x0001, 0x7803, 0x0006, 0x017f, 0x0d7f, 0x007c, ++ 0x0d7e, 0x027e, 0x7928, 0x2168, 0x691c, 0xa186, 0x0006, 0x0040, ++ 0x757a, 0xa186, 0x0003, 0x0040, 0x75d5, 0xa186, 0x0005, 0x0040, ++ 0x75b8, 0xa186, 0x0004, 0x0040, 0x75a8, 0xa186, 0x0008, 0x0040, ++ 0x75c2, 0x7807, 0x0037, 0x7813, 0x1700, 0x1078, 0x7640, 0x027f, ++ 0x0d7f, 0x007c, 0x1078, 0x75fd, 0x2009, 0x4000, 0x6800, 0x0079, ++ 0x7581, 0x7594, 0x75a2, 0x7596, 0x75a2, 0x759d, 0x7594, 0x7594, ++ 0x75a2, 0x75a2, 0x75a2, 0x75a2, 0x7594, 0x7594, 0x7594, 0x7594, ++ 0x7594, 0x75a2, 0x7594, 0x75a2, 0x1078, 0x1332, 0x6824, 0xd0e4, ++ 0x0040, 0x759d, 0xd0cc, 0x0040, 0x75a0, 0xa00e, 0x0078, 0x75a2, ++ 0x2009, 0x2000, 0x6828, 0x20a2, 0x682c, 0x20a2, 0x0078, 0x75f3, ++ 0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000, ++ 0x6a00, 0xa286, 0x0002, 0x00c0, 0x75b6, 0xa00e, 0x0078, 0x75f3, ++ 0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000, ++ 0x0078, 0x75f3, 0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x2009, 0x4000, 0xa286, 0x0005, 0x0040, 0x75d2, 0xa286, 0x0002, ++ 0x00c0, 0x75d3, 0xa00e, 0x0078, 0x75f3, 0x1078, 0x75fd, 0x6810, ++ 0x2068, 0x697c, 0x6810, 0xa112, 0x6980, 0x6814, 0xa103, 0x20a2, ++ 0x22a2, 0x7928, 0xa180, 0x0000, 0x2004, 0xa08e, 0x0002, 0x0040, ++ 0x75f1, 0xa08e, 0x0004, 0x0040, 0x75f1, 0x2009, 0x4000, 0x0078, ++ 0x75f3, 0x2009, 0x0000, 0x21a2, 0x20a3, 0x0000, 0x60c3, 0x0018, ++ 0x1078, 0x6dfb, 0x027f, 0x0d7f, 0x007c, 0x037e, 0x047e, 0x057e, ++ 0x067e, 0x20a1, 0x020b, 0x1078, 0x67c2, 0xa006, 0x20a3, 0x0200, ++ 0x20a2, 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0xa092, 0x007e, 0x0048, 0x7623, 0x0d7e, 0x2069, 0xa61b, ++ 0x2d2c, 0x8d68, 0x2d34, 0xa0e8, 0xa735, 0x2d6c, 0x6b10, 0x6c14, ++ 0x0d7f, 0x0078, 0x7629, 0x2019, 0x0000, 0x6498, 0x2029, 0x0000, ++ 0x6630, 0x7828, 0xa080, 0x0007, 0x2004, 0xa086, 0x0003, 0x00c0, ++ 0x7637, 0x25a2, 0x26a2, 0x23a2, 0x24a2, 0x0078, 0x763b, 0x23a2, ++ 0x24a2, 0x25a2, 0x26a2, 0x067f, 0x057f, 0x047f, 0x037f, 0x007c, ++ 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, ++ 0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, ++ 0x007c, 0x20a1, 0x020b, 0x1078, 0x6728, 0x20a3, 0x1400, 0x20a3, ++ 0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x7828, 0x20a2, 0x782c, ++ 0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x20a3, 0x0000, ++ 0x60c3, 0x0010, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, ++ 0x67b9, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0x20a2, 0x7810, ++ 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x147e, 0x20a1, ++ 0x020b, 0x1078, 0x7689, 0x60c3, 0x0000, 0x1078, 0x6dfb, 0x147f, ++ 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0xd0bc, 0x0040, 0x76a6, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, ++ 0x6810, 0xa085, 0x0300, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, ++ 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x76ae, 0x20a3, 0x0300, ++ 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0819, ++ 0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x2fa2, ++ 0x7a08, 0x22a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x007c, 0x2061, ++ 0xad00, 0x2a70, 0x7064, 0x704a, 0x704f, 0xad00, 0x007c, 0x0e7e, ++ 0x127e, 0x2071, 0xa600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0010, ++ 0x0048, 0x76f9, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040, ++ 0x76e5, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8, 0x76e1, 0x0078, ++ 0x76d4, 0x2061, 0xad00, 0x0078, 0x76d4, 0x6003, 0x0008, 0x8529, ++ 0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8, 0x76f5, 0x754e, ++ 0xa085, 0x0001, 0x127f, 0x0e7f, 0x007c, 0x704f, 0xad00, 0x0078, ++ 0x76f0, 0xa006, 0x0078, 0x76f2, 0x0e7e, 0x2071, 0xa600, 0x7548, ++ 0xa582, 0x0010, 0x0048, 0x772a, 0x704c, 0x2060, 0x6000, 0xa086, ++ 0x0000, 0x0040, 0x7717, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8, ++ 0x7713, 0x0078, 0x7706, 0x2061, 0xad00, 0x0078, 0x7706, 0x6003, ++ 0x0008, 0x8529, 0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8, ++ 0x7726, 0x754e, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x704f, 0xad00, ++ 0x0078, 0x7722, 0xa006, 0x0078, 0x7724, 0xac82, 0xad00, 0x1048, ++ 0x1332, 0x2001, 0xa616, 0x2004, 0xac02, 0x10c8, 0x1332, 0xa006, ++ 0x6006, 0x600a, 0x600e, 0x6012, 0x6016, 0x601a, 0x601f, 0x0000, ++ 0x6003, 0x0000, 0x6022, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, ++ 0x603a, 0x603e, 0x2061, 0xa600, 0x6048, 0x8000, 0x604a, 0xa086, ++ 0x0001, 0x0040, 0x7754, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078, ++ 0x62d1, 0x127f, 0x0078, 0x7753, 0x601c, 0xa084, 0x000f, 0x0079, ++ 0x7761, 0x776a, 0x777b, 0x7797, 0x77b3, 0x920e, 0x922a, 0x9246, ++ 0x776a, 0x777b, 0xa186, 0x0013, 0x00c0, 0x7773, 0x1078, 0x61cd, ++ 0x1078, 0x62d1, 0x007c, 0xa18e, 0x0047, 0x00c0, 0x777a, 0xa016, ++ 0x1078, 0x15fa, 0x007c, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, ++ 0x1332, 0x1079, 0x7785, 0x067f, 0x007c, 0x7795, 0x7b00, 0x7cb2, ++ 0x7795, 0x7d36, 0x77cf, 0x7795, 0x7795, 0x7a92, 0x80f6, 0x7795, ++ 0x7795, 0x7795, 0x7795, 0x7795, 0x7795, 0x1078, 0x1332, 0x067e, ++ 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x77a1, 0x067f, ++ 0x007c, 0x77b1, 0x87c3, 0x77b1, 0x77b1, 0x77b1, 0x77b1, 0x77b1, ++ 0x77b1, 0x8766, 0x8951, 0x77b1, 0x87f3, 0x8879, 0x87f3, 0x8879, ++ 0x77b1, 0x1078, 0x1332, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, ++ 0x1332, 0x1079, 0x77bd, 0x067f, 0x007c, 0x77cd, 0x813d, 0x820e, ++ 0x8368, 0x84e4, 0x77cd, 0x77cd, 0x77cd, 0x8116, 0x870e, 0x8712, ++ 0x77cd, 0x77cd, 0x77cd, 0x77cd, 0x8742, 0x1078, 0x1332, 0xa1b6, ++ 0x0015, 0x00c0, 0x77d7, 0x1078, 0x772d, 0x0078, 0x77dd, 0xa1b6, ++ 0x0016, 0x10c0, 0x1332, 0x1078, 0x772d, 0x007c, 0x20a9, 0x000e, ++ 0x2e98, 0x6010, 0x20a0, 0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420, ++ 0x9398, 0x94a0, 0x3318, 0x3428, 0x222e, 0x2326, 0xa290, 0x0002, ++ 0xa5a8, 0x0002, 0xa398, 0x0002, 0xa4a0, 0x0002, 0x00f0, 0x77ec, ++ 0x0e7e, 0x1078, 0x8d06, 0x0040, 0x7803, 0x6010, 0x2070, 0x7007, ++ 0x0000, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x772d, 0x007c, 0x0d7e, ++ 0x037e, 0x7330, 0xa386, 0x0200, 0x00c0, 0x7814, 0x6018, 0x2068, ++ 0x6813, 0x00ff, 0x6817, 0xfffd, 0x6010, 0xa005, 0x0040, 0x781e, ++ 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6b32, 0x1078, 0x772d, ++ 0x037f, 0x0d7f, 0x007c, 0x017e, 0x20a9, 0x002a, 0xae80, 0x000c, ++ 0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, 0x53a3, 0x20a9, 0x002a, ++ 0x6010, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x20a0, 0x53a3, ++ 0x0e7e, 0x6010, 0x2004, 0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078, ++ 0x772d, 0x017f, 0x007c, 0x0e7e, 0x0d7e, 0x603f, 0x0000, 0x2c68, ++ 0x017e, 0x2009, 0x0035, 0x1078, 0x91bc, 0x017f, 0x00c0, 0x785f, ++ 0x027e, 0x6228, 0x2268, 0x027f, 0x2071, 0xab8c, 0x6b1c, 0xa386, ++ 0x0003, 0x0040, 0x7863, 0xa386, 0x0006, 0x0040, 0x7867, 0x1078, ++ 0x772d, 0x0078, 0x7869, 0x1078, 0x786c, 0x0078, 0x7869, 0x1078, ++ 0x7938, 0x0d7f, 0x0e7f, 0x007c, 0x0f7e, 0x6810, 0x2078, 0xa186, ++ 0x0015, 0x0040, 0x791d, 0xa18e, 0x0016, 0x00c0, 0x7936, 0x700c, ++ 0xa08c, 0xff00, 0xa186, 0x1700, 0x0040, 0x7882, 0xa186, 0x0300, ++ 0x00c0, 0x78f8, 0x8fff, 0x00c0, 0x788c, 0x6800, 0xa086, 0x000f, ++ 0x0040, 0x78db, 0x0078, 0x7934, 0x6808, 0xa086, 0xffff, 0x00c0, ++ 0x7921, 0x784c, 0xa084, 0x0060, 0xa086, 0x0020, 0x00c0, 0x78a2, ++ 0x797c, 0x7810, 0xa106, 0x00c0, 0x7921, 0x7980, 0x7814, 0xa106, ++ 0x00c0, 0x7921, 0x1078, 0x8eb9, 0x6830, 0x7852, 0x784c, 0xc0dc, ++ 0xc0f4, 0xc0d4, 0x784e, 0x027e, 0xa00e, 0x6a14, 0x2001, 0x000a, ++ 0x1078, 0x5c1c, 0x7854, 0xa20a, 0x0048, 0x78b7, 0x8011, 0x7a56, ++ 0x82ff, 0x027f, 0x00c0, 0x78c3, 0x0c7e, 0x2d60, 0x1078, 0x8ae0, ++ 0x0c7f, 0x0078, 0x7934, 0x0c7e, 0x0d7e, 0x2f68, 0x6838, 0xd0fc, ++ 0x00c0, 0x78ce, 0x1078, 0x4353, 0x0078, 0x78d0, 0x1078, 0x4431, ++ 0x0d7f, 0x0c7f, 0x00c0, 0x7921, 0x0c7e, 0x2d60, 0x1078, 0x772d, ++ 0x0c7f, 0x0078, 0x7934, 0x0c7e, 0x1078, 0x9187, 0x0040, 0x78f1, ++ 0x6013, 0x0000, 0x6818, 0x601a, 0x601f, 0x0003, 0x6904, 0x0c7e, ++ 0x2d60, 0x1078, 0x772d, 0x0c7f, 0x1078, 0x775c, 0x0c7f, 0x0078, ++ 0x7934, 0x2001, 0xa8a4, 0x2004, 0x683e, 0x0c7f, 0x0078, 0x7934, ++ 0x7008, 0xa086, 0x000b, 0x00c0, 0x7912, 0x6018, 0x200c, 0xc1bc, ++ 0x2102, 0x0c7e, 0x2d60, 0x7853, 0x0003, 0x6007, 0x0085, 0x6003, ++ 0x000b, 0x601f, 0x0002, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f, ++ 0x0078, 0x7934, 0x700c, 0xa086, 0x2a00, 0x00c0, 0x7921, 0x2001, ++ 0xa8a4, 0x2004, 0x683e, 0x0078, 0x7934, 0x1078, 0x7953, 0x0078, ++ 0x7936, 0x8fff, 0x1040, 0x1332, 0x0c7e, 0x0d7e, 0x2d60, 0x2f68, ++ 0x6837, 0x0103, 0x684b, 0x0003, 0x1078, 0x89cf, 0x1078, 0x8eb9, ++ 0x1078, 0x8ec6, 0x0d7f, 0x0c7f, 0x1078, 0x772d, 0x0f7f, 0x007c, ++ 0xa186, 0x0015, 0x00c0, 0x7942, 0x2001, 0xa8a4, 0x2004, 0x683e, ++ 0x0078, 0x7950, 0xa18e, 0x0016, 0x00c0, 0x7952, 0x0c7e, 0x2d00, ++ 0x2060, 0x1078, 0xa495, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x0c7f, ++ 0x1078, 0x772d, 0x007c, 0x027e, 0x037e, 0x047e, 0x7228, 0x7c80, ++ 0x7b7c, 0xd2f4, 0x0040, 0x7962, 0x2001, 0xa8a4, 0x2004, 0x683e, ++ 0x0078, 0x79c6, 0x0c7e, 0x2d60, 0x1078, 0x89f3, 0x0c7f, 0x6804, ++ 0xa086, 0x0050, 0x00c0, 0x797a, 0x0c7e, 0x2d00, 0x2060, 0x6003, ++ 0x0001, 0x6007, 0x0050, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f, ++ 0x0078, 0x79c6, 0x6800, 0xa086, 0x000f, 0x0040, 0x799c, 0x8fff, ++ 0x1040, 0x1332, 0x6824, 0xd0dc, 0x00c0, 0x799c, 0x6800, 0xa086, ++ 0x0004, 0x00c0, 0x79a1, 0x784c, 0xd0ac, 0x0040, 0x79a1, 0x784c, ++ 0xc0dc, 0xc0f4, 0x784e, 0x7850, 0xc0f4, 0xc0fc, 0x7852, 0x2001, ++ 0x0001, 0x682e, 0x0078, 0x79c0, 0x2001, 0x0007, 0x682e, 0x0078, ++ 0x79c0, 0x784c, 0xd0b4, 0x00c0, 0x79ae, 0xd0ac, 0x0040, 0x799c, ++ 0x784c, 0xd0f4, 0x00c0, 0x799c, 0x0078, 0x798f, 0xd2ec, 0x00c0, ++ 0x799c, 0x7024, 0xa306, 0x00c0, 0x79b9, 0x7020, 0xa406, 0x0040, ++ 0x799c, 0x7020, 0x6836, 0x7024, 0x683a, 0x2001, 0x0005, 0x682e, ++ 0x1078, 0x8ff0, 0x1078, 0x62d1, 0x0078, 0x79c8, 0x1078, 0x772d, ++ 0x047f, 0x037f, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x027e, 0x6034, ++ 0x2068, 0x6a1c, 0xa286, 0x0007, 0x0040, 0x7a35, 0xa286, 0x0002, ++ 0x0040, 0x7a35, 0xa286, 0x0000, 0x0040, 0x7a35, 0x6808, 0x6338, ++ 0xa306, 0x00c0, 0x7a35, 0x2071, 0xab8c, 0xa186, 0x0015, 0x0040, ++ 0x7a2f, 0xa18e, 0x0016, 0x00c0, 0x7a02, 0x6030, 0xa084, 0x00ff, ++ 0xa086, 0x0001, 0x00c0, 0x7a02, 0x700c, 0xa086, 0x2a00, 0x00c0, ++ 0x7a02, 0x6034, 0xa080, 0x0009, 0x200c, 0xc1dd, 0xc1f5, 0x2102, ++ 0x0078, 0x7a2f, 0x0c7e, 0x6034, 0x2060, 0x6104, 0xa186, 0x004b, ++ 0x0040, 0x7a22, 0xa186, 0x004c, 0x0040, 0x7a22, 0xa186, 0x004d, ++ 0x0040, 0x7a22, 0xa186, 0x004e, 0x0040, 0x7a22, 0xa186, 0x0052, ++ 0x0040, 0x7a22, 0x6010, 0x2068, 0x1078, 0x8d06, 0x1040, 0x1332, ++ 0x6853, 0x0003, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, ++ 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f, 0x0078, 0x7a35, 0x6034, ++ 0x2068, 0x2001, 0xa8a4, 0x2004, 0x683e, 0x1078, 0x772d, 0x027f, ++ 0x0d7f, 0x0e7f, 0x007c, 0x0d7e, 0x20a9, 0x000e, 0x2e98, 0x6010, ++ 0x20a0, 0x53a3, 0xa1b6, 0x0015, 0x00c0, 0x7a73, 0x6018, 0x2068, ++ 0x157e, 0x037e, 0x027e, 0xae90, 0x000c, 0xa290, 0x0004, 0x20a9, ++ 0x0004, 0xad98, 0x000a, 0x1078, 0x80de, 0x027f, 0x037f, 0x157f, ++ 0x00c0, 0x7a76, 0x157e, 0x037e, 0x027e, 0xae90, 0x000c, 0xa290, ++ 0x0008, 0x20a9, 0x0004, 0xad98, 0x0006, 0x1078, 0x80de, 0x027f, ++ 0x037f, 0x157f, 0x00c0, 0x7a76, 0x7038, 0x680a, 0x703c, 0x680e, ++ 0x6800, 0xc08d, 0x6802, 0x0d7f, 0x0078, 0x77f8, 0x1078, 0x2880, ++ 0x0c7e, 0x1078, 0x76c7, 0x2f00, 0x601a, 0x6013, 0x0000, 0x601f, ++ 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x1078, ++ 0x4502, 0x1078, 0x4535, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0c7f, ++ 0x0078, 0x7a73, 0x2100, 0xa1b2, 0x0044, 0x10c8, 0x1332, 0xa1b2, ++ 0x0040, 0x00c8, 0x7af7, 0x0079, 0x7a9d, 0x7aeb, 0x7adf, 0x7aeb, ++ 0x7aeb, 0x7aeb, 0x7aeb, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, ++ 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, ++ 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, ++ 0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb, 0x7add, 0x7aeb, 0x7aeb, ++ 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb, 0x7add, 0x7add, ++ 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb, ++ 0x7aeb, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, ++ 0x7add, 0x7add, 0x7aeb, 0x7add, 0x7add, 0x1078, 0x1332, 0x6003, ++ 0x0001, 0x6106, 0x1078, 0x5dd7, 0x127e, 0x2091, 0x8000, 0x1078, ++ 0x62d1, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078, 0x5dd7, ++ 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x2600, ++ 0x0079, 0x7afa, 0x7afe, 0x7afe, 0x7afe, 0x7aeb, 0x1078, 0x1332, ++ 0x6004, 0xa0b2, 0x0044, 0x10c8, 0x1332, 0xa1b6, 0x0013, 0x00c0, ++ 0x7b10, 0xa0b2, 0x0040, 0x00c8, 0x7c79, 0x2008, 0x0079, 0x7bbf, ++ 0xa1b6, 0x0027, 0x00c0, 0x7b7c, 0x1078, 0x61cd, 0x6004, 0x1078, ++ 0x8eec, 0x0040, 0x7b2d, 0x1078, 0x8f00, 0x0040, 0x7b74, 0xa08e, ++ 0x0021, 0x0040, 0x7b78, 0xa08e, 0x0022, 0x0040, 0x7b74, 0xa08e, ++ 0x003d, 0x0040, 0x7b78, 0x0078, 0x7b6f, 0x1078, 0x28a6, 0x2001, ++ 0x0007, 0x1078, 0x4502, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078, ++ 0x7c83, 0xa186, 0x007e, 0x00c0, 0x7b42, 0x2001, 0xa633, 0x2014, ++ 0xc285, 0x2202, 0x017e, 0x027e, 0x037e, 0x2110, 0x027e, 0x2019, ++ 0x0028, 0x1078, 0x73d0, 0x027f, 0x1078, 0xa4f1, 0x037f, 0x027f, ++ 0x017f, 0x017e, 0x027e, 0x037e, 0x2110, 0x2019, 0x0028, 0x1078, ++ 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x0c7e, 0x6018, ++ 0xa065, 0x0040, 0x7b65, 0x1078, 0x47e9, 0x0c7f, 0x2c08, 0x1078, ++ 0x9f8b, 0x077f, 0x037f, 0x027f, 0x017f, 0x1078, 0x457f, 0x1078, ++ 0x772d, 0x1078, 0x62d1, 0x007c, 0x1078, 0x7c83, 0x0078, 0x7b6f, ++ 0x1078, 0x7ca6, 0x0078, 0x7b6f, 0xa186, 0x0014, 0x00c0, 0x7b73, ++ 0x1078, 0x61cd, 0x1078, 0x2880, 0x1078, 0x8eec, 0x00c0, 0x7b9b, ++ 0x1078, 0x28a6, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078, 0x7c83, ++ 0xa186, 0x007e, 0x00c0, 0x7b99, 0x2001, 0xa633, 0x200c, 0xc185, ++ 0x2102, 0x0078, 0x7b6f, 0x1078, 0x8f00, 0x00c0, 0x7ba3, 0x1078, ++ 0x7c83, 0x0078, 0x7b6f, 0x6004, 0xa08e, 0x0032, 0x00c0, 0x7bb4, ++ 0x0e7e, 0x0f7e, 0x2071, 0xa682, 0x2079, 0x0000, 0x1078, 0x2bd7, ++ 0x0f7f, 0x0e7f, 0x0078, 0x7b6f, 0x6004, 0xa08e, 0x0021, 0x0040, ++ 0x7b9f, 0xa08e, 0x0022, 0x1040, 0x7c83, 0x0078, 0x7b6f, 0x7c01, ++ 0x7c03, 0x7c07, 0x7c0b, 0x7c0f, 0x7c13, 0x7bff, 0x7bff, 0x7bff, ++ 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, ++ 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, ++ 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7c17, 0x7c29, 0x7bff, ++ 0x7c2b, 0x7c29, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7c29, ++ 0x7c29, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, ++ 0x7bff, 0x7c5c, 0x7c29, 0x7bff, 0x7c23, 0x7bff, 0x7bff, 0x7bff, ++ 0x7c25, 0x7bff, 0x7bff, 0x7bff, 0x7c29, 0x7bff, 0x7bff, 0x1078, ++ 0x1332, 0x0078, 0x7c29, 0x2001, 0x000b, 0x0078, 0x7c36, 0x2001, ++ 0x0003, 0x0078, 0x7c36, 0x2001, 0x0005, 0x0078, 0x7c36, 0x2001, ++ 0x0001, 0x0078, 0x7c36, 0x2001, 0x0009, 0x0078, 0x7c36, 0x1078, ++ 0x61cd, 0x6003, 0x0005, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x1078, ++ 0x62d1, 0x0078, 0x7c35, 0x0078, 0x7c29, 0x0078, 0x7c29, 0x1078, ++ 0x4502, 0x0078, 0x7c6e, 0x1078, 0x61cd, 0x6003, 0x0004, 0x2001, ++ 0xa8a2, 0x2004, 0x6016, 0x1078, 0x62d1, 0x007c, 0x1078, 0x4502, ++ 0x1078, 0x61cd, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0002, ++ 0x037e, 0x2019, 0xa65d, 0x2304, 0xa084, 0xff00, 0x00c0, 0x7c4d, ++ 0x2019, 0xa8a2, 0x231c, 0x0078, 0x7c56, 0x8007, 0xa09a, 0x0004, ++ 0x0048, 0x7c48, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x037f, ++ 0x1078, 0x62d1, 0x0078, 0x7c35, 0x0e7e, 0x0f7e, 0x2071, 0xa682, ++ 0x2079, 0x0000, 0x1078, 0x2bd7, 0x0f7f, 0x0e7f, 0x1078, 0x61cd, ++ 0x1078, 0x772d, 0x1078, 0x62d1, 0x0078, 0x7c35, 0x1078, 0x61cd, ++ 0x6003, 0x0002, 0x2001, 0xa8a2, 0x2004, 0x6016, 0x1078, 0x62d1, ++ 0x007c, 0x2600, 0x2008, 0x0079, 0x7c7d, 0x7c81, 0x7c81, 0x7c81, ++ 0x7c6e, 0x1078, 0x1332, 0x0e7e, 0x1078, 0x8d06, 0x0040, 0x7c9f, ++ 0x6010, 0x2070, 0x7038, 0xd0fc, 0x0040, 0x7c9f, 0x7007, 0x0000, ++ 0x017e, 0x6004, 0xa08e, 0x0021, 0x0040, 0x7ca1, 0xa08e, 0x003d, ++ 0x0040, 0x7ca1, 0x017f, 0x7037, 0x0103, 0x7033, 0x0100, 0x0e7f, ++ 0x007c, 0x017f, 0x1078, 0x7ca6, 0x0078, 0x7c9f, 0x0e7e, 0xacf0, ++ 0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x7023, 0x8001, ++ 0x0e7f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, 0x00ff, ++ 0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x1332, 0x6604, 0xa6b6, 0x0043, ++ 0x00c0, 0x7cc6, 0x1078, 0x9134, 0x0078, 0x7d25, 0x6604, 0xa6b6, ++ 0x0033, 0x00c0, 0x7ccf, 0x1078, 0x90d8, 0x0078, 0x7d25, 0x6604, ++ 0xa6b6, 0x0028, 0x00c0, 0x7cd8, 0x1078, 0x8f2f, 0x0078, 0x7d25, ++ 0x6604, 0xa6b6, 0x0029, 0x00c0, 0x7ce1, 0x1078, 0x8f49, 0x0078, ++ 0x7d25, 0x6604, 0xa6b6, 0x001f, 0x00c0, 0x7cea, 0x1078, 0x77de, ++ 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0000, 0x00c0, 0x7cf3, 0x1078, ++ 0x7a3b, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0022, 0x00c0, 0x7cfc, ++ 0x1078, 0x7807, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0035, 0x00c0, ++ 0x7d05, 0x1078, 0x7843, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0039, ++ 0x00c0, 0x7d0e, 0x1078, 0x79cc, 0x0078, 0x7d25, 0x6604, 0xa6b6, ++ 0x003d, 0x00c0, 0x7d17, 0x1078, 0x7823, 0x0078, 0x7d25, 0xa1b6, ++ 0x0015, 0x00c0, 0x7d1f, 0x1079, 0x7d2a, 0x0078, 0x7d25, 0xa1b6, ++ 0x0016, 0x00c0, 0x7d26, 0x1079, 0x7e7f, 0x007c, 0x1078, 0x7773, ++ 0x0078, 0x7d25, 0x7d4e, 0x7d51, 0x7d4e, 0x7d9c, 0x7d4e, 0x7e13, ++ 0x7e8b, 0x7d4e, 0x7d4e, 0x7e57, 0x7d4e, 0x7e6d, 0xa1b6, 0x0048, ++ 0x0040, 0x7d42, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, ++ 0x15fa, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070, ++ 0x7037, 0x0103, 0x0e7f, 0x1078, 0x772d, 0x007c, 0x0005, 0x0005, ++ 0x007c, 0x0e7e, 0x2071, 0xa600, 0x7080, 0xa086, 0x0074, 0x00c0, ++ 0x7d85, 0x1078, 0x9f5f, 0x00c0, 0x7d77, 0x0d7e, 0x6018, 0x2068, ++ 0x7030, 0xd08c, 0x0040, 0x7d6a, 0x6800, 0xd0bc, 0x0040, 0x7d6a, ++ 0xc0c5, 0x6802, 0x1078, 0x7d89, 0x0d7f, 0x2001, 0x0006, 0x1078, ++ 0x4502, 0x1078, 0x28a6, 0x1078, 0x772d, 0x0078, 0x7d87, 0x2001, ++ 0x000a, 0x1078, 0x4502, 0x1078, 0x28a6, 0x6003, 0x0001, 0x6007, ++ 0x0001, 0x1078, 0x5dd7, 0x0078, 0x7d87, 0x1078, 0x7dff, 0x0e7f, ++ 0x007c, 0x6800, 0xd084, 0x0040, 0x7d9b, 0x2001, 0x0000, 0x1078, ++ 0x44ee, 0x2069, 0xa652, 0x6804, 0xd0a4, 0x0040, 0x7d9b, 0x2001, ++ 0x0006, 0x1078, 0x4535, 0x007c, 0x0d7e, 0x2011, 0xa620, 0x2204, ++ 0xa086, 0x0074, 0x00c0, 0x7dfb, 0x6018, 0x2068, 0x6aa0, 0xa286, ++ 0x007e, 0x00c0, 0x7daf, 0x1078, 0x7f9b, 0x0078, 0x7dfd, 0x1078, ++ 0x7f91, 0x6018, 0x2068, 0xa080, 0x0028, 0x2014, 0xa286, 0x0080, ++ 0x00c0, 0x7dd3, 0x6813, 0x00ff, 0x6817, 0xfffc, 0x6010, 0xa005, ++ 0x0040, 0x7dc9, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6833, ++ 0x0200, 0x2001, 0x0006, 0x1078, 0x4502, 0x1078, 0x28a6, 0x1078, ++ 0x772d, 0x0078, 0x7dfd, 0x0e7e, 0x2071, 0xa633, 0x2e04, 0xd09c, ++ 0x0040, 0x7dee, 0x2071, 0xab80, 0x7108, 0x720c, 0xa18c, 0x00ff, ++ 0x00c0, 0x7de6, 0xa284, 0xff00, 0x0040, 0x7dee, 0x6018, 0x2070, ++ 0x70a0, 0xd0bc, 0x00c0, 0x7dee, 0x7112, 0x7216, 0x0e7f, 0x2001, ++ 0x0004, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0003, 0x1078, ++ 0x5dd7, 0x0078, 0x7dfd, 0x1078, 0x7dff, 0x0d7f, 0x007c, 0x2001, ++ 0x0007, 0x1078, 0x4502, 0x2001, 0xa600, 0x2004, 0xa086, 0x0003, ++ 0x00c0, 0x7e0e, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078, 0x28a6, ++ 0x1078, 0x772d, 0x007c, 0x0e7e, 0x2071, 0xa600, 0x7080, 0xa086, ++ 0x0014, 0x00c0, 0x7e51, 0x7000, 0xa086, 0x0003, 0x00c0, 0x7e26, ++ 0x6010, 0xa005, 0x00c0, 0x7e26, 0x1078, 0x3699, 0x0d7e, 0x6018, ++ 0x2068, 0x1078, 0x4649, 0x1078, 0x7d89, 0x0d7f, 0x1078, 0x8043, ++ 0x00c0, 0x7e51, 0x0d7e, 0x6018, 0x2068, 0x6890, 0x0d7f, 0xa005, ++ 0x0040, 0x7e51, 0x2001, 0x0006, 0x1078, 0x4502, 0x0e7e, 0x6010, ++ 0xa005, 0x0040, 0x7e4a, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103, ++ 0x7033, 0x0200, 0x0e7f, 0x1078, 0x28a6, 0x1078, 0x772d, 0x0078, ++ 0x7e55, 0x1078, 0x7c83, 0x1078, 0x7dff, 0x0e7f, 0x007c, 0x2011, ++ 0xa620, 0x2204, 0xa086, 0x0014, 0x00c0, 0x7e6a, 0x2001, 0x0002, ++ 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x5dd7, ++ 0x0078, 0x7e6c, 0x1078, 0x7dff, 0x007c, 0x2011, 0xa620, 0x2204, ++ 0xa086, 0x0004, 0x00c0, 0x7e7c, 0x2001, 0x0007, 0x1078, 0x4502, ++ 0x1078, 0x772d, 0x0078, 0x7e7e, 0x1078, 0x7dff, 0x007c, 0x7d4e, ++ 0x7e97, 0x7d4e, 0x7ed2, 0x7d4e, 0x7f44, 0x7e8b, 0x7d4e, 0x7d4e, ++ 0x7f59, 0x7d4e, 0x7f6c, 0x6604, 0xa686, 0x0003, 0x0040, 0x7e13, ++ 0xa6b6, 0x001e, 0x00c0, 0x7e96, 0x1078, 0x772d, 0x007c, 0x0d7e, ++ 0x0c7e, 0x1078, 0x7f7f, 0x00c0, 0x7ead, 0x2001, 0x0000, 0x1078, ++ 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, ++ 0x0002, 0x1078, 0x5dd7, 0x0078, 0x7ecf, 0x2009, 0xab8e, 0x2104, ++ 0xa086, 0x0009, 0x00c0, 0x7ec2, 0x6018, 0x2068, 0x6840, 0xa084, ++ 0x00ff, 0xa005, 0x0040, 0x7ecd, 0x8001, 0x6842, 0x6017, 0x000a, ++ 0x0078, 0x7ecf, 0x2009, 0xab8f, 0x2104, 0xa084, 0xff00, 0xa086, ++ 0x1900, 0x00c0, 0x7ecd, 0x0078, 0x7ea1, 0x1078, 0x7dff, 0x0c7f, ++ 0x0d7f, 0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7ee6, 0x2001, 0x0000, ++ 0x1078, 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003, 0x0001, ++ 0x6007, 0x0002, 0x1078, 0x5dd7, 0x0078, 0x7f12, 0x1078, 0x7c83, ++ 0x2009, 0xab8e, 0x2134, 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x0040, ++ 0x7f13, 0xa686, 0x000b, 0x0040, 0x7f10, 0x2009, 0xab8f, 0x2104, ++ 0xa084, 0xff00, 0x00c0, 0x7f00, 0xa686, 0x0009, 0x0040, 0x7f13, ++ 0xa086, 0x1900, 0x00c0, 0x7f10, 0xa686, 0x0009, 0x0040, 0x7f13, ++ 0x2001, 0x0004, 0x1078, 0x4502, 0x1078, 0x772d, 0x0078, 0x7f12, ++ 0x1078, 0x7dff, 0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06, ++ 0x0040, 0x7f21, 0x6838, 0xd0fc, 0x0040, 0x7f21, 0x0d7f, 0x0078, ++ 0x7f10, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040, ++ 0x7f32, 0x8001, 0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x0d7f, ++ 0x0078, 0x7f12, 0x68a0, 0xa086, 0x007e, 0x00c0, 0x7f3f, 0x0e7e, ++ 0x2071, 0xa600, 0x1078, 0x42b8, 0x0e7f, 0x0078, 0x7f41, 0x1078, ++ 0x2880, 0x0d7f, 0x0078, 0x7f10, 0x1078, 0x7f8e, 0x00c0, 0x7f54, ++ 0x2001, 0x0004, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0003, ++ 0x1078, 0x5dd7, 0x0078, 0x7f58, 0x1078, 0x7c83, 0x1078, 0x7dff, ++ 0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7f69, 0x2001, 0x0008, 0x1078, ++ 0x4502, 0x6003, 0x0001, 0x6007, 0x0005, 0x1078, 0x5dd7, 0x0078, ++ 0x7f6b, 0x1078, 0x7dff, 0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7f7c, ++ 0x2001, 0x000a, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0001, ++ 0x1078, 0x5dd7, 0x0078, 0x7f7e, 0x1078, 0x7dff, 0x007c, 0x2009, ++ 0xab8e, 0x2104, 0xa086, 0x0003, 0x00c0, 0x7f8d, 0x2009, 0xab8f, ++ 0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, 0x007c, 0xa085, 0x0001, ++ 0x007c, 0x0c7e, 0x017e, 0xac88, 0x0006, 0x2164, 0x1078, 0x45d6, ++ 0x017f, 0x0c7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x037e, 0x017e, ++ 0x6018, 0x2068, 0x2071, 0xa633, 0x2e04, 0xa085, 0x0003, 0x2072, ++ 0x1078, 0x8014, 0x0040, 0x7fd9, 0x2009, 0xa633, 0x2104, 0xc0cd, ++ 0x200a, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x7fc2, 0xa006, ++ 0x2020, 0x2009, 0x002a, 0x1078, 0xa21d, 0x2001, 0xa60c, 0x200c, ++ 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x1078, 0x284f, ++ 0x2071, 0xa600, 0x1078, 0x2677, 0x0c7e, 0x157e, 0x20a9, 0x0081, ++ 0x2009, 0x007f, 0x1078, 0x298e, 0x8108, 0x00f0, 0x7fd2, 0x157f, ++ 0x0c7f, 0x1078, 0x7f91, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, ++ 0xab80, 0x2079, 0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, 0xa61b, ++ 0x206a, 0x78e6, 0x007e, 0x8e70, 0x2e04, 0x2069, 0xa61c, 0x206a, ++ 0x78ea, 0xa084, 0xff00, 0x017f, 0xa105, 0x2009, 0xa626, 0x200a, ++ 0x2069, 0xab8e, 0x2071, 0xa89e, 0x6810, 0x2072, 0x6814, 0x7006, ++ 0x6818, 0x700a, 0x681c, 0x700e, 0x1078, 0x906e, 0x2001, 0x0006, ++ 0x1078, 0x4502, 0x1078, 0x28a6, 0x1078, 0x772d, 0x017f, 0x037f, ++ 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x027e, 0x037e, 0x0e7e, 0x157e, ++ 0x2019, 0xa626, 0x231c, 0x83ff, 0x0040, 0x803e, 0x2071, 0xab80, ++ 0x2e14, 0xa294, 0x00ff, 0x7004, 0xa084, 0xff00, 0xa205, 0xa306, ++ 0x00c0, 0x803e, 0x2011, 0xab96, 0xad98, 0x000a, 0x20a9, 0x0004, ++ 0x1078, 0x80de, 0x00c0, 0x803e, 0x2011, 0xab9a, 0xad98, 0x0006, ++ 0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x803e, 0x157f, 0x0e7f, ++ 0x037f, 0x027f, 0x007c, 0x0e7e, 0x2071, 0xab8c, 0x7004, 0xa086, ++ 0x0014, 0x00c0, 0x8066, 0x7008, 0xa086, 0x0800, 0x00c0, 0x8066, ++ 0x700c, 0xd0ec, 0x0040, 0x8064, 0xa084, 0x0f00, 0xa086, 0x0100, ++ 0x00c0, 0x8064, 0x7024, 0xd0a4, 0x00c0, 0x8061, 0xd0ac, 0x0040, ++ 0x8064, 0xa006, 0x0078, 0x8066, 0xa085, 0x0001, 0x0e7f, 0x007c, ++ 0x0e7e, 0x0d7e, 0x0c7e, 0x077e, 0x057e, 0x047e, 0x027e, 0x007e, ++ 0x127e, 0x2091, 0x8000, 0x2029, 0xa8ba, 0x252c, 0x2021, 0xa8c0, ++ 0x2424, 0x2061, 0xad00, 0x2071, 0xa600, 0x7248, 0x7064, 0xa202, ++ 0x00c8, 0x80cc, 0x1078, 0xa242, 0x0040, 0x80c4, 0x671c, 0xa786, ++ 0x0001, 0x0040, 0x80c4, 0xa786, 0x0007, 0x0040, 0x80c4, 0x2500, ++ 0xac06, 0x0040, 0x80c4, 0x2400, 0xac06, 0x0040, 0x80c4, 0x0c7e, ++ 0x6000, 0xa086, 0x0004, 0x00c0, 0x809f, 0x1078, 0x1757, 0xa786, ++ 0x0008, 0x00c0, 0x80ae, 0x1078, 0x8f00, 0x00c0, 0x80ae, 0x0c7f, ++ 0x1078, 0x7c83, 0x1078, 0x8ec6, 0x0078, 0x80c4, 0x6010, 0x2068, ++ 0x1078, 0x8d06, 0x0040, 0x80c1, 0xa786, 0x0003, 0x00c0, 0x80d6, ++ 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078, ++ 0x8eb9, 0x1078, 0x8ec6, 0x0c7f, 0xace0, 0x0010, 0x7058, 0xac02, ++ 0x00c8, 0x80cc, 0x0078, 0x807d, 0x127f, 0x007f, 0x027f, 0x047f, ++ 0x057f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0xa786, 0x0006, ++ 0x00c0, 0x80b8, 0x1078, 0xa1ca, 0x0078, 0x80c1, 0x220c, 0x2304, ++ 0xa106, 0x00c0, 0x80e9, 0x8210, 0x8318, 0x00f0, 0x80de, 0xa006, ++ 0x007c, 0x2304, 0xa102, 0x0048, 0x80f1, 0x2001, 0x0001, 0x0078, ++ 0x80f3, 0x2001, 0x0000, 0xa18d, 0x0001, 0x007c, 0x6004, 0xa08a, ++ 0x0044, 0x10c8, 0x1332, 0x1078, 0x8eec, 0x0040, 0x8105, 0x1078, ++ 0x8f00, 0x0040, 0x8112, 0x0078, 0x810b, 0x1078, 0x28a6, 0x1078, ++ 0x8f00, 0x0040, 0x8112, 0x1078, 0x61cd, 0x1078, 0x772d, 0x1078, ++ 0x62d1, 0x007c, 0x1078, 0x7c83, 0x0078, 0x810b, 0xa182, 0x0040, ++ 0x0079, 0x811a, 0x812d, 0x812d, 0x812d, 0x812d, 0x812d, 0x812d, ++ 0x812d, 0x812d, 0x812d, 0x812d, 0x812d, 0x812f, 0x812f, 0x812f, ++ 0x812f, 0x812d, 0x812d, 0x812d, 0x812f, 0x1078, 0x1332, 0x600b, ++ 0xffff, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091, ++ 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0xa186, 0x0013, 0x00c0, ++ 0x8146, 0x6004, 0xa082, 0x0040, 0x0079, 0x81d1, 0xa186, 0x0027, ++ 0x00c0, 0x8168, 0x1078, 0x61cd, 0x1078, 0x2880, 0x0d7e, 0x6110, ++ 0x2168, 0x1078, 0x8d06, 0x0040, 0x8162, 0x6837, 0x0103, 0x684b, ++ 0x0029, 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x1078, 0x4a73, ++ 0x1078, 0x8eb9, 0x0d7f, 0x1078, 0x772d, 0x1078, 0x62d1, 0x007c, ++ 0xa186, 0x0014, 0x00c0, 0x8171, 0x6004, 0xa082, 0x0040, 0x0079, ++ 0x8199, 0xa186, 0x0046, 0x0040, 0x817d, 0xa186, 0x0045, 0x0040, ++ 0x817d, 0xa186, 0x0047, 0x10c0, 0x1332, 0x2001, 0x0109, 0x2004, ++ 0xd084, 0x0040, 0x8196, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, ++ 0x027e, 0x1078, 0x5c56, 0x027f, 0x017f, 0x007f, 0x127f, 0x6000, ++ 0xa086, 0x0002, 0x00c0, 0x8196, 0x0078, 0x820e, 0x1078, 0x7773, ++ 0x007c, 0x81ae, 0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ac, ++ 0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ca, 0x81ca, 0x81ca, 0x81ca, ++ 0x81ac, 0x81ca, 0x81ac, 0x81ca, 0x1078, 0x1332, 0x1078, 0x61cd, ++ 0x0d7e, 0x6110, 0x2168, 0x1078, 0x8d06, 0x0040, 0x81c4, 0x6837, ++ 0x0103, 0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ec, 0x6852, ++ 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f, 0x1078, 0x772d, 0x1078, ++ 0x62d1, 0x007c, 0x1078, 0x61cd, 0x1078, 0x772d, 0x1078, 0x62d1, ++ 0x007c, 0x81e6, 0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81e4, ++ 0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81f8, 0x81f8, 0x81f8, 0x81f8, ++ 0x81e4, 0x8207, 0x81e4, 0x81f8, 0x1078, 0x1332, 0x1078, 0x61cd, ++ 0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0002, 0x1078, 0x62d1, ++ 0x6010, 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x007c, ++ 0x1078, 0x61cd, 0x2001, 0xa8a2, 0x2004, 0x6016, 0x2001, 0xa8a4, ++ 0x2004, 0x603e, 0x6003, 0x000f, 0x1078, 0x62d1, 0x007c, 0x1078, ++ 0x61cd, 0x1078, 0x772d, 0x1078, 0x62d1, 0x007c, 0xa182, 0x0040, ++ 0x0079, 0x8212, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x8227, ++ 0x8327, 0x8359, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, ++ 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x1078, 0x1332, 0x0e7e, ++ 0x0d7e, 0x603f, 0x0000, 0x2071, 0xab80, 0x7124, 0x610a, 0x2071, ++ 0xab8c, 0x6110, 0x2168, 0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0040, ++ 0x82e9, 0xa68c, 0x0c00, 0x0040, 0x825e, 0x0f7e, 0x2c78, 0x1078, ++ 0x4963, 0x0f7f, 0x0040, 0x825a, 0x684c, 0xd0ac, 0x0040, 0x825a, ++ 0x6024, 0xd0dc, 0x00c0, 0x825a, 0x6850, 0xd0bc, 0x00c0, 0x825a, ++ 0x7318, 0x6814, 0xa306, 0x00c0, 0x8301, 0x731c, 0x6810, 0xa306, ++ 0x00c0, 0x8301, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, ++ 0xa186, 0x0002, 0x0040, 0x8291, 0xa186, 0x0028, 0x00c0, 0x826e, ++ 0x1078, 0x8eda, 0x684b, 0x001c, 0x0078, 0x8293, 0xd6dc, 0x0040, ++ 0x828a, 0x684b, 0x0015, 0x684c, 0xd0ac, 0x0040, 0x8288, 0x6914, ++ 0x6a10, 0x2100, 0xa205, 0x0040, 0x8288, 0x7018, 0xa106, 0x00c0, ++ 0x8285, 0x701c, 0xa206, 0x0040, 0x8288, 0x6962, 0x6a5e, 0xc6dc, ++ 0x0078, 0x8293, 0xd6d4, 0x0040, 0x8291, 0x684b, 0x0007, 0x0078, ++ 0x8293, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0xa01e, 0xd6c4, ++ 0x0040, 0x82bc, 0xa686, 0x0100, 0x00c0, 0x82a7, 0x2001, 0xab99, ++ 0x2004, 0xa005, 0x00c0, 0x82a7, 0xc6c4, 0x0078, 0x8236, 0x7328, ++ 0x732c, 0x6b56, 0x83ff, 0x0040, 0x82bc, 0xa38a, 0x0009, 0x0048, ++ 0x82b3, 0x2019, 0x0008, 0x037e, 0x2308, 0x2019, 0xab98, 0xad90, ++ 0x0019, 0x1078, 0x89e2, 0x037f, 0xd6cc, 0x0040, 0x8317, 0x7124, ++ 0x695a, 0x81ff, 0x0040, 0x8317, 0xa192, 0x0021, 0x00c8, 0x82d5, ++ 0x2071, 0xab98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, ++ 0x89e2, 0x1078, 0x91f4, 0x0078, 0x8317, 0x6838, 0xd0fc, 0x0040, ++ 0x82de, 0x2009, 0x0020, 0x695a, 0x0078, 0x82c8, 0x0f7e, 0x2d78, ++ 0x1078, 0x897a, 0x0f7f, 0x1078, 0x91f4, 0x1078, 0x89cf, 0x0078, ++ 0x8319, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x8307, ++ 0x684c, 0xd0ac, 0x0040, 0x8307, 0x6024, 0xd0dc, 0x00c0, 0x8307, ++ 0x6850, 0xd0bc, 0x00c0, 0x8307, 0x6810, 0x6914, 0xa105, 0x0040, ++ 0x8307, 0x1078, 0x8fbf, 0x0d7f, 0x0e7f, 0x0078, 0x8326, 0x684b, ++ 0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac, 0x0040, 0x8317, ++ 0x6810, 0x6914, 0xa115, 0x0040, 0x8317, 0x1078, 0x84d5, 0x1078, ++ 0x4a73, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x1078, 0x8f89, ++ 0x0d7f, 0x0e7f, 0x00c0, 0x8326, 0x1078, 0x772d, 0x007c, 0x0f7e, ++ 0x6003, 0x0003, 0x2079, 0xab8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, ++ 0x6010, 0x2078, 0x784c, 0xd0ac, 0x0040, 0x833e, 0x6003, 0x0002, ++ 0x0f7f, 0x007c, 0x2130, 0x2228, 0x0078, 0x834a, 0x2400, 0x797c, ++ 0xa10a, 0x2300, 0x7a80, 0xa213, 0x2600, 0xa102, 0x2500, 0xa203, ++ 0x0048, 0x833a, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x603f, ++ 0x0000, 0x2c10, 0x1078, 0x1cf0, 0x1078, 0x5df6, 0x1078, 0x639b, ++ 0x007c, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0004, 0x6110, ++ 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x15fa, 0x007c, ++ 0xa182, 0x0040, 0x0079, 0x836c, 0x837f, 0x837f, 0x837f, 0x837f, ++ 0x837f, 0x8381, 0x8424, 0x837f, 0x837f, 0x843a, 0x84ab, 0x837f, ++ 0x837f, 0x837f, 0x837f, 0x84ba, 0x837f, 0x837f, 0x837f, 0x1078, ++ 0x1332, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e, 0x2071, 0xab8c, 0x6110, ++ 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, ++ 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x841f, ++ 0xa694, 0xff00, 0xa284, 0x0c00, 0x0040, 0x83a2, 0x7018, 0x7862, ++ 0x701c, 0x785e, 0xa284, 0x0300, 0x0040, 0x841f, 0x1078, 0x138b, ++ 0x1040, 0x1332, 0x2d00, 0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837, ++ 0x0103, 0x7838, 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, ++ 0xa68c, 0x0c00, 0x0040, 0x83c0, 0x7318, 0x6b62, 0x731c, 0x6b5e, ++ 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0040, 0x83dc, 0xa186, 0x0028, ++ 0x00c0, 0x83ce, 0x684b, 0x001c, 0x0078, 0x83de, 0xd6dc, 0x0040, ++ 0x83d5, 0x684b, 0x0015, 0x0078, 0x83de, 0xd6d4, 0x0040, 0x83dc, ++ 0x684b, 0x0007, 0x0078, 0x83de, 0x684b, 0x0000, 0x6f4e, 0x7850, ++ 0x6852, 0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0040, 0x83fc, 0x7328, ++ 0x732c, 0x6b56, 0x83ff, 0x0040, 0x83fc, 0xa38a, 0x0009, 0x0048, ++ 0x83f3, 0x2019, 0x0008, 0x037e, 0x2308, 0x2019, 0xab98, 0xad90, ++ 0x0019, 0x1078, 0x89e2, 0x037f, 0xd6cc, 0x0040, 0x841f, 0x7124, ++ 0x695a, 0x81ff, 0x0040, 0x841f, 0xa192, 0x0021, 0x00c8, 0x8413, ++ 0x2071, 0xab98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, ++ 0x89e2, 0x0078, 0x841f, 0x7838, 0xd0fc, 0x0040, 0x841c, 0x2009, ++ 0x0020, 0x695a, 0x0078, 0x8408, 0x2d78, 0x1078, 0x897a, 0x0d7f, ++ 0x0e7f, 0x0f7f, 0x077f, 0x007c, 0x0f7e, 0x6003, 0x0003, 0x2079, ++ 0xab8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12, ++ 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x1cf0, 0x1078, ++ 0x6df4, 0x007c, 0x0d7e, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f, ++ 0x0040, 0x8446, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0002, ++ 0x1078, 0x627a, 0x1078, 0x639b, 0x6110, 0x2168, 0x694c, 0xd1e4, ++ 0x0040, 0x84a9, 0xd1cc, 0x0040, 0x8480, 0x6948, 0x6838, 0xd0fc, ++ 0x0040, 0x8478, 0x017e, 0x684c, 0x007e, 0x6850, 0x007e, 0xad90, ++ 0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, ++ 0x2012, 0x8318, 0x8210, 0x00f0, 0x8467, 0x157f, 0x007f, 0x6852, ++ 0x007f, 0x684e, 0x017f, 0x2168, 0x1078, 0x13b4, 0x0078, 0x84a3, ++ 0x017e, 0x1078, 0x13b4, 0x0d7f, 0x1078, 0x89cf, 0x0078, 0x84a3, ++ 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0040, ++ 0x849f, 0xa086, 0x0028, 0x00c0, 0x8491, 0x684b, 0x001c, 0x0078, ++ 0x84a1, 0xd1dc, 0x0040, 0x8498, 0x684b, 0x0015, 0x0078, 0x84a1, ++ 0xd1d4, 0x0040, 0x849f, 0x684b, 0x0007, 0x0078, 0x84a1, 0x684b, ++ 0x0000, 0x1078, 0x4a73, 0x1078, 0x8f89, 0x00c0, 0x84a9, 0x1078, ++ 0x772d, 0x0d7f, 0x007c, 0x2019, 0x0001, 0x1078, 0x7058, 0x6003, ++ 0x0002, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x1078, 0x627a, 0x1078, ++ 0x639b, 0x007c, 0x1078, 0x627a, 0x1078, 0x2880, 0x0d7e, 0x6110, ++ 0x2168, 0x1078, 0x8d06, 0x0040, 0x84cf, 0x6837, 0x0103, 0x684b, ++ 0x0029, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f, ++ 0x1078, 0x772d, 0x1078, 0x639b, 0x007c, 0x684b, 0x0015, 0xd1fc, ++ 0x0040, 0x84e1, 0x684b, 0x0007, 0x8002, 0x8000, 0x810a, 0xa189, ++ 0x0000, 0x6962, 0x685e, 0x007c, 0xa182, 0x0040, 0x0079, 0x84e8, ++ 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fd, 0x84fb, 0x85d0, ++ 0x85dc, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb, ++ 0x84fb, 0x84fb, 0x84fb, 0x1078, 0x1332, 0x077e, 0x0f7e, 0x0e7e, ++ 0x0d7e, 0x2071, 0xab8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, ++ 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x851b, 0xa684, ++ 0x00ff, 0x00c0, 0x851b, 0x6024, 0xd0f4, 0x0040, 0x851b, 0x1078, ++ 0x8fbf, 0x0078, 0x85cb, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, ++ 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x85c0, 0xa694, ++ 0xff00, 0xa284, 0x0c00, 0x0040, 0x8531, 0x7018, 0x7862, 0x701c, ++ 0x785e, 0xa284, 0x0300, 0x0040, 0x85bd, 0xa686, 0x0100, 0x00c0, ++ 0x8543, 0x2001, 0xab99, 0x2004, 0xa005, 0x00c0, 0x8543, 0xc6c4, ++ 0x7e46, 0x0078, 0x8524, 0x1078, 0x138b, 0x1040, 0x1332, 0x2d00, ++ 0x784a, 0x7f4c, 0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103, 0x7838, ++ 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00, ++ 0x0040, 0x855e, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, ++ 0xa186, 0x0002, 0x0040, 0x857a, 0xa186, 0x0028, 0x00c0, 0x856c, ++ 0x684b, 0x001c, 0x0078, 0x857c, 0xd6dc, 0x0040, 0x8573, 0x684b, ++ 0x0015, 0x0078, 0x857c, 0xd6d4, 0x0040, 0x857a, 0x684b, 0x0007, ++ 0x0078, 0x857c, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, ++ 0x6856, 0xa01e, 0xd6c4, 0x0040, 0x859a, 0x7328, 0x732c, 0x6b56, ++ 0x83ff, 0x0040, 0x859a, 0xa38a, 0x0009, 0x0048, 0x8591, 0x2019, ++ 0x0008, 0x037e, 0x2308, 0x2019, 0xab98, 0xad90, 0x0019, 0x1078, ++ 0x89e2, 0x037f, 0xd6cc, 0x0040, 0x85bd, 0x7124, 0x695a, 0x81ff, ++ 0x0040, 0x85bd, 0xa192, 0x0021, 0x00c8, 0x85b1, 0x2071, 0xab98, ++ 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x89e2, 0x0078, ++ 0x85bd, 0x7838, 0xd0fc, 0x0040, 0x85ba, 0x2009, 0x0020, 0x695a, ++ 0x0078, 0x85a6, 0x2d78, 0x1078, 0x897a, 0xd6dc, 0x00c0, 0x85c3, ++ 0xa006, 0x0078, 0x85c9, 0x2001, 0x0001, 0x2071, 0xab8c, 0x7218, ++ 0x731c, 0x1078, 0x1653, 0x0d7f, 0x0e7f, 0x0f7f, 0x077f, 0x007c, ++ 0x2001, 0xa8a4, 0x2004, 0x603e, 0x20e1, 0x0005, 0x3d18, 0x3e20, ++ 0x2c10, 0x1078, 0x15fa, 0x007c, 0x2001, 0xa8a4, 0x2004, 0x603e, ++ 0x0d7e, 0x6003, 0x0002, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040, ++ 0x870c, 0x603f, 0x0000, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f, ++ 0x0040, 0x8622, 0x6814, 0x6910, 0xa115, 0x0040, 0x8622, 0x6a60, ++ 0xa206, 0x00c0, 0x85ff, 0x685c, 0xa106, 0x0040, 0x8622, 0x684c, ++ 0xc0e4, 0x684e, 0x6847, 0x0000, 0x6863, 0x0000, 0x685f, 0x0000, ++ 0x6024, 0xd0f4, 0x00c0, 0x8617, 0x697c, 0x6810, 0xa102, 0x603a, ++ 0x6980, 0x6814, 0xa103, 0x6036, 0x6024, 0xc0f5, 0x6026, 0x0d7e, ++ 0x6018, 0x2068, 0x683c, 0x8000, 0x683e, 0x0d7f, 0x1078, 0x8fbf, ++ 0x0078, 0x870c, 0x694c, 0xd1cc, 0x0040, 0x86d1, 0x6948, 0x6838, ++ 0xd0fc, 0x0040, 0x8689, 0x017e, 0x684c, 0x007e, 0x6850, 0x007e, ++ 0x0f7e, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0040, ++ 0x865c, 0xa086, 0x0028, 0x00c0, 0x8643, 0x684b, 0x001c, 0x784b, ++ 0x001c, 0x0078, 0x8667, 0xd1dc, 0x0040, 0x8653, 0x684b, 0x0015, ++ 0x784b, 0x0015, 0x1078, 0x916c, 0x0040, 0x8651, 0x7944, 0xc1dc, ++ 0x7946, 0x0078, 0x8667, 0xd1d4, 0x0040, 0x865c, 0x684b, 0x0007, ++ 0x784b, 0x0007, 0x0078, 0x8667, 0x684c, 0xd0ac, 0x0040, 0x8667, ++ 0x6810, 0x6914, 0xa115, 0x0040, 0x8667, 0x1078, 0x84d5, 0x6848, ++ 0x784a, 0x6860, 0x7862, 0x685c, 0x785e, 0xad90, 0x000d, 0xaf98, ++ 0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, 0x2012, 0x8318, ++ 0x8210, 0x00f0, 0x8675, 0x157f, 0x0f7f, 0x007f, 0x6852, 0x007f, ++ 0x684e, 0x1078, 0x91f4, 0x017f, 0x2168, 0x1078, 0x13b4, 0x0078, ++ 0x8706, 0x017e, 0x0f7e, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, ++ 0x0002, 0x0040, 0x86b6, 0xa086, 0x0028, 0x00c0, 0x869d, 0x684b, ++ 0x001c, 0x784b, 0x001c, 0x0078, 0x86c1, 0xd1dc, 0x0040, 0x86ad, ++ 0x684b, 0x0015, 0x784b, 0x0015, 0x1078, 0x916c, 0x0040, 0x86ab, ++ 0x7944, 0xc1dc, 0x7946, 0x0078, 0x86c1, 0xd1d4, 0x0040, 0x86b6, ++ 0x684b, 0x0007, 0x784b, 0x0007, 0x0078, 0x86c1, 0x684c, 0xd0ac, ++ 0x0040, 0x86c1, 0x6810, 0x6914, 0xa115, 0x0040, 0x86c1, 0x1078, ++ 0x84d5, 0x6860, 0x7862, 0x685c, 0x785e, 0x684c, 0x784e, 0x0f7f, ++ 0x1078, 0x13b4, 0x0d7f, 0x1078, 0x91f4, 0x1078, 0x89cf, 0x0078, ++ 0x8706, 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, ++ 0x0040, 0x86f7, 0xa086, 0x0028, 0x00c0, 0x86e2, 0x684b, 0x001c, ++ 0x0078, 0x8704, 0xd1dc, 0x0040, 0x86f0, 0x684b, 0x0015, 0x1078, ++ 0x916c, 0x0040, 0x86ee, 0x6944, 0xc1dc, 0x6946, 0x0078, 0x8704, ++ 0xd1d4, 0x0040, 0x86f7, 0x684b, 0x0007, 0x0078, 0x8704, 0x684b, ++ 0x0000, 0x684c, 0xd0ac, 0x0040, 0x8704, 0x6810, 0x6914, 0xa115, ++ 0x0040, 0x8704, 0x1078, 0x84d5, 0x1078, 0x4a73, 0x1078, 0x8f89, ++ 0x00c0, 0x870c, 0x1078, 0x772d, 0x0d7f, 0x007c, 0x1078, 0x61cd, ++ 0x0078, 0x8714, 0x1078, 0x627a, 0x1078, 0x8d06, 0x0040, 0x8733, ++ 0x0d7e, 0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0xa60c, 0x210c, ++ 0xd18c, 0x00c0, 0x873e, 0xd184, 0x00c0, 0x873a, 0x6108, 0x694a, ++ 0xa18e, 0x0029, 0x00c0, 0x872e, 0x1078, 0xa4e2, 0x6847, 0x0000, ++ 0x1078, 0x4a73, 0x0d7f, 0x1078, 0x772d, 0x1078, 0x62d1, 0x1078, ++ 0x639b, 0x007c, 0x684b, 0x0004, 0x0078, 0x872e, 0x684b, 0x0004, ++ 0x0078, 0x872e, 0xa182, 0x0040, 0x0079, 0x8746, 0x8759, 0x8759, ++ 0x8759, 0x8759, 0x8759, 0x875b, 0x8759, 0x875e, 0x8759, 0x8759, ++ 0x8759, 0x8759, 0x8759, 0x8759, 0x8759, 0x8759, 0x8759, 0x8759, ++ 0x8759, 0x1078, 0x1332, 0x1078, 0x772d, 0x007c, 0x007e, 0x027e, ++ 0xa016, 0x1078, 0x15fa, 0x027f, 0x007f, 0x007c, 0xa182, 0x0085, ++ 0x0079, 0x876a, 0x8773, 0x8771, 0x8771, 0x877f, 0x8771, 0x8771, ++ 0x8771, 0x1078, 0x1332, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, ++ 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x027e, ++ 0x057e, 0x0d7e, 0x0e7e, 0x2071, 0xab80, 0x7224, 0x6212, 0x7220, ++ 0x1078, 0x8cf2, 0x0040, 0x87a4, 0x2268, 0x6800, 0xa086, 0x0000, ++ 0x0040, 0x87a4, 0x6018, 0x6d18, 0xa52e, 0x00c0, 0x87a4, 0x0c7e, ++ 0x2d60, 0x1078, 0x89f3, 0x0c7f, 0x0040, 0x87a4, 0x6803, 0x0002, ++ 0x6007, 0x0086, 0x0078, 0x87a6, 0x6007, 0x0087, 0x6003, 0x0001, ++ 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0f7e, 0x2278, 0x1078, 0x4963, ++ 0x0f7f, 0x0040, 0x87be, 0x6824, 0xd0ec, 0x0040, 0x87be, 0x0c7e, ++ 0x2260, 0x603f, 0x0000, 0x1078, 0x8fbf, 0x0c7f, 0x0e7f, 0x0d7f, ++ 0x057f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x87d4, 0x6004, ++ 0xa08a, 0x0085, 0x1048, 0x1332, 0xa08a, 0x008c, 0x10c8, 0x1332, ++ 0xa082, 0x0085, 0x0079, 0x87e3, 0xa186, 0x0027, 0x0040, 0x87dc, ++ 0xa186, 0x0014, 0x10c0, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6, ++ 0x1078, 0x62d1, 0x007c, 0x87ea, 0x87ec, 0x87ec, 0x87ea, 0x87ea, ++ 0x87ea, 0x87ea, 0x1078, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6, ++ 0x1078, 0x62d1, 0x007c, 0xa186, 0x0013, 0x00c0, 0x87fd, 0x6004, ++ 0xa082, 0x0085, 0x2008, 0x0078, 0x8838, 0xa186, 0x0027, 0x00c0, ++ 0x8820, 0x1078, 0x61cd, 0x1078, 0x2880, 0x0d7e, 0x6010, 0x2068, ++ 0x1078, 0x8d06, 0x0040, 0x8816, 0x6837, 0x0103, 0x6847, 0x0000, ++ 0x684b, 0x0029, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f, 0x1078, ++ 0x772d, 0x1078, 0x62d1, 0x007c, 0x1078, 0x7773, 0x0078, 0x881b, ++ 0xa186, 0x0014, 0x00c0, 0x881c, 0x1078, 0x61cd, 0x0d7e, 0x6010, ++ 0x2068, 0x1078, 0x8d06, 0x0040, 0x8816, 0x6837, 0x0103, 0x6847, ++ 0x0000, 0x684b, 0x0006, 0x6850, 0xc0ec, 0x6852, 0x0078, 0x8812, ++ 0x0079, 0x883a, 0x8843, 0x8841, 0x8841, 0x8841, 0x8841, 0x8841, ++ 0x885e, 0x1078, 0x1332, 0x1078, 0x61cd, 0x6030, 0xa08c, 0xff00, ++ 0x810f, 0xa186, 0x0039, 0x0040, 0x8851, 0xa186, 0x0035, 0x00c0, ++ 0x8855, 0x2001, 0xa8a2, 0x0078, 0x8857, 0x2001, 0xa8a3, 0x2004, ++ 0x6016, 0x6003, 0x000c, 0x1078, 0x62d1, 0x007c, 0x1078, 0x61cd, ++ 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x886c, ++ 0xa186, 0x0035, 0x00c0, 0x8870, 0x2001, 0xa8a2, 0x0078, 0x8872, ++ 0x2001, 0xa8a3, 0x2004, 0x6016, 0x6003, 0x000e, 0x1078, 0x62d1, ++ 0x007c, 0xa182, 0x008c, 0x00c8, 0x8883, 0xa182, 0x0085, 0x0048, ++ 0x8883, 0x0079, 0x8886, 0x1078, 0x7773, 0x007c, 0x888d, 0x888d, ++ 0x888d, 0x888d, 0x888f, 0x88ec, 0x888d, 0x1078, 0x1332, 0x0f7e, ++ 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x88a2, 0x6030, 0xa08c, ++ 0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x8903, 0xa186, 0x0035, ++ 0x0040, 0x8903, 0x0d7e, 0x1078, 0x8d06, 0x00c0, 0x88ab, 0x1078, ++ 0x8eb9, 0x0078, 0x88ce, 0x6010, 0x2068, 0x684c, 0xd0e4, 0x00c0, ++ 0x88b3, 0x1078, 0x8eb9, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040, ++ 0x88bf, 0x684b, 0x0006, 0xc0ec, 0x6852, 0x0078, 0x88ca, 0xd0bc, ++ 0x0040, 0x88c6, 0x684b, 0x0002, 0x0078, 0x88ca, 0x684b, 0x0005, ++ 0x1078, 0x8f85, 0x6847, 0x0000, 0x1078, 0x4a73, 0x2c68, 0x1078, ++ 0x76c7, 0x0040, 0x88e7, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, ++ 0xab8e, 0x210c, 0x6136, 0x2009, 0xab8f, 0x210c, 0x613a, 0x6918, ++ 0x611a, 0x6920, 0x6122, 0x601f, 0x0001, 0x1078, 0x5d8a, 0x2d60, ++ 0x1078, 0x772d, 0x0d7f, 0x007c, 0x0f7e, 0x2c78, 0x1078, 0x4963, ++ 0x0f7f, 0x0040, 0x8929, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, ++ 0x0035, 0x0040, 0x8903, 0xa186, 0x001e, 0x0040, 0x8903, 0xa186, ++ 0x0039, 0x00c0, 0x8929, 0x0d7e, 0x2c68, 0x1078, 0x91bc, 0x00c0, ++ 0x894d, 0x1078, 0x76c7, 0x0040, 0x8926, 0x6106, 0x6003, 0x0001, ++ 0x601f, 0x0001, 0x6918, 0x611a, 0x6928, 0x612a, 0x692c, 0x612e, ++ 0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, 0x6136, 0x6938, 0x613a, ++ 0x6920, 0x6122, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x2d60, 0x0078, ++ 0x894d, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x894d, ++ 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040, 0x893c, 0xc0ec, 0x6852, ++ 0x684b, 0x0006, 0x0078, 0x8947, 0xd0bc, 0x0040, 0x8943, 0x684b, ++ 0x0002, 0x0078, 0x8947, 0x684b, 0x0005, 0x1078, 0x8f85, 0x6847, ++ 0x0000, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f, 0x1078, 0x772d, ++ 0x007c, 0x017e, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, ++ 0x8961, 0x6837, 0x0103, 0x684b, 0x0028, 0x6847, 0x0000, 0x1078, ++ 0x4a73, 0x0d7f, 0x017f, 0xa186, 0x0013, 0x0040, 0x8973, 0xa186, ++ 0x0014, 0x0040, 0x8973, 0xa186, 0x0027, 0x0040, 0x8973, 0x1078, ++ 0x7773, 0x0078, 0x8979, 0x1078, 0x61cd, 0x1078, 0x8ec6, 0x1078, ++ 0x62d1, 0x007c, 0x057e, 0x067e, 0x0d7e, 0x0f7e, 0x2029, 0x0001, ++ 0xa182, 0x0101, 0x00c8, 0x8986, 0x0078, 0x8988, 0x2009, 0x0100, ++ 0x2130, 0x2069, 0xab98, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, ++ 0xaf90, 0x001d, 0x1078, 0x89e2, 0xa6b2, 0x0020, 0x7804, 0xa06d, ++ 0x0040, 0x899c, 0x1078, 0x13b4, 0x1078, 0x138b, 0x0040, 0x89c6, ++ 0x8528, 0x6837, 0x0110, 0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a, ++ 0x003d, 0x00c8, 0x89b2, 0x2608, 0xad90, 0x000f, 0x1078, 0x89e2, ++ 0x0078, 0x89c6, 0xa6b2, 0x003c, 0x2009, 0x003c, 0x2d78, 0xad90, ++ 0x000f, 0x1078, 0x89e2, 0x0078, 0x899c, 0x0f7f, 0x852f, 0xa5ad, ++ 0x0003, 0x7d36, 0xa5ac, 0x0000, 0x0078, 0x89cb, 0x0f7f, 0x852f, ++ 0xa5ad, 0x0003, 0x7d36, 0x0d7f, 0x067f, 0x057f, 0x007c, 0x0f7e, ++ 0x8dff, 0x0040, 0x89e0, 0x6804, 0xa07d, 0x0040, 0x89de, 0x6807, ++ 0x0000, 0x1078, 0x4a73, 0x2f68, 0x0078, 0x89d3, 0x1078, 0x4a73, ++ 0x0f7f, 0x007c, 0x157e, 0xa184, 0x0001, 0x0040, 0x89e8, 0x8108, ++ 0x810c, 0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, 0x8210, 0x00f0, ++ 0x89ea, 0x157f, 0x007c, 0x067e, 0x127e, 0x2091, 0x8000, 0x2031, ++ 0x0001, 0x601c, 0xa084, 0x000f, 0x1079, 0x8a0f, 0x127f, 0x067f, ++ 0x007c, 0x127e, 0x2091, 0x8000, 0x067e, 0x2031, 0x0000, 0x601c, ++ 0xa084, 0x000f, 0x1079, 0x8a0f, 0x067f, 0x127f, 0x007c, 0x8a29, ++ 0x8a17, 0x8a24, 0x8a45, 0x8a17, 0x8a24, 0x8a45, 0x8a24, 0x1078, ++ 0x1332, 0x037e, 0x2019, 0x0010, 0x1078, 0x9dc7, 0x601f, 0x0006, ++ 0x6003, 0x0007, 0x037f, 0x007c, 0xa006, 0x007c, 0xa085, 0x0001, ++ 0x007c, 0x0d7e, 0x86ff, 0x00c0, 0x8a40, 0x6010, 0x2068, 0x1078, ++ 0x8d06, 0x0040, 0x8a42, 0xa00e, 0x2001, 0x0005, 0x1078, 0x4b51, ++ 0x1078, 0x8f85, 0x1078, 0x4a73, 0x1078, 0x772d, 0xa085, 0x0001, ++ 0x0d7f, 0x007c, 0xa006, 0x0078, 0x8a40, 0x6000, 0xa08a, 0x0010, ++ 0x10c8, 0x1332, 0x1079, 0x8a4d, 0x007c, 0x8a5d, 0x8a82, 0x8a5f, ++ 0x8aa5, 0x8a7e, 0x8a5d, 0x8a24, 0x8a29, 0x8a29, 0x8a24, 0x8a24, ++ 0x8a24, 0x8a24, 0x8a24, 0x8a24, 0x8a24, 0x1078, 0x1332, 0x86ff, ++ 0x00c0, 0x8a7b, 0x601c, 0xa086, 0x0006, 0x0040, 0x8a7b, 0x0d7e, ++ 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x8a70, 0x1078, 0x8f85, ++ 0x0d7f, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x1078, ++ 0x5d8a, 0x1078, 0x62d1, 0xa085, 0x0001, 0x007c, 0x1078, 0x1757, ++ 0x0078, 0x8a5f, 0x0e7e, 0x2071, 0xa8b1, 0x7024, 0xac06, 0x00c0, ++ 0x8a8b, 0x1078, 0x6fc4, 0x601c, 0xa084, 0x000f, 0xa086, 0x0006, ++ 0x00c0, 0x8a9d, 0x087e, 0x097e, 0x2049, 0x0001, 0x2c40, 0x1078, ++ 0x7246, 0x097f, 0x087f, 0x0078, 0x8a9f, 0x1078, 0x6ebe, 0x0e7f, ++ 0x00c0, 0x8a5f, 0x1078, 0x8a24, 0x007c, 0x037e, 0x0e7e, 0x2071, ++ 0xa8b1, 0x703c, 0xac06, 0x00c0, 0x8ab5, 0x2019, 0x0000, 0x1078, ++ 0x7058, 0x0e7f, 0x037f, 0x0078, 0x8a5f, 0x1078, 0x738a, 0x0e7f, ++ 0x037f, 0x00c0, 0x8a5f, 0x1078, 0x8a24, 0x007c, 0x0c7e, 0x601c, ++ 0xa084, 0x000f, 0x1079, 0x8ac6, 0x0c7f, 0x007c, 0x8ad5, 0x8b47, ++ 0x8c7f, 0x8ae0, 0x8ec6, 0x8ad5, 0x9db8, 0x772d, 0x8b47, 0x1078, ++ 0x8f00, 0x00c0, 0x8ad5, 0x1078, 0x7c83, 0x007c, 0x1078, 0x61cd, ++ 0x1078, 0x62d1, 0x1078, 0x772d, 0x007c, 0x6017, 0x0001, 0x007c, ++ 0x1078, 0x8d06, 0x0040, 0x8ae8, 0x6010, 0xa080, 0x0019, 0x2c02, ++ 0x6000, 0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8af0, 0x007c, ++ 0x8b00, 0x8b02, 0x8b24, 0x8b36, 0x8b43, 0x8b00, 0x8ad5, 0x8ad5, ++ 0x8ad5, 0x8b36, 0x8b36, 0x8b00, 0x8b00, 0x8b00, 0x8b00, 0x8b40, ++ 0x1078, 0x1332, 0x0e7e, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052, ++ 0x2071, 0xa8b1, 0x7024, 0xac06, 0x0040, 0x8b20, 0x1078, 0x6ebe, ++ 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x2001, 0xa8a3, ++ 0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0e7f, 0x007c, ++ 0x6017, 0x0001, 0x0078, 0x8b1e, 0x0d7e, 0x6010, 0x2068, 0x6850, ++ 0xc0b5, 0x6852, 0x0d7f, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, ++ 0x0002, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x007c, 0x0d7e, 0x6017, ++ 0x0001, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x0d7f, 0x007c, ++ 0x1078, 0x772d, 0x007c, 0x1078, 0x1757, 0x0078, 0x8b24, 0x6000, ++ 0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8b4f, 0x007c, 0x8b5f, ++ 0x8add, 0x8b61, 0x8b5f, 0x8b61, 0x8b61, 0x8ad6, 0x8b5f, 0x8acf, ++ 0x8acf, 0x8b5f, 0x8b5f, 0x8b5f, 0x8b5f, 0x8b5f, 0x8b5f, 0x1078, ++ 0x1332, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x0d7f, ++ 0xa08a, 0x000c, 0x10c8, 0x1332, 0x1079, 0x8b6f, 0x007c, 0x8b7b, ++ 0x8c23, 0x8b7d, 0x8bbd, 0x8b7d, 0x8bbd, 0x8b7d, 0x8b8a, 0x8b7b, ++ 0x8bbd, 0x8b7b, 0x8ba7, 0x1078, 0x1332, 0x6004, 0xa08e, 0x0016, ++ 0x0040, 0x8bb8, 0xa08e, 0x0004, 0x0040, 0x8bb8, 0xa08e, 0x0002, ++ 0x0040, 0x8bb8, 0x6004, 0x1078, 0x8f00, 0x0040, 0x8c3e, 0xa08e, ++ 0x0021, 0x0040, 0x8c42, 0xa08e, 0x0022, 0x0040, 0x8c3e, 0xa08e, ++ 0x003d, 0x0040, 0x8c42, 0xa08e, 0x0039, 0x0040, 0x8c46, 0xa08e, ++ 0x0035, 0x0040, 0x8c46, 0xa08e, 0x001e, 0x0040, 0x8bba, 0xa08e, ++ 0x0001, 0x00c0, 0x8bb6, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084, ++ 0x00ff, 0x0d7f, 0xa086, 0x0006, 0x0040, 0x8bb8, 0x1078, 0x2880, ++ 0x1078, 0x7c83, 0x1078, 0x8ec6, 0x007c, 0x0c7e, 0x0d7e, 0x6104, ++ 0xa186, 0x0016, 0x0040, 0x8c13, 0xa186, 0x0002, 0x00c0, 0x8be6, ++ 0x6018, 0x2068, 0x68a0, 0xd0bc, 0x00c0, 0x8c6a, 0x6840, 0xa084, ++ 0x00ff, 0xa005, 0x0040, 0x8be6, 0x8001, 0x6842, 0x6013, 0x0000, ++ 0x601f, 0x0007, 0x6017, 0x0398, 0x1078, 0x76c7, 0x0040, 0x8be6, ++ 0x2d00, 0x601a, 0x601f, 0x0001, 0x0078, 0x8c13, 0x0d7f, 0x0c7f, ++ 0x6004, 0xa08e, 0x0002, 0x00c0, 0x8c04, 0x6018, 0xa080, 0x0028, ++ 0x2004, 0xa086, 0x007e, 0x00c0, 0x8c04, 0x2009, 0xa633, 0x2104, ++ 0xc085, 0x200a, 0x0e7e, 0x2071, 0xa600, 0x1078, 0x42b8, 0x0e7f, ++ 0x1078, 0x7c83, 0x0078, 0x8c08, 0x1078, 0x7c83, 0x1078, 0x2880, ++ 0x0e7e, 0x127e, 0x2091, 0x8000, 0x1078, 0x28a6, 0x127f, 0x0e7f, ++ 0x1078, 0x8ec6, 0x007c, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003, ++ 0x0001, 0x6007, 0x0002, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0d7f, ++ 0x0c7f, 0x0078, 0x8c12, 0x0c7e, 0x0d7e, 0x6104, 0xa186, 0x0016, ++ 0x0040, 0x8c13, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, ++ 0x0040, 0x8be6, 0x8001, 0x6842, 0x6003, 0x0001, 0x1078, 0x5dd7, ++ 0x1078, 0x62d1, 0x0d7f, 0x0c7f, 0x0078, 0x8c12, 0x1078, 0x7c83, ++ 0x0078, 0x8bba, 0x1078, 0x7ca6, 0x0078, 0x8bba, 0x0d7e, 0x2c68, ++ 0x6104, 0x1078, 0x91bc, 0x0d7f, 0x0040, 0x8c52, 0x1078, 0x772d, ++ 0x0078, 0x8c69, 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105, ++ 0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x6038, ++ 0x600a, 0x2001, 0xa8a3, 0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078, ++ 0x62d1, 0x007c, 0x0d7f, 0x0c7f, 0x1078, 0x7c83, 0x1078, 0x2880, ++ 0x0e7e, 0x127e, 0x2091, 0x8000, 0x1078, 0x28a6, 0x6013, 0x0000, ++ 0x601f, 0x0007, 0x6017, 0x0398, 0x127f, 0x0e7f, 0x007c, 0x6000, ++ 0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8c87, 0x007c, 0x8c97, ++ 0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97, ++ 0x8ad5, 0x8c97, 0x8add, 0x8c99, 0x8add, 0x8ca7, 0x8c97, 0x1078, ++ 0x1332, 0x6004, 0xa086, 0x008b, 0x0040, 0x8ca7, 0x6007, 0x008b, ++ 0x6003, 0x000d, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x007c, 0x1078, ++ 0x8eb9, 0x1078, 0x8d06, 0x0040, 0x8cdf, 0x1078, 0x2880, 0x0d7e, ++ 0x1078, 0x8d06, 0x0040, 0x8cc1, 0x6010, 0x2068, 0x6837, 0x0103, ++ 0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x1078, ++ 0x4a73, 0x2c68, 0x1078, 0x76c7, 0x0040, 0x8ccf, 0x6818, 0x601a, ++ 0x0c7e, 0x2d60, 0x1078, 0x8ec6, 0x0c7f, 0x0078, 0x8cd0, 0x2d60, ++ 0x0d7f, 0x6013, 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, ++ 0x0001, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0078, 0x8cf1, 0x6030, ++ 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x8ceb, 0xa186, ++ 0x0035, 0x00c0, 0x8cef, 0x1078, 0x2880, 0x0078, 0x8cc1, 0x1078, ++ 0x8ec6, 0x007c, 0xa284, 0x000f, 0x00c0, 0x8d03, 0xa282, 0xad00, ++ 0x0048, 0x8d03, 0x2001, 0xa616, 0x2004, 0xa202, 0x00c8, 0x8d03, ++ 0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x8d02, 0x027e, 0x0e7e, ++ 0x2071, 0xa600, 0x6210, 0x705c, 0xa202, 0x0048, 0x8d18, 0x7060, ++ 0xa202, 0x00c8, 0x8d18, 0xa085, 0x0001, 0x0e7f, 0x027f, 0x007c, ++ 0xa006, 0x0078, 0x8d15, 0x0e7e, 0x0c7e, 0x037e, 0x007e, 0x127e, ++ 0x2091, 0x8000, 0x2061, 0xad00, 0x2071, 0xa600, 0x7348, 0x7064, ++ 0xa302, 0x00c8, 0x8d45, 0x601c, 0xa206, 0x00c0, 0x8d3d, 0x1078, ++ 0x902b, 0x0040, 0x8d3d, 0x1078, 0x8f00, 0x00c0, 0x8d39, 0x1078, ++ 0x7c83, 0x0c7e, 0x1078, 0x772d, 0x0c7f, 0xace0, 0x0010, 0x7058, ++ 0xac02, 0x00c8, 0x8d45, 0x0078, 0x8d26, 0x127f, 0x007f, 0x037f, ++ 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x0c7e, 0x017e, 0xa188, 0xa735, ++ 0x210c, 0x81ff, 0x0040, 0x8d59, 0x2061, 0xa9b3, 0x611a, 0x1078, ++ 0x2880, 0xa006, 0x0078, 0x8d5e, 0xa085, 0x0001, 0x017f, 0x0c7f, ++ 0x0e7f, 0x007c, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x0c7e, ++ 0x1078, 0x76c7, 0x057f, 0x0040, 0x8d7b, 0x6612, 0x651a, 0x601f, ++ 0x0003, 0x2009, 0x004b, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, ++ 0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8d77, 0x0c7e, 0x057e, ++ 0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078, 0x76c7, 0x057f, ++ 0x0040, 0x8da9, 0x6013, 0x0000, 0x651a, 0x601f, 0x0003, 0x0c7e, ++ 0x2560, 0x1078, 0x47e9, 0x0c7f, 0x1078, 0x5f01, 0x077e, 0x2039, ++ 0x0000, 0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f8b, 0x077f, 0x2009, ++ 0x004c, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, ++ 0x007c, 0xa006, 0x0078, 0x8da5, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, ++ 0x1078, 0x76c7, 0x2c78, 0x0c7f, 0x0040, 0x8dc6, 0x7e12, 0x2c00, ++ 0x781a, 0x781f, 0x0003, 0x2021, 0x0005, 0x1078, 0x8e11, 0x2f60, ++ 0x2009, 0x004d, 0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f, ++ 0x0f7f, 0x007c, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x76c7, ++ 0x2c78, 0x0c7f, 0x0040, 0x8de4, 0x7e12, 0x2c00, 0x781a, 0x781f, ++ 0x0003, 0x2021, 0x0005, 0x1078, 0x8e11, 0x2f60, 0x2009, 0x004e, ++ 0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f, 0x007c, ++ 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x76c7, 0x2c78, 0x0c7f, ++ 0x0040, 0x8e0d, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, ++ 0x0004, 0x1078, 0x8e11, 0x2001, 0xa89d, 0x2004, 0xd0fc, 0x0040, ++ 0x8e06, 0x2f60, 0x1078, 0x772d, 0x0078, 0x8e0b, 0x2f60, 0x2009, ++ 0x0052, 0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f, ++ 0x007c, 0x097e, 0x077e, 0x127e, 0x2091, 0x8000, 0x1078, 0x4775, ++ 0x0040, 0x8e1e, 0x2001, 0x8e16, 0x0078, 0x8e24, 0x1078, 0x4739, ++ 0x0040, 0x8e2d, 0x2001, 0x8e1e, 0x007e, 0xa00e, 0x2400, 0x1078, ++ 0x4b51, 0x1078, 0x4a73, 0x007f, 0x007a, 0x2418, 0x1078, 0x6161, ++ 0x62a0, 0x087e, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x1078, ++ 0x5f1b, 0x087f, 0x1078, 0x5e0a, 0x2f08, 0x2648, 0x1078, 0x9f8b, ++ 0x613c, 0x81ff, 0x1040, 0x5fdb, 0x1078, 0x62d1, 0x127f, 0x077f, ++ 0x097f, 0x007c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, ++ 0x76c7, 0x017f, 0x0040, 0x8e63, 0x660a, 0x611a, 0x601f, 0x0001, ++ 0x2d00, 0x6012, 0x2009, 0x001f, 0x1078, 0x775c, 0xa085, 0x0001, ++ 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8e60, 0x0c7e, 0x127e, ++ 0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x8e7f, ++ 0x660a, 0x611a, 0x601f, 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021, ++ 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, ++ 0x0078, 0x8e7c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, ++ 0x76c7, 0x017f, 0x0040, 0x8e9b, 0x660a, 0x611a, 0x601f, 0x0001, ++ 0x2d00, 0x6012, 0x2009, 0x003d, 0x1078, 0x775c, 0xa085, 0x0001, ++ 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8e98, 0x0c7e, 0x127e, ++ 0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x8eb6, ++ 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0000, 0x1078, ++ 0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, ++ 0x8eb3, 0x027e, 0x0d7e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0040, ++ 0x8ec3, 0x8211, 0x6a3e, 0x0d7f, 0x027f, 0x007c, 0x007e, 0x6000, ++ 0xa086, 0x0000, 0x0040, 0x8ed8, 0x6013, 0x0000, 0x601f, 0x0007, ++ 0x2001, 0xa8a3, 0x2004, 0x6016, 0x1078, 0xa495, 0x603f, 0x0000, ++ 0x007f, 0x007c, 0x067e, 0x0c7e, 0x0d7e, 0x2031, 0xa653, 0x2634, ++ 0xd6e4, 0x0040, 0x8ee8, 0x6618, 0x2660, 0x6e48, 0x1078, 0x46e7, ++ 0x0d7f, 0x0c7f, 0x067f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e, ++ 0x0002, 0x0040, 0x8efd, 0xa08e, 0x0003, 0x0040, 0x8efd, 0xa08e, ++ 0x0004, 0x0040, 0x8efd, 0xa085, 0x0001, 0x017f, 0x007f, 0x007c, ++ 0x007e, 0x0d7e, 0x6010, 0xa06d, 0x0040, 0x8f0d, 0x6838, 0xd0fc, ++ 0x0040, 0x8f0d, 0xa006, 0x0078, 0x8f0f, 0xa085, 0x0001, 0x0d7f, ++ 0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, ++ 0x76c7, 0x017f, 0x0040, 0x8f2c, 0x611a, 0x601f, 0x0001, 0x2d00, ++ 0x6012, 0x1078, 0x2880, 0x2009, 0x0028, 0x1078, 0x775c, 0xa085, ++ 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8f29, 0xa186, ++ 0x0015, 0x00c0, 0x8f44, 0x2011, 0xa620, 0x2204, 0xa086, 0x0074, ++ 0x00c0, 0x8f44, 0x1078, 0x7f91, 0x6003, 0x0001, 0x6007, 0x0029, ++ 0x1078, 0x5dd7, 0x0078, 0x8f48, 0x1078, 0x7c83, 0x1078, 0x772d, ++ 0x007c, 0xa186, 0x0016, 0x00c0, 0x8f53, 0x2001, 0x0004, 0x1078, ++ 0x4502, 0x0078, 0x8f74, 0xa186, 0x0015, 0x00c0, 0x8f78, 0x2011, ++ 0xa620, 0x2204, 0xa086, 0x0014, 0x00c0, 0x8f78, 0x0d7e, 0x6018, ++ 0x2068, 0x1078, 0x4649, 0x0d7f, 0x1078, 0x8043, 0x00c0, 0x8f78, ++ 0x0d7e, 0x6018, 0x2068, 0x6890, 0x0d7f, 0xa005, 0x0040, 0x8f78, ++ 0x2001, 0x0006, 0x1078, 0x4502, 0x1078, 0x77f8, 0x0078, 0x8f7c, ++ 0x1078, 0x7c83, 0x1078, 0x772d, 0x007c, 0x6848, 0xa086, 0x0005, ++ 0x00c0, 0x8f84, 0x1078, 0x8f85, 0x007c, 0x6850, 0xc0ad, 0x6852, ++ 0x007c, 0x0e7e, 0x2071, 0xab8c, 0x7014, 0xd0e4, 0x0040, 0x8f9a, ++ 0x6013, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x1078, 0x5d8a, ++ 0x1078, 0x62d1, 0x0e7f, 0x007c, 0x0c7e, 0x0f7e, 0x2c78, 0x1078, ++ 0x4963, 0x0f7f, 0x0040, 0x8fa9, 0x601c, 0xa084, 0x000f, 0x1079, ++ 0x8fab, 0x0c7f, 0x007c, 0x8ad5, 0x8fb6, 0x8fb9, 0x8fbc, 0xa25d, ++ 0xa279, 0xa27c, 0x8ad5, 0x8ad5, 0x1078, 0x1332, 0x0005, 0x0005, ++ 0x007c, 0x0005, 0x0005, 0x007c, 0x1078, 0x8fbf, 0x007c, 0x0f7e, ++ 0x2c78, 0x1078, 0x4963, 0x0040, 0x8fee, 0x1078, 0x76c7, 0x00c0, ++ 0x8fcf, 0x2001, 0xa8a4, 0x2004, 0x783e, 0x0078, 0x8fee, 0x7818, ++ 0x601a, 0x781c, 0xa086, 0x0003, 0x0040, 0x8fdc, 0x7808, 0x6036, ++ 0x2f00, 0x603a, 0x0078, 0x8fe0, 0x7808, 0x603a, 0x2f00, 0x6036, ++ 0x602a, 0x601f, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x7920, ++ 0x6122, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x2f60, 0x0f7f, 0x007c, ++ 0x017e, 0x0f7e, 0x682c, 0x6032, 0xa08e, 0x0001, 0x0040, 0x9001, ++ 0xa086, 0x0005, 0x0040, 0x9005, 0xa006, 0x602a, 0x602e, 0x0078, ++ 0x9016, 0x6824, 0xc0f4, 0xc0d5, 0x6826, 0x6810, 0x2078, 0x787c, ++ 0x6938, 0xa102, 0x7880, 0x6934, 0xa103, 0x00c8, 0x8ffc, 0x6834, ++ 0x602a, 0x6838, 0xa084, 0xfffc, 0x683a, 0x602e, 0x2d00, 0x6036, ++ 0x6808, 0x603a, 0x6918, 0x611a, 0x6920, 0x6122, 0x601f, 0x0001, ++ 0x6007, 0x0039, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x6803, 0x0002, ++ 0x0f7f, 0x017f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e, 0x0034, ++ 0x0040, 0x9050, 0xa08e, 0x0035, 0x0040, 0x9050, 0xa08e, 0x0036, ++ 0x0040, 0x9050, 0xa08e, 0x0037, 0x0040, 0x9050, 0xa08e, 0x0038, ++ 0x0040, 0x9050, 0xa08e, 0x0039, 0x0040, 0x9050, 0xa08e, 0x003a, ++ 0x0040, 0x9050, 0xa08e, 0x003b, 0x0040, 0x9050, 0xa085, 0x0001, ++ 0x017f, 0x007f, 0x007c, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x00c0, ++ 0x905d, 0xa085, 0x0001, 0x0078, 0x906c, 0x6024, 0xd0f4, 0x00c0, ++ 0x906b, 0xc0f5, 0x6026, 0x6010, 0x2078, 0x7828, 0x603a, 0x782c, ++ 0x6036, 0x1078, 0x1757, 0xa006, 0x0f7f, 0x007c, 0x007e, 0x017e, ++ 0x027e, 0x037e, 0x0e7e, 0x2001, 0xa89e, 0x200c, 0x8000, 0x2014, ++ 0x2001, 0x0032, 0x1078, 0x5c1c, 0x2001, 0xa8a2, 0x82ff, 0x00c0, ++ 0x9083, 0x2011, 0x0014, 0x2202, 0x2001, 0xa8a0, 0x200c, 0x8000, ++ 0x2014, 0x2071, 0xa88d, 0x711a, 0x721e, 0x2001, 0x0064, 0x1078, ++ 0x5c1c, 0x2001, 0xa8a3, 0x82ff, 0x00c0, 0x9098, 0x2011, 0x0014, ++ 0x2202, 0x2009, 0xa8a4, 0xa280, 0x000a, 0x200a, 0x1078, 0x498b, ++ 0x0e7f, 0x037f, 0x027f, 0x017f, 0x007f, 0x007c, 0x007e, 0x0e7e, ++ 0x2001, 0xa8a2, 0x2003, 0x0028, 0x2001, 0xa8a3, 0x2003, 0x0014, ++ 0x2071, 0xa88d, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0xa8a4, ++ 0x2003, 0x001e, 0x0e7f, 0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091, ++ 0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x90d5, 0x611a, ++ 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0033, 0x1078, 0x775c, ++ 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x90d2, ++ 0x0d7e, 0x0e7e, 0x0f7e, 0x2071, 0xa600, 0xa186, 0x0015, 0x00c0, ++ 0x9107, 0x7080, 0xa086, 0x0018, 0x00c0, 0x9107, 0x6010, 0x2068, ++ 0x6a3c, 0xd2e4, 0x00c0, 0x90fb, 0x2c78, 0x1078, 0x6490, 0x0040, ++ 0x910f, 0x706c, 0x6a50, 0xa206, 0x00c0, 0x9103, 0x7070, 0x6a54, ++ 0xa206, 0x00c0, 0x9103, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, ++ 0x0000, 0x1078, 0x28c8, 0x1078, 0x77f8, 0x0078, 0x910b, 0x1078, ++ 0x7c83, 0x1078, 0x772d, 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x7050, ++ 0xa080, 0x29c0, 0x2004, 0x6a54, 0xa206, 0x0040, 0x90fb, 0x0078, ++ 0x9103, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7, ++ 0x017f, 0x0040, 0x9131, 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, ++ 0x2009, 0x0043, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f, ++ 0x007c, 0xa006, 0x0078, 0x912e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2071, ++ 0xa600, 0xa186, 0x0015, 0x00c0, 0x915a, 0x7080, 0xa086, 0x0004, ++ 0x00c0, 0x915a, 0x6010, 0xa0e8, 0x000f, 0x2c78, 0x1078, 0x6490, ++ 0x0040, 0x9162, 0x706c, 0x6a08, 0xa206, 0x00c0, 0x9156, 0x7070, ++ 0x6a0c, 0xa206, 0x00c0, 0x9156, 0x1078, 0x2880, 0x1078, 0x77f8, ++ 0x0078, 0x915e, 0x1078, 0x7c83, 0x1078, 0x772d, 0x0f7f, 0x0e7f, ++ 0x0d7f, 0x007c, 0x7050, 0xa080, 0x29c0, 0x2004, 0x6a0c, 0xa206, ++ 0x0040, 0x9154, 0x0078, 0x9156, 0x017e, 0x027e, 0x684c, 0xd0ac, ++ 0x0040, 0x9184, 0x6914, 0x6a10, 0x2100, 0xa205, 0x0040, 0x9184, ++ 0x6860, 0xa106, 0x00c0, 0x9180, 0x685c, 0xa206, 0x0040, 0x9184, ++ 0x6962, 0x6a5e, 0xa085, 0x0001, 0x027f, 0x017f, 0x007c, 0x0e7e, ++ 0x127e, 0x2071, 0xa600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0001, ++ 0x0048, 0x91b9, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040, ++ 0x91a5, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8, 0x91a1, 0x0078, ++ 0x9194, 0x2061, 0xad00, 0x0078, 0x9194, 0x6003, 0x0008, 0x8529, ++ 0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8, 0x91b5, 0x754e, ++ 0xa085, 0x0001, 0x127f, 0x0e7f, 0x007c, 0x704f, 0xad00, 0x0078, ++ 0x91b0, 0xa006, 0x0078, 0x91b2, 0x0c7e, 0x027e, 0x017e, 0xa186, ++ 0x0035, 0x0040, 0x91c6, 0x6a34, 0x0078, 0x91c7, 0x6a28, 0x1078, ++ 0x8cf2, 0x0040, 0x91f0, 0x2260, 0x611c, 0xa186, 0x0003, 0x0040, ++ 0x91d5, 0xa186, 0x0006, 0x00c0, 0x91ec, 0x6834, 0xa206, 0x0040, ++ 0x91e4, 0x6838, 0xa206, 0x00c0, 0x91ec, 0x6108, 0x6834, 0xa106, ++ 0x00c0, 0x91ec, 0x0078, 0x91e9, 0x6008, 0x6938, 0xa106, 0x00c0, ++ 0x91ec, 0x6018, 0x6918, 0xa106, 0x017f, 0x027f, 0x0c7f, 0x007c, ++ 0xa085, 0x0001, 0x0078, 0x91ec, 0x6944, 0xd1cc, 0x0040, 0x920d, ++ 0xa18c, 0x00ff, 0xa18e, 0x0002, 0x00c0, 0x920d, 0xad88, 0x001e, ++ 0x210c, 0xa18c, 0x0f00, 0x810f, 0xa18e, 0x0001, 0x00c0, 0x920d, ++ 0x6810, 0x6914, 0xa115, 0x10c0, 0x84d5, 0x007c, 0x067e, 0x6000, ++ 0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x9218, 0x067f, 0x007c, ++ 0x9228, 0x96df, 0x97fb, 0x9228, 0x9228, 0x9228, 0x9228, 0x9228, ++ 0x9262, 0x988e, 0x9228, 0x9228, 0x9228, 0x9228, 0x9228, 0x9228, ++ 0x1078, 0x1332, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x1332, ++ 0x1079, 0x9234, 0x067f, 0x007c, 0x9244, 0x9d53, 0x9244, 0x9244, ++ 0x9244, 0x9244, 0x9244, 0x9244, 0x9d11, 0x9da1, 0x9244, 0xa3b0, ++ 0xa3e4, 0xa3b0, 0xa3e4, 0x9244, 0x1078, 0x1332, 0x067e, 0x6000, ++ 0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x9250, 0x067f, 0x007c, ++ 0x9260, 0x99eb, 0x9ac7, 0x9af5, 0x9b70, 0x9260, 0x9c76, 0x9c1e, ++ 0x989a, 0x9ce5, 0x9cfb, 0x9260, 0x9260, 0x9260, 0x9260, 0x9260, ++ 0x1078, 0x1332, 0xa1b2, 0x0044, 0x10c8, 0x1332, 0x2100, 0x0079, ++ 0x9269, 0x92a9, 0x9498, 0x92a9, 0x92a9, 0x92a9, 0x94a0, 0x92a9, ++ 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, ++ 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, ++ 0x92ab, 0x9311, 0x9320, 0x9377, 0x9396, 0x9415, 0x9485, 0x92a9, ++ 0x92a9, 0x94a4, 0x92a9, 0x92a9, 0x94b7, 0x94c2, 0x92a9, 0x92a9, ++ 0x92a9, 0x92a9, 0x92a9, 0x94fa, 0x92a9, 0x92a9, 0x9509, 0x92a9, ++ 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x9522, 0x92a9, 0x92a9, ++ 0x92a9, 0x95af, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, ++ 0x9629, 0x1078, 0x1332, 0x1078, 0x4967, 0x00c0, 0x92bb, 0x2001, ++ 0xa633, 0x2004, 0xd0cc, 0x00c0, 0x92bb, 0xa084, 0x0009, 0xa086, ++ 0x0008, 0x00c0, 0x92c3, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, ++ 0x0000, 0x0078, 0x9493, 0x1078, 0x4957, 0x0e7e, 0x0c7e, 0x037e, ++ 0x027e, 0x017e, 0x6218, 0x2270, 0x72a0, 0x027e, 0x2019, 0x0029, ++ 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x2c08, ++ 0x1078, 0x9f8b, 0x077f, 0x017f, 0x2e60, 0x1078, 0x47e9, 0x017f, ++ 0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x6618, 0x0c7e, 0x2660, 0x1078, ++ 0x45d6, 0x0c7f, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, ++ 0x0006, 0x0048, 0x9303, 0x1078, 0x9ebf, 0x00c0, 0x9371, 0x1078, ++ 0x9e50, 0x00c0, 0x92ff, 0x6007, 0x0008, 0x0078, 0x9493, 0x6007, ++ 0x0009, 0x0078, 0x9493, 0x1078, 0xa09f, 0x0040, 0x930d, 0x1078, ++ 0x9ebf, 0x0040, 0x92f7, 0x0078, 0x9371, 0x6013, 0x1900, 0x0078, ++ 0x92ff, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x6106, 0x1078, 0x9e05, ++ 0x6007, 0x0006, 0x0078, 0x9493, 0x6007, 0x0007, 0x0078, 0x9493, ++ 0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb, 0x00c0, 0x9664, ++ 0x0d7e, 0x6618, 0x2668, 0x6e04, 0xa684, 0x00ff, 0xa082, 0x0006, ++ 0x00c8, 0x9336, 0x2001, 0x0001, 0x1078, 0x44ee, 0xa6b4, 0xff00, ++ 0x8637, 0xa686, 0x0006, 0x0040, 0x9353, 0xa686, 0x0004, 0x0040, ++ 0x9353, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0040, 0x9353, ++ 0xa686, 0x0004, 0x0040, 0x9353, 0xa686, 0x0005, 0x0040, 0x9353, ++ 0x0d7f, 0x0078, 0x9371, 0x1078, 0x9f25, 0x00c0, 0x936c, 0xa686, ++ 0x0006, 0x00c0, 0x9365, 0x027e, 0x6218, 0xa290, 0x0028, 0x2214, ++ 0x2009, 0x0000, 0x1078, 0x28c8, 0x027f, 0x1078, 0x4649, 0x6007, ++ 0x000a, 0x0d7f, 0x0078, 0x9493, 0x6007, 0x000b, 0x0d7f, 0x0078, ++ 0x9493, 0x1078, 0x2880, 0x6007, 0x0001, 0x0078, 0x9493, 0x1078, ++ 0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x6618, ++ 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa686, 0x0707, 0x0040, 0x9371, ++ 0x027e, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x1078, ++ 0x28c8, 0x027f, 0x6007, 0x000c, 0x0078, 0x9493, 0x1078, 0x4967, ++ 0x00c0, 0x93a3, 0x2001, 0xa633, 0x2004, 0xa084, 0x0009, 0xa086, ++ 0x0008, 0x00c0, 0x93ab, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, ++ 0x0000, 0x0078, 0x9493, 0x1078, 0x4957, 0x6618, 0xa6b0, 0x0001, ++ 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x93ef, 0xa6b4, ++ 0xff00, 0x8637, 0xa686, 0x0004, 0x0040, 0x93c2, 0xa686, 0x0006, ++ 0x00c0, 0x9371, 0x1078, 0x9f34, 0x00c0, 0x93ca, 0x6007, 0x000e, ++ 0x0078, 0x9493, 0x047e, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, ++ 0x00ff, 0x8427, 0x047e, 0x1078, 0x2880, 0x047f, 0x017e, 0xa006, ++ 0x2009, 0xa653, 0x210c, 0xd1a4, 0x0040, 0x93e9, 0x2009, 0x0029, ++ 0x1078, 0xa21d, 0x6018, 0x0d7e, 0x2068, 0x6800, 0xc0e5, 0x6802, ++ 0x0d7f, 0x017f, 0x047f, 0x6007, 0x0001, 0x0078, 0x9493, 0x2001, ++ 0x0001, 0x1078, 0x44ee, 0x157e, 0x017e, 0x027e, 0x037e, 0x20a9, ++ 0x0004, 0x2019, 0xa605, 0x2011, 0xab90, 0x1078, 0x80de, 0x037f, ++ 0x027f, 0x017f, 0x157f, 0xa005, 0x0040, 0x940f, 0xa6b4, 0xff00, ++ 0x8637, 0xa686, 0x0006, 0x0040, 0x93c2, 0x0078, 0x9371, 0x6013, ++ 0x1900, 0x6007, 0x0009, 0x0078, 0x9493, 0x1078, 0x4967, 0x00c0, ++ 0x9422, 0x2001, 0xa633, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, ++ 0x00c0, 0x942a, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, 0x0000, ++ 0x0078, 0x9493, 0x1078, 0x4957, 0x6618, 0xa6b0, 0x0001, 0x2634, ++ 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x9472, 0xa6b4, 0xff00, ++ 0x8637, 0xa686, 0x0004, 0x0040, 0x9441, 0xa686, 0x0006, 0x00c0, ++ 0x9371, 0x1078, 0x9f5f, 0x00c0, 0x944d, 0x1078, 0x9e50, 0x00c0, ++ 0x944d, 0x6007, 0x0010, 0x0078, 0x9493, 0x047e, 0x6418, 0xa4a0, ++ 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x047e, 0x1078, 0x2880, ++ 0x047f, 0x017e, 0xa006, 0x2009, 0xa653, 0x210c, 0xd1a4, 0x0040, ++ 0x946c, 0x2009, 0x0029, 0x1078, 0xa21d, 0x6018, 0x0d7e, 0x2068, ++ 0x6800, 0xc0e5, 0x6802, 0x0d7f, 0x017f, 0x047f, 0x6007, 0x0001, ++ 0x0078, 0x9493, 0x1078, 0xa09f, 0x0040, 0x947f, 0xa6b4, 0xff00, ++ 0x8637, 0xa686, 0x0006, 0x0040, 0x9441, 0x0078, 0x9371, 0x6013, ++ 0x1900, 0x6007, 0x0009, 0x0078, 0x9493, 0x1078, 0x29bb, 0x00c0, ++ 0x9664, 0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x9667, 0x00c0, ++ 0x9371, 0x6007, 0x0012, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x007c, ++ 0x6007, 0x0001, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x0078, 0x9497, ++ 0x6007, 0x0005, 0x0078, 0x949a, 0x1078, 0xa41c, 0x00c0, 0x9664, ++ 0x1078, 0x29bb, 0x00c0, 0x9664, 0x1078, 0x9667, 0x00c0, 0x9371, ++ 0x6007, 0x0020, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x007c, 0x1078, ++ 0x29bb, 0x00c0, 0x9664, 0x6007, 0x0023, 0x6003, 0x0001, 0x1078, ++ 0x5dd7, 0x007c, 0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb, ++ 0x00c0, 0x9664, 0x1078, 0x9667, 0x00c0, 0x9371, 0x017e, 0x027e, ++ 0x2011, 0xab90, 0x2214, 0x2c08, 0xa006, 0x1078, 0xa1e6, 0x00c0, ++ 0x94e9, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700, 0x2011, 0xab89, ++ 0x2214, 0xa296, 0xffff, 0x00c0, 0x94f3, 0x6007, 0x0025, 0x0078, ++ 0x94f3, 0x6004, 0xa086, 0x0024, 0x00c0, 0x94f0, 0x1078, 0x772d, ++ 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x027f, ++ 0x017f, 0x007c, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x6106, 0x1078, ++ 0x9687, 0x6007, 0x002b, 0x0078, 0x9493, 0x6007, 0x002c, 0x0078, ++ 0x9493, 0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb, 0x00c0, ++ 0x9664, 0x1078, 0x9667, 0x00c0, 0x9371, 0x6106, 0x1078, 0x968c, ++ 0x00c0, 0x951e, 0x6007, 0x002e, 0x0078, 0x9493, 0x6007, 0x002f, ++ 0x0078, 0x9493, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x0e7e, 0x0d7e, ++ 0x0c7e, 0x6018, 0xa080, 0x0001, 0x200c, 0xa184, 0x00ff, 0xa086, ++ 0x0006, 0x0040, 0x953f, 0xa184, 0xff00, 0x8007, 0xa086, 0x0006, ++ 0x0040, 0x953f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0078, 0x9498, 0x2001, ++ 0xa672, 0x2004, 0xd0e4, 0x0040, 0x95ab, 0x2071, 0xab8c, 0x7010, ++ 0x6036, 0x7014, 0x603a, 0x7108, 0x720c, 0x2001, 0xa653, 0x2004, ++ 0xd0a4, 0x0040, 0x955d, 0x6018, 0x2068, 0x6810, 0xa106, 0x00c0, ++ 0x955d, 0x6814, 0xa206, 0x0040, 0x9581, 0x2001, 0xa653, 0x2004, ++ 0xd0ac, 0x00c0, 0x959f, 0x2069, 0xa600, 0x6870, 0xa206, 0x00c0, ++ 0x959f, 0x686c, 0xa106, 0x00c0, 0x959f, 0x7210, 0x1078, 0x8cf2, ++ 0x0040, 0x95a5, 0x1078, 0xa28e, 0x0040, 0x95a5, 0x622a, 0x6007, ++ 0x0036, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x0c7f, 0x0d7f, 0x0e7f, ++ 0x007c, 0x7214, 0xa286, 0xffff, 0x0040, 0x9593, 0x1078, 0x8cf2, ++ 0x0040, 0x95a5, 0xa280, 0x0002, 0x2004, 0x7110, 0xa106, 0x00c0, ++ 0x95a5, 0x0078, 0x956e, 0x7210, 0x2c08, 0xa085, 0x0001, 0x1078, ++ 0xa1e6, 0x2c10, 0x2160, 0x0040, 0x95a5, 0x0078, 0x956e, 0x6007, ++ 0x0037, 0x6013, 0x1500, 0x0078, 0x9579, 0x6007, 0x0037, 0x6013, ++ 0x1700, 0x0078, 0x9579, 0x6007, 0x0012, 0x0078, 0x9579, 0x1078, ++ 0x29bb, 0x00c0, 0x9664, 0x6018, 0xa080, 0x0001, 0x2004, 0xa084, ++ 0xff00, 0x8007, 0xa086, 0x0006, 0x00c0, 0x9498, 0x0e7e, 0x0d7e, ++ 0x0c7e, 0x2001, 0xa672, 0x2004, 0xd0e4, 0x0040, 0x9621, 0x2069, ++ 0xa600, 0x2071, 0xab8c, 0x7008, 0x6036, 0x720c, 0x623a, 0xa286, ++ 0xffff, 0x00c0, 0x95de, 0x7208, 0x0c7e, 0x2c08, 0xa085, 0x0001, ++ 0x1078, 0xa1e6, 0x2c10, 0x0c7f, 0x0040, 0x9615, 0x1078, 0x8cf2, ++ 0x0040, 0x9615, 0x0c7e, 0x027e, 0x2260, 0x1078, 0x89f3, 0x027f, ++ 0x0c7f, 0x7118, 0xa18c, 0xff00, 0x810f, 0xa186, 0x0001, 0x0040, ++ 0x95ff, 0xa186, 0x0005, 0x0040, 0x95f9, 0xa186, 0x0007, 0x00c0, ++ 0x9609, 0xa280, 0x0004, 0x2004, 0xa005, 0x0040, 0x9609, 0x057e, ++ 0x7510, 0x7614, 0x1078, 0xa2a3, 0x057f, 0x0c7f, 0x0d7f, 0x0e7f, ++ 0x007c, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, 0x6003, ++ 0x0001, 0x1078, 0x5d8a, 0x0078, 0x9605, 0x6007, 0x003b, 0x602b, ++ 0x0009, 0x6013, 0x1700, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x0078, ++ 0x9605, 0x6007, 0x003b, 0x602b, 0x000b, 0x6013, 0x0000, 0x0078, ++ 0x9579, 0x0e7e, 0x027e, 0x1078, 0x4967, 0x0040, 0x965e, 0x1078, ++ 0x4957, 0x1078, 0xa4a9, 0x00c0, 0x965c, 0x2071, 0xa600, 0x70cc, ++ 0xc085, 0x70ce, 0x0f7e, 0x2079, 0x0100, 0x7298, 0xa284, 0x00ff, ++ 0x706e, 0x78e6, 0xa284, 0xff00, 0x7270, 0xa205, 0x7072, 0x78ea, ++ 0x0f7f, 0x70d7, 0x0000, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, ++ 0x9655, 0x2011, 0xa8ca, 0x2013, 0x07d0, 0xd0ac, 0x00c0, 0x965e, ++ 0x1078, 0x2677, 0x0078, 0x965e, 0x1078, 0xa4d9, 0x027f, 0x0e7f, ++ 0x1078, 0x772d, 0x0078, 0x9497, 0x1078, 0x772d, 0x007c, 0x0d7e, ++ 0x067e, 0x6618, 0x2668, 0x6e04, 0xa6b4, 0xff00, 0x8637, 0xa686, ++ 0x0006, 0x0040, 0x9684, 0xa686, 0x0004, 0x0040, 0x9684, 0x6e04, ++ 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0040, 0x9684, 0xa686, 0x0004, ++ 0x0040, 0x9684, 0xa085, 0x0001, 0x067f, 0x0d7f, 0x007c, 0x0d7e, ++ 0x1078, 0x96bb, 0x0d7f, 0x007c, 0x0d7e, 0x1078, 0x96ca, 0x00c0, ++ 0x96b4, 0x680c, 0xa08c, 0xff00, 0x6820, 0xa084, 0x00ff, 0xa115, ++ 0x6212, 0x6824, 0x602a, 0xd1e4, 0x0040, 0x96a2, 0x2009, 0x0001, ++ 0x0078, 0x96b0, 0xd1ec, 0x0040, 0x96b4, 0x6920, 0xa18c, 0x00ff, ++ 0x6824, 0x1078, 0x254d, 0x00c0, 0x96b4, 0x2110, 0x2009, 0x0000, ++ 0x1078, 0x28c8, 0x0078, 0x96b8, 0xa085, 0x0001, 0x0078, 0x96b9, ++ 0xa006, 0x0d7f, 0x007c, 0x2069, 0xab8d, 0x6800, 0xa082, 0x0010, ++ 0x00c8, 0x96c8, 0x6013, 0x0000, 0xa085, 0x0001, 0x0078, 0x96c9, ++ 0xa006, 0x007c, 0x6013, 0x0000, 0x2069, 0xab8c, 0x6808, 0xa084, ++ 0xff00, 0xa086, 0x0800, 0x00c0, 0x96de, 0x6800, 0xa084, 0x00ff, ++ 0xa08e, 0x0014, 0x0040, 0x96de, 0xa08e, 0x0010, 0x007c, 0x6004, ++ 0xa0b2, 0x0044, 0x10c8, 0x1332, 0xa1b6, 0x0013, 0x00c0, 0x96eb, ++ 0x2008, 0x0079, 0x96fe, 0xa1b6, 0x0027, 0x0040, 0x96f3, 0xa1b6, ++ 0x0014, 0x10c0, 0x1332, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078, ++ 0x61cd, 0x1078, 0x8ec6, 0x1078, 0x62d1, 0x007c, 0x973e, 0x9740, ++ 0x973e, 0x973e, 0x973e, 0x9740, 0x974c, 0x97d6, 0x9799, 0x97d6, ++ 0x97ad, 0x97d6, 0x974c, 0x97d6, 0x97ce, 0x97d6, 0x97ce, 0x97d6, ++ 0x97d6, 0x973e, 0x973e, 0x973e, 0x973e, 0x973e, 0x973e, 0x973e, ++ 0x973e, 0x973e, 0x973e, 0x973e, 0x9740, 0x973e, 0x97d6, 0x973e, ++ 0x973e, 0x97d6, 0x973e, 0x97d6, 0x97d6, 0x973e, 0x973e, 0x973e, ++ 0x973e, 0x97d6, 0x97d6, 0x973e, 0x97d6, 0x97d6, 0x973e, 0x973e, ++ 0x973e, 0x973e, 0x973e, 0x9740, 0x97d6, 0x97d6, 0x973e, 0x973e, ++ 0x97d6, 0x97d6, 0x973e, 0x973e, 0x973e, 0x973e, 0x1078, 0x1332, ++ 0x1078, 0x61cd, 0x2001, 0xa8a2, 0x2004, 0x6016, 0x6003, 0x0002, ++ 0x1078, 0x62d1, 0x0078, 0x97dc, 0x0f7e, 0x2079, 0xa652, 0x7804, ++ 0x0f7f, 0xd0ac, 0x00c0, 0x97d6, 0x2001, 0x0000, 0x1078, 0x44ee, ++ 0x6018, 0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, 0x0040, 0x97d6, ++ 0x0c7e, 0x6018, 0x2060, 0x6000, 0xd0f4, 0x00c0, 0x9770, 0x6010, ++ 0xa005, 0x0040, 0x9770, 0x0c7f, 0x1078, 0x3699, 0x0078, 0x97d6, ++ 0x0c7f, 0x2001, 0xa600, 0x2004, 0xa086, 0x0002, 0x00c0, 0x977f, ++ 0x0f7e, 0x2079, 0xa600, 0x7890, 0x8000, 0x7892, 0x0f7f, 0x2001, ++ 0x0002, 0x1078, 0x4502, 0x1078, 0x61cd, 0x601f, 0x0001, 0x6003, ++ 0x0001, 0x6007, 0x0002, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0c7e, ++ 0x6118, 0x2160, 0x2009, 0x0001, 0x1078, 0x5a52, 0x0c7f, 0x0078, ++ 0x97dc, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4, 0xff00, ++ 0x8637, 0xa686, 0x0006, 0x0040, 0x97d6, 0xa686, 0x0004, 0x0040, ++ 0x97d6, 0x2001, 0x0004, 0x0078, 0x97d4, 0x2001, 0xa600, 0x2004, ++ 0xa086, 0x0003, 0x00c0, 0x97b6, 0x1078, 0x3699, 0x2001, 0x0006, ++ 0x1078, 0x97dd, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4, ++ 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x97d6, 0x2001, 0x0006, ++ 0x0078, 0x97d4, 0x2001, 0x0004, 0x0078, 0x97d4, 0x2001, 0x0006, ++ 0x1078, 0x97dd, 0x0078, 0x97d6, 0x1078, 0x4535, 0x1078, 0x61cd, ++ 0x1078, 0x772d, 0x1078, 0x62d1, 0x007c, 0x017e, 0x0d7e, 0x6118, ++ 0x2168, 0x6900, 0xd184, 0x0040, 0x97f8, 0x6104, 0xa18e, 0x000a, ++ 0x00c0, 0x97f0, 0x699c, 0xd1a4, 0x00c0, 0x97f0, 0x2001, 0x0007, ++ 0x1078, 0x4502, 0x2001, 0x0000, 0x1078, 0x44ee, 0x1078, 0x28a6, ++ 0x0d7f, 0x017f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, ++ 0xff00, 0x8007, 0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x1332, 0xa1b6, ++ 0x0015, 0x00c0, 0x980f, 0x1079, 0x9816, 0x0078, 0x9815, 0xa1b6, ++ 0x0016, 0x10c0, 0x1332, 0x1079, 0x9822, 0x007c, 0x7d4e, 0x7d4e, ++ 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x9877, 0x982e, 0x7d4e, 0x7d4e, ++ 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, ++ 0x9877, 0x987f, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x0f7e, 0x2079, ++ 0xa652, 0x7804, 0xd0ac, 0x00c0, 0x9855, 0x6018, 0xa07d, 0x0040, ++ 0x9855, 0x7800, 0xd0f4, 0x00c0, 0x9841, 0x7810, 0xa005, 0x00c0, ++ 0x9855, 0x2001, 0x0000, 0x1078, 0x44ee, 0x2001, 0x0002, 0x1078, ++ 0x4502, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078, ++ 0x5dd7, 0x1078, 0x62d1, 0x0078, 0x9875, 0x2011, 0xab83, 0x2204, ++ 0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x9875, 0x0c7e, 0x1078, ++ 0x45c4, 0x0040, 0x9868, 0x0c7f, 0x1078, 0x772d, 0x0078, 0x9875, ++ 0x6010, 0x007e, 0x6014, 0x007e, 0x1078, 0x42f8, 0x007f, 0x6016, ++ 0x007f, 0x6012, 0x0c7f, 0x1078, 0x772d, 0x0f7f, 0x007c, 0x6604, ++ 0xa6b6, 0x001e, 0x00c0, 0x987e, 0x1078, 0x772d, 0x007c, 0x1078, ++ 0x7f8e, 0x00c0, 0x988b, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, ++ 0x5dd7, 0x0078, 0x988d, 0x1078, 0x772d, 0x007c, 0x6004, 0xa08a, ++ 0x0044, 0x10c8, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6, 0x1078, ++ 0x62d1, 0x007c, 0xa182, 0x0040, 0x0079, 0x989e, 0x98b1, 0x98b1, ++ 0x98b1, 0x98b1, 0x98b3, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, ++ 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, ++ 0x98b1, 0x1078, 0x1332, 0x0d7e, 0x0e7e, 0x0f7e, 0x157e, 0x047e, ++ 0x027e, 0x6218, 0xa280, 0x002b, 0x2004, 0xa005, 0x0040, 0x98c4, ++ 0x2021, 0x0000, 0x1078, 0xa472, 0x6106, 0x2071, 0xab80, 0x7444, ++ 0xa4a4, 0xff00, 0x0040, 0x991b, 0xa486, 0x2000, 0x00c0, 0x98d6, ++ 0x2009, 0x0001, 0x2011, 0x0200, 0x1078, 0x5bf1, 0x1078, 0x138b, ++ 0x1040, 0x1332, 0x6003, 0x0007, 0x2d00, 0x6837, 0x010d, 0x6803, ++ 0x0000, 0x683b, 0x0000, 0x6c5a, 0x2c00, 0x685e, 0x6008, 0x68b2, ++ 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0x694a, 0x017e, 0xa084, ++ 0xff00, 0x6846, 0x684f, 0x0000, 0x6857, 0x0036, 0x1078, 0x4a73, ++ 0x017f, 0xa486, 0x2000, 0x00c0, 0x9903, 0x2019, 0x0017, 0x1078, ++ 0xa195, 0x0078, 0x997d, 0xa486, 0x0400, 0x00c0, 0x990d, 0x2019, ++ 0x0002, 0x1078, 0xa146, 0x0078, 0x997d, 0xa486, 0x0200, 0x00c0, ++ 0x9913, 0x1078, 0xa12b, 0xa486, 0x1000, 0x00c0, 0x9919, 0x1078, ++ 0xa17a, 0x0078, 0x997d, 0x2069, 0xa933, 0x6a00, 0xd284, 0x0040, ++ 0x99e7, 0xa284, 0x0300, 0x00c0, 0x99df, 0x6804, 0xa005, 0x0040, ++ 0x99c5, 0x2d78, 0x6003, 0x0007, 0x1078, 0x1370, 0x0040, 0x9984, ++ 0x7800, 0xd08c, 0x00c0, 0x9937, 0x7804, 0x8001, 0x7806, 0x6013, ++ 0x0000, 0x6803, 0x0000, 0x6837, 0x0116, 0x683b, 0x0000, 0x6008, ++ 0x68b2, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, ++ 0x6986, 0x6846, 0x7928, 0x698a, 0x792c, 0x698e, 0x7930, 0x6992, ++ 0x7934, 0x6996, 0x6853, 0x003d, 0x7244, 0xa294, 0x0003, 0xa286, ++ 0x0002, 0x00c0, 0x995f, 0x684f, 0x0040, 0x0078, 0x9969, 0xa286, ++ 0x0001, 0x00c0, 0x9967, 0x684f, 0x0080, 0x0078, 0x9969, 0x684f, ++ 0x0000, 0x20a9, 0x000a, 0x2001, 0xab90, 0xad90, 0x0015, 0x200c, ++ 0x810f, 0x2112, 0x8000, 0x8210, 0x00f0, 0x996f, 0x200c, 0x6982, ++ 0x8000, 0x200c, 0x697e, 0x1078, 0x4a73, 0x027f, 0x047f, 0x157f, ++ 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x2001, 0xa60e, 0x2004, 0xd084, ++ 0x0040, 0x998e, 0x1078, 0x138b, 0x00c0, 0x9930, 0x6013, 0x0100, ++ 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1, ++ 0x0078, 0x997d, 0x2069, 0xab92, 0x2d04, 0xa084, 0xff00, 0xa086, ++ 0x1200, 0x00c0, 0x99b9, 0x2069, 0xab80, 0x686c, 0xa084, 0x00ff, ++ 0x017e, 0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, 0x017f, 0x6003, ++ 0x0001, 0x6007, 0x0043, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, ++ 0x997d, 0x6013, 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, ++ 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x997d, 0x2001, 0xa60d, 0x2004, ++ 0xd0ec, 0x0040, 0x99cf, 0x2011, 0x8049, 0x1078, 0x361b, 0x6013, ++ 0x0300, 0x0078, 0x99d5, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007, ++ 0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x997d, 0x6013, ++ 0x0500, 0x0078, 0x99d5, 0x6013, 0x0600, 0x0078, 0x999a, 0x6013, ++ 0x0200, 0x0078, 0x999a, 0xa186, 0x0013, 0x00c0, 0x99fd, 0x6004, ++ 0xa08a, 0x0040, 0x1048, 0x1332, 0xa08a, 0x0053, 0x10c8, 0x1332, ++ 0xa082, 0x0040, 0x2008, 0x0079, 0x9a82, 0xa186, 0x0051, 0x0040, ++ 0x9a0a, 0xa186, 0x0047, 0x00c0, 0x9a23, 0x6004, 0xa086, 0x0041, ++ 0x0040, 0x9a31, 0x2001, 0x0109, 0x2004, 0xd084, 0x0040, 0x9a31, ++ 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x027e, 0x1078, 0x5c56, ++ 0x027f, 0x017f, 0x007f, 0x127f, 0x6000, 0xa086, 0x0002, 0x00c0, ++ 0x9a31, 0x0078, 0x9ac7, 0xa186, 0x0027, 0x0040, 0x9a2b, 0xa186, ++ 0x0014, 0x10c0, 0x1332, 0x6004, 0xa082, 0x0040, 0x2008, 0x0079, ++ 0x9a34, 0x1078, 0x7773, 0x007c, 0x9a47, 0x9a49, 0x9a49, 0x9a71, ++ 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, ++ 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x1078, ++ 0x1332, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x037e, 0x0d7e, 0x6010, ++ 0xa06d, 0x0040, 0x9a6e, 0xad84, 0xf000, 0x0040, 0x9a6e, 0x6003, ++ 0x0002, 0x6018, 0x2004, 0xd0bc, 0x00c0, 0x9a6e, 0x2019, 0x0004, ++ 0x1078, 0xa1ca, 0x6013, 0x0000, 0x6014, 0xa005, 0x00c0, 0x9a6c, ++ 0x2001, 0xa8a3, 0x2004, 0x6016, 0x6003, 0x0007, 0x0d7f, 0x037f, ++ 0x007c, 0x0d7e, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x1078, 0x8d06, ++ 0x0040, 0x9a7e, 0x6010, 0x2068, 0x1078, 0x13a4, 0x1078, 0x8ec6, ++ 0x0d7f, 0x007c, 0x9a95, 0x9ab4, 0x9a9e, 0x9ac1, 0x9a95, 0x9a95, ++ 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, ++ 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x1078, 0x1332, 0x6010, ++ 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x1078, 0x61cd, ++ 0x6010, 0xa080, 0x0013, 0x2004, 0xd0b4, 0x0040, 0x9aaf, 0x6003, ++ 0x0007, 0x2009, 0x0043, 0x1078, 0x775c, 0x0078, 0x9ab1, 0x6003, ++ 0x0002, 0x1078, 0x62d1, 0x007c, 0x1078, 0x61cd, 0x1078, 0xa423, ++ 0x00c0, 0x9abe, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x1078, 0x62d1, ++ 0x007c, 0x1078, 0x61cd, 0x2009, 0x0041, 0x0078, 0x9c1e, 0xa182, ++ 0x0040, 0x0079, 0x9acb, 0x9ade, 0x9ae0, 0x9ade, 0x9ade, 0x9ade, ++ 0x9ade, 0x9ade, 0x9ae1, 0x9ade, 0x9ade, 0x9ade, 0x9ade, 0x9ade, ++ 0x9ade, 0x9ade, 0x9ade, 0x9ade, 0x9aec, 0x9ade, 0x1078, 0x1332, ++ 0x007c, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, ++ 0x2c10, 0x1078, 0x15fa, 0x007c, 0x0d7e, 0x1078, 0x5bc1, 0x0d7f, ++ 0x1078, 0xa495, 0x1078, 0x772d, 0x007c, 0xa182, 0x0040, 0x0079, ++ 0x9af9, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, ++ 0x9b0e, 0x9b0c, 0x9b11, 0x9b3c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, ++ 0x9b3c, 0x9b0c, 0x9b0c, 0x9b0c, 0x1078, 0x1332, 0x1078, 0x7773, ++ 0x007c, 0x1078, 0x627a, 0x1078, 0x639b, 0x6010, 0x0d7e, 0x2068, ++ 0x684c, 0xd0fc, 0x0040, 0x9b27, 0xa08c, 0x0003, 0xa18e, 0x0002, ++ 0x0040, 0x9b2f, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x9c1e, 0x6003, ++ 0x0007, 0x6017, 0x0000, 0x1078, 0x5bc1, 0x0d7f, 0x007c, 0x1078, ++ 0xa423, 0x0040, 0x9b35, 0x0d7f, 0x007c, 0x1078, 0x5bc1, 0x1078, ++ 0x772d, 0x0d7f, 0x0078, 0x9b2e, 0x037e, 0x1078, 0x627a, 0x1078, ++ 0x639b, 0x6010, 0x0d7e, 0x2068, 0x6018, 0x2004, 0xd0bc, 0x0040, ++ 0x9b5c, 0x684c, 0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x9b58, ++ 0x687c, 0x632c, 0xa31a, 0x632e, 0x6880, 0x6328, 0xa31b, 0x632a, ++ 0x6003, 0x0002, 0x0078, 0x9b6d, 0x2019, 0x0004, 0x1078, 0xa1ca, ++ 0x6014, 0xa005, 0x00c0, 0x9b69, 0x2001, 0xa8a3, 0x2004, 0x8003, ++ 0x6016, 0x6013, 0x0000, 0x6003, 0x0007, 0x0d7f, 0x037f, 0x007c, ++ 0xa186, 0x0013, 0x00c0, 0x9b7e, 0x6004, 0xa086, 0x0042, 0x10c0, ++ 0x1332, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x007c, 0xa186, 0x0027, ++ 0x0040, 0x9b86, 0xa186, 0x0014, 0x00c0, 0x9b96, 0x6004, 0xa086, ++ 0x0042, 0x10c0, 0x1332, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078, ++ 0x61cd, 0x1078, 0x8ec6, 0x1078, 0x62d1, 0x007c, 0xa182, 0x0040, ++ 0x0079, 0x9b9a, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad, ++ 0x9bad, 0x9baf, 0x9bbb, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad, ++ 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x1078, 0x1332, 0x037e, ++ 0x047e, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x15fa, ++ 0x047f, 0x037f, 0x007c, 0x6010, 0x0d7e, 0x2068, 0x6810, 0x6a14, ++ 0x6118, 0x210c, 0xd1bc, 0x0040, 0x9bda, 0x6124, 0xd1f4, 0x00c0, ++ 0x9bda, 0x007e, 0x047e, 0x057e, 0x6c7c, 0xa422, 0x6d80, 0x2200, ++ 0xa52b, 0x602c, 0xa420, 0x642e, 0x6028, 0xa529, 0x652a, 0x057f, ++ 0x047f, 0x007f, 0xa20d, 0x00c0, 0x9bee, 0x684c, 0xd0fc, 0x0040, ++ 0x9be6, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x9c1e, 0x6003, 0x0007, ++ 0x6017, 0x0000, 0x1078, 0x5bc1, 0x0d7f, 0x007c, 0x007e, 0x0f7e, ++ 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x007f, 0x0040, 0x9bfb, 0x6003, ++ 0x0002, 0x0d7f, 0x007c, 0x2009, 0xa60d, 0x210c, 0xd19c, 0x0040, ++ 0x9c05, 0x6003, 0x0007, 0x0078, 0x9c07, 0x6003, 0x0006, 0x1078, ++ 0x9c0d, 0x1078, 0x5bc3, 0x0d7f, 0x007c, 0xd2fc, 0x0040, 0x9c19, ++ 0x8002, 0x8000, 0x8212, 0xa291, 0x0000, 0x2009, 0x0009, 0x0078, ++ 0x9c1b, 0x2009, 0x0015, 0x6a6a, 0x6866, 0x007c, 0xa182, 0x0040, ++ 0x0048, 0x9c24, 0x0079, 0x9c31, 0xa186, 0x0013, 0x0040, 0x9c2c, ++ 0xa186, 0x0014, 0x10c0, 0x1332, 0x6024, 0xd0dc, 0x1040, 0x1332, ++ 0x007c, 0x9c44, 0x9c4b, 0x9c57, 0x9c63, 0x9c44, 0x9c44, 0x9c44, ++ 0x9c72, 0x9c44, 0x9c46, 0x9c46, 0x9c44, 0x9c44, 0x9c44, 0x9c44, ++ 0x9c44, 0x9c44, 0x9c44, 0x9c44, 0x1078, 0x1332, 0x6024, 0xd0dc, ++ 0x1040, 0x1332, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, ++ 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x6003, ++ 0x0001, 0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091, 0x8000, 0x1078, ++ 0x62d1, 0x127f, 0x007c, 0x6003, 0x0003, 0x6106, 0x2c10, 0x1078, ++ 0x1cf0, 0x127e, 0x2091, 0x8000, 0x1078, 0x5df6, 0x1078, 0x639b, ++ 0x127f, 0x007c, 0xa016, 0x1078, 0x15fa, 0x007c, 0x127e, 0x2091, ++ 0x8000, 0x037e, 0x0d7e, 0xa182, 0x0040, 0x1079, 0x9c83, 0x0d7f, ++ 0x037f, 0x127f, 0x007c, 0x9c93, 0x9c95, 0x9caa, 0x9cc9, 0x9c93, ++ 0x9c93, 0x9c93, 0x9ce1, 0x9c93, 0x9c93, 0x9c93, 0x9c93, 0x9c93, ++ 0x9c93, 0x9c93, 0x9c93, 0x1078, 0x1332, 0x6010, 0x2068, 0x684c, ++ 0xd0fc, 0x0040, 0x9cbf, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040, ++ 0x9cbf, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, 0x1078, 0x62d1, ++ 0x0078, 0x9ce4, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x9cbf, ++ 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040, 0x9cbf, 0x6003, 0x0001, ++ 0x6106, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x9ce4, 0x6013, ++ 0x0000, 0x6017, 0x0000, 0x2019, 0x0004, 0x1078, 0xa1ca, 0x0078, ++ 0x9ce4, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x9cbf, 0xa09c, ++ 0x0003, 0xa39e, 0x0003, 0x0040, 0x9cbf, 0x6003, 0x0003, 0x6106, ++ 0x2c10, 0x1078, 0x1cf0, 0x1078, 0x5df6, 0x1078, 0x639b, 0x0078, ++ 0x9ce4, 0xa016, 0x1078, 0x15fa, 0x007c, 0x1078, 0x61cd, 0x6110, ++ 0x81ff, 0x0040, 0x9cf6, 0x0d7e, 0x2168, 0x1078, 0xa4e2, 0x037e, ++ 0x2019, 0x0029, 0x1078, 0xa1ca, 0x037f, 0x0d7f, 0x1078, 0x8ec6, ++ 0x1078, 0x62d1, 0x007c, 0x1078, 0x627a, 0x6110, 0x81ff, 0x0040, ++ 0x9d0c, 0x0d7e, 0x2168, 0x1078, 0xa4e2, 0x037e, 0x2019, 0x0029, ++ 0x1078, 0xa1ca, 0x037f, 0x0d7f, 0x1078, 0x8ec6, 0x1078, 0x639b, ++ 0x007c, 0xa182, 0x0085, 0x0079, 0x9d15, 0x9d1e, 0x9d1c, 0x9d1c, ++ 0x9d2a, 0x9d1c, 0x9d1c, 0x9d1c, 0x1078, 0x1332, 0x6003, 0x000b, ++ 0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, ++ 0x127f, 0x007c, 0x027e, 0x0e7e, 0x1078, 0xa41c, 0x0040, 0x9d34, ++ 0x1078, 0x772d, 0x0078, 0x9d50, 0x2071, 0xab80, 0x7224, 0x6212, ++ 0x7220, 0x1078, 0xa069, 0x0040, 0x9d41, 0x6007, 0x0086, 0x0078, ++ 0x9d4a, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x00c0, 0x9d4a, ++ 0x6007, 0x0086, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1, ++ 0x0e7f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x9d64, 0x6004, ++ 0xa08a, 0x0085, 0x1048, 0x1332, 0xa08a, 0x008c, 0x10c8, 0x1332, ++ 0xa082, 0x0085, 0x0079, 0x9d7b, 0xa186, 0x0027, 0x0040, 0x9d70, ++ 0xa186, 0x0014, 0x0040, 0x9d70, 0x1078, 0x7773, 0x0078, 0x9d7a, ++ 0x2001, 0x0007, 0x1078, 0x4535, 0x1078, 0x61cd, 0x1078, 0x8ec6, ++ 0x1078, 0x62d1, 0x007c, 0x9d82, 0x9d84, 0x9d84, 0x9d82, 0x9d82, ++ 0x9d82, 0x9d82, 0x1078, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6, ++ 0x1078, 0x62d1, 0x007c, 0xa182, 0x0085, 0x1048, 0x1332, 0xa182, ++ 0x008c, 0x10c8, 0x1332, 0xa182, 0x0085, 0x0079, 0x9d97, 0x9d9e, ++ 0x9d9e, 0x9d9e, 0x9da0, 0x9d9e, 0x9d9e, 0x9d9e, 0x1078, 0x1332, ++ 0x007c, 0xa186, 0x0013, 0x0040, 0x9db1, 0xa186, 0x0014, 0x0040, ++ 0x9db1, 0xa186, 0x0027, 0x0040, 0x9db1, 0x1078, 0x7773, 0x0078, ++ 0x9db7, 0x1078, 0x61cd, 0x1078, 0x8ec6, 0x1078, 0x62d1, 0x007c, ++ 0x037e, 0x1078, 0xa495, 0x603f, 0x0000, 0x2019, 0x000b, 0x1078, ++ 0x9dc7, 0x601f, 0x0006, 0x6003, 0x0007, 0x037f, 0x007c, 0x127e, ++ 0x037e, 0x2091, 0x8000, 0x087e, 0x2c40, 0x097e, 0x2049, 0x0000, ++ 0x1078, 0x7246, 0x097f, 0x087f, 0x00c0, 0x9e02, 0x077e, 0x2c38, ++ 0x1078, 0x72f3, 0x077f, 0x00c0, 0x9e02, 0x6000, 0xa086, 0x0000, ++ 0x0040, 0x9e02, 0x601c, 0xa086, 0x0007, 0x0040, 0x9e02, 0x0d7e, ++ 0x6000, 0xa086, 0x0004, 0x00c0, 0x9df3, 0x1078, 0xa495, 0x601f, ++ 0x0007, 0x1078, 0x1757, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, ++ 0x9dfb, 0x1078, 0xa1ca, 0x0d7f, 0x6013, 0x0000, 0x1078, 0xa495, ++ 0x601f, 0x0007, 0x037f, 0x127f, 0x007c, 0x0f7e, 0x0c7e, 0x037e, ++ 0x157e, 0x2079, 0xab80, 0x7938, 0x783c, 0x1078, 0x254d, 0x00c0, ++ 0x9e49, 0x017e, 0x0c7e, 0x1078, 0x45c4, 0x00c0, 0x9e49, 0x017f, ++ 0x027f, 0x027e, 0x017e, 0x2019, 0x0029, 0x1078, 0x73d0, 0x1078, ++ 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x077f, 0x017f, ++ 0x077e, 0x2039, 0x0000, 0x1078, 0x9f8b, 0x077f, 0x1078, 0x47e9, ++ 0x027e, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040, ++ 0x9e3d, 0xa286, 0x0004, 0x00c0, 0x9e40, 0x62a0, 0x1078, 0x2942, ++ 0x027f, 0x017f, 0x1078, 0x42f8, 0x6612, 0x6516, 0xa006, 0x0078, ++ 0x9e4b, 0x0c7f, 0x017f, 0x157f, 0x037f, 0x0c7f, 0x0f7f, 0x007c, ++ 0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x2009, 0xa620, 0x2104, 0xa086, ++ 0x0074, 0x00c0, 0x9eb3, 0x2069, 0xab8e, 0x690c, 0xa182, 0x0100, ++ 0x0048, 0x9ea3, 0x6908, 0xa184, 0x8000, 0x0040, 0x9eaf, 0x6018, ++ 0x2070, 0x7010, 0xa084, 0x00ff, 0x0040, 0x9e72, 0x7000, 0xd0f4, ++ 0x0040, 0x9e76, 0xa184, 0x0800, 0x0040, 0x9eaf, 0x6910, 0xa18a, ++ 0x0001, 0x0048, 0x9ea7, 0x6914, 0x2069, 0xabae, 0x6904, 0x81ff, ++ 0x00c0, 0x9e9b, 0x690c, 0xa182, 0x0100, 0x0048, 0x9ea3, 0x6908, ++ 0x81ff, 0x00c0, 0x9e9f, 0x6910, 0xa18a, 0x0001, 0x0048, 0x9ea7, ++ 0x6918, 0xa18a, 0x0001, 0x0048, 0x9eaf, 0x0078, 0x9eb9, 0x6013, ++ 0x0100, 0x0078, 0x9eb5, 0x6013, 0x0300, 0x0078, 0x9eb5, 0x6013, ++ 0x0500, 0x0078, 0x9eb5, 0x6013, 0x0700, 0x0078, 0x9eb5, 0x6013, ++ 0x0900, 0x0078, 0x9eb5, 0x6013, 0x0b00, 0x0078, 0x9eb5, 0x6013, ++ 0x0f00, 0x0078, 0x9eb5, 0x6013, 0x2d00, 0xa085, 0x0001, 0x0078, ++ 0x9eba, 0xa006, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c, 0x0c7e, ++ 0x0d7e, 0x027e, 0x037e, 0x157e, 0x6218, 0x2268, 0x6b04, 0xa394, ++ 0x00ff, 0xa286, 0x0006, 0x0040, 0x9ee3, 0xa286, 0x0004, 0x0040, ++ 0x9ee3, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040, 0x9ee3, ++ 0xa286, 0x0004, 0x0040, 0x9ee3, 0x0c7e, 0x2d60, 0x1078, 0x45d6, ++ 0x0c7f, 0x0078, 0x9f1e, 0x2011, 0xab96, 0xad98, 0x000a, 0x20a9, ++ 0x0004, 0x1078, 0x80de, 0x00c0, 0x9f1f, 0x2011, 0xab9a, 0xad98, ++ 0x0006, 0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x9f1f, 0x047e, ++ 0x017e, 0x6aa0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0xa653, ++ 0x210c, 0xd1a4, 0x0040, 0x9f0b, 0x2009, 0x0029, 0x1078, 0xa21d, ++ 0x6800, 0xc0e5, 0x6802, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e, ++ 0x2039, 0x0000, 0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f8b, 0x077f, ++ 0x2001, 0x0007, 0x1078, 0x4535, 0x017f, 0x047f, 0xa006, 0x157f, ++ 0x037f, 0x027f, 0x0d7f, 0x0c7f, 0x007c, 0x0d7e, 0x2069, 0xab8e, ++ 0x6800, 0xa086, 0x0800, 0x0040, 0x9f31, 0x6013, 0x0000, 0x0078, ++ 0x9f32, 0xa006, 0x0d7f, 0x007c, 0x0c7e, 0x0f7e, 0x017e, 0x027e, ++ 0x037e, 0x157e, 0x2079, 0xab8c, 0x7930, 0x7834, 0x1078, 0x254d, ++ 0x00c0, 0x9f58, 0x1078, 0x45c4, 0x00c0, 0x9f58, 0x2011, 0xab90, ++ 0xac98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x9f58, ++ 0x2011, 0xab94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x1078, 0x80de, ++ 0x157f, 0x037f, 0x027f, 0x017f, 0x0f7f, 0x0c7f, 0x007c, 0x0c7e, ++ 0x007e, 0x017e, 0x027e, 0x037e, 0x157e, 0x2011, 0xab83, 0x2204, ++ 0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x9f84, 0x1078, 0x45c4, ++ 0x00c0, 0x9f84, 0x2011, 0xab96, 0xac98, 0x000a, 0x20a9, 0x0004, ++ 0x1078, 0x80de, 0x00c0, 0x9f84, 0x2011, 0xab9a, 0xac98, 0x0006, ++ 0x20a9, 0x0004, 0x1078, 0x80de, 0x157f, 0x037f, 0x027f, 0x017f, ++ 0x007f, 0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x087e, 0x077e, 0x067e, ++ 0x057e, 0x047e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2740, 0x2029, ++ 0xa8ba, 0x252c, 0x2021, 0xa8c0, 0x2424, 0x2061, 0xad00, 0x2071, ++ 0xa600, 0x7648, 0x7064, 0x81ff, 0x0040, 0x9fb2, 0x007e, 0xa186, ++ 0xa9b3, 0x007f, 0x0040, 0x9fb2, 0x8001, 0xa602, 0x00c8, 0xa01c, ++ 0x0078, 0x9fb5, 0xa606, 0x0040, 0xa01c, 0x2100, 0xac06, 0x0040, ++ 0xa012, 0x1078, 0xa242, 0x0040, 0xa012, 0x671c, 0xa786, 0x0001, ++ 0x0040, 0xa037, 0xa786, 0x0004, 0x0040, 0xa037, 0xa786, 0x0007, ++ 0x0040, 0xa012, 0x2500, 0xac06, 0x0040, 0xa012, 0x2400, 0xac06, ++ 0x0040, 0xa012, 0x1078, 0xa256, 0x00c0, 0xa012, 0x88ff, 0x0040, ++ 0x9fdd, 0x6020, 0xa906, 0x00c0, 0xa012, 0x0d7e, 0x6000, 0xa086, ++ 0x0004, 0x00c0, 0x9fe7, 0x017e, 0x1078, 0x1757, 0x017f, 0xa786, ++ 0x0008, 0x00c0, 0x9ff6, 0x1078, 0x8f00, 0x00c0, 0x9ff6, 0x1078, ++ 0x7c83, 0x0d7f, 0x1078, 0x8ec6, 0x0078, 0xa012, 0x6010, 0x2068, ++ 0x1078, 0x8d06, 0x0040, 0xa00f, 0xa786, 0x0003, 0x00c0, 0xa026, ++ 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0xa4e2, 0x017e, ++ 0x1078, 0x8f7d, 0x1078, 0x4a73, 0x017f, 0x1078, 0x8eb9, 0x0d7f, ++ 0x1078, 0x8ec6, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, 0xac02, ++ 0x00c8, 0xa01c, 0x0078, 0x9f9f, 0x127f, 0x027f, 0x047f, 0x057f, ++ 0x067f, 0x077f, 0x087f, 0x0c7f, 0x0e7f, 0x007c, 0xa786, 0x0006, ++ 0x00c0, 0xa000, 0xa386, 0x0005, 0x0040, 0xa034, 0x1078, 0xa4e2, ++ 0x1078, 0xa1ca, 0x0078, 0xa00f, 0x0d7f, 0x0078, 0xa012, 0x1078, ++ 0xa256, 0x00c0, 0xa012, 0x81ff, 0x0040, 0xa012, 0xa180, 0x0001, ++ 0x2004, 0xa086, 0x0018, 0x0040, 0xa04c, 0xa180, 0x0001, 0x2004, ++ 0xa086, 0x002d, 0x00c0, 0xa012, 0x6000, 0xa086, 0x0002, 0x00c0, ++ 0xa012, 0x1078, 0x8eec, 0x0040, 0xa05d, 0x1078, 0x8f00, 0x00c0, ++ 0xa012, 0x1078, 0x7c83, 0x0078, 0xa065, 0x1078, 0x28a6, 0x1078, ++ 0x8f00, 0x00c0, 0xa065, 0x1078, 0x7c83, 0x1078, 0x8ec6, 0x0078, ++ 0xa012, 0x0c7e, 0x0e7e, 0x017e, 0x2c08, 0x2170, 0xa006, 0x1078, ++ 0xa1e6, 0x017f, 0x0040, 0xa079, 0x601c, 0xa084, 0x000f, 0x1079, ++ 0xa07c, 0x0e7f, 0x0c7f, 0x007c, 0xa084, 0xa084, 0xa084, 0xa084, ++ 0xa084, 0xa084, 0xa086, 0xa084, 0xa006, 0x007c, 0x047e, 0x017e, ++ 0x7018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, ++ 0x2009, 0x0020, 0x1078, 0xa21d, 0x017f, 0x047f, 0x037e, 0x2019, ++ 0x0002, 0x1078, 0x9dc7, 0x037f, 0xa085, 0x0001, 0x007c, 0x2001, ++ 0x0001, 0x1078, 0x44ee, 0x157e, 0x017e, 0x027e, 0x037e, 0x20a9, ++ 0x0004, 0x2019, 0xa605, 0x2011, 0xab96, 0x1078, 0x80de, 0x037f, ++ 0x027f, 0x017f, 0x157f, 0xa005, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, ++ 0x087e, 0x077e, 0x067e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2740, ++ 0x2061, 0xad00, 0x2079, 0x0001, 0x8fff, 0x0040, 0xa11d, 0x2071, ++ 0xa600, 0x7648, 0x7064, 0x8001, 0xa602, 0x00c8, 0xa11d, 0x88ff, ++ 0x0040, 0xa0d8, 0x2800, 0xac06, 0x00c0, 0xa113, 0x2079, 0x0000, ++ 0x1078, 0xa242, 0x0040, 0xa113, 0x2400, 0xac06, 0x0040, 0xa113, ++ 0x671c, 0xa786, 0x0006, 0x00c0, 0xa113, 0xa786, 0x0007, 0x0040, ++ 0xa113, 0x88ff, 0x00c0, 0xa0f7, 0x6018, 0xa206, 0x00c0, 0xa113, ++ 0x85ff, 0x0040, 0xa0f7, 0x6020, 0xa106, 0x00c0, 0xa113, 0x0d7e, ++ 0x6000, 0xa086, 0x0004, 0x00c0, 0xa103, 0x1078, 0xa495, 0x601f, ++ 0x0007, 0x1078, 0x1757, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, ++ 0xa10d, 0x047e, 0x1078, 0xa1ca, 0x047f, 0x0d7f, 0x1078, 0x8ec6, ++ 0x88ff, 0x00c0, 0xa127, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, ++ 0xac02, 0x00c8, 0xa11d, 0x0078, 0xa0c4, 0xa006, 0x127f, 0x027f, ++ 0x067f, 0x077f, 0x087f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0xa8c5, ++ 0x0001, 0x0078, 0xa11e, 0x077e, 0x057e, 0x087e, 0x2041, 0x0000, ++ 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6218, 0x097e, 0x2049, ++ 0x0000, 0x1078, 0x7246, 0x097f, 0x087f, 0x2039, 0x0000, 0x1078, ++ 0x72f3, 0x1078, 0xa0b5, 0x057f, 0x077f, 0x007c, 0x027e, 0x047e, ++ 0x057e, 0x077e, 0x0c7e, 0x157e, 0x2c20, 0x2128, 0x20a9, 0x007f, ++ 0x2009, 0x0000, 0x017e, 0x037e, 0x1078, 0x45c4, 0x00c0, 0xa16e, ++ 0x2c10, 0x057e, 0x087e, 0x2041, 0x0000, 0x2508, 0x2029, 0x0001, ++ 0x097e, 0x2049, 0x0000, 0x1078, 0x7246, 0x097f, 0x087f, 0x2039, ++ 0x0000, 0x1078, 0x72f3, 0x1078, 0xa0b5, 0x057f, 0x037f, 0x017f, ++ 0x8108, 0x00f0, 0xa152, 0x157f, 0x0c7f, 0x077f, 0x057f, 0x047f, ++ 0x027f, 0x007c, 0x077e, 0x057e, 0x6218, 0x087e, 0x2041, 0x0000, ++ 0x2029, 0x0001, 0x2019, 0x0048, 0x097e, 0x2049, 0x0000, 0x1078, ++ 0x7246, 0x097f, 0x087f, 0x2039, 0x0000, 0x1078, 0x72f3, 0x2c20, ++ 0x1078, 0xa0b5, 0x057f, 0x077f, 0x007c, 0x027e, 0x047e, 0x057e, ++ 0x077e, 0x0c7e, 0x157e, 0x2c20, 0x20a9, 0x007f, 0x2009, 0x0000, ++ 0x017e, 0x037e, 0x1078, 0x45c4, 0x00c0, 0xa1be, 0x2c10, 0x087e, ++ 0x2041, 0x0000, 0x2828, 0x047e, 0x2021, 0x0001, 0x1078, 0xa472, ++ 0x047f, 0x097e, 0x2049, 0x0000, 0x1078, 0x7246, 0x097f, 0x087f, ++ 0x2039, 0x0000, 0x1078, 0x72f3, 0x1078, 0xa0b5, 0x037f, 0x017f, ++ 0x8108, 0x00f0, 0xa1a0, 0x157f, 0x0c7f, 0x077f, 0x057f, 0x047f, ++ 0x027f, 0x007c, 0x017e, 0x0f7e, 0xad82, 0xcd00, 0x0048, 0xa1e3, ++ 0xad82, 0xffff, 0x00c8, 0xa1e3, 0x6800, 0xa07d, 0x0040, 0xa1e0, ++ 0x6803, 0x0000, 0x6b52, 0x1078, 0x4a73, 0x2f68, 0x0078, 0xa1d4, ++ 0x6b52, 0x1078, 0x4a73, 0x0f7f, 0x017f, 0x007c, 0x0e7e, 0x047e, ++ 0x037e, 0x2061, 0xad00, 0xa005, 0x00c0, 0xa1f6, 0x2071, 0xa600, ++ 0x7448, 0x7064, 0x8001, 0xa402, 0x00c8, 0xa218, 0x2100, 0xac06, ++ 0x0040, 0xa20a, 0x6000, 0xa086, 0x0000, 0x0040, 0xa20a, 0x6008, ++ 0xa206, 0x00c0, 0xa20a, 0x6018, 0xa1a0, 0x0006, 0x2424, 0xa406, ++ 0x0040, 0xa214, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, 0xac02, ++ 0x00c8, 0xa218, 0x0078, 0xa1f6, 0xa085, 0x0001, 0x0078, 0xa219, ++ 0xa006, 0x037f, 0x047f, 0x0e7f, 0x007c, 0x0d7e, 0x007e, 0x1078, ++ 0x138b, 0x007f, 0x1040, 0x1332, 0x6837, 0x010d, 0x685e, 0x027e, ++ 0x2010, 0x1078, 0x8cf2, 0x2001, 0x0000, 0x0040, 0xa233, 0x2200, ++ 0xa080, 0x0008, 0x2004, 0x027f, 0x684a, 0x6956, 0x6c46, 0x684f, ++ 0x0000, 0xa006, 0x68b2, 0x6802, 0x683a, 0x685a, 0x1078, 0x4a73, ++ 0x0d7f, 0x007c, 0x6700, 0xa786, 0x0000, 0x0040, 0xa255, 0xa786, ++ 0x0001, 0x0040, 0xa255, 0xa786, 0x000a, 0x0040, 0xa255, 0xa786, ++ 0x0009, 0x0040, 0xa255, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x6018, ++ 0x2070, 0x70a0, 0xa206, 0x0e7f, 0x007c, 0x017e, 0x6004, 0xa08e, ++ 0x001e, 0x00c0, 0xa277, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105, ++ 0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0005, 0x2001, ++ 0xa8a3, 0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x017f, ++ 0x007c, 0x0005, 0x0005, 0x007c, 0x6024, 0xd0e4, 0x0040, 0xa28d, ++ 0xd0cc, 0x0040, 0xa287, 0x1078, 0x8fbf, 0x0078, 0xa28d, 0x1078, ++ 0xa495, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x007c, 0xa280, 0x0007, ++ 0x2004, 0xa084, 0x000f, 0x0079, 0xa295, 0xa29e, 0xa29e, 0xa29e, ++ 0xa2a0, 0xa29e, 0xa2a0, 0xa2a0, 0xa29e, 0xa2a0, 0xa006, 0x007c, ++ 0xa085, 0x0001, 0x007c, 0xa280, 0x0007, 0x2004, 0xa084, 0x000f, ++ 0x0079, 0xa2aa, 0xa2b3, 0xa2b3, 0xa2b3, 0xa2b3, 0xa2b3, 0xa2b3, ++ 0xa2be, 0xa2b3, 0xa2b3, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, ++ 0x2a00, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x007c, 0x0c7e, 0x2260, ++ 0x1078, 0xa495, 0x603f, 0x0000, 0x6024, 0xc0f4, 0xc0cc, 0x6026, ++ 0x0c7f, 0x0d7e, 0x2268, 0xa186, 0x0007, 0x00c0, 0xa31f, 0x6810, ++ 0xa005, 0x0040, 0xa2dc, 0xa080, 0x0013, 0x2004, 0xd0fc, 0x00c0, ++ 0xa2dc, 0x0d7f, 0x0078, 0xa2b3, 0x6007, 0x003a, 0x6003, 0x0001, ++ 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7e, 0x2d60, 0x6100, 0xa186, ++ 0x0002, 0x00c0, 0xa3ad, 0x6010, 0xa005, 0x00c0, 0xa2f6, 0x6000, ++ 0xa086, 0x0007, 0x10c0, 0x1332, 0x0078, 0xa3ad, 0xa08c, 0xf000, ++ 0x00c0, 0xa302, 0x0078, 0xa302, 0x2068, 0x6800, 0xa005, 0x00c0, ++ 0xa2fc, 0x2d00, 0xa080, 0x0013, 0x2004, 0xa084, 0x0003, 0xa086, ++ 0x0002, 0x00c0, 0xa31b, 0x6010, 0x2068, 0x684c, 0xc0dc, 0xc0f4, ++ 0x684e, 0x6850, 0xc0f4, 0xc0fc, 0x6852, 0x2009, 0x0043, 0x1078, ++ 0x9c1e, 0x0078, 0xa3ad, 0x2009, 0x0041, 0x0078, 0xa3a7, 0xa186, ++ 0x0005, 0x00c0, 0xa366, 0x6810, 0xa080, 0x0013, 0x2004, 0xd0bc, ++ 0x00c0, 0xa32d, 0x0d7f, 0x0078, 0xa2b3, 0xd0b4, 0x0040, 0xa335, ++ 0xd0fc, 0x1040, 0x1332, 0x0078, 0xa2cf, 0x6007, 0x003a, 0x6003, ++ 0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7e, 0x2d60, 0x6100, ++ 0xa186, 0x0002, 0x0040, 0xa348, 0xa186, 0x0004, 0x00c0, 0xa3ad, ++ 0x2071, 0xa8e7, 0x7000, 0xa086, 0x0003, 0x00c0, 0xa355, 0x7004, ++ 0xac06, 0x00c0, 0xa355, 0x7003, 0x0000, 0x6810, 0xa080, 0x0013, ++ 0x200c, 0xc1f4, 0xc1dc, 0x2102, 0x8000, 0x200c, 0xc1f4, 0xc1fc, ++ 0xc1bc, 0x2102, 0x2009, 0x0042, 0x0078, 0xa3a7, 0x037e, 0x0d7e, ++ 0x0d7e, 0x1078, 0x138b, 0x037f, 0x1040, 0x1332, 0x6837, 0x010d, ++ 0x6803, 0x0000, 0x683b, 0x0000, 0x685b, 0x0000, 0x6b5e, 0x6857, ++ 0x0045, 0x2c00, 0x6862, 0x6034, 0x6872, 0x2360, 0x6024, 0xc0dd, ++ 0x6026, 0x6018, 0xa080, 0x0028, 0x2004, 0xa084, 0x00ff, 0x8007, ++ 0x6320, 0x6b4a, 0x6846, 0x684f, 0x0000, 0x6d6a, 0x6e66, 0x686f, ++ 0x0001, 0x1078, 0x4a73, 0x2019, 0x0045, 0x6008, 0x2068, 0x1078, ++ 0x9dc7, 0x2d00, 0x600a, 0x601f, 0x0006, 0x6003, 0x0007, 0x6017, ++ 0x0000, 0x603f, 0x0000, 0x0d7f, 0x037f, 0x0078, 0xa3ae, 0x603f, ++ 0x0000, 0x6003, 0x0007, 0x1078, 0x9c1e, 0x0c7f, 0x0d7f, 0x007c, ++ 0xa186, 0x0013, 0x00c0, 0xa3ba, 0x6004, 0xa082, 0x0085, 0x2008, ++ 0x0079, 0xa3d4, 0xa186, 0x0027, 0x00c0, 0xa3cd, 0x1078, 0x61cd, ++ 0x037e, 0x0d7e, 0x6010, 0x2068, 0x2019, 0x0004, 0x1078, 0xa1ca, ++ 0x0d7f, 0x037f, 0x1078, 0x62d1, 0x007c, 0xa186, 0x0014, 0x0040, ++ 0xa3be, 0x1078, 0x7773, 0x007c, 0xa3dd, 0xa3db, 0xa3db, 0xa3db, ++ 0xa3db, 0xa3db, 0xa3dd, 0x1078, 0x1332, 0x1078, 0x61cd, 0x6003, ++ 0x000c, 0x1078, 0x62d1, 0x007c, 0xa182, 0x008c, 0x00c8, 0xa3ee, ++ 0xa182, 0x0085, 0x0048, 0xa3ee, 0x0079, 0xa3f1, 0x1078, 0x7773, ++ 0x007c, 0xa3f8, 0xa3f8, 0xa3f8, 0xa3f8, 0xa3fa, 0xa419, 0xa3f8, ++ 0x1078, 0x1332, 0x0d7e, 0x2c68, 0x1078, 0x76c7, 0x0040, 0xa414, ++ 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0xab8e, 0x210c, 0x6136, ++ 0x2009, 0xab8f, 0x210c, 0x613a, 0x600b, 0xffff, 0x6918, 0x611a, ++ 0x601f, 0x0004, 0x1078, 0x5d8a, 0x2d60, 0x1078, 0x772d, 0x0d7f, ++ 0x007c, 0x1078, 0x772d, 0x007c, 0x0e7e, 0x6018, 0x2070, 0x7000, ++ 0xd0ec, 0x0e7f, 0x007c, 0x6010, 0xa08c, 0xf000, 0x0040, 0xa471, ++ 0xa080, 0x0013, 0x200c, 0xd1ec, 0x0040, 0xa471, 0x2001, 0xa672, ++ 0x2004, 0xd0ec, 0x0040, 0xa471, 0x6003, 0x0002, 0x6024, 0xc0e5, ++ 0x6026, 0xd1ac, 0x0040, 0xa44f, 0x0f7e, 0x2c78, 0x1078, 0x495f, ++ 0x0f7f, 0x0040, 0xa44f, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x2009, ++ 0xa672, 0x210c, 0xd1f4, 0x00c0, 0xa46f, 0x0078, 0xa461, 0x2009, ++ 0xa672, 0x210c, 0xd1f4, 0x0040, 0xa45b, 0x6024, 0xc0e4, 0x6026, ++ 0xa006, 0x0078, 0xa471, 0x2001, 0xa8a4, 0x200c, 0x8103, 0xa100, ++ 0x603e, 0x6018, 0xa088, 0x002b, 0x2104, 0xa005, 0x0040, 0xa46c, ++ 0xa088, 0x0003, 0x0078, 0xa464, 0x2c0a, 0x600f, 0x0000, 0xa085, ++ 0x0001, 0x007c, 0x017e, 0x0c7e, 0x0e7e, 0x6120, 0xa2f0, 0x002b, ++ 0x2e04, 0x2060, 0x8cff, 0x0040, 0xa491, 0x84ff, 0x00c0, 0xa484, ++ 0x6020, 0xa106, 0x00c0, 0xa48c, 0x600c, 0x2072, 0x1078, 0x5bc1, ++ 0x1078, 0x772d, 0x0078, 0xa48e, 0xacf0, 0x0003, 0x2e64, 0x0078, ++ 0xa47a, 0x0e7f, 0x0c7f, 0x017f, 0x007c, 0x0d7e, 0x6018, 0xa0e8, ++ 0x002b, 0x2d04, 0xa005, 0x0040, 0xa4a7, 0xac06, 0x0040, 0xa4a5, ++ 0x2d04, 0xa0e8, 0x0003, 0x0078, 0xa499, 0x600c, 0x206a, 0x0d7f, ++ 0x007c, 0x027e, 0x037e, 0x157e, 0x2011, 0xa626, 0x2204, 0xa084, ++ 0x00ff, 0x2019, 0xab8e, 0x2334, 0xa636, 0x00c0, 0xa4d5, 0x8318, ++ 0x2334, 0x2204, 0xa084, 0xff00, 0xa636, 0x00c0, 0xa4d5, 0x2011, ++ 0xab90, 0x6018, 0xa098, 0x000a, 0x20a9, 0x0004, 0x1078, 0x80de, ++ 0x00c0, 0xa4d5, 0x2011, 0xab94, 0x6018, 0xa098, 0x0006, 0x20a9, ++ 0x0004, 0x1078, 0x80de, 0x00c0, 0xa4d5, 0x157f, 0x037f, 0x027f, ++ 0x007c, 0x0e7e, 0x2071, 0xa600, 0x1078, 0x42b8, 0x1078, 0x2677, ++ 0x0e7f, 0x007c, 0x0e7e, 0x6018, 0x2070, 0x7000, 0xd0fc, 0x0040, ++ 0xa4eb, 0x1078, 0xa4ed, 0x0e7f, 0x007c, 0x6850, 0xc0e5, 0x6852, ++ 0x007c, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x057e, 0x047e, 0x027e, ++ 0x017e, 0x127e, 0x2091, 0x8000, 0x2029, 0xa8ba, 0x252c, 0x2021, ++ 0xa8c0, 0x2424, 0x2061, 0xad00, 0x2071, 0xa600, 0x7648, 0x7064, ++ 0xa606, 0x0040, 0xa545, 0x671c, 0xa786, 0x0001, 0x0040, 0xa514, ++ 0xa786, 0x0008, 0x00c0, 0xa53b, 0x2500, 0xac06, 0x0040, 0xa53b, ++ 0x2400, 0xac06, 0x0040, 0xa53b, 0x1078, 0xa242, 0x0040, 0xa53b, ++ 0x1078, 0xa256, 0x00c0, 0xa53b, 0x6000, 0xa086, 0x0004, 0x00c0, ++ 0xa52d, 0x017e, 0x1078, 0x1757, 0x017f, 0x1078, 0x8eec, 0x00c0, ++ 0xa533, 0x1078, 0x28a6, 0x1078, 0x8f00, 0x00c0, 0xa539, 0x1078, ++ 0x7c83, 0x1078, 0x8ec6, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, ++ 0xac02, 0x00c8, 0xa545, 0x0078, 0xa504, 0x127f, 0x017f, 0x027f, ++ 0x047f, 0x057f, 0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x007c, 0x127e, ++ 0x007e, 0x0e7e, 0x017e, 0x2091, 0x8000, 0x2071, 0xa640, 0xd5a4, ++ 0x0040, 0xa55d, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040, 0xa563, ++ 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0040, 0xa579, 0x2500, 0xa084, ++ 0x0007, 0xa08e, 0x0003, 0x0040, 0xa579, 0xa08e, 0x0004, 0x0040, ++ 0xa579, 0xa08e, 0x0005, 0x0040, 0xa579, 0x2071, 0xa64a, 0x1078, ++ 0xa5ba, 0x017f, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e, 0x007e, ++ 0x0e7e, 0x017e, 0x2091, 0x8000, 0x2071, 0xa640, 0xd5a4, 0x0040, ++ 0xa58c, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040, 0xa592, 0x7030, ++ 0x8000, 0x7032, 0xd5ac, 0x0040, 0xa5a8, 0x2500, 0xa084, 0x0007, ++ 0xa08e, 0x0003, 0x0040, 0xa5a8, 0xa08e, 0x0004, 0x0040, 0xa5a8, ++ 0xa08e, 0x0005, 0x0040, 0xa5a8, 0x2071, 0xa64a, 0x1078, 0xa5ba, ++ 0x017f, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e, 0x007e, 0x0e7e, ++ 0x2091, 0x8000, 0x2071, 0xa642, 0x1078, 0xa5ba, 0x0e7f, 0x007f, ++ 0x127f, 0x007c, 0x2e04, 0x8000, 0x2072, 0x00c8, 0xa5c3, 0x8e70, ++ 0x2e04, 0x8000, 0x2072, 0x007c, 0x0e7e, 0x2071, 0xa640, 0x1078, ++ 0xa5ba, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa644, 0x1078, 0xa5ba, ++ 0x0e7f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071, ++ 0xa640, 0x7044, 0x8000, 0x7046, 0x0e7f, 0x007f, 0x127f, 0x007c, ++ 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, ++ 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, ++ 0xa50c ++}; ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2100tp_length01 = 0x95f1; ++#else ++unsigned short risc_code_length01 = 0x95f1; ++#endif ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/ql2200ip_fw.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,5884 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ *************************************************************************/ ++ ++/************************************************************************ ++ * * ++ * -- ISP2200 Initiator/Target Firmware --- * ++ * IP and SCSI, Fabric (Public Loop), Point-point, and * ++ * expanded LUN addressing for FCTAPE * ++ * * ++ ************************************************************************/ ++ ++/* ++ * Firmware Version 2.02.05 (13:47 Apr 25, 2003) ++ */ ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2200ip_version = 2*1024+2; ++#else ++unsigned short risc_code_version = 2*1024+2; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned char fw2200ip_version_str[] = {2,2,5}; ++#else ++unsigned char firmware_version[] = {2,2,5}; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++#define fw2200ip_VERSION_STRING "2.02.05" ++#else ++#define FW_VERSION_STRING "2.02.05" ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2200ip_addr01 = 0x1000 ; ++#else ++unsigned short risc_code_addr01 = 0x1000 ; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2200ip_code01[] = { ++#else ++unsigned short risc_code01[] = { ++#endif ++ 0x0470, 0x0000, 0x0000, 0xb5c6, 0x0000, 0x0002, 0x0002, 0x0005, ++ 0x0037, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030, ++ 0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241, ++ 0x5449, 0x4f4e, 0x2049, 0x5350, 0x3232, 0x3030, 0x2046, 0x6972, ++ 0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, ++ 0x322e, 0x3032, 0x2e30, 0x3520, 0x2020, 0x2020, 0x2400, 0x20c1, ++ 0x0005, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9, 0xcbff, 0x2091, ++ 0x2000, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x2b14, ++ 0x2051, 0xc600, 0x2a70, 0x2029, 0xfe00, 0x2031, 0xffff, 0x2039, ++ 0xfde9, 0x2021, 0x0200, 0x0804, 0x146c, 0x20a1, 0xc5c6, 0xa00e, ++ 0x20a9, 0x083a, 0x41a4, 0x3400, 0x7562, 0x7666, 0x775e, 0x746a, ++ 0x746e, 0x20a1, 0xce00, 0x7164, 0x810d, 0x810d, 0x810d, 0x810d, ++ 0xa18c, 0x000f, 0x2001, 0x000c, 0xa112, 0xa00e, 0x21a8, 0x41a4, ++ 0x3400, 0x8211, 0x1dd8, 0x7164, 0x3400, 0xa102, 0x0120, 0x0218, ++ 0x20a8, 0xa00e, 0x41a4, 0x3800, 0xd08c, 0x01d8, 0x2009, 0xc600, ++ 0x810d, 0x810d, 0x810d, 0x810d, 0xa18c, 0x000f, 0x2001, 0x0001, ++ 0xa112, 0x20a1, 0x1000, 0xa00e, 0x21a8, 0x41a4, 0x8211, 0x1de0, ++ 0x2009, 0xc600, 0x3400, 0xa102, 0x0120, 0x0218, 0x20a8, 0xa00e, ++ 0x41a4, 0x080c, 0x1415, 0x080c, 0x163c, 0x080c, 0x17de, 0x080c, ++ 0x2061, 0x080c, 0x4f3b, 0x080c, 0x9585, 0x080c, 0x15bf, 0x080c, ++ 0x306e, 0x080c, 0x61dd, 0x080c, 0x5743, 0x080c, 0x7147, 0x080c, ++ 0x6edf, 0x080c, 0x265b, 0x080c, 0x7860, 0x080c, 0x68c0, 0x080c, ++ 0x2515, 0x080c, 0x2629, 0x2091, 0x3009, 0x7823, 0x0000, 0x1004, ++ 0x10c7, 0x7820, 0xa086, 0x0002, 0x1150, 0x7823, 0x4000, 0x0e04, ++ 0x10bf, 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, ++ 0x7003, 0x0000, 0x2a70, 0x7000, 0xa08e, 0x0003, 0x1168, 0x080c, ++ 0x40b9, 0x080c, 0x3095, 0x080c, 0x622b, 0x080c, 0x5943, 0x080c, ++ 0x7184, 0x080c, 0x6f0a, 0x0c70, 0x000b, 0x0c88, 0x10e8, 0x10e9, ++ 0x1214, 0x10e6, 0x12e1, 0x1412, 0x1413, 0x1414, 0x080c, 0x1519, ++ 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0xa086, 0x0001, ++ 0x1904, 0x11f1, 0x080c, 0x158c, 0x080c, 0x5f22, 0x0150, 0x080c, ++ 0x5f48, 0x15c0, 0x2079, 0x0100, 0x7828, 0xa085, 0x1800, 0x782a, ++ 0x0488, 0x080c, 0x5e5a, 0x7000, 0xa086, 0x0001, 0x1904, 0x11f1, ++ 0x708c, 0xa086, 0x0028, 0x1904, 0x11f1, 0x2001, 0x0161, 0x2003, ++ 0x0001, 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0xa295, 0x1e2f, ++ 0x7a2a, 0x2011, 0x5df5, 0x080c, 0x6fad, 0x2011, 0x5de8, 0x080c, ++ 0x7070, 0x2011, 0x5e37, 0x080c, 0x6fad, 0x2011, 0x4e18, 0x080c, ++ 0x6fad, 0x2011, 0x8030, 0x2019, 0x0000, 0x708b, 0x0000, 0x080c, ++ 0x1eae, 0x00e8, 0x080c, 0x47cb, 0x2079, 0x0100, 0x7844, 0xa005, ++ 0x1904, 0x11f1, 0x2011, 0x4e18, 0x080c, 0x6fad, 0x2011, 0x5e37, ++ 0x080c, 0x6fad, 0x080c, 0x1eae, 0x2001, 0xc8d4, 0x2004, 0x780e, ++ 0x7840, 0xa084, 0xfffb, 0x7842, 0x2011, 0x8010, 0x73cc, 0x080c, ++ 0x407d, 0x723c, 0xc284, 0x723e, 0x2001, 0xc60c, 0x200c, 0xc1ac, ++ 0x2102, 0x080c, 0x8dca, 0x2011, 0x0004, 0x080c, 0xac97, 0x080c, ++ 0x55e1, 0x080c, 0x5f22, 0x0158, 0x080c, 0x4f24, 0x0140, 0x708b, ++ 0x0001, 0x70c7, 0x0000, 0x080c, 0x4968, 0x0804, 0x11f1, 0x080c, ++ 0x570b, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x0060, 0x7073, 0x0000, ++ 0x080c, 0xb03f, 0x70d4, 0xd09c, 0x1128, 0x70a0, 0xa005, 0x0110, ++ 0x080c, 0x4f02, 0x70df, 0x0000, 0x70db, 0x0000, 0x72d4, 0x080c, ++ 0x5f22, 0x1178, 0x2011, 0x0000, 0x0016, 0x080c, 0x2a95, 0x2019, ++ 0xc8d6, 0x211a, 0x001e, 0x7053, 0xffff, 0x7057, 0x00ef, 0x7077, ++ 0x0000, 0x2079, 0xc652, 0x7804, 0xd0ac, 0x0108, 0xc295, 0x72d6, ++ 0x080c, 0x5f22, 0x0118, 0xa296, 0x0004, 0x0548, 0x2011, 0x0001, ++ 0x080c, 0xac97, 0x709b, 0x0000, 0x709f, 0xffff, 0x7003, 0x0002, ++ 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0xa085, 0x0003, 0x782a, ++ 0x00fe, 0x080c, 0x2c62, 0x2011, 0x0005, 0x080c, 0x8f0e, 0x080c, ++ 0x7e94, 0x080c, 0x5f22, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, ++ 0x080c, 0x2a95, 0x61e2, 0x001e, 0x00ce, 0x012e, 0x0420, 0x709b, ++ 0x0000, 0x709f, 0xffff, 0x7003, 0x0002, 0x00f6, 0x2079, 0x0100, ++ 0x7827, 0x0003, 0x7828, 0xa085, 0x0003, 0x782a, 0x00fe, 0x2011, ++ 0x0005, 0x080c, 0x8f0e, 0x080c, 0x7e94, 0x080c, 0x5f22, 0x0148, ++ 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x2a95, 0x61e2, 0x001e, ++ 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x080c, 0x5f22, 0x1118, ++ 0x20a9, 0x0100, 0x0010, 0x20a9, 0x0082, 0x080c, 0x5f22, 0x1118, ++ 0x2009, 0x0000, 0x0010, 0x2009, 0x007e, 0x080c, 0x2f41, 0x8108, ++ 0x1f04, 0x1205, 0x00ce, 0x7073, 0x0000, 0x7074, 0xa084, 0x00ff, ++ 0x7076, 0x70a3, 0x0000, 0x0005, 0x0126, 0x2091, 0x8000, 0x7000, ++ 0xa086, 0x0002, 0x1904, 0x12df, 0x709c, 0xa086, 0xffff, 0x0130, ++ 0x080c, 0x2c62, 0x080c, 0x7e94, 0x0804, 0x12df, 0x70d4, 0xd0ac, ++ 0x1110, 0xd09c, 0x0540, 0xd084, 0x0530, 0x0006, 0x0016, 0x2001, ++ 0x0103, 0x2009, 0xc8d4, 0x210c, 0x2102, 0x001e, 0x000e, 0xd08c, ++ 0x01d0, 0x70d8, 0xa086, 0xffff, 0x0190, 0x080c, 0x2dc1, 0x080c, ++ 0x7e94, 0x70d4, 0xd094, 0x1904, 0x12df, 0x2011, 0x0001, 0x2019, ++ 0x0000, 0x080c, 0x2df9, 0x080c, 0x7e94, 0x0804, 0x12df, 0x70dc, ++ 0xa005, 0x1904, 0x12df, 0x7098, 0xa005, 0x1904, 0x12df, 0x70d4, ++ 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x12df, 0x080c, 0x570b, 0x1904, ++ 0x12df, 0x2001, 0xc653, 0x2004, 0xd0ac, 0x01c8, 0x0156, 0x00c6, ++ 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x533d, 0x1118, ++ 0x6000, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x126c, 0x00ce, ++ 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x12df, 0x0006, ++ 0x0016, 0x2001, 0x0103, 0x2009, 0xc8d4, 0x210c, 0x2102, 0x001e, ++ 0x000e, 0x71a8, 0x81ff, 0x11b0, 0xa006, 0x2009, 0x0200, 0x20a9, ++ 0x0002, 0x20a1, 0xc925, 0x40a1, 0x2009, 0x0700, 0x20a9, 0x0002, ++ 0x20a1, 0xc915, 0x40a1, 0x7070, 0x8007, 0x7174, 0x810f, 0x20a9, ++ 0x0002, 0x40a1, 0x20a1, 0xc919, 0x2009, 0x0000, 0x080c, 0x14ff, ++ 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x40a1, 0x7030, 0xc08c, ++ 0x7032, 0x7003, 0x0003, 0x709f, 0xffff, 0x080c, 0x1585, 0xa006, ++ 0x080c, 0x296d, 0x080c, 0x40ef, 0x00f6, 0x2079, 0x0100, 0x080c, ++ 0x5f48, 0x0150, 0x080c, 0x5f22, 0x7828, 0x0118, 0xa084, 0xe1ff, ++ 0x0010, 0xa084, 0xffdf, 0x782a, 0x00fe, 0x2001, 0xc928, 0x2004, ++ 0xa086, 0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0x8f0e, 0x2011, ++ 0x0000, 0x080c, 0x8f18, 0x080c, 0x7e94, 0x080c, 0x7f6e, 0x012e, ++ 0x0005, 0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, ++ 0x0100, 0x2009, 0xc634, 0x2104, 0xa005, 0x1110, 0x080c, 0x2ac1, ++ 0x2009, 0x00f7, 0x080c, 0x4eeb, 0x7940, 0xa18c, 0x0010, 0x7942, ++ 0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, 0xd19c, 0x0110, 0x7827, ++ 0x0008, 0x0006, 0x0036, 0x0156, 0x7954, 0xd1ac, 0x1904, 0x134f, ++ 0x080c, 0x5f34, 0x0158, 0x080c, 0x5f48, 0x1128, 0x2001, 0xc8e5, ++ 0x2003, 0x0000, 0x0070, 0x080c, 0x5f2a, 0x0dc0, 0x2001, 0xc8e5, ++ 0x2003, 0xaaaa, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x080c, 0x5e5a, ++ 0x0058, 0x080c, 0x5f22, 0x0140, 0x2009, 0x00f8, 0x080c, 0x4eeb, ++ 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, ++ 0x1138, 0x080c, 0x5f22, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x13f9, ++ 0x1f04, 0x132e, 0x0070, 0x7824, 0x080c, 0x5f3e, 0x0118, 0xd0ac, ++ 0x1904, 0x13f9, 0xa084, 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804, ++ 0x13f9, 0x2001, 0x0001, 0x080c, 0x296d, 0x0804, 0x1408, 0x7850, ++ 0xa084, 0x0180, 0x7852, 0x782f, 0x0020, 0x20a9, 0x0046, 0x1d04, ++ 0x1357, 0x080c, 0x7058, 0x1f04, 0x1357, 0x7850, 0xa084, 0x0180, ++ 0xa085, 0x0400, 0x7852, 0x782f, 0x0000, 0x080c, 0x5f34, 0x0158, ++ 0x080c, 0x5f48, 0x1128, 0x2001, 0xc8e5, 0x2003, 0x0000, 0x0070, ++ 0x080c, 0x5f2a, 0x0dc0, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x2001, ++ 0xc8e6, 0x2003, 0x0001, 0x080c, 0x5e5a, 0x0020, 0x2009, 0x00f8, ++ 0x080c, 0x4eeb, 0x20a9, 0x000e, 0xe000, 0x1f04, 0x1384, 0x7850, ++ 0xa084, 0x0180, 0xa085, 0x1400, 0x7852, 0x080c, 0x5f22, 0x0120, ++ 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, 0x2019, 0xea60, ++ 0x7820, 0xd09c, 0x1558, 0x080c, 0x5f22, 0x05d8, 0x7824, 0xd0ac, ++ 0x1904, 0x13f9, 0x080c, 0x5f48, 0x1508, 0x0046, 0x2021, 0x0190, ++ 0x8421, 0x1df0, 0x004e, 0x8421, 0x11c8, 0x7827, 0x0048, 0x20a9, ++ 0x01f4, 0x1d04, 0x13b1, 0x080c, 0x7058, 0x1f04, 0x13b1, 0x7824, ++ 0xa084, 0x0068, 0x15c8, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x2001, ++ 0xc8e6, 0x2003, 0x0001, 0x7003, 0x0001, 0x0498, 0x1d04, 0x13ca, ++ 0x080c, 0x7058, 0x8319, 0x1960, 0x2009, 0xc634, 0x2104, 0x8000, ++ 0x200a, 0xa084, 0xfff0, 0x0120, 0x200b, 0x0000, 0x080c, 0x2ac1, ++ 0x00d8, 0x080c, 0x5f34, 0x1140, 0xa4a2, 0x0064, 0x1128, 0x080c, ++ 0x5ef9, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0xe000, 0xe000, ++ 0x7824, 0x080c, 0x5f3e, 0x0110, 0xd0ac, 0x1158, 0xa084, 0x1800, ++ 0x09a8, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x296d, ++ 0x0048, 0x2001, 0xc634, 0x2003, 0x0000, 0x7827, 0x0048, 0x7828, ++ 0xc09d, 0x782a, 0x7850, 0xa084, 0x0180, 0xa085, 0x0400, 0x7852, ++ 0x015e, 0x003e, 0x000e, 0x080c, 0x155c, 0x012e, 0x00fe, 0x004e, ++ 0x001e, 0x0005, 0x0005, 0x0005, 0x0005, 0x2a70, 0x2061, 0xc908, ++ 0x2063, 0x0002, 0x6007, 0x0002, 0x600b, 0x0005, 0x600f, 0x0037, ++ 0x2001, 0xc8e5, 0x2003, 0x0000, 0x708b, 0x0000, 0x2009, 0x0100, ++ 0x2104, 0xa082, 0x0002, 0x0218, 0x7053, 0xffff, 0x0010, 0x7053, ++ 0x0000, 0x705b, 0xffff, 0x7073, 0x0000, 0x7077, 0x0000, 0x080c, ++ 0xb03f, 0x2061, 0xc8d5, 0x6003, 0x0909, 0x6007, 0x0000, 0x600b, ++ 0x8800, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x001f, 0x601b, ++ 0x0000, 0x601f, 0x07d0, 0x2061, 0xc8dd, 0x6003, 0x8000, 0x6007, ++ 0x0000, 0x600b, 0x0000, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, ++ 0x0000, 0x601b, 0x0001, 0x601f, 0x0000, 0x2061, 0xc900, 0x6003, ++ 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001, ++ 0xc628, 0x2003, 0x0000, 0x0005, 0x04a0, 0x2011, 0x0000, 0x81ff, ++ 0x0570, 0xa186, 0x0001, 0x1148, 0x2031, 0x8fff, 0x2039, 0xe601, ++ 0x2021, 0x0100, 0x2029, 0xe600, 0x00e8, 0xa186, 0x0002, 0x1118, ++ 0x2011, 0x0000, 0x00b8, 0xa186, 0x0005, 0x1118, 0x2011, 0x0001, ++ 0x0088, 0xa186, 0x0009, 0x1118, 0x2011, 0x0002, 0x0058, 0xa186, ++ 0x000a, 0x1118, 0x2011, 0x0002, 0x0028, 0xa186, 0x0055, 0x1110, ++ 0x2011, 0x0003, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, 0x0804, ++ 0x104d, 0xa00e, 0x2011, 0x0003, 0x2019, 0x14a8, 0x0804, 0x14f9, ++ 0x2019, 0xaaaa, 0x2061, 0xffff, 0x2c14, 0x2362, 0xe000, 0xe000, ++ 0x2c04, 0xa306, 0x2262, 0x1110, 0xc1b5, 0xc1a5, 0x2011, 0x0000, ++ 0x2019, 0x14bb, 0x04f0, 0x2019, 0xaaaa, 0x2061, 0xffff, 0x2c14, ++ 0x2362, 0xe000, 0xe000, 0x2c1c, 0x2061, 0x7fff, 0xe000, 0xe000, ++ 0x2c04, 0x2061, 0xffff, 0x2262, 0xa306, 0x0110, 0xc18d, 0x0008, ++ 0xc185, 0x2011, 0x0002, 0x2019, 0x14d6, 0x0418, 0x2061, 0xffff, ++ 0x2019, 0xaaaa, 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c04, 0x2262, ++ 0xa306, 0x1180, 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c1c, 0x2061, ++ 0x7fff, 0x2c04, 0x2061, 0xffff, 0x2262, 0xa306, 0x1110, 0xc195, ++ 0x0008, 0xc19d, 0x2011, 0x0001, 0x2019, 0x14f7, 0x0010, 0x0804, ++ 0x146d, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, 0x0837, 0x2011, ++ 0x0000, 0x080c, 0x533d, 0x1178, 0x6004, 0xa0c4, 0x00ff, 0xa8c6, ++ 0x0006, 0x0128, 0xa0c4, 0xff00, 0xa8c6, 0x0600, 0x1120, 0xa186, ++ 0x0080, 0x0108, 0x8210, 0x8108, 0xa186, 0x0100, 0x1d50, 0x2208, ++ 0x0005, 0x2091, 0x8000, 0x0e04, 0x151b, 0x0006, 0x0016, 0x2079, ++ 0x0000, 0x7818, 0xd084, 0x1de8, 0x001e, 0x792e, 0x000e, 0x782a, ++ 0x000e, 0x7826, 0x3900, 0x783a, 0x7823, 0x8002, 0x781b, 0x0001, ++ 0x2091, 0x5000, 0x0126, 0x0156, 0x0146, 0x20a9, 0x0010, 0x20a1, ++ 0xca54, 0x2091, 0x2000, 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2200, ++ 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2400, 0x40a1, 0x20a9, 0x0010, ++ 0x2091, 0x2600, 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2800, 0x40a1, ++ 0x014e, 0x015e, 0x012e, 0x2079, 0xc600, 0x7803, 0x0005, 0x2091, ++ 0x4080, 0x04c9, 0x0cf8, 0x0005, 0x0006, 0x080c, 0x15a7, 0x1518, ++ 0x00f6, 0x2079, 0xc624, 0x2f04, 0x8000, 0x207a, 0xa082, 0x000f, ++ 0x0258, 0xa006, 0x207a, 0x2079, 0xc626, 0x2f04, 0xa084, 0x0001, ++ 0xa086, 0x0001, 0x207a, 0x0070, 0x2079, 0xc626, 0x2f7c, 0x8fff, ++ 0x1128, 0x2001, 0x0c03, 0x2003, 0x0040, 0x0020, 0x2001, 0x0c03, ++ 0x2003, 0x00c0, 0x00fe, 0x000e, 0x0005, 0x0409, 0x1120, 0x2001, ++ 0x0c03, 0x2003, 0x0080, 0x0005, 0x00d1, 0x1120, 0x2001, 0x0c03, ++ 0x2003, 0x0040, 0x0005, 0x0006, 0x0091, 0x1178, 0x2001, 0x0c03, ++ 0x2003, 0x0040, 0x2009, 0x0fff, 0x00a1, 0x2001, 0x0c03, 0x2003, ++ 0x0080, 0x2009, 0x0fff, 0x0069, 0x0c88, 0x000e, 0x0005, 0x00c6, ++ 0x2061, 0x0c00, 0x2c04, 0xa084, 0x00ff, 0xa086, 0x00aa, 0x00ce, ++ 0x0005, 0x0156, 0x0126, 0xa18c, 0x0fff, 0x21a8, 0x1d04, 0x15b6, ++ 0x2091, 0x6000, 0x1f04, 0x15b6, 0x012e, 0x015e, 0x0005, 0x2071, ++ 0xc600, 0x7160, 0x712e, 0x2021, 0x0001, 0xa190, 0x0030, 0xa298, ++ 0x0030, 0x0240, 0x7064, 0xa302, 0x1228, 0x220a, 0x2208, 0x2310, ++ 0x8420, 0x0ca8, 0x3800, 0xd08c, 0x0148, 0x7064, 0xa086, 0xc600, ++ 0x0128, 0x7067, 0xc600, 0x2011, 0x1000, 0x0c48, 0x200b, 0x0000, ++ 0x74b2, 0x74b6, 0x70eb, 0x0010, 0x0005, 0x00e6, 0x0126, 0x2091, ++ 0x8000, 0x2071, 0xc600, 0x70b4, 0x0016, 0x2008, 0x70e8, 0xa16a, ++ 0x2100, 0x001e, 0x0268, 0x8001, 0x70b6, 0x702c, 0x2068, 0x2d04, ++ 0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x012e, 0x00ee, 0x0005, ++ 0xa06e, 0x0cd8, 0x00e6, 0x2071, 0xc600, 0x0126, 0x2091, 0x8000, ++ 0x70b4, 0x8001, 0x0260, 0x70b6, 0x702c, 0x2068, 0x2d04, 0x702e, ++ 0x206b, 0x0000, 0x6807, 0x0000, 0x012e, 0x00ee, 0x0005, 0xa06e, ++ 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0xc600, 0x702c, ++ 0x206a, 0x2d00, 0x702e, 0x70b4, 0x8000, 0x70b6, 0x012e, 0x00ee, ++ 0x0005, 0x8dff, 0x0138, 0x6804, 0x6807, 0x0000, 0x0006, 0x0c49, ++ 0x00de, 0x0cb8, 0x0005, 0x00e6, 0x2071, 0xc600, 0x70b4, 0xa08a, ++ 0x0010, 0xa00d, 0x00ee, 0x0005, 0x00e6, 0x2071, 0xc959, 0x7007, ++ 0x0000, 0x701b, 0x0000, 0x701f, 0x0000, 0x2071, 0x0000, 0x7010, ++ 0xa085, 0x8004, 0x7012, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0x00e6, 0x2270, 0x700b, 0x0000, 0x2071, 0xc959, 0x7018, 0xa088, ++ 0xc962, 0x220a, 0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005, ++ 0x1128, 0x00f6, 0x2079, 0x0010, 0x0089, 0x00fe, 0x00ee, 0x012e, ++ 0x0005, 0x00e6, 0x2071, 0xc959, 0x7004, 0xa005, 0x1128, 0x00f6, ++ 0x2079, 0x0010, 0x0019, 0x00fe, 0x00ee, 0x0005, 0x7000, 0x0002, ++ 0x1680, 0x16e4, 0x1701, 0x1701, 0x23e7, 0x16e4, 0x1701, 0x16e4, ++ 0x7018, 0x711c, 0xa106, 0x1118, 0x7007, 0x0000, 0x0005, 0x00d6, ++ 0xa180, 0xc962, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007, ++ 0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c, ++ 0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804, ++ 0x00de, 0xd084, 0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, ++ 0x0002, 0x00b1, 0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, ++ 0xa182, 0x0040, 0x1210, 0x2110, 0xa006, 0x700e, 0x7212, 0x8203, ++ 0x7822, 0x7803, 0x0020, 0x7803, 0x0041, 0x002e, 0x001e, 0x0005, ++ 0x0016, 0x0026, 0x0136, 0x0146, 0x0156, 0x7014, 0x2098, 0x20a1, ++ 0x0014, 0x7803, 0x0026, 0x710c, 0x2011, 0x0040, 0xa182, 0x0040, ++ 0x1210, 0x2110, 0xa006, 0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, ++ 0x7803, 0x0020, 0x3300, 0x7016, 0x7803, 0x0001, 0x015e, 0x014e, ++ 0x013e, 0x002e, 0x001e, 0x0005, 0x0136, 0x0146, 0x0156, 0x2099, ++ 0xc71a, 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, ++ 0x0126, 0x2091, 0x8000, 0x7803, 0x0041, 0x7007, 0x0003, 0x7000, ++ 0xc084, 0x7002, 0x700b, 0xc715, 0x012e, 0x015e, 0x014e, 0x013e, ++ 0x0005, 0x0136, 0x0146, 0x0156, 0x2001, 0xc749, 0x209c, 0x20a1, ++ 0x0014, 0x7803, 0x0026, 0x2001, 0xc74a, 0x20ac, 0x53a6, 0x2099, ++ 0xc74b, 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, ++ 0x0126, 0x2091, 0x8000, 0x7803, 0x0001, 0x7007, 0x0004, 0x7000, ++ 0xc08c, 0x7002, 0x700b, 0xc746, 0x012e, 0x015e, 0x014e, 0x013e, ++ 0x0005, 0x0016, 0x00e6, 0x2071, 0xc959, 0x00f6, 0x2079, 0x0010, ++ 0x7904, 0x7803, 0x0002, 0xd1fc, 0x0120, 0xa18c, 0x0700, 0x7004, ++ 0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x1676, 0x1745, 0x1773, ++ 0x179d, 0x17cd, 0x2404, 0x1744, 0x0cf8, 0xa18c, 0x0700, 0x1528, ++ 0x0136, 0x0146, 0x0156, 0x7014, 0x20a0, 0x2099, 0x0014, 0x7803, ++ 0x0040, 0x7010, 0x20a8, 0x53a5, 0x3400, 0x7016, 0x015e, 0x014e, ++ 0x013e, 0x700c, 0xa005, 0x0570, 0x7830, 0x7832, 0x7834, 0x7836, ++ 0x080c, 0x16ab, 0x0005, 0x7008, 0xa080, 0x0002, 0x2003, 0x0100, ++ 0x7007, 0x0000, 0x080c, 0x1676, 0x0005, 0x7008, 0xa080, 0x0002, ++ 0x2003, 0x0200, 0x0ca8, 0xa18c, 0x0700, 0x1150, 0x700c, 0xa005, ++ 0x0188, 0x7830, 0x7832, 0x7834, 0x7836, 0x080c, 0x16c0, 0x0005, ++ 0x7008, 0xa080, 0x0002, 0x2003, 0x0200, 0x7007, 0x0000, 0x080c, ++ 0x1676, 0x0005, 0x00d6, 0x7008, 0x2068, 0x7830, 0x6826, 0x7834, ++ 0x682a, 0x7838, 0x682e, 0x783c, 0x6832, 0x680b, 0x0100, 0x00de, ++ 0x7007, 0x0000, 0x080c, 0x1676, 0x0005, 0xa18c, 0x0700, 0x1540, ++ 0x0136, 0x0146, 0x0156, 0x2001, 0xc718, 0x2004, 0xa080, 0x000d, ++ 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020, 0x53a5, ++ 0x2001, 0xc71a, 0x2004, 0xd0bc, 0x0148, 0x2001, 0xc723, 0x2004, ++ 0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5, 0x015e, 0x014e, ++ 0x013e, 0x7007, 0x0000, 0x080c, 0x62c2, 0x080c, 0x1676, 0x0005, ++ 0x2011, 0x8003, 0x080c, 0x407d, 0x0cf8, 0xa18c, 0x0700, 0x1148, ++ 0x2001, 0xc748, 0x2003, 0x0100, 0x7007, 0x0000, 0x080c, 0x1676, ++ 0x0005, 0x2011, 0x8004, 0x080c, 0x407d, 0x0cf8, 0x0126, 0x2091, ++ 0x2200, 0x2079, 0x0030, 0x2071, 0xc96a, 0x7003, 0x0000, 0x700f, ++ 0xc977, 0x7013, 0xc977, 0x780f, 0x00f6, 0x7803, 0x0004, 0x012e, ++ 0x0005, 0x6934, 0xa184, 0x0007, 0x0002, 0x17fd, 0x183e, 0x17fd, ++ 0x17fd, 0x1801, 0x1826, 0x180d, 0x1804, 0xa085, 0x0001, 0x0804, ++ 0x1858, 0x080c, 0x7684, 0x05d0, 0x684c, 0xd0bc, 0x0db0, 0x6860, ++ 0x682e, 0x685c, 0x682a, 0x6858, 0x04c8, 0xa18c, 0x00ff, 0xa186, ++ 0x001e, 0x1d58, 0x684c, 0xd0bc, 0x0d40, 0x6860, 0x682e, 0x685c, ++ 0x682a, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, ++ 0xa080, 0x23c7, 0x2005, 0x6832, 0x6858, 0x0440, 0xa18c, 0x00ff, ++ 0xa186, 0x0015, 0x1990, 0x684c, 0xd0ac, 0x0978, 0x6804, 0x681a, ++ 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x23c7, 0x2005, ++ 0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0080, 0x684c, 0xd0ac, ++ 0x0904, 0x17fd, 0xa006, 0x682e, 0x682a, 0x6858, 0xa18c, 0x000f, ++ 0xa188, 0x23c7, 0x210d, 0x6932, 0x2d08, 0x691a, 0x6826, 0x684c, ++ 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, ++ 0x0005, 0x684c, 0xd0ac, 0x090c, 0x1519, 0x6833, 0x23c4, 0x2d08, ++ 0x691a, 0x6858, 0x8001, 0x6826, 0x684c, 0xc0dd, 0x684e, 0xa006, ++ 0x680a, 0x682e, 0x682a, 0x697c, 0x6912, 0x6980, 0x6916, 0x0005, ++ 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004, 0x82ff, ++ 0x01e8, 0xa280, 0x0004, 0x00d6, 0x206c, 0x684c, 0xd0dc, 0x1190, ++ 0xa280, 0x0007, 0x2004, 0xa086, 0x000a, 0x1110, 0x0891, 0x0010, ++ 0x080c, 0x17f1, 0x0138, 0x00de, 0xa280, 0x0000, 0x2003, 0x0002, ++ 0xa016, 0x0020, 0x6808, 0x8000, 0x680a, 0x00de, 0x0126, 0x0046, ++ 0x0036, 0x0026, 0x2091, 0x2200, 0x002e, 0x003e, 0x004e, 0x7000, ++ 0xa005, 0x0178, 0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, ++ 0x8108, 0xa182, 0xc992, 0x0210, 0x2009, 0xc977, 0x710e, 0x012e, ++ 0x0005, 0x7206, 0x2001, 0x18af, 0x0006, 0x2260, 0x0804, 0x19d3, ++ 0x0126, 0x0026, 0x0036, 0x00c6, 0x0006, 0x2091, 0x2200, 0x000e, ++ 0x004e, 0x003e, 0x002e, 0x00d6, 0x00c6, 0x2460, 0x6110, 0x2168, ++ 0x6a62, 0x6b5e, 0xa005, 0x0904, 0x1910, 0x6808, 0xa005, 0x0904, ++ 0x1947, 0x7000, 0xa005, 0x1108, 0x0488, 0x700c, 0x7110, 0xa106, ++ 0x1904, 0x194f, 0x7004, 0xa406, 0x1548, 0x2001, 0x0005, 0x2004, ++ 0xd08c, 0x0168, 0x0046, 0x080c, 0x1b83, 0x004e, 0x2460, 0x6010, ++ 0xa080, 0x0002, 0x2004, 0xa005, 0x0904, 0x1947, 0x0c10, 0x2001, ++ 0x0207, 0x2004, 0xd09c, 0x1d48, 0x7804, 0xa084, 0x6000, 0x0120, ++ 0xa086, 0x6000, 0x0108, 0x0c08, 0x7818, 0x6812, 0x781c, 0x6816, ++ 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x6100, 0xa18e, ++ 0x0004, 0x1904, 0x194f, 0x2009, 0x0048, 0x080c, 0x9613, 0x04f8, ++ 0x6808, 0xa005, 0x05a0, 0x7000, 0xa005, 0x0588, 0x700c, 0x7110, ++ 0xa106, 0x1118, 0x7004, 0xa406, 0x1550, 0x2001, 0x0005, 0x2004, ++ 0xd08c, 0x0160, 0x0046, 0x080c, 0x1b83, 0x004e, 0x2460, 0x6010, ++ 0xa080, 0x0002, 0x2004, 0xa005, 0x01d0, 0x0c28, 0x2001, 0x0207, ++ 0x2004, 0xd09c, 0x1d50, 0x2001, 0x0005, 0x2004, 0xd08c, 0x1d50, ++ 0x7804, 0xa084, 0x6000, 0x0118, 0xa086, 0x6000, 0x19f0, 0x7818, ++ 0x6812, 0x781c, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000, 0x6100, ++ 0xa18e, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0x9613, 0x00ce, ++ 0x00de, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x0026, 0x0036, 0x0046, ++ 0x0056, 0x2071, 0xc96a, 0x7000, 0xa086, 0x0000, 0x0904, 0x19b9, ++ 0x7004, 0xac06, 0x1904, 0x19ab, 0x2079, 0x0030, 0x7000, 0xa086, ++ 0x0003, 0x0904, 0x19ab, 0x7804, 0xd0fc, 0x15c8, 0x20e1, 0x6000, ++ 0x2011, 0x0032, 0x2001, 0x0208, 0x200c, 0x2001, 0x0209, 0x2004, ++ 0xa106, 0x1d88, 0x8211, 0x1db0, 0x7804, 0xd0fc, 0x1540, 0x080c, ++ 0x1f2d, 0x0026, 0x0056, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x1de8, ++ 0x7803, 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, 0x7007, 0x0000, ++ 0x005e, 0x002e, 0x2001, 0x015d, 0x2003, 0x0000, 0x080c, 0x5f22, ++ 0x1138, 0x0066, 0x2031, 0x0001, 0x080c, 0x5fa4, 0x006e, 0x0058, ++ 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0020, 0x080c, ++ 0x1b83, 0x0804, 0x195b, 0x0156, 0x20a9, 0x0009, 0x2009, 0xc977, ++ 0x2104, 0xac06, 0x1108, 0x200a, 0xa188, 0x0003, 0x1f04, 0x19b0, ++ 0x015e, 0x005e, 0x004e, 0x003e, 0x002e, 0x00ee, 0x00fe, 0x0005, ++ 0x700c, 0x7110, 0xa106, 0x0904, 0x1a5c, 0x2104, 0x7006, 0x2060, ++ 0x8108, 0x211c, 0x8108, 0x2124, 0x8108, 0xa182, 0xc992, 0x0210, ++ 0x2009, 0xc977, 0x7112, 0x8cff, 0x05e8, 0x6010, 0x2068, 0x2d58, ++ 0x080c, 0x7824, 0x6828, 0xa406, 0x15e0, 0x682c, 0xa306, 0x15c8, ++ 0x7004, 0x2060, 0x6020, 0xc0d4, 0x6022, 0x684c, 0xd0f4, 0x0128, ++ 0x6817, 0xffff, 0x6813, 0xffff, 0x0428, 0x6850, 0xd0f4, 0x1130, ++ 0x7803, 0x0004, 0x6810, 0x781a, 0x6814, 0x781e, 0x6824, 0x2050, ++ 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, 0x080c, ++ 0x7684, 0x1128, 0x2009, 0x0011, 0x080c, 0x1a5f, 0x0048, 0x2009, ++ 0x0011, 0x080c, 0x1a5f, 0x0120, 0x2009, 0x0001, 0x080c, 0x1a5f, ++ 0x2d58, 0x0005, 0x7803, 0x0004, 0x080c, 0x1ea2, 0x0904, 0x19c0, ++ 0x0cc0, 0x080c, 0x7684, 0x1128, 0x080c, 0x1953, 0x080c, 0x761a, ++ 0x0c88, 0x6020, 0xd0f4, 0x11e0, 0xd0d4, 0x01b8, 0x6038, 0xa402, ++ 0x6034, 0xa303, 0x0108, 0x1288, 0x643a, 0x6336, 0x6c2a, 0x6b2e, ++ 0x0046, 0x0036, 0x2400, 0x6c7c, 0xa402, 0x6812, 0x2300, 0x6b80, ++ 0xa303, 0x6816, 0x003e, 0x004e, 0x0018, 0x080c, 0xafd1, 0x0990, ++ 0x601c, 0xa08e, 0x0008, 0x0904, 0x19e0, 0xa08e, 0x000a, 0x0904, ++ 0x19e0, 0x2001, 0xc674, 0x2004, 0xd0b4, 0x1140, 0x6018, 0x2004, ++ 0xd0bc, 0x1120, 0x6817, 0x7fff, 0x6813, 0xffff, 0x080c, 0x241b, ++ 0x1904, 0x1a12, 0x0804, 0x19e0, 0x7003, 0x0000, 0x0005, 0x8aff, ++ 0x0904, 0x1b5d, 0xa03e, 0x2730, 0xc9fc, 0x6850, 0xd0fc, 0x11b8, ++ 0xd0f4, 0x1538, 0x00d6, 0x2805, 0xac68, 0x2900, 0x0002, 0x1acb, ++ 0x1a98, 0x1a98, 0x1acb, 0x1ace, 0x1ac3, 0x1acb, 0x1a98, 0x1acb, ++ 0x1aa9, 0x1aa9, 0x1acb, 0x1ace, 0x1acb, 0x1abb, 0x1aa9, 0x7803, ++ 0x0004, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0x00d6, ++ 0xd99c, 0x0904, 0x1b1e, 0x2805, 0xac68, 0x6f08, 0x6e0c, 0x0804, ++ 0x1b1f, 0xc0f4, 0x6852, 0x6b6c, 0x6a70, 0x00d6, 0x0804, 0x1b2c, ++ 0x2d10, 0x00de, 0x00d6, 0x6834, 0x2268, 0xa084, 0x00ff, 0xa096, ++ 0x0024, 0x0904, 0x1afe, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0804, ++ 0x1b1e, 0x2d10, 0x00de, 0x00d6, 0x6834, 0x2268, 0xa084, 0x00ff, ++ 0xa096, 0x002c, 0x0540, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, ++ 0x6e0c, 0x0804, 0x1b1f, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff, ++ 0xa086, 0x001e, 0x1140, 0x00de, 0x080c, 0x2389, 0x1904, 0x1a5f, ++ 0xa00e, 0x0804, 0x1b5d, 0x00de, 0x080c, 0x1519, 0x2d10, 0x00de, ++ 0x00d6, 0x6834, 0x2268, 0xa084, 0x00ff, 0xa096, 0x0024, 0x0530, ++ 0xa096, 0x002c, 0x1d80, 0x6b10, 0xa3a6, 0xffff, 0x1130, 0x2d10, ++ 0x00de, 0x00d6, 0x080c, 0x72fa, 0x2268, 0x2d10, 0x00de, 0x00d6, ++ 0x7314, 0x685c, 0xa086, 0x0001, 0x1120, 0x6868, 0xa005, 0x0108, ++ 0x2018, 0x2268, 0x2011, 0x0000, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, ++ 0x780f, 0x00f0, 0xe000, 0xe000, 0xe000, 0x0408, 0x6b08, 0xa3a6, ++ 0xffff, 0x1130, 0x2d10, 0x00de, 0x00d6, 0x080c, 0x72fa, 0x2268, ++ 0x2d10, 0x00de, 0x00d6, 0x7314, 0x685c, 0xa086, 0x0001, 0x1120, ++ 0x6868, 0xa005, 0x0108, 0x2018, 0x2268, 0x2011, 0x0000, 0x6d00, ++ 0x6c04, 0x780f, 0x00f0, 0xe000, 0xe000, 0xe000, 0xc9fd, 0x7b22, ++ 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x731a, 0x721e, 0x7522, ++ 0x7426, 0x772a, 0x762e, 0x7902, 0x7100, 0x8108, 0x7102, 0x00de, ++ 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x8109, 0x2d08, ++ 0x1500, 0xd9fc, 0x0160, 0xc9fc, 0x080c, 0x2389, 0x01e8, 0x2805, ++ 0xac68, 0x6800, 0xa506, 0x11c0, 0x6804, 0xa406, 0x00a8, 0xc9fc, ++ 0x080c, 0x2389, 0x0188, 0x2805, 0xac68, 0x6800, 0xa506, 0x1160, ++ 0x6804, 0xa406, 0x1148, 0x6808, 0xa706, 0x1130, 0x680c, 0xa606, ++ 0x0018, 0xc9fc, 0x080c, 0x2389, 0x2168, 0x0005, 0x080c, 0x1519, ++ 0x080c, 0x2014, 0x7004, 0x2060, 0x00d6, 0x6010, 0x2068, 0x7003, ++ 0x0000, 0x080c, 0x1ec3, 0x080c, 0xac91, 0x0170, 0x6808, 0x8001, ++ 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x682b, 0xffff, 0x682f, ++ 0xffff, 0x6850, 0xc0bd, 0x6852, 0x00de, 0x080c, 0xa961, 0x0804, ++ 0x1dec, 0x080c, 0x1519, 0x0126, 0x2091, 0x2200, 0x0006, 0x0016, ++ 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, ++ 0x1978, 0xa184, 0x0003, 0xa086, 0x0003, 0x0d58, 0x7000, 0x0002, ++ 0x1ba0, 0x1ba6, 0x1cf5, 0x1dc1, 0x1ddb, 0x1ba0, 0x1ba0, 0x1ba0, ++ 0x7804, 0xd09c, 0x1904, 0x1dec, 0x080c, 0x1519, 0x8001, 0x7002, ++ 0xd1bc, 0x15c0, 0x080c, 0x7684, 0x1508, 0xd1dc, 0x1598, 0x6864, ++ 0x8000, 0x6866, 0xd19c, 0x0140, 0x7004, 0x2060, 0x2009, 0x0102, ++ 0x080c, 0x9613, 0x0804, 0x1cbc, 0x8aff, 0x0130, 0x2009, 0x0001, ++ 0x080c, 0x1a5f, 0x0804, 0x1dec, 0x7004, 0x2060, 0x080c, 0x24e0, ++ 0x080c, 0x761a, 0x7007, 0x0000, 0x0804, 0x1c45, 0xd19c, 0x1904, ++ 0x1c79, 0xd1dc, 0x1178, 0x8aff, 0x0904, 0x1c79, 0x2009, 0x0001, ++ 0x080c, 0x1a5f, 0x0904, 0x1dec, 0x2009, 0x0001, 0x080c, 0x1a5f, ++ 0x0804, 0x1dec, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x1904, ++ 0x1c4b, 0x080c, 0x7684, 0x1130, 0xd19c, 0x0120, 0x6864, 0x8000, ++ 0x6866, 0x0810, 0x0026, 0x0036, 0x7c20, 0x7d24, 0x7e30, 0x7f34, ++ 0x7818, 0x6812, 0x781c, 0x6816, 0x2001, 0x0201, 0x2004, 0xa005, ++ 0x0140, 0x7808, 0xd0ec, 0x1128, 0x7803, 0x0009, 0x7003, 0x0004, ++ 0x0028, 0x080c, 0x7684, 0x0110, 0x080c, 0x1df0, 0x6b28, 0x6a2c, ++ 0x2400, 0x686e, 0xa31a, 0x2500, 0x6872, 0xa213, 0x6b2a, 0x6a2e, ++ 0x00c6, 0x7004, 0x2060, 0x6020, 0xd0f4, 0x1110, 0x633a, 0x6236, ++ 0x00ce, 0x003e, 0x002e, 0x6e1e, 0x6f22, 0x2500, 0xa405, 0x0128, ++ 0x080c, 0x239f, 0x6850, 0xc0fd, 0x6852, 0x2a00, 0x6826, 0x2c00, ++ 0x681a, 0x2800, 0x6832, 0x6808, 0x8001, 0x680a, 0x1148, 0x684c, ++ 0xd0e4, 0x0130, 0x7004, 0x2060, 0x2009, 0x0048, 0x080c, 0x9613, ++ 0x7000, 0xa086, 0x0004, 0x0904, 0x1dec, 0x7003, 0x0000, 0x080c, ++ 0x19c0, 0x0804, 0x1dec, 0x0056, 0x7d0c, 0xd5bc, 0x1110, 0x080c, ++ 0xc55e, 0x005e, 0x080c, 0x1ec3, 0x7004, 0x2060, 0x601c, 0xa086, ++ 0x0009, 0x1140, 0x2009, 0x0106, 0x080c, 0x9613, 0x7007, 0x0000, ++ 0x0804, 0x1dec, 0x00f6, 0x7004, 0x2078, 0x080c, 0x56c3, 0x0118, ++ 0x7820, 0xc0f5, 0x7822, 0x00fe, 0x682b, 0xffff, 0x682f, 0xffff, ++ 0x6808, 0x8001, 0x680a, 0x697c, 0x791a, 0x6980, 0x791e, 0x0804, ++ 0x1dec, 0x7004, 0x00c6, 0x2060, 0x6020, 0x00ce, 0xd0f4, 0x0120, ++ 0x6808, 0x8001, 0x680a, 0x04c0, 0x7818, 0x6812, 0x7a1c, 0x6a16, ++ 0xd19c, 0x0160, 0xa205, 0x0150, 0x7004, 0xa080, 0x0007, 0x2004, ++ 0xa084, 0xfffd, 0xa086, 0x0008, 0x1904, 0x1be2, 0x684c, 0xc0f5, ++ 0x684e, 0x7814, 0xa005, 0x1520, 0x7003, 0x0000, 0x6808, 0x8001, ++ 0x680a, 0x01a0, 0x7004, 0x2060, 0x601c, 0xa086, 0x000a, 0x11a0, ++ 0x0156, 0x20a9, 0x0009, 0x2009, 0xc977, 0x2104, 0xac06, 0x1108, ++ 0x200a, 0xa188, 0x0003, 0x1f04, 0x1cad, 0x015e, 0x7004, 0x2060, ++ 0x2009, 0x0048, 0x080c, 0x9613, 0x080c, 0x19c0, 0x0804, 0x1dec, ++ 0x7818, 0x6812, 0x781c, 0x6816, 0x7814, 0x7908, 0xa18c, 0x0fff, ++ 0xa192, 0x0841, 0x1a04, 0x1b60, 0xa188, 0x0007, 0x8114, 0x8214, ++ 0x8214, 0xa10a, 0x8104, 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, ++ 0x810b, 0x080c, 0x1f58, 0x7803, 0x0004, 0x780f, 0xffff, 0x7803, ++ 0x0001, 0x7804, 0xd0fc, 0x0de8, 0x7803, 0x0002, 0x7803, 0x0004, ++ 0x780f, 0x00f6, 0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048, ++ 0x080c, 0x9613, 0x080c, 0x1fae, 0x0838, 0x8001, 0x7002, 0xd194, ++ 0x01b0, 0x7804, 0xd0fc, 0x1904, 0x1d91, 0xd09c, 0x0138, 0x7804, ++ 0xd0fc, 0x1904, 0x1d91, 0xd09c, 0x1904, 0x1d95, 0x8aff, 0x0904, ++ 0x1dec, 0x2009, 0x0001, 0x080c, 0x1a5f, 0x0804, 0x1dec, 0xa184, ++ 0x0888, 0x1148, 0x8aff, 0x0904, 0x1dec, 0x2009, 0x0001, 0x080c, ++ 0x1a5f, 0x0804, 0x1dec, 0x7818, 0x6812, 0x7a1c, 0x6a16, 0xa205, ++ 0x0904, 0x1c96, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x1904, ++ 0x1d73, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0029, 0x1118, 0xd19c, ++ 0x1904, 0x1c96, 0x0026, 0x0036, 0x7c20, 0x7d24, 0x7e30, 0x7f34, ++ 0x7818, 0x6812, 0x781c, 0x6816, 0x2001, 0x0201, 0x2004, 0xa005, ++ 0x0140, 0x7808, 0xd0ec, 0x1128, 0x7803, 0x0009, 0x7003, 0x0004, ++ 0x0020, 0x0016, 0x080c, 0x1df0, 0x001e, 0x6b28, 0x6a2c, 0x080c, ++ 0x239f, 0x00d6, 0x2805, 0xac68, 0x6034, 0xd09c, 0x1128, 0x6808, ++ 0xa31a, 0x680c, 0xa213, 0x0020, 0x6810, 0xa31a, 0x6814, 0xa213, ++ 0x00de, 0xd194, 0x0904, 0x1c10, 0x2a00, 0x6826, 0x2c00, 0x681a, ++ 0x2800, 0x6832, 0x6808, 0x8001, 0x680a, 0x6b2a, 0x6a2e, 0x003e, ++ 0x002e, 0x0804, 0x1cbc, 0x0056, 0x7d0c, 0x080c, 0xc55e, 0x005e, ++ 0x080c, 0x1ec3, 0x00f6, 0x7004, 0x2078, 0x080c, 0x56c3, 0x0118, ++ 0x7820, 0xc0f5, 0x7822, 0x00fe, 0x682b, 0xffff, 0x682f, 0xffff, ++ 0x6808, 0x8001, 0x680a, 0x697c, 0x791a, 0x6980, 0x791e, 0x0804, ++ 0x1dec, 0x7804, 0xd09c, 0x0904, 0x1b8b, 0x7c20, 0x7824, 0xa405, ++ 0x1904, 0x1b8b, 0x7818, 0x6812, 0x7c1c, 0x6c16, 0xa405, 0x1120, ++ 0x7803, 0x0002, 0x0804, 0x1c96, 0x7520, 0x7424, 0x7728, 0x762c, ++ 0x7018, 0xa528, 0x701c, 0xa421, 0xa7b9, 0x0000, 0xa6b1, 0x0000, ++ 0x7830, 0xa506, 0x1150, 0x7834, 0xa406, 0x1138, 0x7838, 0xa706, ++ 0x1120, 0x783c, 0xa606, 0x0904, 0x1b8b, 0x7803, 0x0002, 0x0804, ++ 0x1d22, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0xa00d, 0x0180, ++ 0x6808, 0x8001, 0x680a, 0x1160, 0x7004, 0x2060, 0x2009, 0x0048, ++ 0x601c, 0xa086, 0x0009, 0x1110, 0x080c, 0x1519, 0x080c, 0x9613, ++ 0x080c, 0x19c0, 0x0088, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, ++ 0x2060, 0x6010, 0xa005, 0x0da0, 0x2068, 0x6808, 0x8000, 0x680a, ++ 0x6c28, 0x6b2c, 0x080c, 0x19d3, 0x001e, 0x000e, 0x012e, 0x0005, ++ 0x700c, 0x7110, 0xa106, 0x0904, 0x1e96, 0x7004, 0x0016, 0x210c, ++ 0xa106, 0x001e, 0x0904, 0x1e96, 0x00d6, 0x00c6, 0x216c, 0x2d00, ++ 0xa005, 0x0904, 0x1e94, 0x681c, 0xa086, 0x0008, 0x0904, 0x1e94, ++ 0x6820, 0xd0d4, 0x1904, 0x1e94, 0x6810, 0x2068, 0x080c, 0x7684, ++ 0x0904, 0x1e94, 0x6850, 0xd0fc, 0x05a8, 0x8108, 0x2104, 0x6b2c, ++ 0xa306, 0x1904, 0x1e94, 0x8108, 0x2104, 0x6a28, 0xa206, 0x1904, ++ 0x1e94, 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c, 0x7822, 0x701a, ++ 0x6870, 0x7826, 0x701e, 0x681c, 0x7832, 0x7022, 0x6820, 0x7836, ++ 0x7026, 0x6818, 0x2060, 0x6034, 0xd09c, 0x0168, 0x6830, 0x2005, ++ 0x00d6, 0xac68, 0x6808, 0x783a, 0x702a, 0x680c, 0x783e, 0x702e, ++ 0x00de, 0x0804, 0x1e8e, 0xa006, 0x783a, 0x783e, 0x702a, 0x702e, ++ 0x0804, 0x1e8e, 0x8108, 0x2104, 0xa005, 0x1904, 0x1e94, 0x6b2c, ++ 0xa306, 0x1904, 0x1e94, 0x8108, 0x2104, 0xa005, 0x15e8, 0x6a28, ++ 0xa206, 0x15d0, 0x6850, 0xc0f5, 0x6852, 0x6830, 0x2005, 0x6918, ++ 0xa160, 0xa180, 0x000d, 0x2004, 0xd09c, 0x11a0, 0x6008, 0x7822, ++ 0x701a, 0x686e, 0x600c, 0x7826, 0x701e, 0x6872, 0x6000, 0x7832, ++ 0x7022, 0x6004, 0x7836, 0x7026, 0xa006, 0x783a, 0x783e, 0x702a, ++ 0x702e, 0x00a0, 0x6010, 0x7822, 0x701a, 0x686e, 0x6014, 0x7826, ++ 0x701e, 0x6872, 0x6000, 0x7832, 0x7022, 0x6004, 0x7836, 0x7026, ++ 0x6008, 0x783a, 0x702a, 0x600c, 0x783e, 0x702e, 0x6810, 0x781a, ++ 0x6814, 0x781e, 0x7803, 0x0011, 0x00ce, 0x00de, 0x0005, 0x2011, ++ 0x0201, 0x2009, 0x003c, 0x2204, 0xa005, 0x1118, 0x8109, 0x1dd8, ++ 0x0005, 0x0005, 0x0ca1, 0x0118, 0x780c, 0xd0a4, 0x0120, 0x00d9, ++ 0xa085, 0x0001, 0x0010, 0x080c, 0x1fae, 0x0005, 0x0126, 0x2091, ++ 0x2200, 0x7000, 0xa086, 0x0003, 0x1160, 0x700c, 0x7110, 0xa106, ++ 0x0140, 0x080c, 0x2b06, 0x20e1, 0x9028, 0x700f, 0xc977, 0x7013, ++ 0xc977, 0x012e, 0x0005, 0x00c6, 0x080c, 0x5f22, 0x11b8, 0x2001, ++ 0x0160, 0x2003, 0x0000, 0x2001, 0x0138, 0x2003, 0x0000, 0x2011, ++ 0x00c8, 0xe000, 0xe000, 0x8211, 0x1de0, 0x0481, 0x0066, 0x2031, ++ 0x0000, 0x080c, 0x5fa4, 0x006e, 0x00ce, 0x0005, 0x080c, 0x1f2d, ++ 0x080c, 0x2b06, 0x20e1, 0x9028, 0x700c, 0x7110, 0xa106, 0x0190, ++ 0x2104, 0xa005, 0x0130, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001, ++ 0x600a, 0xa188, 0x0003, 0xa182, 0xc992, 0x0210, 0x2009, 0xc977, ++ 0x7112, 0x0c50, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0160, ++ 0x2502, 0x2001, 0x0138, 0x2202, 0x00ce, 0x0005, 0x080c, 0x2b06, ++ 0x20e1, 0x9028, 0x2001, 0x015d, 0x2003, 0x0000, 0x00e6, 0x00c6, ++ 0x0016, 0x2071, 0xc96a, 0x700c, 0x7110, 0xa106, 0x0190, 0x2104, ++ 0xa005, 0x0130, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001, 0x600a, ++ 0xa188, 0x0003, 0xa182, 0xc992, 0x0210, 0x2009, 0xc977, 0x7112, ++ 0x0c50, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x2001, 0x0138, 0x2014, ++ 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000, 0x080c, ++ 0x5f22, 0x1148, 0x2021, 0x0002, 0x1d04, 0x1f3c, 0x2091, 0x6000, ++ 0x8421, 0x1dd0, 0x0005, 0x2021, 0xb015, 0x2001, 0x0141, 0x201c, ++ 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0xa39c, 0x0048, 0x1138, ++ 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421, 0x1d70, 0x0005, ++ 0x00e6, 0x2071, 0x0200, 0x7808, 0xa084, 0xf000, 0xa10d, 0x0869, ++ 0x2001, 0x0105, 0x2004, 0xa084, 0x0003, 0x1130, 0x2001, 0xc992, ++ 0x2004, 0xa086, 0x0000, 0x0548, 0xa026, 0x2019, 0xf000, 0x8319, ++ 0x1148, 0x2001, 0x012b, 0x2003, 0x95f5, 0x2001, 0x0129, 0x2003, ++ 0x95f5, 0x00d8, 0x2001, 0x0105, 0x2004, 0xa084, 0x0003, 0x1130, ++ 0x2001, 0xc992, 0x2004, 0xa086, 0x0000, 0x0178, 0x2001, 0x0132, ++ 0x2004, 0xa436, 0x0110, 0x2020, 0x0c00, 0x2001, 0x0021, 0x2004, ++ 0xd0fc, 0x09e8, 0x080c, 0x222c, 0x08c0, 0x20e1, 0x7000, 0x7324, ++ 0x7420, 0x7028, 0x7028, 0x7426, 0x7037, 0x0001, 0x810f, 0x712e, ++ 0x702f, 0x0100, 0x7037, 0x0008, 0x7326, 0x7422, 0x2001, 0x0160, ++ 0x2502, 0x2001, 0x0138, 0x2202, 0x00ee, 0x0005, 0x0026, 0x2001, ++ 0x015d, 0x2003, 0x0000, 0x7908, 0xa18c, 0x0fff, 0xa182, 0x0ffd, ++ 0x0210, 0x2009, 0x0000, 0xa190, 0x0007, 0xa294, 0x1ff8, 0x8214, ++ 0x8214, 0x8214, 0x2001, 0x020a, 0x82ff, 0x0140, 0x20e1, 0x6000, ++ 0x200c, 0x200c, 0x200c, 0x200c, 0x8211, 0x1dd0, 0x20e1, 0x7000, ++ 0x200c, 0x200c, 0x7003, 0x0000, 0x20e1, 0x6000, 0x2001, 0x0208, ++ 0x200c, 0x2001, 0x0209, 0x2004, 0xa106, 0x0158, 0x080c, 0x1e97, ++ 0x0130, 0x7908, 0xd1ec, 0x1128, 0x790c, 0xd1a4, 0x0960, 0x080c, ++ 0x1ec3, 0xa006, 0x002e, 0x0005, 0x00f6, 0x00e6, 0x0016, 0x0026, ++ 0x2071, 0xc96a, 0x2079, 0x0030, 0x2011, 0x0050, 0x7000, 0xa086, ++ 0x0000, 0x01a8, 0x8211, 0x0188, 0x2001, 0x0005, 0x2004, 0xd08c, ++ 0x0dc8, 0x7904, 0xa18c, 0x0780, 0x0016, 0x080c, 0x1b83, 0x001e, ++ 0x81ff, 0x1118, 0x2011, 0x0050, 0x0c48, 0xa085, 0x0001, 0x002e, ++ 0x001e, 0x00ee, 0x00fe, 0x0005, 0x7803, 0x0004, 0x2009, 0x0064, ++ 0x7804, 0xd0ac, 0x0904, 0x2060, 0x8109, 0x1dd0, 0x2009, 0x0100, ++ 0x210c, 0xa18a, 0x0003, 0x0a0c, 0x1519, 0x080c, 0x2333, 0x00e6, ++ 0x00f6, 0x2071, 0xc959, 0x2079, 0x0010, 0x7004, 0xa086, 0x0000, ++ 0x0538, 0x7800, 0x0006, 0x7820, 0x0006, 0x7830, 0x0006, 0x7834, ++ 0x0006, 0x7838, 0x0006, 0x783c, 0x0006, 0x7803, 0x0004, 0xe000, ++ 0xe000, 0x2079, 0x0030, 0x7804, 0xd0ac, 0x190c, 0x1519, 0x2079, ++ 0x0010, 0x000e, 0x783e, 0x000e, 0x783a, 0x000e, 0x7836, 0x000e, ++ 0x7832, 0x000e, 0x7822, 0x000e, 0x7802, 0x00fe, 0x00ee, 0x0030, ++ 0x00fe, 0x00ee, 0x7804, 0xd0ac, 0x190c, 0x1519, 0x080c, 0x7f6e, ++ 0x0005, 0x00e6, 0x2071, 0xc992, 0x7003, 0x0000, 0x00ee, 0x0005, ++ 0x00d6, 0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x1904, 0x20ed, ++ 0x6934, 0xa184, 0x0007, 0x0002, 0x207c, 0x20d8, 0x207c, 0x207e, ++ 0x207c, 0x20bf, 0x209e, 0x208d, 0x080c, 0x1519, 0x2100, 0xa084, ++ 0x00ff, 0xa086, 0x0013, 0x0904, 0x20d8, 0x2100, 0xa084, 0x00ff, ++ 0xa086, 0x001b, 0x0904, 0x20d8, 0x0c78, 0x684c, 0xd0b4, 0x0904, ++ 0x21e9, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812, 0x687c, ++ 0x680a, 0x6880, 0x680e, 0x6958, 0x0804, 0x20e0, 0x6834, 0xa084, ++ 0x00ff, 0xa086, 0x001e, 0x19c0, 0x684c, 0xd0b4, 0x0904, 0x21e9, ++ 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812, 0x687c, 0x680a, ++ 0x6880, 0x680e, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, ++ 0x000f, 0xa080, 0x23c7, 0x2005, 0x6832, 0x6958, 0x0450, 0xa18c, ++ 0x00ff, 0xa186, 0x0015, 0x1548, 0x684c, 0xd0b4, 0x0904, 0x21e9, ++ 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, ++ 0x23c7, 0x2005, 0x6832, 0x6958, 0xa006, 0x682e, 0x682a, 0x0088, ++ 0x684c, 0xd0b4, 0x0904, 0x1b5e, 0x6958, 0xa006, 0x682e, 0x682a, ++ 0x2d00, 0x681a, 0x6834, 0xa084, 0x000f, 0xa080, 0x23c7, 0x2005, ++ 0x6832, 0x6926, 0x684c, 0xc0dd, 0x684e, 0x00de, 0x0005, 0x00f6, ++ 0x2079, 0x0020, 0x7804, 0xd0fc, 0x190c, 0x222c, 0x00e6, 0x00d6, ++ 0x2071, 0xc992, 0x7000, 0xa005, 0x1904, 0x2155, 0x00c6, 0x7206, ++ 0xa280, 0x0004, 0x205c, 0x7004, 0x2068, 0x7803, 0x0004, 0x6818, ++ 0x00d6, 0x2068, 0x686c, 0x7812, 0x6890, 0x00f6, 0x20e1, 0x9040, ++ 0x2079, 0x0200, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x00fe, ++ 0x00de, 0x2b68, 0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, ++ 0x6034, 0xa0cc, 0x000f, 0x6908, 0x791a, 0x7116, 0x680c, 0x781e, ++ 0x701a, 0xa006, 0x700e, 0x7012, 0x7004, 0x692c, 0x6814, 0xa106, ++ 0x1120, 0x6928, 0x6810, 0xa106, 0x0158, 0x0036, 0x0046, 0x6b14, ++ 0x6c10, 0x080c, 0x241b, 0x004e, 0x003e, 0x0110, 0x00ce, 0x00a8, ++ 0x8aff, 0x1120, 0x00ce, 0xa085, 0x0001, 0x0078, 0x0126, 0x2091, ++ 0x8000, 0x2079, 0x0020, 0x2009, 0x0001, 0x0059, 0x0118, 0x2009, ++ 0x0001, 0x0039, 0x012e, 0x00ce, 0xa006, 0x00de, 0x00ee, 0x00fe, ++ 0x0005, 0x0076, 0x0066, 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff, ++ 0x0904, 0x21e2, 0x700c, 0x7214, 0xa23a, 0x7010, 0x7218, 0xa203, ++ 0x0a04, 0x21e1, 0xa705, 0x0904, 0x21e1, 0xa03e, 0x2730, 0x6850, ++ 0xd0fc, 0x11a8, 0x00d6, 0x2805, 0xac68, 0x2900, 0x0002, 0x21b0, ++ 0x2195, 0x2195, 0x21b0, 0x21b0, 0x21a9, 0x21b0, 0x2195, 0x21b0, ++ 0x219a, 0x219a, 0x21b0, 0x21b0, 0x21b0, 0x21a1, 0x219a, 0xc0fc, ++ 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0xd99c, 0x05c8, 0x00d6, ++ 0x2805, 0xac68, 0x6f08, 0x6e0c, 0x0490, 0x6b08, 0x6a0c, 0x6d00, ++ 0x6c04, 0x0468, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, ++ 0x0430, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, ++ 0x1138, 0x00de, 0x080c, 0x2389, 0x1904, 0x215f, 0xa00e, 0x0490, ++ 0x2d10, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0013, ++ 0x2268, 0x09d8, 0x2d10, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff, ++ 0xa086, 0x001b, 0x2268, 0x09b0, 0x00de, 0x080c, 0x1519, 0x00de, ++ 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, ++ 0x8000, 0x7002, 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, ++ 0x700c, 0xa300, 0x700e, 0x7010, 0xa201, 0x7012, 0x080c, 0x2389, ++ 0x0008, 0xa006, 0x002e, 0x003e, 0x004e, 0x005e, 0x006e, 0x007e, ++ 0x0005, 0x080c, 0x1519, 0x0026, 0x2001, 0x0105, 0x2003, 0x0010, ++ 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, ++ 0x00d6, 0x6010, 0x2068, 0x080c, 0xac91, 0x0118, 0x6850, 0xc0bd, ++ 0x6852, 0x601c, 0xa086, 0x0006, 0x1180, 0x2061, 0x0100, 0x62c8, ++ 0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8, 0xa206, 0x1dc0, 0x60c4, ++ 0x686a, 0x60c8, 0x6866, 0x7004, 0x2060, 0x00de, 0x00c6, 0x080c, ++ 0xa961, 0x00ce, 0x2001, 0xc936, 0x2004, 0xac06, 0x1150, 0x20e1, ++ 0x9040, 0x080c, 0x90f6, 0x2011, 0x0000, 0x080c, 0x8f18, 0x080c, ++ 0x7f6e, 0x002e, 0x0804, 0x22e6, 0x0126, 0x2091, 0x2400, 0x0006, ++ 0x0016, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x2079, 0x0020, 0x2071, ++ 0xc992, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, ++ 0x0700, 0x1904, 0x21eb, 0x7000, 0x0002, 0x22e6, 0x2249, 0x22b9, ++ 0x22e4, 0x8001, 0x7002, 0xd19c, 0x1170, 0x8aff, 0x05d0, 0x2009, ++ 0x0001, 0x080c, 0x2159, 0x0904, 0x22e6, 0x2009, 0x0001, 0x080c, ++ 0x2159, 0x0804, 0x22e6, 0x7803, 0x0004, 0xd194, 0x0148, 0x6850, ++ 0xc0fc, 0x6852, 0x8aff, 0x11d8, 0x684c, 0xc0f5, 0x684e, 0x00b8, ++ 0x0026, 0x0036, 0x6b28, 0x6a2c, 0x7820, 0x686e, 0xa31a, 0x7824, ++ 0x6872, 0xa213, 0x7830, 0x681e, 0x7834, 0x6822, 0x6b2a, 0x6a2e, ++ 0x003e, 0x002e, 0x080c, 0x239f, 0x6850, 0xc0fd, 0x6852, 0x2a00, ++ 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, 0x0804, ++ 0x22e6, 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, ++ 0x0100, 0x7a14, 0xa284, 0x0184, 0xa085, 0x0012, 0x7816, 0x0036, ++ 0x2019, 0x1000, 0x8319, 0x090c, 0x1519, 0x7820, 0xd0bc, 0x1dd0, ++ 0x003e, 0x79c8, 0x000e, 0xa102, 0x001e, 0x0006, 0x0016, 0x79c4, ++ 0x000e, 0xa103, 0x78c6, 0x000e, 0x78ca, 0xa284, 0x0184, 0xa085, ++ 0x0012, 0x7816, 0x002e, 0x00fe, 0x7803, 0x0008, 0x7003, 0x0000, ++ 0x0468, 0x8001, 0x7002, 0xd194, 0x0168, 0x7804, 0xd0fc, 0x1904, ++ 0x223c, 0xd19c, 0x11f8, 0x8aff, 0x0508, 0x2009, 0x0001, 0x080c, ++ 0x2159, 0x00e0, 0x0026, 0x0036, 0x6b28, 0x6a2c, 0x080c, 0x239f, ++ 0x00d6, 0x2805, 0xac68, 0x6034, 0xd09c, 0x1128, 0x6808, 0xa31a, ++ 0x680c, 0xa213, 0x0020, 0x6810, 0xa31a, 0x6814, 0xa213, 0x00de, ++ 0x0804, 0x226c, 0x0804, 0x2268, 0x080c, 0x1519, 0x00ce, 0x00de, ++ 0x00ee, 0x00fe, 0x001e, 0x000e, 0x012e, 0x0005, 0x00f6, 0x00e6, ++ 0x2071, 0xc992, 0x7000, 0xa086, 0x0000, 0x05d0, 0x2079, 0x0020, ++ 0x0016, 0x2009, 0x0207, 0x210c, 0xd194, 0x0198, 0x2009, 0x020c, ++ 0x210c, 0xa184, 0x0003, 0x0168, 0x080c, 0xc5a7, 0x2001, 0x0133, ++ 0x2004, 0xa005, 0x090c, 0x1519, 0x20e1, 0x9040, 0x2001, 0x020c, ++ 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0xa106, ++ 0x1110, 0x20e1, 0x9040, 0x7804, 0xd0fc, 0x09d8, 0x080c, 0x222c, ++ 0x7000, 0xa086, 0x0000, 0x19a8, 0x001e, 0x7803, 0x0004, 0x7804, ++ 0xd0ac, 0x1de8, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000, ++ 0x00ee, 0x00fe, 0x0005, 0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6, ++ 0x2071, 0xc992, 0x2079, 0x0020, 0x7000, 0xa086, 0x0000, 0x0540, ++ 0x7004, 0x2060, 0x6010, 0x2068, 0x080c, 0xac91, 0x0158, 0x6850, ++ 0xc0b5, 0x6852, 0x680c, 0x7a1c, 0xa206, 0x1120, 0x6808, 0x7a18, ++ 0xa206, 0x01e0, 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, ++ 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x080c, 0xa961, ++ 0x20e1, 0x9040, 0x080c, 0x90f6, 0x2011, 0x0000, 0x080c, 0x8f18, ++ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x0005, 0x6810, 0x6a14, ++ 0xa205, 0x1d00, 0x684c, 0xc0dc, 0x684e, 0x2c10, 0x080c, 0x2068, ++ 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, ++ 0x7003, 0x0000, 0x2069, 0xc927, 0x6833, 0x0000, 0x683f, 0x0000, ++ 0x08f8, 0x8840, 0x2805, 0xa005, 0x1170, 0x6004, 0xa005, 0x0168, ++ 0x681a, 0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x23c7, 0x2045, ++ 0x88ff, 0x090c, 0x1519, 0x8a51, 0x0005, 0x2050, 0x0005, 0x8a50, ++ 0x8841, 0x2805, 0xa005, 0x1190, 0x2c00, 0xad06, 0x0120, 0x6000, ++ 0xa005, 0x1108, 0x2d00, 0x2060, 0x681a, 0x6034, 0xa084, 0x000f, ++ 0xa080, 0x23d7, 0x2045, 0x88ff, 0x090c, 0x1519, 0x0005, 0x0000, ++ 0x0011, 0x0015, 0x0019, 0x001d, 0x0021, 0x0025, 0x0029, 0x0000, ++ 0x000f, 0x0015, 0x001b, 0x0021, 0x0027, 0x0000, 0x0000, 0x0000, ++ 0x23bc, 0x23b8, 0x23bc, 0x23bc, 0x23c6, 0x0000, 0x23bc, 0x0000, ++ 0x23c3, 0x23c0, 0x23c3, 0x23c3, 0x0000, 0x23c6, 0x23c3, 0x0000, ++ 0x23be, 0x23be, 0x0000, 0x23be, 0x23c6, 0x0000, 0x23be, 0x0000, ++ 0x23c4, 0x23c4, 0x0000, 0x23c4, 0x0000, 0x23c6, 0x23c4, 0x0136, ++ 0x0146, 0x0156, 0x2099, 0xc765, 0x20a1, 0x0018, 0x20a9, 0x0008, ++ 0x53a3, 0x7803, 0x0020, 0x0126, 0x2091, 0x8000, 0x7803, 0x0041, ++ 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x700b, 0xc760, 0x012e, ++ 0x015e, 0x014e, 0x013e, 0x0005, 0x2099, 0x0014, 0x7803, 0x0040, ++ 0x2001, 0xc765, 0x2004, 0x2010, 0x080c, 0x72ad, 0x2009, 0xc699, ++ 0x2104, 0xa084, 0xfffc, 0x200a, 0x080c, 0x721f, 0x7007, 0x0000, ++ 0x080c, 0x1676, 0x0005, 0x00a6, 0x0096, 0x0086, 0x6b2e, 0x6c2a, ++ 0x6858, 0xa055, 0x0904, 0x24ac, 0x2d60, 0x6034, 0xa0cc, 0x000f, ++ 0xa9c0, 0x23c7, 0xa986, 0x0007, 0x0130, 0xa986, 0x000e, 0x0118, ++ 0xa986, 0x000f, 0x1120, 0x605c, 0xa422, 0x6060, 0xa31b, 0x2805, ++ 0xa045, 0x1140, 0x0310, 0x0804, 0x24ac, 0x6004, 0xa065, 0x0904, ++ 0x24ac, 0x0c18, 0x2805, 0xa005, 0x01a8, 0xac68, 0xd99c, 0x1128, ++ 0x6808, 0xa422, 0x680c, 0xa31b, 0x0020, 0x6810, 0xa422, 0x6814, ++ 0xa31b, 0x0620, 0x2300, 0xa405, 0x0150, 0x8a51, 0x0904, 0x24ac, ++ 0x8840, 0x0c40, 0x6004, 0xa065, 0x0904, 0x24ac, 0x0830, 0x8a51, ++ 0x0904, 0x24ac, 0x8840, 0x2805, 0xa005, 0x1158, 0x6004, 0xa065, ++ 0x0904, 0x24ac, 0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x23c7, 0x2805, ++ 0x2040, 0x2b68, 0x6850, 0xc0fc, 0x6852, 0x0458, 0x8422, 0x8420, ++ 0x831a, 0xa399, 0x0000, 0x00d6, 0x2b68, 0x6c6e, 0x6b72, 0x00de, ++ 0xd99c, 0x1168, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, ++ 0x0a0c, 0x1519, 0x6800, 0xa420, 0x6804, 0xa319, 0x0060, 0x6910, ++ 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x0a0c, 0x1519, 0x6800, ++ 0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22, 0x6850, 0xc0fd, ++ 0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, 0x2a00, 0x6826, 0x000e, ++ 0x000e, 0x000e, 0xa006, 0x0028, 0x008e, 0x009e, 0x00ae, 0xa085, ++ 0x0001, 0x0005, 0x2001, 0x0005, 0x2004, 0xa084, 0x0007, 0x0002, ++ 0x24c0, 0x24c1, 0x24c4, 0x24c7, 0x24cc, 0x24cf, 0x24d4, 0x24d9, ++ 0x0005, 0x080c, 0x222c, 0x0005, 0x080c, 0x1b83, 0x0005, 0x080c, ++ 0x1b83, 0x080c, 0x222c, 0x0005, 0x080c, 0x1729, 0x0005, 0x080c, ++ 0x222c, 0x080c, 0x1729, 0x0005, 0x080c, 0x1b83, 0x080c, 0x1729, ++ 0x0005, 0x080c, 0x1b83, 0x080c, 0x222c, 0x080c, 0x1729, 0x0005, ++ 0x0006, 0x0016, 0x0156, 0x20a9, 0x0009, 0x2009, 0xc977, 0x2104, ++ 0xac06, 0x1108, 0x200a, 0xa188, 0x0003, 0x1f04, 0x24e7, 0x015e, ++ 0x001e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x2071, 0xc96a, 0x700c, ++ 0x7110, 0xa106, 0x01b8, 0x2104, 0xa005, 0x0138, 0xa080, 0x0004, ++ 0x2004, 0x2068, 0x080c, 0x7684, 0x0158, 0xa188, 0x0003, 0xa182, ++ 0xc992, 0x0210, 0x2009, 0xc977, 0x700c, 0xa106, 0x1d60, 0x0010, ++ 0xa085, 0x0001, 0x00de, 0x00ee, 0x0005, 0x0126, 0x2091, 0x2600, ++ 0x2079, 0x0200, 0x2071, 0xcc80, 0x2069, 0xc600, 0x080c, 0x260b, ++ 0x080c, 0x25fb, 0x2009, 0x0004, 0x7912, 0x7817, 0x0004, 0x080c, ++ 0x29a2, 0x781b, 0x0002, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a9, ++ 0x0080, 0x782f, 0x0000, 0x1f04, 0x2531, 0x20e1, 0x9080, 0x783b, ++ 0x001f, 0x20e1, 0x8700, 0x012e, 0x0005, 0x0126, 0x2091, 0x2600, ++ 0x781c, 0xd0a4, 0x190c, 0x25f8, 0xa084, 0x0007, 0x0002, 0x2561, ++ 0x254f, 0x2552, 0x2555, 0x255a, 0x255c, 0x255e, 0x2560, 0x080c, ++ 0x68c9, 0x0078, 0x080c, 0x6916, 0x0060, 0x080c, 0x68c9, 0x080c, ++ 0x6916, 0x0038, 0x0041, 0x0028, 0x0031, 0x0018, 0x0021, 0x0008, ++ 0x0011, 0x012e, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xc5a7, ++ 0x7930, 0xa184, 0x0003, 0x01b0, 0x2001, 0xc936, 0x2004, 0xa005, ++ 0x0170, 0x2001, 0x0133, 0x2004, 0xa005, 0x090c, 0x1519, 0x00c6, ++ 0x2001, 0xc936, 0x2064, 0x080c, 0xa961, 0x00ce, 0x04b8, 0x20e1, ++ 0x9040, 0x04a0, 0xa184, 0x0030, 0x01e0, 0x6a00, 0xa286, 0x0003, ++ 0x1108, 0x00a0, 0x080c, 0x5f22, 0x1178, 0x2001, 0xc8e6, 0x2003, ++ 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, ++ 0x5f66, 0x080c, 0x5e5a, 0x0010, 0x080c, 0x4e5b, 0x080c, 0x25fb, ++ 0x00a8, 0xa184, 0x00c0, 0x0168, 0x00e6, 0x0036, 0x0046, 0x0056, ++ 0x2071, 0xc96a, 0x080c, 0x1ec3, 0x005e, 0x004e, 0x003e, 0x00ee, ++ 0x0028, 0xa184, 0x0300, 0x0110, 0x20e1, 0x9020, 0x7932, 0x002e, ++ 0x001e, 0x000e, 0x0005, 0x0016, 0x00e6, 0x00f6, 0x2071, 0xc600, ++ 0x7128, 0x2001, 0xc8d8, 0x2102, 0x2001, 0xc8e0, 0x2102, 0xa182, ++ 0x0211, 0x1218, 0x2009, 0x0008, 0x0400, 0xa182, 0x0259, 0x1218, ++ 0x2009, 0x0007, 0x00d0, 0xa182, 0x02c1, 0x1218, 0x2009, 0x0006, ++ 0x00a0, 0xa182, 0x0349, 0x1218, 0x2009, 0x0005, 0x0070, 0xa182, ++ 0x0421, 0x1218, 0x2009, 0x0004, 0x0040, 0xa182, 0x0581, 0x1218, ++ 0x2009, 0x0003, 0x0010, 0x2009, 0x0002, 0x2079, 0x0200, 0x7912, ++ 0x7817, 0x0004, 0x080c, 0x29a2, 0x00fe, 0x00ee, 0x001e, 0x0005, ++ 0x7938, 0x080c, 0x1519, 0x00e6, 0x0026, 0x2071, 0x0200, 0x20e1, ++ 0x1000, 0x7220, 0x7028, 0x7020, 0xa206, 0x0de0, 0x20e1, 0x9010, ++ 0x002e, 0x00ee, 0x0005, 0x20e1, 0xa000, 0x7837, 0x0001, 0x782f, ++ 0x0000, 0x782f, 0x0000, 0x782f, 0x0000, 0x782f, 0x0000, 0x7837, ++ 0x0005, 0x20a9, 0x0210, 0x7830, 0xd0bc, 0x1110, 0x1f04, 0x261b, ++ 0x7837, 0x0001, 0x7837, 0x0000, 0xe000, 0xe000, 0x20e1, 0xa000, ++ 0x0005, 0x0126, 0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0xc600, ++ 0x6024, 0x6026, 0x6053, 0x0030, 0x080c, 0x29e1, 0x6050, 0xa084, ++ 0xfe7f, 0x6052, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x29f1, ++ 0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, ++ 0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x0e9f, 0x601b, ++ 0x001e, 0x600f, 0x00ff, 0x2001, 0xc8d4, 0x2003, 0x00ff, 0x602b, ++ 0x002f, 0x012e, 0x0005, 0x2001, 0xc632, 0x2003, 0x0000, 0x2001, ++ 0xc631, 0x2003, 0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, ++ 0x0016, 0x0026, 0x6124, 0x0066, 0x2031, 0xc635, 0x2634, 0xa6b4, ++ 0x0028, 0x006e, 0x11c0, 0x6020, 0xd0bc, 0x01a8, 0xd1bc, 0x0198, ++ 0x783c, 0xa005, 0x0180, 0x00e6, 0x0006, 0x2070, 0x701c, 0xa086, ++ 0x0009, 0x000e, 0x00ee, 0x1138, 0x00e6, 0x783c, 0x2070, 0x7008, ++ 0xd0fc, 0x00ee, 0x1130, 0xa184, 0x1e2c, 0x1118, 0xa184, 0x0007, ++ 0x002a, 0xa195, 0x0004, 0xa284, 0x0007, 0x0002, 0x26b8, 0x269e, ++ 0x26a1, 0x26a4, 0x26a9, 0x26ab, 0x26af, 0x26b3, 0x080c, 0x7873, ++ 0x00b8, 0x080c, 0x794e, 0x00a0, 0x080c, 0x794e, 0x080c, 0x7873, ++ 0x0078, 0x0099, 0x0068, 0x080c, 0x7873, 0x0079, 0x0048, 0x080c, ++ 0x794e, 0x0059, 0x0028, 0x080c, 0x794e, 0x080c, 0x7873, 0x0029, ++ 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x6124, 0x6028, 0xd09c, ++ 0x0118, 0xd19c, 0x1904, 0x2910, 0x080c, 0x5f22, 0x0578, 0x7000, ++ 0xa086, 0x0003, 0x0198, 0x6024, 0xa084, 0x1800, 0x0178, 0x080c, ++ 0x5f48, 0x0118, 0x080c, 0x5f34, 0x1148, 0x6027, 0x0020, 0x6043, ++ 0x0000, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x0458, 0x080c, 0x5f48, ++ 0x15d0, 0x6024, 0xa084, 0x1800, 0x1108, 0x04a8, 0x2001, 0xc8e5, ++ 0x2003, 0xaaaa, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, ++ 0x2003, 0x0001, 0x080c, 0x5e5a, 0x0804, 0x2910, 0xd1ac, 0x1518, ++ 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1188, 0xd0d4, 0x11a0, 0xd0cc, ++ 0x0130, 0x708c, 0xa086, 0x0028, 0x1110, 0x080c, 0x60b1, 0x0804, ++ 0x2910, 0x2001, 0xc8e6, 0x2003, 0x0000, 0x0048, 0x2001, 0xc8e6, ++ 0x2003, 0x0002, 0x0020, 0x080c, 0x6024, 0x0804, 0x2910, 0x080c, ++ 0x6156, 0x0804, 0x2910, 0x6220, 0xd1bc, 0x0568, 0xd2bc, 0x0558, ++ 0x783c, 0xa005, 0x0540, 0x00e6, 0x2070, 0x7008, 0xd0fc, 0x00ee, ++ 0x0510, 0x6028, 0xc0bc, 0x602a, 0x0026, 0x0036, 0x6288, 0x638c, ++ 0x608b, 0xbc91, 0x608f, 0xffff, 0x6043, 0x0001, 0xe000, 0xe000, ++ 0x6027, 0x0080, 0x6017, 0x0000, 0x6043, 0x0000, 0x628a, 0x638e, ++ 0x003e, 0x002e, 0x0016, 0x2001, 0xc696, 0x200c, 0xc184, 0x2102, ++ 0x001e, 0x0804, 0x2969, 0xd1ac, 0x0904, 0x284c, 0x0036, 0x6328, ++ 0xc3bc, 0x632a, 0x003e, 0x080c, 0x5f22, 0x11d8, 0x6027, 0x0020, ++ 0x0006, 0x0026, 0x0036, 0x080c, 0x5f3e, 0x1170, 0x2001, 0xc8e6, ++ 0x2003, 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, 0x080c, 0x5e5a, ++ 0x003e, 0x002e, 0x000e, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, ++ 0x5ef9, 0x0016, 0x0046, 0x00c6, 0x644c, 0xa486, 0xf0f0, 0x1138, ++ 0x2061, 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74ce, ++ 0xa48c, 0xff00, 0x7034, 0xd084, 0x0178, 0xa186, 0xf800, 0x1160, ++ 0x703c, 0xd084, 0x1148, 0xc085, 0x703e, 0x0036, 0x2418, 0x2011, ++ 0x8016, 0x080c, 0x407d, 0x003e, 0xa196, 0xff00, 0x05b8, 0x7054, ++ 0xa084, 0x00ff, 0x810f, 0xa116, 0x0588, 0x7130, 0xd184, 0x1570, ++ 0x2011, 0xc653, 0x2214, 0xd2ec, 0x0138, 0xc18d, 0x7132, 0x2011, ++ 0xc653, 0x2214, 0xd2ac, 0x1510, 0x6240, 0xa294, 0x0010, 0x0130, ++ 0x6248, 0xa294, 0xff00, 0xa296, 0xff00, 0x01c0, 0x7030, 0xd08c, ++ 0x0904, 0x2819, 0x7034, 0xd08c, 0x1140, 0x2001, 0xc60c, 0x200c, ++ 0xd1ac, 0x1904, 0x2819, 0xc1ad, 0x2102, 0x0036, 0x73cc, 0x2011, ++ 0x8013, 0x080c, 0x407d, 0x003e, 0x0804, 0x2819, 0x7034, 0xd08c, ++ 0x1140, 0x2001, 0xc60c, 0x200c, 0xd1ac, 0x1904, 0x2819, 0xc1ad, ++ 0x2102, 0x0036, 0x73cc, 0x2011, 0x8013, 0x080c, 0x407d, 0x003e, ++ 0x7130, 0xc185, 0x7132, 0x2011, 0xc653, 0x220c, 0xd1a4, 0x01d0, ++ 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x712e, 0x2019, ++ 0x000e, 0x080c, 0xc10d, 0xa484, 0x00ff, 0xa080, 0x2f6e, 0x200d, ++ 0xa18c, 0xff00, 0x810f, 0x8127, 0xa006, 0x2009, 0x000e, 0x080c, ++ 0xc190, 0x001e, 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, 0x080c, ++ 0x2e19, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000, ++ 0x080c, 0x533d, 0x1110, 0x080c, 0x4f47, 0x8108, 0x1f04, 0x2810, ++ 0x015e, 0x00ce, 0x004e, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, ++ 0x0002, 0x080c, 0x8f18, 0x080c, 0x8dee, 0x0036, 0x2019, 0x0000, ++ 0x080c, 0x8e79, 0x003e, 0x60e3, 0x0000, 0x001e, 0x2001, 0xc600, ++ 0x2014, 0xa296, 0x0004, 0x1128, 0xd19c, 0x11b0, 0x6228, 0xc29d, ++ 0x622a, 0x2003, 0x0001, 0x2001, 0xc623, 0x2003, 0x0000, 0x6027, ++ 0x0020, 0x080c, 0x5f48, 0x1140, 0x0016, 0x2009, 0x07d0, 0x2011, ++ 0x5e37, 0x080c, 0x7036, 0x001e, 0xd194, 0x0904, 0x2910, 0x0016, ++ 0x6220, 0xd2b4, 0x0904, 0x28b5, 0x080c, 0x7024, 0x080c, 0x8bf5, ++ 0x6027, 0x0004, 0x00f6, 0x2019, 0xc930, 0x2304, 0xa07d, 0x0570, ++ 0x7804, 0xa086, 0x0032, 0x1550, 0x00d6, 0x00c6, 0x00e6, 0x2069, ++ 0x0140, 0x618c, 0x6288, 0x7818, 0x608e, 0x7808, 0x608a, 0x6043, ++ 0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000, 0x6803, ++ 0x1000, 0x6803, 0x0000, 0x618e, 0x628a, 0x080c, 0x7db1, 0x080c, ++ 0x7e94, 0x7810, 0x2070, 0x7037, 0x0103, 0x2f60, 0x080c, 0x95e3, ++ 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x0005, 0x00fe, 0x00d6, ++ 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0120, 0x6803, 0x1000, ++ 0x6803, 0x0000, 0x00de, 0x00c6, 0x2061, 0xc927, 0x6028, 0xa09a, ++ 0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x8be8, 0x0804, ++ 0x290f, 0x2019, 0xc930, 0x2304, 0xa065, 0x0120, 0x2009, 0x0027, ++ 0x080c, 0x9613, 0x00ce, 0x0804, 0x290f, 0xd2bc, 0x0904, 0x290f, ++ 0x080c, 0x7031, 0x6014, 0xa084, 0x0184, 0xa085, 0x0010, 0x6016, ++ 0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, ++ 0x0120, 0x6803, 0x1000, 0x6803, 0x0000, 0x00de, 0x00c6, 0x2061, ++ 0xc927, 0x6044, 0xa09a, 0x00c8, 0x1620, 0x8000, 0x6046, 0x603c, ++ 0x00ce, 0xa005, 0x05a0, 0x2009, 0x07d0, 0x080c, 0x7029, 0xa080, ++ 0x0007, 0x2004, 0xa086, 0x0006, 0x1138, 0x6114, 0xa18c, 0x0184, ++ 0xa18d, 0x0012, 0x6116, 0x0418, 0xa080, 0x0007, 0x2004, 0xa086, ++ 0x0009, 0x0d98, 0x6114, 0xa18c, 0x0184, 0xa18d, 0x0016, 0x6116, ++ 0x00b0, 0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 0x003e, 0x2019, ++ 0xc936, 0x2304, 0xa065, 0x0150, 0x2009, 0x004f, 0x601c, 0xa086, ++ 0x0009, 0x1110, 0x2009, 0x0105, 0x080c, 0x9613, 0x00ce, 0x001e, ++ 0xd19c, 0x0904, 0x2969, 0x7034, 0xd0ac, 0x1560, 0x0016, 0x0156, ++ 0x6027, 0x0008, 0x602f, 0x0020, 0x20a9, 0x0006, 0x1d04, 0x291e, ++ 0x2091, 0x6000, 0x1f04, 0x291e, 0x602f, 0x0000, 0x6150, 0xa185, ++ 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, 0x292c, 0x2091, 0x6000, ++ 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, ++ 0x0480, 0x080c, 0x2ab1, 0x1f04, 0x292c, 0x015e, 0x6152, 0x001e, ++ 0x6027, 0x0008, 0x0016, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, ++ 0x080c, 0x8f0e, 0x2011, 0x0002, 0x080c, 0x8f18, 0x080c, 0x8dee, ++ 0x0036, 0x2019, 0x0000, 0x080c, 0x8e79, 0x003e, 0x60e3, 0x0000, ++ 0x080c, 0xc586, 0x080c, 0xc5a1, 0xa085, 0x0001, 0x080c, 0x5f66, ++ 0x2001, 0xc600, 0x2003, 0x0004, 0x6027, 0x0008, 0x080c, 0x12e1, ++ 0x001e, 0xa18c, 0xffd0, 0x6126, 0x0005, 0x0006, 0x0016, 0x0026, ++ 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0xc600, 0x71c4, ++ 0x70c6, 0xa116, 0x0500, 0x81ff, 0x0128, 0x2011, 0x8011, 0x080c, ++ 0x407d, 0x00c8, 0x2011, 0x8012, 0x080c, 0x407d, 0x2001, 0xc672, ++ 0x2004, 0xd0fc, 0x1180, 0x0036, 0x00c6, 0x080c, 0x2a3c, 0x080c, ++ 0x8dca, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0000, 0x080c, ++ 0x2e19, 0x00ce, 0x003e, 0x012e, 0x00fe, 0x00ee, 0x002e, 0x001e, ++ 0x000e, 0x0005, 0x00c6, 0x00f6, 0x0006, 0x0026, 0x2061, 0x0100, ++ 0xa190, 0x29b5, 0x2205, 0x60f2, 0x2011, 0x29c2, 0x2205, 0x60ee, ++ 0x002e, 0x000e, 0x00fe, 0x00ce, 0x0005, 0x0840, 0x0840, 0x0840, ++ 0x0580, 0x0420, 0x0348, 0x02c0, 0x0258, 0x0210, 0x01a8, 0x01a8, ++ 0x01a8, 0x01a8, 0x0140, 0x00f8, 0x00d0, 0x00b0, 0x00a0, 0x2028, ++ 0xa18c, 0x00ff, 0x2130, 0xa094, 0xff00, 0x1110, 0x81ff, 0x0118, ++ 0x080c, 0x6be0, 0x0038, 0xa080, 0x2f6e, 0x200d, 0xa18c, 0xff00, ++ 0x810f, 0xa006, 0x0005, 0xa080, 0x2f6e, 0x200d, 0xa18c, 0x00ff, ++ 0x0005, 0x00d6, 0x2069, 0x0140, 0x2001, 0xc615, 0x2003, 0x00ef, ++ 0x20a9, 0x0010, 0xa006, 0x6852, 0x6856, 0x1f04, 0x29ec, 0x00de, ++ 0x0005, 0x0006, 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0xc615, ++ 0x2102, 0x8114, 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, ++ 0x0000, 0xa006, 0x82ff, 0x1128, 0xa184, 0x000f, 0xa080, 0xc5b5, ++ 0x2005, 0x6856, 0x8211, 0x1f04, 0x2a01, 0x002e, 0x00de, 0x000e, ++ 0x0005, 0x00c6, 0x2061, 0xc600, 0x6030, 0x0110, 0xc09d, 0x0008, ++ 0xc09c, 0x6032, 0x00ce, 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016, ++ 0x0006, 0x2069, 0x0140, 0x6980, 0xa116, 0x0180, 0xa112, 0x1230, ++ 0x8212, 0x8210, 0x22a8, 0x2001, 0x0402, 0x0018, 0x22a8, 0x2001, ++ 0x0404, 0x680e, 0x1f04, 0x2a31, 0x680f, 0x0000, 0x000e, 0x001e, ++ 0x002e, 0x00de, 0x015e, 0x0005, 0x2001, 0xc653, 0x2004, 0xd0c4, ++ 0x0150, 0xd0a4, 0x0140, 0xa006, 0x0046, 0x2020, 0x2009, 0x002e, ++ 0x080c, 0xc190, 0x004e, 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, ++ 0x0140, 0x78c4, 0xd0dc, 0x0548, 0xa084, 0x0700, 0xa08e, 0x0300, ++ 0x1520, 0x2011, 0x0000, 0x2009, 0x0002, 0x2300, 0xa080, 0x0020, ++ 0x2018, 0x2300, 0x080c, 0x783f, 0x2011, 0x0030, 0x2200, 0x8007, ++ 0xa085, 0x004c, 0x78c2, 0x2009, 0x0204, 0x210c, 0x2200, 0xa100, ++ 0x2009, 0x0138, 0x200a, 0x080c, 0x5f22, 0x1118, 0x2009, 0xc8d6, ++ 0x200a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, ++ 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, ++ 0x200c, 0x8000, 0x2014, 0xa184, 0x0003, 0x0110, 0x0804, 0x1b81, ++ 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x0006, 0x2001, 0x0100, ++ 0x2004, 0xa082, 0x0005, 0x000e, 0x0268, 0x2001, 0x0170, 0x200c, ++ 0xa18c, 0x00ff, 0xa18e, 0x004c, 0x1128, 0x200c, 0xa18c, 0xff00, ++ 0x810f, 0x0010, 0x2009, 0x0000, 0x2001, 0x0204, 0x2004, 0xa108, ++ 0x0005, 0x0006, 0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, ++ 0x7854, 0xd08c, 0x1110, 0x1f04, 0x2ab8, 0x00fe, 0x015e, 0x000e, ++ 0x0005, 0x0016, 0x00c6, 0x0006, 0x2061, 0x0100, 0x6030, 0x0006, ++ 0x6048, 0x0006, 0x60e4, 0x0006, 0x60e8, 0x0006, 0x6050, 0x0006, ++ 0x60f0, 0x0006, 0x60ec, 0x0006, 0x600c, 0x0006, 0x6004, 0x0006, ++ 0x6028, 0x0006, 0x60e0, 0x0006, 0x602f, 0x0100, 0x602f, 0x0000, ++ 0xe000, 0xe000, 0xe000, 0xe000, 0x602f, 0x0040, 0x602f, 0x0000, ++ 0x000e, 0x60e2, 0x000e, 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, ++ 0x000e, 0x60ee, 0x000e, 0x60f2, 0x000e, 0x6052, 0x000e, 0x60ea, ++ 0x000e, 0x60e6, 0x000e, 0x604a, 0x000e, 0x6032, 0x6036, 0x2008, ++ 0x080c, 0x29f1, 0x000e, 0x00ce, 0x001e, 0x0005, 0x2009, 0x0171, ++ 0x2104, 0xd0dc, 0x0140, 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, ++ 0xe000, 0xe000, 0x200a, 0x0005, 0x2ba4, 0x2ba8, 0x2bac, 0x2bb2, ++ 0x2bb8, 0x2bbe, 0x2bc4, 0x2bcc, 0x2bd4, 0x2bda, 0x2be0, 0x2be8, ++ 0x2bf0, 0x2bf8, 0x2c00, 0x2c0a, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c14, 0x2c14, 0x2c14, 0x2c14, ++ 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, ++ 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c16, 0x2c16, 0x2c1c, 0x2c1c, ++ 0x2c23, 0x2c23, 0x2c2a, 0x2c2a, 0x2c33, 0x2c33, 0x2c3a, 0x2c3a, ++ 0x2c43, 0x2c43, 0x2c4c, 0x2c4c, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c14, 0x2c14, 0x2c14, 0x2c14, ++ 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, ++ 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c57, ++ 0x2c57, 0x2c57, 0x2c57, 0x2c57, 0x2c14, 0x2c14, 0x2c14, 0x2c14, ++ 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x2c14, ++ 0x2c14, 0x2c14, 0x2c14, 0x2c14, 0x0106, 0x0006, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664, ++ 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x080c, 0x24b2, 0x0804, 0x2c5f, 0x0106, 0x0006, ++ 0x080c, 0x24b2, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664, ++ 0x080c, 0x24b2, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664, ++ 0x080c, 0x24b2, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x253d, ++ 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x253d, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x080c, 0x2664, 0x080c, 0x253d, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x080c, 0x2664, 0x080c, 0x253d, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x080c, 0x24b2, 0x080c, 0x253d, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x080c, 0x24b2, 0x080c, 0x253d, 0x0804, 0x2c5f, ++ 0x0106, 0x0006, 0x080c, 0x2664, 0x080c, 0x24b2, 0x080c, 0x253d, ++ 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2664, 0x080c, 0x24b2, ++ 0x080c, 0x253d, 0x0804, 0x2c5f, 0xe000, 0x0cf0, 0x0106, 0x0006, ++ 0x080c, 0x2a80, 0x0804, 0x2c5f, 0x0106, 0x0006, 0x080c, 0x2a80, ++ 0x080c, 0x2664, 0x04e0, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c, ++ 0x24b2, 0x04a8, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c, 0x2664, ++ 0x080c, 0x24b2, 0x0460, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c, ++ 0x253d, 0x0428, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c, 0x2664, ++ 0x080c, 0x253d, 0x00e0, 0x0106, 0x0006, 0x080c, 0x2a80, 0x080c, ++ 0x24b2, 0x080c, 0x253d, 0x0098, 0x0106, 0x0006, 0x080c, 0x2a80, ++ 0x080c, 0x2664, 0x080c, 0x24b2, 0x080c, 0x253d, 0x0040, 0x20d1, ++ 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x1519, 0x000e, ++ 0x010e, 0x000d, 0x00c6, 0x0026, 0x0046, 0x2021, 0x0000, 0x080c, ++ 0x570b, 0x1904, 0x2d3f, 0x72d4, 0x2001, 0xc8e5, 0x2004, 0xa005, ++ 0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x2d3f, ++ 0x080c, 0x2d43, 0x0804, 0x2d3f, 0xd2cc, 0x1904, 0x2d3f, 0x080c, ++ 0x5f22, 0x1120, 0x709f, 0xffff, 0x0804, 0x2d3f, 0xd294, 0x0120, ++ 0x709f, 0xffff, 0x0804, 0x2d3f, 0x2001, 0xc615, 0x203c, 0x7288, ++ 0xd284, 0x0904, 0x2ce1, 0xd28c, 0x1904, 0x2ce1, 0x0036, 0x739c, ++ 0xa38e, 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0xa2e0, 0xcdc0, ++ 0x2c04, 0xa38c, 0x0001, 0x0120, 0xa084, 0xff00, 0x8007, 0x0010, ++ 0xa084, 0x00ff, 0xa70e, 0x0560, 0xa08e, 0x0000, 0x0548, 0xa08e, ++ 0x00ff, 0x1150, 0x7230, 0xd284, 0x1538, 0x7288, 0xc28d, 0x728a, ++ 0x709f, 0xffff, 0x003e, 0x0428, 0x2009, 0x0000, 0x080c, 0x29c7, ++ 0x080c, 0x52e1, 0x11b8, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, ++ 0x1150, 0x7030, 0xd08c, 0x0118, 0x6000, 0xd0bc, 0x0120, 0x080c, ++ 0x2d56, 0x0140, 0x0028, 0x080c, 0x2e87, 0x080c, 0x2d84, 0x0110, ++ 0x8318, 0x0818, 0x739e, 0x0010, 0x709f, 0xffff, 0x003e, 0x0804, ++ 0x2d3f, 0xa780, 0x2f6e, 0x203d, 0xa7bc, 0xff00, 0x873f, 0x2041, ++ 0x007e, 0x709c, 0xa096, 0xffff, 0x1120, 0x2009, 0x0000, 0x28a8, ++ 0x0050, 0xa812, 0x0220, 0x2008, 0xa802, 0x20a8, 0x0020, 0x709f, ++ 0xffff, 0x0804, 0x2d3f, 0x2700, 0x0156, 0x0016, 0xa106, 0x05a0, ++ 0xc484, 0x080c, 0x533d, 0x0120, 0x080c, 0x52e1, 0x15a8, 0x0008, ++ 0xc485, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1130, 0x7030, ++ 0xd08c, 0x01e8, 0x6000, 0xd0bc, 0x11d0, 0x7288, 0xd28c, 0x0188, ++ 0x6004, 0xa084, 0x00ff, 0xa082, 0x0006, 0x02b0, 0xd484, 0x1118, ++ 0x080c, 0x5300, 0x0028, 0x080c, 0x2f14, 0x0170, 0x080c, 0x2f41, ++ 0x0058, 0x080c, 0x2e87, 0x080c, 0x2d84, 0x0170, 0x0028, 0x080c, ++ 0x2f14, 0x0110, 0x0419, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, ++ 0x2cfb, 0x709f, 0xffff, 0x0018, 0x001e, 0x015e, 0x719e, 0x004e, ++ 0x002e, 0x00ce, 0x0005, 0x00c6, 0x0016, 0x709f, 0x0001, 0x2009, ++ 0x007e, 0x080c, 0x52e1, 0x1138, 0x080c, 0x2e87, 0x04a9, 0x0118, ++ 0x70d4, 0xc0bd, 0x70d6, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, ++ 0x00d6, 0x00c6, 0x2c68, 0x2001, 0xc657, 0x2004, 0xa084, 0x00ff, ++ 0x6842, 0x080c, 0xaf0d, 0x01d8, 0x2d00, 0x601a, 0x080c, 0xb05e, ++ 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x527f, 0x2001, 0x0000, ++ 0x080c, 0x5291, 0x0126, 0x2091, 0x8000, 0x7098, 0x8000, 0x709a, ++ 0x012e, 0x2009, 0x0004, 0x080c, 0x9613, 0xa085, 0x0001, 0x00ce, ++ 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, ++ 0x2c68, 0x2001, 0xc657, 0x2004, 0xa084, 0x00ff, 0x6842, 0x080c, ++ 0xaf0d, 0x0550, 0x2d00, 0x601a, 0x6800, 0xc0c4, 0x6802, 0x68a0, ++ 0xa086, 0x007e, 0x0140, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, ++ 0x1110, 0x080c, 0x2e46, 0x080c, 0xb05e, 0x601f, 0x0001, 0x2001, ++ 0x0000, 0x080c, 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x0126, ++ 0x2091, 0x8000, 0x7098, 0x8000, 0x709a, 0x012e, 0x2009, 0x0002, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, ++ 0x0005, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x52e1, 0x1120, ++ 0x0031, 0x0110, 0x70db, 0xffff, 0x002e, 0x00ce, 0x0005, 0x0016, ++ 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x080c, 0x958d, 0x01e8, 0x2d00, ++ 0x601a, 0x080c, 0xb05e, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, ++ 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x2e46, 0x70dc, 0x8000, 0x70de, 0x012e, 0x2009, 0x0002, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, ++ 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, ++ 0x080c, 0x52e1, 0x1190, 0x2c68, 0x080c, 0x958d, 0x0170, 0x2d00, ++ 0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x080c, 0xb05e, 0x2009, ++ 0x0022, 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00de, 0x00ce, ++ 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x080c, 0x7b22, ++ 0x080c, 0x7abb, 0x080c, 0xa090, 0x2130, 0x81ff, 0x0128, 0x20a9, ++ 0x007e, 0x2009, 0x0000, 0x0020, 0x20a9, 0x007f, 0x2009, 0x0000, ++ 0x0016, 0x080c, 0x533d, 0x1120, 0x080c, 0x553e, 0x080c, 0x4f47, ++ 0x001e, 0x8108, 0x1f04, 0x2e30, 0x86ff, 0x1110, 0x080c, 0x11f4, ++ 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, ++ 0x0036, 0x0026, 0x0016, 0x6218, 0x2270, 0x72a0, 0x0026, 0x2019, ++ 0x0029, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, ++ 0x2c08, 0x080c, 0xbef7, 0x007e, 0x001e, 0x2e60, 0x080c, 0x553e, ++ 0x6210, 0x6314, 0x080c, 0x4f47, 0x6212, 0x6316, 0x001e, 0x002e, ++ 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x6018, 0xa080, ++ 0x0028, 0x2004, 0xa086, 0x0080, 0x0150, 0x2071, 0xc600, 0x7098, ++ 0xa005, 0x0110, 0x8001, 0x709a, 0x000e, 0x00ee, 0x0005, 0x2071, ++ 0xc600, 0x70dc, 0xa005, 0x0dc0, 0x8001, 0x70de, 0x0ca8, 0x6000, ++ 0xc08c, 0x6002, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0036, 0x0026, ++ 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9, 0x0001, 0x0098, ++ 0x2001, 0xc653, 0x2004, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0xa006, ++ 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xc190, 0x004e, 0x20a9, ++ 0x00ff, 0x2011, 0x0000, 0x0026, 0xa28e, 0x007e, 0x0904, 0x2ef3, ++ 0xa28e, 0x007f, 0x0904, 0x2ef3, 0xa28e, 0x0080, 0x05e0, 0xa288, ++ 0xc77b, 0x210c, 0x81ff, 0x05b8, 0x8fff, 0x1148, 0x2001, 0xc905, ++ 0x0006, 0x2003, 0x0001, 0x04d9, 0x000e, 0x2003, 0x0000, 0x00c6, ++ 0x2160, 0x2001, 0x0001, 0x080c, 0x5715, 0x00ce, 0x2019, 0x0029, ++ 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, 0x00c6, ++ 0x0026, 0x2160, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, 0x1118, ++ 0x6007, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0xa215, 0x6206, ++ 0x002e, 0x00ce, 0x0016, 0x2c08, 0x080c, 0xbef7, 0x001e, 0x007e, ++ 0x2160, 0x080c, 0x553e, 0x002e, 0x8210, 0x1f04, 0x2eab, 0x015e, ++ 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, ++ 0x0026, 0x0016, 0x2001, 0xc653, 0x2004, 0xd0c4, 0x0148, 0xd0a4, ++ 0x0138, 0xa006, 0x2220, 0x8427, 0x2009, 0x0029, 0x080c, 0xc190, ++ 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, ++ 0x7288, 0x82ff, 0x01f8, 0x2011, 0xc653, 0x2214, 0xd2ac, 0x11d0, ++ 0x2100, 0x080c, 0x29db, 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, ++ 0xa2e0, 0xcdc0, 0x2c04, 0xd384, 0x0120, 0xa084, 0xff00, 0x8007, ++ 0x0010, 0xa084, 0x00ff, 0xa116, 0x0138, 0xa096, 0x00ff, 0x0110, ++ 0x8318, 0x0c68, 0xa085, 0x0001, 0x00ce, 0x003e, 0x002e, 0x001e, ++ 0x0005, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, 0x0026, ++ 0x0036, 0x2110, 0x0026, 0x2019, 0x0029, 0x080c, 0x9132, 0x002e, ++ 0x080c, 0xc4e4, 0x003e, 0x002e, 0x001e, 0xa180, 0xc77b, 0x2004, ++ 0xa065, 0x0158, 0x0016, 0x00c6, 0x2061, 0xca3c, 0x001e, 0x611a, ++ 0x080c, 0x2e46, 0x001e, 0x080c, 0x5300, 0x012e, 0x00ce, 0x001e, ++ 0x0005, 0x2001, 0xc635, 0x2004, 0xd0cc, 0x0005, 0x7eef, 0x7de8, ++ 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6, ++ 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc, ++ 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc, ++ 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1, ++ 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6, ++ 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797, ++ 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c, ++ 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071, ++ 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66, ++ 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454, ++ 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a, ++ 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039, ++ 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d, ++ 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123, ++ 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f, ++ 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700, ++ 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000, ++ 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000, ++ 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000, ++ 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000, ++ 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700, ++ 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100, ++ 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00, ++ 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, ++ 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400, ++ 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00, ++ 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800, ++ 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400, ++ 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000, ++ 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, ++ 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, ++ 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0xc6a2, ++ 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a, 0x703e, 0x7033, ++ 0xc6b2, 0x7037, 0xc6b2, 0x7007, 0x0001, 0x2061, 0xc6f2, 0x6003, ++ 0x0002, 0x0005, 0x1004, 0x3094, 0x0e04, 0x3094, 0x2071, 0xc6a2, ++ 0x2b78, 0x7818, 0xd084, 0x1140, 0x2a60, 0x7820, 0xa08e, 0x0069, ++ 0x1904, 0x3179, 0x0804, 0x3112, 0x0005, 0x2071, 0xc6a2, 0x7004, ++ 0x0002, 0x309d, 0x309e, 0x30a7, 0x30b8, 0x0005, 0x1004, 0x30a6, ++ 0x0e04, 0x30a6, 0x2b78, 0x7818, 0xd084, 0x01e8, 0x0005, 0x2b78, ++ 0x2061, 0xc6f2, 0x6008, 0xa08e, 0x0100, 0x0128, 0xa086, 0x0200, ++ 0x0904, 0x3173, 0x0005, 0x7014, 0x2068, 0x2a60, 0x7018, 0x0807, ++ 0x7010, 0x2068, 0x6834, 0xa086, 0x0103, 0x0108, 0x0005, 0x2a60, ++ 0x2b78, 0x7018, 0x0807, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x1210, ++ 0x61c4, 0x0042, 0x2100, 0xa08a, 0x003f, 0x1a04, 0x3170, 0x61c4, ++ 0x0804, 0x3112, 0x3154, 0x317f, 0x3187, 0x318b, 0x3193, 0x3199, ++ 0x319d, 0x31a9, 0x31ac, 0x31b6, 0x31b9, 0x3170, 0x3170, 0x3170, ++ 0x31bc, 0x3170, 0x31cb, 0x31e2, 0x31f9, 0x3273, 0x3278, 0x32a1, ++ 0x32f2, 0x3303, 0x3322, 0x335a, 0x3364, 0x3371, 0x3384, 0x33a5, ++ 0x33ae, 0x33e4, 0x33ea, 0x3170, 0x3413, 0x3170, 0x3170, 0x3170, ++ 0x3170, 0x3170, 0x341a, 0x3424, 0x3170, 0x3170, 0x3170, 0x3170, ++ 0x3170, 0x3170, 0x3170, 0x3170, 0x342c, 0x3170, 0x3170, 0x3170, ++ 0x3170, 0x3170, 0x343e, 0x3448, 0x3170, 0x3170, 0x3170, 0x3170, ++ 0x3170, 0x3170, 0x0002, 0x3472, 0x34c6, 0x3521, 0x353b, 0x3170, ++ 0x356c, 0x399f, 0x456f, 0x3170, 0x3170, 0x3170, 0x3170, 0x3170, ++ 0x3170, 0x3170, 0x3170, 0x31b6, 0x31b9, 0x39a1, 0x3170, 0x39ae, ++ 0x4608, 0x4663, 0x46c7, 0x3170, 0x472a, 0x4754, 0x4773, 0x47a5, ++ 0x3170, 0x3170, 0x3170, 0x39b2, 0x3b57, 0x3b71, 0x3b8f, 0x3bf0, ++ 0x3c50, 0x3c5b, 0x3c93, 0x3ca2, 0x3cb1, 0x3cb4, 0x3cd7, 0x3d21, ++ 0x3d97, 0x3da4, 0x3ea5, 0x3fd4, 0x3ffd, 0x40fb, 0x411d, 0x4129, ++ 0x4162, 0x4232, 0x428c, 0x4352, 0x43a4, 0x4404, 0x4419, 0x4434, ++ 0x44a6, 0x4558, 0x713c, 0x0000, 0x2021, 0x4000, 0x080c, 0x405a, ++ 0x0126, 0x2091, 0x8000, 0x0e04, 0x3160, 0x7818, 0xd084, 0x0110, ++ 0x012e, 0x0cb0, 0x7c22, 0x7926, 0x7a2a, 0x7b2e, 0x781b, 0x0001, ++ 0x2091, 0x4080, 0x7007, 0x0001, 0x2091, 0x5000, 0x012e, 0x0005, ++ 0x2021, 0x4001, 0x0c18, 0x2021, 0x4002, 0x0c00, 0x2021, 0x4003, ++ 0x08e8, 0x2021, 0x4005, 0x08d0, 0x2021, 0x4006, 0x08b8, 0xa02e, ++ 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0804, 0x4067, 0x7823, ++ 0x0004, 0x7824, 0x0807, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, ++ 0x7930, 0x0804, 0x406a, 0x7924, 0x7828, 0x2114, 0x200a, 0x0804, ++ 0x3154, 0x7924, 0x2114, 0x0804, 0x3154, 0x2099, 0x0009, 0x20a1, ++ 0x0009, 0x20a9, 0x0007, 0x53a3, 0x7924, 0x7a28, 0x7b2c, 0x0804, ++ 0x3154, 0x7824, 0x2060, 0x0090, 0x2009, 0x0002, 0x2011, 0x0002, ++ 0x2019, 0x0005, 0x783b, 0x0037, 0x0804, 0x3154, 0x7d38, 0x7c3c, ++ 0x0840, 0x7d38, 0x7c3c, 0x0888, 0x2061, 0x1000, 0xe10c, 0xa006, ++ 0x2c15, 0xa200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0xa005, 0x0904, ++ 0x3154, 0x0804, 0x3176, 0x2069, 0xc652, 0x7824, 0x7930, 0xa11a, ++ 0x1a04, 0x317c, 0x8019, 0x0904, 0x317c, 0x684a, 0x6942, 0x782c, ++ 0x6852, 0x7828, 0x6856, 0xa006, 0x685a, 0x685e, 0x080c, 0x61f8, ++ 0x0804, 0x3154, 0x2069, 0xc652, 0x7824, 0x7934, 0xa11a, 0x1a04, ++ 0x317c, 0x8019, 0x0904, 0x317c, 0x684e, 0x6946, 0x782c, 0x6862, ++ 0x7828, 0x6866, 0xa006, 0x686a, 0x686e, 0x080c, 0x57d7, 0x0804, ++ 0x3154, 0xa02e, 0x2520, 0x81ff, 0x1904, 0x3179, 0x7924, 0x7b28, ++ 0x7a2c, 0x20a9, 0x0005, 0x20a1, 0xc6a9, 0x41a1, 0x080c, 0x4026, ++ 0x0904, 0x3179, 0x2009, 0x0020, 0x080c, 0x4067, 0x701b, 0x3211, ++ 0x0005, 0x6834, 0x2008, 0xa084, 0x00ff, 0xa096, 0x0011, 0x0138, ++ 0xa096, 0x0019, 0x0120, 0xa096, 0x0015, 0x1904, 0x3179, 0x810f, ++ 0xa18c, 0x00ff, 0x0904, 0x3179, 0x710e, 0x700c, 0x8001, 0x0528, ++ 0x700e, 0x080c, 0x4026, 0x0904, 0x3179, 0x2009, 0x0020, 0x2061, ++ 0xc6f2, 0x6224, 0x6328, 0x642c, 0x6530, 0xa290, 0x0040, 0xa399, ++ 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x080c, 0x4067, 0x701b, ++ 0x3242, 0x0005, 0x6834, 0xa084, 0x00ff, 0xa096, 0x0002, 0x0120, ++ 0xa096, 0x000a, 0x1904, 0x3179, 0x08c0, 0x7010, 0x2068, 0x6838, ++ 0xc0fd, 0x683a, 0x080c, 0x51dd, 0x1128, 0x7007, 0x0003, 0x701b, ++ 0x325c, 0x0005, 0x080c, 0x592e, 0x0126, 0x2091, 0x8000, 0x20a9, ++ 0x0005, 0x2099, 0xc6a9, 0x530a, 0x2100, 0xa210, 0xa399, 0x0000, ++ 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d, 0x2009, 0x0020, ++ 0x012e, 0x0804, 0x406a, 0x61ac, 0x7824, 0x60ae, 0x0804, 0x3154, ++ 0x2091, 0x8000, 0x7823, 0x4000, 0x7827, 0x4953, 0x782b, 0x5020, ++ 0x782f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7832, 0x3f00, 0x7836, ++ 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c, 0x8007, 0xa205, ++ 0x783a, 0x2009, 0x04fd, 0x2104, 0x783e, 0x781b, 0x0001, 0x2091, ++ 0x5000, 0x2091, 0x4080, 0x2071, 0x0010, 0x20c1, 0x00f0, 0x0804, ++ 0x0427, 0x81ff, 0x1904, 0x3179, 0x7924, 0x810f, 0xa18c, 0x00ff, ++ 0x080c, 0x533d, 0x1904, 0x317c, 0x7e38, 0xa684, 0x3fff, 0xa082, ++ 0x4000, 0x0210, 0x0804, 0x317c, 0x7c28, 0x7d2c, 0x080c, 0x5505, ++ 0xd28c, 0x1118, 0x080c, 0x54ae, 0x0010, 0x080c, 0x54de, 0x1518, ++ 0x2061, 0xce00, 0x0126, 0x2091, 0x8000, 0x6000, 0xa086, 0x0000, ++ 0x0148, 0x6010, 0xa06d, 0x0130, 0x683c, 0xa406, 0x1118, 0x6840, ++ 0xa506, 0x0150, 0x012e, 0xace0, 0x0018, 0x2001, 0xc617, 0x2004, ++ 0xac02, 0x1a04, 0x3179, 0x0c30, 0x080c, 0xa961, 0x012e, 0x0904, ++ 0x3179, 0x0804, 0x3154, 0xa00e, 0x2001, 0x0005, 0x080c, 0x592e, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0xaf09, 0x080c, 0x580a, 0x012e, ++ 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, 0x0904, ++ 0x317c, 0x080c, 0x5403, 0x0904, 0x3179, 0x080c, 0x5511, 0x0904, ++ 0x3179, 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x404b, ++ 0x0904, 0x317c, 0x080c, 0x557d, 0x0904, 0x3179, 0x2019, 0x0005, ++ 0x7924, 0x080c, 0x552c, 0x0904, 0x3179, 0x7828, 0xa08a, 0x1000, ++ 0x1a04, 0x317c, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x6fb9, ++ 0x0804, 0x3154, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, ++ 0x0001, 0x0450, 0x2029, 0x00ff, 0x6450, 0x2400, 0xa506, 0x01f8, ++ 0x2508, 0x080c, 0x533d, 0x11d8, 0x080c, 0x557d, 0x1128, 0x2009, ++ 0x0002, 0x62b4, 0x2518, 0x00c0, 0x2019, 0x0004, 0xa00e, 0x080c, ++ 0x552c, 0x1118, 0x2009, 0x0006, 0x0078, 0x7824, 0xa08a, 0x1000, ++ 0x1270, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x6fb9, 0x8529, ++ 0x1ae0, 0x012e, 0x0804, 0x3154, 0x012e, 0x0804, 0x3179, 0x012e, ++ 0x0804, 0x317c, 0x080c, 0x403b, 0x0904, 0x317c, 0x080c, 0x5469, ++ 0x080c, 0x5505, 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, ++ 0x403b, 0x0904, 0x317c, 0x080c, 0x545a, 0x080c, 0x5505, 0x0804, ++ 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, 0x0904, 0x317c, ++ 0x080c, 0x54e0, 0x0904, 0x3179, 0x080c, 0x5221, 0x080c, 0x54a7, ++ 0x080c, 0x5505, 0x0804, 0x3154, 0x080c, 0x403b, 0x0904, 0x317c, ++ 0x080c, 0x5403, 0x0904, 0x3179, 0x62a0, 0x2019, 0x0005, 0x00c6, ++ 0x080c, 0x553e, 0x2061, 0x0000, 0x080c, 0x7b16, 0x0076, 0x2039, ++ 0x0000, 0x080c, 0x7a0e, 0x2009, 0x0000, 0x080c, 0xbef7, 0x007e, ++ 0x00ce, 0x080c, 0x5505, 0x0804, 0x3154, 0x080c, 0x403b, 0x0904, ++ 0x317c, 0x080c, 0x5505, 0x2208, 0x0804, 0x3154, 0x0156, 0x00d6, ++ 0x00e6, 0x2069, 0xc734, 0x6810, 0x6914, 0xa10a, 0x1210, 0x2009, ++ 0x0000, 0x6816, 0x2011, 0x0000, 0x2019, 0x0000, 0x20a9, 0x007e, ++ 0x2069, 0xc77b, 0x2d04, 0xa075, 0x0130, 0x704c, 0x0071, 0xa210, ++ 0x7080, 0x0059, 0xa318, 0x8d68, 0x1f04, 0x33c2, 0x2300, 0xa218, ++ 0x00ee, 0x00de, 0x015e, 0x0804, 0x3154, 0x00f6, 0x0016, 0xa07d, ++ 0x0140, 0x2001, 0x0000, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, ++ 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0xc734, 0x6910, 0x62b0, ++ 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x6150, 0xa190, 0x2f6e, ++ 0x2215, 0xa294, 0x00ff, 0x6370, 0x83ff, 0x0108, 0x6274, 0x67d4, ++ 0xd79c, 0x0118, 0x2031, 0x0001, 0x0090, 0xd7ac, 0x0118, 0x2031, ++ 0x0003, 0x0068, 0xd7a4, 0x0118, 0x2031, 0x0002, 0x0040, 0x080c, ++ 0x5f22, 0x1118, 0x2031, 0x0004, 0x0010, 0x2031, 0x0000, 0x7e3a, ++ 0x7f3e, 0x0804, 0x3154, 0x6140, 0x6244, 0x2019, 0xc8fd, 0x231c, ++ 0x0804, 0x3154, 0x0126, 0x2091, 0x8000, 0x6134, 0xa006, 0x2010, ++ 0x6338, 0x012e, 0x0804, 0x3154, 0x080c, 0x404b, 0x0904, 0x317c, ++ 0x6244, 0x6338, 0x0804, 0x3154, 0x6140, 0x6244, 0x7824, 0x6042, ++ 0x7b28, 0x6346, 0x2069, 0xc652, 0x831f, 0xa305, 0x6816, 0x782c, ++ 0x2069, 0xc8fd, 0x2d1c, 0x206a, 0x0804, 0x3154, 0x0126, 0x2091, ++ 0x8000, 0x7824, 0x6036, 0x782c, 0x603a, 0x012e, 0x0804, 0x3154, ++ 0x7838, 0xa005, 0x01a8, 0x7828, 0xa025, 0x0904, 0x317c, 0x782c, ++ 0xa02d, 0x0904, 0x317c, 0xa00e, 0x080c, 0x533d, 0x1120, 0x6244, ++ 0x6338, 0x6446, 0x653a, 0xa186, 0x00ff, 0x0190, 0x8108, 0x0ca0, ++ 0x080c, 0x404b, 0x0904, 0x317c, 0x7828, 0xa00d, 0x0904, 0x317c, ++ 0x782c, 0xa005, 0x0904, 0x317c, 0x6244, 0x6146, 0x6338, 0x603a, ++ 0x0804, 0x3154, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1904, ++ 0x3179, 0x00c6, 0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, ++ 0xa196, 0x00ff, 0x1130, 0x2001, 0xc615, 0x2004, 0xa085, 0xff00, ++ 0x0078, 0xa182, 0x007f, 0x16a0, 0xa188, 0x2f6e, 0x210d, 0xa18c, ++ 0x00ff, 0x2001, 0xc615, 0x2004, 0xa116, 0x0550, 0x810f, 0xa105, ++ 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x958d, 0x000e, 0x01e0, ++ 0x601a, 0x600b, 0xbc09, 0x601f, 0x0001, 0x080c, 0x4026, 0x01d8, ++ 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, ++ 0x683a, 0x701b, 0x351a, 0x2d00, 0x6012, 0x2009, 0x0032, 0x080c, ++ 0x9613, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x3179, ++ 0x00ce, 0x0804, 0x317c, 0x080c, 0x95e3, 0x0cb0, 0x2001, 0xc600, ++ 0x2004, 0xa086, 0x0003, 0x1904, 0x3179, 0x00c6, 0x2061, 0x0100, ++ 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff, 0x1130, 0x2001, ++ 0xc615, 0x2004, 0xa085, 0xff00, 0x0078, 0xa182, 0x007f, 0x16a0, ++ 0xa188, 0x2f6e, 0x210d, 0xa18c, 0x00ff, 0x2001, 0xc615, 0x2004, ++ 0xa116, 0x0550, 0x810f, 0xa105, 0x0126, 0x2091, 0x8000, 0x0006, ++ 0x080c, 0x958d, 0x000e, 0x01e0, 0x601a, 0x600b, 0xbc05, 0x601f, ++ 0x0001, 0x080c, 0x4026, 0x01d8, 0x6837, 0x0000, 0x7007, 0x0003, ++ 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x701b, 0x351a, 0x2d00, ++ 0x6012, 0x2009, 0x0032, 0x080c, 0x9613, 0x012e, 0x00ce, 0x0005, ++ 0x012e, 0x00ce, 0x0804, 0x3179, 0x00ce, 0x0804, 0x317c, 0x080c, ++ 0x95e3, 0x0cb0, 0x6830, 0xa086, 0x0100, 0x0904, 0x3179, 0x0804, ++ 0x3154, 0x2061, 0xc9bc, 0x0126, 0x2091, 0x8000, 0x6000, 0xd084, ++ 0x0178, 0x6104, 0x6208, 0x2a60, 0x6068, 0x783a, 0x60b4, 0x783e, ++ 0x60b0, 0x2019, 0x0072, 0x201a, 0x6348, 0x012e, 0x0804, 0x3154, ++ 0xa00e, 0x2110, 0x0c80, 0x81ff, 0x1904, 0x3179, 0x080c, 0x5f22, ++ 0x0904, 0x3179, 0x0126, 0x2091, 0x8000, 0x6248, 0x6068, 0xa202, ++ 0x0248, 0xa085, 0x0001, 0x080c, 0x2a11, 0x080c, 0x4968, 0x012e, ++ 0x0804, 0x3154, 0x012e, 0x0804, 0x317c, 0x0006, 0x0016, 0x00c6, ++ 0x00e6, 0x2001, 0xc906, 0x2070, 0x2061, 0xc652, 0x6008, 0x2072, ++ 0x2009, 0x0000, 0x2011, 0x1000, 0x080c, 0x783f, 0x7206, 0x00ee, ++ 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7824, ++ 0xa084, 0x0007, 0x0002, 0x357e, 0x3587, 0x358e, 0x357b, 0x357b, ++ 0x357b, 0x357b, 0x357b, 0x012e, 0x0804, 0x317c, 0x2009, 0x0114, ++ 0x2104, 0xa085, 0x0800, 0x200a, 0x080c, 0x36f9, 0x0070, 0x2009, ++ 0x010b, 0x200b, 0x0010, 0x080c, 0x36f9, 0x0038, 0x81ff, 0x0128, ++ 0x012e, 0x2021, 0x400b, 0x0804, 0x3156, 0x0086, 0x0096, 0x00a6, ++ 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3555, 0x2009, ++ 0x0101, 0x210c, 0x0016, 0x2001, 0x0138, 0x200c, 0x2003, 0x0001, ++ 0x0016, 0x2001, 0x007a, 0x2034, 0x2001, 0x007b, 0x202c, 0xa006, ++ 0x2048, 0x2050, 0x2058, 0x080c, 0x3944, 0x080c, 0x38a8, 0xa03e, ++ 0x2720, 0x00f6, 0x00e6, 0x00c6, 0x2d60, 0x2071, 0xc992, 0x2079, ++ 0x0020, 0x00d6, 0x2069, 0x0000, 0x6824, 0xd0b4, 0x0140, 0x2001, ++ 0x007d, 0x2004, 0x783e, 0x2001, 0x007c, 0x2004, 0x783a, 0x00de, ++ 0x2011, 0x0001, 0x080c, 0x3854, 0x080c, 0x3854, 0x00ce, 0x00ee, ++ 0x00fe, 0x080c, 0x379f, 0x080c, 0x387c, 0x080c, 0x37f9, 0x080c, ++ 0x375e, 0x080c, 0x378f, 0x00f6, 0x2079, 0x0100, 0x7824, 0xd094, ++ 0x0530, 0x7814, 0xa084, 0x0184, 0xa085, 0x0010, 0x7816, 0x2079, ++ 0x0140, 0x080c, 0x36d7, 0x1110, 0x00fe, 0x0430, 0x7804, 0xd0dc, ++ 0x0dc0, 0x2079, 0x0100, 0x7827, 0x0086, 0x7814, 0xa084, 0x0184, ++ 0xa085, 0x0032, 0x7816, 0x080c, 0x36d7, 0x1110, 0x00fe, 0x00a0, ++ 0x7824, 0xd0bc, 0x0dc0, 0x7827, 0x0080, 0xa026, 0x7c16, 0x7824, ++ 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x36e1, 0x00fe, 0x0804, 0x36a1, ++ 0x00fe, 0x080c, 0x36d7, 0x1150, 0x8948, 0x2001, 0x007a, 0x2602, ++ 0x2001, 0x007b, 0x2502, 0x080c, 0x36e1, 0x0088, 0x87ff, 0x0140, ++ 0x2001, 0x0201, 0x2004, 0xa005, 0x1904, 0x35db, 0x8739, 0x0038, ++ 0x2001, 0xc96a, 0x2004, 0xa086, 0x0000, 0x1904, 0x35db, 0x2001, ++ 0x0033, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0xa605, ++ 0x0904, 0x36a1, 0x7824, 0xd0bc, 0x0128, 0x2900, 0xaa05, 0xab05, ++ 0x1904, 0x36a1, 0x6033, 0x000d, 0x2001, 0x0030, 0x2003, 0x0004, ++ 0x7824, 0xd0ac, 0x1148, 0x2001, 0xc96a, 0x2003, 0x0003, 0x2001, ++ 0x0030, 0x2003, 0x0009, 0x0040, 0x6027, 0x0001, 0x2001, 0x0075, ++ 0x2004, 0xa005, 0x0108, 0x6026, 0x2c00, 0x601a, 0x20e1, 0x9040, ++ 0x2d00, 0x681a, 0x6833, 0x000d, 0x7824, 0xd0a4, 0x1180, 0x6827, ++ 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0020, 0x6003, 0x0008, ++ 0x2001, 0x0203, 0x2004, 0x1f04, 0x3676, 0x00ce, 0x0040, 0x6827, ++ 0x0001, 0x2001, 0x0074, 0x2004, 0xa005, 0x0108, 0x6826, 0x00f6, ++ 0x00c6, 0x2079, 0x0100, 0x2061, 0x0020, 0x7827, 0x0002, 0x2001, ++ 0x0072, 0x2004, 0xa084, 0xfff8, 0x601a, 0x0006, 0x2001, 0x0073, ++ 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804, ++ 0x35b9, 0x2061, 0x0100, 0x6027, 0x0002, 0x001e, 0x61e2, 0x001e, ++ 0x6106, 0x7824, 0xa084, 0x0003, 0xa086, 0x0002, 0x0188, 0x20e1, ++ 0x9028, 0x6050, 0xa084, 0xf7ef, 0x6052, 0x602f, 0x0000, 0x602c, ++ 0xc0ac, 0x602e, 0x604b, 0xf7f7, 0x6043, 0x0090, 0x6043, 0x0010, ++ 0x2908, 0x2a10, 0x2b18, 0x2b00, 0xaa05, 0xa905, 0x00fe, 0x00ee, ++ 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x1118, 0x012e, ++ 0x0804, 0x3154, 0x012e, 0x2021, 0x400c, 0x0804, 0x3156, 0xa085, ++ 0x0001, 0x1d04, 0x36e0, 0x2091, 0x6000, 0x8420, 0xa486, 0x0064, ++ 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, 0x2001, 0x0030, 0x2003, ++ 0x0004, 0x2001, 0x0020, 0x2003, 0x0004, 0x2001, 0xc96a, 0x2003, ++ 0x0000, 0x2001, 0xc992, 0x2003, 0x0000, 0x20e1, 0xf000, 0xa026, ++ 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0xc615, 0x200c, 0x7932, ++ 0x7936, 0x080c, 0x29f1, 0x7850, 0xa084, 0x0980, 0xa085, 0x0030, ++ 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, 0xa084, 0x0980, 0x7852, ++ 0x782c, 0xc0ad, 0x782e, 0x20a9, 0x0046, 0x1d04, 0x3715, 0x2091, ++ 0x6000, 0x1f04, 0x3715, 0x7850, 0xa085, 0x0400, 0x7852, 0x2001, ++ 0x0009, 0x2004, 0xa084, 0x0003, 0xa086, 0x0001, 0x1118, 0x782c, ++ 0xc0ac, 0x782e, 0x784b, 0xf7f7, 0x7843, 0x0090, 0x7843, 0x0010, ++ 0x20a9, 0x000e, 0xe000, 0x1f04, 0x3732, 0x7850, 0xa085, 0x1400, ++ 0x7852, 0x2019, 0x61a8, 0x7854, 0xe000, 0xe000, 0xd08c, 0x1110, ++ 0x8319, 0x1dc8, 0x7827, 0x0048, 0x7850, 0xa085, 0x0400, 0x7852, ++ 0x7843, 0x0040, 0x2019, 0x01f4, 0xe000, 0xe000, 0x8319, 0x1de0, ++ 0x2001, 0x0140, 0x2003, 0x0100, 0x7827, 0x0020, 0x7843, 0x0000, ++ 0x2003, 0x0000, 0x7827, 0x0048, 0x00fe, 0x0005, 0x7824, 0xd0ac, ++ 0x11c8, 0x00f6, 0x00e6, 0x2071, 0xc96a, 0x2079, 0x0030, 0x2001, ++ 0x0201, 0x2004, 0xa005, 0x0160, 0x7000, 0xa086, 0x0000, 0x1140, ++ 0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003, 0x0003, 0x7803, 0x0019, ++ 0x00ee, 0x00fe, 0x0005, 0x780c, 0xa08c, 0x0070, 0x0178, 0x2009, ++ 0x007a, 0x260a, 0x2009, 0x007b, 0x250a, 0xd0b4, 0x0108, 0x8a50, ++ 0xd0ac, 0x0108, 0x8948, 0xd0a4, 0x0108, 0x8b58, 0x0005, 0x00f6, ++ 0x2079, 0x0200, 0x781c, 0xd084, 0x0140, 0x20e1, 0x0007, 0x20e1, ++ 0x2000, 0x2001, 0x020a, 0x2004, 0x0ca8, 0x00fe, 0x0005, 0x00e6, ++ 0x2071, 0x0100, 0x2001, 0xc907, 0x2004, 0x70e2, 0x2009, 0xc615, ++ 0x210c, 0x716e, 0x7063, 0x0100, 0x7166, 0x719e, 0x706b, 0x0000, ++ 0x7073, 0x0809, 0x7077, 0x0008, 0x7078, 0xa080, 0x0100, 0x707a, ++ 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa, 0xa006, 0x708a, 0x708e, ++ 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af, 0x95d5, 0x7027, 0x0080, ++ 0x7014, 0xa084, 0x0184, 0xa085, 0x0032, 0x7016, 0x080c, 0x387c, ++ 0x080c, 0x36d7, 0x1110, 0x8421, 0x0028, 0x7024, 0xd0bc, 0x0db0, ++ 0x7027, 0x0080, 0x00f6, 0x00e6, 0x2071, 0xc96a, 0x2079, 0x0030, ++ 0x00d6, 0x2069, 0x0000, 0x6824, 0xd0b4, 0x0120, 0x683c, 0x783e, ++ 0x6838, 0x783a, 0x00de, 0x2011, 0x0011, 0x080c, 0x3854, 0x2011, ++ 0x0001, 0x080c, 0x3854, 0x00ee, 0x00fe, 0x7017, 0x0000, 0x00ee, ++ 0x0005, 0x00f6, 0x00e6, 0x2071, 0xc96a, 0x2079, 0x0030, 0x7904, ++ 0xd1fc, 0x0904, 0x3851, 0x7803, 0x0002, 0xa026, 0xd19c, 0x1904, ++ 0x384d, 0x7000, 0x0002, 0x3851, 0x380f, 0x3833, 0x384d, 0xd1bc, ++ 0x1150, 0xd1dc, 0x1150, 0x8001, 0x7002, 0x2011, 0x0001, 0x04e1, ++ 0x05c0, 0x04d1, 0x04b0, 0x780f, 0x0000, 0x7820, 0x7924, 0x7803, ++ 0x0004, 0x7822, 0x7926, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0de8, ++ 0x080c, 0x377b, 0x2009, 0x0001, 0x7808, 0xd0ec, 0x0110, 0x2009, ++ 0x0011, 0x7902, 0x00f0, 0x8001, 0x7002, 0xa184, 0x0880, 0x1138, ++ 0x7804, 0xd0fc, 0x1940, 0x2011, 0x0001, 0x00b1, 0x0090, 0x6030, ++ 0xa092, 0x0004, 0xa086, 0x0009, 0x1120, 0x6000, 0x601a, 0x2011, ++ 0x0025, 0x6232, 0xd1dc, 0x1988, 0x0870, 0x7803, 0x0004, 0x7003, ++ 0x0000, 0x00ee, 0x00fe, 0x0005, 0x6024, 0xa005, 0x0520, 0x8001, ++ 0x6026, 0x6018, 0x6130, 0xa140, 0x2804, 0x7832, 0x8840, 0x2804, ++ 0x7836, 0x8840, 0x2804, 0x7822, 0x8840, 0x2804, 0x7826, 0x8840, ++ 0x7a02, 0x7000, 0x8000, 0x7002, 0x6018, 0xa802, 0xa08a, 0x0029, ++ 0x1138, 0x6018, 0xa080, 0x0001, 0x2004, 0x601a, 0x2001, 0x000d, ++ 0x6032, 0xa085, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2071, ++ 0xc992, 0x2079, 0x0020, 0x7904, 0xd1fc, 0x01f0, 0x7803, 0x0002, ++ 0x2d60, 0xa026, 0x7000, 0x0002, 0x38a4, 0x388f, 0x389b, 0x8001, ++ 0x7002, 0xd19c, 0x1188, 0x2011, 0x0001, 0x080c, 0x3854, 0x0160, ++ 0x080c, 0x3854, 0x0048, 0x8001, 0x7002, 0x7804, 0xd0fc, 0x1d30, ++ 0x2011, 0x0001, 0x080c, 0x3854, 0x00ce, 0x00ee, 0x00fe, 0x0005, ++ 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0xc907, 0x2004, ++ 0x601a, 0x2061, 0x0100, 0x2001, 0xc906, 0x2004, 0x60ce, 0x6004, ++ 0xc0ac, 0xa085, 0x0200, 0x6006, 0x2001, 0x0074, 0x2004, 0xa005, ++ 0x01f8, 0x2038, 0x2001, 0x0076, 0x2024, 0x2001, 0x0077, 0x201c, ++ 0x080c, 0x4026, 0x6833, 0x000d, 0x6f26, 0x2d00, 0x681a, 0xa78a, ++ 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0xa03e, ++ 0x6818, 0xa080, 0x000d, 0x04b1, 0x1d90, 0x2d00, 0x681a, 0x0088, ++ 0x080c, 0x4026, 0x6833, 0x000d, 0x2070, 0x6827, 0x0001, 0x2d00, ++ 0x681a, 0x2001, 0x0076, 0x2004, 0x2072, 0x2001, 0x0077, 0x2004, ++ 0x7006, 0x2061, 0x0020, 0x2079, 0x0100, 0x2001, 0xc906, 0x2004, ++ 0x6012, 0x20e1, 0x9040, 0x2001, 0x0072, 0x2004, 0xa084, 0xfff8, ++ 0x700a, 0x601a, 0x0006, 0x2001, 0x0073, 0x2004, 0x700e, 0x601e, ++ 0x78c6, 0x000e, 0x78ca, 0xa006, 0x603a, 0x603e, 0x00ce, 0x00ee, ++ 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0010, 0x20a0, 0x2099, 0x0014, ++ 0x7003, 0x0026, 0x7432, 0x7336, 0xa006, 0x703a, 0x703e, 0x810b, ++ 0x810b, 0x21a8, 0x810b, 0x7122, 0x7003, 0x0041, 0x7004, 0xd0fc, ++ 0x0de8, 0x7003, 0x0002, 0x7003, 0x0040, 0x53a5, 0x7430, 0x7334, ++ 0x87ff, 0x0180, 0x00c6, 0x00d6, 0x2d60, 0x00c6, 0x080c, 0x4026, ++ 0x00ce, 0x6018, 0x2070, 0x2d00, 0x7006, 0x601a, 0x00de, 0x00ce, ++ 0xa085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x2001, 0x0075, 0x2004, ++ 0xa005, 0x0508, 0x2038, 0x2001, 0x0078, 0x2024, 0x2001, 0x0079, ++ 0x201c, 0x080c, 0x4026, 0x2d60, 0x6833, 0x000d, 0x6f26, 0x2d00, ++ 0x681a, 0xa78a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, ++ 0x2708, 0xa03e, 0x6818, 0xa080, 0x000d, 0x080c, 0x3912, 0x1d88, ++ 0x2d00, 0x681a, 0x00e0, 0x080c, 0x4026, 0x2d60, 0x6033, 0x000d, ++ 0x2070, 0x6027, 0x0001, 0x2c00, 0x601a, 0x2001, 0x0078, 0x2004, ++ 0x2072, 0x2001, 0x0079, 0x2004, 0x7006, 0x2001, 0x0072, 0x2004, ++ 0xa084, 0xfff8, 0x700a, 0x2001, 0x0073, 0x2004, 0x700e, 0x2001, ++ 0x0030, 0x2003, 0x0004, 0x7824, 0xd0ac, 0x1178, 0x2001, 0x0101, ++ 0x200c, 0xc1ed, 0x2102, 0x6027, 0x0000, 0x2001, 0xc96a, 0x2003, ++ 0x0003, 0x2001, 0x0030, 0x2003, 0x0009, 0x00ee, 0x0005, 0x0804, ++ 0x3154, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0012, 0x2001, 0xc640, ++ 0x20a0, 0xa006, 0x40a4, 0x012e, 0x0804, 0x3154, 0x7d38, 0x7c3c, ++ 0x0804, 0x31fb, 0x080c, 0x4026, 0x0904, 0x3179, 0x080c, 0x5f22, ++ 0x0110, 0x080c, 0x4f2c, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, ++ 0x7d38, 0x080c, 0x4067, 0x701b, 0x39c6, 0x0005, 0xade8, 0x000d, ++ 0x6800, 0xa005, 0x0904, 0x317c, 0x6804, 0xd0ac, 0x0118, 0xd0a4, ++ 0x0904, 0x317c, 0xd094, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0138, ++ 0x6200, 0xa292, 0x0005, 0x0218, 0xa18c, 0xffdf, 0x0010, 0xa18d, ++ 0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6, 0x2061, 0x0100, 0x6104, ++ 0x0118, 0xa18d, 0x0010, 0x0010, 0xa18c, 0xffef, 0x6106, 0x00ce, ++ 0x2009, 0x0100, 0x210c, 0xa18a, 0x0002, 0x0268, 0xd084, 0x0158, ++ 0x6a28, 0xa28a, 0x007f, 0x1a04, 0x317c, 0xa288, 0x2f6e, 0x210d, ++ 0xa18c, 0x00ff, 0x615a, 0xd0dc, 0x0130, 0x6828, 0xa08a, 0x007f, ++ 0x1a04, 0x317c, 0x6052, 0x6808, 0xa08a, 0x0100, 0x0a04, 0x317c, ++ 0xa08a, 0x0841, 0x1a04, 0x317c, 0xa084, 0x0007, 0x1904, 0x317c, ++ 0x680c, 0xa005, 0x0904, 0x317c, 0x6810, 0xa005, 0x0904, 0x317c, ++ 0x6848, 0x6940, 0xa10a, 0x1a04, 0x317c, 0x8001, 0x0904, 0x317c, ++ 0x684c, 0x6944, 0xa10a, 0x1a04, 0x317c, 0x8001, 0x0904, 0x317c, ++ 0x6804, 0xd0fc, 0x0560, 0x080c, 0x4026, 0x0904, 0x3179, 0x2009, ++ 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0xa290, 0x0038, 0xa399, ++ 0x0000, 0x080c, 0x4067, 0x701b, 0x3a46, 0x0005, 0xade8, 0x000d, ++ 0x20a9, 0x0014, 0x2d98, 0x2069, 0xc66e, 0x2da0, 0x53a3, 0x7010, ++ 0xa0e8, 0x000d, 0x2001, 0xc672, 0x200c, 0xd1e4, 0x0140, 0x00c6, ++ 0x2061, 0x0100, 0x6004, 0xa085, 0x0b00, 0x6006, 0x00ce, 0x2009, ++ 0xc8f8, 0x200b, 0x0000, 0x2001, 0xc674, 0x2004, 0xd0ac, 0x0158, ++ 0x7824, 0x200a, 0x2009, 0x017f, 0x200a, 0x3200, 0xa084, 0x003f, ++ 0xa085, 0x3020, 0x2090, 0x20a9, 0x001c, 0x2d98, 0x2069, 0xc652, ++ 0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff, 0x6142, 0x8007, 0xa084, ++ 0x00ff, 0x6046, 0x080c, 0x61f8, 0x080c, 0x576e, 0x080c, 0x57d7, ++ 0x6000, 0xa086, 0x0000, 0x1904, 0x3b41, 0x6808, 0x602a, 0x080c, ++ 0x25bb, 0x0006, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x000e, ++ 0x0268, 0x2009, 0x0170, 0x200b, 0x0080, 0xe000, 0xe000, 0x200b, ++ 0x0000, 0x0036, 0x6b08, 0x080c, 0x2a4c, 0x003e, 0x6818, 0x691c, ++ 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016, 0x611a, ++ 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148, 0x6830, 0x6934, 0x6a38, ++ 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0010, 0xa084, 0xf0ff, ++ 0x6006, 0x610a, 0x620e, 0x6312, 0x8007, 0x810f, 0x8217, 0x831f, ++ 0x20a9, 0x0004, 0x20a1, 0xc90d, 0x40a1, 0x080c, 0x707c, 0x6904, ++ 0xd1fc, 0x0520, 0x00c6, 0x2009, 0x0000, 0x20a9, 0x0001, 0x6b70, ++ 0xd384, 0x01c8, 0x0020, 0x839d, 0x12b0, 0x3508, 0x8109, 0x080c, ++ 0x67ed, 0x6878, 0x6016, 0x6874, 0x2008, 0xa084, 0xff00, 0x8007, ++ 0x600a, 0xa184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, ++ 0x0010, 0x6003, 0x0001, 0x1f04, 0x3adb, 0x00ce, 0x2069, 0xc652, ++ 0x2001, 0xc8e5, 0x6a80, 0xa294, 0x0030, 0xa28e, 0x0000, 0x0170, ++ 0xa28e, 0x0010, 0x0118, 0xa28e, 0x0020, 0x0140, 0x2003, 0xaaaa, ++ 0x080c, 0x2a95, 0x2001, 0xc8d6, 0x2102, 0x0008, 0x2102, 0x00c6, ++ 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, ++ 0x5f22, 0x0128, 0x080c, 0x440b, 0x0110, 0x080c, 0x2a11, 0x60c8, ++ 0xa005, 0x01d0, 0x6003, 0x0001, 0x2009, 0x3b27, 0x00e0, 0x080c, ++ 0x5f22, 0x1178, 0x2011, 0x5df5, 0x080c, 0x6fad, 0x2011, 0x5de8, ++ 0x080c, 0x7070, 0x2001, 0xc8e6, 0x2003, 0x0000, 0x080c, 0x5e5a, ++ 0x0040, 0x080c, 0x4e5b, 0x0028, 0x6003, 0x0004, 0x2009, 0x3b41, ++ 0x0010, 0x0804, 0x3154, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, ++ 0x0258, 0x2001, 0x0170, 0x2004, 0xa084, 0x00ff, 0xa086, 0x004c, ++ 0x1118, 0x2091, 0x309d, 0x0817, 0x2091, 0x301d, 0x0817, 0x6000, ++ 0xa086, 0x0000, 0x0904, 0x3179, 0x2069, 0xc652, 0x7830, 0x6842, ++ 0x7834, 0x6846, 0x6804, 0xd0fc, 0x0118, 0x2009, 0x0030, 0x0010, ++ 0x2009, 0x001c, 0x2d00, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, ++ 0x406a, 0xa006, 0x080c, 0x2a11, 0x81ff, 0x1904, 0x3179, 0x080c, ++ 0x5f22, 0x1178, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, ++ 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5f66, 0x080c, 0x5e5a, ++ 0x0020, 0x080c, 0x4f2c, 0x080c, 0x4e5b, 0x0804, 0x3154, 0x81ff, ++ 0x1904, 0x3179, 0x080c, 0x5f22, 0x1110, 0x0804, 0x3179, 0x6188, ++ 0x81ff, 0x0198, 0x703f, 0x0000, 0x2001, 0xcdc0, 0x2009, 0x0040, ++ 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0x406a, 0x701b, 0x3152, 0x012e, 0x0005, 0x703f, 0x0001, 0x00d6, ++ 0x2069, 0xcdc0, 0x20a9, 0x0040, 0x20a1, 0xcdc0, 0x2019, 0xffff, ++ 0x43a4, 0x6550, 0xa588, 0x2f6e, 0x210d, 0xa18c, 0x00ff, 0x216a, ++ 0xa00e, 0x2011, 0x0002, 0x2100, 0xa506, 0x01a8, 0x080c, 0x533d, ++ 0x1190, 0x6014, 0x821c, 0x0238, 0xa398, 0xcdc0, 0xa085, 0xff00, ++ 0x8007, 0x201a, 0x0038, 0xa398, 0xcdc0, 0x2324, 0xa4a4, 0xff00, ++ 0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x1208, 0x0c18, ++ 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a, 0x00de, 0x20a9, 0x0040, ++ 0x20a1, 0xcdc0, 0x2099, 0xcdc0, 0x080c, 0x4ecb, 0x0804, 0x3b9c, ++ 0x080c, 0x404b, 0x0904, 0x317c, 0x00c6, 0x080c, 0x4026, 0x00ce, ++ 0x1120, 0x2009, 0x0002, 0x0804, 0x3179, 0x2001, 0xc653, 0x2004, ++ 0xd0b4, 0x0550, 0x7824, 0xa084, 0xff00, 0xa08e, 0x7e00, 0x0520, ++ 0xa08e, 0x7f00, 0x0508, 0xa08e, 0x8000, 0x01f0, 0x6000, 0xd08c, ++ 0x11d8, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x11a8, 0x6837, ++ 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0xae11, 0x1120, 0x2009, ++ 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, 0x3c28, 0x0005, ++ 0x080c, 0x404b, 0x0904, 0x317c, 0x20a9, 0x002b, 0x2c98, 0xade8, ++ 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004, 0xac80, 0x0006, 0x2098, ++ 0xad80, 0x0006, 0x20a0, 0x080c, 0x4ecb, 0x20a9, 0x0004, 0xac80, ++ 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0, 0x080c, 0x4ecb, 0x2d00, ++ 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x406a, ++ 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, 0x0904, 0x317c, 0x080c, ++ 0x551a, 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x7828, 0xa08a, ++ 0x1000, 0x1a04, 0x317c, 0x080c, 0x404b, 0x0904, 0x317c, 0x080c, ++ 0x557d, 0x0904, 0x3179, 0x2019, 0x0004, 0xa00e, 0x080c, 0x552c, ++ 0x7924, 0x810f, 0x7a28, 0x0011, 0x0804, 0x3154, 0xa186, 0x00ff, ++ 0x0110, 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0xc600, 0x6450, ++ 0x2400, 0xa506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, ++ 0x080c, 0x533d, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0xa108, ++ 0x080c, 0x6fb9, 0x0005, 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, ++ 0x0904, 0x317c, 0x080c, 0x5403, 0x0904, 0x3179, 0x080c, 0x5523, ++ 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x403b, 0x0904, ++ 0x317c, 0x080c, 0x5403, 0x0904, 0x3179, 0x080c, 0x5511, 0x0804, ++ 0x3154, 0x6100, 0x0804, 0x3154, 0x080c, 0x404b, 0x0904, 0x317c, ++ 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1904, 0x3179, 0x00d6, ++ 0xace8, 0x000a, 0x7924, 0xd184, 0x0110, 0xace8, 0x0006, 0x680c, ++ 0x8007, 0x783e, 0x6808, 0x8007, 0x783a, 0x6b04, 0x831f, 0x6a00, ++ 0x8217, 0x00de, 0x6100, 0xa18c, 0x0200, 0x0804, 0x3154, 0x7824, ++ 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x1a04, 0x3179, 0x6250, 0xa294, ++ 0x00ff, 0xa084, 0xff00, 0x8007, 0xa206, 0x1150, 0x2001, 0xc640, ++ 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x406a, ++ 0x81ff, 0x1904, 0x3179, 0x080c, 0x404b, 0x0904, 0x317c, 0x6004, ++ 0xa084, 0x00ff, 0xa086, 0x0006, 0x1904, 0x3179, 0x00c6, 0x080c, ++ 0x4026, 0x00ce, 0x0904, 0x3179, 0x6837, 0x0000, 0x6838, 0xc0fd, ++ 0x683a, 0x080c, 0xadbd, 0x0904, 0x3179, 0x7007, 0x0003, 0x701b, ++ 0x3d12, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x3179, 0xad80, ++ 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, ++ 0x406a, 0xa006, 0x080c, 0x2a11, 0x7824, 0xa084, 0x00ff, 0xa086, ++ 0x00ff, 0x0118, 0x81ff, 0x1904, 0x3179, 0x080c, 0x5f22, 0x0110, ++ 0x080c, 0x4f2c, 0x7828, 0xa08a, 0x1000, 0x1a04, 0x317c, 0x7924, ++ 0xa18c, 0xff00, 0x810f, 0xa186, 0x00ff, 0x0138, 0xa182, 0x007f, ++ 0x1a04, 0x317c, 0x2100, 0x080c, 0x29db, 0x0026, 0x00c6, 0x0126, ++ 0x2091, 0x8000, 0x2061, 0xc93a, 0x601b, 0x0000, 0x601f, 0x0000, ++ 0x080c, 0x5f22, 0x1178, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, ++ 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5f66, 0x080c, ++ 0x5e5a, 0x0420, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, ++ 0x080c, 0x8f18, 0x080c, 0x8dee, 0x0036, 0x2019, 0x0000, 0x080c, ++ 0x8e79, 0x003e, 0x2061, 0x0100, 0x2001, 0xc615, 0x2004, 0xa084, ++ 0x00ff, 0x810f, 0xa105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, ++ 0x2009, 0x002d, 0x2011, 0x4e90, 0x080c, 0x7036, 0x7924, 0xa18c, ++ 0xff00, 0x810f, 0x080c, 0x5f22, 0x1110, 0x2009, 0x00ff, 0x7a28, ++ 0x080c, 0x3c76, 0x012e, 0x00ce, 0x002e, 0x0804, 0x3154, 0x7924, ++ 0xa18c, 0xff00, 0x810f, 0x00c6, 0x080c, 0x52e1, 0x2c08, 0x00ce, ++ 0x1904, 0x317c, 0x0804, 0x3154, 0x81ff, 0x0120, 0x2009, 0x0001, ++ 0x0804, 0x3179, 0x60d4, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, ++ 0x0005, 0x0804, 0x3179, 0x080c, 0x4026, 0x1120, 0x2009, 0x0002, ++ 0x0804, 0x3179, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, ++ 0x4067, 0x701b, 0x3dc4, 0x0005, 0x2009, 0x0080, 0x080c, 0x533d, ++ 0x1130, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0120, 0x2021, ++ 0x400a, 0x0804, 0x3156, 0x00d6, 0xade8, 0x000d, 0x6900, 0x6a08, ++ 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be, 0x0100, 0x0904, ++ 0x3e3b, 0xa0be, 0x0112, 0x0904, 0x3e3b, 0xa0be, 0x0113, 0x0904, ++ 0x3e3b, 0xa0be, 0x0114, 0x0904, 0x3e3b, 0xa0be, 0x0117, 0x0904, ++ 0x3e3b, 0xa0be, 0x011a, 0x0904, 0x3e3b, 0xa0be, 0x011c, 0x0904, ++ 0x3e3b, 0xa0be, 0x0121, 0x05b0, 0xa0be, 0x0131, 0x0598, 0xa0be, ++ 0x0171, 0x05c8, 0xa0be, 0x0173, 0x05b0, 0xa0be, 0x01a1, 0x1120, ++ 0x6830, 0x8007, 0x6832, 0x04a8, 0xa0be, 0x0212, 0x0540, 0xa0be, ++ 0x0213, 0x0528, 0xa0be, 0x0214, 0x01b0, 0xa0be, 0x0217, 0x0168, ++ 0xa0be, 0x021a, 0x1120, 0x6838, 0x8007, 0x683a, 0x00e0, 0xa0be, ++ 0x0300, 0x01c8, 0x00de, 0x0804, 0x317c, 0xad80, 0x0010, 0x20a9, ++ 0x0007, 0x080c, 0x3e81, 0xad80, 0x000e, 0x20a9, 0x0001, 0x080c, ++ 0x3e81, 0x0048, 0xad80, 0x000c, 0x080c, 0x3e8f, 0x0050, 0xad80, ++ 0x000e, 0x080c, 0x3e8f, 0xad80, 0x000c, 0x20a9, 0x0001, 0x080c, ++ 0x3e81, 0x00c6, 0x080c, 0x4026, 0x0568, 0x6838, 0xc0fd, 0x683a, ++ 0x6837, 0x0119, 0x6853, 0x0000, 0x684f, 0x0020, 0x685b, 0x0001, ++ 0x810b, 0x697e, 0x6883, 0x0000, 0x6a86, 0x6b8a, 0x6c8e, 0x6d92, ++ 0x6996, 0x689b, 0x0000, 0x00ce, 0x00de, 0x6837, 0x0000, 0x6838, ++ 0xc0fd, 0x683a, 0x6823, 0x0000, 0x6804, 0x2068, 0x080c, 0xadd9, ++ 0x1120, 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, ++ 0x3e78, 0x0005, 0x00ce, 0x00de, 0x2009, 0x0002, 0x0804, 0x3179, ++ 0x6820, 0xa086, 0x8001, 0x1904, 0x3154, 0x2009, 0x0004, 0x0804, ++ 0x3179, 0x0016, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a, ++ 0x8108, 0x280a, 0x8108, 0x1f04, 0x3e83, 0x001e, 0x0005, 0x0016, ++ 0x00a6, 0x00b6, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x2054, ++ 0x8000, 0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108, ++ 0x280a, 0x00be, 0x00ae, 0x001e, 0x0005, 0x81ff, 0x0120, 0x2009, ++ 0x0001, 0x0804, 0x3179, 0x60d4, 0xd0ac, 0x1130, 0xd09c, 0x1120, ++ 0x2009, 0x0005, 0x0804, 0x3179, 0x7924, 0x2140, 0xa18c, 0xff00, ++ 0x810f, 0x60d4, 0xd0ac, 0x1120, 0xa182, 0x0080, 0x0a04, 0x317c, ++ 0xa182, 0x00ff, 0x1a04, 0x317c, 0x7a2c, 0x7b28, 0x6070, 0xa306, ++ 0x1140, 0x6074, 0xa24e, 0x0904, 0x317c, 0xa9cc, 0xff00, 0x0904, ++ 0x317c, 0x00c6, 0x080c, 0x3f6e, 0x2c68, 0x00ce, 0x0538, 0xa0c6, ++ 0x4000, 0x1180, 0x00c6, 0x0006, 0x2d60, 0x2009, 0x0000, 0x080c, ++ 0x55de, 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x000e, ++ 0x00ce, 0x0088, 0xa0c6, 0x4007, 0x1110, 0x2408, 0x0060, 0xa0c6, ++ 0x4008, 0x1118, 0x2708, 0x2610, 0x0030, 0xa0c6, 0x4009, 0x1108, ++ 0x0010, 0x2001, 0x4006, 0x2020, 0x0804, 0x3156, 0x2d00, 0x7022, ++ 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x958d, 0x05d8, ++ 0x2d00, 0x601a, 0x080c, 0xb05e, 0x2e58, 0x00ee, 0x00e6, 0x00c6, ++ 0x080c, 0x4026, 0x00ce, 0x2b70, 0x1150, 0x080c, 0x95e3, 0x00ee, ++ 0x00ce, 0x00be, 0x001e, 0x2009, 0x0002, 0x0804, 0x3179, 0x6837, ++ 0x0000, 0x683b, 0x0000, 0x2d00, 0x6012, 0x6833, 0x0000, 0x6838, ++ 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0x683a, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x2e46, 0x012e, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, ++ 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x2009, 0x0002, 0x080c, ++ 0x9613, 0xa085, 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x1120, ++ 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, 0x3f51, ++ 0x0005, 0x6830, 0xa086, 0x0100, 0x7020, 0x2060, 0x1138, 0x2009, ++ 0x0004, 0x6204, 0xa294, 0x00ff, 0x0804, 0x3179, 0x2009, 0x0000, ++ 0x6838, 0xd0f4, 0x1904, 0x3154, 0x080c, 0x55de, 0x1108, 0xc185, ++ 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3154, 0x00e6, 0x00d6, ++ 0x2029, 0x0000, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x0138, 0x2021, ++ 0x0000, 0x20a9, 0x00ff, 0x2071, 0xc77b, 0x0030, 0x2021, 0x0080, ++ 0x20a9, 0x007f, 0x2071, 0xc7fb, 0x2e04, 0xa005, 0x1130, 0x2100, ++ 0xa406, 0x15a0, 0x2428, 0xc5fd, 0x0488, 0x2068, 0x6f10, 0x2700, ++ 0xa306, 0x11e0, 0x6e14, 0x2600, 0xa206, 0x11c0, 0x2400, 0xa106, ++ 0x1190, 0x2d60, 0xd884, 0x0598, 0x080c, 0x56ed, 0x1580, 0x2001, ++ 0x4000, 0x0470, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1538, ++ 0x2001, 0x4000, 0x0428, 0x2001, 0x4007, 0x0410, 0x2400, 0xa106, ++ 0x1168, 0x6e14, 0x87ff, 0x1138, 0x86ff, 0x09a0, 0x2001, 0xc635, ++ 0x2004, 0xd0ac, 0x1978, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, ++ 0x1f04, 0x3f84, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, ++ 0x0001, 0x0030, 0x080c, 0x52e1, 0x1dd0, 0x6312, 0x6216, 0xa006, ++ 0xa005, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x1904, 0x3179, 0x080c, ++ 0x4026, 0x0904, 0x3179, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, ++ 0x7824, 0xa005, 0x0904, 0x317c, 0xa096, 0x00ff, 0x0120, 0xa092, ++ 0x0004, 0x1a04, 0x317c, 0x2010, 0x2d18, 0x080c, 0x2df9, 0x0904, ++ 0x3179, 0x7007, 0x0003, 0x701b, 0x3ff6, 0x0005, 0x6830, 0xa086, ++ 0x0100, 0x0904, 0x3179, 0x0804, 0x3154, 0x7924, 0xa18c, 0xff00, ++ 0x810f, 0x60d4, 0xd0ac, 0x1120, 0xa182, 0x0080, 0x0a04, 0x317c, ++ 0xa182, 0x00ff, 0x1a04, 0x317c, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0xacc1, 0x1188, 0xa190, 0xc77b, 0x2204, 0xa065, 0x0160, 0x080c, ++ 0x4f47, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x0110, 0x6017, 0x0000, ++ 0x012e, 0x0804, 0x3154, 0x012e, 0x0804, 0x3179, 0x080c, 0x1602, ++ 0x0188, 0xa006, 0x6802, 0x7010, 0xa005, 0x1120, 0x2d00, 0x7012, ++ 0x7016, 0x0030, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, ++ 0xad80, 0x000d, 0x0005, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x080c, ++ 0x533d, 0x1130, 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0208, ++ 0xa066, 0x8cff, 0x0005, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0x080c, ++ 0x533d, 0x1128, 0xa6b4, 0x00ff, 0xa682, 0x4000, 0x0208, 0xa066, ++ 0x8cff, 0x0005, 0x0016, 0x7110, 0x81ff, 0x0128, 0x2168, 0x6904, ++ 0x080c, 0x1619, 0x0cc8, 0x7112, 0x7116, 0x001e, 0x0005, 0x2031, ++ 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0xc6f2, 0x6606, 0x6112, ++ 0x600e, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c, 0x164d, ++ 0x7007, 0x0002, 0x701b, 0x3154, 0x0005, 0x00f6, 0x0126, 0x2091, ++ 0x8000, 0x2079, 0x0000, 0x2001, 0xc6b0, 0x2004, 0xa005, 0x1168, ++ 0x0e04, 0x4095, 0x7818, 0xd084, 0x1140, 0x7a22, 0x7b26, 0x7c2a, ++ 0x781b, 0x0001, 0x2091, 0x4080, 0x0408, 0x0016, 0x00c6, 0x00e6, ++ 0x2071, 0xc6a2, 0x7138, 0xa182, 0x0010, 0x0218, 0x7030, 0x2060, ++ 0x0078, 0x7030, 0xa0e0, 0x0004, 0xac82, 0xc6f2, 0x0210, 0x2061, ++ 0xc6b2, 0x2c00, 0x7032, 0x81ff, 0x1108, 0x7036, 0x8108, 0x713a, ++ 0x2262, 0x6306, 0x640a, 0x00ee, 0x00ce, 0x001e, 0x012e, 0x00fe, ++ 0x0005, 0x00e6, 0x2071, 0xc6a2, 0x7038, 0xa005, 0x0570, 0x0126, ++ 0x2091, 0x8000, 0x0e04, 0x40ec, 0x00f6, 0x2079, 0x0000, 0x7818, ++ 0xd084, 0x1508, 0x00c6, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, ++ 0x7826, 0x6008, 0x782a, 0x781b, 0x0001, 0x2091, 0x4080, 0x7038, ++ 0x8001, 0x703a, 0xa005, 0x1130, 0x7033, 0xc6b2, 0x7037, 0xc6b2, ++ 0x00ce, 0x0048, 0xac80, 0x0004, 0xa0fa, 0xc6f2, 0x0210, 0x2001, ++ 0xc6b2, 0x7036, 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, 0x0026, ++ 0x2001, 0xc653, 0x2004, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, ++ 0x407d, 0x002e, 0x0005, 0x81ff, 0x1904, 0x3179, 0x0126, 0x2091, ++ 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x5f22, ++ 0x1178, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, 0x2003, ++ 0x0001, 0xa085, 0x0001, 0x080c, 0x5f66, 0x080c, 0x5e5a, 0x0010, ++ 0x080c, 0x4e5b, 0x012e, 0x0804, 0x3154, 0x7824, 0x2008, 0xa18c, ++ 0xfffd, 0x1128, 0x61e0, 0xa10d, 0x61e2, 0x0804, 0x3154, 0x0804, ++ 0x317c, 0x81ff, 0x1904, 0x3179, 0x6000, 0xa086, 0x0003, 0x1904, ++ 0x3179, 0x2001, 0xc653, 0x2004, 0xd0ac, 0x1904, 0x3179, 0x080c, ++ 0x404b, 0x0904, 0x317c, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, ++ 0x1120, 0x7828, 0xa005, 0x0904, 0x3154, 0x00c6, 0x080c, 0x4026, ++ 0x00ce, 0x0904, 0x3179, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, ++ 0xc0fd, 0x683a, 0x080c, 0xaea2, 0x0904, 0x3179, 0x7007, 0x0003, ++ 0x701b, 0x415b, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x3179, ++ 0x0804, 0x3154, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1904, ++ 0x3179, 0x7f24, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x4026, ++ 0x0904, 0x3179, 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000, ++ 0x702f, 0x0000, 0xad80, 0x0005, 0x7026, 0x20a0, 0x080c, 0x533d, ++ 0x1904, 0x41e1, 0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0148, ++ 0xa0c4, 0xff00, 0xa8c6, 0x0600, 0x0120, 0x080c, 0x56ed, 0x1904, ++ 0x41e1, 0xd794, 0x1110, 0xd784, 0x0158, 0xac80, 0x0006, 0x2098, ++ 0x3400, 0x20a9, 0x0004, 0x53a3, 0x080c, 0x3e8f, 0xd794, 0x0148, ++ 0xac80, 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x080c, ++ 0x3e8f, 0xa186, 0x007e, 0x0178, 0xa186, 0x0080, 0x0160, 0x6004, ++ 0xa084, 0x00ff, 0xa0c2, 0x0006, 0x1210, 0xc1fd, 0x0020, 0x080c, ++ 0x55de, 0x1108, 0xc1fd, 0x21a2, 0xc1fc, 0xd794, 0x01d8, 0xac80, ++ 0x0000, 0x2098, 0x94a0, 0x20a9, 0x0002, 0x53a3, 0xac80, 0x0003, ++ 0x20a6, 0x94a0, 0xac80, 0x0004, 0x2098, 0x3400, 0x20a9, 0x0002, ++ 0x53a3, 0x080c, 0x3e81, 0xac80, 0x0026, 0x2098, 0x20a9, 0x0002, ++ 0x53a3, 0x0008, 0x94a0, 0xd794, 0x0110, 0xa6b0, 0x000b, 0xa6b0, ++ 0x0005, 0x8108, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x0118, 0xa186, ++ 0x0100, 0x0040, 0xd78c, 0x0120, 0xa186, 0x0100, 0x0170, 0x0018, ++ 0xa186, 0x007e, 0x0150, 0xd794, 0x0118, 0xa686, 0x0020, 0x0010, ++ 0xa686, 0x0028, 0x0150, 0x0804, 0x417e, 0x86ff, 0x1120, 0x7120, ++ 0x810b, 0x0804, 0x3154, 0x702f, 0x0001, 0x711e, 0x7020, 0xa600, ++ 0x7022, 0x772a, 0x2061, 0xc6f2, 0x6007, 0x0000, 0x6612, 0x7024, ++ 0x600e, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c, 0x164d, ++ 0x7007, 0x0002, 0x701b, 0x421d, 0x0005, 0x702c, 0xa005, 0x1170, ++ 0x711c, 0x7024, 0x20a0, 0x7728, 0x2031, 0x0000, 0x2061, 0xc6f2, ++ 0x6224, 0x6328, 0x642c, 0x6530, 0x0804, 0x417e, 0x7120, 0x810b, ++ 0x0804, 0x3154, 0x2029, 0x007e, 0x7924, 0x7a28, 0x7b2c, 0x7c38, ++ 0xa184, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x317c, 0xa502, ++ 0x0a04, 0x317c, 0xa184, 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x317c, ++ 0xa502, 0x0a04, 0x317c, 0xa284, 0xff00, 0x8007, 0xa0e2, 0x0020, ++ 0x0a04, 0x317c, 0xa502, 0x0a04, 0x317c, 0xa284, 0x00ff, 0xa0e2, ++ 0x0020, 0x0a04, 0x317c, 0xa502, 0x0a04, 0x317c, 0xa384, 0xff00, ++ 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x317c, 0xa502, 0x0a04, 0x317c, ++ 0xa384, 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x317c, 0xa502, 0x0a04, ++ 0x317c, 0xa484, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x317c, ++ 0xa502, 0x0a04, 0x317c, 0xa484, 0x00ff, 0xa0e2, 0x0020, 0x0a04, ++ 0x317c, 0xa502, 0x0a04, 0x317c, 0x2061, 0xc900, 0x6102, 0x6206, ++ 0x630a, 0x640e, 0x0804, 0x3154, 0x080c, 0x4026, 0x0904, 0x3179, ++ 0x2009, 0x0020, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x4067, ++ 0x701b, 0x429b, 0x0005, 0x0126, 0xade8, 0x000d, 0x2001, 0x0138, ++ 0x2003, 0x0000, 0x00e6, 0x2071, 0xc96a, 0x700c, 0x7110, 0xa106, ++ 0x1de0, 0x00ee, 0x2091, 0x8000, 0x6800, 0xa005, 0x0904, 0x432f, ++ 0x6804, 0x2008, 0xa18c, 0xffe0, 0x1904, 0x432f, 0x680c, 0xa005, ++ 0x0904, 0x432f, 0xa082, 0xff01, 0x1a04, 0x432f, 0x6810, 0xa082, ++ 0x005c, 0x0a04, 0x432f, 0x6824, 0x2008, 0xa082, 0x0008, 0x0a04, ++ 0x432f, 0xa182, 0x0400, 0x1a04, 0x432f, 0x080c, 0x7394, 0x6820, ++ 0x8000, 0x6822, 0x6944, 0x6820, 0xa102, 0x0a04, 0x432f, 0x6828, ++ 0x6944, 0x810c, 0xa102, 0x0a04, 0x432f, 0x6840, 0xa082, 0x000f, ++ 0x1a04, 0x432f, 0x00d6, 0x6848, 0xa005, 0x0148, 0x2008, 0x2069, ++ 0xc600, 0x68e8, 0xa108, 0x68b0, 0xa102, 0x1208, 0x69ea, 0x00de, ++ 0x20a9, 0x0020, 0x2d98, 0x2069, 0xc682, 0x2da0, 0x53a3, 0x00d6, ++ 0x080c, 0x15e5, 0x2d00, 0x00de, 0x0904, 0x4346, 0x684e, 0x080c, ++ 0x725b, 0x05d8, 0x080c, 0x7158, 0x080c, 0x5695, 0x0580, 0x00c6, ++ 0x2061, 0x0100, 0x6104, 0xa18d, 0x8000, 0x6106, 0x610c, 0xa18d, ++ 0x0300, 0xa18c, 0xffbf, 0x610e, 0x2001, 0xc8d4, 0x200c, 0xa18d, ++ 0x0300, 0xa18c, 0xffbf, 0x2102, 0x6b10, 0x2061, 0xc96a, 0x6316, ++ 0x00ce, 0x685f, 0x0000, 0x2001, 0xc696, 0x2003, 0x0000, 0x080c, ++ 0x2a95, 0x2001, 0x0138, 0x2102, 0x012e, 0x0804, 0x3154, 0x080c, ++ 0x2a95, 0x2001, 0x0138, 0x2102, 0x012e, 0x0804, 0x317c, 0x080c, ++ 0x7475, 0x080c, 0x7484, 0x080c, 0x7147, 0x2001, 0xc695, 0x206c, ++ 0x080c, 0x1619, 0x2001, 0xc695, 0x2003, 0x0000, 0x2001, 0xc63a, ++ 0x2003, 0x0010, 0x080c, 0x2a95, 0x2001, 0x0138, 0x2102, 0x012e, ++ 0x0804, 0x3179, 0x2001, 0xc756, 0x2004, 0xa086, 0x0000, 0x0904, ++ 0x3179, 0x080c, 0x768f, 0x1904, 0x3179, 0x2001, 0xc8e5, 0x2004, ++ 0xa086, 0xaaaa, 0x0138, 0x2001, 0xc635, 0x2004, 0xa084, 0x0028, ++ 0x0904, 0x3170, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1904, ++ 0x3179, 0x7924, 0x810c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, ++ 0x4026, 0x0904, 0x3179, 0x080c, 0x4067, 0x701b, 0x4380, 0x0005, ++ 0x080c, 0x958d, 0x0904, 0x3179, 0x2001, 0xc8d3, 0x2004, 0x601a, ++ 0x0016, 0x0026, 0x2001, 0xc61c, 0x2004, 0x8007, 0x6934, 0xa105, ++ 0x6836, 0x2001, 0xc61d, 0x2004, 0x8007, 0x683a, 0x002e, 0x001e, ++ 0x2d00, 0x6012, 0x601f, 0x0001, 0x2009, 0x0040, 0x080c, 0x9613, ++ 0x0804, 0x3154, 0x0804, 0x3179, 0x2001, 0xc756, 0x200c, 0xa18e, ++ 0x0000, 0x0904, 0x4402, 0x2001, 0x0101, 0x200c, 0xa18c, 0x7fff, ++ 0x2102, 0x2001, 0x0103, 0x200c, 0xa18c, 0xfeff, 0xa18c, 0xfdff, ++ 0xa18d, 0x0040, 0x2102, 0x2001, 0xc8d4, 0x200c, 0xa18c, 0xfeff, ++ 0xa18c, 0xfdff, 0xa18d, 0x0040, 0x2102, 0x2001, 0x0138, 0x2003, ++ 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x24f3, 0x012e, 0x0128, ++ 0x20a9, 0x006e, 0x1f04, 0x43d2, 0x0ca0, 0x2001, 0xc756, 0x2003, ++ 0x0000, 0x080c, 0x2a95, 0x2001, 0x0138, 0x2102, 0x0126, 0x2091, ++ 0x8000, 0x2001, 0xc695, 0x200c, 0x81ff, 0x0138, 0x2168, 0x080c, ++ 0x1619, 0x2001, 0xc695, 0x2003, 0x0000, 0x2001, 0xc8d3, 0x200c, ++ 0x81ff, 0x0138, 0x2168, 0x080c, 0x1619, 0x2001, 0xc8d3, 0x2003, ++ 0x0000, 0x2001, 0xc63a, 0x2003, 0x0010, 0x080c, 0x7475, 0x080c, ++ 0x7484, 0x012e, 0x0804, 0x3154, 0x7824, 0x00e6, 0x2071, 0xc682, ++ 0x00ee, 0x0804, 0x3154, 0x0006, 0x2001, 0xc653, 0x2004, 0xd0cc, ++ 0x000e, 0x0005, 0x0006, 0x2001, 0xc672, 0x2004, 0xd0bc, 0x000e, ++ 0x0005, 0x6168, 0x7a24, 0x6300, 0x82ff, 0x1118, 0x7926, 0x0804, ++ 0x3154, 0x83ff, 0x1904, 0x317c, 0x2001, 0xfff0, 0xa200, 0x1a04, ++ 0x317c, 0x2019, 0xffff, 0x606c, 0xa302, 0xa200, 0x0a04, 0x317c, ++ 0x7926, 0x626a, 0x0804, 0x3154, 0x2001, 0xc600, 0x2004, 0xa086, ++ 0x0003, 0x1904, 0x3179, 0x7c28, 0x7d24, 0x7e38, 0x7f2c, 0x080c, ++ 0x4026, 0x0904, 0x3179, 0x2009, 0x0000, 0x2019, 0x0000, 0x7023, ++ 0x0000, 0x702f, 0x0000, 0xad80, 0x0003, 0x7026, 0x20a0, 0xa1e0, ++ 0xc77b, 0x2c64, 0x8cff, 0x01b8, 0x6004, 0xa084, 0x00ff, 0xa086, ++ 0x0006, 0x0130, 0x6004, 0xa084, 0xff00, 0xa086, 0x0600, 0x1158, ++ 0x6014, 0x20a2, 0x94a0, 0x6010, 0x8007, 0xa105, 0x8007, 0x20a2, ++ 0x94a0, 0xa398, 0x0002, 0x8108, 0xa182, 0x00ff, 0x0120, 0xa386, ++ 0x002a, 0x0148, 0x08e0, 0x83ff, 0x1120, 0x7120, 0x810c, 0x0804, ++ 0x3154, 0x702f, 0x0001, 0x711e, 0x7020, 0xa300, 0x7022, 0x2061, ++ 0xc6f2, 0x6007, 0x0000, 0x6312, 0x7024, 0x600e, 0x6426, 0x652a, ++ 0x662e, 0x6732, 0x2c10, 0x080c, 0x164d, 0x7007, 0x0002, 0x701b, ++ 0x4492, 0x0005, 0x702c, 0xa005, 0x1168, 0x711c, 0x7024, 0x20a0, ++ 0x2019, 0x0000, 0x2061, 0xc6f2, 0x6424, 0x6528, 0x662c, 0x6730, ++ 0x0804, 0x444f, 0x7120, 0x810c, 0x0804, 0x3154, 0x81ff, 0x1904, ++ 0x3179, 0x60d4, 0xd0ac, 0x1118, 0xd09c, 0x0904, 0x3179, 0x080c, ++ 0x4026, 0x0904, 0x3179, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, ++ 0x080c, 0x4067, 0x701b, 0x44bd, 0x0005, 0x00d6, 0xade8, 0x000d, ++ 0x6828, 0xa0be, 0x7000, 0x0148, 0xa0be, 0x7100, 0x0130, 0xa0be, ++ 0x7200, 0x0118, 0x00de, 0x0804, 0x317c, 0x6820, 0x6924, 0x080c, ++ 0x29c7, 0x1510, 0x080c, 0x52e1, 0x11f8, 0x7122, 0x6612, 0x6516, ++ 0x6e18, 0x00c6, 0x080c, 0x4026, 0x01b8, 0x080c, 0x4026, 0x01a0, ++ 0x00ce, 0x00de, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x6823, ++ 0x0000, 0x6804, 0x2068, 0x080c, 0xadf5, 0x0904, 0x3179, 0x7007, ++ 0x0003, 0x701b, 0x44f7, 0x0005, 0x00de, 0x0804, 0x3179, 0x7120, ++ 0x080c, 0x2f41, 0x6820, 0xa086, 0x8001, 0x0904, 0x3179, 0x2d00, ++ 0x701e, 0x6804, 0xa080, 0x0002, 0x0006, 0x20a9, 0x002a, 0x2098, ++ 0x20a0, 0x080c, 0x4ecb, 0x000e, 0xade8, 0x000d, 0x6a08, 0x6b0c, ++ 0x6c10, 0x6d14, 0x2061, 0xc6f2, 0x6007, 0x0000, 0x6e00, 0x6f28, ++ 0xa7c6, 0x7000, 0x1108, 0x0018, 0xa7c6, 0x7100, 0x1140, 0xa6c2, ++ 0x0004, 0x0a04, 0x317c, 0x2009, 0x0004, 0x0804, 0x406a, 0xa7c6, ++ 0x7200, 0x1904, 0x317c, 0xa6c2, 0x0054, 0x0a04, 0x317c, 0x600e, ++ 0x6013, 0x002a, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c, ++ 0x164d, 0x7007, 0x0002, 0x701b, 0x453e, 0x0005, 0x701c, 0x2068, ++ 0x6804, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x0006, 0x20a9, ++ 0x002a, 0x2098, 0x20a0, 0x080c, 0x4ecb, 0x000e, 0x2009, 0x002a, ++ 0x2061, 0xc6f2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0804, 0x406a, ++ 0x81ff, 0x1904, 0x3179, 0x792c, 0x2001, 0xc8e7, 0x2102, 0x080c, ++ 0x403b, 0x0904, 0x317c, 0x080c, 0x5403, 0x0904, 0x3179, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x5535, 0x012e, 0x0804, 0x3154, 0x7824, ++ 0xd08c, 0x1118, 0xd084, 0x0904, 0x3bf0, 0x080c, 0x404b, 0x0904, ++ 0x317c, 0x00c6, 0x080c, 0x4026, 0x00ce, 0x1120, 0x2009, 0x0002, ++ 0x0804, 0x3179, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0128, ++ 0xa08e, 0x0004, 0x0110, 0xa08e, 0x0005, 0x15b8, 0x7824, 0xd08c, ++ 0x0120, 0x6000, 0xc08c, 0x6002, 0x0030, 0x2001, 0xc653, 0x2004, ++ 0xd0b4, 0x0904, 0x3c2c, 0x7824, 0xa084, 0xff00, 0xa08e, 0x7e00, ++ 0x0904, 0x3c2c, 0xa08e, 0x7f00, 0x0904, 0x3c2c, 0xa08e, 0x8000, ++ 0x0904, 0x3c2c, 0x6000, 0xd08c, 0x1904, 0x3c2c, 0x6837, 0x0000, ++ 0x6838, 0xc0fd, 0x683a, 0x080c, 0xae11, 0x1120, 0x2009, 0x0003, ++ 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, 0x45bf, 0x0005, 0x080c, ++ 0x404b, 0x0904, 0x317c, 0x0804, 0x3c2c, 0x2009, 0xc631, 0x210c, ++ 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3179, 0x2001, 0xc600, ++ 0x2004, 0xa086, 0x0003, 0x0120, 0x2009, 0x0007, 0x0804, 0x3179, ++ 0x2001, 0xc653, 0x2004, 0xd0ac, 0x0120, 0x2009, 0x0008, 0x0804, ++ 0x3179, 0x609c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x3c2c, 0x6837, ++ 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0xaea2, ++ 0x1120, 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, ++ 0x45fa, 0x0005, 0x6830, 0xa086, 0x0100, 0x1120, 0x2009, 0x0004, ++ 0x0804, 0x3179, 0x080c, 0x404b, 0x0904, 0x317c, 0x0804, 0x458e, ++ 0x81ff, 0x2009, 0x0001, 0x1904, 0x3179, 0x6000, 0xa086, 0x0003, ++ 0x2009, 0x0007, 0x1904, 0x3179, 0x2001, 0xc653, 0x2004, 0xd0ac, ++ 0x2009, 0x0008, 0x1904, 0x3179, 0x080c, 0x404b, 0x0904, 0x317c, ++ 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x2009, 0x0009, 0x1904, ++ 0x3179, 0x00c6, 0x080c, 0x4026, 0x00ce, 0x2009, 0x0002, 0x0904, ++ 0x3179, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, ++ 0x7928, 0xa194, 0xff00, 0xa18c, 0x00ff, 0xa006, 0x82ff, 0x1128, ++ 0xc0ed, 0x6952, 0x792c, 0x6956, 0x0048, 0xa28e, 0x0100, 0x1904, ++ 0x317c, 0xc0e5, 0x6853, 0x0000, 0x6857, 0x0000, 0x683e, 0x080c, ++ 0xb05f, 0x2009, 0x0003, 0x0904, 0x3179, 0x7007, 0x0003, 0x701b, ++ 0x465a, 0x0005, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0904, ++ 0x3179, 0x0804, 0x3154, 0x81ff, 0x2009, 0x0001, 0x1904, 0x3179, ++ 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x1904, 0x3179, 0x080c, ++ 0x404b, 0x0904, 0x317c, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, ++ 0x2009, 0x0009, 0x1904, 0x3179, 0x00c6, 0x080c, 0x4026, 0x00ce, ++ 0x2009, 0x0002, 0x0904, 0x3179, 0xad80, 0x000f, 0x2009, 0x0008, ++ 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x4067, 0x701b, 0x4691, ++ 0x0005, 0x00d6, 0xade8, 0x000f, 0x6800, 0xa086, 0x0500, 0x1140, ++ 0x6804, 0xa005, 0x1128, 0x6808, 0xa084, 0xff00, 0x1108, 0x0018, ++ 0x00de, 0x1904, 0x317c, 0x00de, 0x6837, 0x0000, 0x6833, 0x0000, ++ 0x6838, 0xc0fd, 0x683a, 0x00c6, 0x080c, 0x404b, 0x1118, 0x00ce, ++ 0x0804, 0x317c, 0x080c, 0xb0ae, 0x2009, 0x0003, 0x00ce, 0x0904, ++ 0x3179, 0x7007, 0x0003, 0x701b, 0x46be, 0x0005, 0x6830, 0xa086, ++ 0x0100, 0x2009, 0x0004, 0x0904, 0x3179, 0x0804, 0x3154, 0x81ff, ++ 0x0120, 0x2009, 0x0001, 0x0804, 0x3179, 0x6000, 0xa086, 0x0003, ++ 0x0120, 0x2009, 0x0007, 0x0804, 0x3179, 0x7e24, 0x860f, 0xa18c, ++ 0x00ff, 0xa6b4, 0x00ff, 0x080c, 0x533d, 0x1904, 0x317c, 0xa186, ++ 0x007f, 0x0150, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0120, ++ 0x2009, 0x0009, 0x0804, 0x3179, 0x00c6, 0x080c, 0x4026, 0x00ce, ++ 0x1120, 0x2009, 0x0002, 0x0804, 0x3179, 0x6837, 0x0000, 0x6838, ++ 0xc0fd, 0x683a, 0x2001, 0x0100, 0x8007, 0x680a, 0x080c, 0xae2c, ++ 0x1120, 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, ++ 0x470a, 0x0005, 0x6808, 0x8007, 0xa086, 0x0100, 0x1120, 0x2009, ++ 0x0004, 0x0804, 0x3179, 0x68b0, 0x6836, 0x6810, 0x8007, 0xa084, ++ 0x00ff, 0x800c, 0x6814, 0x8007, 0xa084, 0x00ff, 0x8004, 0xa080, ++ 0x0002, 0xa108, 0xad80, 0x0004, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, ++ 0x0804, 0x406a, 0x080c, 0x4026, 0x1120, 0x2009, 0x0002, 0x0804, ++ 0x3179, 0x7924, 0xa194, 0xff00, 0xa18c, 0x00ff, 0x8217, 0x82ff, ++ 0x0110, 0x0804, 0x317c, 0x2009, 0x001a, 0x7a2c, 0x7b28, 0x7c3c, ++ 0x7d38, 0x080c, 0x4067, 0x701b, 0x4746, 0x0005, 0x2001, 0xc62a, ++ 0x2003, 0x0001, 0xad80, 0x000d, 0x2098, 0x20a9, 0x001a, 0x20a1, ++ 0xc90d, 0x53a3, 0x0804, 0x3154, 0x080c, 0x4026, 0x1120, 0x2009, ++ 0x0002, 0x0804, 0x3179, 0x7924, 0xa194, 0xff00, 0xa18c, 0x00ff, ++ 0x8217, 0x82ff, 0x0110, 0x0804, 0x317c, 0x2099, 0xc90d, 0x20a0, ++ 0x20a9, 0x001a, 0x53a3, 0x2009, 0x001a, 0x7a2c, 0x7b28, 0x7c3c, ++ 0x7d38, 0x0804, 0x406a, 0x7824, 0xa08a, 0x1000, 0x1a04, 0x317c, ++ 0x0126, 0x2091, 0x8000, 0x8003, 0x800b, 0x810b, 0xa108, 0x00c6, ++ 0x2061, 0xc93a, 0x6142, 0x00ce, 0x012e, 0x0804, 0x3154, 0x00c6, ++ 0x080c, 0x5f22, 0x1188, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, ++ 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5f66, 0x080c, ++ 0x5e5a, 0x080c, 0x1519, 0x0038, 0x2061, 0xc600, 0x6030, 0xc09d, ++ 0x6032, 0x080c, 0x4e5b, 0x00ce, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0x00c6, 0x2061, 0xc93a, 0x7924, 0x6152, 0x614e, 0x6057, 0x0000, ++ 0x604b, 0x0009, 0x7838, 0x606a, 0x783c, 0x6066, 0x7828, 0x6062, ++ 0x782c, 0x605e, 0x2061, 0xc8e8, 0x2001, 0xc94f, 0x600e, 0x6013, ++ 0x0001, 0x6017, 0x0002, 0x6007, 0x0000, 0x6037, 0x0000, 0x00ce, ++ 0x012e, 0x0804, 0x3154, 0x0126, 0x00c6, 0x00e6, 0x2061, 0x0100, ++ 0x2071, 0xc600, 0x6044, 0xd0a4, 0x11b0, 0xd084, 0x0118, 0x080c, ++ 0x4942, 0x0068, 0xd08c, 0x0118, 0x080c, 0x4863, 0x0040, 0xd094, ++ 0x0118, 0x080c, 0x4834, 0x0018, 0xd09c, 0x0108, 0x0061, 0x00ee, ++ 0x00ce, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, ++ 0x612a, 0x001e, 0x0ca0, 0x624c, 0xa286, 0xf0f0, 0x1150, 0x6048, ++ 0xa086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, ++ 0x0490, 0xa294, 0xff00, 0xa296, 0xf700, 0x0178, 0x7134, 0xd1a4, ++ 0x1160, 0x6240, 0xa295, 0x0100, 0x6242, 0xa294, 0x0010, 0x0128, ++ 0x2009, 0x00f7, 0x080c, 0x4eeb, 0x00f0, 0x6040, 0xa084, 0x0010, ++ 0xa085, 0x0140, 0x6042, 0x6043, 0x0000, 0x707b, 0x0000, 0x7097, ++ 0x0001, 0x70bb, 0x0000, 0x70d7, 0x0000, 0x2009, 0xcdc0, 0x200b, ++ 0x0000, 0x708b, 0x0000, 0x707f, 0x000a, 0x2009, 0x000a, 0x2011, ++ 0x4e11, 0x080c, 0x7036, 0x0005, 0x0156, 0x2001, 0xc674, 0x2004, ++ 0xd08c, 0x0110, 0x7053, 0xffff, 0x707c, 0xa005, 0x1510, 0x2011, ++ 0x4e11, 0x080c, 0x6fad, 0x6040, 0xa094, 0x0010, 0xa285, 0x0020, ++ 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x484b, ++ 0x6242, 0x708f, 0x0000, 0x6040, 0xa094, 0x0010, 0xa285, 0x0080, ++ 0x6042, 0x6242, 0x0030, 0x6242, 0x708f, 0x0000, 0x7083, 0x0000, ++ 0x0000, 0x015e, 0x0005, 0x7080, 0xa08a, 0x0003, 0x1210, 0x0023, ++ 0x0010, 0x080c, 0x1519, 0x0005, 0x486f, 0x48bf, 0x4941, 0x00f6, ++ 0x7083, 0x0001, 0x20e1, 0xa000, 0xe000, 0x20e1, 0x8700, 0x080c, ++ 0x25bb, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2079, 0xcc00, 0x207b, ++ 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000, 0x780f, 0x00ef, 0x7813, ++ 0x0138, 0x7817, 0x0000, 0x781b, 0x0000, 0x781f, 0x0000, 0x7823, ++ 0xffff, 0x7827, 0xffff, 0x782b, 0x0000, 0x782f, 0x0000, 0x2079, ++ 0xcc0c, 0x207b, 0x1101, 0x7807, 0x0000, 0x2099, 0xc605, 0x20a1, ++ 0xcc0e, 0x20a9, 0x0004, 0x53a3, 0x2079, 0xcc12, 0x207b, 0x0000, ++ 0x7807, 0x0000, 0x2099, 0xcc00, 0x20a1, 0x020b, 0x20a9, 0x0014, ++ 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, 0x4e42, 0x00fe, ++ 0x7087, 0x0000, 0x6043, 0x0008, 0x6043, 0x0000, 0x0005, 0x00d6, ++ 0x7084, 0x7087, 0x0000, 0xa025, 0x0904, 0x4929, 0x6020, 0xd0b4, ++ 0x1904, 0x4927, 0x7194, 0x81ff, 0x0904, 0x4917, 0xa486, 0x000c, ++ 0x1904, 0x4922, 0xa480, 0x0018, 0x8004, 0x20a8, 0x2011, 0xcc80, ++ 0x2019, 0xcc00, 0x220c, 0x2304, 0xa106, 0x11b8, 0x8210, 0x8318, ++ 0x1f04, 0x48da, 0x6043, 0x0004, 0x608b, 0xbc94, 0x608f, 0xf0f0, ++ 0x6043, 0x0006, 0x7083, 0x0002, 0x708f, 0x0002, 0x2009, 0x07d0, ++ 0x2011, 0x4e18, 0x080c, 0x7036, 0x0490, 0x2069, 0xcc80, 0x6930, ++ 0xa18e, 0x1101, 0x1538, 0x6834, 0xa005, 0x1520, 0x6900, 0xa18c, ++ 0x00ff, 0x1118, 0x6804, 0xa005, 0x0190, 0x2011, 0xcc8e, 0x2019, ++ 0xc605, 0x20a9, 0x0004, 0x220c, 0x2304, 0xa102, 0x0230, 0x1190, ++ 0x8210, 0x8318, 0x1f04, 0x490b, 0x0068, 0x7097, 0x0000, 0x20e1, ++ 0x9080, 0x20e1, 0x4000, 0x2099, 0xcc80, 0x20a1, 0x020b, 0x20a9, ++ 0x0014, 0x53a6, 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00de, ++ 0x0005, 0x6040, 0xa085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, ++ 0x60c3, 0x000c, 0x2011, 0xc931, 0x2013, 0x0000, 0x7087, 0x0000, ++ 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x8bec, ++ 0x0c30, 0x0005, 0x708c, 0xa08a, 0x001d, 0x1210, 0x0023, 0x0010, ++ 0x080c, 0x1519, 0x0005, 0x4975, 0x4984, 0x49ac, 0x49c5, 0x49e9, ++ 0x4a11, 0x4a35, 0x4a66, 0x4a8a, 0x4ab2, 0x4ae9, 0x4b11, 0x4b2d, ++ 0x4b43, 0x4b63, 0x4b76, 0x4b7e, 0x4bae, 0x4bd2, 0x4bfa, 0x4c1e, ++ 0x4c4f, 0x4c8c, 0x4cbb, 0x4cd7, 0x4d16, 0x4d36, 0x4d4f, 0x4d50, ++ 0x00c6, 0x2061, 0xc600, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, ++ 0xa084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x608b, 0xbc94, 0x608f, ++ 0xf0f0, 0x6043, 0x0002, 0x708f, 0x0001, 0x2009, 0x07d0, 0x2011, ++ 0x4e18, 0x080c, 0x7036, 0x0005, 0x00f6, 0x7084, 0xa086, 0x0014, ++ 0x1508, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x11e0, 0x2079, 0xcc80, ++ 0x7a30, 0xa296, 0x1102, 0x11a0, 0x7834, 0xa005, 0x1188, 0x7a38, ++ 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x2011, ++ 0x4e18, 0x080c, 0x6fad, 0x708f, 0x0010, 0x080c, 0x4b7e, 0x0010, ++ 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x0003, 0x6043, 0x0004, ++ 0x2011, 0x4e18, 0x080c, 0x6fad, 0x080c, 0x4ed3, 0x20a3, 0x1102, ++ 0x20a3, 0x0000, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, 0x49bc, ++ 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084, 0xa005, ++ 0x01f0, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0014, 0x11a8, ++ 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1102, 0x1178, 0x7834, 0xa005, ++ 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, ++ 0x0001, 0x708f, 0x0004, 0x0029, 0x0010, 0x080c, 0x4e5b, 0x00fe, ++ 0x0005, 0x708f, 0x0005, 0x080c, 0x4ed3, 0x20a3, 0x1103, 0x20a3, ++ 0x0000, 0x3430, 0x2011, 0xcc8e, 0x080c, 0x4f24, 0x1160, 0x7078, ++ 0xa005, 0x1148, 0x7150, 0xa186, 0xffff, 0x0128, 0x080c, 0x4ddc, ++ 0x0110, 0x080c, 0x4f02, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, ++ 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4e18, 0x080c, ++ 0x6fad, 0xa086, 0x0014, 0x11a8, 0x2079, 0xcc80, 0x7a30, 0xa296, ++ 0x1103, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, ++ 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0006, 0x0029, ++ 0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x0007, 0x080c, ++ 0x4ed3, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, 0xcc8e, ++ 0x080c, 0x4f24, 0x11a8, 0x7078, 0xa005, 0x1190, 0x7158, 0xa186, ++ 0xffff, 0x0170, 0xa180, 0x2f6e, 0x200d, 0xa18c, 0xff00, 0x810f, ++ 0x080c, 0x4ddc, 0x0128, 0x080c, 0x4412, 0x0110, 0x080c, 0x2a11, ++ 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084, ++ 0xa005, 0x01f0, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0014, ++ 0x11a8, 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1104, 0x1178, 0x7834, ++ 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, ++ 0x70bb, 0x0001, 0x708f, 0x0008, 0x0029, 0x0010, 0x080c, 0x4e5b, ++ 0x00fe, 0x0005, 0x708f, 0x0009, 0x080c, 0x4ed3, 0x20a3, 0x1105, ++ 0x20a3, 0x0100, 0x3430, 0x080c, 0x4f24, 0x1150, 0x7078, 0xa005, ++ 0x1138, 0x080c, 0x4d51, 0x1170, 0xa085, 0x0001, 0x080c, 0x2a11, ++ 0x20a9, 0x0008, 0x2099, 0xcc8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0010, 0x080c, ++ 0x4968, 0x0005, 0x00f6, 0x7084, 0xa005, 0x0588, 0x2011, 0x4e18, ++ 0x080c, 0x6fad, 0xa086, 0x0014, 0x1540, 0x2079, 0xcc80, 0x7a30, ++ 0xa296, 0x1105, 0x1510, 0x7834, 0x2011, 0x0100, 0xa21e, 0x1160, ++ 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, ++ 0x708f, 0x000a, 0x00b1, 0x0098, 0xa005, 0x1178, 0x7a38, 0xd2fc, ++ 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708b, 0x0000, ++ 0x708f, 0x000e, 0x080c, 0x4b63, 0x0010, 0x080c, 0x4e5b, 0x00fe, ++ 0x0005, 0x708f, 0x000b, 0x2011, 0xcc0e, 0x22a0, 0x20a9, 0x0040, ++ 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009, 0x0000, 0x41a4, ++ 0x080c, 0x4ed3, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x080c, 0x4f24, ++ 0x0118, 0x2013, 0x0000, 0x0020, 0x7054, 0xa085, 0x0100, 0x2012, ++ 0x2298, 0x20a9, 0x0042, 0x53a6, 0x60c3, 0x0084, 0x080c, 0x4e42, ++ 0x0005, 0x00f6, 0x7084, 0xa005, 0x01b0, 0x2011, 0x4e18, 0x080c, ++ 0x6fad, 0xa086, 0x0084, 0x1168, 0x2079, 0xcc80, 0x7a30, 0xa296, ++ 0x1106, 0x1138, 0x7834, 0xa005, 0x1120, 0x708f, 0x000c, 0x0029, ++ 0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x000d, 0x080c, ++ 0x4ed3, 0x20a3, 0x1107, 0x20a3, 0x0000, 0x2099, 0xcc8e, 0x20a9, ++ 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, ++ 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01d0, 0x2011, ++ 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0084, 0x1188, 0x2079, 0xcc80, ++ 0x7a30, 0xa296, 0x1107, 0x1158, 0x7834, 0xa005, 0x1140, 0x708b, ++ 0x0001, 0x080c, 0x4ec5, 0x708f, 0x000e, 0x0029, 0x0010, 0x080c, ++ 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x000f, 0x7087, 0x0000, 0x608b, ++ 0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, ++ 0x07d0, 0x2011, 0x4e18, 0x080c, 0x6fa1, 0x0005, 0x7084, 0xa005, ++ 0x0120, 0x2011, 0x4e18, 0x080c, 0x6fad, 0x0005, 0x708f, 0x0011, ++ 0x080c, 0x4f24, 0x11a0, 0x7170, 0x81ff, 0x0188, 0x2009, 0x0000, ++ 0x7074, 0xa084, 0x00ff, 0x080c, 0x29c7, 0xa186, 0x007e, 0x0138, ++ 0xa186, 0x0080, 0x0120, 0x2011, 0xcc8e, 0x080c, 0x4ddc, 0x20e1, ++ 0x9080, 0x20e1, 0x4000, 0x2099, 0xcc80, 0x20a1, 0x020b, 0x7484, ++ 0xa480, 0x0018, 0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, ++ 0x53a6, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084, ++ 0xa005, 0x01f0, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0014, ++ 0x11a8, 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1103, 0x1178, 0x7834, ++ 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, ++ 0x70bb, 0x0001, 0x708f, 0x0012, 0x0029, 0x0010, 0x080c, 0x4e5b, ++ 0x00fe, 0x0005, 0x708f, 0x0013, 0x080c, 0x4edf, 0x20a3, 0x1103, ++ 0x20a3, 0x0000, 0x3430, 0x2011, 0xcc8e, 0x080c, 0x4f24, 0x1160, ++ 0x7078, 0xa005, 0x1148, 0x7150, 0xa186, 0xffff, 0x0128, 0x080c, ++ 0x4ddc, 0x0110, 0x080c, 0x4f02, 0x20a9, 0x0008, 0x2298, 0x26a0, ++ 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, ++ 0x4e42, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4e18, ++ 0x080c, 0x6fad, 0xa086, 0x0014, 0x11a8, 0x2079, 0xcc80, 0x7a30, ++ 0xa296, 0x1104, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, ++ 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0014, ++ 0x0029, 0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x0015, ++ 0x080c, 0x4edf, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, ++ 0xcc8e, 0x080c, 0x4f24, 0x11a8, 0x7078, 0xa005, 0x1190, 0x7158, ++ 0xa186, 0xffff, 0x0170, 0xa180, 0x2f6e, 0x200d, 0xa18c, 0xff00, ++ 0x810f, 0x080c, 0x4ddc, 0x0128, 0x080c, 0x4412, 0x0110, 0x080c, ++ 0x2a11, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0005, 0x00f6, ++ 0x7084, 0xa005, 0x05b8, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, ++ 0x0014, 0x1570, 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1105, 0x1540, ++ 0x7834, 0x2011, 0x0100, 0xa21e, 0x1148, 0x7a38, 0xd2fc, 0x0128, ++ 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x0060, 0xa005, 0x11c0, ++ 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, ++ 0x708b, 0x0000, 0x7a38, 0xd2f4, 0x0138, 0x2001, 0xc674, 0x2004, ++ 0xd0a4, 0x1110, 0x70d7, 0x0008, 0x708f, 0x0016, 0x0029, 0x0010, ++ 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, ++ 0x2099, 0xcc80, 0x20a1, 0x020b, 0x20a9, 0x000e, 0x53a6, 0x3430, ++ 0x2011, 0xcc8e, 0x708f, 0x0017, 0x080c, 0x4f24, 0x1150, 0x7078, ++ 0xa005, 0x1138, 0x080c, 0x4d51, 0x1170, 0xa085, 0x0001, 0x080c, ++ 0x2a11, 0x20a9, 0x0008, 0x2099, 0xcc8e, 0x26a0, 0x53a6, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e42, 0x0010, ++ 0x080c, 0x4968, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01b0, 0x2011, ++ 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0084, 0x1168, 0x2079, 0xcc80, ++ 0x7a30, 0xa296, 0x1106, 0x1138, 0x7834, 0xa005, 0x1120, 0x708f, ++ 0x0018, 0x0029, 0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, ++ 0x0019, 0x080c, 0x4edf, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430, ++ 0x2099, 0xcc8e, 0x2039, 0xcc0e, 0x27a0, 0x20a9, 0x0040, 0x53a3, ++ 0x080c, 0x4f24, 0x11e8, 0x2728, 0x2514, 0x8207, 0xa084, 0x00ff, ++ 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007, 0xa205, 0x202a, 0x7054, ++ 0x2310, 0x8214, 0xa2a0, 0xcc0e, 0x2414, 0xa38c, 0x0001, 0x0118, ++ 0xa294, 0xff00, 0x0018, 0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, ++ 0x2798, 0x26a0, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x60c3, 0x0084, 0x080c, 0x4e42, 0x0005, 0x00f6, 0x7084, ++ 0xa005, 0x01d0, 0x2011, 0x4e18, 0x080c, 0x6fad, 0xa086, 0x0084, ++ 0x1188, 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1107, 0x1158, 0x7834, ++ 0xa005, 0x1140, 0x708b, 0x0001, 0x080c, 0x4ec5, 0x708f, 0x001a, ++ 0x0029, 0x0010, 0x080c, 0x4e5b, 0x00fe, 0x0005, 0x708f, 0x001b, ++ 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xcc80, 0x20a1, 0x020b, ++ 0x7484, 0xa480, 0x0018, 0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, ++ 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x080c, 0x4e42, 0x0005, 0x0005, ++ 0x0005, 0x0086, 0x0096, 0x2029, 0xc653, 0x252c, 0x20a9, 0x0008, ++ 0x2041, 0xcc0e, 0x28a0, 0x2099, 0xcc8e, 0x53a3, 0x20a9, 0x0008, ++ 0x2011, 0x0007, 0xd5d4, 0x0110, 0x2011, 0x0000, 0x2800, 0xa200, ++ 0x200c, 0xa1a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, ++ 0x8211, 0x1f04, 0x4d66, 0x0804, 0x4dd4, 0x82ff, 0x1160, 0xd5d4, ++ 0x0120, 0xa1a6, 0x3fff, 0x0d90, 0x0020, 0xa1a6, 0x3fff, 0x0904, ++ 0x4dd4, 0xa18d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, ++ 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, ++ 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, ++ 0x4d8c, 0x04d0, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, ++ 0x4d9e, 0x2328, 0x8529, 0xa2be, 0x0007, 0x0158, 0x0006, 0x2039, ++ 0x0007, 0x2200, 0xa73a, 0x000e, 0x27a8, 0xa5a8, 0x0010, 0x1f04, ++ 0x4dad, 0x7552, 0xa5c8, 0x2f6e, 0x292d, 0xa5ac, 0x00ff, 0x7576, ++ 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x29f1, 0x001e, 0x60e7, ++ 0x0000, 0x65ea, 0x2018, 0x2304, 0xa405, 0x201a, 0x707b, 0x0001, ++ 0x26a0, 0x2898, 0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0xa085, 0x0001, 0x0028, 0xa006, 0x0018, 0xa006, 0x080c, ++ 0x1519, 0x009e, 0x008e, 0x0005, 0x2118, 0x2021, 0x0000, 0x2001, ++ 0x0007, 0xa39a, 0x0010, 0x0218, 0x8420, 0x8001, 0x0cd0, 0x2118, ++ 0x84ff, 0x0120, 0xa39a, 0x0010, 0x8421, 0x1de0, 0x2021, 0x0001, ++ 0x83ff, 0x0118, 0x8423, 0x8319, 0x1de8, 0xa238, 0x2704, 0xa42c, ++ 0x11b8, 0xa405, 0x203a, 0x7152, 0xa1a0, 0x2f6e, 0x242d, 0xa5ac, ++ 0x00ff, 0x7576, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x29f1, ++ 0x001e, 0x60e7, 0x0000, 0x65ea, 0x707b, 0x0001, 0xa084, 0x0000, ++ 0x0005, 0x00e6, 0x2071, 0xc600, 0x707f, 0x0000, 0x00ee, 0x0005, ++ 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x8bf5, ++ 0x7004, 0xa084, 0x4000, 0x0120, 0x7003, 0x1000, 0x7003, 0x0000, ++ 0x0126, 0x2091, 0x8000, 0x2071, 0xc623, 0x2073, 0x0000, 0x7840, ++ 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x4eeb, 0x001e, 0xa094, ++ 0x0010, 0xa285, 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, ++ 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x2011, 0xc931, 0x2013, ++ 0x0000, 0x7087, 0x0000, 0x012e, 0x20e1, 0x9080, 0x60a3, 0x0056, ++ 0x60a7, 0x9575, 0x080c, 0x8bec, 0x2009, 0x07d0, 0x2011, 0x4e18, ++ 0x080c, 0x7036, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, ++ 0x8000, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, 0x080c, ++ 0x8f18, 0x080c, 0x8dee, 0x0036, 0x2019, 0x0000, 0x080c, 0x8e79, ++ 0x003e, 0x2009, 0x00f7, 0x080c, 0x4eeb, 0x2061, 0xc93a, 0x601b, ++ 0x0000, 0x601f, 0x0000, 0x2061, 0xc600, 0x6003, 0x0001, 0x2061, ++ 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, ++ 0x4e90, 0x080c, 0x6fa1, 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, ++ 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x0100, 0x080c, ++ 0x8bf5, 0x2071, 0x0140, 0x7004, 0xa084, 0x4000, 0x0120, 0x7003, ++ 0x1000, 0x7003, 0x0000, 0x080c, 0x5f2a, 0x01a8, 0x080c, 0x5f48, ++ 0x1190, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x0016, 0x080c, 0x2a95, ++ 0x2001, 0xc8d6, 0x2102, 0x001e, 0x2001, 0xc8e6, 0x2003, 0x0000, ++ 0x080c, 0x5e5a, 0x0030, 0x2001, 0x0001, 0x080c, 0x296d, 0x080c, ++ 0x4e5b, 0x012e, 0x000e, 0x00ee, 0x0005, 0x20a9, 0x0040, 0x20a1, ++ 0xcdc0, 0x2099, 0xcc8e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0, ++ 0x1f04, 0x4ecb, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, ++ 0xcc00, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x0005, 0x20e1, ++ 0x9080, 0x20e1, 0x4000, 0x2099, 0xcc80, 0x20a1, 0x020b, 0x20a9, ++ 0x000c, 0x53a6, 0x0005, 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, ++ 0x2001, 0xc631, 0x2004, 0xa005, 0x1138, 0x2001, 0xc615, 0x2004, ++ 0xa084, 0x00ff, 0xa105, 0x0010, 0xa185, 0x00f7, 0x604a, 0x000e, ++ 0x00ce, 0x0005, 0x0016, 0x0046, 0x2001, 0xc653, 0x2004, 0xd0a4, ++ 0x0158, 0xa006, 0x2020, 0x2009, 0x002a, 0x080c, 0xc190, 0x2001, ++ 0xc60c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0000, ++ 0x080c, 0x2e19, 0x004e, 0x001e, 0x0005, 0x080c, 0x4e5b, 0x708f, ++ 0x0000, 0x7087, 0x0000, 0x0005, 0x0006, 0x2001, 0xc60c, 0x2004, ++ 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006, 0x0016, 0x0126, 0x2091, ++ 0x8000, 0x2001, 0x0101, 0x200c, 0xa18d, 0x0006, 0x2102, 0x012e, ++ 0x001e, 0x000e, 0x0005, 0x0156, 0x20a9, 0x00ff, 0x2009, 0xc77b, ++ 0xa006, 0x200a, 0x8108, 0x1f04, 0x4f41, 0x015e, 0x0005, 0x00d6, ++ 0x0036, 0x0156, 0x0136, 0x0146, 0x2069, 0xc652, 0xa006, 0x6002, ++ 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x2f6e, 0x231d, ++ 0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006, 0x23a0, ++ 0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4, 0x603e, ++ 0x6042, 0x604e, 0x6052, 0x6056, 0x605a, 0x605e, 0x6062, 0x6066, ++ 0x606a, 0x606e, 0x6072, 0x6076, 0x607a, 0x607e, 0x6082, 0x6086, ++ 0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x60be, 0x61a2, ++ 0x00d6, 0x60a4, 0xa06d, 0x0110, 0x080c, 0x1619, 0x60a7, 0x0000, ++ 0x60a8, 0xa06d, 0x0110, 0x080c, 0x1619, 0x60ab, 0x0000, 0x00de, ++ 0xa006, 0x604a, 0x6810, 0x603a, 0x680c, 0x6046, 0xa006, 0x60b2, ++ 0x60ae, 0x60b6, 0x60bb, 0x0520, 0x6814, 0xa084, 0x00ff, 0x6042, ++ 0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, ++ 0x8000, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, 0x4000, 0x1a04, ++ 0x505c, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x1a04, 0x5061, ++ 0x2001, 0xc60c, 0x2004, 0xa084, 0x0003, 0x01c0, 0x2001, 0xc60c, ++ 0x2004, 0xd084, 0x1904, 0x5044, 0xa188, 0xc77b, 0x2104, 0xa065, ++ 0x0904, 0x5044, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x1904, ++ 0x5044, 0x6000, 0xd0c4, 0x0904, 0x5044, 0x0068, 0xa188, 0xc77b, ++ 0x2104, 0xa065, 0x0904, 0x5028, 0x6004, 0xa084, 0x00ff, 0xa08e, ++ 0x0006, 0x1904, 0x502d, 0x60a4, 0xa00d, 0x0118, 0x080c, 0x5568, ++ 0x05d0, 0x60a8, 0xa00d, 0x0188, 0x080c, 0x55b3, 0x1170, 0x694c, ++ 0xd1fc, 0x1118, 0x080c, 0x5272, 0x0448, 0x080c, 0x5221, 0x694c, ++ 0xd1ec, 0x1520, 0x080c, 0x545a, 0x0408, 0x694c, 0xa184, 0xa000, ++ 0x0178, 0xd1ec, 0x0140, 0xd1fc, 0x0118, 0x080c, 0x5469, 0x0028, ++ 0x080c, 0x5469, 0x0028, 0xd1fc, 0x0118, 0x080c, 0x5221, 0x0070, ++ 0x6050, 0xa00d, 0x0130, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, ++ 0x0028, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x080c, 0x79b6, ++ 0xa006, 0x012e, 0x0005, 0x2001, 0x0005, 0x2009, 0x0000, 0x04e8, ++ 0x2001, 0x0028, 0x2009, 0x0000, 0x04c0, 0xa082, 0x0006, 0x12a0, ++ 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1160, 0x60a0, 0xd0bc, 0x1148, ++ 0x6100, 0xd1fc, 0x0904, 0x4fe3, 0x2001, 0x0029, 0x2009, 0x1000, ++ 0x0420, 0x2001, 0x0028, 0x00a8, 0x2009, 0xc60c, 0x210c, 0xd18c, ++ 0x0118, 0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, ++ 0x0040, 0x2001, 0x0029, 0x6100, 0xd1fc, 0x0118, 0x2009, 0x1000, ++ 0x0060, 0x2009, 0x0000, 0x0048, 0x2001, 0x0029, 0x2009, 0x0000, ++ 0x0020, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x012e, 0x0005, ++ 0x00e6, 0x0126, 0x2091, 0x8000, 0x6844, 0xa084, 0xff00, 0xa08e, ++ 0xff00, 0x1120, 0x2001, 0xc8d3, 0x2064, 0x0080, 0x6844, 0x8007, ++ 0xa084, 0x00ff, 0x2008, 0xa182, 0x00ff, 0x1698, 0xa188, 0xc77b, ++ 0x2104, 0xa065, 0x01d8, 0x080c, 0x56ed, 0x11d8, 0x2c70, 0x080c, ++ 0x958d, 0x0568, 0x2e00, 0x601a, 0x2d00, 0x6012, 0x601f, 0x0009, ++ 0x600b, 0x0000, 0x6844, 0xa08e, 0xff00, 0x1110, 0x600b, 0x8000, ++ 0x2009, 0x0100, 0x080c, 0x9613, 0xa006, 0x00b0, 0x2001, 0x0028, ++ 0x0090, 0x2009, 0xc60c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, ++ 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, ++ 0x0010, 0x2001, 0x0029, 0xa005, 0x012e, 0x00ee, 0x0005, 0x2001, ++ 0x002c, 0x0cc8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x6844, 0x8007, ++ 0xa084, 0x00ff, 0x2008, 0xa182, 0x00ff, 0x1a04, 0x510d, 0xa188, ++ 0xc77b, 0x2104, 0xa065, 0x01c0, 0x6004, 0xa084, 0x00ff, 0xa08e, ++ 0x0006, 0x11a8, 0x2c70, 0x080c, 0x958d, 0x05e8, 0x2e00, 0x601a, ++ 0x2d00, 0x6012, 0x600b, 0xffff, 0x601f, 0x000a, 0x2009, 0x0003, ++ 0x080c, 0x9613, 0xa006, 0x0460, 0x2001, 0x0028, 0x0440, 0xa082, ++ 0x0006, 0x1298, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1158, 0x60a0, ++ 0xd0bc, 0x1140, 0x6100, 0xd1fc, 0x09e8, 0x2001, 0x0029, 0x2009, ++ 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, 0x2009, 0xc60c, 0x210c, ++ 0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, 0xd184, 0x0118, 0x2001, ++ 0x0004, 0x0028, 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0xa005, ++ 0x012e, 0x00ee, 0x0005, 0x2001, 0x002c, 0x0cc8, 0x00f6, 0x00e6, ++ 0x0126, 0x2091, 0x8000, 0x2011, 0x0000, 0x2079, 0xc600, 0x6944, ++ 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x1a04, 0x51d8, 0x080c, ++ 0x533d, 0x11a0, 0x6004, 0xa084, 0x00ff, 0xa082, 0x0006, 0x1270, ++ 0x6864, 0xa0c6, 0x006f, 0x0150, 0x2001, 0xc635, 0x2004, 0xd0ac, ++ 0x1904, 0x51c1, 0x60a0, 0xd0bc, 0x1904, 0x51c1, 0x6864, 0xa0c6, ++ 0x006f, 0x0118, 0x2008, 0x0804, 0x518a, 0x6968, 0x2140, 0xa18c, ++ 0xff00, 0x810f, 0x78d4, 0xd0ac, 0x1118, 0xa182, 0x0080, 0x06d0, ++ 0xa182, 0x00ff, 0x16b8, 0x6a70, 0x6b6c, 0x7870, 0xa306, 0x1160, ++ 0x7874, 0xa24e, 0x1118, 0x2208, 0x2310, 0x0460, 0xa9cc, 0xff00, ++ 0x1118, 0x2208, 0x2310, 0x0430, 0x080c, 0x3f6e, 0x2c70, 0x0550, ++ 0x2009, 0x0000, 0x2011, 0x0000, 0xa0c6, 0x4000, 0x1160, 0x0006, ++ 0x2e60, 0x080c, 0x55de, 0x1108, 0xc185, 0x7000, 0xd0bc, 0x0108, ++ 0xc18d, 0x000e, 0x0088, 0xa0c6, 0x4007, 0x1110, 0x2408, 0x0060, ++ 0xa0c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0030, 0xa0c6, 0x4009, ++ 0x1108, 0x0010, 0x2001, 0x4006, 0x6866, 0x696a, 0x6a6e, 0x2001, ++ 0x0030, 0x0450, 0x080c, 0x958d, 0x1138, 0x2001, 0x4005, 0x2009, ++ 0x0003, 0x2011, 0x0000, 0x0c80, 0x2e00, 0x601a, 0x080c, 0xb05e, ++ 0x2d00, 0x6012, 0x601f, 0x0001, 0x6838, 0xd88c, 0x0108, 0xc0f5, ++ 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2e46, 0x012e, 0x2001, ++ 0x0000, 0x080c, 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x2009, ++ 0x0002, 0x080c, 0x9613, 0xa006, 0xa005, 0x012e, 0x00ee, 0x00fe, ++ 0x0005, 0x2001, 0x0028, 0x2009, 0x0000, 0x0cb0, 0x2009, 0xc60c, ++ 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, ++ 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x2009, 0x0000, 0x0c20, ++ 0x2001, 0x0029, 0x2009, 0x0000, 0x08f8, 0x6944, 0x6e48, 0xa684, ++ 0x3fff, 0xa082, 0x4000, 0x16b8, 0xa18c, 0xff00, 0x810f, 0xa182, ++ 0x00ff, 0x12e0, 0xa188, 0xc77b, 0x2104, 0xa065, 0x01b8, 0x6004, ++ 0xa084, 0x00ff, 0xa08e, 0x0006, 0x11b0, 0x684c, 0xd0ec, 0x0120, ++ 0x080c, 0x5469, 0x0431, 0x0030, 0x0421, 0x684c, 0xd0fc, 0x0110, ++ 0x080c, 0x545a, 0x080c, 0x54a7, 0xa006, 0x00c8, 0x2001, 0x0028, ++ 0x2009, 0x0000, 0x00a0, 0xa082, 0x0006, 0x1240, 0x6100, 0xd1fc, ++ 0x0d20, 0x2001, 0x0029, 0x2009, 0x1000, 0x0048, 0x2001, 0x0029, ++ 0x2009, 0x0000, 0x0020, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, ++ 0x0005, 0x0126, 0x2091, 0x8000, 0x6050, 0xa00d, 0x0138, 0x2d00, ++ 0x200a, 0x6803, 0x0000, 0x6052, 0x012e, 0x0005, 0x2d00, 0x6052, ++ 0x604e, 0x6803, 0x0000, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x604c, ++ 0xa005, 0x0170, 0x00e6, 0x2071, 0xc927, 0x7004, 0xa086, 0x0002, ++ 0x0168, 0x00ee, 0x604c, 0x6802, 0x2d00, 0x604e, 0x012e, 0x0005, ++ 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0cc0, 0x701c, 0xac06, ++ 0x1d80, 0x604c, 0x2070, 0x7000, 0x6802, 0x2d00, 0x7002, 0x00ee, ++ 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x604c, 0xa06d, 0x0130, ++ 0x6800, 0xa005, 0x1108, 0x6052, 0x604e, 0xad05, 0x012e, 0x0005, ++ 0x604c, 0xa06d, 0x0130, 0x6800, 0xa005, 0x1108, 0x6052, 0x604e, ++ 0xad05, 0x0005, 0x6803, 0x0000, 0x6084, 0xa00d, 0x0120, 0x2d00, ++ 0x200a, 0x6086, 0x0005, 0x2d00, 0x6086, 0x6082, 0x0cd8, 0x0126, ++ 0x00c6, 0x0026, 0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005, ++ 0x0110, 0xc285, 0x0008, 0xc284, 0x6202, 0x002e, 0x00ce, 0x012e, ++ 0x0005, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6218, 0x2260, 0x6204, ++ 0x0006, 0xa086, 0x0006, 0x1180, 0x609c, 0xd0ac, 0x0168, 0x2001, ++ 0xc653, 0x2004, 0xd0a4, 0x0140, 0xa284, 0xff00, 0x8007, 0xa086, ++ 0x0007, 0x1110, 0x2011, 0x0600, 0x000e, 0xa294, 0xff00, 0xa215, ++ 0x6206, 0x0006, 0xa086, 0x0006, 0x1128, 0x6290, 0x82ff, 0x1110, ++ 0x080c, 0x1519, 0x000e, 0x00ce, 0x012e, 0x0005, 0x0126, 0x00c6, ++ 0x2091, 0x8000, 0x6218, 0x2260, 0x6204, 0x0006, 0xa086, 0x0006, ++ 0x1178, 0x609c, 0xd0a4, 0x0160, 0x2001, 0xc653, 0x2004, 0xd0ac, ++ 0x1138, 0xa284, 0x00ff, 0xa086, 0x0007, 0x1110, 0x2011, 0x0006, ++ 0x000e, 0xa294, 0x00ff, 0x8007, 0xa215, 0x6206, 0x00ce, 0x012e, ++ 0x0005, 0x0026, 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001, 0x00b0, ++ 0xa190, 0xc77b, 0x2204, 0xa065, 0x1180, 0x0016, 0x00d6, 0x080c, ++ 0x15e5, 0x2d60, 0x00de, 0x001e, 0x0d80, 0x2c00, 0x2012, 0x60a7, ++ 0x0000, 0x60ab, 0x0000, 0x080c, 0x4f47, 0xa006, 0x002e, 0x0005, ++ 0x0126, 0x2091, 0x8000, 0x0026, 0xa182, 0x00ff, 0x0218, 0xa085, ++ 0x0001, 0x0480, 0x00d6, 0xa190, 0xc77b, 0x2204, 0xa06d, 0x0540, ++ 0x2013, 0x0000, 0x00d6, 0x00c6, 0x2d60, 0x60a4, 0xa06d, 0x0110, ++ 0x080c, 0x1619, 0x60a8, 0xa06d, 0x0110, 0x080c, 0x1619, 0x00ce, ++ 0x00de, 0x00d6, 0x00c6, 0x68bc, 0x2060, 0x8cff, 0x0168, 0x600c, ++ 0x0006, 0x6010, 0x2068, 0x080c, 0xac91, 0x0110, 0x080c, 0x1629, ++ 0x080c, 0x95e3, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x080c, 0x1619, ++ 0x00de, 0xa006, 0x002e, 0x012e, 0x0005, 0x0016, 0xa182, 0x00ff, ++ 0x0218, 0xa085, 0x0001, 0x0030, 0xa188, 0xc77b, 0x2104, 0xa065, ++ 0x0dc0, 0xa006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, ++ 0x600b, 0x0000, 0x600f, 0x0000, 0x6000, 0xc08c, 0x6002, 0x080c, ++ 0x5f22, 0x1558, 0x60a0, 0xa086, 0x007e, 0x2069, 0xcc90, 0x0130, ++ 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1500, 0x0098, 0x2d04, 0xd0e4, ++ 0x01e0, 0x00d6, 0x2069, 0xcc8e, 0x00c6, 0x2061, 0xc8f9, 0x6810, ++ 0x2062, 0x6814, 0x6006, 0x6818, 0x600a, 0x681c, 0x600e, 0x00ce, ++ 0x00de, 0x8d69, 0x2d04, 0x2069, 0x0140, 0xa005, 0x1110, 0x2001, ++ 0x0001, 0x6886, 0x2069, 0xc600, 0x68a6, 0x2069, 0xcc8e, 0x6808, ++ 0x605e, 0x6810, 0x6062, 0x6138, 0xa10a, 0x0208, 0x603a, 0x6814, ++ 0x6066, 0x2099, 0xcc96, 0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, ++ 0x53a3, 0x2099, 0xcc9a, 0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, ++ 0x53a3, 0x2069, 0xccae, 0x6808, 0x606a, 0x690c, 0x616e, 0x6810, ++ 0x6072, 0x6818, 0x6076, 0x60a0, 0xa086, 0x007e, 0x1120, 0x2069, ++ 0xcc8e, 0x690c, 0x616e, 0xa182, 0x0211, 0x1218, 0x2009, 0x0008, ++ 0x0400, 0xa182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0, 0xa182, ++ 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0xa182, 0x0349, 0x1218, ++ 0x2009, 0x0005, 0x0070, 0xa182, 0x0421, 0x1218, 0x2009, 0x0004, ++ 0x0040, 0xa182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010, 0x2009, ++ 0x0002, 0x6192, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, 0x0016, ++ 0x0026, 0x00e6, 0x2071, 0xcc8d, 0x2e04, 0x6896, 0x2071, 0xcc8e, ++ 0x7004, 0x689a, 0x701c, 0x689e, 0x6a00, 0x2009, 0xc672, 0x210c, ++ 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, ++ 0x0120, 0xd1e4, 0x0110, 0xc2bd, 0x0008, 0xc2bc, 0x6a02, 0x00ee, ++ 0x002e, 0x001e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, ++ 0xa06d, 0x01c0, 0x6900, 0x81ff, 0x1540, 0x6a04, 0xa282, 0x0010, ++ 0x1648, 0xad88, 0x0004, 0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, ++ 0x0128, 0x8108, 0x1f04, 0x5415, 0x080c, 0x1519, 0x260a, 0x8210, ++ 0x6a06, 0x0098, 0x080c, 0x1602, 0x01a8, 0x2d00, 0x60a6, 0x6803, ++ 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, ++ 0x1f04, 0x542d, 0x6807, 0x0001, 0x6e12, 0xa085, 0x0001, 0x012e, ++ 0x00de, 0x0005, 0xa006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x00d6, ++ 0x60a4, 0xa00d, 0x01a0, 0x2168, 0x6800, 0xa005, 0x1160, 0x080c, ++ 0x5568, 0x1168, 0x200b, 0xffff, 0x6804, 0xa08a, 0x0002, 0x0218, ++ 0x8001, 0x6806, 0x0020, 0x080c, 0x1619, 0x60a7, 0x0000, 0x00de, ++ 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x55c6, 0x0010, ++ 0x080c, 0x5221, 0x080c, 0x54e0, 0x1dd8, 0x080c, 0x54a7, 0x012e, ++ 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a8, 0xa06d, 0x01c0, ++ 0x6950, 0x81ff, 0x1540, 0x6a54, 0xa282, 0x0010, 0x1670, 0xad88, ++ 0x0018, 0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0128, 0x8108, ++ 0x1f04, 0x547b, 0x080c, 0x1519, 0x260a, 0x8210, 0x6a56, 0x0098, ++ 0x080c, 0x1602, 0x01d0, 0x2d00, 0x60aa, 0x6853, 0x0000, 0xad88, ++ 0x0018, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x5493, ++ 0x6857, 0x0001, 0x6e62, 0x0010, 0x080c, 0x5272, 0x0089, 0x1de0, ++ 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x79b6, 0x012e, 0x0005, 0xa01e, 0x0010, ++ 0x2019, 0x0001, 0xa00e, 0x0126, 0x2091, 0x8000, 0x604c, 0x2068, ++ 0x6000, 0xd0dc, 0x1170, 0x8dff, 0x01f8, 0x83ff, 0x0120, 0x6848, ++ 0xa606, 0x0158, 0x0030, 0x683c, 0xa406, 0x1118, 0x6840, 0xa506, ++ 0x0120, 0x2d08, 0x6800, 0x2068, 0x0c70, 0x080c, 0x8fb7, 0x6a00, ++ 0x604c, 0xad06, 0x1110, 0x624e, 0x0018, 0xa180, 0x0000, 0x2202, ++ 0x82ff, 0x1110, 0x6152, 0x8dff, 0x012e, 0x0005, 0xa01e, 0x0010, ++ 0x2019, 0x0001, 0xa00e, 0x6080, 0x2068, 0x8dff, 0x01e8, 0x83ff, ++ 0x0120, 0x6848, 0xa606, 0x0158, 0x0030, 0x683c, 0xa406, 0x1118, ++ 0x6840, 0xa506, 0x0120, 0x2d08, 0x6800, 0x2068, 0x0c70, 0x6a00, ++ 0x6080, 0xad06, 0x1110, 0x6282, 0x0018, 0xa180, 0x0000, 0x2202, ++ 0x82ff, 0x1110, 0x6186, 0x8dff, 0x0005, 0xa016, 0x080c, 0x5562, ++ 0x1110, 0x2011, 0x0001, 0x080c, 0x55ad, 0x1110, 0xa295, 0x0002, ++ 0x0005, 0x080c, 0x55de, 0x0118, 0x080c, 0xad46, 0x0010, 0xa085, ++ 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, 0x080c, 0xacd6, 0x0010, ++ 0xa085, 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, 0x080c, 0xad29, ++ 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, 0x080c, ++ 0xacf2, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, ++ 0x080c, 0xad62, 0x0010, 0xa085, 0x0001, 0x0005, 0x0126, 0x0006, ++ 0x00d6, 0x2091, 0x8000, 0x6080, 0xa06d, 0x01a0, 0x6800, 0x0006, ++ 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0xaf03, 0x0006, ++ 0x6000, 0xd0fc, 0x0110, 0x080c, 0xc4e0, 0x000e, 0x080c, 0x580a, ++ 0x000e, 0x0c50, 0x6083, 0x0000, 0x6087, 0x0000, 0x00de, 0x000e, ++ 0x012e, 0x0005, 0x60a4, 0xa00d, 0x1118, 0xa085, 0x0001, 0x0005, ++ 0x00e6, 0x2170, 0x7000, 0xa005, 0x1168, 0x20a9, 0x0010, 0xae88, ++ 0x0004, 0x2104, 0xa606, 0x0130, 0x8108, 0x1f04, 0x5571, 0xa085, ++ 0x0001, 0x0008, 0xa006, 0x00ee, 0x0005, 0x00d6, 0x0126, 0x2091, ++ 0x8000, 0x60a4, 0xa06d, 0x1128, 0x080c, 0x1602, 0x01a0, 0x2d00, ++ 0x60a6, 0x6803, 0x0001, 0x6807, 0x0000, 0xad88, 0x0004, 0x20a9, ++ 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x5591, 0xa085, 0x0001, ++ 0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, 0x00d6, 0x0126, 0x2091, ++ 0x8000, 0x60a4, 0xa06d, 0x0130, 0x60a7, 0x0000, 0x080c, 0x1619, ++ 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0x60a8, 0xa00d, 0x1118, ++ 0xa085, 0x0001, 0x0005, 0x00e6, 0x2170, 0x7050, 0xa005, 0x1160, ++ 0x20a9, 0x0010, 0xae88, 0x0018, 0x2104, 0xa606, 0x0128, 0x8108, ++ 0x1f04, 0x55bc, 0xa085, 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, ++ 0x8000, 0x0c19, 0x1188, 0x200b, 0xffff, 0x00d6, 0x60a8, 0x2068, ++ 0x6854, 0xa08a, 0x0002, 0x0218, 0x8001, 0x6856, 0x0020, 0x080c, ++ 0x1619, 0x60ab, 0x0000, 0x00de, 0x012e, 0x0005, 0x609c, 0xd0a4, ++ 0x0005, 0x00f6, 0x080c, 0x5f22, 0x01b0, 0x71b8, 0x81ff, 0x1198, ++ 0x71d4, 0xd19c, 0x0180, 0x2001, 0x007e, 0xa080, 0xc77b, 0x2004, ++ 0xa07d, 0x0148, 0x7804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1118, ++ 0x7800, 0xc0ed, 0x7802, 0x2079, 0xc652, 0x7804, 0xd0a4, 0x01e8, ++ 0x0156, 0x00c6, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, ++ 0x533d, 0x1168, 0x6004, 0xa084, 0xff00, 0x8007, 0xa096, 0x0004, ++ 0x0118, 0xa086, 0x0006, 0x1118, 0x6000, 0xc0ed, 0x6002, 0x001e, ++ 0x8108, 0x1f04, 0x5606, 0x00ce, 0x015e, 0x080c, 0x570b, 0x0120, ++ 0x2001, 0xc8fc, 0x200c, 0x0038, 0x2079, 0xc652, 0x7804, 0xd0a4, ++ 0x0130, 0x2009, 0x07d0, 0x2011, 0x5631, 0x080c, 0x7036, 0x00fe, ++ 0x0005, 0x2011, 0x5631, 0x080c, 0x6fad, 0x080c, 0x570b, 0x01f0, ++ 0x2001, 0xc7f9, 0x2004, 0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102, ++ 0x2001, 0xc653, 0x2004, 0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011, ++ 0x5631, 0x080c, 0x7036, 0x00e6, 0x2071, 0xc600, 0x7073, 0x0000, ++ 0x7077, 0x0000, 0x080c, 0x2c62, 0x00ee, 0x04b0, 0x0156, 0x00c6, ++ 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x533d, 0x1530, ++ 0x6000, 0xd0ec, 0x0518, 0x0046, 0x62a0, 0xa294, 0x00ff, 0x8227, ++ 0xa006, 0x2009, 0x0029, 0x080c, 0xc190, 0x6000, 0xc0e5, 0xc0ec, ++ 0x6002, 0x6004, 0xa084, 0x00ff, 0xa085, 0x0700, 0x6006, 0x2019, ++ 0x0029, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, ++ 0x2009, 0x0000, 0x080c, 0xbef7, 0x007e, 0x004e, 0x001e, 0x8108, ++ 0x1f04, 0x565c, 0x00ce, 0x015e, 0x0005, 0x00c6, 0x6018, 0x2060, ++ 0x6000, 0xc0ec, 0x6002, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x080c, ++ 0x15e5, 0x2d60, 0x0508, 0x2009, 0x00ff, 0x60a7, 0x0000, 0x60ab, ++ 0x0000, 0x080c, 0x4f47, 0x6007, 0x0006, 0x6013, 0x00ff, 0x6017, ++ 0xffff, 0x606f, 0x0200, 0x606c, 0x6093, 0x0002, 0x60bb, 0x0520, ++ 0x60a3, 0x00ff, 0x60b7, 0x0000, 0x60af, 0x0000, 0x2c08, 0x2001, ++ 0xc8d3, 0x2102, 0xa085, 0x0001, 0x00de, 0x00ce, 0x0005, 0x7818, ++ 0x2004, 0xd0ac, 0x0005, 0x7818, 0x2004, 0xd0bc, 0x0005, 0x0156, ++ 0x00e6, 0x00d6, 0x00c6, 0x0026, 0x20a9, 0x00ff, 0x2009, 0x0000, ++ 0x0016, 0x080c, 0x533d, 0x1178, 0x2c70, 0x70ac, 0xa005, 0x0158, ++ 0x2060, 0x620c, 0x0026, 0x6010, 0x2068, 0x080c, 0x761a, 0x002e, ++ 0x2260, 0x82ff, 0x1db0, 0x001e, 0x8108, 0x1f04, 0x56d0, 0x002e, ++ 0x00ce, 0x00de, 0x00ee, 0x015e, 0x0005, 0x0006, 0x0016, 0x0026, ++ 0x6004, 0xa08c, 0x00ff, 0xa196, 0x0006, 0x0188, 0xa196, 0x0004, ++ 0x0170, 0xa196, 0x0005, 0x0158, 0xa08c, 0xff00, 0x810f, 0xa196, ++ 0x0006, 0x0128, 0xa196, 0x0004, 0x0110, 0xa196, 0x0005, 0x002e, ++ 0x001e, 0x000e, 0x0005, 0x00f6, 0x2001, 0xc7f9, 0x2004, 0xa07d, ++ 0x0110, 0x7800, 0xd0ec, 0x00fe, 0x0005, 0x0126, 0x0026, 0x2091, ++ 0x8000, 0x0006, 0x62a0, 0xa290, 0xc77b, 0x2204, 0xac06, 0x190c, ++ 0x1519, 0x000e, 0x6200, 0xa005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, ++ 0x6202, 0x002e, 0x012e, 0x0005, 0x2011, 0xc635, 0x2204, 0xd0cc, ++ 0x0138, 0x2001, 0xc8fa, 0x200c, 0x2011, 0x5739, 0x080c, 0x7036, ++ 0x0005, 0x2011, 0x5739, 0x080c, 0x6fad, 0x2011, 0xc635, 0x2204, ++ 0xc0cc, 0x2012, 0x0005, 0x2071, 0xc734, 0x7003, 0x0001, 0x7007, ++ 0x0000, 0x7013, 0x0000, 0x7017, 0x0000, 0x701b, 0x0000, 0x701f, ++ 0x0000, 0x700b, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000, 0x705b, ++ 0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x2071, 0xc8c3, 0x7003, ++ 0xc734, 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0xc8a3, 0x7013, ++ 0x0020, 0x7017, 0x0040, 0x7037, 0x0000, 0x0005, 0x0016, 0x00e6, ++ 0x2071, 0xc87b, 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001, ++ 0xc653, 0x2004, 0xd0fc, 0x1150, 0x2001, 0xc653, 0x2004, 0xa00e, ++ 0xd09c, 0x0108, 0x8108, 0x7102, 0x0804, 0x57d4, 0x2001, 0xc672, ++ 0x200c, 0xa184, 0x000f, 0x2009, 0xc673, 0x210c, 0x0002, 0x577c, ++ 0x57af, 0x57b6, 0x57c0, 0x57c5, 0x577c, 0x577c, 0x577c, 0x579f, ++ 0x577c, 0x577c, 0x577c, 0x577c, 0x577c, 0x577c, 0x577c, 0x7003, ++ 0x0004, 0x0136, 0x0146, 0x0156, 0x2099, 0xc676, 0x20a1, 0xc8cc, ++ 0x20a9, 0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, 0x0428, 0x708f, ++ 0x0005, 0x7007, 0x0122, 0x2001, 0x0002, 0x0030, 0x708f, 0x0002, ++ 0x7007, 0x0121, 0x2001, 0x0003, 0x7002, 0x7097, 0x0001, 0x0088, ++ 0x7007, 0x0122, 0x2001, 0x0002, 0x0020, 0x7007, 0x0121, 0x2001, ++ 0x0003, 0x7002, 0xa006, 0x7096, 0x708e, 0xa184, 0xff00, 0x8007, ++ 0x709a, 0xa184, 0x00ff, 0x7092, 0x00ee, 0x001e, 0x0005, 0x00e6, ++ 0x2071, 0xc734, 0x684c, 0xa005, 0x1130, 0x7028, 0xc085, 0x702a, ++ 0xa085, 0x0001, 0x0428, 0x6a60, 0x7236, 0x6b64, 0x733a, 0x6868, ++ 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e, 0x6844, ++ 0x7032, 0x2009, 0x000d, 0x200a, 0x700b, 0x0000, 0x8007, 0x8006, ++ 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, ++ 0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0xa006, ++ 0x00ee, 0x0005, 0x0156, 0x00e6, 0x0026, 0x6838, 0xd0fc, 0x1904, ++ 0x5863, 0x6804, 0xa00d, 0x0188, 0x00d6, 0x2071, 0xc600, 0xa016, ++ 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, ++ 0x702e, 0x70b4, 0xa200, 0x70b6, 0x00de, 0x2071, 0xc734, 0x701c, ++ 0xa005, 0x1904, 0x5873, 0x20a9, 0x0032, 0x0f04, 0x5871, 0x0e04, ++ 0x582d, 0x2071, 0xc87b, 0x7200, 0x82ff, 0x05d8, 0x6934, 0xa186, ++ 0x0103, 0x1904, 0x5881, 0x6948, 0x6844, 0xa105, 0x1540, 0x2009, ++ 0x8020, 0x2200, 0x0002, 0x5871, 0x5848, 0x58e8, 0x58f5, 0x5871, ++ 0x2071, 0x0000, 0x20a9, 0x0032, 0x0f04, 0x5871, 0x7018, 0xd084, ++ 0x1dd8, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, ++ 0x2091, 0x4080, 0x2071, 0xc600, 0x702c, 0x206a, 0x2d00, 0x702e, ++ 0x70b4, 0x8000, 0x70b6, 0x002e, 0x00ee, 0x015e, 0x0005, 0x6844, ++ 0xa086, 0x0100, 0x1130, 0x6868, 0xa005, 0x1118, 0x2009, 0x8020, ++ 0x0880, 0x2071, 0xc734, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000, ++ 0x7012, 0x7018, 0xa06d, 0x711a, 0x0110, 0x6902, 0x0008, 0x711e, ++ 0x0c10, 0xa18c, 0x00ff, 0xa186, 0x0013, 0x01e0, 0xa186, 0x001b, ++ 0x01c8, 0xa186, 0x0023, 0x01e8, 0xa186, 0x0017, 0x0130, 0xa186, ++ 0x001e, 0x0118, 0xa18e, 0x001f, 0x19e0, 0x684c, 0xd0cc, 0x09c8, ++ 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x1998, 0x2009, 0x8021, ++ 0x0804, 0x5841, 0x6848, 0xa005, 0x1960, 0x2009, 0x8022, 0x0804, ++ 0x5841, 0x2071, 0x0000, 0x7018, 0xd084, 0x1918, 0x00e6, 0x2071, ++ 0xc682, 0x7140, 0x00ee, 0x6838, 0xa102, 0x0a04, 0x5871, 0x684c, ++ 0xa005, 0x1158, 0x00e6, 0x2071, 0xc682, 0x7004, 0x00ee, 0xd08c, ++ 0x1904, 0x5871, 0x2001, 0x8024, 0x0040, 0x6848, 0xd084, 0x1118, ++ 0x2001, 0x8023, 0x0010, 0x2001, 0x8027, 0x7022, 0x6840, 0x7026, ++ 0x683c, 0x702a, 0x6850, 0x702e, 0x0026, 0x0036, 0x6b38, 0x2e10, ++ 0xa290, 0x0072, 0x2d00, 0xa080, 0x0015, 0x200c, 0x2112, 0x8000, ++ 0x200c, 0x8210, 0x8319, 0x1dd0, 0x003e, 0x002e, 0x0804, 0x5856, ++ 0x7084, 0x8008, 0xa092, 0x001e, 0x1a04, 0x5871, 0x7186, 0xae90, ++ 0x0003, 0xa210, 0x683c, 0x2012, 0x0080, 0x7084, 0x8008, 0xa092, ++ 0x000f, 0x1a04, 0x5871, 0x7186, 0xae90, 0x0003, 0x8003, 0xa210, ++ 0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7088, 0xa10a, 0x0a04, ++ 0x585a, 0x718c, 0x7084, 0xa10a, 0x0a04, 0x585a, 0x2071, 0x0000, ++ 0x7018, 0xd084, 0x1904, 0x585a, 0x2071, 0xc87b, 0x7000, 0xa086, ++ 0x0002, 0x1150, 0x080c, 0x5b75, 0x2071, 0x0000, 0x701b, 0x0001, ++ 0x2091, 0x4080, 0x0804, 0x585a, 0x080c, 0x5b9f, 0x2071, 0x0000, ++ 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, 0x585a, 0x0006, 0x684c, ++ 0x0006, 0x6837, 0x0103, 0x20a9, 0x001c, 0xad80, 0x0011, 0x20a0, ++ 0x2001, 0x0000, 0x40a4, 0x000e, 0xa084, 0x00ff, 0x684e, 0x000e, ++ 0x684a, 0x6952, 0x0005, 0x2071, 0xc734, 0x7004, 0x0002, 0x5951, ++ 0x5962, 0x5b60, 0x5b61, 0x5b6e, 0x5b74, 0x5952, 0x5b51, 0x5ae7, ++ 0x5b3d, 0x0005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x5961, 0x2009, ++ 0x000d, 0x7030, 0x200a, 0x2091, 0x4080, 0x7007, 0x0001, 0x700b, ++ 0x0000, 0x012e, 0x2069, 0xc93a, 0x683c, 0xa005, 0x03f8, 0x11f0, ++ 0x0126, 0x2091, 0x8000, 0x2069, 0x0000, 0x6934, 0x2001, 0xc740, ++ 0x2004, 0xa10a, 0x0170, 0x0e04, 0x5985, 0x2069, 0x0000, 0x6818, ++ 0xd084, 0x1158, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, ++ 0x4080, 0x2069, 0xc93a, 0x683f, 0xffff, 0x012e, 0x2069, 0xc600, ++ 0x6848, 0x6968, 0xa102, 0x2069, 0xc87b, 0x688a, 0x6984, 0x701c, ++ 0xa06d, 0x0120, 0x81ff, 0x0904, 0x59db, 0x00a0, 0x81ff, 0x0904, ++ 0x5aa1, 0x2071, 0xc87b, 0x7184, 0x7088, 0xa10a, 0x1258, 0x7190, ++ 0x2071, 0xc93a, 0x7038, 0xa005, 0x0128, 0x1b04, 0x5aa1, 0x713a, ++ 0x0804, 0x5aa1, 0x2071, 0xc87b, 0x718c, 0x0126, 0x2091, 0x8000, ++ 0x7084, 0xa10a, 0x0a04, 0x5abc, 0x0e04, 0x5a5d, 0x2071, 0x0000, ++ 0x7018, 0xd084, 0x1904, 0x5a5d, 0x2001, 0xffff, 0x2071, 0xc93a, ++ 0x703a, 0x2071, 0xc87b, 0x7000, 0xa086, 0x0002, 0x1150, 0x080c, ++ 0x5b75, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, ++ 0x5a5d, 0x080c, 0x5b9f, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, ++ 0x4080, 0x0804, 0x5a5d, 0x2071, 0xc87b, 0x7000, 0xa005, 0x0904, ++ 0x5a83, 0x6934, 0xa186, 0x0103, 0x1904, 0x5a60, 0x684c, 0xd0bc, ++ 0x1904, 0x5a83, 0x6948, 0x6844, 0xa105, 0x1904, 0x5a78, 0x2009, ++ 0x8020, 0x2071, 0xc87b, 0x7000, 0x0002, 0x5a83, 0x5a43, 0x5a1b, ++ 0x5a2d, 0x59fa, 0x0136, 0x0146, 0x0156, 0x2099, 0xc676, 0x20a1, ++ 0xc8cc, 0x20a9, 0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, 0x2071, ++ 0xc8c3, 0xad80, 0x000f, 0x700e, 0x7013, 0x0002, 0x7007, 0x0002, ++ 0x700b, 0x0000, 0x2e10, 0x080c, 0x164d, 0x2071, 0xc734, 0x7007, ++ 0x0009, 0x0804, 0x5aa1, 0x7084, 0x8008, 0xa092, 0x001e, 0x1a04, ++ 0x5aa1, 0xae90, 0x0003, 0xa210, 0x683c, 0x2012, 0x7186, 0x2071, ++ 0xc734, 0x080c, 0x5bf6, 0x0804, 0x5aa1, 0x7084, 0x8008, 0xa092, ++ 0x000f, 0x1a04, 0x5aa1, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, ++ 0x2012, 0x8210, 0x6840, 0x2012, 0x7186, 0x2071, 0xc734, 0x080c, ++ 0x5bf6, 0x0804, 0x5aa1, 0x0126, 0x2091, 0x8000, 0x0e04, 0x5a5d, ++ 0x2071, 0x0000, 0x7018, 0xd084, 0x1180, 0x7122, 0x683c, 0x7026, ++ 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080, 0x012e, 0x2071, ++ 0xc734, 0x080c, 0x5bf6, 0x0804, 0x5aa1, 0x012e, 0x0804, 0x5aa1, ++ 0xa18c, 0x00ff, 0xa186, 0x0017, 0x0130, 0xa186, 0x001e, 0x0118, ++ 0xa18e, 0x001f, 0x11c0, 0x684c, 0xd0cc, 0x01a8, 0x6850, 0xa084, ++ 0x00ff, 0xa086, 0x0001, 0x1178, 0x2009, 0x8021, 0x0804, 0x59f1, ++ 0x6844, 0xa086, 0x0100, 0x1138, 0x6868, 0xa005, 0x1120, 0x2009, ++ 0x8020, 0x0804, 0x59f1, 0x2071, 0xc734, 0x080c, 0x5c08, 0x01c8, ++ 0x2071, 0xc734, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, ++ 0x0003, 0x1130, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0108, 0x710e, ++ 0x7007, 0x0003, 0x080c, 0x5c21, 0x7050, 0xa086, 0x0100, 0x0904, ++ 0x5b61, 0x0126, 0x2091, 0x8000, 0x2071, 0xc734, 0x7008, 0xa086, ++ 0x0001, 0x1180, 0x0e04, 0x5aba, 0x2009, 0x000d, 0x7030, 0x200a, ++ 0x2091, 0x4080, 0x700b, 0x0000, 0x7004, 0xa086, 0x0006, 0x1110, ++ 0x7007, 0x0001, 0x012e, 0x0005, 0x2071, 0xc734, 0x080c, 0x5c08, ++ 0x0518, 0x2071, 0xc87b, 0x7084, 0x700a, 0x20a9, 0x0020, 0x2099, ++ 0xc87c, 0x20a1, 0xc8a3, 0x53a3, 0x7087, 0x0000, 0x2071, 0xc734, ++ 0x2069, 0xc8c3, 0x706c, 0x6826, 0x7070, 0x682a, 0x7074, 0x682e, ++ 0x7078, 0x6832, 0x2d10, 0x080c, 0x164d, 0x7007, 0x0008, 0x2001, ++ 0xffff, 0x2071, 0xc93a, 0x703a, 0x012e, 0x0804, 0x5aa1, 0x2069, ++ 0xc8c3, 0x6808, 0xa08e, 0x0000, 0x0904, 0x5b3c, 0xa08e, 0x0200, ++ 0x0904, 0x5b3a, 0xa08e, 0x0100, 0x1904, 0x5b3c, 0x0126, 0x2091, ++ 0x8000, 0x0e04, 0x5b38, 0x2069, 0x0000, 0x6818, 0xd084, 0x15c0, ++ 0x702c, 0x7130, 0x8108, 0xa102, 0x0230, 0xa00e, 0x7034, 0x706e, ++ 0x7038, 0x7072, 0x0048, 0x706c, 0xa080, 0x0040, 0x706e, 0x1220, ++ 0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x6936, 0x700b, 0x0000, ++ 0x2001, 0xc8a0, 0x2004, 0xa005, 0x1190, 0x6934, 0x2069, 0xc87b, ++ 0x689c, 0x699e, 0x2069, 0xc93a, 0xa102, 0x1118, 0x683c, 0xa005, ++ 0x1368, 0x2001, 0xc8a1, 0x200c, 0x810d, 0x693e, 0x0038, 0x2009, ++ 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, ++ 0x012e, 0x0010, 0x7007, 0x0005, 0x0005, 0x2001, 0xc8c5, 0x2004, ++ 0xa08e, 0x0100, 0x1128, 0x7007, 0x0001, 0x080c, 0x5bf6, 0x0005, ++ 0xa08e, 0x0000, 0x0de0, 0xa08e, 0x0200, 0x1dc8, 0x7007, 0x0005, ++ 0x0005, 0x701c, 0xa06d, 0x0158, 0x080c, 0x5c08, 0x0140, 0x7007, ++ 0x0003, 0x080c, 0x5c21, 0x7050, 0xa086, 0x0100, 0x0110, 0x0005, ++ 0x0005, 0x7050, 0xa09e, 0x0100, 0x1118, 0x7007, 0x0004, 0x0030, ++ 0xa086, 0x0200, 0x1110, 0x7007, 0x0005, 0x0005, 0x080c, 0x5bc4, ++ 0x7006, 0x080c, 0x5bf6, 0x0005, 0x0005, 0x00e6, 0x0156, 0x2071, ++ 0xc87b, 0x7184, 0x81ff, 0x0500, 0xa006, 0x7086, 0xae80, 0x0003, ++ 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x0f04, 0x5b99, ++ 0x2014, 0x722a, 0x8000, 0x0f04, 0x5b99, 0x2014, 0x722e, 0x8000, ++ 0x0f04, 0x5b99, 0x2014, 0x723a, 0x8000, 0x0f04, 0x5b99, 0x2014, ++ 0x723e, 0xa180, 0x8030, 0x7022, 0x015e, 0x00ee, 0x0005, 0x00e6, ++ 0x0156, 0x2071, 0xc87b, 0x7184, 0x81ff, 0x01d8, 0xa006, 0x7086, ++ 0xae80, 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, ++ 0x2014, 0x722a, 0x8000, 0x0f04, 0x5bbb, 0x2014, 0x723a, 0x8000, ++ 0x2014, 0x723e, 0x0018, 0x2001, 0x8020, 0x0010, 0x2001, 0x8042, ++ 0x7022, 0x015e, 0x00ee, 0x0005, 0x702c, 0x7130, 0x8108, 0xa102, ++ 0x0230, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072, 0x0048, 0x706c, ++ 0xa080, 0x0040, 0x706e, 0x1220, 0x7070, 0xa081, 0x0000, 0x7072, ++ 0x7132, 0x700c, 0x8001, 0x700e, 0x1180, 0x0126, 0x2091, 0x8000, ++ 0x0e04, 0x5bf0, 0x2001, 0x000d, 0x2102, 0x2091, 0x4080, 0x2001, ++ 0x0001, 0x700b, 0x0000, 0x012e, 0x0005, 0x2001, 0x0007, 0x0005, ++ 0x2001, 0x0006, 0x700b, 0x0001, 0x012e, 0x0005, 0x701c, 0xa06d, ++ 0x0170, 0x0126, 0x2091, 0x8000, 0x7010, 0x8001, 0x7012, 0x2d04, ++ 0x701e, 0xa005, 0x1108, 0x701a, 0x012e, 0x080c, 0x1619, 0x0005, ++ 0x2019, 0x000d, 0x2304, 0x230c, 0xa10e, 0x0130, 0x2304, 0x230c, ++ 0xa10e, 0x0110, 0xa006, 0x0060, 0x732c, 0x8319, 0x7130, 0xa102, ++ 0x1118, 0x2300, 0xa005, 0x0020, 0x0210, 0xa302, 0x0008, 0x8002, ++ 0x0005, 0x2d00, 0x7026, 0xa080, 0x000d, 0x7056, 0x7053, 0x0000, ++ 0x0126, 0x2091, 0x8000, 0x2009, 0xc959, 0x2104, 0xc08d, 0x200a, ++ 0x012e, 0x080c, 0x1669, 0x0005, 0x708c, 0xa08a, 0x0029, 0x1220, ++ 0xa082, 0x001d, 0x0033, 0x0010, 0x080c, 0x1519, 0x6027, 0x1e00, ++ 0x0005, 0x5d2f, 0x5caa, 0x5cc2, 0x5cff, 0x5d20, 0x5d5a, 0x5d6c, ++ 0x5cc2, 0x5d46, 0x5c4e, 0x5c7c, 0x5c4d, 0x0005, 0x00d6, 0x2069, ++ 0x0200, 0x6804, 0xa005, 0x1180, 0x6808, 0xa005, 0x1518, 0x708f, ++ 0x0028, 0x2069, 0xc90c, 0x2d04, 0x7002, 0x080c, 0x6024, 0x6028, ++ 0xa085, 0x0600, 0x602a, 0x00b0, 0x708f, 0x0028, 0x2069, 0xc90c, ++ 0x2d04, 0x7002, 0x6028, 0xa085, 0x0600, 0x602a, 0x00e6, 0x0036, ++ 0x0046, 0x0056, 0x2071, 0xc96a, 0x080c, 0x1ec3, 0x005e, 0x004e, ++ 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, ++ 0xa005, 0x1180, 0x6808, 0xa005, 0x1518, 0x708f, 0x0028, 0x2069, ++ 0xc90c, 0x2d04, 0x7002, 0x080c, 0x60b1, 0x6028, 0xa085, 0x0600, ++ 0x602a, 0x00b0, 0x708f, 0x0028, 0x2069, 0xc90c, 0x2d04, 0x7002, ++ 0x6028, 0xa085, 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, ++ 0x2071, 0xc96a, 0x080c, 0x1ec3, 0x005e, 0x004e, 0x003e, 0x00ee, ++ 0x00de, 0x0005, 0x6803, 0x0090, 0x6124, 0xd1e4, 0x1190, 0x080c, ++ 0x5dd7, 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x708f, ++ 0x0020, 0x080c, 0x5dd7, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, ++ 0x001f, 0x0005, 0x6803, 0x0088, 0x6124, 0xd1cc, 0x1590, 0xd1dc, ++ 0x1568, 0xd1e4, 0x1540, 0xa184, 0x1e00, 0x1580, 0x60e3, 0x0001, ++ 0x600c, 0xc0b4, 0x600e, 0x080c, 0x5f52, 0x080c, 0x25fb, 0x0156, ++ 0x6803, 0x0100, 0x20a9, 0x0014, 0x6804, 0xd0dc, 0x1118, 0x1f04, ++ 0x5cdc, 0x0048, 0x20a9, 0x0014, 0x6803, 0x0080, 0x6804, 0xd0d4, ++ 0x1130, 0x1f04, 0x5ce6, 0x080c, 0x5f73, 0x015e, 0x0078, 0x015e, ++ 0x708f, 0x0028, 0x0058, 0x708f, 0x001e, 0x0040, 0x708f, 0x001d, ++ 0x0028, 0x708f, 0x0020, 0x0010, 0x708f, 0x001f, 0x0005, 0x60e3, ++ 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x5f52, 0x080c, 0x25fb, ++ 0x6803, 0x0080, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4, ++ 0x1130, 0xa184, 0x1e00, 0x1158, 0x708f, 0x0028, 0x0040, 0x708f, ++ 0x001e, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, 0x001f, 0x0005, ++ 0x6803, 0x00a0, 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, ++ 0x1f06, 0x708f, 0x001e, 0x0010, 0x708f, 0x001d, 0x0005, 0x080c, ++ 0x5e49, 0x6124, 0xd1dc, 0x1188, 0x080c, 0x5dd7, 0x0016, 0x080c, ++ 0x1f06, 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x708f, 0x001e, ++ 0x0020, 0x708f, 0x001f, 0x080c, 0x5dd7, 0x0005, 0x6803, 0x00a0, ++ 0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, ++ 0x0140, 0x708f, 0x001e, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, ++ 0x0021, 0x0005, 0x080c, 0x5e49, 0x6124, 0xd1d4, 0x1150, 0xd1dc, ++ 0x1128, 0xd1e4, 0x0140, 0x708f, 0x001e, 0x0028, 0x708f, 0x001d, ++ 0x0010, 0x708f, 0x001f, 0x0005, 0x6803, 0x0090, 0x6124, 0xd1d4, ++ 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x708f, ++ 0x001e, 0x0040, 0x708f, 0x001d, 0x0028, 0x708f, 0x0020, 0x0010, ++ 0x708f, 0x001f, 0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, ++ 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0xc600, 0x2091, 0x8000, ++ 0x080c, 0x5f22, 0x11e8, 0x2001, 0xc60c, 0x200c, 0xd1b4, 0x01c0, ++ 0xc1b4, 0x2102, 0x6027, 0x0200, 0xe000, 0xe000, 0x6024, 0xd0cc, ++ 0x0158, 0x6803, 0x00a0, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, ++ 0xc600, 0x2003, 0x0001, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, ++ 0x080c, 0x5f3e, 0x0150, 0x080c, 0x5f34, 0x1138, 0x2001, 0x0001, ++ 0x080c, 0x296d, 0x080c, 0x5ef9, 0x00a0, 0x080c, 0x5e46, 0x0178, ++ 0x2001, 0x0001, 0x080c, 0x296d, 0x708c, 0xa086, 0x001e, 0x0120, ++ 0x708c, 0xa086, 0x0022, 0x1118, 0x708f, 0x0025, 0x0010, 0x708f, ++ 0x0021, 0x012e, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, ++ 0x2011, 0x5de8, 0x080c, 0x7070, 0x002e, 0x0016, 0x0026, 0x2009, ++ 0x0064, 0x2011, 0x5de8, 0x080c, 0x7067, 0x002e, 0x001e, 0x0005, ++ 0x00e6, 0x00f6, 0x0016, 0x080c, 0x8bf5, 0x2071, 0xc600, 0x080c, ++ 0x5d83, 0x001e, 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, ++ 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0126, 0x080c, 0x8bf5, 0x2061, ++ 0x0100, 0x2069, 0x0140, 0x2071, 0xc600, 0x2091, 0x8000, 0x6028, ++ 0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, ++ 0x080c, 0x8f18, 0x080c, 0x8dee, 0x080c, 0x7024, 0x0036, 0x2019, ++ 0x0000, 0x080c, 0x8e79, 0x003e, 0x60e3, 0x0000, 0x080c, 0xc586, ++ 0x080c, 0xc5a1, 0x2001, 0xc600, 0x2003, 0x0004, 0x6027, 0x0008, ++ 0x080c, 0x12e1, 0x2001, 0x0001, 0x080c, 0x296d, 0x012e, 0x00fe, ++ 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x2001, ++ 0xc600, 0x2004, 0xa086, 0x0004, 0x0140, 0x2001, 0xc8e5, 0x2003, ++ 0xaaaa, 0x2001, 0xc8e6, 0x2003, 0x0000, 0x0005, 0x6020, 0xd09c, ++ 0x0005, 0x6800, 0xa086, 0x00c0, 0x0160, 0x6803, 0x00c0, 0x0156, ++ 0x20a9, 0x002d, 0x1d04, 0x5e52, 0x2091, 0x6000, 0x1f04, 0x5e52, ++ 0x015e, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, ++ 0x0140, 0x2071, 0xc600, 0x2001, 0xc8e6, 0x200c, 0xa186, 0x0000, ++ 0x0158, 0xa186, 0x0001, 0x0158, 0xa186, 0x0002, 0x0158, 0xa186, ++ 0x0003, 0x0158, 0x0804, 0x5ee7, 0x708f, 0x0022, 0x0040, 0x708f, ++ 0x0021, 0x0028, 0x708f, 0x0023, 0x0020, 0x708f, 0x0024, 0x6043, ++ 0x0000, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, ++ 0x2a1c, 0x0026, 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, ++ 0x080c, 0x8f18, 0x080c, 0x8dee, 0x0036, 0x2019, 0x0000, 0x080c, ++ 0x8e79, 0x003e, 0x002e, 0x7000, 0xa08e, 0x0004, 0x0118, 0x602b, ++ 0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, ++ 0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0120, 0x012e, 0x015e, 0x0804, ++ 0x5ef5, 0x6800, 0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6904, 0xd1d4, ++ 0x1130, 0x6803, 0x0100, 0x1f04, 0x5eaa, 0x080c, 0x5f73, 0x012e, ++ 0x015e, 0x080c, 0x5f34, 0x01a8, 0x6044, 0xa005, 0x0168, 0x6050, ++ 0x0006, 0xa085, 0x0020, 0x6052, 0x080c, 0x5f73, 0xa006, 0x8001, ++ 0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, ++ 0x5f73, 0x0016, 0x0026, 0x2009, 0x00c8, 0x2011, 0x5df5, 0x080c, ++ 0x7036, 0x002e, 0x001e, 0x2001, 0xc8e6, 0x2003, 0x0004, 0x080c, ++ 0x5c34, 0x080c, 0x5f34, 0x0148, 0x6804, 0xd0d4, 0x1130, 0xd0dc, ++ 0x1100, 0x2001, 0xc8e6, 0x2003, 0x0000, 0x00ee, 0x00de, 0x00ce, ++ 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, ++ 0x2071, 0xc600, 0x2001, 0xc8e5, 0x2003, 0x0000, 0x2001, 0xc8d6, ++ 0x2003, 0x0000, 0x708f, 0x0000, 0x60e3, 0x0000, 0x6887, 0x0000, ++ 0x2001, 0x0000, 0x080c, 0x2a1c, 0x6803, 0x0000, 0x6043, 0x0090, ++ 0x6043, 0x0010, 0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, ++ 0x00ce, 0x0005, 0x0006, 0x2001, 0xc8e5, 0x2004, 0xa086, 0xaaaa, ++ 0x000e, 0x0005, 0x0006, 0x2001, 0xc672, 0x2004, 0xa084, 0x0030, ++ 0xa086, 0x0000, 0x000e, 0x0005, 0x0006, 0x2001, 0xc672, 0x2004, ++ 0xa084, 0x0030, 0xa086, 0x0030, 0x000e, 0x0005, 0x0006, 0x2001, ++ 0xc672, 0x2004, 0xa084, 0x0030, 0xa086, 0x0010, 0x000e, 0x0005, ++ 0x0006, 0x2001, 0xc672, 0x2004, 0xa084, 0x0030, 0xa086, 0x0020, ++ 0x000e, 0x0005, 0x2001, 0xc60c, 0x2004, 0xd0a4, 0x0170, 0x080c, ++ 0x2a3c, 0x0036, 0x0016, 0x2009, 0x0000, 0x2019, 0x0028, 0x080c, ++ 0x2e19, 0x001e, 0x003e, 0xa006, 0x0009, 0x0005, 0x00e6, 0x2071, ++ 0xc60c, 0x2e04, 0x0118, 0xa085, 0x0010, 0x0010, 0xa084, 0xffef, ++ 0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, 0x60f0, 0x0006, 0x60ec, ++ 0x0006, 0x600c, 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x602f, ++ 0x0100, 0x602f, 0x0000, 0x602f, 0x0040, 0x602f, 0x0000, 0x000e, ++ 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x000e, ++ 0x60f2, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, ++ 0x2a1c, 0x6800, 0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6803, 0x00a0, ++ 0x000e, 0x6052, 0x6050, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, ++ 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, ++ 0xc600, 0x6020, 0xa084, 0x0080, 0x0138, 0x2001, 0xc60c, 0x200c, ++ 0xc1bd, 0x2102, 0x0804, 0x601c, 0x2001, 0xc60c, 0x200c, 0xc1bc, ++ 0x2102, 0x6028, 0xa084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x6803, ++ 0x0090, 0x20a9, 0x0384, 0x6024, 0xd0cc, 0x1508, 0x1d04, 0x5fcb, ++ 0x2091, 0x6000, 0x1f04, 0x5fcb, 0x2011, 0x0003, 0x080c, 0x8f0e, ++ 0x2011, 0x0002, 0x080c, 0x8f18, 0x080c, 0x8dee, 0x2019, 0x0000, ++ 0x080c, 0x8e79, 0x6803, 0x00a0, 0x2001, 0xc8e6, 0x2003, 0x0001, ++ 0x2001, 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x0468, 0x86ff, ++ 0x1120, 0x080c, 0x1f06, 0x080c, 0x25fb, 0x60e3, 0x0000, 0x2001, ++ 0xc8d6, 0x2004, 0x080c, 0x2a1c, 0x60e2, 0x6803, 0x0080, 0x20a9, ++ 0x0384, 0x6027, 0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, ++ 0x0138, 0x1d04, 0x6001, 0x2091, 0x6000, 0x1f04, 0x6001, 0x0820, ++ 0x6028, 0xa085, 0x1e00, 0x602a, 0x70a4, 0xa005, 0x1118, 0x6887, ++ 0x0001, 0x0008, 0x6886, 0xa006, 0x00ee, 0x00de, 0x00ce, 0x003e, ++ 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, ++ 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xc600, 0x2069, ++ 0x0140, 0x6020, 0xa084, 0x00c0, 0x0120, 0x6884, 0xa005, 0x1904, ++ 0x6078, 0x6803, 0x0088, 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, ++ 0x0000, 0x080c, 0x2a1c, 0x2069, 0x0200, 0x6804, 0xa005, 0x1118, ++ 0x6808, 0xa005, 0x01c0, 0x6028, 0xa084, 0xfbff, 0x602a, 0x6027, ++ 0x0400, 0x2069, 0xc90c, 0x7000, 0x206a, 0x708f, 0x0026, 0x7003, ++ 0x0001, 0x20a9, 0x0002, 0x1d04, 0x605b, 0x2091, 0x6000, 0x1f04, ++ 0x605b, 0x0804, 0x60a9, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, ++ 0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, 0x0520, 0xa084, ++ 0x1a00, 0x1508, 0x1d04, 0x6067, 0x2091, 0x6000, 0x1f04, 0x6067, ++ 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, 0x080c, 0x8f18, ++ 0x080c, 0x8dee, 0x2019, 0x0000, 0x080c, 0x8e79, 0x6803, 0x00a0, ++ 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, ++ 0xa085, 0x0001, 0x00b0, 0x080c, 0x25fb, 0x6803, 0x0080, 0x2069, ++ 0x0140, 0x60e3, 0x0000, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, ++ 0x0008, 0x6886, 0x2001, 0xc8d6, 0x2004, 0x080c, 0x2a1c, 0x60e2, ++ 0xa006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, ++ 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, ++ 0x2061, 0x0100, 0x2071, 0xc600, 0x6020, 0xa084, 0x00c0, 0x01e0, ++ 0x2011, 0x0003, 0x080c, 0x8f0e, 0x2011, 0x0002, 0x080c, 0x8f18, ++ 0x080c, 0x8dee, 0x2019, 0x0000, 0x080c, 0x8e79, 0x2069, 0x0140, ++ 0x6803, 0x00a0, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, ++ 0x2003, 0x0001, 0x0804, 0x614e, 0x2001, 0xc60c, 0x200c, 0xd1b4, ++ 0x1160, 0xc1b5, 0x2102, 0x080c, 0x5ddd, 0x2069, 0x0140, 0x080c, ++ 0x25fb, 0x6803, 0x0080, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, ++ 0xa005, 0x1118, 0x6808, 0xa005, 0x01c0, 0x6028, 0xa084, 0xfdff, ++ 0x602a, 0x6027, 0x0200, 0x2069, 0xc90c, 0x7000, 0x206a, 0x708f, ++ 0x0027, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x6105, 0x2091, ++ 0x6000, 0x1f04, 0x6105, 0x0804, 0x614e, 0x6027, 0x1e00, 0x2009, ++ 0x1e00, 0xe000, 0x6024, 0xa10c, 0x01c8, 0xa084, 0x1c00, 0x11b0, ++ 0x1d04, 0x610d, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, ++ 0x6f0a, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, ++ 0xc93a, 0x7018, 0x00ee, 0xa005, 0x1d00, 0x0500, 0x0026, 0x2011, ++ 0x5df5, 0x080c, 0x6fad, 0x2011, 0x5de8, 0x080c, 0x7070, 0x002e, ++ 0x2069, 0x0140, 0x60e3, 0x0000, 0x70a4, 0xa005, 0x1118, 0x6887, ++ 0x0001, 0x0008, 0x6886, 0x2001, 0xc8d6, 0x2004, 0x080c, 0x2a1c, ++ 0x60e2, 0x2001, 0xc60c, 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de, ++ 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, ++ 0x0026, 0x0036, 0x0046, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, ++ 0xc600, 0x7130, 0xd184, 0x1180, 0x2011, 0xc653, 0x2214, 0xd2ec, ++ 0x0138, 0xc18d, 0x7132, 0x2011, 0xc653, 0x2214, 0xd2ac, 0x1120, ++ 0x7030, 0xd08c, 0x0904, 0x61bb, 0x7130, 0xc185, 0x7132, 0x2011, ++ 0xc653, 0x220c, 0xd1a4, 0x0530, 0x0016, 0x2019, 0x000e, 0x080c, ++ 0xc10d, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000, 0xa186, 0x007e, ++ 0x01a0, 0xa186, 0x0080, 0x0188, 0x080c, 0x533d, 0x1170, 0x8127, ++ 0xa006, 0x0016, 0x2009, 0x000e, 0x080c, 0xc190, 0x2009, 0x0001, ++ 0x2011, 0x0100, 0x080c, 0x712e, 0x001e, 0x8108, 0x1f04, 0x6186, ++ 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0000, 0x2019, ++ 0x0004, 0x080c, 0x2e19, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, ++ 0x2009, 0x0000, 0x080c, 0x533d, 0x1110, 0x080c, 0x4f47, 0x8108, ++ 0x1f04, 0x61b2, 0x015e, 0x080c, 0x1f06, 0x2011, 0x0003, 0x080c, ++ 0x8f0e, 0x2011, 0x0002, 0x080c, 0x8f18, 0x080c, 0x8dee, 0x0036, ++ 0x2019, 0x0000, 0x080c, 0x8e79, 0x003e, 0x60e3, 0x0000, 0x2001, ++ 0xc600, 0x2003, 0x0001, 0x080c, 0x5e5a, 0x00ee, 0x00ce, 0x004e, ++ 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x2071, 0xc702, 0x7003, ++ 0x0000, 0x7007, 0x0000, 0x700f, 0x0000, 0x702b, 0x0001, 0x704f, ++ 0x0000, 0x7053, 0x0001, 0x705f, 0x0020, 0x7063, 0x0040, 0x7083, ++ 0x0000, 0x708b, 0x0000, 0x708f, 0x0001, 0x70bf, 0x0000, 0x0005, ++ 0x00e6, 0x2071, 0xc702, 0x6848, 0xa005, 0x1130, 0x7028, 0xc085, ++ 0x702a, 0xa085, 0x0001, 0x0428, 0x6a50, 0x7236, 0x6b54, 0x733a, ++ 0x6858, 0x703e, 0x707a, 0x685c, 0x7042, 0x707e, 0x6848, 0x702e, ++ 0x6840, 0x7032, 0x2009, 0x000c, 0x200a, 0x8007, 0x8006, 0x8006, ++ 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x7272, ++ 0x7376, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700f, 0x0000, ++ 0xa006, 0x00ee, 0x0005, 0x2b78, 0x2071, 0xc702, 0x7004, 0x0043, ++ 0x700c, 0x0002, 0x6237, 0x622e, 0x622e, 0x622e, 0x622e, 0x0005, ++ 0x628d, 0x628e, 0x62c0, 0x62c1, 0x628b, 0x630f, 0x6314, 0x6345, ++ 0x6346, 0x6361, 0x6362, 0x6363, 0x6364, 0x6365, 0x6366, 0x6431, ++ 0x6458, 0x700c, 0x0002, 0x6250, 0x628b, 0x628b, 0x628c, 0x628c, ++ 0x7830, 0x7930, 0xa106, 0x0120, 0x7830, 0x7930, 0xa106, 0x1510, ++ 0x7030, 0xa10a, 0x01f8, 0x1210, 0x712c, 0xa10a, 0xa18a, 0x0002, ++ 0x12d0, 0x080c, 0x15e5, 0x01b0, 0x2d00, 0x705a, 0x7063, 0x0040, ++ 0x2001, 0x0003, 0x7057, 0x0000, 0x0126, 0x0006, 0x2091, 0x8000, ++ 0x2009, 0xc959, 0x2104, 0xc085, 0x200a, 0x000e, 0x700e, 0x012e, ++ 0x080c, 0x1669, 0x0005, 0x080c, 0x15e5, 0x0de0, 0x2d00, 0x705a, ++ 0x080c, 0x15e5, 0x1108, 0x0c10, 0x2d00, 0x7086, 0x7063, 0x0080, ++ 0x2001, 0x0004, 0x08f8, 0x0005, 0x0005, 0x0005, 0x700c, 0x0002, ++ 0x6295, 0x6298, 0x62a6, 0x62bf, 0x62bf, 0x080c, 0x6249, 0x0005, ++ 0x0126, 0x8001, 0x700e, 0x7058, 0x0006, 0x080c, 0x67d4, 0x0120, ++ 0x2091, 0x8000, 0x080c, 0x6249, 0x00de, 0x0048, 0x0126, 0x8001, ++ 0x700e, 0x080c, 0x67d4, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, ++ 0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x003a, ++ 0x1218, 0x00db, 0x012e, 0x0005, 0x012e, 0x080c, 0x6367, 0x0005, ++ 0x0005, 0x0005, 0x00e6, 0x2071, 0xc702, 0x700c, 0x0002, 0x62cc, ++ 0x62cc, 0x62cc, 0x62ce, 0x62d1, 0x00ee, 0x0005, 0x700f, 0x0001, ++ 0x0010, 0x700f, 0x0002, 0x00ee, 0x0005, 0x6367, 0x6367, 0x6383, ++ 0x6367, 0x653e, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6383, ++ 0x6580, 0x65c3, 0x660c, 0x6620, 0x6367, 0x6367, 0x639f, 0x6383, ++ 0x63b3, 0x6367, 0x640e, 0x66cc, 0x66e7, 0x6367, 0x639f, 0x6367, ++ 0x63b3, 0x6367, 0x6367, 0x6404, 0x66e7, 0x6367, 0x6367, 0x6367, ++ 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x63c8, 0x6367, ++ 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, 0x6367, ++ 0x6866, 0x6367, 0x67f2, 0x6367, 0x67f2, 0x6367, 0x63dd, 0x7020, ++ 0x2068, 0x080c, 0x1619, 0x0005, 0x700c, 0x0002, 0x631b, 0x631e, ++ 0x632c, 0x6344, 0x6344, 0x080c, 0x6249, 0x0005, 0x0126, 0x8001, ++ 0x700e, 0x7058, 0x0006, 0x080c, 0x67d4, 0x0120, 0x2091, 0x8000, ++ 0x080c, 0x6249, 0x00de, 0x0048, 0x0126, 0x8001, 0x700e, 0x080c, ++ 0x67d4, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, ++ 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x001a, 0x1218, 0x003b, ++ 0x012e, 0x0005, 0x012e, 0x0419, 0x0005, 0x0005, 0x0005, 0x6367, ++ 0x6383, 0x652a, 0x6367, 0x6383, 0x6367, 0x6383, 0x6383, 0x6367, ++ 0x6383, 0x652a, 0x6383, 0x6383, 0x6383, 0x6383, 0x6383, 0x6367, ++ 0x6383, 0x652a, 0x6367, 0x6367, 0x6383, 0x6367, 0x6367, 0x6367, ++ 0x6383, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x7007, ++ 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x580a, 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, ++ 0xa084, 0x00ff, 0xc0e5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0x580a, 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, ++ 0xc0ed, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x580a, 0x012e, ++ 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x580a, 0x012e, 0x0005, 0x6834, ++ 0x8007, 0xa084, 0x00ff, 0x0988, 0x8001, 0x1120, 0x7007, 0x0001, ++ 0x0804, 0x64c1, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, ++ 0x704b, 0x64c1, 0x0005, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0904, ++ 0x6375, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x64de, 0x7007, ++ 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x64de, 0x0005, ++ 0x6834, 0x8007, 0xa084, 0x00ff, 0x0904, 0x6375, 0x8001, 0x1120, ++ 0x7007, 0x0001, 0x0804, 0x6507, 0x7007, 0x0006, 0x7012, 0x2d00, ++ 0x7016, 0x701a, 0x704b, 0x6507, 0x0005, 0x6834, 0x8007, 0xa084, ++ 0x00ff, 0xa086, 0x0001, 0x1904, 0x6375, 0x7007, 0x0001, 0x2009, ++ 0xc631, 0x210c, 0x81ff, 0x11a8, 0x6838, 0xa084, 0x00ff, 0x683a, ++ 0x6853, 0x0000, 0x080c, 0x5116, 0x1108, 0x0005, 0x0126, 0x2091, ++ 0x8000, 0x6837, 0x0139, 0x684a, 0x6952, 0x080c, 0x580a, 0x012e, ++ 0x0ca0, 0x2001, 0x0028, 0x0c90, 0x684c, 0xa084, 0x00c0, 0xa086, ++ 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x66ff, 0x2d00, 0x7016, ++ 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, 0x20a1, 0xc72d, ++ 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x1a04, 0x6391, 0x6a84, ++ 0xa28a, 0x0002, 0x1a04, 0x6391, 0x82ff, 0x1138, 0x6888, 0x698c, ++ 0xa105, 0x0118, 0x2001, 0x6494, 0x0018, 0xa280, 0x648a, 0x2005, ++ 0x70c6, 0x7010, 0xa015, 0x0904, 0x6476, 0x080c, 0x15e5, 0x1118, ++ 0x7007, 0x000f, 0x0005, 0x2d00, 0x7022, 0x70c4, 0x2060, 0x2c05, ++ 0x6836, 0xe004, 0xad00, 0x7096, 0xe008, 0xa20a, 0x1210, 0xa00e, ++ 0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0xa296, 0x0004, 0x0108, ++ 0xa108, 0x719a, 0x810b, 0x719e, 0xae90, 0x0022, 0x080c, 0x164d, ++ 0x7090, 0xa08e, 0x0100, 0x0170, 0xa086, 0x0200, 0x0118, 0x7007, ++ 0x0010, 0x0005, 0x7020, 0x2068, 0x080c, 0x1619, 0x7014, 0x2068, ++ 0x0804, 0x6391, 0x7020, 0x2068, 0x7018, 0x6802, 0x6807, 0x0000, ++ 0x2d08, 0x2068, 0x6906, 0x711a, 0x0804, 0x6431, 0x7014, 0x2068, ++ 0x7007, 0x0001, 0x6884, 0xa005, 0x1128, 0x6888, 0x698c, 0xa105, ++ 0x0108, 0x00b1, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x0904, ++ 0x66ff, 0x04b8, 0x648c, 0x6490, 0x0002, 0x0011, 0x0007, 0x0004, ++ 0x000a, 0x000f, 0x0005, 0x0006, 0x000a, 0x0011, 0x0005, 0x0004, ++ 0x00f6, 0x00e6, 0x00c6, 0x0076, 0x0066, 0x6f88, 0x6e8c, 0x6804, ++ 0x2060, 0xacf0, 0x0021, 0xacf8, 0x0027, 0x2009, 0x0005, 0x700c, ++ 0x7816, 0x7008, 0x7812, 0x7004, 0x7806, 0x7000, 0x7802, 0x7e0e, ++ 0x7f0a, 0x8109, 0x0128, 0xaef2, 0x0004, 0xaffa, 0x0006, 0x0c78, ++ 0x6004, 0xa065, 0x1d30, 0x006e, 0x007e, 0x00ce, 0x00ee, 0x00fe, ++ 0x0005, 0x2009, 0xc631, 0x210c, 0x81ff, 0x1198, 0x6838, 0xa084, ++ 0x00ff, 0x683a, 0x080c, 0x4fa6, 0x1108, 0x0005, 0x080c, 0x592e, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0xaf03, 0x080c, 0x580a, 0x012e, ++ 0x0ca0, 0x2001, 0x0028, 0x2009, 0x0000, 0x0c80, 0x2009, 0xc631, ++ 0x210c, 0x81ff, 0x11d8, 0x6858, 0xa005, 0x01d8, 0x2001, 0xc756, ++ 0x2004, 0xa086, 0x0000, 0x01c0, 0x6838, 0xa084, 0x00ff, 0x683a, ++ 0x6853, 0x0000, 0x080c, 0x5068, 0x1108, 0x0005, 0x684a, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x580a, 0x012e, 0x0cb8, 0x2001, 0x0028, ++ 0x0ca8, 0x2001, 0x0000, 0x0c90, 0x2001, 0x002c, 0x0c78, 0x2009, ++ 0xc631, 0x210c, 0x81ff, 0x11b0, 0x6858, 0xa005, 0x01c0, 0x6838, ++ 0xa084, 0x00ff, 0x683a, 0x6853, 0x0000, 0x080c, 0x50ba, 0x1108, ++ 0x0005, 0x0126, 0x2091, 0x8000, 0x684a, 0x6952, 0x080c, 0x580a, ++ 0x012e, 0x0cb0, 0x2001, 0x0028, 0x2009, 0x0000, 0x0c90, 0x2001, ++ 0x0000, 0x0c78, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906, 0x711a, ++ 0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0006, 0x0030, 0x7014, ++ 0x2068, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, 0x7007, 0x0001, ++ 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848, 0xa084, 0x00ff, 0x20a9, ++ 0x0001, 0xa096, 0x0001, 0x01b0, 0x2009, 0x0000, 0x20a9, 0x00ff, ++ 0xa096, 0x0002, 0x0178, 0xa005, 0x11f0, 0x6944, 0x810f, 0xa18c, ++ 0x00ff, 0x080c, 0x533d, 0x11b8, 0x0066, 0x6e50, 0x080c, 0x543c, ++ 0x006e, 0x0088, 0x0046, 0x2011, 0xc60c, 0x2224, 0xc484, 0x2412, ++ 0x004e, 0x00c6, 0x080c, 0x533d, 0x1110, 0x080c, 0x559d, 0x8108, ++ 0x1f04, 0x656a, 0x00ce, 0x684c, 0xd084, 0x1118, 0x080c, 0x1619, ++ 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x580a, 0x012e, 0x0005, ++ 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xc653, 0x2004, ++ 0xd0a4, 0x0580, 0x2061, 0xc9bc, 0x6100, 0xd184, 0x0178, 0x6858, ++ 0xa084, 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, 0x6004, 0xa005, ++ 0x1538, 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, 0x0001, ++ 0x6860, 0xa005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6016, 0x6858, ++ 0xa084, 0x00ff, 0x0178, 0x6006, 0x6858, 0x8007, 0xa084, 0x00ff, ++ 0x0148, 0x600a, 0x6858, 0x8000, 0x1108, 0xc28d, 0x6202, 0x012e, ++ 0x0804, 0x67c3, 0x012e, 0x0804, 0x67bd, 0x012e, 0x0804, 0x67b7, ++ 0x012e, 0x0804, 0x67ba, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, ++ 0x2001, 0xc653, 0x2004, 0xd0a4, 0x05e0, 0x2061, 0xc9bc, 0x6000, ++ 0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c, 0x1530, 0x6c48, 0xa484, ++ 0x0003, 0x0170, 0x6958, 0xa18c, 0x00ff, 0x8001, 0x1120, 0x2100, ++ 0xa210, 0x0620, 0x0028, 0x8001, 0x1508, 0x2100, 0xa212, 0x02f0, ++ 0xa484, 0x000c, 0x0188, 0x6958, 0x810f, 0xa18c, 0x00ff, 0xa082, ++ 0x0004, 0x1120, 0x2100, 0xa318, 0x0288, 0x0030, 0xa082, 0x0004, ++ 0x1168, 0x2100, 0xa31a, 0x0250, 0x6860, 0xa005, 0x0110, 0x8000, ++ 0x6016, 0x6206, 0x630a, 0x012e, 0x0804, 0x67c3, 0x012e, 0x0804, ++ 0x67c0, 0x012e, 0x0804, 0x67bd, 0x0126, 0x2091, 0x8000, 0x7007, ++ 0x0001, 0x2061, 0xc9bc, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, ++ 0x0220, 0x630a, 0x012e, 0x0804, 0x67d1, 0x012e, 0x0804, 0x67c0, ++ 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac, ++ 0x0148, 0x00c6, 0x2061, 0xc9bc, 0x6000, 0xa084, 0xfcff, 0x6002, ++ 0x00ce, 0x0448, 0x6858, 0xa005, 0x05d0, 0x685c, 0xa065, 0x0598, ++ 0x2001, 0xc631, 0x2004, 0xa005, 0x0118, 0x080c, 0xae54, 0x0068, ++ 0x6013, 0x0400, 0x6057, 0x0000, 0x694c, 0xd1a4, 0x0110, 0x6950, ++ 0x6156, 0x2009, 0x0041, 0x080c, 0x9613, 0x6958, 0xa18c, 0xff00, ++ 0xa186, 0x2000, 0x1140, 0x0026, 0x2009, 0x0000, 0x2011, 0xfdff, ++ 0x080c, 0x712e, 0x002e, 0x684c, 0xd0c4, 0x0148, 0x2061, 0xc9bc, ++ 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, ++ 0x012e, 0x0804, 0x67c3, 0x00ce, 0x012e, 0x0804, 0x67bd, 0x6954, ++ 0xa186, 0x002e, 0x0d40, 0xa186, 0x002d, 0x0d28, 0xa186, 0x0045, ++ 0x0528, 0xa186, 0x002a, 0x1130, 0x2001, 0xc60c, 0x200c, 0xc194, ++ 0x2102, 0x08c8, 0xa186, 0x0020, 0x0170, 0xa186, 0x0029, 0x1d18, ++ 0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x533d, 0x1960, 0x6000, ++ 0xc0e4, 0x6002, 0x0840, 0x685c, 0xa065, 0x09a8, 0x6007, 0x0024, ++ 0x2001, 0xc8fd, 0x2004, 0x6016, 0x0804, 0x665b, 0x685c, 0xa065, ++ 0x0950, 0x00e6, 0x6860, 0xa075, 0x2001, 0xc631, 0x2004, 0xa005, ++ 0x0150, 0x080c, 0xae54, 0x8eff, 0x0118, 0x2e60, 0x080c, 0xae54, ++ 0x00ee, 0x0804, 0x665b, 0x6020, 0xc0dc, 0xc0d5, 0x6022, 0x2e60, ++ 0x6007, 0x003a, 0x6870, 0xa005, 0x0130, 0x6007, 0x003b, 0x6874, ++ 0x602a, 0x6878, 0x6012, 0x6003, 0x0001, 0x080c, 0x7999, 0x080c, ++ 0x7e94, 0x00ee, 0x0804, 0x665b, 0x2061, 0xc9bc, 0x6000, 0xd084, ++ 0x0190, 0xd08c, 0x1904, 0x67d1, 0x0126, 0x2091, 0x8000, 0x6204, ++ 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x67d1, 0x012e, 0x6853, ++ 0x0016, 0x0804, 0x67ca, 0x6853, 0x0007, 0x0804, 0x67ca, 0x6834, ++ 0x8007, 0xa084, 0x00ff, 0x1118, 0x080c, 0x6375, 0x0078, 0x2030, ++ 0x8001, 0x1120, 0x7007, 0x0001, 0x0051, 0x0040, 0x7007, 0x0006, ++ 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x66ff, 0x0005, 0x00e6, ++ 0x0126, 0x2091, 0x8000, 0xa03e, 0x2009, 0xc631, 0x210c, 0x81ff, ++ 0x1904, 0x677d, 0x2009, 0xc60c, 0x210c, 0xd194, 0x1904, 0x67a7, ++ 0x6848, 0x2070, 0xae82, 0xce00, 0x0a04, 0x6771, 0x2001, 0xc617, ++ 0x2004, 0xae02, 0x1a04, 0x6771, 0x711c, 0xa186, 0x0006, 0x1904, ++ 0x6760, 0x7018, 0xa005, 0x0904, 0x677d, 0x2004, 0xd0e4, 0x1904, ++ 0x67a2, 0x2061, 0xc9bc, 0x6100, 0xa184, 0x0301, 0xa086, 0x0001, ++ 0x1550, 0x7020, 0xd0dc, 0x1904, 0x67aa, 0x6853, 0x0000, 0x6803, ++ 0x0000, 0x2d08, 0x7010, 0xa005, 0x1158, 0x7112, 0x684c, 0xd0f4, ++ 0x1904, 0x67ad, 0x2e60, 0x080c, 0x708a, 0x012e, 0x00ee, 0x0005, ++ 0x2068, 0x6800, 0xa005, 0x1de0, 0x6902, 0x2168, 0x684c, 0xd0f4, ++ 0x1904, 0x67ad, 0x012e, 0x00ee, 0x0005, 0x012e, 0x00ee, 0x6853, ++ 0x0006, 0x0804, 0x67ca, 0xd184, 0x0dc0, 0xd1c4, 0x11a8, 0x00b8, ++ 0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x533d, 0x15d8, 0x6000, ++ 0xd0e4, 0x15c0, 0x711c, 0xa186, 0x0007, 0x1118, 0x6853, 0x0002, ++ 0x0498, 0x6853, 0x0008, 0x0480, 0x6853, 0x000e, 0x0468, 0x6853, ++ 0x0017, 0x0450, 0x6853, 0x0035, 0x0438, 0x2001, 0xc672, 0x2004, ++ 0xd0fc, 0x01e8, 0x6848, 0x2070, 0xae82, 0xce00, 0x02c0, 0x605c, ++ 0xae02, 0x12a8, 0x711c, 0xa186, 0x0006, 0x1188, 0x7018, 0xa005, ++ 0x0170, 0x2004, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0xa086, ++ 0x0007, 0x1904, 0x670a, 0x7003, 0x0002, 0x0804, 0x670a, 0x6853, ++ 0x0028, 0x0010, 0x6853, 0x0029, 0x012e, 0x00ee, 0x0418, 0x6853, ++ 0x002a, 0x0cd0, 0x6853, 0x0045, 0x0cb8, 0x2e60, 0x2019, 0x0002, ++ 0x6017, 0x0014, 0x080c, 0xbd55, 0x012e, 0x00ee, 0x0005, 0x2009, ++ 0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028, ++ 0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00, ++ 0xa105, 0x6856, 0x0126, 0x2091, 0x8000, 0x080c, 0x580a, 0x012e, ++ 0x0005, 0x080c, 0x1619, 0x0005, 0x702c, 0x7130, 0x8108, 0xa102, ++ 0x0230, 0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0058, 0x7070, ++ 0xa080, 0x0040, 0x7072, 0x1230, 0x7074, 0xa081, 0x0000, 0x7076, ++ 0xa085, 0x0001, 0x7932, 0x7132, 0x0005, 0x00d6, 0x080c, 0x7081, ++ 0x00de, 0x0005, 0x2001, 0xc756, 0x2004, 0xa086, 0x0000, 0x0904, ++ 0x684d, 0x080c, 0x768f, 0x0904, 0x6850, 0x6868, 0xa084, 0x0007, ++ 0x0904, 0x6844, 0x080c, 0x958d, 0x0904, 0x6847, 0x2d00, 0x6012, ++ 0x6834, 0xa084, 0x00ff, 0xa086, 0x0035, 0x1198, 0x2001, 0xc8e5, ++ 0x2004, 0xa086, 0xaaaa, 0x0130, 0x2001, 0xc635, 0x2004, 0xa084, ++ 0x0028, 0x05c8, 0x6008, 0xc0fd, 0x600a, 0x2001, 0xc8d3, 0x2004, ++ 0x0098, 0x6870, 0xa084, 0x00ff, 0x696c, 0xa18c, 0xff00, 0xa105, ++ 0x696c, 0xa18c, 0x00ff, 0x080c, 0x29c7, 0x11e0, 0x00c6, 0x080c, ++ 0x533d, 0x2c00, 0x00ce, 0x11b0, 0x601a, 0x601f, 0x0001, 0x2009, ++ 0x0040, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0035, 0x0110, 0x2009, ++ 0x0041, 0x080c, 0x9613, 0x0005, 0x684b, 0x0101, 0x0078, 0x684b, ++ 0x002c, 0x0060, 0x684b, 0x0028, 0x0080, 0x684b, 0x0104, 0x0030, ++ 0x684b, 0x0105, 0x0018, 0x684b, 0x0106, 0x0038, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x580a, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x580a, 0x012e, 0x080c, 0x95e3, 0x0005, 0x00d6, 0x00c6, ++ 0x0036, 0x0026, 0x0016, 0x7007, 0x0001, 0x6a44, 0xa282, 0x0004, ++ 0x1a04, 0x68b1, 0xd284, 0x0170, 0x6a4c, 0xa290, 0xc77b, 0x2204, ++ 0xa065, 0x6004, 0x05e0, 0x8007, 0xa084, 0x00ff, 0xa084, 0x0006, ++ 0x1108, 0x04a8, 0x2c10, 0x080c, 0x958d, 0x1118, 0x080c, 0xaf0d, ++ 0x05a0, 0x621a, 0x6844, 0x0002, 0x6890, 0x6895, 0x6898, 0x689e, ++ 0x2019, 0x0002, 0x080c, 0xc10d, 0x0060, 0x080c, 0xc0a4, 0x0048, ++ 0x2019, 0x0002, 0x6950, 0x080c, 0xc0bf, 0x0018, 0x6950, 0x080c, ++ 0xc0a4, 0x080c, 0x95e3, 0x6857, 0x0000, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x580a, 0x012e, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00de, ++ 0x0005, 0x6857, 0x0006, 0x0c88, 0x6857, 0x0002, 0x0c70, 0x6857, ++ 0x0005, 0x0c58, 0x6857, 0x0004, 0x0c40, 0x6857, 0x0007, 0x0c28, ++ 0x00d6, 0x2011, 0x0004, 0x2204, 0xa085, 0x8002, 0x2012, 0x00de, ++ 0x0005, 0x20e1, 0x0002, 0x3d08, 0x20e1, 0x2000, 0x3d00, 0xa084, ++ 0x7000, 0x0118, 0xa086, 0x1000, 0x15e0, 0x20e1, 0x0000, 0x3d00, ++ 0xa094, 0xff00, 0x8217, 0xa084, 0xf000, 0xa086, 0x3000, 0x1160, ++ 0xa184, 0xff00, 0x8007, 0xa086, 0x0008, 0x1558, 0x080c, 0x2f69, ++ 0x1540, 0x080c, 0x6b32, 0x0400, 0x20e1, 0x0004, 0x3d60, 0xd1bc, ++ 0x1170, 0x2100, 0xa084, 0xff00, 0xa086, 0x0500, 0x1138, 0x0026, ++ 0x2c10, 0x080c, 0x6d90, 0x002e, 0x01a0, 0x0070, 0x3e60, 0xac84, ++ 0x0007, 0x1178, 0xac82, 0xce00, 0x0260, 0x685c, 0xac02, 0x1248, ++ 0x2009, 0x0047, 0x080c, 0x9613, 0x7a1c, 0xd284, 0x1904, 0x68c9, ++ 0x0005, 0xa016, 0x080c, 0x1870, 0x0cb8, 0x0cd8, 0x781c, 0xd08c, ++ 0x0500, 0x0156, 0x0136, 0x0146, 0x20e1, 0x3000, 0x3d20, 0x3e28, ++ 0xa584, 0x0076, 0x1538, 0xa484, 0x7000, 0xa086, 0x1000, 0x11a8, ++ 0x080c, 0x6991, 0x01f8, 0x20e1, 0x3000, 0x7828, 0x7828, 0x080c, ++ 0x69ad, 0x014e, 0x013e, 0x015e, 0x2009, 0xc92f, 0x2104, 0xa005, ++ 0x1108, 0x0005, 0x080c, 0x7e94, 0x0ce0, 0xa484, 0x7000, 0x1548, ++ 0x080c, 0x6991, 0x01d8, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, ++ 0x0d10, 0x00a0, 0xd5a4, 0x0178, 0x0056, 0x0046, 0x080c, 0x1f2d, ++ 0x080c, 0x25fb, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, ++ 0x004e, 0x005e, 0x0048, 0x04a9, 0x6887, 0x0000, 0x080c, 0xc536, ++ 0x20e1, 0x3000, 0x7828, 0x7828, 0x00b9, 0x014e, 0x013e, 0x015e, ++ 0x0880, 0x0439, 0x1130, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, ++ 0x1d68, 0x080c, 0xc536, 0x20e1, 0x3000, 0x7828, 0x7828, 0x0056, ++ 0x080c, 0x6e1f, 0x005e, 0x0c40, 0x2001, 0xc60e, 0x2004, 0xd08c, ++ 0x0178, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1148, 0x0026, ++ 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x407d, 0x003e, 0x002e, ++ 0x0005, 0xa484, 0x01ff, 0x6886, 0xa005, 0x0160, 0xa080, 0x001f, ++ 0xa084, 0x03f8, 0x80ac, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, ++ 0x53a5, 0x0005, 0x20a9, 0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, ++ 0x020a, 0x53a5, 0xa085, 0x0001, 0x0ca0, 0x7000, 0xa084, 0xff00, ++ 0xa08c, 0xf000, 0x8007, 0xa196, 0x0000, 0x1118, 0x0804, 0x6c37, ++ 0x0005, 0xa196, 0x2000, 0x1148, 0x6900, 0xa18e, 0x0001, 0x1118, ++ 0x080c, 0x47cb, 0x0ca8, 0x0039, 0x0c98, 0xa196, 0x8000, 0x1d80, ++ 0x080c, 0x6ce3, 0x0c68, 0x00c6, 0x6a84, 0x82ff, 0x0904, 0x6b2c, ++ 0x7110, 0xa18c, 0xff00, 0x810f, 0xa196, 0x0001, 0x0120, 0xa196, ++ 0x0023, 0x1904, 0x6b2c, 0xa08e, 0x0023, 0x1570, 0x080c, 0x6d7e, ++ 0x0904, 0x6b2c, 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1150, ++ 0x7034, 0xa005, 0x1904, 0x6b2c, 0x2009, 0x0015, 0x080c, 0x9613, ++ 0x0804, 0x6b2c, 0xa08e, 0x0214, 0x0118, 0xa08e, 0x0210, 0x1130, ++ 0x2009, 0x0015, 0x080c, 0x9613, 0x0804, 0x6b2c, 0xa08e, 0x0100, ++ 0x1904, 0x6b2c, 0x7034, 0xa005, 0x1904, 0x6b2c, 0x2009, 0x0016, ++ 0x080c, 0x9613, 0x0804, 0x6b2c, 0xa08e, 0x0022, 0x1904, 0x6b2c, ++ 0x7030, 0xa08e, 0x0300, 0x1580, 0x68d4, 0xd0a4, 0x0528, 0xc0b5, ++ 0x68d6, 0x7100, 0xa18c, 0x00ff, 0x6972, 0x7004, 0x6876, 0x00f6, ++ 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0xa084, 0x00ff, 0x0016, ++ 0x2008, 0x080c, 0x29f1, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, ++ 0x080c, 0x29c7, 0x6952, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, ++ 0x2071, 0xc600, 0x70a6, 0x00ee, 0x7034, 0xa005, 0x1904, 0x6b2c, ++ 0x2009, 0x0017, 0x0804, 0x6af2, 0xa08e, 0x0400, 0x1158, 0x7034, ++ 0xa005, 0x1904, 0x6b2c, 0x68d4, 0xc0a5, 0x68d6, 0x2009, 0x0030, ++ 0x0804, 0x6af2, 0xa08e, 0x0500, 0x1140, 0x7034, 0xa005, 0x1904, ++ 0x6b2c, 0x2009, 0x0018, 0x0804, 0x6af2, 0xa08e, 0x2010, 0x1120, ++ 0x2009, 0x0019, 0x0804, 0x6af2, 0xa08e, 0x2110, 0x1120, 0x2009, ++ 0x001a, 0x0804, 0x6af2, 0xa08e, 0x5200, 0x1140, 0x7034, 0xa005, ++ 0x1904, 0x6b2c, 0x2009, 0x001b, 0x0804, 0x6af2, 0xa08e, 0x5000, ++ 0x1140, 0x7034, 0xa005, 0x1904, 0x6b2c, 0x2009, 0x001c, 0x0804, ++ 0x6af2, 0xa08e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x6af2, ++ 0xa08e, 0x1200, 0x1140, 0x7034, 0xa005, 0x1904, 0x6b2c, 0x2009, ++ 0x0024, 0x0804, 0x6af2, 0xa08c, 0xff00, 0xa18e, 0x2400, 0x1120, ++ 0x2009, 0x002d, 0x0804, 0x6af2, 0xa08c, 0xff00, 0xa18e, 0x5300, ++ 0x1120, 0x2009, 0x002a, 0x0804, 0x6af2, 0xa08e, 0x0f00, 0x1120, ++ 0x2009, 0x0020, 0x0804, 0x6af2, 0xa08e, 0x5300, 0x1108, 0x00d8, ++ 0xa08e, 0x6104, 0x11c0, 0x2011, 0xcc8d, 0x8208, 0x2204, 0xa082, ++ 0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, 0x8108, ++ 0x0046, 0x2124, 0x080c, 0x407d, 0x004e, 0x8108, 0x1f04, 0x6abc, ++ 0x2009, 0x0023, 0x0438, 0xa08e, 0x6000, 0x1118, 0x2009, 0x003f, ++ 0x0408, 0xa08e, 0x5400, 0x1158, 0x080c, 0x6e79, 0x1904, 0x6b2c, ++ 0x2009, 0x0046, 0x0016, 0x2001, 0xc8d3, 0x2064, 0x0498, 0xa08e, ++ 0x5500, 0x1140, 0x080c, 0x6eac, 0x2009, 0x0041, 0x0158, 0x2009, ++ 0x0042, 0x0040, 0xa08e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0010, ++ 0x2009, 0x001d, 0x0016, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, ++ 0x080c, 0x29c7, 0x1598, 0x080c, 0x52e1, 0x1580, 0x6612, 0x6516, ++ 0x86ff, 0x01e8, 0x001e, 0x0016, 0xa186, 0x0017, 0x1158, 0x6870, ++ 0xa606, 0x11a8, 0x6874, 0xa506, 0xa084, 0xff00, 0x1180, 0x6000, ++ 0xc0f5, 0x6002, 0xa186, 0x0046, 0x1150, 0x6870, 0xa606, 0x1138, ++ 0x6874, 0xa506, 0xa084, 0xff00, 0x1110, 0x001e, 0x0068, 0x00c6, ++ 0x080c, 0x958d, 0x0168, 0x001e, 0x611a, 0x601f, 0x0004, 0x7120, ++ 0x610a, 0x001e, 0x080c, 0x9613, 0x00ce, 0x0005, 0x001e, 0x0ce0, ++ 0x00ce, 0x0ce0, 0x00c6, 0x0046, 0x080c, 0x6b86, 0x1904, 0x6b83, ++ 0xa28e, 0x0033, 0x11e8, 0x080c, 0x6d7e, 0x0904, 0x6b83, 0x7124, ++ 0x610a, 0x7030, 0xa08e, 0x0200, 0x1140, 0x7034, 0xa005, 0x15d8, ++ 0x2009, 0x0015, 0x080c, 0x9613, 0x04b0, 0xa08e, 0x0100, 0x1598, ++ 0x7034, 0xa005, 0x1580, 0x2009, 0x0016, 0x080c, 0x9613, 0x0458, ++ 0xa28e, 0x0032, 0x1540, 0x7030, 0xa08e, 0x1400, 0x1520, 0x2009, ++ 0x0038, 0x0016, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, 0x080c, ++ 0x29c7, 0x11c0, 0x080c, 0x52e1, 0x11a8, 0x6612, 0x6516, 0x00c6, ++ 0x080c, 0x958d, 0x0170, 0x001e, 0x611a, 0x080c, 0xb05e, 0x601f, ++ 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x9613, 0x080c, 0x7e94, ++ 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x0005, 0x00f6, 0x00d6, ++ 0x0026, 0x0016, 0x0136, 0x0146, 0x0156, 0x3c00, 0x0006, 0x2079, ++ 0x0030, 0x2069, 0x0200, 0x080c, 0x1fec, 0x1590, 0x080c, 0x1e97, ++ 0x05e0, 0x04f1, 0x1130, 0x7908, 0xa18c, 0x1fff, 0xa182, 0x0011, ++ 0x1688, 0x20a9, 0x000c, 0x20e1, 0x0000, 0x2ea0, 0x2099, 0x020a, ++ 0x53a5, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004, 0x7a0c, 0x7808, ++ 0xa080, 0x0007, 0xa084, 0x1ff8, 0x0419, 0x1120, 0xa08a, 0x0140, ++ 0x1a0c, 0x1519, 0x80ac, 0x20e1, 0x6000, 0x2099, 0x020a, 0x53a5, ++ 0x20e1, 0x7000, 0x6828, 0x6828, 0x7803, 0x0004, 0xa294, 0x0070, ++ 0x000e, 0x20e0, 0x015e, 0x014e, 0x013e, 0x001e, 0x002e, 0x00de, ++ 0x00fe, 0x0005, 0xa016, 0x080c, 0x1870, 0xa085, 0x0001, 0x0c80, ++ 0x0006, 0x2001, 0x0111, 0x2004, 0xa084, 0x0003, 0x000e, 0x0005, ++ 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0xa696, 0x00ff, 0x1198, ++ 0xa596, 0xfffd, 0x1120, 0x2009, 0x007f, 0x0804, 0x6c32, 0xa596, ++ 0xfffe, 0x1118, 0x2009, 0x007e, 0x04e8, 0xa596, 0xfffc, 0x1118, ++ 0x2009, 0x0080, 0x04b8, 0x2011, 0x0000, 0x2019, 0xc635, 0x231c, ++ 0xd3ac, 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff, 0x2071, 0xc77b, ++ 0x0030, 0x2021, 0x0081, 0x20a9, 0x007e, 0x2071, 0xc7fc, 0x2e1c, ++ 0x83ff, 0x1128, 0x82ff, 0x1198, 0x2410, 0xc2fd, 0x0080, 0x2368, ++ 0x6f10, 0x0006, 0x2100, 0xa706, 0x000e, 0x6b14, 0x1120, 0xa346, ++ 0x1110, 0x2408, 0x0078, 0x87ff, 0x1110, 0x83ff, 0x0d58, 0x8420, ++ 0x8e70, 0x1f04, 0x6c0f, 0x82ff, 0x1118, 0xa085, 0x0001, 0x0018, ++ 0xc2fc, 0x2208, 0xa006, 0x00de, 0x00ee, 0x004e, 0x0005, 0xa084, ++ 0x0007, 0x000a, 0x0005, 0x6c43, 0x6c43, 0x6c43, 0x6e0c, 0x6c43, ++ 0x6c44, 0x6c59, 0x6cce, 0x0005, 0x7110, 0xd1bc, 0x0188, 0x7120, ++ 0x2160, 0xac8c, 0x0007, 0x1160, 0xac8a, 0xce00, 0x0248, 0x685c, ++ 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0046, 0x080c, 0x9613, ++ 0x0005, 0x00c6, 0xa484, 0x01ff, 0x0904, 0x6cac, 0x7110, 0xd1bc, ++ 0x1904, 0x6cac, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, 0x080c, ++ 0x29c7, 0x1904, 0x6cac, 0x080c, 0x52e1, 0x15f0, 0x6612, 0x6516, ++ 0x6000, 0xd0ec, 0x15c8, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, ++ 0x0006, 0x0148, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, 0x11a0, ++ 0xa295, 0x0600, 0x6206, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0530, ++ 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x7130, 0x6152, 0x2009, ++ 0x0044, 0x080c, 0x9613, 0x00c0, 0x00c6, 0x080c, 0x958d, 0x001e, ++ 0x0198, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0xa286, 0x0004, ++ 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, ++ 0x080c, 0x79df, 0x080c, 0x7e94, 0x00ce, 0x0005, 0x2001, 0xc60d, ++ 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x407d, 0x00c6, ++ 0x080c, 0xaf0d, 0x001e, 0x0d80, 0x611a, 0x601f, 0x0006, 0x7120, ++ 0x610a, 0x7130, 0x6152, 0x6013, 0x0300, 0x6003, 0x0001, 0x6007, ++ 0x0041, 0x080c, 0x7999, 0x080c, 0x7e94, 0x08f0, 0x7110, 0xd1bc, ++ 0x0188, 0x7020, 0x2060, 0xac84, 0x0007, 0x1160, 0xac82, 0xce00, ++ 0x0248, 0x685c, 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0045, ++ 0x080c, 0x9613, 0x0005, 0x0006, 0x080c, 0x2f69, 0x000e, 0x1168, ++ 0x7110, 0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x1130, 0xa084, ++ 0x000f, 0xa08a, 0x0006, 0x1208, 0x000b, 0x0005, 0x6cfc, 0x6cfd, ++ 0x6cfc, 0x6cfc, 0x6d66, 0x6d72, 0x0005, 0x7110, 0xd1bc, 0x0120, ++ 0x702c, 0xd084, 0x0904, 0x6d65, 0x700c, 0x7108, 0x080c, 0x29c7, ++ 0x1904, 0x6d65, 0x080c, 0x52e1, 0x1904, 0x6d65, 0x6612, 0x6516, ++ 0x6204, 0x7110, 0xd1bc, 0x01f8, 0xa28c, 0x00ff, 0xa186, 0x0004, ++ 0x0118, 0xa186, 0x0006, 0x15c8, 0x00c6, 0x080c, 0x6d7e, 0x00ce, ++ 0x0904, 0x6d65, 0x00c6, 0x080c, 0x958d, 0x001e, 0x05f0, 0x611a, ++ 0x080c, 0xb05e, 0x601f, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, ++ 0x080c, 0x9613, 0x0490, 0xa28c, 0x00ff, 0xa186, 0x0006, 0x0160, ++ 0xa186, 0x0004, 0x0148, 0xa294, 0xff00, 0x8217, 0xa286, 0x0004, ++ 0x0118, 0xa286, 0x0006, 0x1188, 0x00c6, 0x080c, 0x958d, 0x001e, ++ 0x01e0, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0005, 0x7120, 0x610a, ++ 0x2009, 0x0088, 0x080c, 0x9613, 0x0080, 0x00c6, 0x080c, 0x958d, ++ 0x001e, 0x0158, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0004, 0x7120, ++ 0x610a, 0x2009, 0x0001, 0x080c, 0x9613, 0x0005, 0x7110, 0xd1bc, ++ 0x0140, 0x00a1, 0x0130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, ++ 0x9613, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x0041, 0x0130, 0x7124, ++ 0x610a, 0x2009, 0x008a, 0x080c, 0x9613, 0x0005, 0x7020, 0x2060, ++ 0xac84, 0x0007, 0x1158, 0xac82, 0xce00, 0x0240, 0x2001, 0xc617, ++ 0x2004, 0xac02, 0x1218, 0xa085, 0x0001, 0x0005, 0xa006, 0x0ce8, ++ 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x2f69, 0x1904, 0x6e07, 0x2001, ++ 0xc756, 0x2004, 0xa086, 0x0000, 0x0904, 0x6e07, 0x20e1, 0x0000, ++ 0x3d08, 0xa18c, 0x00ff, 0xa18e, 0x00ff, 0x1500, 0x3e00, 0xa086, ++ 0xffff, 0x11e0, 0x2001, 0xc8d3, 0x2064, 0x2009, 0x00ff, 0x0006, ++ 0x0016, 0x2001, 0xc61d, 0x2004, 0x20e1, 0x0001, 0x3e08, 0xa106, ++ 0x1130, 0x2001, 0xc61c, 0x2004, 0x3d08, 0xa106, 0x0118, 0x001e, ++ 0x000e, 0x00a8, 0x001e, 0x000e, 0x0804, 0x6e07, 0x20e1, 0x0001, ++ 0x3d08, 0x3e00, 0x0156, 0x080c, 0x29c7, 0x015e, 0x15c0, 0x080c, ++ 0x533d, 0x0128, 0x2001, 0xc8d3, 0x2064, 0x2009, 0x00ff, 0x2138, ++ 0x873f, 0x2c00, 0x2070, 0x20e1, 0x0003, 0x3d18, 0x831f, 0xa39c, ++ 0x00ff, 0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0xa086, 0x1000, ++ 0x0120, 0x080c, 0x75ea, 0x11d8, 0x0080, 0x080c, 0x958d, 0x01b8, ++ 0x20e1, 0x0002, 0x3e08, 0xd19c, 0x0118, 0x6124, 0xc19d, 0x6126, ++ 0x2e00, 0x601a, 0x620a, 0x601f, 0x0009, 0x2009, 0x0101, 0x080c, ++ 0x9613, 0xa085, 0x0001, 0x00ee, 0x00de, 0x00ce, 0x0005, 0xa006, ++ 0x00ee, 0x00de, 0x00ce, 0x0005, 0x7110, 0xd1bc, 0x1178, 0x7024, ++ 0x2060, 0xac84, 0x0007, 0x1150, 0xac82, 0xce00, 0x0238, 0x685c, ++ 0xac02, 0x1220, 0x2009, 0x0051, 0x080c, 0x9613, 0x0005, 0x2031, ++ 0x0105, 0x0069, 0x0005, 0x2031, 0x0206, 0x0049, 0x0005, 0x2031, ++ 0x0207, 0x0029, 0x0005, 0x2031, 0x0213, 0x0009, 0x0005, 0x00c6, ++ 0x00d6, 0x00f6, 0x7000, 0xa084, 0xf000, 0xa086, 0xc000, 0x05b0, ++ 0x080c, 0x958d, 0x0598, 0x0066, 0x00c6, 0x0046, 0x2011, 0xcc83, ++ 0x2204, 0x8211, 0x220c, 0x080c, 0x29c7, 0x1580, 0x080c, 0x52e1, ++ 0x1568, 0x6612, 0x6516, 0x2c00, 0x004e, 0x00ce, 0x601a, 0x080c, ++ 0xb05e, 0x080c, 0x1602, 0x01f0, 0x2d00, 0x6056, 0x6803, 0x0000, ++ 0x6837, 0x0000, 0x6c3a, 0xadf8, 0x000f, 0x20a9, 0x000e, 0x2fa0, ++ 0x2e98, 0x53a3, 0x006e, 0x6612, 0x6007, 0x003e, 0x601f, 0x0001, ++ 0x6003, 0x0001, 0x080c, 0x79df, 0x080c, 0x7e94, 0x00fe, 0x00de, ++ 0x00ce, 0x0005, 0x080c, 0x95e3, 0x006e, 0x0cc0, 0x004e, 0x00ce, ++ 0x0cc8, 0x0156, 0x0046, 0x2e00, 0xa0a0, 0x000e, 0x2404, 0x2020, ++ 0x8427, 0xa4a4, 0x0007, 0xd484, 0x0148, 0x20a9, 0x0003, 0x2019, ++ 0xc606, 0x2011, 0xcc9b, 0x080c, 0xa103, 0x11d8, 0xd48c, 0x0148, ++ 0x20a9, 0x0003, 0x2019, 0xc602, 0x2011, 0xcc9f, 0x080c, 0xa103, ++ 0x1180, 0xd494, 0x0170, 0x080c, 0x7694, 0x0148, 0x20a9, 0x0008, ++ 0x2019, 0xc69a, 0x2011, 0xccaa, 0x080c, 0xa118, 0x0010, 0xa085, ++ 0x0001, 0x004e, 0x015e, 0x0005, 0x0156, 0x0046, 0x2e00, 0xa0a0, ++ 0x000e, 0x2404, 0x2020, 0x8427, 0xa4a4, 0x0007, 0xd484, 0x0148, ++ 0x20a9, 0x0003, 0x2019, 0xc606, 0x2011, 0xcc93, 0x080c, 0xa103, ++ 0x11d8, 0xd48c, 0x0148, 0x20a9, 0x0003, 0x2019, 0xc602, 0x2011, ++ 0xcc97, 0x080c, 0xa103, 0x1180, 0xd494, 0x0170, 0x080c, 0x7694, ++ 0x0148, 0x20a9, 0x0008, 0x2019, 0xc69a, 0x2011, 0xcca2, 0x080c, ++ 0xa118, 0x0010, 0xa085, 0x0001, 0x004e, 0x015e, 0x0005, 0x2071, ++ 0xc93a, 0x7003, 0x0003, 0x700f, 0x0361, 0xa006, 0x701a, 0x7076, ++ 0x7012, 0x7017, 0xce00, 0x7007, 0x0000, 0x7026, 0x702b, 0x8c0c, ++ 0x7032, 0x7037, 0x8c6c, 0x703b, 0xffff, 0x703f, 0xffff, 0x7042, ++ 0x7047, 0x4787, 0x704a, 0x705b, 0x703f, 0x2001, 0xc8e8, 0x2003, ++ 0x0003, 0x2001, 0xc8ea, 0x2003, 0x0100, 0x3a00, 0xa084, 0x0005, ++ 0x706e, 0x0005, 0x2071, 0xc93a, 0x1d04, 0x6f9c, 0x2091, 0x6000, ++ 0x700c, 0x8001, 0x700e, 0x1518, 0x700f, 0x0361, 0x7007, 0x0001, ++ 0x0126, 0x2091, 0x8000, 0x7040, 0xa00d, 0x0128, 0x8109, 0x7142, ++ 0x1110, 0x7044, 0x080f, 0x00c6, 0x2061, 0xc600, 0x6034, 0x00ce, ++ 0xd0cc, 0x0180, 0x3a00, 0xa084, 0x0005, 0x726c, 0xa216, 0x0150, ++ 0x706e, 0x2011, 0x8043, 0x2018, 0x080c, 0x407d, 0x0018, 0x0126, ++ 0x2091, 0x8000, 0x7024, 0xa00d, 0x0188, 0x7020, 0x8001, 0x7022, ++ 0x1168, 0x7023, 0x0009, 0x8109, 0x7126, 0xa186, 0x03e8, 0x1110, ++ 0x7028, 0x080f, 0x81ff, 0x1110, 0x7028, 0x080f, 0x7030, 0xa00d, ++ 0x0180, 0x702c, 0x8001, 0x702e, 0x1160, 0x702f, 0x0009, 0x8109, ++ 0x7132, 0x0128, 0xa184, 0x007f, 0x090c, 0x8cc8, 0x0010, 0x7034, ++ 0x080f, 0x7038, 0xa005, 0x0118, 0x0310, 0x8001, 0x703a, 0x703c, ++ 0xa005, 0x0118, 0x0310, 0x8001, 0x703e, 0x704c, 0xa00d, 0x0168, ++ 0x7048, 0x8001, 0x704a, 0x1148, 0x704b, 0x0009, 0x8109, 0x714e, ++ 0x1120, 0x7150, 0x714e, 0x7058, 0x080f, 0x7018, 0xa00d, 0x01d8, ++ 0x0016, 0x7074, 0xa00d, 0x0158, 0x7070, 0x8001, 0x7072, 0x1138, ++ 0x7073, 0x0009, 0x8109, 0x7176, 0x1110, 0x7078, 0x080f, 0x001e, ++ 0x7008, 0x8001, 0x700a, 0x1138, 0x700b, 0x0009, 0x8109, 0x711a, ++ 0x1110, 0x701c, 0x080f, 0x012e, 0x7004, 0x0002, 0x6fc2, 0x6fc3, ++ 0x6fdb, 0x00e6, 0x2071, 0xc93a, 0x7018, 0xa005, 0x1120, 0x711a, ++ 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, ++ 0xc93a, 0x701c, 0xa206, 0x1110, 0x701a, 0x701e, 0x000e, 0x00ee, ++ 0x0005, 0x00e6, 0x2071, 0xc93a, 0x6088, 0xa102, 0x0208, 0x618a, ++ 0x00ee, 0x0005, 0x0005, 0x7110, 0x080c, 0x533d, 0x1158, 0x6088, ++ 0x8001, 0x0240, 0x608a, 0x1130, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0x7e94, 0x012e, 0x8108, 0xa182, 0x00ff, 0x0218, 0xa00e, 0x7007, ++ 0x0002, 0x7112, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, ++ 0x603c, 0xa005, 0x0128, 0x8001, 0x603e, 0x1110, 0x080c, 0xaf4c, ++ 0x6014, 0xa005, 0x0518, 0x8001, 0x6016, 0x1500, 0x611c, 0xa186, ++ 0x0003, 0x0130, 0xa186, 0x0006, 0x0118, 0xa186, 0x0009, 0x11a0, ++ 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a, 0x0270, 0xa082, 0x1999, ++ 0x6856, 0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x800b, ++ 0x810b, 0xa108, 0x6116, 0x0010, 0x080c, 0xaa1c, 0x012e, 0xac88, ++ 0x0018, 0x7116, 0x2001, 0xfe00, 0xa102, 0x0220, 0x7017, 0xce00, ++ 0x7007, 0x0000, 0x0005, 0x00e6, 0x2071, 0xc93a, 0x7027, 0x07d0, ++ 0x7023, 0x0009, 0x00ee, 0x0005, 0x2001, 0xc943, 0x2003, 0x0000, ++ 0x0005, 0x00e6, 0x2071, 0xc93a, 0x7132, 0x702f, 0x0009, 0x00ee, ++ 0x0005, 0x2011, 0xc946, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, ++ 0xc93a, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00c6, ++ 0x0026, 0x7054, 0x8000, 0x7056, 0x2061, 0xc8e8, 0x6008, 0xa086, ++ 0x0000, 0x0158, 0x7068, 0x6032, 0x7064, 0x602e, 0x7060, 0x602a, ++ 0x705c, 0x6026, 0x2c10, 0x080c, 0x164d, 0x002e, 0x00ce, 0x0005, ++ 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x6f0a, ++ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x0005, 0x00e6, ++ 0x2071, 0xc93a, 0x7176, 0x727a, 0x7073, 0x0009, 0x00ee, 0x0005, ++ 0x00e6, 0x0006, 0x2071, 0xc93a, 0x7078, 0xa206, 0x1110, 0x7076, ++ 0x707a, 0x000e, 0x00ee, 0x0005, 0x00c6, 0x2061, 0xc9bc, 0x00ce, ++ 0x0005, 0xa184, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0xc9bc, ++ 0x2060, 0x0005, 0x6854, 0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, ++ 0xa005, 0x1150, 0x00c6, 0x2061, 0xc9bc, 0x6014, 0x00ce, 0xa005, ++ 0x1138, 0x2001, 0x001e, 0x0020, 0xa08e, 0xffff, 0x1108, 0xa006, ++ 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c, 0xa08c, 0x00c0, ++ 0xa18e, 0x00c0, 0x05e8, 0xd0b4, 0x1138, 0xd0bc, 0x1550, 0x2009, ++ 0x0006, 0x080c, 0x7105, 0x0005, 0xd0fc, 0x0138, 0xa084, 0x0003, ++ 0x0120, 0xa086, 0x0003, 0x1904, 0x70ff, 0x6020, 0xd0d4, 0x0130, ++ 0xc0d4, 0x6022, 0x6860, 0x602a, 0x685c, 0x602e, 0x2009, 0xc674, ++ 0x2104, 0xd084, 0x0138, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, ++ 0x9613, 0x0005, 0x87ff, 0x1120, 0x2009, 0x0043, 0x080c, 0x9613, ++ 0x0005, 0xd0fc, 0x0130, 0xa084, 0x0003, 0x0118, 0xa086, 0x0003, ++ 0x11f0, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x9613, 0x0005, ++ 0xd0fc, 0x0160, 0xa084, 0x0003, 0xa08e, 0x0002, 0x0148, 0x87ff, ++ 0x1120, 0x2009, 0x0041, 0x080c, 0x9613, 0x0005, 0x0061, 0x0ce8, ++ 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x9613, 0x0cb0, 0x2009, ++ 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x00d6, 0x6010, 0xa0ec, ++ 0xf000, 0x0510, 0x2068, 0x6952, 0x6800, 0x6012, 0xa186, 0x0001, ++ 0x1188, 0x694c, 0xa18c, 0x8100, 0xa18e, 0x8100, 0x1158, 0x00c6, ++ 0x2061, 0xc9bc, 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, ++ 0x6206, 0x00ce, 0x080c, 0x580a, 0x6010, 0xa06d, 0x0076, 0x2039, ++ 0x0000, 0x190c, 0x708a, 0x007e, 0x00de, 0x0005, 0x0156, 0x00c6, ++ 0x2061, 0xc9bc, 0x6000, 0x81ff, 0x0110, 0xa205, 0x0008, 0xa204, ++ 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, ++ 0xa005, 0x0120, 0x8001, 0x680a, 0xa085, 0x0001, 0x0005, 0x2071, ++ 0xc755, 0x7003, 0x0006, 0x7007, 0x0000, 0x700f, 0x0000, 0x7013, ++ 0x0001, 0x702f, 0x0006, 0x7033, 0x0001, 0x7063, 0x0000, 0x0005, ++ 0x00e6, 0x2071, 0xc755, 0x6a2c, 0x721e, 0x6b30, 0x7322, 0x6834, ++ 0x7026, 0x705a, 0x6838, 0x702a, 0x705e, 0x6824, 0x7016, 0x683c, ++ 0x701a, 0x2009, 0x0070, 0x200a, 0xa005, 0x0150, 0x2009, 0x0000, ++ 0xa188, 0x000c, 0x8001, 0x1de0, 0x2100, 0xa210, 0x1208, 0x8318, ++ 0x7252, 0x7356, 0x7010, 0xc084, 0x7012, 0x7007, 0x0001, 0x700f, ++ 0x0000, 0xa006, 0x00ee, 0x0005, 0x2b78, 0x2071, 0xc755, 0x7004, ++ 0x004b, 0x700c, 0x0002, 0x718e, 0x7187, 0x7187, 0x0005, 0x7198, ++ 0x71e9, 0x71ea, 0x71eb, 0x71ec, 0x71ff, 0x7200, 0x700c, 0x0cba, ++ 0x2f00, 0xa080, 0x0070, 0x2004, 0x2f08, 0xa188, 0x0070, 0x210c, ++ 0xa106, 0x0150, 0x2f00, 0xa080, 0x0070, 0x2004, 0x2f08, 0xa188, ++ 0x0070, 0x210c, 0xa106, 0x15e0, 0x7018, 0xa10a, 0x1118, 0x080c, ++ 0x722d, 0x04b0, 0x1210, 0x7114, 0xa10a, 0xa192, 0x000a, 0x0210, ++ 0x2009, 0x000a, 0x00d6, 0x0016, 0x2001, 0xc682, 0xa080, 0x0011, ++ 0x2014, 0x2001, 0xc76f, 0xa080, 0x0005, 0x2004, 0xa100, 0xa202, ++ 0x001e, 0x00de, 0x0e20, 0x080c, 0x727c, 0x2200, 0xa102, 0x0208, ++ 0x2208, 0x713a, 0x080c, 0x7377, 0x2100, 0x7042, 0x2001, 0x0002, ++ 0x7037, 0x0000, 0x0126, 0x0006, 0x2091, 0x8000, 0x2009, 0xc959, ++ 0x2104, 0xc095, 0x200a, 0x000e, 0x700e, 0x012e, 0x080c, 0x1669, ++ 0x0005, 0x0005, 0x0005, 0x0005, 0x700c, 0x0002, 0x71f1, 0x71f4, ++ 0x71fe, 0x080c, 0x7196, 0x0005, 0x0126, 0x8001, 0x700e, 0x7138, ++ 0x0041, 0x2091, 0x8000, 0x080c, 0x7196, 0x012e, 0x0005, 0x0005, ++ 0x0005, 0x7018, 0xa100, 0x7214, 0xa21a, 0x1130, 0x701c, 0x7052, ++ 0x7020, 0x7056, 0xa006, 0x0068, 0x0006, 0x080c, 0x7377, 0x2100, ++ 0x7250, 0xa210, 0x7252, 0x1220, 0x7054, 0xa081, 0x0000, 0x7056, ++ 0x000e, 0x2f08, 0xa188, 0x0070, 0x200a, 0x701a, 0x0005, 0x00e6, ++ 0x2071, 0xc755, 0x700c, 0x0002, 0x7227, 0x7227, 0x7229, 0x00ee, ++ 0x0005, 0x700f, 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0x00d6, 0x00e6, 0x2071, 0xc76f, 0x702c, 0xa005, 0x0178, 0x2068, ++ 0x6964, 0x080c, 0x727c, 0x2100, 0x2208, 0xa102, 0x0238, 0x6800, ++ 0x702e, 0x080c, 0x75b9, 0x080c, 0x1629, 0x0c70, 0x00ee, 0x00de, ++ 0x012e, 0x0005, 0x00e6, 0x2071, 0xc76f, 0x702c, 0x6802, 0x2d00, ++ 0x702e, 0x6858, 0x7120, 0xa102, 0x0a0c, 0x1519, 0x7022, 0x685b, ++ 0x0000, 0x00ee, 0x0005, 0x00d6, 0x00e6, 0x2071, 0xc76f, 0xa006, ++ 0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x7016, 0x702a, 0x7026, ++ 0x702f, 0x0000, 0x080c, 0x742b, 0x0168, 0x080c, 0x745d, 0x2d00, ++ 0x7002, 0x700a, 0x701a, 0x7013, 0x0001, 0x701f, 0x0007, 0x00ee, ++ 0x00de, 0x0005, 0xa00e, 0x0cd8, 0x00e6, 0x00d6, 0x00c6, 0x2071, ++ 0xc76f, 0x721c, 0x2100, 0xa202, 0x1618, 0x080c, 0x745d, 0x090c, ++ 0x1519, 0x7018, 0xa005, 0x1160, 0x2d00, 0x7002, 0x700a, 0x701a, ++ 0xa006, 0x7006, 0x700e, 0x6806, 0x6802, 0x7012, 0x701e, 0x0038, ++ 0x2060, 0x6806, 0x2d00, 0x6002, 0x701a, 0x6803, 0x0000, 0x7010, ++ 0x8000, 0x7012, 0x701c, 0xa080, 0x0007, 0x701e, 0x721c, 0x08d0, ++ 0x721c, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x0156, 0x0136, 0x0146, ++ 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0xc76f, 0x7300, 0xa398, ++ 0x0003, 0x7104, 0x080c, 0x7377, 0x810c, 0x2100, 0xa318, 0x8003, ++ 0x2228, 0x2021, 0x0054, 0xa402, 0xa532, 0x0208, 0x2028, 0x2500, ++ 0x8004, 0x20a8, 0x23a0, 0xe000, 0xe000, 0xe000, 0x53a5, 0x2508, ++ 0x080c, 0x7380, 0x2130, 0x7014, 0xa600, 0x7016, 0x2600, 0x711c, ++ 0xa102, 0x701e, 0x7004, 0xa600, 0x2008, 0xa082, 0x0007, 0x1180, ++ 0x7000, 0x2004, 0xa005, 0x1140, 0x2009, 0x0001, 0x0026, 0x080c, ++ 0x727c, 0x002e, 0x7000, 0x2004, 0x7002, 0x7007, 0x0000, 0x0008, ++ 0x7106, 0x2500, 0xa212, 0x1910, 0x012e, 0x00ee, 0x014e, 0x013e, ++ 0x015e, 0x0005, 0x0016, 0x0026, 0x00e6, 0x00d6, 0x080c, 0x7340, ++ 0x15e0, 0x2170, 0x2805, 0xac68, 0x2900, 0x0002, 0x7316, 0x7316, ++ 0x731a, 0x7316, 0x731a, 0x7316, 0x7316, 0x7316, 0x7316, 0x7316, ++ 0x7323, 0x7316, 0x7323, 0x7316, 0x7316, 0x7316, 0x080c, 0x1519, ++ 0xa005, 0x00f0, 0x7000, 0x6802, 0x7004, 0x6806, 0x7010, 0x680a, ++ 0x680f, 0x0000, 0x0060, 0x7010, 0x6812, 0x6817, 0x0000, 0x7000, ++ 0x6802, 0x7004, 0x6806, 0x7008, 0x680a, 0x700c, 0x680e, 0x00de, ++ 0x685c, 0x8000, 0x685e, 0x6858, 0x8001, 0x685a, 0x00d6, 0xa006, ++ 0x00de, 0x00ee, 0x002e, 0x001e, 0x0005, 0xa085, 0x0001, 0x0cc0, ++ 0x00e6, 0x0036, 0x2071, 0xc76f, 0x7014, 0xa005, 0x0568, 0x8001, ++ 0x7016, 0x7020, 0x8001, 0x7022, 0x7008, 0xa080, 0x0003, 0x710c, ++ 0x2110, 0x0429, 0x810c, 0xa118, 0x8210, 0xa282, 0x0007, 0x11b0, ++ 0x7008, 0x2004, 0xa005, 0x0178, 0x00d6, 0x0006, 0x7008, 0x2068, ++ 0x080c, 0x746c, 0x000e, 0x2068, 0x6807, 0x0000, 0x700a, 0x00de, ++ 0x7010, 0x8001, 0x7012, 0x700f, 0x0000, 0x0008, 0x720e, 0x2308, ++ 0xa006, 0x003e, 0x00ee, 0x0005, 0xa085, 0x0001, 0x0cd0, 0x0006, ++ 0x810b, 0x810b, 0x2100, 0x810b, 0xa100, 0x2008, 0x000e, 0x0005, ++ 0x0006, 0x0026, 0x2100, 0xa005, 0x0160, 0xa092, 0x000c, 0x0248, ++ 0x2009, 0x0000, 0x8108, 0xa082, 0x000c, 0x1de0, 0x002e, 0x000e, ++ 0x0005, 0x2009, 0x0000, 0x0cd0, 0x2d00, 0xa0b8, 0x0008, 0x690c, ++ 0x6810, 0x2019, 0x0001, 0x2031, 0x73c2, 0xa112, 0x0220, 0x0118, ++ 0x8318, 0x2208, 0x0cd0, 0x6808, 0xa005, 0x0108, 0x8318, 0x233a, ++ 0x6804, 0xd084, 0x2300, 0x2021, 0x0001, 0x1150, 0xa082, 0x0003, ++ 0x0967, 0x0a67, 0x8420, 0xa082, 0x0007, 0x0967, 0x0a67, 0x0cd0, ++ 0xa082, 0x0002, 0x0967, 0x0a67, 0x8420, 0xa082, 0x0005, 0x0967, ++ 0x0a67, 0x0cd0, 0x6c1a, 0x2d00, 0xa0b8, 0x0007, 0x00e6, 0x2071, ++ 0xc600, 0x7128, 0x6810, 0x2019, 0x0001, 0xa10a, 0x0118, 0x0210, ++ 0x8318, 0x0cd8, 0x2031, 0x73d5, 0x0870, 0x6c16, 0x00ee, 0x0005, ++ 0x00e6, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2e00, 0x2060, 0x2071, ++ 0xc76f, 0x2009, 0x0001, 0x0026, 0x080c, 0x727c, 0x002e, 0x7300, ++ 0xa398, 0x0003, 0x7104, 0x080c, 0x7377, 0x810c, 0x2100, 0xa318, ++ 0x6834, 0xa084, 0x00ff, 0xa086, 0x0024, 0x00d6, 0x2368, 0x1138, ++ 0x6000, 0x6802, 0x6004, 0x6806, 0x6008, 0x6812, 0x0050, 0x6000, ++ 0x6802, 0x6004, 0x6806, 0x6008, 0x680a, 0x600c, 0x680e, 0x6010, ++ 0x6812, 0x00de, 0x7014, 0x8000, 0x7016, 0x711c, 0x8109, 0x711e, ++ 0x7004, 0x8000, 0x2008, 0xa082, 0x0007, 0x1180, 0x7000, 0x2004, ++ 0xa005, 0x1140, 0x2009, 0x0001, 0x0026, 0x080c, 0x727c, 0x002e, ++ 0x7000, 0x2004, 0x7002, 0x7007, 0x0000, 0x0008, 0x7106, 0x012e, ++ 0x00ce, 0x00ee, 0x0005, 0x00d6, 0x0046, 0x0126, 0x2091, 0x8000, ++ 0x2001, 0xc682, 0xa080, 0x0011, 0x2004, 0x8003, 0x2020, 0x080c, ++ 0x15e5, 0x01d0, 0x2d00, 0x7026, 0x6803, 0x0000, 0x6807, 0x0000, ++ 0x080c, 0x15e5, 0x0188, 0x7024, 0x6802, 0x6807, 0x0000, 0x2d00, ++ 0x7026, 0xa4a2, 0x0007, 0x0110, 0x0208, 0x0c90, 0xa085, 0x0001, ++ 0x012e, 0x004e, 0x00de, 0x0005, 0x7024, 0xa005, 0x0dc8, 0x2068, ++ 0x2024, 0x080c, 0x1619, 0x2400, 0x0cc0, 0x0126, 0x2091, 0x8000, ++ 0x7024, 0x2068, 0xa005, 0x0130, 0x2004, 0x7026, 0x6803, 0x0000, ++ 0x6807, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7024, ++ 0x6802, 0x2d00, 0x7026, 0x012e, 0x0005, 0x00d6, 0x2001, 0xc778, ++ 0x2004, 0xa005, 0x0138, 0x2068, 0x6800, 0x0006, 0x080c, 0x1619, ++ 0x000e, 0x0cb8, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x2071, 0xc76f, ++ 0x7008, 0xa005, 0x0138, 0x2068, 0x6800, 0x0006, 0x080c, 0x1619, ++ 0x000e, 0x0cb8, 0xa006, 0x7002, 0x700a, 0x7006, 0x700e, 0x701a, ++ 0x701e, 0x7022, 0x702a, 0x7026, 0x702e, 0x00ee, 0x00de, 0x0005, ++ 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0086, 0x0046, 0x0056, 0x0026, ++ 0x2031, 0x0000, 0x2001, 0xc756, 0x2004, 0xa005, 0x0904, 0x7532, ++ 0x2071, 0xc682, 0x20e1, 0x0002, 0x3d08, 0xd19c, 0x0140, 0x2069, ++ 0xc600, 0x6a28, 0x761c, 0x7114, 0x2041, 0x0000, 0x0028, 0x7118, ++ 0x720c, 0x7620, 0x7008, 0x2040, 0x080c, 0x7627, 0x0904, 0x7532, ++ 0x7004, 0xd084, 0x1128, 0x2021, 0x0024, 0x2029, 0x0002, 0x0020, ++ 0x2021, 0x002c, 0x2029, 0x000a, 0x080c, 0x1602, 0x0904, 0x752a, ++ 0x2d00, 0x2060, 0x6436, 0x0016, 0x20e1, 0x0001, 0x3d08, 0x3e00, ++ 0xa18c, 0x00ff, 0x6142, 0x603e, 0x001e, 0x6746, 0x2700, 0xa086, ++ 0xff00, 0x1118, 0x6063, 0x0000, 0x0010, 0x6063, 0x0003, 0xa006, ++ 0x6002, 0x602a, 0x602e, 0x6006, 0x603a, 0x604a, 0x6052, 0x6057, ++ 0x0005, 0x605e, 0x6066, 0x604e, 0x2800, 0x606a, 0x604c, 0xc0ad, ++ 0x604e, 0x665a, 0x2c00, 0x2078, 0x0479, 0x607f, 0xffff, 0x6083, ++ 0x0000, 0x8109, 0x0180, 0x080c, 0x1602, 0x01c0, 0x2d00, 0x7806, ++ 0x2f00, 0x6802, 0x6d36, 0xa006, 0x2d00, 0x2520, 0x00e9, 0x2d00, ++ 0x2078, 0x8109, 0x1d80, 0x2c00, 0xa005, 0x002e, 0x005e, 0x004e, ++ 0x008e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x2c00, 0x2068, ++ 0x080c, 0x1629, 0x2600, 0x2071, 0xc76f, 0x7120, 0xa102, 0x0a0c, ++ 0x1519, 0x7022, 0xa006, 0x0c48, 0x00d6, 0x00c6, 0x0136, 0x0146, ++ 0x0156, 0x0016, 0x2068, 0x2400, 0xa084, 0x000f, 0xa080, 0x23c7, ++ 0x2005, 0x2005, 0xad60, 0x2c00, 0x2d08, 0xa188, 0x0030, 0xa102, ++ 0x20a8, 0x2c00, 0x20a0, 0x2001, 0xffff, 0x40a4, 0x001e, 0x015e, ++ 0x014e, 0x013e, 0x00ce, 0x00de, 0x0005, 0x00c6, 0x00e6, 0x00f6, ++ 0x6858, 0x2071, 0xc76f, 0x7120, 0xa102, 0x0a0c, 0x1519, 0x7022, ++ 0x6960, 0x694e, 0x697c, 0x2009, 0xffff, 0x7818, 0xa102, 0xe000, ++ 0x6852, 0x684b, 0x0000, 0x6868, 0xa005, 0x0118, 0x6848, 0xc085, ++ 0x684a, 0x2d00, 0xa080, 0x0015, 0x2038, 0x2031, 0x0018, 0x6864, ++ 0x2020, 0x683a, 0x685c, 0xa08a, 0x00ff, 0x1a0c, 0x1519, 0x2028, ++ 0x2d00, 0x2060, 0x2078, 0x6934, 0xa18c, 0x000f, 0xa188, 0x23c7, ++ 0x2145, 0x685c, 0x2050, 0xa005, 0x0530, 0x2805, 0xac70, 0x6834, ++ 0xa084, 0x00ff, 0xa086, 0x0024, 0x1110, 0x7008, 0x0040, 0x6834, ++ 0xa084, 0x00ff, 0xa086, 0x002c, 0x190c, 0x1519, 0x7010, 0x0006, ++ 0x2400, 0xa005, 0x000e, 0x0168, 0x203a, 0x8738, 0x8631, 0x090c, ++ 0x1519, 0x8421, 0x8529, 0x0138, 0x080c, 0x2389, 0x090c, 0x1519, ++ 0x08e0, 0x080c, 0x73d8, 0x6837, 0x0023, 0x00fe, 0x00ee, 0x00ce, ++ 0x0005, 0x00e6, 0x00c6, 0x00a6, 0x0086, 0x0056, 0x2d00, 0x2060, ++ 0x6934, 0xa18c, 0x000f, 0xa188, 0x23c7, 0x2145, 0x685c, 0x2050, ++ 0xa005, 0x01d0, 0x2028, 0x2805, 0xac70, 0x6834, 0xa084, 0x00ff, ++ 0xa086, 0x0024, 0x1110, 0x7008, 0x0008, 0x7010, 0x0006, 0xa086, ++ 0xffff, 0x000e, 0x0110, 0x080c, 0x73d8, 0x8529, 0x0128, 0x080c, ++ 0x2389, 0x090c, 0x1519, 0x0c38, 0x005e, 0x008e, 0x00ae, 0x00ce, ++ 0x00ee, 0x0005, 0x70ac, 0xa005, 0x0120, 0x2060, 0x6008, 0xa306, ++ 0x0005, 0xa085, 0x0001, 0x0ce0, 0x70ac, 0x600e, 0x2c00, 0x70ae, ++ 0x0005, 0x00f6, 0x00d6, 0x0036, 0x70ac, 0xa005, 0x01b8, 0x2068, ++ 0x2079, 0x0000, 0x2c08, 0xa11e, 0x1118, 0x680c, 0x70ae, 0x0060, ++ 0xa106, 0x0140, 0x2d00, 0x2078, 0x680c, 0xa005, 0x090c, 0x1519, ++ 0x2068, 0x0cb0, 0x6b0c, 0x7b0e, 0x600f, 0x0000, 0x003e, 0x00de, ++ 0x00fe, 0x0005, 0x00e6, 0x080c, 0x724a, 0x6018, 0x2070, 0xa006, ++ 0x70b2, 0x70b6, 0x08b1, 0x080c, 0x95e3, 0x00ee, 0x0005, 0x00d6, ++ 0x0026, 0x0016, 0x2061, 0xc76f, 0x6020, 0x6414, 0xa600, 0xa42a, ++ 0x02f0, 0x6022, 0x2069, 0xc682, 0x6828, 0x6114, 0xa102, 0x1288, ++ 0x685c, 0xd08c, 0x1130, 0xc08d, 0x685e, 0x2011, 0x8025, 0x080c, ++ 0x407d, 0x2001, 0xc695, 0x2004, 0xa080, 0x0000, 0x200c, 0x8108, ++ 0x2102, 0xa085, 0x0001, 0x001e, 0x002e, 0x00de, 0x0005, 0x2069, ++ 0xc682, 0x6804, 0xd094, 0x0148, 0x685c, 0xd084, 0x1130, 0xc085, ++ 0x685e, 0x2011, 0x8026, 0x080c, 0x407d, 0x2001, 0xc695, 0x2004, ++ 0xa080, 0x0001, 0x200c, 0x8108, 0x2102, 0xa006, 0x2031, 0x0000, ++ 0x0c10, 0x0006, 0x0016, 0x00c6, 0x6018, 0x2060, 0x6010, 0xa005, ++ 0x0178, 0x2001, 0xc756, 0x2004, 0xa005, 0x0150, 0x2001, 0xc600, ++ 0x2004, 0xa086, 0x0003, 0x1120, 0x2011, 0x8014, 0x080c, 0x407d, ++ 0x00ce, 0x001e, 0x000e, 0x0005, 0x0016, 0x6834, 0xa08c, 0x00ff, ++ 0xa186, 0x0024, 0x0110, 0xa186, 0x002c, 0x001e, 0x0005, 0x2001, ++ 0xc683, 0x2004, 0xd09c, 0x0005, 0x2001, 0xc683, 0x2004, 0xd0a4, ++ 0x0005, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, ++ 0x006e, 0x0005, 0x76b2, 0x76b2, 0x76b2, 0x76b4, 0x770f, 0x76b2, ++ 0x76b2, 0x76b2, 0x774d, 0x76b2, 0x77aa, 0x76b2, 0x76b2, 0x76b2, ++ 0x76b2, 0x76b2, 0x080c, 0x1519, 0xa182, 0x0100, 0x0002, 0x76c6, ++ 0x76c6, 0x76c6, 0x76c8, 0x76e1, 0x76fb, 0x76c6, 0x76c6, 0x76c6, ++ 0x76c6, 0x76c6, 0x76c6, 0x76c6, 0x76c6, 0x76c6, 0x080c, 0x1519, ++ 0x00d6, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6110, 0x2168, 0x684b, ++ 0x0000, 0x00d6, 0x6018, 0x2068, 0x6008, 0x68b6, 0x68bb, 0x0500, ++ 0xa006, 0x68b2, 0x00de, 0x080c, 0x580a, 0x080c, 0x95e3, 0x00de, ++ 0x0005, 0x080c, 0x7e47, 0x00f6, 0x00d6, 0x6110, 0x2178, 0x080c, ++ 0xac91, 0x0150, 0x00e6, 0x6018, 0x2070, 0xa006, 0x70b2, 0x70b6, ++ 0x00ee, 0x2f68, 0x080c, 0x580a, 0x00de, 0x00fe, 0x080c, 0x95e3, ++ 0x080c, 0x7f6e, 0x0005, 0x080c, 0x7e47, 0x080c, 0x2e46, 0x00d6, ++ 0x6110, 0x2168, 0x080c, 0xac91, 0x0120, 0x684b, 0x0029, 0x080c, ++ 0x580a, 0x00de, 0x080c, 0x95e3, 0x080c, 0x7f6e, 0x0005, 0xa182, ++ 0x0100, 0x0002, 0x7721, 0x7723, 0x772b, 0x7721, 0x7721, 0x7721, ++ 0x7748, 0x7721, 0x7721, 0x7721, 0x7721, 0x7721, 0x7721, 0x7721, ++ 0x7721, 0x080c, 0x1519, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, ++ 0x080c, 0x1870, 0x0005, 0x00d6, 0x00e6, 0x2001, 0xc756, 0x2004, ++ 0xa086, 0x0000, 0x6110, 0x1118, 0x080c, 0x1629, 0x0028, 0x2168, ++ 0x080c, 0x7555, 0x080c, 0x580a, 0x6018, 0x2070, 0xa006, 0x70b2, ++ 0x70b6, 0x080c, 0x75f9, 0x00ee, 0x00de, 0x080c, 0x95e3, 0x0005, ++ 0x080c, 0x761a, 0x080c, 0x56c7, 0x0005, 0xa182, 0x0100, 0x0002, ++ 0x7762, 0x7788, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, ++ 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, 0x7760, ++ 0x080c, 0x1519, 0x00d6, 0x6003, 0x0003, 0x6106, 0x6010, 0x2068, ++ 0x687c, 0x680a, 0x6880, 0x680e, 0x6813, 0x0000, 0x6817, 0x0000, ++ 0x6854, 0xa092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, ++ 0x8213, 0xa210, 0x6216, 0x00de, 0x2c10, 0x080c, 0x2068, 0x080c, ++ 0x79fc, 0x0126, 0x2091, 0x8000, 0x080c, 0x7f6e, 0x012e, 0x0005, ++ 0x6003, 0x0004, 0x630a, 0x080c, 0x74a0, 0x0168, 0x6012, 0x600f, ++ 0x0000, 0x080c, 0x75f4, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, ++ 0x080c, 0x1870, 0x0005, 0x2011, 0x0000, 0x080c, 0x1870, 0x00e6, ++ 0x6018, 0x2070, 0x70b3, 0x0000, 0x70b7, 0x0000, 0x00ee, 0x080c, ++ 0x95e3, 0x0005, 0x00d6, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6110, ++ 0x2168, 0x684b, 0x0000, 0x00d6, 0x6018, 0x2068, 0x6008, 0x68b6, ++ 0x68bb, 0x0500, 0xa006, 0x68b2, 0x00de, 0x080c, 0x580a, 0x080c, ++ 0x95e3, 0x00de, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519, ++ 0x000b, 0x0005, 0x77da, 0x77da, 0x77da, 0x77dc, 0x77f1, 0x77da, ++ 0x77da, 0x77da, 0x77da, 0x77da, 0x77da, 0x77da, 0x77da, 0x77da, ++ 0x77da, 0x77da, 0x080c, 0x1519, 0x080c, 0x90f6, 0x6110, 0x2168, ++ 0x684b, 0x0006, 0x00d6, 0x6018, 0x2068, 0x6008, 0x68b6, 0x68bb, ++ 0x0500, 0xa006, 0x68b2, 0x00de, 0x080c, 0x580a, 0x080c, 0x95e3, ++ 0x0005, 0x080c, 0x761a, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, ++ 0x1519, 0x000b, 0x0005, 0x780b, 0x780b, 0x780b, 0x780d, 0x781d, ++ 0x780b, 0x780b, 0x780b, 0x780b, 0x780b, 0x780b, 0x780b, 0x780b, ++ 0x780b, 0x780b, 0x780b, 0x080c, 0x1519, 0x0036, 0x00e6, 0x2071, ++ 0xc927, 0x703c, 0xac06, 0x1120, 0x2019, 0x0000, 0x080c, 0x8e79, ++ 0x080c, 0x90f6, 0x00ee, 0x003e, 0x0005, 0x00d6, 0x6010, 0x2068, ++ 0x080c, 0x761a, 0x00de, 0x0005, 0x080c, 0x7684, 0x1150, 0x6024, ++ 0xd09c, 0x1138, 0x6810, 0x2009, 0xffff, 0xa102, 0x2020, 0x2019, ++ 0x0000, 0x0005, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, ++ 0x1208, 0xa200, 0x1f04, 0x7836, 0x8086, 0x818e, 0x0005, 0x0156, ++ 0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213, 0x818d, ++ 0x0228, 0xa11a, 0x1220, 0x1f04, 0x7846, 0x0028, 0xa11a, 0x2308, ++ 0x8210, 0x1f04, 0x7846, 0x0006, 0x3200, 0xa084, 0xefff, 0x2080, ++ 0x000e, 0x015e, 0x0005, 0x0006, 0x3200, 0xa085, 0x1000, 0x0cb8, ++ 0x0126, 0x2091, 0x2800, 0x2079, 0xc927, 0x012e, 0x00d6, 0x2069, ++ 0xc927, 0x6803, 0x0005, 0x2069, 0x0004, 0x2d04, 0xa085, 0x8001, ++ 0x206a, 0x00de, 0x0005, 0x00c6, 0x6027, 0x0001, 0x7804, 0xa084, ++ 0x0007, 0x0002, 0x7884, 0x78a5, 0x78f8, 0x788a, 0x78a5, 0x7884, ++ 0x7882, 0x7882, 0x080c, 0x1519, 0x080c, 0x7024, 0x080c, 0x7e94, ++ 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005, 0x2011, ++ 0x4e18, 0x080c, 0x6fad, 0x7828, 0xa092, 0x00c8, 0x1228, 0x8000, ++ 0x782a, 0x080c, 0x4e52, 0x0c88, 0x080c, 0x4e18, 0x7807, 0x0003, ++ 0x7827, 0x0000, 0x782b, 0x0000, 0x0c40, 0x080c, 0x7024, 0x3c00, ++ 0x0006, 0x2011, 0x0209, 0x20e1, 0x4000, 0x2214, 0x000e, 0x20e0, ++ 0x82ff, 0x0178, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, ++ 0xa065, 0x090c, 0x1519, 0x2009, 0x0013, 0x080c, 0x9613, 0x00ce, ++ 0x0005, 0x3900, 0xa082, 0xca74, 0x1210, 0x080c, 0x91cb, 0x00c6, ++ 0x7824, 0xa065, 0x090c, 0x1519, 0x7804, 0xa086, 0x0004, 0x0904, ++ 0x7938, 0x7828, 0xa092, 0x2710, 0x1230, 0x8000, 0x782a, 0x00ce, ++ 0x080c, 0x8be8, 0x0c20, 0x6104, 0xa186, 0x0003, 0x1188, 0x00e6, ++ 0x2071, 0xc600, 0x70e0, 0x00ee, 0xd08c, 0x0150, 0x00c6, 0x00e6, ++ 0x2061, 0x0100, 0x2071, 0xc600, 0x080c, 0x4e5b, 0x00ee, 0x00ce, ++ 0x080c, 0xc59b, 0x2009, 0x0014, 0x080c, 0x9613, 0x00ce, 0x0838, ++ 0x2001, 0xc943, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b, ++ 0x0000, 0x7824, 0xa065, 0x090c, 0x1519, 0x2009, 0x0013, 0x080c, ++ 0x9667, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x3900, 0xa082, 0xca74, ++ 0x1210, 0x080c, 0x91cb, 0x7824, 0xa005, 0x090c, 0x1519, 0x781c, ++ 0xa06d, 0x090c, 0x1519, 0x6800, 0xc0dc, 0x6802, 0x7924, 0x2160, ++ 0x080c, 0x95e3, 0x693c, 0x81ff, 0x090c, 0x1519, 0x8109, 0x693e, ++ 0x6854, 0xa015, 0x0110, 0x7a1e, 0x0010, 0x7918, 0x791e, 0x7807, ++ 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce, 0x080c, 0x7e94, 0x0888, ++ 0x6104, 0xa186, 0x0002, 0x0128, 0xa186, 0x0004, 0x0110, 0x0804, ++ 0x78d1, 0x7808, 0xac06, 0x0904, 0x78d1, 0x080c, 0x7db1, 0x080c, ++ 0x79df, 0x00ce, 0x080c, 0x7e94, 0x0804, 0x78bf, 0x00c6, 0x6027, ++ 0x0002, 0x62c8, 0x60c4, 0xa205, 0x11a8, 0x793c, 0xa1e5, 0x0000, ++ 0x0160, 0x2009, 0x0049, 0x601c, 0xa086, 0x0009, 0x1110, 0x2009, ++ 0x0103, 0x080c, 0x9613, 0x00ce, 0x0005, 0x2011, 0xc946, 0x2013, ++ 0x0000, 0x0cc8, 0x3908, 0xa192, 0xca74, 0x1210, 0x080c, 0x91cb, ++ 0x793c, 0x81ff, 0x0d90, 0x7944, 0xa192, 0x7530, 0x12f0, 0x8108, ++ 0x7946, 0x793c, 0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x1138, ++ 0x6014, 0xa084, 0x0184, 0xa085, 0x0012, 0x6016, 0x08e0, 0x793c, ++ 0xa188, 0x0007, 0x210c, 0xa18e, 0x0009, 0x0d90, 0x6014, 0xa084, ++ 0x0184, 0xa085, 0x0016, 0x6016, 0x0870, 0x7848, 0xc085, 0x784a, ++ 0x0850, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, ++ 0x0000, 0x2c08, 0x2061, 0xc927, 0x6020, 0x8000, 0x6022, 0x6010, ++ 0xa005, 0x0148, 0xa080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, ++ 0x001e, 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, ++ 0xc927, 0x6000, 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0xa086, ++ 0x0001, 0x1110, 0x2c00, 0x681e, 0x6804, 0xa084, 0x0007, 0x0804, ++ 0x7e9a, 0xc0d5, 0x6002, 0x6818, 0xa005, 0x0158, 0x6056, 0x605b, ++ 0x0000, 0x0006, 0x2c00, 0x681a, 0x00de, 0x685a, 0x2069, 0xc927, ++ 0x0c18, 0x6056, 0x605a, 0x2c00, 0x681a, 0x681e, 0x08e8, 0x0006, ++ 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, ++ 0x2061, 0xc927, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0148, ++ 0xa080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, ++ 0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, ++ 0x2061, 0xc927, 0x6034, 0xa005, 0x0130, 0xa080, 0x0003, 0x2102, ++ 0x6136, 0x00ce, 0x0005, 0x613a, 0x6136, 0x0cd8, 0x00f6, 0x00e6, ++ 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0036, 0x0026, 0x0016, ++ 0x0006, 0x0126, 0xa02e, 0x2071, 0xc927, 0x7638, 0x2660, 0x2678, ++ 0x2091, 0x8000, 0x8cff, 0x0904, 0x7a87, 0x6018, 0xa080, 0x0028, ++ 0x2004, 0xa206, 0x1904, 0x7a82, 0x87ff, 0x0120, 0x6050, 0xa106, ++ 0x1904, 0x7a82, 0x703c, 0xac06, 0x1190, 0x0036, 0x2019, 0x0001, ++ 0x080c, 0x8e79, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043, 0x0000, ++ 0x7047, 0x0000, 0x704b, 0x0000, 0x003e, 0x2029, 0x0001, 0x7038, ++ 0xac36, 0x1110, 0x660c, 0x763a, 0x7034, 0xac36, 0x1140, 0x2c00, ++ 0xaf36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, ++ 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, ++ 0x0000, 0x080c, 0xac91, 0x01c8, 0x6010, 0x2068, 0x601c, 0xa086, ++ 0x0003, 0x1580, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x0016, ++ 0x0036, 0x0076, 0x080c, 0xaf03, 0x080c, 0xc4d7, 0x080c, 0x580a, ++ 0x007e, 0x003e, 0x001e, 0x080c, 0xae48, 0x080c, 0xae54, 0x00ce, ++ 0x0804, 0x7a22, 0x2c78, 0x600c, 0x2060, 0x0804, 0x7a22, 0x85ff, ++ 0x0120, 0x0036, 0x080c, 0x7f6e, 0x003e, 0x012e, 0x000e, 0x001e, ++ 0x002e, 0x003e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, ++ 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x0158, 0x601c, 0xa086, ++ 0x0009, 0x1190, 0x684b, 0x0006, 0x080c, 0x580a, 0x080c, 0x95e3, ++ 0x08b0, 0x0016, 0x0036, 0x0076, 0x080c, 0xc4d7, 0x080c, 0xc141, ++ 0x007e, 0x003e, 0x001e, 0x0848, 0x601c, 0xa086, 0x000a, 0x0904, ++ 0x7a6c, 0x0804, 0x7a6a, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x00f6, ++ 0x2031, 0x0000, 0x0126, 0x2091, 0x8000, 0x2079, 0xc927, 0x7838, ++ 0xa065, 0x0568, 0x600c, 0x0006, 0x600f, 0x0000, 0x783c, 0xac06, ++ 0x1180, 0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 0x7833, 0x0000, ++ 0x783f, 0x0000, 0x7843, 0x0000, 0x7847, 0x0000, 0x784b, 0x0000, ++ 0x003e, 0x080c, 0xac91, 0x0178, 0x6010, 0x2068, 0x601c, 0xa086, ++ 0x0003, 0x11b0, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, ++ 0x580a, 0x080c, 0xae48, 0x080c, 0xae54, 0x000e, 0x0888, 0x7e3a, ++ 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, ++ 0x601c, 0xa086, 0x0006, 0x0150, 0x601c, 0xa086, 0x0009, 0x1148, ++ 0x6b4a, 0x080c, 0x580a, 0x080c, 0x95e3, 0x0c38, 0x080c, 0xc141, ++ 0x0c10, 0x601c, 0xa086, 0x000a, 0x09b8, 0x08a0, 0x0016, 0x0026, ++ 0x0086, 0x2041, 0x0000, 0x0099, 0x080c, 0x7be4, 0x008e, 0x002e, ++ 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0xc927, 0x2091, 0x8000, ++ 0x080c, 0x7c71, 0x080c, 0x7ce3, 0x012e, 0x00fe, 0x0005, 0x00f6, ++ 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, ++ 0x8000, 0x2071, 0xc927, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, ++ 0x7bba, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, 0x7bb5, ++ 0x88ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x7bb5, 0x7024, 0xac06, ++ 0x1538, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, 0x7024, ++ 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, 0x90e6, 0x7027, 0x0000, ++ 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, ++ 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, ++ 0x6827, 0x0001, 0x003e, 0x0020, 0x6003, 0x0009, 0x630a, 0x04e8, ++ 0x7014, 0xac36, 0x1110, 0x660c, 0x7616, 0x7010, 0xac36, 0x1140, ++ 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, ++ 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, ++ 0x600f, 0x0000, 0x6010, 0x2068, 0x080c, 0xac91, 0x01b8, 0x601c, ++ 0xa086, 0x0003, 0x1540, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, ++ 0x0016, 0x0036, 0x0086, 0x080c, 0xaf03, 0x080c, 0xc4d7, 0x080c, ++ 0x580a, 0x008e, 0x003e, 0x001e, 0x080c, 0xae48, 0x080c, 0xae54, ++ 0x080c, 0x8fb7, 0x00ce, 0x0804, 0x7b3e, 0x2c78, 0x600c, 0x2060, ++ 0x0804, 0x7b3e, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, ++ 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1158, 0x0016, ++ 0x0036, 0x0086, 0x080c, 0xc4d7, 0x080c, 0xc141, 0x008e, 0x003e, ++ 0x001e, 0x08e0, 0x601c, 0xa086, 0x0002, 0x1128, 0x6004, 0xa086, ++ 0x0085, 0x0908, 0x0898, 0x601c, 0xa086, 0x0005, 0x1978, 0x6004, ++ 0xa086, 0x0085, 0x0d20, 0x0850, 0x00c6, 0x0006, 0x0126, 0x2091, ++ 0x8000, 0xa280, 0xc77b, 0x2004, 0xa065, 0x0904, 0x7c6d, 0x00f6, ++ 0x00e6, 0x00d6, 0x0066, 0x2071, 0xc927, 0x6654, 0x7018, 0xac06, ++ 0x1108, 0x761a, 0x701c, 0xac06, 0x1130, 0x86ff, 0x1118, 0x7018, ++ 0x701e, 0x0008, 0x761e, 0x6058, 0xa07d, 0x0108, 0x7e56, 0xa6ed, ++ 0x0000, 0x0110, 0x2f00, 0x685a, 0x6057, 0x0000, 0x605b, 0x0000, ++ 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x080c, 0x5268, 0x0904, 0x7c69, ++ 0x7624, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, 0xad06, 0x15c0, ++ 0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, 0x080c, 0x7024, ++ 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, 0x90e6, 0x7027, 0x0000, ++ 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, ++ 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, ++ 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0x603c, 0xa005, 0x0110, ++ 0x8001, 0x603e, 0x2660, 0x080c, 0xae54, 0x00ce, 0x0048, 0x00de, ++ 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x7c14, ++ 0x8dff, 0x0158, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, ++ 0xaf03, 0x080c, 0xc4d7, 0x080c, 0x580a, 0x080c, 0x8fb7, 0x0804, ++ 0x7c14, 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, ++ 0x0005, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x2031, 0x0000, 0x7814, ++ 0xa065, 0x0904, 0x7cc3, 0x600c, 0x0006, 0x600f, 0x0000, 0x7824, ++ 0xac06, 0x1540, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, ++ 0x7024, 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, 0x90e6, 0x7827, ++ 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, ++ 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, ++ 0x0110, 0x6827, 0x0001, 0x003e, 0x0028, 0x6003, 0x0009, 0x630a, ++ 0x2c30, 0x00b0, 0x6010, 0x2068, 0x080c, 0xac91, 0x0168, 0x601c, ++ 0xa086, 0x0003, 0x11b8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, ++ 0x080c, 0x580a, 0x080c, 0xae48, 0x080c, 0xae54, 0x080c, 0x8fb7, ++ 0x000e, 0x0804, 0x7c78, 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e, ++ 0x000e, 0x0005, 0x601c, 0xa086, 0x0006, 0x1118, 0x080c, 0xc141, ++ 0x0c58, 0x601c, 0xa086, 0x0002, 0x1128, 0x6004, 0xa086, 0x0085, ++ 0x09d0, 0x0c10, 0x601c, 0xa086, 0x0005, 0x19f0, 0x6004, 0xa086, ++ 0x0085, 0x0d60, 0x08c8, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x7818, ++ 0xa065, 0x0904, 0x7d49, 0x6054, 0x0006, 0x6057, 0x0000, 0x605b, ++ 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x080c, 0x5268, 0x0904, ++ 0x7d46, 0x7e24, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, 0xad06, ++ 0x15c0, 0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, 0x080c, ++ 0x7024, 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, 0x90e6, 0x7827, ++ 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, ++ 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, ++ 0x0110, 0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0x603c, 0xa005, ++ 0x0110, 0x8001, 0x603e, 0x2660, 0x080c, 0xae54, 0x00ce, 0x0048, ++ 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, ++ 0x7cf5, 0x8dff, 0x0138, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, ++ 0x080c, 0x580a, 0x080c, 0x8fb7, 0x0804, 0x7cf5, 0x000e, 0x0804, ++ 0x7ce8, 0x781e, 0x781a, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, ++ 0x00e6, 0x00d6, 0x0066, 0x6000, 0xd0dc, 0x01a0, 0x604c, 0xa06d, ++ 0x0188, 0x6848, 0xa606, 0x1170, 0x2071, 0xc927, 0x7024, 0xa035, ++ 0x0148, 0xa080, 0x0004, 0x2004, 0xad06, 0x1120, 0x6000, 0xc0dc, ++ 0x6002, 0x0021, 0x006e, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x2079, ++ 0x0100, 0x78c0, 0xa005, 0x1138, 0x00c6, 0x2660, 0x6003, 0x0009, ++ 0x630a, 0x00ce, 0x04a0, 0x080c, 0x8bf5, 0x78c3, 0x0000, 0x080c, ++ 0x90e6, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, 0xa384, ++ 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, 0x2079, 0x0100, ++ 0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, 0x90e6, 0x003e, ++ 0x080c, 0x5268, 0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e, ++ 0x2660, 0x080c, 0x95e3, 0x00ce, 0x6837, 0x0103, 0x6b4a, 0x6847, ++ 0x0000, 0x080c, 0xaf03, 0x080c, 0x580a, 0x080c, 0x8fb7, 0x00fe, ++ 0x0005, 0x00e6, 0x00c6, 0x2071, 0xc927, 0x7004, 0xa084, 0x0007, ++ 0x0002, 0x7dc3, 0x7dc6, 0x7ddc, 0x7df5, 0x7e32, 0x7dc3, 0x7dc1, ++ 0x7dc1, 0x080c, 0x1519, 0x00ce, 0x00ee, 0x0005, 0x7024, 0xa065, ++ 0x0148, 0x7020, 0x8001, 0x7022, 0x600c, 0xa015, 0x0150, 0x7216, ++ 0x600f, 0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x00ce, 0x00ee, ++ 0x0005, 0x7216, 0x7212, 0x0cb0, 0x6018, 0x2060, 0x080c, 0x5268, ++ 0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, 0x7022, 0x0120, 0x6054, ++ 0xa015, 0x0140, 0x721e, 0x7007, 0x0000, 0x7027, 0x0000, 0x00ce, ++ 0x00ee, 0x0005, 0x7218, 0x721e, 0x0cb0, 0x7024, 0xa065, 0x05b8, ++ 0x700c, 0xac06, 0x1160, 0x080c, 0x8fb7, 0x600c, 0xa015, 0x0120, ++ 0x720e, 0x600f, 0x0000, 0x0448, 0x720e, 0x720a, 0x0430, 0x7014, ++ 0xac06, 0x1160, 0x080c, 0x8fb7, 0x600c, 0xa015, 0x0120, 0x7216, ++ 0x600f, 0x0000, 0x00d0, 0x7216, 0x7212, 0x00b8, 0x601c, 0xa086, ++ 0x0003, 0x1198, 0x6018, 0x2060, 0x080c, 0x5268, 0x6000, 0xc0dc, ++ 0x6002, 0x080c, 0x8fb7, 0x701c, 0xa065, 0x0138, 0x6054, 0xa015, ++ 0x0110, 0x721e, 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, ++ 0x00ee, 0x0005, 0x7024, 0xa065, 0x0140, 0x080c, 0x8fb7, 0x600c, ++ 0xa015, 0x0150, 0x720e, 0x600f, 0x0000, 0x080c, 0x90e6, 0x7027, ++ 0x0000, 0x00ce, 0x00ee, 0x0005, 0x720e, 0x720a, 0x0cb0, 0x00d6, ++ 0x2069, 0xc927, 0x6830, 0xa084, 0x0003, 0x0002, 0x7e54, 0x7e56, ++ 0x7e7a, 0x7e52, 0x080c, 0x1519, 0x00de, 0x0005, 0x00c6, 0x6840, ++ 0xa086, 0x0001, 0x01b8, 0x683c, 0xa065, 0x0130, 0x600c, 0xa015, ++ 0x0170, 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, ++ 0x2011, 0xc946, 0x2013, 0x0000, 0x00ce, 0x00de, 0x0005, 0x683a, ++ 0x6836, 0x0c90, 0x6843, 0x0000, 0x6838, 0xa065, 0x0d68, 0x6003, ++ 0x0003, 0x0c50, 0x00c6, 0x6843, 0x0000, 0x6847, 0x0000, 0x684b, ++ 0x0000, 0x683c, 0xa065, 0x0168, 0x600c, 0xa015, 0x0130, 0x6a3a, ++ 0x600f, 0x0000, 0x683f, 0x0000, 0x0020, 0x683f, 0x0000, 0x683a, ++ 0x6836, 0x00ce, 0x00de, 0x0005, 0x00d6, 0x2069, 0xc927, 0x6804, ++ 0xa084, 0x0007, 0x0006, 0xa005, 0x11c8, 0x2001, 0xc635, 0x2004, ++ 0xa084, 0x0028, 0x1198, 0x2001, 0xc8e5, 0x2004, 0xa086, 0xaaaa, ++ 0x0168, 0x2001, 0xc696, 0x2004, 0xd08c, 0x1118, 0xd084, 0x1118, ++ 0x0028, 0x080c, 0x7f6e, 0x000e, 0x00de, 0x0005, 0x000e, 0x0002, ++ 0x7ec2, 0x7f5e, 0x7f5e, 0x7f5e, 0x7f5e, 0x7f60, 0x7ec0, 0x7ec0, ++ 0x080c, 0x1519, 0x6820, 0xa005, 0x1110, 0x00de, 0x0005, 0x00c6, ++ 0x680c, 0xa065, 0x0150, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, ++ 0x080c, 0x7ff0, 0x00ce, 0x00de, 0x0005, 0x6814, 0xa065, 0x0150, ++ 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, 0x7ff0, 0x00ce, ++ 0x00de, 0x0005, 0x00e6, 0x0036, 0x6a1c, 0xa2f5, 0x0000, 0x0904, ++ 0x7f5a, 0x704c, 0xa00d, 0x0118, 0x7088, 0xa005, 0x01a0, 0x7054, ++ 0xa075, 0x0120, 0xa20e, 0x0904, 0x7f5a, 0x0028, 0x6818, 0xa20e, ++ 0x0904, 0x7f5a, 0x2070, 0x704c, 0xa00d, 0x0d88, 0x7088, 0xa005, ++ 0x1d70, 0x2e00, 0x681e, 0x733c, 0x7038, 0xa302, 0x1e40, 0x080c, ++ 0x95ba, 0x0904, 0x7f5a, 0x8318, 0x733e, 0x6112, 0x2e10, 0x621a, ++ 0xa180, 0x0014, 0x2004, 0xa084, 0x00ff, 0x605a, 0xa180, 0x0014, ++ 0x2003, 0x0000, 0xa180, 0x0015, 0x2004, 0xa08a, 0x199a, 0x0210, ++ 0x2001, 0x1999, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x003e, ++ 0x00f6, 0x2c78, 0x71a0, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1110, ++ 0xd1bc, 0x0150, 0x7100, 0xd1f4, 0x0120, 0x7114, 0xa18c, 0x00ff, ++ 0x0040, 0x2009, 0x0000, 0x0028, 0xa1e0, 0x2f6e, 0x2c0d, 0xa18c, ++ 0x00ff, 0x2061, 0x0100, 0x619a, 0x080c, 0x8620, 0x7300, 0xc3dd, ++ 0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x781f, ++ 0x0003, 0x7803, 0x0001, 0x7807, 0x0040, 0x00fe, 0x00ee, 0x00ce, ++ 0x00de, 0x0005, 0x003e, 0x00ee, 0x00ce, 0x0cd0, 0x00de, 0x0005, ++ 0x00c6, 0x680c, 0xa065, 0x0138, 0x6807, 0x0004, 0x6826, 0x682b, ++ 0x0000, 0x080c, 0x7ff0, 0x00ce, 0x00de, 0x0005, 0x00f6, 0x00d6, ++ 0x2069, 0xc927, 0x6830, 0xa086, 0x0000, 0x1904, 0x7fcb, 0x2001, ++ 0xc60c, 0x200c, 0xd1bc, 0x1904, 0x7fe6, 0x6838, 0xa07d, 0x0904, ++ 0x7fcb, 0x2001, 0xc635, 0x2004, 0xa084, 0x0028, 0x11f8, 0x2001, ++ 0xc8e5, 0x2004, 0xa086, 0xaaaa, 0x01c8, 0x781c, 0xa086, 0x0009, ++ 0x11a8, 0x7808, 0xd0fc, 0x0190, 0x2001, 0xc928, 0x2004, 0xa005, ++ 0x1138, 0x2001, 0xc696, 0x200c, 0xc185, 0xc18c, 0x2102, 0x0030, ++ 0x2011, 0xc696, 0x2204, 0xc08d, 0x2012, 0x0428, 0x2f00, 0x6833, ++ 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, ++ 0x2091, 0x2400, 0x002e, 0x080c, 0x20ef, 0x11c0, 0x012e, 0xe000, ++ 0xe000, 0xe000, 0x6a3c, 0x2278, 0x781c, 0xa086, 0x0009, 0x1148, ++ 0x7808, 0xd0fc, 0x0118, 0x080c, 0x8969, 0x0028, 0x080c, 0x89e2, ++ 0x0010, 0x080c, 0x8a66, 0x00de, 0x00fe, 0x0005, 0x012e, 0xe000, ++ 0x6843, 0x0000, 0x781c, 0xa086, 0x0009, 0x0110, 0x7803, 0x0002, ++ 0x780c, 0xa015, 0x0140, 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000, ++ 0x683f, 0x0000, 0x0c40, 0x683a, 0x6836, 0x0cc0, 0xc1bc, 0x2102, ++ 0x0066, 0x2031, 0x0001, 0x080c, 0x5fa4, 0x006e, 0x0804, 0x7f7d, ++ 0x601c, 0xa084, 0x000f, 0x000b, 0x0005, 0x7ffe, 0x8003, 0x84c1, ++ 0x85dd, 0x8003, 0x84c1, 0x85dd, 0x7ffe, 0x8003, 0x080c, 0x7db1, ++ 0x080c, 0x7e94, 0x0005, 0x0156, 0x0136, 0x0146, 0x00c6, 0x00f6, ++ 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x1519, 0x6118, 0x2178, 0x79a0, ++ 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, 0x7900, ++ 0xd1f4, 0x0120, 0x7914, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, ++ 0x0028, 0xa1f8, 0x2f6e, 0x2f0d, 0xa18c, 0x00ff, 0x2c78, 0x2061, ++ 0x0100, 0x619a, 0xa08a, 0x0040, 0x1a04, 0x8077, 0x0033, 0x00fe, ++ 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, 0x8126, 0x8171, 0x819e, ++ 0x826b, 0x8299, 0x82a1, 0x82c7, 0x82d8, 0x82e9, 0x82f1, 0x8307, ++ 0x82f1, 0x8368, 0x82d8, 0x8389, 0x8391, 0x82e9, 0x8391, 0x83a2, ++ 0x8075, 0x8075, 0x8075, 0x8075, 0x8075, 0x8075, 0x8075, 0x8075, ++ 0x8075, 0x8075, 0x8075, 0x8d1a, 0x8d3f, 0x8d54, 0x8d77, 0x8d98, ++ 0x82c7, 0x8075, 0x82c7, 0x82f1, 0x8075, 0x819e, 0x826b, 0x8075, ++ 0x91e8, 0x82f1, 0x8075, 0x9208, 0x82f1, 0x8075, 0x82e9, 0x811f, ++ 0x808a, 0x8075, 0x922d, 0x92a2, 0x9379, 0x8075, 0x938a, 0x82c2, ++ 0x93a6, 0x8075, 0x8dad, 0x9401, 0x8075, 0x080c, 0x1519, 0x2100, ++ 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, 0x9458, ++ 0x9507, 0x8088, 0x80be, 0x80dc, 0x80f2, 0x8088, 0x82c7, 0x8088, ++ 0x080c, 0x1519, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x7810, ++ 0x2068, 0x20a3, 0x2414, 0x20a3, 0x0018, 0x20a3, 0x0800, 0x683c, ++ 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x6850, 0x20a2, 0x6854, 0x20a2, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x60c3, 0x0018, 0x080c, 0x8be2, 0x00de, 0x0005, 0x00d6, ++ 0x7818, 0x2068, 0x68a0, 0x2069, 0xc600, 0x6ad4, 0xd2ac, 0x1110, ++ 0xd0bc, 0x0110, 0xa085, 0x0001, 0x00de, 0x0005, 0x00d6, 0x20a1, ++ 0x020b, 0x080c, 0x83bf, 0x20a3, 0x0500, 0x20a3, 0x0000, 0x7810, ++ 0xa0e8, 0x000f, 0x6808, 0x20a2, 0x680c, 0x20a2, 0x6810, 0x20a2, ++ 0x6814, 0x20a2, 0x6818, 0x20a2, 0x681c, 0x20a2, 0x60c3, 0x0010, ++ 0x080c, 0x8be2, 0x00de, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, ++ 0x080c, 0x83bf, 0x20a3, 0x7800, 0x20a3, 0x0000, 0x7808, 0x8007, ++ 0x20a2, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x080c, 0x8be2, 0x014e, ++ 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x845b, ++ 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0xdf10, 0x20a3, 0x0034, ++ 0x2099, 0xc605, 0x20a9, 0x0004, 0x53a6, 0x2099, 0xc601, 0x20a9, ++ 0x0004, 0x53a6, 0x2099, 0xc90d, 0x20a9, 0x001a, 0x3304, 0x8007, ++ 0x20a2, 0x9398, 0x1f04, 0x810e, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x60c3, 0x004c, 0x080c, 0x8be2, 0x014e, 0x015e, 0x0005, 0x2001, ++ 0xc615, 0x2004, 0x609a, 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b, ++ 0x080c, 0x83bf, 0x20a3, 0x5200, 0x20a3, 0x0000, 0x00d6, 0x2069, ++ 0xc652, 0x6804, 0xd084, 0x0150, 0x6828, 0x20a3, 0x0000, 0x0016, ++ 0x080c, 0x29db, 0x21a2, 0x001e, 0x00de, 0x0028, 0x00de, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0xc605, 0x53a6, ++ 0x20a9, 0x0004, 0x2099, 0xc601, 0x53a6, 0x2001, 0xc635, 0x2004, ++ 0xd0ac, 0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f, ++ 0x0238, 0x2001, 0xc61c, 0x20a6, 0x2001, 0xc61d, 0x20a6, 0x0040, ++ 0x20a3, 0x0000, 0x2001, 0xc615, 0x2004, 0xa084, 0x00ff, 0x20a2, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x080c, 0x8be2, ++ 0x0005, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x0500, 0x20a3, ++ 0x0000, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1138, 0x7818, 0xa080, ++ 0x0028, 0x2004, 0xa082, 0x007f, 0x0238, 0x2001, 0xc61c, 0x20a6, ++ 0x2001, 0xc61d, 0x20a6, 0x0040, 0x20a3, 0x0000, 0x2001, 0xc615, ++ 0x2004, 0xa084, 0x00ff, 0x20a2, 0x20a9, 0x0004, 0x2099, 0xc605, ++ 0x53a6, 0x60c3, 0x0010, 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b, ++ 0x080c, 0x83bf, 0x00c6, 0x7818, 0x2060, 0x2001, 0x0000, 0x080c, ++ 0x5715, 0x00ce, 0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, ++ 0x1130, 0x20a3, 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0010, 0x20a3, ++ 0x0300, 0x20a3, 0x0000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa086, ++ 0x007e, 0x1904, 0x822d, 0x2001, 0xc635, 0x2004, 0xd0a4, 0x01c8, ++ 0x2099, 0xc8d5, 0x33a6, 0x9398, 0x20a3, 0x0000, 0x9398, 0x3304, ++ 0xa084, 0x2000, 0x20a2, 0x9398, 0x33a6, 0x9398, 0x20a3, 0x0000, ++ 0x9398, 0x2001, 0x2710, 0x20a2, 0x9398, 0x33a6, 0x9398, 0x33a6, ++ 0x00d0, 0x2099, 0xc8d5, 0x33a6, 0x9398, 0x33a6, 0x9398, 0x3304, ++ 0x080c, 0x5f22, 0x1118, 0xa084, 0x37ff, 0x0010, 0xa084, 0x3fff, ++ 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0xc605, 0x53a6, ++ 0x20a9, 0x0004, 0x2099, 0xc601, 0x53a6, 0x20a9, 0x0008, 0x20a3, ++ 0x0000, 0x1f04, 0x8207, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, ++ 0x820d, 0x2099, 0xc8dd, 0x3304, 0xc0dd, 0x20a2, 0x2001, 0xc672, ++ 0x2004, 0xd0e4, 0x0158, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x9398, ++ 0x9398, 0x9398, 0x33a6, 0x20a9, 0x0004, 0x0010, 0x20a9, 0x0007, ++ 0x20a3, 0x0000, 0x1f04, 0x8228, 0x0468, 0x2001, 0xc635, 0x2004, ++ 0xd0a4, 0x0140, 0x2001, 0xc8d6, 0x2004, 0x60e3, 0x0000, 0x080c, ++ 0x2a1c, 0x60e2, 0x2099, 0xc8d5, 0x20a9, 0x0008, 0x53a6, 0x20a9, ++ 0x0004, 0x2099, 0xc605, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xc601, ++ 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x824b, 0x20a9, ++ 0x0008, 0x20a3, 0x0000, 0x1f04, 0x8251, 0x2099, 0xc8dd, 0x20a9, ++ 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x825c, ++ 0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, 0x8262, 0x60c3, 0x0074, ++ 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, ++ 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x20a3, 0x2000, 0xa006, ++ 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x00f6, 0x2079, 0xc652, ++ 0x7904, 0x00fe, 0xd1ac, 0x1110, 0xa085, 0x0020, 0xd1a4, 0x0110, ++ 0xa085, 0x0010, 0xa085, 0x0002, 0x00d6, 0x0804, 0x834a, 0x20a2, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x8be2, ++ 0x0005, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x5000, 0x0804, ++ 0x81b9, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x2110, 0x20a3, ++ 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, ++ 0x8be2, 0x0005, 0x20a1, 0x020b, 0x080c, 0x8453, 0x0020, 0x20a1, ++ 0x020b, 0x080c, 0x845b, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x080c, 0x8be2, 0x0005, ++ 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3, 0x0000, ++ 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, 0x080c, 0x8be2, ++ 0x0005, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0200, 0x0804, ++ 0x81b9, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3, ++ 0x0000, 0x7828, 0xa005, 0x0110, 0x20a2, 0x0010, 0x20a3, 0x0003, ++ 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x8be2, 0x0005, 0x00d6, ++ 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0210, 0x20a3, 0x0014, ++ 0x20a3, 0x0800, 0x7818, 0x2068, 0x6894, 0xa086, 0x0014, 0x1198, ++ 0x699c, 0xa184, 0x0030, 0x0190, 0x6998, 0xa184, 0xc000, 0x1140, ++ 0xd1ec, 0x0118, 0x20a3, 0x2100, 0x0058, 0x20a3, 0x0100, 0x0040, ++ 0x20a3, 0x0400, 0x0028, 0x20a3, 0x0700, 0x0010, 0x700f, 0x0800, ++ 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x00f6, 0x2079, ++ 0xc652, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0xa085, 0x0020, 0xd1a4, ++ 0x0110, 0xa085, 0x0010, 0x2009, 0xc674, 0x210c, 0xd184, 0x1110, ++ 0xa085, 0x0002, 0x0026, 0x2009, 0xc672, 0x210c, 0xd1e4, 0x0130, ++ 0xc0c5, 0xa094, 0x0030, 0xa296, 0x0010, 0x0140, 0xd1ec, 0x0130, ++ 0xa094, 0x0030, 0xa296, 0x0010, 0x0108, 0xc0bd, 0x002e, 0x20a2, ++ 0x20a2, 0x20a2, 0x60c3, 0x0014, 0x080c, 0x8be2, 0x00de, 0x0005, ++ 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0210, 0x20a3, 0x0014, ++ 0x20a3, 0x0000, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x8be2, ++ 0x0005, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0200, 0x0804, ++ 0x812c, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3, ++ 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, 0x080c, ++ 0x8be2, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1, 0x020b, ++ 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x000b, ++ 0x20a3, 0x0000, 0x60c3, 0x0008, 0x080c, 0x8be2, 0x0005, 0x0026, ++ 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0038, 0x0026, ++ 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x20e1, 0x9080, ++ 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, ++ 0x11a0, 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffe, 0x20a3, 0x0000, ++ 0x2011, 0xc615, 0x2214, 0x2001, 0xc8e5, 0x2004, 0xa005, 0x0118, ++ 0x2011, 0xc61d, 0x2214, 0x22a2, 0x04d0, 0xa286, 0x007f, 0x1138, ++ 0x00d6, 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffd, 0x00c8, 0x2001, ++ 0xc635, 0x2004, 0xd0ac, 0x1110, 0xd2bc, 0x01c8, 0xa286, 0x0080, ++ 0x00d6, 0x1130, 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffc, 0x0040, ++ 0xa2e8, 0xc77b, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, ++ 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0080, 0x00d6, ++ 0xa2e8, 0xc77b, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, ++ 0x00de, 0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0xa485, ++ 0x0029, 0x20a2, 0x004e, 0x003e, 0x20a3, 0x0000, 0x080c, 0x8bd1, ++ 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x002e, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1, ++ 0x4000, 0x20a3, 0x02ff, 0x2011, 0xfffc, 0x22a2, 0x00d6, 0x2069, ++ 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x20a3, 0x2029, 0x20a3, ++ 0x0000, 0x08e0, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0xfc02, ++ 0x20a3, 0x0000, 0x0005, 0x0026, 0x0036, 0x0046, 0x2019, 0x3300, ++ 0x2021, 0x0800, 0x0038, 0x0026, 0x0036, 0x0046, 0x2019, 0x2300, ++ 0x2021, 0x0100, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, ++ 0x0028, 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1118, 0xa092, ++ 0x007e, 0x02d8, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa305, ++ 0x20a2, 0x6814, 0x20a2, 0x6810, 0xa005, 0x1140, 0x6814, 0xa005, ++ 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x0028, 0x2069, 0xc61c, ++ 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0080, 0x00d6, 0xa0e8, 0xc77b, ++ 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, ++ 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0xa485, 0x0098, 0x20a2, ++ 0x20a3, 0x0000, 0x004e, 0x003e, 0x080c, 0x8bd1, 0x22a2, 0x20a3, ++ 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x002e, 0x0005, 0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000, 0x7a08, ++ 0x22a2, 0x7810, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, ++ 0x0005, 0x00c6, 0x00f6, 0x6004, 0xa08a, 0x0085, 0x0a0c, 0x1519, ++ 0xa08a, 0x008c, 0x1a0c, 0x1519, 0x6118, 0x2178, 0x79a0, 0x2011, ++ 0xc635, 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, 0x7900, 0xd1f4, ++ 0x0120, 0x7914, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, ++ 0xa1f8, 0x2f6e, 0x2f0d, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, ++ 0x619a, 0xa082, 0x0085, 0x001b, 0x00fe, 0x00ce, 0x0005, 0x84f8, ++ 0x8502, 0x851d, 0x84f6, 0x84f6, 0x84f6, 0x84f8, 0x080c, 0x1519, ++ 0x0146, 0x20a1, 0x020b, 0x04a1, 0x60c3, 0x0000, 0x080c, 0x8be2, ++ 0x014e, 0x0005, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8569, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x7810, 0x20a2, 0x20a3, ++ 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, ++ 0x000c, 0x080c, 0x8be2, 0x014e, 0x0005, 0x0146, 0x20a1, 0x020b, ++ 0x080c, 0x85a3, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x60c3, 0x0004, 0x080c, 0x8be2, 0x014e, 0x0005, ++ 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, ++ 0x0288, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x8100, ++ 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, ++ 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, ++ 0x8100, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, ++ 0xc615, 0x2214, 0x22a2, 0x20a3, 0x0009, 0x20a3, 0x0000, 0x0804, ++ 0x8426, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, ++ 0x0028, 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1118, 0xa092, ++ 0x007e, 0x0288, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, ++ 0x8400, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, ++ 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, ++ 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, ++ 0x2011, 0xc615, 0x2214, 0x22a2, 0x2001, 0x0099, 0x20a2, 0x20a3, ++ 0x0000, 0x0804, 0x84b2, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, ++ 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, ++ 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, ++ 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, ++ 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, ++ 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x00de, ++ 0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0x2001, 0x0099, ++ 0x20a2, 0x20a3, 0x0000, 0x0804, 0x84b2, 0x00c6, 0x00f6, 0x2c78, ++ 0x7804, 0xa08a, 0x0040, 0x0a0c, 0x1519, 0xa08a, 0x0053, 0x1a0c, ++ 0x1519, 0x7918, 0x2160, 0x61a0, 0x2011, 0xc635, 0x2214, 0xd2ac, ++ 0x1110, 0xd1bc, 0x0150, 0x6100, 0xd1f4, 0x0120, 0x6114, 0xa18c, ++ 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, 0xa1e0, 0x2f6e, 0x2c0d, ++ 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0xa082, 0x0040, 0x001b, ++ 0x00fe, 0x00ce, 0x0005, 0x8620, 0x872c, 0x86c9, 0x88de, 0x861e, ++ 0x861e, 0x861e, 0x861e, 0x861e, 0x861e, 0x861e, 0x8f70, 0x8f80, ++ 0x8f90, 0x8fa0, 0x861e, 0x93b7, 0x861e, 0x8f5f, 0x080c, 0x1519, ++ 0x00d6, 0x0156, 0x0146, 0x780b, 0xffff, 0x20a1, 0x020b, 0x080c, ++ 0x8680, 0x7910, 0x2168, 0x6948, 0x7952, 0x21a2, 0xa016, 0x22a2, ++ 0x22a2, 0x22a2, 0x694c, 0xa184, 0x000f, 0x1118, 0x2001, 0x0005, ++ 0x0040, 0xd184, 0x0118, 0x2001, 0x0004, 0x0018, 0xa084, 0x0006, ++ 0x8004, 0x0016, 0x2008, 0x7858, 0xa084, 0x00ff, 0x8007, 0xa105, ++ 0x001e, 0x20a2, 0xd1ac, 0x0118, 0x20a3, 0x0002, 0x0048, 0xd1b4, ++ 0x0118, 0x20a3, 0x0001, 0x0020, 0x20a3, 0x0000, 0x2230, 0x0010, ++ 0x6a80, 0x6e7c, 0x20a9, 0x0008, 0x0136, 0xad88, 0x0017, 0x2198, ++ 0x20a1, 0x021b, 0x53a6, 0x013e, 0x20a1, 0x020b, 0x22a2, 0x26a2, ++ 0x60c3, 0x0020, 0x20e1, 0x9080, 0x6014, 0xa084, 0x0004, 0xa085, ++ 0x0009, 0x6016, 0x2001, 0xc943, 0x2003, 0x07d0, 0x2001, 0xc942, ++ 0x2003, 0x0009, 0x080c, 0x17f1, 0x014e, 0x015e, 0x00de, 0x0005, ++ 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014, ++ 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0x2019, 0xc635, 0x231c, 0xd3ac, 0x1110, 0xd0bc, 0x0188, ++ 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, ++ 0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, ++ 0x0088, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0600, ++ 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2009, 0xc615, ++ 0x210c, 0x21a2, 0x20a3, 0x0829, 0x20a3, 0x0000, 0x22a2, 0x20a3, ++ 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x20a1, 0x020b, 0x00c1, ++ 0x7810, 0x2068, 0x6860, 0x20a2, 0x685c, 0x20a2, 0x6880, 0x20a2, ++ 0x687c, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x60c3, ++ 0x000c, 0x080c, 0x8be2, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, ++ 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, ++ 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, ++ 0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, ++ 0x0088, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0500, ++ 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xc615, ++ 0x2214, 0x22a2, 0x20a3, 0x0889, 0x20a3, 0x0000, 0x080c, 0x8bd1, ++ 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x002e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, ++ 0x7810, 0xa0ec, 0xf000, 0x0168, 0xa06d, 0x080c, 0x56bf, 0x0148, ++ 0x684c, 0xa084, 0x2020, 0xa086, 0x2020, 0x1118, 0x7820, 0xc0cd, ++ 0x7822, 0x20a1, 0x020b, 0x080c, 0x8894, 0xa016, 0x22a2, 0x22a2, ++ 0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000, 0x1130, 0x7810, ++ 0xa084, 0x0700, 0x8007, 0x0043, 0x0010, 0xa006, 0x002b, 0x014e, ++ 0x013e, 0x015e, 0x00de, 0x0005, 0x8766, 0x87fb, 0x880b, 0x883d, ++ 0x8850, 0x886b, 0x8874, 0x8764, 0x080c, 0x1519, 0x0016, 0x0036, ++ 0x694c, 0xa18c, 0x0003, 0x0118, 0xa186, 0x0003, 0x1170, 0x6b78, ++ 0x7820, 0xd0cc, 0x0108, 0xc3e5, 0x23a2, 0x6868, 0x20a2, 0x6864, ++ 0x20a2, 0x003e, 0x001e, 0x0804, 0x8847, 0xa186, 0x0001, 0x190c, ++ 0x1519, 0x6b78, 0x7820, 0xd0cc, 0x0108, 0xc3e5, 0x23a2, 0x6868, ++ 0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874, 0x20a2, 0x22a2, 0x687c, ++ 0x20a2, 0x2009, 0x0018, 0xa384, 0x0300, 0x0904, 0x87f5, 0xd3c4, ++ 0x0110, 0x687c, 0xa108, 0xd3cc, 0x0110, 0x6874, 0xa108, 0x0156, ++ 0x20a9, 0x000d, 0xad80, 0x0020, 0x201c, 0x831f, 0x23a2, 0x8000, ++ 0x1f04, 0x87a4, 0x015e, 0x22a2, 0x22a2, 0x22a2, 0xa184, 0x0003, ++ 0x0904, 0x87f5, 0x20a1, 0x020b, 0x20e1, 0x9080, 0x20e1, 0x4000, ++ 0x0006, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xc635, 0x2214, ++ 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, ++ 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, ++ 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, ++ 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x00de, ++ 0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0x000e, 0x7b20, ++ 0xd3cc, 0x0118, 0x20a3, 0x0889, 0x0010, 0x20a3, 0x0898, 0x20a2, ++ 0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000, 0x61c2, 0x003e, 0x001e, ++ 0x080c, 0x8be2, 0x0005, 0x2011, 0x0008, 0x2001, 0xc60d, 0x2004, ++ 0xd0f4, 0x0110, 0x2011, 0x0028, 0x7820, 0xd0cc, 0x0108, 0xc2e5, ++ 0x22a2, 0xa016, 0x04d0, 0x2011, 0x0302, 0x0016, 0x0036, 0x7828, ++ 0x792c, 0xa11d, 0x0108, 0xc2dd, 0x7b20, 0xd3cc, 0x0108, 0xc2e5, ++ 0x22a2, 0x20a2, 0x21a2, 0x003e, 0x001e, 0xa016, 0x22a2, 0x20a3, ++ 0x0012, 0x22a2, 0x20a3, 0x0008, 0x22a2, 0x22a2, 0x22a2, 0x22a2, ++ 0x20a3, 0x7000, 0x20a3, 0x0500, 0x22a2, 0x20a3, 0x000a, 0x22a2, ++ 0x22a2, 0x20a3, 0x2500, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, ++ 0x60c3, 0x0032, 0x080c, 0x8be2, 0x0005, 0x2011, 0x0028, 0x7820, ++ 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, ++ 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0018, 0x080c, 0x8be2, 0x0005, ++ 0x2011, 0x0100, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, ++ 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0008, 0x22a2, ++ 0x7854, 0xa084, 0x00ff, 0x20a2, 0x22a2, 0x22a2, 0x60c3, 0x0020, ++ 0x080c, 0x8be2, 0x0005, 0x2011, 0x0008, 0x7820, 0xd0cc, 0x0108, ++ 0xc2e5, 0x22a2, 0xa016, 0x0888, 0x0036, 0x7b10, 0xa384, 0xff00, ++ 0x7812, 0xa384, 0x00ff, 0x8001, 0x1138, 0x7820, 0xd0cc, 0x0108, ++ 0xc2e5, 0x22a2, 0x003e, 0x0808, 0x0046, 0x2021, 0x0800, 0x0006, ++ 0x7820, 0xd0cc, 0x000e, 0x0108, 0xc4e5, 0x24a2, 0x004e, 0x22a2, ++ 0x20a2, 0x003e, 0x0804, 0x8847, 0x0026, 0x20e1, 0x9080, 0x20e1, ++ 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xc635, 0x2214, ++ 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, ++ 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, ++ 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, ++ 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x00de, ++ 0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0x7820, 0xd0cc, ++ 0x0118, 0x20a3, 0x0889, 0x0010, 0x20a3, 0x0898, 0x20a3, 0x0000, ++ 0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00d6, 0x0156, ++ 0x0136, 0x0146, 0x0016, 0x0036, 0x7810, 0xa084, 0x0700, 0x8007, ++ 0x003b, 0x003e, 0x001e, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, ++ 0x88f8, 0x88f8, 0x88fa, 0x88f8, 0x88f8, 0x88f8, 0x891c, 0x88f8, ++ 0x080c, 0x1519, 0x7910, 0xa18c, 0xf8ff, 0xa18d, 0x0600, 0x7912, ++ 0x20a1, 0x020b, 0x2009, 0x0003, 0x00f9, 0x00d6, 0x2069, 0xc652, ++ 0x6804, 0xd0bc, 0x0130, 0x682c, 0xa084, 0x00ff, 0x8007, 0x20a2, ++ 0x0010, 0x20a3, 0x3f00, 0x00de, 0x22a2, 0x22a2, 0x22a2, 0x60c3, ++ 0x0001, 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b, 0x2009, 0x0003, ++ 0x0019, 0x20a3, 0x7f00, 0x0c80, 0x0026, 0x20e1, 0x9080, 0x20e1, ++ 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xc635, 0x2214, ++ 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, ++ 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, ++ 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xc77b, ++ 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, 0x20a2, 0x00de, ++ 0x20a3, 0x0000, 0x2011, 0xc615, 0x2214, 0x22a2, 0x20a3, 0x0888, ++ 0xa18d, 0x0008, 0x21a2, 0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000, ++ 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, ++ 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0036, ++ 0x2061, 0x0100, 0x2071, 0xc600, 0x2009, 0xc615, 0x210c, 0x7818, ++ 0x2068, 0x2031, 0xc635, 0x2634, 0xa6b4, 0x0028, 0x0110, 0x7370, ++ 0x7474, 0x2500, 0x2031, 0xc635, 0x2634, 0xa6b4, 0x0028, 0x0140, ++ 0x2001, 0x04ff, 0x6062, 0x6067, 0xffff, 0x636a, 0x646e, 0x0050, ++ 0x2001, 0x00ff, 0xa085, 0x0400, 0x6062, 0x6067, 0xffff, 0x606b, ++ 0x0000, 0x616e, 0x68b8, 0x6073, 0x0530, 0x6077, 0x0008, 0x688c, ++ 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0xa085, 0x0020, 0x607a, ++ 0x68b4, 0x607f, 0x0000, 0x2d00, 0x6082, 0x6087, 0xffff, 0x7810, ++ 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, ++ 0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, ++ 0x0000, 0x2001, 0xc635, 0x2004, 0xa084, 0x0028, 0x0128, 0x609f, ++ 0x0000, 0x2001, 0x0092, 0x0048, 0x6028, 0xc0bd, 0x602a, 0x609f, ++ 0x00ff, 0x6027, 0xffff, 0x2001, 0x00b2, 0x6016, 0x2009, 0x07d0, ++ 0x080c, 0x7029, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, ++ 0x00ee, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, ++ 0x0036, 0x2061, 0x0100, 0x2071, 0xc600, 0x2009, 0xc615, 0x210c, ++ 0x7818, 0x2068, 0x68a0, 0x2028, 0x2031, 0xc635, 0x2634, 0xd6ac, ++ 0x1160, 0xa582, 0x007e, 0x1248, 0x2500, 0xd0bc, 0x1130, 0xa080, ++ 0x2f6e, 0x2015, 0xa294, 0x00ff, 0x0020, 0x6910, 0x6a14, 0x7370, ++ 0x7474, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1128, 0xa582, 0x007e, ++ 0x1210, 0xd5bc, 0x0138, 0xa185, 0x0400, 0x6062, 0x6266, 0x636a, ++ 0x646e, 0x0030, 0x6063, 0x0400, 0x6266, 0x606b, 0x0000, 0x616e, ++ 0x68b8, 0x6072, 0x6077, 0x0000, 0x6864, 0xd0a4, 0x0110, 0x6077, ++ 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0xa085, ++ 0x0020, 0x607a, 0x68b4, 0x607f, 0x0000, 0x2d00, 0x6082, 0x6087, ++ 0xffff, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, ++ 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, ++ 0x95d5, 0x60d7, 0x0000, 0xa582, 0x007e, 0x0210, 0x2011, 0x0000, ++ 0x629e, 0x00f6, 0x2079, 0x0140, 0x7803, 0x0000, 0x00fe, 0x2009, ++ 0x0092, 0x6116, 0x2009, 0x07d0, 0x080c, 0x7029, 0x003e, 0x004e, ++ 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x00e6, 0x00d6, ++ 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0xc600, ++ 0x7154, 0x7818, 0x2068, 0x68a0, 0x2028, 0x76d4, 0xd6ac, 0x1130, ++ 0xd0bc, 0x1120, 0x6910, 0x6a14, 0x7454, 0x0020, 0x6910, 0x6a14, ++ 0x7370, 0x7474, 0x781c, 0xa0be, 0x0006, 0x0904, 0x8b1c, 0xa0be, ++ 0x000a, 0x15e8, 0xa185, 0x0200, 0x6062, 0x6266, 0x636a, 0x646e, ++ 0x6073, 0x2029, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084, 0x00ff, ++ 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, ++ 0x6086, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, ++ 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, ++ 0x0000, 0x609f, 0x0000, 0x080c, 0x9452, 0x2009, 0x07d0, 0x60c4, ++ 0xa084, 0xfff0, 0xa005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x7029, ++ 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x70d4, ++ 0xd0ac, 0x1110, 0xd5bc, 0x0138, 0xa185, 0x0100, 0x6062, 0x6266, ++ 0x636a, 0x646e, 0x0038, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, ++ 0x0000, 0x646e, 0x6073, 0x0809, 0x6077, 0x0008, 0x688c, 0x8000, ++ 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, ++ 0x6082, 0x7808, 0x6086, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, ++ 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, ++ 0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, ++ 0x0120, 0x6a14, 0xa294, 0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, ++ 0x080c, 0x9452, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005, ++ 0x0110, 0x2009, 0x1b58, 0x080c, 0x7029, 0x003e, 0x004e, 0x005e, ++ 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7810, 0x2070, 0x704c, 0xa084, ++ 0x0003, 0xa086, 0x0002, 0x0904, 0x8b72, 0x2001, 0xc635, 0x2004, ++ 0xd0ac, 0x1110, 0xd5bc, 0x0138, 0xa185, 0x0100, 0x6062, 0x6266, ++ 0x636a, 0x646e, 0x0038, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, ++ 0x0000, 0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000, ++ 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x7834, 0x607e, 0x2f00, ++ 0x6086, 0x7808, 0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080, ++ 0x60c6, 0x707c, 0x60ca, 0x707c, 0x792c, 0xa108, 0x792e, 0x7080, ++ 0x7928, 0xa109, 0x792a, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, ++ 0x0000, 0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14, ++ 0xa294, 0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x080c, 0x944f, ++ 0x0804, 0x8b0a, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1110, 0xd5bc, ++ 0x0138, 0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0038, ++ 0xa185, 0x0700, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x080c, ++ 0x56bf, 0x0180, 0x00d6, 0x7810, 0xa06d, 0x684c, 0x00de, 0xa084, ++ 0x2020, 0xa086, 0x2020, 0x1130, 0x7820, 0xc0cd, 0x7822, 0x6073, ++ 0x0889, 0x0010, 0x6073, 0x0898, 0x6077, 0x0000, 0x688c, 0x8000, ++ 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, ++ 0x6086, 0x7808, 0x6082, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, ++ 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, ++ 0x0000, 0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14, ++ 0xa294, 0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x7820, 0xd0cc, ++ 0x0120, 0x080c, 0x9452, 0x0804, 0x8b0a, 0x080c, 0x944f, 0x0804, ++ 0x8b0a, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, ++ 0x2202, 0x8217, 0x0005, 0x00d6, 0x2069, 0xc927, 0x6843, 0x0001, ++ 0x00de, 0x0005, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, ++ 0x0019, 0x080c, 0x701b, 0x0005, 0x0006, 0x6014, 0xa084, 0x0004, ++ 0xa085, 0x0009, 0x6016, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, ++ 0x2061, 0x0100, 0x61a4, 0x60a7, 0x95f5, 0x6014, 0xa084, 0x0004, ++ 0xa085, 0x0008, 0x6016, 0x000e, 0xe000, 0xe000, 0xe000, 0xe000, ++ 0x61a6, 0x00ce, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, ++ 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x5f22, 0x1198, 0x2001, ++ 0xc943, 0x2004, 0xa005, 0x15b8, 0x0066, 0x2031, 0x0001, 0x080c, ++ 0x5fa4, 0x006e, 0x1118, 0x080c, 0x701b, 0x0468, 0x00c6, 0x2061, ++ 0xc927, 0x00d8, 0x6904, 0xa194, 0x4000, 0x0550, 0x0831, 0x6803, ++ 0x1000, 0x6803, 0x0000, 0x00c6, 0x2061, 0xc927, 0x6128, 0xa192, ++ 0x00c8, 0x1258, 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, ++ 0x080c, 0x701b, 0x080c, 0x8bec, 0x0070, 0x6124, 0xa1e5, 0x0000, ++ 0x0140, 0x080c, 0xc59b, 0x080c, 0x7024, 0x2009, 0x0014, 0x080c, ++ 0x9613, 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, ++ 0x2001, 0xc943, 0x2004, 0xa005, 0x1db0, 0x00c6, 0x2061, 0xc927, ++ 0x6128, 0xa192, 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, ++ 0x701b, 0x080c, 0x4e5b, 0x0c38, 0x00c6, 0x00d6, 0x00e6, 0x0016, ++ 0x0026, 0x080c, 0x7031, 0x2071, 0xc927, 0x713c, 0x81ff, 0x0904, ++ 0x8cc1, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x5f22, 0x1500, ++ 0x0036, 0x2019, 0x0002, 0x080c, 0x8e79, 0x003e, 0x713c, 0x2160, ++ 0x080c, 0xc59b, 0x2009, 0x004a, 0x621c, 0xa296, 0x0009, 0x1138, ++ 0x6110, 0xa188, 0x0012, 0x200b, 0x0006, 0x2009, 0x0104, 0x080c, ++ 0x9613, 0x0066, 0x2031, 0x0001, 0x080c, 0x5fa4, 0x006e, 0x0408, ++ 0x6904, 0xa194, 0x4000, 0x0518, 0x6803, 0x1000, 0x6803, 0x0000, ++ 0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 0x003e, 0x713c, 0x2160, ++ 0x080c, 0xc59b, 0x2009, 0x004a, 0x621c, 0xa296, 0x0009, 0x1138, ++ 0x6110, 0xa188, 0x0012, 0x200b, 0x0006, 0x2009, 0x0104, 0x080c, ++ 0x9613, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0c00, ++ 0x0026, 0x00e6, 0x2071, 0xc927, 0x7048, 0xd084, 0x01d8, 0x713c, ++ 0x81ff, 0x01c0, 0x2071, 0x0100, 0xa188, 0x0007, 0x2114, 0xa28e, ++ 0x0006, 0x1138, 0x7014, 0xa084, 0x0184, 0xa085, 0x0012, 0x7016, ++ 0x0048, 0xa28e, 0x0009, 0x0db0, 0x7014, 0xa084, 0x0184, 0xa085, ++ 0x0016, 0x7016, 0x00ee, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x00c6, ++ 0x0066, 0x0056, 0x0046, 0x0006, 0x0126, 0x2091, 0x8000, 0x6018, ++ 0x2068, 0x6ca0, 0x2071, 0xc927, 0x7018, 0x2068, 0x8dff, 0x0188, ++ 0x68a0, 0xa406, 0x0118, 0x6854, 0x2068, 0x0cc0, 0x6010, 0x2060, ++ 0x643c, 0x6540, 0x6648, 0x2d60, 0x080c, 0x54ae, 0x0110, 0xa085, ++ 0x0001, 0x012e, 0x000e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, ++ 0x00ee, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x1200, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x781c, 0xa086, 0x0004, 0x1110, ++ 0x6098, 0x0018, 0x2001, 0xc615, 0x2004, 0x20a2, 0x7834, 0x20a2, ++ 0x7838, 0x20a2, 0x20a9, 0x0010, 0xa006, 0x20a2, 0x1f04, 0x8d35, ++ 0x20a2, 0x20a2, 0x60c3, 0x002c, 0x080c, 0x8be2, 0x0005, 0x0156, ++ 0x0146, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x0f00, 0x20a3, ++ 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, 0x080c, ++ 0x8be2, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, ++ 0x080c, 0x845b, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a9, 0x0006, ++ 0x2011, 0xc640, 0x2019, 0xc641, 0x23a6, 0x22a6, 0xa398, 0x0002, ++ 0xa290, 0x0002, 0x1f04, 0x8d64, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x60c3, 0x001c, 0x080c, 0x8be2, 0x014e, 0x015e, 0x0005, 0x0156, ++ 0x0146, 0x0016, 0x0026, 0x20a1, 0x020b, 0x080c, 0x8434, 0x080c, ++ 0x844a, 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0015, 0x2098, ++ 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003, ++ 0x60c2, 0x080c, 0x8be2, 0x002e, 0x001e, 0x014e, 0x015e, 0x0005, ++ 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x6200, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, ++ 0x080c, 0x8be2, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x0016, ++ 0x0026, 0x20a1, 0x020b, 0x080c, 0x83bf, 0x7810, 0xa080, 0x0000, ++ 0x2004, 0xa080, 0x0017, 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, ++ 0x53a6, 0x8003, 0x60c2, 0x080c, 0x8be2, 0x002e, 0x001e, 0x014e, ++ 0x015e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, ++ 0x2071, 0xc927, 0x700c, 0x2060, 0x8cff, 0x0178, 0x080c, 0xae8f, ++ 0x1110, 0x080c, 0x9c09, 0x600c, 0x0006, 0x080c, 0xb056, 0x080c, ++ 0x95e3, 0x080c, 0x8fb7, 0x00ce, 0x0c78, 0x700f, 0x0000, 0x700b, ++ 0x0000, 0x012e, 0x000e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0156, ++ 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, 0x0016, 0x0006, 0x2091, ++ 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0xc927, 0x7024, ++ 0x2060, 0x8cff, 0x05a0, 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, ++ 0x7024, 0x2009, 0x0013, 0x080c, 0x9613, 0x20a9, 0x01f4, 0x6824, ++ 0xd094, 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, ++ 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0xd084, 0x0118, 0x6827, ++ 0x0001, 0x0010, 0x1f04, 0x8e0f, 0x7804, 0xa084, 0x1000, 0x0120, ++ 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x000e, 0x001e, 0x002e, ++ 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, ++ 0xc600, 0x2004, 0xa096, 0x0001, 0x0590, 0xa096, 0x0004, 0x0578, ++ 0x080c, 0x7024, 0x6814, 0xa084, 0x0001, 0x0110, 0x68a7, 0x95f5, ++ 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x4e18, 0x080c, 0x6fad, ++ 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0158, 0x6827, 0x0004, 0x7804, ++ 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, ++ 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x8e52, 0x7804, ++ 0xa084, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, 0x000e, ++ 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, ++ 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, ++ 0x0016, 0x0006, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, ++ 0x2071, 0xc927, 0x703c, 0x2060, 0x8cff, 0x0904, 0x8f04, 0xa386, ++ 0x0002, 0x1128, 0x6814, 0xa084, 0x0002, 0x0904, 0x8f04, 0x68af, ++ 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, 0x68c7, ++ 0x0000, 0x68cb, 0x0008, 0x080c, 0x7031, 0x080c, 0x22ee, 0x0046, ++ 0x2009, 0x017f, 0x200b, 0x00a5, 0x2021, 0x0169, 0x2404, 0xa084, ++ 0x000f, 0xa086, 0x0004, 0x1500, 0x68af, 0x95f5, 0x68c7, 0x0000, ++ 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0020, 0x2071, 0xc992, ++ 0x6814, 0xa084, 0x0184, 0xa085, 0x0012, 0x6816, 0x7803, 0x0008, ++ 0x7003, 0x0000, 0x00fe, 0x00ee, 0xa386, 0x0002, 0x1128, 0x7884, ++ 0xa005, 0x1110, 0x7887, 0x0001, 0x2001, 0xc8f8, 0x2004, 0x200a, ++ 0x004e, 0xa39d, 0x0000, 0x1140, 0x2009, 0x0049, 0x601c, 0xa086, ++ 0x0009, 0x0110, 0x080c, 0x9613, 0x20a9, 0x03e8, 0x6824, 0xd094, ++ 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, ++ 0x1000, 0x7803, 0x0000, 0x0078, 0xd08c, 0x0118, 0x6827, 0x0002, ++ 0x0010, 0x1f04, 0x8ee6, 0x7804, 0xa084, 0x1000, 0x0120, 0x7803, ++ 0x0100, 0x7803, 0x0000, 0x6824, 0x000e, 0x001e, 0x002e, 0x00ce, ++ 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, ++ 0x2091, 0x8000, 0x2069, 0xc927, 0x6a06, 0x012e, 0x00de, 0x0005, ++ 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0xc927, 0x6a32, 0x012e, ++ 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0006, 0x0126, ++ 0x2071, 0xc927, 0x7614, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, ++ 0x0538, 0x601c, 0xa206, 0x1500, 0x7014, 0xac36, 0x1110, 0x660c, ++ 0x7616, 0x7010, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, ++ 0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, ++ 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xae54, ++ 0x080c, 0x8fb7, 0x00ce, 0x08d8, 0x2c78, 0x600c, 0x2060, 0x08b8, ++ 0x012e, 0x000e, 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0156, ++ 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2, 0xa006, ++ 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x1000, 0x0804, 0x8faf, ++ 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2, ++ 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x4000, 0x0478, ++ 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2, ++ 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000, 0x00f8, ++ 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2, ++ 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, ++ 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8680, 0x7810, 0x20a2, ++ 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x0089, ++ 0x60c3, 0x0020, 0x080c, 0x8be2, 0x014e, 0x015e, 0x0005, 0x00e6, ++ 0x2071, 0xc927, 0x7020, 0xa005, 0x0110, 0x8001, 0x7022, 0x00ee, ++ 0x0005, 0x20a9, 0x0008, 0x20a2, 0x1f04, 0x8fc3, 0x20a2, 0x20a2, ++ 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, ++ 0x0126, 0x2091, 0x8000, 0x2071, 0xc927, 0x7614, 0x2660, 0x2678, ++ 0x2039, 0x0001, 0x87ff, 0x0904, 0x905f, 0x8cff, 0x0904, 0x905f, ++ 0x601c, 0xa086, 0x0006, 0x1904, 0x905a, 0x88ff, 0x0138, 0x2800, ++ 0xac06, 0x1904, 0x905a, 0x2039, 0x0000, 0x0050, 0x6018, 0xa206, ++ 0x1904, 0x905a, 0x85ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x905a, ++ 0x7024, 0xac06, 0x1598, 0x2069, 0x0100, 0x68c0, 0xa005, 0x1160, ++ 0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x7024, 0x080c, ++ 0x90e6, 0x7027, 0x0000, 0x0410, 0x080c, 0x7024, 0x6820, 0xd0b4, ++ 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, ++ 0x90e6, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, ++ 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, ++ 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7014, 0xac36, ++ 0x1110, 0x660c, 0x7616, 0x7010, 0xac36, 0x1140, 0x2c00, 0xaf36, ++ 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, ++ 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x89ff, 0x1158, ++ 0x600f, 0x0000, 0x6010, 0x2068, 0x080c, 0xac91, 0x0110, 0x080c, ++ 0xc141, 0x080c, 0xae54, 0x080c, 0x8fb7, 0x88ff, 0x1190, 0x00ce, ++ 0x0804, 0x8fda, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8fda, 0xa006, ++ 0x012e, 0x000e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, ++ 0x0005, 0x6017, 0x0000, 0x00ce, 0xa8c5, 0x0001, 0x0c88, 0x00f6, ++ 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, ++ 0x8000, 0x2071, 0xc927, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, ++ 0x90d6, 0x601c, 0xa086, 0x0006, 0x1904, 0x90d1, 0x87ff, 0x0128, ++ 0x2700, 0xac06, 0x1904, 0x90d1, 0x0048, 0x6018, 0xa206, 0x1904, ++ 0x90d1, 0x85ff, 0x0118, 0x6050, 0xa106, 0x15d8, 0x703c, 0xac06, ++ 0x1180, 0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 0x7033, 0x0000, ++ 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x704b, 0x0000, ++ 0x003e, 0x7038, 0xac36, 0x1110, 0x660c, 0x763a, 0x7034, 0xac36, ++ 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, ++ 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, ++ 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x080c, 0xac91, 0x0110, ++ 0x080c, 0xc141, 0x080c, 0xae54, 0x87ff, 0x1190, 0x00ce, 0x0804, ++ 0x907e, 0x2c78, 0x600c, 0x2060, 0x0804, 0x907e, 0xa006, 0x012e, ++ 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, ++ 0x6017, 0x0000, 0x00ce, 0xa7bd, 0x0001, 0x0c88, 0x00e6, 0x2071, ++ 0xc927, 0x2001, 0xc600, 0x2004, 0xa086, 0x0002, 0x1118, 0x7007, ++ 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, ++ 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, ++ 0xc927, 0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0518, 0x2200, ++ 0xac06, 0x11e0, 0x7038, 0xac36, 0x1110, 0x660c, 0x763a, 0x7034, ++ 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7036, 0x0010, ++ 0x7037, 0x0000, 0x660c, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, ++ 0x2678, 0x600f, 0x0000, 0xa085, 0x0001, 0x0020, 0x2c78, 0x600c, ++ 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00ee, ++ 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0006, ++ 0x0126, 0x2091, 0x8000, 0x2071, 0xc927, 0x760c, 0x2660, 0x2678, ++ 0x8cff, 0x0904, 0x91bc, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, ++ 0x1904, 0x91b7, 0x7024, 0xac06, 0x1508, 0x2069, 0x0100, 0x68c0, ++ 0xa005, 0x0904, 0x9193, 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, ++ 0x90e6, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, ++ 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, ++ 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x700c, 0xac36, ++ 0x1110, 0x660c, 0x760e, 0x7008, 0xac36, 0x1140, 0x2c00, 0xaf36, ++ 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000, 0x660c, 0x0066, ++ 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, ++ 0x080c, 0xae7e, 0x1158, 0x080c, 0x2e6c, 0x080c, 0xae8f, 0x11f0, ++ 0x080c, 0x9c09, 0x00d8, 0x080c, 0x90e6, 0x08c0, 0x080c, 0xae8f, ++ 0x1118, 0x080c, 0x9c09, 0x0090, 0x6010, 0x2068, 0x080c, 0xac91, ++ 0x0168, 0x601c, 0xa086, 0x0003, 0x11f8, 0x6837, 0x0103, 0x6b4a, ++ 0x6847, 0x0000, 0x080c, 0x580a, 0x080c, 0xae48, 0x080c, 0xb056, ++ 0x080c, 0xae54, 0x080c, 0x8fb7, 0x00ce, 0x0804, 0x9140, 0x2c78, ++ 0x600c, 0x2060, 0x0804, 0x9140, 0x012e, 0x000e, 0x006e, 0x00ce, ++ 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1d30, ++ 0x080c, 0xc141, 0x0c18, 0x0036, 0x0156, 0x0136, 0x0146, 0x3908, ++ 0xa006, 0xa190, 0x0020, 0x221c, 0xa39e, 0x2c61, 0x1118, 0x8210, ++ 0x8000, 0x0cc8, 0xa005, 0x0138, 0x20a9, 0x0020, 0x2198, 0xa110, ++ 0x22a0, 0x22c8, 0x53a3, 0x014e, 0x013e, 0x015e, 0x003e, 0x0005, ++ 0x00d6, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0200, 0x20a3, ++ 0x0014, 0x60c3, 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2099, ++ 0xc900, 0x20a9, 0x0004, 0x53a6, 0x20a3, 0x0004, 0x20a3, 0x7878, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x080c, 0x8be2, 0x00de, 0x0005, ++ 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0214, 0x20a3, 0x0018, ++ 0x20a3, 0x0800, 0x7810, 0xa084, 0xff00, 0x20a2, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7810, 0xa084, ++ 0x00ff, 0x20a2, 0x7828, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x60c3, 0x0018, 0x080c, 0x8be2, 0x0005, 0x00d6, 0x0016, 0x2f68, ++ 0x2009, 0x0035, 0x080c, 0xb141, 0x1904, 0x929b, 0x20a1, 0x020b, ++ 0x080c, 0x83bf, 0x20a3, 0x1300, 0x20a3, 0x0000, 0x7828, 0x2068, ++ 0x681c, 0xa086, 0x0003, 0x0580, 0x7818, 0xa080, 0x0028, 0x2014, ++ 0x2001, 0xc635, 0x2004, 0xd0ac, 0x11d0, 0xa286, 0x007e, 0x1128, ++ 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x04b8, 0xa286, 0x007f, 0x1128, ++ 0x20a3, 0x00ff, 0x20a3, 0xfffd, 0x0478, 0xd2bc, 0x0180, 0xa286, ++ 0x0080, 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffc, 0x0428, 0xa2e8, ++ 0xc77b, 0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x00e8, 0x20a3, ++ 0x0000, 0x6098, 0x20a2, 0x00c0, 0x2001, 0xc635, 0x2004, 0xd0ac, ++ 0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007e, 0x0240, ++ 0x00d6, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0020, ++ 0x20a3, 0x0000, 0x6034, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c, 0x080c, 0x8be2, ++ 0x001e, 0x00de, 0x0005, 0x7817, 0x0001, 0x7803, 0x0006, 0x001e, ++ 0x00de, 0x0005, 0x00d6, 0x0026, 0x7928, 0x2168, 0x691c, 0xa186, ++ 0x0006, 0x01c0, 0xa186, 0x0003, 0x0904, 0x9311, 0xa186, 0x0005, ++ 0x0904, 0x92fa, 0xa186, 0x0004, 0x05b8, 0xa186, 0x0008, 0x0904, ++ 0x9302, 0x7807, 0x0037, 0x7813, 0x1700, 0x080c, 0x9379, 0x002e, ++ 0x00de, 0x0005, 0x080c, 0x9335, 0x2009, 0x4000, 0x6800, 0x0002, ++ 0x92db, 0x92e6, 0x92dd, 0x92e6, 0x92e2, 0x92db, 0x92db, 0x92e6, ++ 0x92e6, 0x92e6, 0x92e6, 0x92db, 0x92db, 0x92db, 0x92db, 0x92db, ++ 0x92e6, 0x92db, 0x92e6, 0x080c, 0x1519, 0x6820, 0xd0e4, 0x0110, ++ 0xd0cc, 0x0110, 0xa00e, 0x0010, 0x2009, 0x2000, 0x6828, 0x20a2, ++ 0x682c, 0x20a2, 0x0804, 0x932b, 0x080c, 0x9335, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x2009, 0x4000, 0x6a00, 0xa286, 0x0002, 0x1108, ++ 0xa00e, 0x0488, 0x04d1, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, ++ 0x4000, 0x0448, 0x0491, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, ++ 0x4000, 0xa286, 0x0005, 0x0118, 0xa286, 0x0002, 0x1108, 0xa00e, ++ 0x00d0, 0x0419, 0x6810, 0x2068, 0x697c, 0x6810, 0xa112, 0x6980, ++ 0x6814, 0xa103, 0x20a2, 0x22a2, 0x7928, 0xa180, 0x0000, 0x2004, ++ 0xa08e, 0x0002, 0x0130, 0xa08e, 0x0004, 0x0118, 0x2009, 0x4000, ++ 0x0010, 0x2009, 0x0000, 0x21a2, 0x20a3, 0x0000, 0x60c3, 0x0018, ++ 0x080c, 0x8be2, 0x002e, 0x00de, 0x0005, 0x0036, 0x0046, 0x0056, ++ 0x0066, 0x20a1, 0x020b, 0x080c, 0x845b, 0xa006, 0x20a3, 0x0200, ++ 0x20a2, 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, ++ 0x0268, 0x00d6, 0x2069, 0xc61c, 0x2d2c, 0x8d68, 0x2d34, 0xa0e8, ++ 0xc77b, 0x2d6c, 0x6b10, 0x6c14, 0x00de, 0x0030, 0x2019, 0x0000, ++ 0x6498, 0x2029, 0x0000, 0x6634, 0x7828, 0xa080, 0x0007, 0x2004, ++ 0xa086, 0x0003, 0x1128, 0x25a2, 0x26a2, 0x23a2, 0x24a2, 0x0020, ++ 0x23a2, 0x24a2, 0x25a2, 0x26a2, 0x006e, 0x005e, 0x004e, 0x003e, ++ 0x0005, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3, ++ 0x0000, 0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, ++ 0x8be2, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83b7, 0x20a3, 0x1400, ++ 0x20a3, 0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x7828, 0x20a2, ++ 0x782c, 0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x20a3, ++ 0x0000, 0x60c3, 0x0010, 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b, ++ 0x080c, 0x8453, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0x20a2, ++ 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x8be2, 0x0005, 0x0146, ++ 0x20a1, 0x020b, 0x0031, 0x60c3, 0x0000, 0x080c, 0x8be2, 0x014e, ++ 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, ++ 0x2004, 0x2011, 0xc635, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, ++ 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0300, 0x20a2, ++ 0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, 0x2da6, 0x00de, ++ 0x0078, 0x00d6, 0xa0e8, 0xc77b, 0x2d6c, 0x6810, 0xa085, 0x0300, ++ 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x6234, 0x22a2, ++ 0x20a3, 0x0819, 0x20a3, 0x0000, 0x080c, 0x8bd1, 0x22a2, 0x20a3, ++ 0x0000, 0x2fa2, 0x7a08, 0x22a2, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x0005, 0x20a1, 0x020b, 0x0079, 0x7910, 0x21a2, 0x20a3, 0x0000, ++ 0x60c3, 0x0000, 0x20e1, 0x9080, 0x60a7, 0x9575, 0x080c, 0x8bec, ++ 0x080c, 0x701b, 0x0005, 0x0156, 0x0136, 0x0036, 0x00d6, 0x00e6, ++ 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7854, 0x2068, 0xadf0, 0x000f, ++ 0x7210, 0xa296, 0x00c0, 0xa294, 0xfffd, 0x7212, 0x7214, 0xa294, ++ 0x0300, 0x7216, 0x7100, 0xa194, 0x00ff, 0x7308, 0xa384, 0x00ff, ++ 0xa08d, 0xc200, 0x7102, 0xa384, 0xff00, 0xa215, 0x720a, 0x7004, ++ 0x720c, 0x700e, 0x7206, 0x20a9, 0x000a, 0x2e98, 0x53a6, 0x60a3, ++ 0x0035, 0x6a38, 0xa294, 0x7000, 0xa286, 0x3000, 0x0110, 0x60a3, ++ 0x0037, 0x00ee, 0x00de, 0x003e, 0x013e, 0x015e, 0x0005, 0x2009, ++ 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036, 0x6116, 0x0005, ++ 0x609b, 0x0000, 0x20a1, 0x020b, 0x20e1, 0x9080, 0x20e1, 0x4000, ++ 0x20a3, 0x22ff, 0x20a3, 0xffff, 0x00d6, 0x2069, 0xc61c, 0x2da6, ++ 0x8d68, 0x2da6, 0x00de, 0x20a3, 0x0138, 0x20a3, 0x0000, 0x0026, ++ 0x080c, 0x8bd1, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, ++ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x20a3, 0x5400, 0x20a3, ++ 0x0000, 0x080c, 0x768f, 0x11b8, 0x0016, 0x7810, 0xa080, 0x000d, ++ 0x20a9, 0x0014, 0x200c, 0x810f, 0x21a2, 0x8000, 0x1f04, 0x948a, ++ 0x20a9, 0x0012, 0x2001, 0x0000, 0x20a3, 0x0000, 0x1f04, 0x9494, ++ 0x001e, 0x0804, 0x9502, 0x7810, 0x0016, 0x00c6, 0x00d6, 0x7810, ++ 0x2068, 0x2061, 0xc600, 0x6070, 0xa084, 0x00ff, 0x6968, 0x810f, ++ 0xa18c, 0xff00, 0xa105, 0x20a2, 0x6074, 0x20a2, 0x6968, 0xa18c, ++ 0xff00, 0x21a2, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2009, 0xc605, ++ 0x2104, 0x20a2, 0x8108, 0x1f04, 0x94b8, 0x20a9, 0x0004, 0x2009, ++ 0xc601, 0x2104, 0x20a2, 0x8108, 0x1f04, 0x94c1, 0x20a9, 0x0004, ++ 0x2d08, 0xa188, 0x001d, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, ++ 0x94cb, 0x20a9, 0x0004, 0x2d08, 0xa188, 0x0021, 0x2104, 0x8007, ++ 0x20a2, 0x8108, 0x1f04, 0x94d6, 0x080c, 0x7694, 0x1138, 0x20a9, ++ 0x0008, 0x20a3, 0x0000, 0x1f04, 0x94e1, 0x0050, 0x20a9, 0x0008, ++ 0x2009, 0xc69a, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, 0x94ea, ++ 0x20a9, 0x0008, 0x2d08, 0xa188, 0x0025, 0x2104, 0x8007, 0x20a2, ++ 0x8108, 0x1f04, 0x94f5, 0x00de, 0x00ce, 0x001e, 0x20a3, 0x0000, ++ 0x20a3, 0x0000, 0x60c3, 0x004c, 0x080c, 0x8be2, 0x0005, 0x20a1, ++ 0x020b, 0x080c, 0x83bf, 0x20a3, 0x5500, 0x20a3, 0x0000, 0x7810, ++ 0x0016, 0x00c6, 0x00d6, 0x7810, 0x2068, 0x686c, 0xa084, 0x00ff, ++ 0x6968, 0x810f, 0xa18c, 0xff00, 0xa105, 0x20a2, 0x696c, 0xa18c, ++ 0xff00, 0x6870, 0xa084, 0x00ff, 0xa105, 0x20a2, 0x6968, 0xa18c, ++ 0xff00, 0x2061, 0xc600, 0x6070, 0xa084, 0x00ff, 0xa10d, 0x21a2, ++ 0x6174, 0x21a2, 0x20a9, 0x0004, 0x2d08, 0xa188, 0x001d, 0x2104, ++ 0x8007, 0x20a2, 0x8108, 0x1f04, 0x9537, 0x20a9, 0x0004, 0x2d08, ++ 0xa188, 0x0021, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, 0x9542, ++ 0x20a9, 0x0004, 0x2009, 0xc605, 0x2104, 0x20a2, 0x8108, 0x1f04, ++ 0x954c, 0x20a9, 0x0004, 0x2009, 0xc601, 0x2104, 0x20a2, 0x8108, ++ 0x1f04, 0x9555, 0x20a9, 0x0008, 0x2d08, 0xa188, 0x0025, 0x2104, ++ 0x8007, 0x20a2, 0x8108, 0x1f04, 0x955f, 0x080c, 0x7694, 0x1138, ++ 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x956a, 0x0050, 0x20a9, ++ 0x0008, 0x2009, 0xc69a, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, ++ 0x9573, 0x00de, 0x00ce, 0x001e, 0x20a3, 0x0000, 0x20a3, 0x0000, ++ 0x60c3, 0x004c, 0x080c, 0x8be2, 0x0005, 0x2061, 0xce00, 0x2a70, ++ 0x7068, 0x704a, 0x704f, 0xce00, 0x0005, 0x00e6, 0x0126, 0x2071, ++ 0xc600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0010, 0x0608, 0x704c, ++ 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0, 0x0018, 0x705c, ++ 0xac02, 0x1208, 0x0cb0, 0x2061, 0xce00, 0x0c98, 0x6003, 0x0008, ++ 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502, 0x1230, 0x754e, ++ 0xa085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x704f, 0xce00, 0x0cc0, ++ 0xa006, 0x0cc0, 0x00e6, 0x2071, 0xc600, 0x7548, 0xa582, 0x0010, ++ 0x0600, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0, ++ 0x0018, 0x705c, 0xac02, 0x1208, 0x0cb0, 0x2061, 0xce00, 0x0c98, ++ 0x6003, 0x0008, 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502, ++ 0x1228, 0x754e, 0xa085, 0x0001, 0x00ee, 0x0005, 0x704f, 0xce00, ++ 0x0cc8, 0xa006, 0x0cc8, 0xac82, 0xce00, 0x0a0c, 0x1519, 0x2001, ++ 0xc617, 0x2004, 0xac02, 0x1a0c, 0x1519, 0xa006, 0x6006, 0x600a, ++ 0x600e, 0x6012, 0x6016, 0x601a, 0x601f, 0x0000, 0x6003, 0x0000, ++ 0x6052, 0x6056, 0x6022, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, ++ 0x603a, 0x603e, 0x6026, 0x2061, 0xc600, 0x6048, 0x8000, 0x604a, ++ 0xa086, 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0x7e94, 0x012e, 0x0cc0, 0x601c, 0xa084, 0x000f, 0x0002, 0x9622, ++ 0x9631, 0x964c, 0x9667, 0xb189, 0xb1a4, 0xb1bf, 0x9622, 0x9631, ++ 0x7699, 0x9682, 0xa186, 0x0013, 0x1128, 0x080c, 0x7db1, 0x080c, ++ 0x7e94, 0x0005, 0xa18e, 0x0047, 0x1118, 0xa016, 0x080c, 0x1870, ++ 0x0005, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, ++ 0x006e, 0x0005, 0x964a, 0x9a78, 0x9c43, 0x964a, 0x9cc0, 0x9740, ++ 0x964a, 0x964a, 0x9a0a, 0xa126, 0x964a, 0x964a, 0x964a, 0x964a, ++ 0x964a, 0x964a, 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, 0x0010, ++ 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, 0x9665, 0xa759, 0x9665, ++ 0x9665, 0x9665, 0x9665, 0x9665, 0x9665, 0xa704, 0xa8c5, 0x9665, ++ 0xa786, 0xa7fd, 0xa786, 0xa7fd, 0x9665, 0x080c, 0x1519, 0x0066, ++ 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, ++ 0x9680, 0xa167, 0xa231, 0xa36c, 0xa4c8, 0x9680, 0x9680, 0x9680, ++ 0xa141, 0xa6b4, 0xa6b7, 0x9680, 0x9680, 0x9680, 0x9680, 0xa6e1, ++ 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, ++ 0x0013, 0x006e, 0x0005, 0x969b, 0x969b, 0x969b, 0x96c9, 0x9716, ++ 0x969b, 0x969b, 0x969b, 0x969d, 0x969b, 0x969b, 0x969b, 0x969b, ++ 0x969b, 0x969b, 0x969b, 0x080c, 0x1519, 0xa186, 0x0003, 0x190c, ++ 0x1519, 0x00d6, 0x6003, 0x0003, 0x6106, 0x6010, 0x2068, 0x684f, ++ 0x0040, 0x687c, 0x680a, 0x6880, 0x680e, 0x6813, 0x0000, 0x6817, ++ 0x0000, 0x6854, 0xa092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, ++ 0x8013, 0x8213, 0xa210, 0x6216, 0x00de, 0x2c10, 0x080c, 0x2068, ++ 0x080c, 0x79fc, 0x0126, 0x2091, 0x8000, 0x080c, 0x7f6e, 0x012e, ++ 0x0005, 0xa182, 0x0047, 0x0002, 0x96d5, 0x96d5, 0x96d7, 0x96f0, ++ 0x96d5, 0x96d5, 0x96d5, 0x96d5, 0x9702, 0x080c, 0x1519, 0x00d6, ++ 0x0016, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6003, 0x0004, 0x6110, ++ 0x2168, 0x684f, 0x0020, 0x685c, 0x685a, 0x6874, 0x687e, 0x6878, ++ 0x6882, 0x6897, 0x0000, 0x689b, 0x0000, 0x001e, 0x00de, 0x0005, ++ 0x080c, 0x7e47, 0x00d6, 0x6110, 0x2168, 0x080c, 0xac91, 0x0120, ++ 0x684b, 0x0006, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, 0x080c, ++ 0x7f6e, 0x0005, 0x080c, 0x7e47, 0x080c, 0x2e46, 0x00d6, 0x6110, ++ 0x2168, 0x080c, 0xac91, 0x0120, 0x684b, 0x0029, 0x080c, 0x580a, ++ 0x00de, 0x080c, 0x95e3, 0x080c, 0x7f6e, 0x0005, 0xa182, 0x0047, ++ 0x0002, 0x9724, 0x9733, 0x9722, 0x9722, 0x9722, 0x9722, 0x9722, ++ 0x9722, 0x9722, 0x080c, 0x1519, 0x00d6, 0x6010, 0x2068, 0x684c, ++ 0xc0f4, 0x684e, 0x00de, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, ++ 0x080c, 0x1870, 0x0005, 0x00d6, 0x6110, 0x2168, 0x684b, 0x0000, ++ 0x6853, 0x0000, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, 0x0005, ++ 0xa1b6, 0x0015, 0x1118, 0x080c, 0x95e3, 0x0030, 0xa1b6, 0x0016, ++ 0x190c, 0x1519, 0x080c, 0x95e3, 0x0005, 0x20a9, 0x000e, 0x2e98, ++ 0x6010, 0x20a0, 0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420, 0x9398, ++ 0x94a0, 0x3318, 0x3428, 0x222e, 0x2326, 0xa290, 0x0002, 0xa5a8, ++ 0x0002, 0xa398, 0x0002, 0xa4a0, 0x0002, 0x1f04, 0x975b, 0x00e6, ++ 0x080c, 0xac91, 0x0130, 0x6010, 0x2070, 0x7007, 0x0000, 0x7037, ++ 0x0103, 0x00ee, 0x080c, 0x95e3, 0x0005, 0x00d6, 0x0036, 0x7330, ++ 0xa386, 0x0200, 0x1130, 0x6018, 0x2068, 0x6813, 0x00ff, 0x6817, ++ 0xfffd, 0x6010, 0xa005, 0x0130, 0x2068, 0x6807, 0x0000, 0x6837, ++ 0x0103, 0x6b32, 0x080c, 0x95e3, 0x003e, 0x00de, 0x0005, 0x0016, ++ 0x20a9, 0x002a, 0xae80, 0x000c, 0x2098, 0x6010, 0xa080, 0x0002, ++ 0x20a0, 0x53a3, 0x20a9, 0x002a, 0x6010, 0xa080, 0x0001, 0x2004, ++ 0xa080, 0x0002, 0x20a0, 0x53a3, 0x00e6, 0x6010, 0x2004, 0x2070, ++ 0x7037, 0x0103, 0x00ee, 0x080c, 0x95e3, 0x001e, 0x0005, 0x0016, ++ 0x2009, 0x0000, 0x7030, 0xa086, 0x0100, 0x0140, 0x7038, 0xa084, ++ 0x00ff, 0x800c, 0x703c, 0xa084, 0x00ff, 0x8004, 0xa080, 0x0004, ++ 0xa108, 0x21a8, 0xae80, 0x000c, 0x2098, 0x6010, 0xa080, 0x0002, ++ 0x20a0, 0x080c, 0x4ecb, 0x00e6, 0x080c, 0xac91, 0x0140, 0x6010, ++ 0x2070, 0x7007, 0x0000, 0x7034, 0x70b2, 0x7037, 0x0103, 0x00ee, ++ 0x080c, 0x95e3, 0x001e, 0x0005, 0x0016, 0x2009, 0x0000, 0x7030, ++ 0xa086, 0x0200, 0x0110, 0x2009, 0x0001, 0x00d6, 0x6010, 0xa06d, ++ 0x090c, 0x1519, 0x694a, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, ++ 0x001e, 0x0005, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2c68, 0x0016, ++ 0x2009, 0x0035, 0x080c, 0xb141, 0x001e, 0x1168, 0x0026, 0x6228, ++ 0x2268, 0x002e, 0x2071, 0xcc8c, 0x6b1c, 0xa386, 0x0003, 0x0130, ++ 0xa386, 0x0006, 0x0128, 0x080c, 0x95e3, 0x0020, 0x0031, 0x0010, ++ 0x080c, 0x98d3, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x6810, 0x2078, ++ 0xa186, 0x0015, 0x0904, 0x98ba, 0xa18e, 0x0016, 0x1904, 0x98d1, ++ 0x700c, 0xa08c, 0xff00, 0xa186, 0x1700, 0x0120, 0xa186, 0x0300, ++ 0x1904, 0x9899, 0x8fff, 0x1138, 0x6800, 0xa086, 0x000f, 0x0904, ++ 0x987d, 0x0804, 0x98cf, 0x6808, 0xa086, 0xffff, 0x1904, 0x98bc, ++ 0x784c, 0xa084, 0x0060, 0xa086, 0x0020, 0x1150, 0x797c, 0x7810, ++ 0xa106, 0x1904, 0x98bc, 0x7980, 0x7814, 0xa106, 0x1904, 0x98bc, ++ 0x080c, 0xae48, 0x6858, 0x7852, 0x784c, 0xc0dc, 0xc0f4, 0xc0d4, ++ 0x784e, 0x0026, 0xa00e, 0x6a14, 0x2001, 0x000a, 0x080c, 0x783f, ++ 0x7854, 0xa20a, 0x0208, 0x8011, 0x7a56, 0x82ff, 0x002e, 0x1138, ++ 0x00c6, 0x2d60, 0x080c, 0xaa40, 0x00ce, 0x0804, 0x98cf, 0x00c6, ++ 0x00d6, 0x2f68, 0x6838, 0xd0fc, 0x1118, 0x080c, 0x4fa6, 0x0010, ++ 0x080c, 0x51dd, 0x00de, 0x00ce, 0x1904, 0x98bc, 0x00c6, 0x2d60, ++ 0x080c, 0x95e3, 0x00ce, 0x0804, 0x98cf, 0x00c6, 0x080c, 0xaf0d, ++ 0x0190, 0x6013, 0x0000, 0x6818, 0x601a, 0x080c, 0xb05e, 0x601f, ++ 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0x95e3, 0x00ce, 0x080c, ++ 0x9613, 0x00ce, 0x04e0, 0x2001, 0xc8ff, 0x2004, 0x683e, 0x00ce, ++ 0x04b0, 0x7008, 0xa086, 0x000b, 0x11a0, 0x6018, 0x200c, 0xc1bc, ++ 0x2102, 0x00c6, 0x2d60, 0x7853, 0x0003, 0x6007, 0x0085, 0x6003, ++ 0x000b, 0x601f, 0x0002, 0x080c, 0x7999, 0x080c, 0x7e94, 0x00ce, ++ 0x00f0, 0x700c, 0xa086, 0x2a00, 0x1138, 0x2001, 0xc8ff, 0x2004, ++ 0x683e, 0x00a8, 0x0481, 0x00a8, 0x8fff, 0x090c, 0x1519, 0x00c6, ++ 0x00d6, 0x2d60, 0x2f68, 0x6837, 0x0103, 0x684b, 0x0003, 0x080c, ++ 0xa934, 0x080c, 0xae48, 0x080c, 0xae54, 0x00de, 0x00ce, 0x080c, ++ 0x95e3, 0x00fe, 0x0005, 0xa186, 0x0015, 0x1128, 0x2001, 0xc8ff, ++ 0x2004, 0x683e, 0x0068, 0xa18e, 0x0016, 0x1160, 0x00c6, 0x2d00, ++ 0x2060, 0x080c, 0xc3e2, 0x080c, 0x7103, 0x080c, 0x95e3, 0x00ce, ++ 0x080c, 0x95e3, 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0x7c80, ++ 0x7b7c, 0xd2f4, 0x0130, 0x2001, 0xc8ff, 0x2004, 0x683e, 0x0804, ++ 0x994d, 0x00c6, 0x2d60, 0x080c, 0xa954, 0x00ce, 0x6804, 0xa086, ++ 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, ++ 0x0050, 0x080c, 0x7999, 0x080c, 0x7e94, 0x00ce, 0x04f0, 0x6800, ++ 0xa086, 0x000f, 0x01c8, 0x8fff, 0x090c, 0x1519, 0x6820, 0xd0dc, ++ 0x1198, 0x6800, 0xa086, 0x0004, 0x1198, 0x784c, 0xd0ac, 0x0180, ++ 0x784c, 0xc0dc, 0xc0f4, 0x784e, 0x7850, 0xc0f4, 0xc0fc, 0x7852, ++ 0x2001, 0x0001, 0x682e, 0x00e0, 0x2001, 0x0007, 0x682e, 0x00c0, ++ 0x784c, 0xd0b4, 0x1130, 0xd0ac, 0x0db8, 0x784c, 0xd0f4, 0x1da0, ++ 0x0c38, 0xd2ec, 0x1d88, 0x7024, 0xa306, 0x1118, 0x7020, 0xa406, ++ 0x0d58, 0x7020, 0x6836, 0x7024, 0x683a, 0x2001, 0x0005, 0x682e, ++ 0x080c, 0xaf9a, 0x080c, 0x7e94, 0x0010, 0x080c, 0x95e3, 0x004e, ++ 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x6034, 0x2068, ++ 0x6a1c, 0xa286, 0x0007, 0x0904, 0x99b1, 0xa286, 0x0002, 0x0904, ++ 0x99b1, 0xa286, 0x0000, 0x0904, 0x99b1, 0x6808, 0x6338, 0xa306, ++ 0x1904, 0x99b1, 0x2071, 0xcc8c, 0xa186, 0x0015, 0x05e0, 0xa18e, ++ 0x0016, 0x1190, 0x6030, 0xa084, 0x00ff, 0xa086, 0x0001, 0x1160, ++ 0x700c, 0xa086, 0x2a00, 0x1140, 0x6034, 0xa080, 0x0008, 0x200c, ++ 0xc1dd, 0xc1f5, 0x2102, 0x0438, 0x00c6, 0x6034, 0x2060, 0x6104, ++ 0xa186, 0x004b, 0x01a0, 0xa186, 0x004c, 0x0188, 0xa186, 0x004d, ++ 0x0170, 0xa186, 0x004e, 0x0158, 0xa186, 0x0052, 0x0140, 0x6010, ++ 0x2068, 0x080c, 0xac91, 0x090c, 0x1519, 0x6853, 0x0003, 0x6007, ++ 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x7999, 0x080c, ++ 0x7e94, 0x00ce, 0x0030, 0x6034, 0x2070, 0x2001, 0xc8ff, 0x2004, ++ 0x703e, 0x080c, 0x95e3, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00d6, ++ 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0, 0x53a3, 0xa1b6, 0x0015, ++ 0x1558, 0x6018, 0x2068, 0x0156, 0x0036, 0x0026, 0xae90, 0x000c, ++ 0xa290, 0x0004, 0x20a9, 0x0004, 0xad98, 0x000a, 0x080c, 0xa103, ++ 0x002e, 0x003e, 0x015e, 0x11d8, 0x0156, 0x0036, 0x0026, 0xae90, ++ 0x000c, 0xa290, 0x0008, 0x20a9, 0x0004, 0xad98, 0x0006, 0x080c, ++ 0xa103, 0x002e, 0x003e, 0x015e, 0x1150, 0x7038, 0x680a, 0x703c, ++ 0x680e, 0x6800, 0xc08d, 0x6802, 0x00de, 0x0804, 0x9767, 0x080c, ++ 0x2e46, 0x00c6, 0x080c, 0x958d, 0x2f00, 0x601a, 0x6013, 0x0000, ++ 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, ++ 0x080c, 0x5291, 0x080c, 0x52be, 0x080c, 0x79df, 0x080c, 0x7e94, ++ 0x00ce, 0x0c10, 0x2100, 0xa1b2, 0x0080, 0x1a0c, 0x1519, 0xa1b2, ++ 0x0040, 0x1a04, 0x9a6e, 0x0002, 0x9a62, 0x9a56, 0x9a62, 0x9a62, ++ 0x9a62, 0x9a62, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, ++ 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, ++ 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, ++ 0x9a54, 0x9a54, 0x9a54, 0x9a62, 0x9a54, 0x9a62, 0x9a62, 0x9a54, ++ 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a62, 0x9a54, 0x9a54, 0x9a54, ++ 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a62, 0x9a62, ++ 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, 0x9a54, ++ 0x9a54, 0x9a62, 0x9a54, 0x9a54, 0x080c, 0x1519, 0x6003, 0x0001, ++ 0x6106, 0x080c, 0x79df, 0x0126, 0x2091, 0x8000, 0x080c, 0x7e94, ++ 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x79df, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, 0x2600, 0x0002, ++ 0x9a62, 0x9a62, 0x9a76, 0x9a62, 0x9a62, 0x9a76, 0x080c, 0x1519, ++ 0x6004, 0xa0b2, 0x0080, 0x1a0c, 0x1519, 0xa1b6, 0x0013, 0x0904, ++ 0x9b28, 0xa1b6, 0x0027, 0x1904, 0x9aee, 0x080c, 0x7db1, 0x6004, ++ 0x080c, 0xae7e, 0x0190, 0x080c, 0xae8f, 0x0904, 0x9ae8, 0xa08e, ++ 0x0021, 0x0904, 0x9aeb, 0xa08e, 0x0022, 0x0904, 0x9ae8, 0xa08e, ++ 0x003d, 0x0904, 0x9aeb, 0x0804, 0x9ae1, 0x080c, 0x2e6c, 0x2001, ++ 0x0007, 0x080c, 0x5291, 0x6018, 0xa080, 0x0028, 0x200c, 0x080c, ++ 0x9c09, 0xa186, 0x007e, 0x1148, 0x2001, 0xc635, 0x2014, 0xc285, ++ 0x080c, 0x5f22, 0x1108, 0xc2ad, 0x2202, 0x0016, 0x0026, 0x0036, ++ 0x2110, 0x0026, 0x2019, 0x0028, 0x080c, 0x9132, 0x002e, 0x080c, ++ 0xc4e4, 0x003e, 0x002e, 0x001e, 0x0016, 0x0026, 0x0036, 0x2110, ++ 0x2019, 0x0028, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, ++ 0x7a0e, 0x00c6, 0x6018, 0xa065, 0x0110, 0x080c, 0x553e, 0x00ce, ++ 0x2c08, 0x080c, 0xbef7, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, ++ 0x5300, 0x080c, 0xb056, 0x080c, 0x95e3, 0x080c, 0x7e94, 0x0005, ++ 0x080c, 0x9c09, 0x0cb0, 0x080c, 0x9c37, 0x0c98, 0xa186, 0x0014, ++ 0x1db0, 0x080c, 0x7db1, 0x080c, 0x2e46, 0x080c, 0xae7e, 0x1188, ++ 0x080c, 0x2e6c, 0x6018, 0xa080, 0x0028, 0x200c, 0x080c, 0x9c09, ++ 0xa186, 0x007e, 0x1128, 0x2001, 0xc635, 0x200c, 0xc185, 0x2102, ++ 0x08c0, 0x080c, 0xae8f, 0x1118, 0x080c, 0x9c09, 0x0890, 0x6004, ++ 0xa08e, 0x0032, 0x1158, 0x00e6, 0x00f6, 0x2071, 0xc6a2, 0x2079, ++ 0x0000, 0x080c, 0x3179, 0x00fe, 0x00ee, 0x0818, 0x6004, 0xa08e, ++ 0x0021, 0x0d50, 0xa08e, 0x0022, 0x090c, 0x9c09, 0x0804, 0x9ae1, ++ 0xa0b2, 0x0040, 0x1a04, 0x9beb, 0x2008, 0x0002, 0x9b70, 0x9b71, ++ 0x9b74, 0x9b77, 0x9b7a, 0x9b7d, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, ++ 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, ++ 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, ++ 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b80, 0x9b8f, 0x9b6e, 0x9b91, ++ 0x9b8f, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b8f, 0x9b8f, ++ 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b6e, ++ 0x9bcb, 0x9b8f, 0x9b6e, 0x9b8b, 0x9b6e, 0x9b6e, 0x9b6e, 0x9b8c, ++ 0x9b6e, 0x9b6e, 0x9b6e, 0x9b8f, 0x9bc2, 0x9b6e, 0x080c, 0x1519, ++ 0x00f0, 0x2001, 0x000b, 0x0460, 0x2001, 0x0003, 0x0448, 0x2001, ++ 0x0005, 0x0430, 0x2001, 0x0001, 0x0418, 0x2001, 0x0009, 0x0400, ++ 0x080c, 0x7db1, 0x6003, 0x0005, 0x2001, 0xc8ff, 0x2004, 0x603e, ++ 0x080c, 0x7e94, 0x00a0, 0x0018, 0x0010, 0x080c, 0x5291, 0x0804, ++ 0x9bdc, 0x080c, 0x7db1, 0x2001, 0xc8fd, 0x2004, 0x6016, 0x2001, ++ 0xc8ff, 0x2004, 0x603e, 0x6003, 0x0004, 0x080c, 0x7e94, 0x0005, ++ 0x080c, 0x5291, 0x080c, 0x7db1, 0x6003, 0x0002, 0x2001, 0xc8ff, ++ 0x2004, 0x603e, 0x0036, 0x2019, 0xc65d, 0x2304, 0xa084, 0xff00, ++ 0x1120, 0x2001, 0xc8fd, 0x201c, 0x0040, 0x8007, 0xa09a, 0x0004, ++ 0x0ec0, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x003e, 0x080c, ++ 0x7e94, 0x08e8, 0x080c, 0x7db1, 0x080c, 0xb056, 0x080c, 0x95e3, ++ 0x080c, 0x7e94, 0x08a0, 0x00e6, 0x00f6, 0x2071, 0xc6a2, 0x2079, ++ 0x0000, 0x080c, 0x3179, 0x00fe, 0x00ee, 0x080c, 0x7db1, 0x080c, ++ 0x95e3, 0x080c, 0x7e94, 0x0818, 0x080c, 0x7db1, 0x2001, 0xc8ff, ++ 0x2004, 0x603e, 0x6003, 0x0002, 0x2001, 0xc8fd, 0x2004, 0x6016, ++ 0x080c, 0x7e94, 0x0005, 0x2600, 0x2008, 0x0002, 0x9bf6, 0x9bdc, ++ 0x9bf4, 0x9bdc, 0x9bdc, 0x9bf4, 0x080c, 0x1519, 0x080c, 0x7db1, ++ 0x00d6, 0x6010, 0x2068, 0x080c, 0x768f, 0x1118, 0x080c, 0x1619, ++ 0x0010, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, 0x080c, 0x7e94, ++ 0x0005, 0x00e6, 0x0026, 0x0016, 0x080c, 0xac91, 0x0508, 0x6010, ++ 0x2070, 0x7034, 0xa086, 0x0139, 0x1148, 0x2001, 0x0030, 0x2009, ++ 0x0000, 0x2011, 0x4005, 0x080c, 0xb10d, 0x0090, 0x7038, 0xd0fc, ++ 0x0178, 0x7007, 0x0000, 0x0016, 0x6004, 0xa08e, 0x0021, 0x0160, ++ 0xa08e, 0x003d, 0x0148, 0x001e, 0x7037, 0x0103, 0x7033, 0x0100, ++ 0x001e, 0x002e, 0x00ee, 0x0005, 0x001e, 0x0009, 0x0cc8, 0x00e6, ++ 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x7023, ++ 0x8001, 0x00ee, 0x0005, 0x00d6, 0x6618, 0x2668, 0x6804, 0xa084, ++ 0x00ff, 0x00de, 0xa0b2, 0x000c, 0x1a0c, 0x1519, 0x6604, 0xa6b6, ++ 0x0043, 0x1120, 0x080c, 0xb0c9, 0x0804, 0x9cb0, 0x6604, 0xa6b6, ++ 0x0033, 0x1120, 0x080c, 0xb079, 0x0804, 0x9cb0, 0x6604, 0xa6b6, ++ 0x0028, 0x1120, 0x080c, 0xaebf, 0x0804, 0x9cb0, 0x6604, 0xa6b6, ++ 0x0029, 0x1120, 0x080c, 0xaed6, 0x0804, 0x9cb0, 0x6604, 0xa6b6, ++ 0x001f, 0x1118, 0x080c, 0x974d, 0x04d8, 0x6604, 0xa6b6, 0x0000, ++ 0x1118, 0x080c, 0x99b7, 0x04a0, 0x6604, 0xa6b6, 0x0022, 0x1118, ++ 0x080c, 0x9775, 0x0468, 0x6604, 0xa6b6, 0x0035, 0x1118, 0x080c, ++ 0x97f2, 0x0430, 0x6604, 0xa6b6, 0x0039, 0x1118, 0x080c, 0x9953, ++ 0x00f8, 0x6604, 0xa6b6, 0x003d, 0x1118, 0x080c, 0x978f, 0x00c0, ++ 0x6604, 0xa6b6, 0x0044, 0x1118, 0x080c, 0x97af, 0x0088, 0x6604, ++ 0xa6b6, 0x0041, 0x1118, 0x080c, 0x97dc, 0x0050, 0xa1b6, 0x0015, ++ 0x1110, 0x0053, 0x0028, 0xa1b6, 0x0016, 0x1118, 0x0804, 0x9e93, ++ 0x0005, 0x080c, 0x962a, 0x0ce0, 0x9cda, 0x9cdd, 0x9cda, 0x9d21, ++ 0x9cda, 0x9e1a, 0x9ea1, 0x9cda, 0x9cda, 0x9e6b, 0x9cda, 0x9e81, ++ 0xa1b6, 0x0048, 0x0140, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, ++ 0x080c, 0x1870, 0x0005, 0x00e6, 0xacf0, 0x0004, 0x2e74, 0x7000, ++ 0x2070, 0x7037, 0x0103, 0x00ee, 0x080c, 0x95e3, 0x0005, 0x080c, ++ 0x95e3, 0x0005, 0xe000, 0xe000, 0x0005, 0x00e6, 0x2071, 0xc600, ++ 0x7084, 0xa086, 0x0074, 0x1530, 0x080c, 0xbece, 0x11b0, 0x00d6, ++ 0x6018, 0x2068, 0x7030, 0xd08c, 0x0128, 0x6800, 0xd0bc, 0x0110, ++ 0xc0c5, 0x6802, 0x00e9, 0x00de, 0x2001, 0x0006, 0x080c, 0x5291, ++ 0x080c, 0x2e6c, 0x080c, 0x95e3, 0x0088, 0x2001, 0x000a, 0x080c, ++ 0x5291, 0x080c, 0x2e6c, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, ++ 0x79df, 0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, 0x00ee, 0x0005, ++ 0x6800, 0xd084, 0x0168, 0x2001, 0x0000, 0x080c, 0x527f, 0x2069, ++ 0xc652, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x52be, ++ 0x0005, 0x00d6, 0x2011, 0xc621, 0x2204, 0xa086, 0x0074, 0x1904, ++ 0x9df0, 0x6018, 0x2068, 0x6aa0, 0xa286, 0x007e, 0x1120, 0x080c, ++ 0x9fc3, 0x0804, 0x9d8f, 0x080c, 0x9fb9, 0x6018, 0x2068, 0xa080, ++ 0x0028, 0x2014, 0xa286, 0x0080, 0x11c0, 0x6813, 0x00ff, 0x6817, ++ 0xfffc, 0x6010, 0xa005, 0x0138, 0x2068, 0x6807, 0x0000, 0x6837, ++ 0x0103, 0x6833, 0x0200, 0x2001, 0x0006, 0x080c, 0x5291, 0x080c, ++ 0x2e6c, 0x080c, 0x95e3, 0x0804, 0x9df3, 0x00e6, 0x2071, 0xc635, ++ 0x2e04, 0xd09c, 0x0188, 0x2071, 0xcc80, 0x7108, 0x720c, 0xa18c, ++ 0x00ff, 0x1118, 0xa284, 0xff00, 0x0138, 0x6018, 0x2070, 0x70a0, ++ 0xd0bc, 0x1110, 0x7112, 0x7216, 0x00ee, 0x6010, 0xa005, 0x0198, ++ 0x2068, 0x6838, 0xd0f4, 0x0178, 0x6834, 0xa084, 0x00ff, 0xa086, ++ 0x0039, 0x1958, 0x2001, 0x0000, 0x2009, 0x0000, 0x2011, 0x4000, ++ 0x080c, 0xb10d, 0x0840, 0x2001, 0x0004, 0x080c, 0x5291, 0x6003, ++ 0x0001, 0x6007, 0x0003, 0x080c, 0x79df, 0x0804, 0x9df3, 0x685c, ++ 0xd0e4, 0x01d8, 0x080c, 0xb009, 0x080c, 0x5f22, 0x0118, 0xd0dc, ++ 0x1904, 0x9d4b, 0x2011, 0xc635, 0x2204, 0xc0ad, 0x2012, 0x2001, ++ 0xc8d6, 0x2004, 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, ++ 0x2a1c, 0x78e2, 0x00fe, 0x0804, 0x9d4b, 0x080c, 0xb03f, 0x2011, ++ 0xc635, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xc023, 0x000e, ++ 0x1904, 0x9d4b, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x5291, ++ 0x2001, 0x0000, 0x080c, 0x527f, 0x00c6, 0x2009, 0x00ef, 0x00f6, ++ 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936, 0x00fe, 0x080c, 0x29f1, ++ 0x00f6, 0x2079, 0xc600, 0x7976, 0x2100, 0x2009, 0x0000, 0x080c, ++ 0x29c7, 0x7952, 0x00fe, 0x8108, 0x080c, 0x52e1, 0x2c00, 0x00ce, ++ 0x1904, 0x9d4b, 0x601a, 0x2001, 0x0002, 0x080c, 0x5291, 0x601f, ++ 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, 0x0018, ++ 0x2001, 0x0001, 0x0011, 0x00de, 0x0005, 0x0066, 0x2030, 0xa005, ++ 0x0170, 0x2001, 0x0007, 0x080c, 0x5291, 0x2001, 0xc600, 0x2004, ++ 0xa086, 0x0003, 0x1120, 0x2001, 0x0007, 0x080c, 0x52be, 0x2600, ++ 0xa005, 0x1150, 0x6010, 0xa080, 0x000e, 0x2004, 0xd0fc, 0x1120, ++ 0x2011, 0x8014, 0x080c, 0x407d, 0x080c, 0x2e6c, 0x080c, 0x95e3, ++ 0x006e, 0x0005, 0x00e6, 0x0026, 0x0016, 0x2071, 0xc600, 0x7084, ++ 0xa086, 0x0014, 0x15f0, 0x7000, 0xa086, 0x0003, 0x1128, 0x6010, ++ 0xa005, 0x1110, 0x080c, 0x40ef, 0x00d6, 0x6018, 0x2068, 0x080c, ++ 0x53df, 0x080c, 0x9d10, 0x00de, 0x080c, 0xa072, 0x1550, 0x00d6, ++ 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, 0x0518, 0x2001, 0x0006, ++ 0x080c, 0x5291, 0x00e6, 0x6010, 0xa075, 0x01a8, 0x7034, 0xa084, ++ 0x00ff, 0xa086, 0x0039, 0x1148, 0x2001, 0x0000, 0x2009, 0x0000, ++ 0x2011, 0x4000, 0x080c, 0xb10d, 0x0030, 0x7007, 0x0000, 0x7037, ++ 0x0103, 0x7033, 0x0200, 0x00ee, 0x080c, 0x2e6c, 0x080c, 0x95e3, ++ 0x0030, 0x080c, 0x9c09, 0x2001, 0x0000, 0x080c, 0x9df5, 0x001e, ++ 0x002e, 0x00ee, 0x0005, 0x2011, 0xc621, 0x2204, 0xa086, 0x0014, ++ 0x1158, 0x2001, 0x0002, 0x080c, 0x5291, 0x6003, 0x0001, 0x6007, ++ 0x0001, 0x080c, 0x79df, 0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, ++ 0x0005, 0x2011, 0xc621, 0x2204, 0xa086, 0x0004, 0x1138, 0x2001, ++ 0x0007, 0x080c, 0x5291, 0x080c, 0x95e3, 0x0020, 0x2001, 0x0001, ++ 0x080c, 0x9df5, 0x0005, 0x000b, 0x0005, 0x9cda, 0x9eac, 0x9cda, ++ 0x9ee2, 0x9cda, 0x9f6f, 0x9ea1, 0x9cd7, 0x9cda, 0x9f84, 0x9cda, ++ 0x9f96, 0x6604, 0xa686, 0x0003, 0x0904, 0x9e1a, 0xa6b6, 0x001e, ++ 0x1110, 0x080c, 0x95e3, 0x0005, 0x00d6, 0x00c6, 0x080c, 0x9fa8, ++ 0x1178, 0x2001, 0x0000, 0x080c, 0x527f, 0x2001, 0x0002, 0x080c, ++ 0x5291, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, 0x00f8, ++ 0x2009, 0xcc8e, 0x2104, 0xa086, 0x0009, 0x1160, 0x6018, 0x2068, ++ 0x6840, 0xa084, 0x00ff, 0xa005, 0x0170, 0x8001, 0x6842, 0x6017, ++ 0x000a, 0x0068, 0x2009, 0xcc8f, 0x2104, 0xa084, 0xff00, 0xa086, ++ 0x1900, 0x1108, 0x08d0, 0x2001, 0x0001, 0x080c, 0x9df5, 0x00ce, ++ 0x00de, 0x0005, 0x0026, 0x2011, 0x0000, 0x080c, 0x9fb6, 0x00d6, ++ 0x2069, 0xc8e5, 0x2d04, 0xa005, 0x0168, 0x6018, 0x2068, 0x68a0, ++ 0xa086, 0x007e, 0x1138, 0x2069, 0xc61d, 0x2d04, 0x8000, 0x206a, ++ 0x00de, 0x0010, 0x00de, 0x0078, 0x2001, 0x0000, 0x080c, 0x527f, ++ 0x2001, 0x0002, 0x080c, 0x5291, 0x6003, 0x0001, 0x6007, 0x0002, ++ 0x080c, 0x79df, 0x0490, 0x00d6, 0x6010, 0x2068, 0x080c, 0xac91, ++ 0x00de, 0x0108, 0x6a34, 0x080c, 0x9c09, 0x2009, 0xcc8e, 0x2134, ++ 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x0510, 0xa686, 0x000b, 0x01c8, ++ 0x2009, 0xcc8f, 0x2104, 0xa084, 0xff00, 0x1118, 0xa686, 0x0009, ++ 0x01b0, 0xa086, 0x1900, 0x1168, 0xa686, 0x0009, 0x0180, 0x2001, ++ 0x0004, 0x080c, 0x5291, 0x2001, 0x0028, 0x6016, 0x6007, 0x004b, ++ 0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, 0x002e, 0x0005, 0x00d6, ++ 0xa286, 0x0139, 0x0160, 0x6010, 0x2068, 0x080c, 0xac91, 0x0148, ++ 0x6834, 0xa086, 0x0139, 0x0118, 0x6838, 0xd0fc, 0x0110, 0x00de, ++ 0x0c40, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0140, ++ 0x8001, 0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x00de, 0x08e8, ++ 0x68a0, 0xa086, 0x007e, 0x1138, 0x00e6, 0x2071, 0xc600, 0x080c, ++ 0x4f02, 0x00ee, 0x0010, 0x080c, 0x2e46, 0x00de, 0x0850, 0x080c, ++ 0x9fb6, 0x1158, 0x2001, 0x0004, 0x080c, 0x5291, 0x6003, 0x0001, ++ 0x6007, 0x0003, 0x080c, 0x79df, 0x0030, 0x080c, 0x9c09, 0x2001, ++ 0x0000, 0x080c, 0x9df5, 0x0005, 0x0489, 0x1158, 0x2001, 0x0008, ++ 0x080c, 0x5291, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x79df, ++ 0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, 0x0005, 0x00f9, 0x1158, ++ 0x2001, 0x000a, 0x080c, 0x5291, 0x6003, 0x0001, 0x6007, 0x0001, ++ 0x080c, 0x79df, 0x0020, 0x2001, 0x0001, 0x080c, 0x9df5, 0x0005, ++ 0x2009, 0xcc8e, 0x2104, 0xa086, 0x0003, 0x1138, 0x2009, 0xcc8f, ++ 0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, 0x0005, 0xa085, 0x0001, ++ 0x0005, 0x00c6, 0x0016, 0xac88, 0x0006, 0x2164, 0x080c, 0x534c, ++ 0x001e, 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, ++ 0x6018, 0x2068, 0x2071, 0xc635, 0x2e04, 0xa085, 0x0003, 0x2072, ++ 0x080c, 0xa047, 0x0560, 0x2009, 0xc635, 0x2104, 0xc0cd, 0x200a, ++ 0x2001, 0xc653, 0x2004, 0xd0a4, 0x0158, 0xa006, 0x2020, 0x2009, ++ 0x002a, 0x080c, 0xc190, 0x2001, 0xc60c, 0x200c, 0xc195, 0x2102, ++ 0x2019, 0x002a, 0x2009, 0x0001, 0x080c, 0x2e19, 0x2071, 0xc600, ++ 0x080c, 0x2c62, 0x00c6, 0x0156, 0x20a9, 0x0081, 0x2009, 0x007f, ++ 0x080c, 0x2f41, 0x8108, 0x1f04, 0x9ff8, 0x015e, 0x00ce, 0x080c, ++ 0x9fb9, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0xcc80, 0x2079, ++ 0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, 0xc61c, 0x206a, 0x78e6, ++ 0x0006, 0x8e70, 0x2e04, 0x2069, 0xc61d, 0x206a, 0x78ea, 0x7832, ++ 0x7836, 0x2010, 0xa084, 0xff00, 0x001e, 0xa105, 0x2009, 0xc628, ++ 0x200a, 0x2200, 0xa084, 0x00ff, 0x2008, 0x080c, 0x29f1, 0x080c, ++ 0x5f22, 0x0170, 0x2069, 0xcc8e, 0x2071, 0xc8f9, 0x6810, 0x2072, ++ 0x6814, 0x7006, 0x6818, 0x700a, 0x681c, 0x700e, 0x080c, 0xb009, ++ 0x0040, 0x2001, 0x0006, 0x080c, 0x5291, 0x080c, 0x2e6c, 0x080c, ++ 0x95e3, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x0026, ++ 0x0036, 0x00e6, 0x0156, 0x2019, 0xc628, 0x231c, 0x83ff, 0x01e8, ++ 0x2071, 0xcc80, 0x2e14, 0xa294, 0x00ff, 0x7004, 0xa084, 0xff00, ++ 0xa205, 0xa306, 0x1190, 0x2011, 0xcc96, 0xad98, 0x000a, 0x20a9, ++ 0x0004, 0x080c, 0xa103, 0x1148, 0x2011, 0xcc9a, 0xad98, 0x0006, ++ 0x20a9, 0x0004, 0x080c, 0xa103, 0x1100, 0x015e, 0x00ee, 0x003e, ++ 0x002e, 0x0005, 0x00e6, 0x2071, 0xcc8c, 0x7004, 0xa086, 0x0014, ++ 0x11a8, 0x7008, 0xa086, 0x0800, 0x1188, 0x700c, 0xd0ec, 0x0160, ++ 0xa084, 0x0f00, 0xa086, 0x0100, 0x1138, 0x7024, 0xd0a4, 0x1110, ++ 0xd0ac, 0x0110, 0xa006, 0x0010, 0xa085, 0x0001, 0x00ee, 0x0005, ++ 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0056, 0x0046, 0x0026, 0x0006, ++ 0x0126, 0x2091, 0x8000, 0x2029, 0xc930, 0x252c, 0x2021, 0xc936, ++ 0x2424, 0x2061, 0xce00, 0x2071, 0xc600, 0x7248, 0x7068, 0xa202, ++ 0x16f0, 0x080c, 0xc1b8, 0x05a0, 0x671c, 0xa786, 0x0001, 0x0580, ++ 0xa786, 0x0007, 0x0568, 0x2500, 0xac06, 0x0550, 0x2400, 0xac06, ++ 0x0538, 0x00c6, 0x6000, 0xa086, 0x0004, 0x1110, 0x080c, 0x1953, ++ 0xa786, 0x0008, 0x1148, 0x080c, 0xae8f, 0x1130, 0x00ce, 0x080c, ++ 0x9c09, 0x080c, 0xae54, 0x00a0, 0x6010, 0x2068, 0x080c, 0xac91, ++ 0x0160, 0xa786, 0x0003, 0x11e8, 0x6837, 0x0103, 0x6b4a, 0x6847, ++ 0x0000, 0x080c, 0x580a, 0x080c, 0xae48, 0x080c, 0xae54, 0x00ce, ++ 0xace0, 0x0018, 0x705c, 0xac02, 0x1210, 0x0804, 0xa0a5, 0x012e, ++ 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x00de, 0x00ee, ++ 0x0005, 0xa786, 0x0006, 0x1118, 0x080c, 0xc141, 0x0c30, 0xa786, ++ 0x0009, 0x1128, 0x2009, 0x0106, 0x080c, 0x9613, 0x0c00, 0xa786, ++ 0x000a, 0x09a0, 0x0888, 0x220c, 0x2304, 0xa106, 0x1130, 0x8210, ++ 0x8318, 0x1f04, 0xa103, 0xa006, 0x0005, 0x2304, 0xa102, 0x0218, ++ 0x2001, 0x0001, 0x0010, 0x2001, 0x0000, 0xa18d, 0x0001, 0x0005, ++ 0x220c, 0x810f, 0x2304, 0xa106, 0x1130, 0x8210, 0x8318, 0x1f04, ++ 0xa118, 0xa006, 0x0005, 0xa18d, 0x0001, 0x0005, 0x6004, 0xa08a, ++ 0x0080, 0x1a0c, 0x1519, 0x080c, 0xae7e, 0x0120, 0x080c, 0xae8f, ++ 0x0168, 0x0028, 0x080c, 0x2e6c, 0x080c, 0xae8f, 0x0138, 0x080c, ++ 0x7db1, 0x080c, 0x95e3, 0x080c, 0x7e94, 0x0005, 0x080c, 0x9c09, ++ 0x0cb0, 0xa182, 0x0040, 0x0002, 0xa157, 0xa157, 0xa157, 0xa157, ++ 0xa157, 0xa157, 0xa157, 0xa157, 0xa157, 0xa157, 0xa157, 0xa159, ++ 0xa159, 0xa159, 0xa159, 0xa157, 0xa157, 0xa157, 0xa159, 0x080c, ++ 0x1519, 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x7999, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, 0xa186, ++ 0x0013, 0x1128, 0x6004, 0xa082, 0x0040, 0x0804, 0xa1f3, 0xa186, ++ 0x0027, 0x11e8, 0x080c, 0x7db1, 0x080c, 0x2e46, 0x00d6, 0x6110, ++ 0x2168, 0x080c, 0xac91, 0x0168, 0x6837, 0x0103, 0x684b, 0x0029, ++ 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x080c, 0x580a, 0x080c, ++ 0xae48, 0x00de, 0x080c, 0x95e3, 0x080c, 0x7e94, 0x0005, 0xa186, ++ 0x0014, 0x1120, 0x6004, 0xa082, 0x0040, 0x0428, 0xa186, 0x0046, ++ 0x0138, 0xa186, 0x0045, 0x0120, 0xa186, 0x0047, 0x190c, 0x1519, ++ 0x2001, 0x0109, 0x2004, 0xd084, 0x0198, 0x0126, 0x2091, 0x2800, ++ 0x0006, 0x0016, 0x0026, 0x080c, 0x7873, 0x002e, 0x001e, 0x000e, ++ 0x012e, 0xe000, 0x6000, 0xa086, 0x0002, 0x1110, 0x0804, 0xa231, ++ 0x080c, 0x962a, 0x0005, 0x0002, 0xa1d1, 0xa1cf, 0xa1cf, 0xa1cf, ++ 0xa1cf, 0xa1cf, 0xa1cf, 0xa1cf, 0xa1cf, 0xa1cf, 0xa1cf, 0xa1ec, ++ 0xa1ec, 0xa1ec, 0xa1ec, 0xa1cf, 0xa1ec, 0xa1cf, 0xa1ec, 0x080c, ++ 0x1519, 0x080c, 0x7db1, 0x00d6, 0x6110, 0x2168, 0x080c, 0xac91, ++ 0x0168, 0x6837, 0x0103, 0x684b, 0x0006, 0x6847, 0x0000, 0x6850, ++ 0xc0ec, 0x6852, 0x080c, 0x580a, 0x080c, 0xae48, 0x00de, 0x080c, ++ 0x95e3, 0x080c, 0x7e94, 0x0005, 0x080c, 0x7db1, 0x080c, 0x95e3, ++ 0x080c, 0x7e94, 0x0005, 0x0002, 0xa209, 0xa207, 0xa207, 0xa207, ++ 0xa207, 0xa207, 0xa207, 0xa207, 0xa207, 0xa207, 0xa207, 0xa21b, ++ 0xa21b, 0xa21b, 0xa21b, 0xa207, 0xa22a, 0xa207, 0xa21b, 0x080c, ++ 0x1519, 0x080c, 0x7db1, 0x2001, 0xc8ff, 0x2004, 0x603e, 0x6003, ++ 0x0002, 0x080c, 0x7e94, 0x6010, 0xa088, 0x0013, 0x2104, 0xa085, ++ 0x0400, 0x200a, 0x0005, 0x080c, 0x7db1, 0x2001, 0xc8fd, 0x2004, ++ 0x6016, 0x2001, 0xc8ff, 0x2004, 0x603e, 0x6003, 0x000f, 0x080c, ++ 0x7e94, 0x0005, 0x080c, 0x7db1, 0x080c, 0x95e3, 0x080c, 0x7e94, ++ 0x0005, 0xa182, 0x0040, 0x0002, 0xa247, 0xa247, 0xa247, 0xa247, ++ 0xa247, 0xa249, 0xa32e, 0xa35d, 0xa247, 0xa247, 0xa247, 0xa247, ++ 0xa247, 0xa247, 0xa247, 0xa247, 0xa247, 0xa247, 0xa247, 0x080c, ++ 0x1519, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2071, 0xcc80, 0x7124, ++ 0x610a, 0x2071, 0xcc8c, 0x6110, 0x2168, 0x7614, 0xa6b4, 0x0fff, ++ 0x86ff, 0x0904, 0xa2f7, 0xa68c, 0x0c00, 0x0518, 0x00f6, 0x2c78, ++ 0x080c, 0x56c3, 0x00fe, 0x01c8, 0x684c, 0xd0ac, 0x01b0, 0x6020, ++ 0xd0dc, 0x1198, 0x6850, 0xd0bc, 0x1180, 0x7318, 0x6814, 0xa306, ++ 0x1904, 0xa30a, 0x731c, 0x6810, 0xa31e, 0x0138, 0xd6d4, 0x0904, ++ 0xa30a, 0x6b14, 0xa305, 0x1904, 0xa30a, 0x7318, 0x6b62, 0x731c, ++ 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0518, 0xa186, 0x0028, ++ 0x1128, 0x080c, 0xae6d, 0x684b, 0x001c, 0x00e8, 0xd6dc, 0x01a0, ++ 0x684b, 0x0015, 0x684c, 0xd0ac, 0x0170, 0x6914, 0x6a10, 0x2100, ++ 0xa205, 0x0148, 0x7018, 0xa106, 0x1118, 0x701c, 0xa206, 0x0118, ++ 0x6962, 0x6a5e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0x684b, 0x0007, ++ 0x0010, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0xa01e, 0xd6c4, ++ 0x01f0, 0xa686, 0x0100, 0x1140, 0x2001, 0xcc99, 0x2004, 0xa005, ++ 0x1118, 0xc6c4, 0x0804, 0xa258, 0x7328, 0x732c, 0x6b56, 0x83ff, ++ 0x0170, 0xa38a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, ++ 0x2019, 0xcc98, 0xad90, 0x0019, 0x080c, 0xa944, 0x003e, 0xd6cc, ++ 0x0904, 0xa31d, 0x7124, 0x695a, 0x81ff, 0x0904, 0xa31d, 0xa192, ++ 0x0021, 0x1260, 0x2071, 0xcc98, 0x831c, 0x2300, 0xae18, 0xad90, ++ 0x001d, 0x080c, 0xa944, 0x080c, 0xb16e, 0x04b8, 0x6838, 0xd0fc, ++ 0x0120, 0x2009, 0x0020, 0x695a, 0x0c68, 0x00f6, 0x2d78, 0x080c, ++ 0xa8e9, 0x00fe, 0x080c, 0xb16e, 0x080c, 0xa934, 0x0440, 0x00f6, ++ 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x0190, 0x684c, 0xd0ac, 0x0178, ++ 0x6020, 0xd0dc, 0x1160, 0x6850, 0xd0bc, 0x1148, 0x6810, 0x6914, ++ 0xa105, 0x0128, 0x080c, 0xaf6c, 0x00de, 0x00ee, 0x00f0, 0x684b, ++ 0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac, 0x0130, 0x6810, ++ 0x6914, 0xa115, 0x0110, 0x080c, 0xa4ba, 0x080c, 0x580a, 0x6218, ++ 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x080c, 0xaf3a, ++ 0x00de, 0x00ee, 0x1110, 0x080c, 0x95e3, 0x0005, 0x00f6, 0x6003, ++ 0x0003, 0x2079, 0xcc8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, ++ 0x2078, 0x784c, 0xd0ac, 0x0138, 0x6003, 0x0002, 0x00fe, 0x0005, ++ 0x2130, 0x2228, 0x0058, 0x2400, 0x797c, 0xa10a, 0x2300, 0x7a80, ++ 0xa213, 0x2600, 0xa102, 0x2500, 0xa203, 0x0e90, 0x7c12, 0x7b16, ++ 0x7e0a, 0x7d0e, 0x00fe, 0x603f, 0x0000, 0x2c10, 0x080c, 0x2068, ++ 0x080c, 0x79fc, 0x080c, 0x7f6e, 0x0005, 0x2001, 0xc8ff, 0x2004, ++ 0x603e, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, ++ 0x2c10, 0x080c, 0x1870, 0x0005, 0xa182, 0x0040, 0x0002, 0xa382, ++ 0xa382, 0xa382, 0xa382, 0xa382, 0xa384, 0xa417, 0xa382, 0xa382, ++ 0xa42d, 0xa491, 0xa382, 0xa382, 0xa382, 0xa382, 0xa4a0, 0xa382, ++ 0xa382, 0xa382, 0x080c, 0x1519, 0x0076, 0x00f6, 0x00e6, 0x00d6, ++ 0x2071, 0xcc8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46, ++ 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, ++ 0x8211, 0x6a3e, 0x86ff, 0x0904, 0xa412, 0xa694, 0xff00, 0xa284, ++ 0x0c00, 0x0120, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, ++ 0x0904, 0xa412, 0x080c, 0x1602, 0x090c, 0x1519, 0x2d00, 0x784a, ++ 0x7f4c, 0xc7cd, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, 0x783c, ++ 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00, 0x0120, 0x7318, ++ 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0180, ++ 0xa186, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060, 0xd6dc, 0x0118, ++ 0x684b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0x684b, 0x0007, 0x0010, ++ 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e, ++ 0xd6c4, 0x0198, 0x7328, 0x732c, 0x6b56, 0x83ff, 0x0170, 0xa38a, ++ 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0xcc98, ++ 0xad90, 0x0019, 0x080c, 0xa944, 0x003e, 0xd6cc, 0x01d8, 0x7124, ++ 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250, 0x2071, 0xcc98, ++ 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0xa944, 0x0050, ++ 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c78, 0x2d78, ++ 0x080c, 0xa8e9, 0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, 0x00f6, ++ 0x6003, 0x0003, 0x2079, 0xcc8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, ++ 0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x00fe, 0x2c10, ++ 0x080c, 0x2068, 0x080c, 0x8bdb, 0x0005, 0x00d6, 0x00f6, 0x2c78, ++ 0x080c, 0x56c3, 0x00fe, 0x0120, 0x2001, 0xc8ff, 0x2004, 0x603e, ++ 0x6003, 0x0002, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6110, 0x2168, ++ 0x694c, 0xd1e4, 0x0904, 0xa48f, 0xd1cc, 0x0540, 0x6948, 0x6838, ++ 0xd0fc, 0x01e8, 0x0016, 0x684c, 0x0006, 0x6850, 0x0006, 0xad90, ++ 0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x0156, 0x21a8, 0x2304, ++ 0x2012, 0x8318, 0x8210, 0x1f04, 0xa457, 0x015e, 0x000e, 0x6852, ++ 0x000e, 0x684e, 0x001e, 0x2168, 0x080c, 0x1629, 0x0418, 0x0016, ++ 0x080c, 0x1629, 0x00de, 0x080c, 0xa934, 0x00e0, 0x6837, 0x0103, ++ 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0180, 0xa086, 0x0028, ++ 0x1118, 0x684b, 0x001c, 0x0060, 0xd1dc, 0x0118, 0x684b, 0x0015, ++ 0x0038, 0xd1d4, 0x0118, 0x684b, 0x0007, 0x0010, 0x684b, 0x0000, ++ 0x080c, 0x580a, 0x080c, 0xaf3a, 0x1110, 0x080c, 0x95e3, 0x00de, ++ 0x0005, 0x2019, 0x0001, 0x080c, 0x8e79, 0x6003, 0x0002, 0x2001, ++ 0xc8ff, 0x2004, 0x603e, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x0005, ++ 0x080c, 0x7e47, 0x080c, 0x2e46, 0x00d6, 0x6110, 0x2168, 0x080c, ++ 0xac91, 0x0150, 0x6837, 0x0103, 0x684b, 0x0029, 0x6847, 0x0000, ++ 0x080c, 0x580a, 0x080c, 0xae48, 0x00de, 0x080c, 0x95e3, 0x080c, ++ 0x7f6e, 0x0005, 0x684b, 0x0015, 0xd1fc, 0x0138, 0x684b, 0x0007, ++ 0x8002, 0x8000, 0x810a, 0xa189, 0x0000, 0x6962, 0x685e, 0x0005, ++ 0xa182, 0x0040, 0x0002, 0xa4de, 0xa4de, 0xa4de, 0xa4de, 0xa4de, ++ 0xa4e0, 0xa4de, 0xa59b, 0xa5a7, 0xa4de, 0xa4de, 0xa4de, 0xa4de, ++ 0xa4de, 0xa4de, 0xa4de, 0xa4de, 0xa4de, 0xa4de, 0x080c, 0x1519, ++ 0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071, 0xcc8c, 0x6110, 0x2178, ++ 0x7614, 0xa6b4, 0x0fff, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, ++ 0x0150, 0xa684, 0x00ff, 0x1138, 0x6020, 0xd0f4, 0x0120, 0x080c, ++ 0xaf6c, 0x0804, 0xa596, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, ++ 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x86ff, 0x0904, ++ 0xa58c, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0120, 0x7018, 0x7862, ++ 0x701c, 0x785e, 0xa284, 0x0300, 0x0904, 0xa58a, 0xa686, 0x0100, ++ 0x1140, 0x2001, 0xcc99, 0x2004, 0xa005, 0x1118, 0xc6c4, 0x7e46, ++ 0x0c28, 0x080c, 0x1602, 0x090c, 0x1519, 0x2d00, 0x784a, 0x7f4c, ++ 0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, 0x783c, ++ 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00, 0x0120, 0x7318, ++ 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0180, ++ 0xa186, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060, 0xd6dc, 0x0118, ++ 0x684b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0x684b, 0x0007, 0x0010, ++ 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e, ++ 0xd6c4, 0x0198, 0x7328, 0x732c, 0x6b56, 0x83ff, 0x0170, 0xa38a, ++ 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0xcc98, ++ 0xad90, 0x0019, 0x080c, 0xa944, 0x003e, 0xd6cc, 0x01d8, 0x7124, ++ 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250, 0x2071, 0xcc98, ++ 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0xa944, 0x0050, ++ 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c78, 0x2d78, ++ 0x080c, 0xa8e9, 0xd6dc, 0x1110, 0xa006, 0x0030, 0x2001, 0x0001, ++ 0x2071, 0xcc8c, 0x7218, 0x731c, 0x080c, 0x18b8, 0x00de, 0x00ee, ++ 0x00fe, 0x007e, 0x0005, 0x2001, 0xc8ff, 0x2004, 0x603e, 0x20e1, ++ 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1870, 0x0005, 0x2001, ++ 0xc8ff, 0x2004, 0x603e, 0x00d6, 0x6003, 0x0002, 0x6110, 0x2168, ++ 0x694c, 0xd1e4, 0x0904, 0xa6b2, 0x603f, 0x0000, 0x00f6, 0x2c78, ++ 0x080c, 0x56c3, 0x00fe, 0x0560, 0x6814, 0x6910, 0xa115, 0x0540, ++ 0x6a60, 0xa206, 0x1118, 0x685c, 0xa106, 0x0510, 0x684c, 0xc0e4, ++ 0x684e, 0x6847, 0x0000, 0x6863, 0x0000, 0x685f, 0x0000, 0x6020, ++ 0xd0f4, 0x1158, 0x697c, 0x6810, 0xa102, 0x603a, 0x6980, 0x6814, ++ 0xa103, 0x6036, 0x6020, 0xc0f5, 0x6022, 0x00d6, 0x6018, 0x2068, ++ 0x683c, 0x8000, 0x683e, 0x00de, 0x080c, 0xaf6c, 0x0804, 0xa6b2, ++ 0x694c, 0xd1cc, 0x0904, 0xa682, 0x6948, 0x6838, 0xd0fc, 0x0904, ++ 0xa645, 0x0016, 0x684c, 0x0006, 0x6850, 0x0006, 0x00f6, 0x2178, ++ 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x01e0, 0xa086, 0x0028, ++ 0x1128, 0x684b, 0x001c, 0x784b, 0x001c, 0x00e8, 0xd1dc, 0x0158, ++ 0x684b, 0x0015, 0x784b, 0x0015, 0x080c, 0xb0f6, 0x0118, 0x7944, ++ 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b, 0x0007, 0x784b, ++ 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, ++ 0x0110, 0x080c, 0xa4ba, 0x6848, 0x784a, 0x6860, 0x7862, 0x685c, ++ 0x785e, 0xad90, 0x000d, 0xaf98, 0x000d, 0x2009, 0x0020, 0x0156, ++ 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0xa631, 0x015e, ++ 0x00fe, 0x000e, 0x6852, 0x000e, 0x684e, 0x080c, 0xb16e, 0x001e, ++ 0x2168, 0x080c, 0x1629, 0x0804, 0xa6ad, 0x0016, 0x00f6, 0x2178, ++ 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x01e0, 0xa086, 0x0028, ++ 0x1128, 0x684b, 0x001c, 0x784b, 0x001c, 0x00e8, 0xd1dc, 0x0158, ++ 0x684b, 0x0015, 0x784b, 0x0015, 0x080c, 0xb0f6, 0x0118, 0x7944, ++ 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b, 0x0007, 0x784b, ++ 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, ++ 0x0110, 0x080c, 0xa4ba, 0x6860, 0x7862, 0x685c, 0x785e, 0x684c, ++ 0x784e, 0x00fe, 0x080c, 0x1629, 0x00de, 0x080c, 0xb16e, 0x080c, ++ 0xa934, 0x0458, 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, ++ 0x0002, 0x01b0, 0xa086, 0x0028, 0x1118, 0x684b, 0x001c, 0x00d8, ++ 0xd1dc, 0x0148, 0x684b, 0x0015, 0x080c, 0xb0f6, 0x0118, 0x6944, ++ 0xc1dc, 0x6946, 0x0080, 0xd1d4, 0x0118, 0x684b, 0x0007, 0x0058, ++ 0x684b, 0x0000, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, ++ 0x0110, 0x080c, 0xa4ba, 0x080c, 0x580a, 0x080c, 0xaf3a, 0x1110, ++ 0x080c, 0x95e3, 0x00de, 0x0005, 0x080c, 0x7db1, 0x0010, 0x080c, ++ 0x7e47, 0x080c, 0xac91, 0x01c0, 0x00d6, 0x6110, 0x2168, 0x6837, ++ 0x0103, 0x2009, 0xc60c, 0x210c, 0xd18c, 0x11c0, 0xd184, 0x1198, ++ 0x6108, 0x694a, 0xa18e, 0x0029, 0x1110, 0x080c, 0xc4d7, 0x6847, ++ 0x0000, 0x080c, 0x580a, 0x00de, 0x080c, 0x95e3, 0x080c, 0x7e94, ++ 0x080c, 0x7f6e, 0x0005, 0x684b, 0x0004, 0x0c88, 0x684b, 0x0004, ++ 0x0c70, 0xa182, 0x0040, 0x0002, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, ++ 0xa6f7, 0xa6f9, 0xa6f7, 0xa6fc, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, ++ 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0x080c, ++ 0x1519, 0x080c, 0x95e3, 0x0005, 0x0006, 0x0026, 0xa016, 0x080c, ++ 0x1870, 0x002e, 0x000e, 0x0005, 0xa182, 0x0085, 0x0002, 0xa710, ++ 0xa70e, 0xa70e, 0xa71c, 0xa70e, 0xa70e, 0xa70e, 0x080c, 0x1519, ++ 0x6003, 0x0001, 0x6106, 0x080c, 0x7999, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x7e94, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, ++ 0x2071, 0xcc80, 0x7224, 0x6212, 0x7220, 0x080c, 0xac81, 0x01a0, ++ 0x2268, 0x6800, 0xa086, 0x0000, 0x0178, 0x6018, 0x6d18, 0xa52e, ++ 0x1158, 0x00c6, 0x2d60, 0x080c, 0xa954, 0x00ce, 0x0128, 0x6803, ++ 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001, ++ 0x080c, 0x7999, 0x080c, 0x7e94, 0x00f6, 0x2278, 0x080c, 0x56c3, ++ 0x00fe, 0x0150, 0x6820, 0xd0ec, 0x0138, 0x00c6, 0x2260, 0x603f, ++ 0x0000, 0x080c, 0xaf6c, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, ++ 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, 0xa08a, 0x0085, 0x0a0c, ++ 0x1519, 0xa08a, 0x008c, 0x1a0c, 0x1519, 0xa082, 0x0085, 0x0072, ++ 0xa186, 0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x1519, 0x080c, ++ 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xa77d, 0xa77f, ++ 0xa77f, 0xa77d, 0xa77d, 0xa77d, 0xa77d, 0x080c, 0x1519, 0x080c, ++ 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xa186, 0x0013, ++ 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x04a8, 0xa186, 0x0027, ++ 0x11e8, 0x080c, 0x7db1, 0x080c, 0x2e46, 0x00d6, 0x6010, 0x2068, ++ 0x080c, 0xac91, 0x0150, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b, ++ 0x0029, 0x080c, 0x580a, 0x080c, 0xae48, 0x00de, 0x080c, 0x95e3, ++ 0x080c, 0x7e94, 0x0005, 0x080c, 0x962a, 0x0ce0, 0xa186, 0x0014, ++ 0x1dd0, 0x080c, 0x7db1, 0x00d6, 0x6010, 0x2068, 0x080c, 0xac91, ++ 0x0d60, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b, 0x0006, 0x6850, ++ 0xc0ec, 0x6852, 0x08f0, 0x0002, 0xa7cd, 0xa7cb, 0xa7cb, 0xa7cb, ++ 0xa7cb, 0xa7cb, 0xa7e5, 0x080c, 0x1519, 0x080c, 0x7db1, 0x6030, ++ 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, ++ 0x1118, 0x2001, 0xc8fd, 0x0010, 0x2001, 0xc8fe, 0x2004, 0x6016, ++ 0x6003, 0x000c, 0x080c, 0x7e94, 0x0005, 0x080c, 0x7db1, 0x6030, ++ 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, ++ 0x1118, 0x2001, 0xc8fd, 0x0010, 0x2001, 0xc8fe, 0x2004, 0x6016, ++ 0x6003, 0x000e, 0x080c, 0x7e94, 0x0005, 0xa182, 0x008c, 0x1220, ++ 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, 0x962a, 0x0005, 0xa80e, ++ 0xa80e, 0xa80e, 0xa80e, 0xa810, 0xa869, 0xa80e, 0x080c, 0x1519, ++ 0x00d6, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x0168, 0x6030, ++ 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, ++ 0x1118, 0x00de, 0x0804, 0xa87c, 0x080c, 0xac91, 0x1118, 0x080c, ++ 0xae48, 0x00f0, 0x6010, 0x2068, 0x684c, 0xd0e4, 0x1110, 0x080c, ++ 0xae48, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0x684b, 0x0006, ++ 0xc0ec, 0x6852, 0x0048, 0xd0bc, 0x0118, 0x684b, 0x0002, 0x0020, ++ 0x684b, 0x0005, 0x080c, 0xaf09, 0x6847, 0x0000, 0x080c, 0x580a, ++ 0x2c68, 0x080c, 0x958d, 0x01c0, 0x6003, 0x0001, 0x6007, 0x001e, ++ 0x600b, 0xffff, 0x2009, 0xcc8e, 0x210c, 0x6136, 0x2009, 0xcc8f, ++ 0x210c, 0x613a, 0x6918, 0x611a, 0x080c, 0xb05e, 0x6950, 0x6152, ++ 0x601f, 0x0001, 0x080c, 0x7999, 0x2d60, 0x080c, 0x95e3, 0x00de, ++ 0x0005, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x0598, 0x6030, ++ 0xa08c, 0xff00, 0x810f, 0xa186, 0x0035, 0x0130, 0xa186, 0x001e, ++ 0x0118, 0xa186, 0x0039, 0x1530, 0x00d6, 0x2c68, 0x080c, 0xb141, ++ 0x1904, 0xa8c1, 0x080c, 0x958d, 0x01d8, 0x6106, 0x6003, 0x0001, ++ 0x601f, 0x0001, 0x6918, 0x611a, 0x6928, 0x612a, 0x692c, 0x612e, ++ 0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, 0x6136, 0x6938, 0x613a, ++ 0x6950, 0x6152, 0x080c, 0xb05e, 0x080c, 0x7999, 0x080c, 0x7e94, ++ 0x2d60, 0x00f8, 0x00d6, 0x6010, 0x2068, 0x080c, 0xac91, 0x01c8, ++ 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0xc0ec, 0x6852, 0x684b, ++ 0x0006, 0x0048, 0xd0bc, 0x0118, 0x684b, 0x0002, 0x0020, 0x684b, ++ 0x0005, 0x080c, 0xaf09, 0x6847, 0x0000, 0x080c, 0x580a, 0x080c, ++ 0xae48, 0x00de, 0x080c, 0x95e3, 0x0005, 0x0016, 0x00d6, 0x6010, ++ 0x2068, 0x080c, 0xac91, 0x0140, 0x6837, 0x0103, 0x684b, 0x0028, ++ 0x6847, 0x0000, 0x080c, 0x580a, 0x00de, 0x001e, 0xa186, 0x0013, ++ 0x0148, 0xa186, 0x0014, 0x0130, 0xa186, 0x0027, 0x0118, 0x080c, ++ 0x962a, 0x0030, 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, ++ 0x0005, 0x0056, 0x0066, 0x00d6, 0x00f6, 0x2029, 0x0001, 0xa182, ++ 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x2069, 0xcc98, ++ 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, 0xaf90, 0x001d, 0x080c, ++ 0xa944, 0xa6b2, 0x0020, 0x7804, 0xa06d, 0x0110, 0x080c, 0x1629, ++ 0x080c, 0x1602, 0x0500, 0x8528, 0x6837, 0x0110, 0x683b, 0x0000, ++ 0x2d20, 0x7c06, 0xa68a, 0x003d, 0x1228, 0x2608, 0xad90, 0x000f, ++ 0x0459, 0x0088, 0xa6b2, 0x003c, 0x2009, 0x003c, 0x2d78, 0xad90, ++ 0x000f, 0x0411, 0x0c28, 0x00fe, 0x852f, 0xa5ad, 0x0003, 0x7d36, ++ 0xa5ac, 0x0000, 0x0028, 0x00fe, 0x852f, 0xa5ad, 0x0003, 0x7d36, ++ 0x00de, 0x006e, 0x005e, 0x0005, 0x00f6, 0x8dff, 0x0158, 0x6804, ++ 0xa07d, 0x0130, 0x6807, 0x0000, 0x080c, 0x580a, 0x2f68, 0x0cb8, ++ 0x080c, 0x580a, 0x00fe, 0x0005, 0x0156, 0xa184, 0x0001, 0x0108, ++ 0x8108, 0x810c, 0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, 0x8210, ++ 0x1f04, 0xa94b, 0x015e, 0x0005, 0x0066, 0x0126, 0x2091, 0x8000, ++ 0x2031, 0x0001, 0x601c, 0xa084, 0x000f, 0x0083, 0x012e, 0x006e, ++ 0x0005, 0x0126, 0x2091, 0x8000, 0x0066, 0x2031, 0x0000, 0x601c, ++ 0xa084, 0x000f, 0x001b, 0x006e, 0x012e, 0x0005, 0xa98b, 0xa98b, ++ 0xa986, 0xa9ad, 0xa979, 0xa986, 0xa9ad, 0xa986, 0xa979, 0x77f4, ++ 0xa986, 0x080c, 0x1519, 0x0036, 0x2019, 0x0010, 0x080c, 0xbd55, ++ 0x601f, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0xa006, 0x0005, ++ 0xa085, 0x0001, 0x0005, 0x00d6, 0x86ff, 0x11d8, 0x6010, 0x2068, ++ 0x080c, 0xac91, 0x01c0, 0x6834, 0xa086, 0x0139, 0x1128, 0x684b, ++ 0x0005, 0x6853, 0x0000, 0x0028, 0xa00e, 0x2001, 0x0005, 0x080c, ++ 0x592e, 0x080c, 0xaf09, 0x080c, 0x580a, 0x080c, 0x95e3, 0xa085, ++ 0x0001, 0x00de, 0x0005, 0xa006, 0x0ce0, 0x6000, 0xa08a, 0x0010, ++ 0x1a0c, 0x1519, 0x000b, 0x0005, 0xa9c4, 0xa9e5, 0xa9c6, 0xaa04, ++ 0xa9e2, 0xa9c4, 0xa986, 0xa98b, 0xa98b, 0xa986, 0xa986, 0xa986, ++ 0xa986, 0xa986, 0xa986, 0xa986, 0x080c, 0x1519, 0x86ff, 0x11b8, ++ 0x601c, 0xa086, 0x0006, 0x0198, 0x00d6, 0x6010, 0x2068, 0x080c, ++ 0xac91, 0x0110, 0x080c, 0xaf09, 0x00de, 0x6007, 0x0085, 0x6003, ++ 0x000b, 0x601f, 0x0002, 0x080c, 0x7999, 0x080c, 0x7e94, 0xa085, ++ 0x0001, 0x0005, 0x080c, 0x1953, 0x0c08, 0x00e6, 0x2071, 0xc927, ++ 0x7024, 0xac06, 0x1110, 0x080c, 0x8dee, 0x601c, 0xa084, 0x000f, ++ 0xa086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, 0x2c40, ++ 0x080c, 0x8fc9, 0x009e, 0x008e, 0x0010, 0x080c, 0x8ced, 0x00ee, ++ 0x1928, 0x080c, 0xa986, 0x0005, 0x0036, 0x00e6, 0x2071, 0xc927, ++ 0x703c, 0xac06, 0x1140, 0x2019, 0x0000, 0x080c, 0x8e79, 0x00ee, ++ 0x003e, 0x0804, 0xa9c6, 0x080c, 0x90f6, 0x00ee, 0x003e, 0x1904, ++ 0xa9c6, 0x080c, 0xa986, 0x0005, 0x00c6, 0x601c, 0xa084, 0x000f, ++ 0x0013, 0x00ce, 0x0005, 0xaa35, 0xaaa2, 0xabf0, 0xaa40, 0xae54, ++ 0xaa35, 0xbd47, 0xb185, 0xaaa2, 0x77c3, 0xac5b, 0x080c, 0x1519, ++ 0x080c, 0xae8f, 0x1110, 0x080c, 0x9c09, 0x0005, 0x080c, 0x7db1, ++ 0x080c, 0x7e94, 0x080c, 0x95e3, 0x0005, 0x6017, 0x0001, 0x0005, ++ 0x080c, 0xac91, 0x0120, 0x6010, 0xa080, 0x0019, 0x2c02, 0x6000, ++ 0xa08a, 0x0010, 0x1a0c, 0x1519, 0x000b, 0x0005, 0xaa5e, 0xaa60, ++ 0xaa80, 0xaa92, 0xaa9f, 0xaa5e, 0xaa35, 0xaa35, 0xaa35, 0xaa92, ++ 0xaa92, 0xaa5e, 0xaa5e, 0xaa5e, 0xaa5e, 0xaa9c, 0x080c, 0x1519, ++ 0x00e6, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052, 0x2071, 0xc927, ++ 0x7024, 0xac06, 0x0190, 0x080c, 0x8ced, 0x6007, 0x0085, 0x6003, ++ 0x000b, 0x601f, 0x0002, 0x2001, 0xc8fe, 0x2004, 0x6016, 0x080c, ++ 0x7999, 0x080c, 0x7e94, 0x00ee, 0x0005, 0x6017, 0x0001, 0x0cd8, ++ 0x00d6, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x00de, 0x6007, ++ 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x7999, 0x080c, ++ 0x7e94, 0x0005, 0x00d6, 0x6017, 0x0001, 0x6010, 0x2068, 0x6850, ++ 0xc0b5, 0x6852, 0x00de, 0x0005, 0x080c, 0x95e3, 0x0005, 0x080c, ++ 0x1953, 0x08f0, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519, 0x000b, ++ 0x0005, 0xaab9, 0xaa3d, 0xaabb, 0xaab9, 0xaabb, 0xaabb, 0xaa36, ++ 0xaab9, 0xaa30, 0xaa30, 0xaab9, 0xaab9, 0xaab9, 0xaab9, 0xaab9, ++ 0xaab9, 0x080c, 0x1519, 0x00d6, 0x6018, 0x2068, 0x6804, 0xa084, ++ 0x00ff, 0x00de, 0xa08a, 0x000c, 0x1a0c, 0x1519, 0x000b, 0x0005, ++ 0xaad4, 0xab96, 0xaad6, 0xab14, 0xaad6, 0xab14, 0xaad6, 0xaae4, ++ 0xaad4, 0xab14, 0xaad4, 0xab00, 0x080c, 0x1519, 0x6004, 0xa08e, ++ 0x0016, 0x05a8, 0xa08e, 0x0004, 0x0590, 0xa08e, 0x0002, 0x0578, ++ 0xa08e, 0x004b, 0x0904, 0xab92, 0x6004, 0x080c, 0xae8f, 0x0904, ++ 0xabaf, 0xa08e, 0x0021, 0x0904, 0xabb3, 0xa08e, 0x0022, 0x0904, ++ 0xabaf, 0xa08e, 0x003d, 0x0904, 0xabb3, 0xa08e, 0x0039, 0x0904, ++ 0xabb7, 0xa08e, 0x0035, 0x0904, 0xabb7, 0xa08e, 0x001e, 0x0188, ++ 0xa08e, 0x0001, 0x1150, 0x00d6, 0x6018, 0x2068, 0x6804, 0xa084, ++ 0x00ff, 0x00de, 0xa086, 0x0006, 0x0110, 0x080c, 0x2e46, 0x080c, ++ 0x9c09, 0x080c, 0xae54, 0x0005, 0x00c6, 0x00d6, 0x6104, 0xa186, ++ 0x0016, 0x0904, 0xab83, 0xa186, 0x0002, 0x15d8, 0x2001, 0xc635, ++ 0x2004, 0xd08c, 0x1198, 0x080c, 0x5f22, 0x1180, 0x2001, 0xc8e6, ++ 0x2003, 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, ++ 0x080c, 0x5f66, 0x080c, 0x5e5a, 0x0804, 0xabd9, 0x6018, 0x2068, ++ 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1904, 0xabd9, 0x68a0, 0xd0bc, ++ 0x1904, 0xabd9, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0190, 0x8001, ++ 0x6842, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017, 0x0398, 0x603f, ++ 0x0000, 0x080c, 0x958d, 0x0128, 0x2d00, 0x601a, 0x601f, 0x0001, ++ 0x0450, 0x00de, 0x00ce, 0x6004, 0xa08e, 0x0002, 0x11a8, 0x6018, ++ 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x1170, 0x2009, 0xc635, ++ 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0xc600, 0x080c, 0x4f02, ++ 0x00ee, 0x080c, 0x9c09, 0x0020, 0x080c, 0x9c09, 0x080c, 0x2e46, ++ 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2e6c, 0x012e, 0x00ee, ++ 0x080c, 0xae54, 0x0005, 0x2001, 0x0002, 0x080c, 0x5291, 0x6003, ++ 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, 0x080c, 0x7e94, 0x00de, ++ 0x00ce, 0x0c80, 0x080c, 0x2e6c, 0x0804, 0xab0f, 0x00c6, 0x00d6, ++ 0x6104, 0xa186, 0x0016, 0x0d38, 0x6018, 0x2068, 0x6840, 0xa084, ++ 0x00ff, 0xa005, 0x0904, 0xab59, 0x8001, 0x6842, 0x6003, 0x0001, ++ 0x080c, 0x79df, 0x080c, 0x7e94, 0x00de, 0x00ce, 0x0898, 0x080c, ++ 0x9c09, 0x0804, 0xab11, 0x080c, 0x9c37, 0x0804, 0xab11, 0x00d6, ++ 0x2c68, 0x6104, 0x080c, 0xb141, 0x00de, 0x0118, 0x080c, 0x95e3, ++ 0x00b8, 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105, 0x6032, ++ 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x6038, 0x600a, ++ 0x2001, 0xc8fe, 0x2004, 0x6016, 0x080c, 0x7999, 0x080c, 0x7e94, ++ 0x0005, 0x00de, 0x00ce, 0x080c, 0x9c09, 0x080c, 0x2e46, 0x00e6, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x2e6c, 0x6013, 0x0000, 0x601f, ++ 0x0007, 0x6017, 0x0398, 0x603f, 0x0000, 0x012e, 0x00ee, 0x0005, ++ 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519, 0x000b, 0x0005, 0xac07, ++ 0xac07, 0xac07, 0xac07, 0xac07, 0xac07, 0xac07, 0xac07, 0xac07, ++ 0xaa35, 0xac07, 0xaa3d, 0xac09, 0xaa3d, 0xac16, 0xac07, 0x080c, ++ 0x1519, 0x6004, 0xa086, 0x008b, 0x0148, 0x6007, 0x008b, 0x6003, ++ 0x000d, 0x080c, 0x7999, 0x080c, 0x7e94, 0x0005, 0x080c, 0xae48, ++ 0x080c, 0xac91, 0x0580, 0x080c, 0x2e46, 0x00d6, 0x080c, 0xac91, ++ 0x0168, 0x6010, 0x2068, 0x6837, 0x0103, 0x684b, 0x0006, 0x6847, ++ 0x0000, 0x6850, 0xc0ed, 0x6852, 0x080c, 0x580a, 0x2c68, 0x080c, ++ 0x958d, 0x0150, 0x6818, 0x601a, 0x080c, 0xb05e, 0x00c6, 0x2d60, ++ 0x080c, 0xae54, 0x00ce, 0x0008, 0x2d60, 0x00de, 0x6013, 0x0000, ++ 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x79df, ++ 0x080c, 0x7e94, 0x0078, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, ++ 0x0039, 0x0118, 0xa186, 0x0035, 0x1118, 0x080c, 0x2e46, 0x08b0, ++ 0x080c, 0xae54, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519, ++ 0x000b, 0x0005, 0xac72, 0xac72, 0xac72, 0xac74, 0xac74, 0xac72, ++ 0xac72, 0xac72, 0xac72, 0xac72, 0xac72, 0xac72, 0xac72, 0xac72, ++ 0xac72, 0xac72, 0x080c, 0x1519, 0x080c, 0x90f6, 0x190c, 0x1519, ++ 0x6110, 0x2168, 0x684b, 0x0006, 0x080c, 0x580a, 0x080c, 0x95e3, ++ 0x0005, 0xa284, 0x0007, 0x1158, 0xa282, 0xce00, 0x0240, 0x2001, ++ 0xc617, 0x2004, 0xa202, 0x1218, 0xa085, 0x0001, 0x0005, 0xa006, ++ 0x0ce8, 0x0026, 0x6210, 0xa294, 0xf000, 0x002e, 0x0005, 0x00e6, ++ 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, 0xce00, ++ 0x2071, 0xc600, 0x7348, 0x7068, 0xa302, 0x12a8, 0x601c, 0xa206, ++ 0x1160, 0x080c, 0xafe9, 0x0148, 0x080c, 0xae8f, 0x1110, 0x080c, ++ 0x9c09, 0x00c6, 0x080c, 0x95e3, 0x00ce, 0xace0, 0x0018, 0x705c, ++ 0xac02, 0x1208, 0x0c38, 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee, ++ 0x0005, 0x00e6, 0x00c6, 0x0016, 0xa188, 0xc77b, 0x210c, 0x81ff, ++ 0x0128, 0x2061, 0xca3c, 0x611a, 0x080c, 0x2e46, 0xa006, 0x0010, ++ 0xa085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0056, ++ 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x958d, 0x005e, 0x0180, ++ 0x6612, 0x651a, 0x080c, 0xb05e, 0x601f, 0x0003, 0x2009, 0x004b, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, ++ 0xa006, 0x0cd0, 0x00c6, 0x0056, 0x0126, 0x2091, 0x8000, 0x62a0, ++ 0x00c6, 0x080c, 0xaf0d, 0x005e, 0x0550, 0x6013, 0x0000, 0x651a, ++ 0x080c, 0xb05e, 0x601f, 0x0003, 0x0016, 0x00c6, 0x2560, 0x080c, ++ 0x553e, 0x00ce, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, ++ 0x7a0e, 0x2c08, 0x080c, 0xbef7, 0x007e, 0x001e, 0xd184, 0x0128, ++ 0x080c, 0x95e3, 0xa085, 0x0001, 0x0030, 0x2009, 0x004c, 0x080c, ++ 0x9613, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, 0xa006, ++ 0x0cd0, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x958d, 0x2c78, ++ 0x00ce, 0x0180, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, ++ 0x0005, 0x080c, 0xad87, 0x2f60, 0x2009, 0x004d, 0x080c, 0x9613, ++ 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, ++ 0x0046, 0x00c6, 0x080c, 0x958d, 0x2c78, 0x00ce, 0x0178, 0x7e12, ++ 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, 0x0005, 0x0481, 0x2f60, ++ 0x2009, 0x004e, 0x080c, 0x9613, 0xa085, 0x0001, 0x004e, 0x00ce, ++ 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x958d, ++ 0x2c78, 0x00ce, 0x01c0, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, ++ 0x2021, 0x0004, 0x00a1, 0x2001, 0xc8e7, 0x2004, 0xd0fc, 0x0120, ++ 0x2f60, 0x080c, 0x95e3, 0x0028, 0x2f60, 0x2009, 0x0052, 0x080c, ++ 0x9613, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x0096, ++ 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x54e0, 0x0118, 0x2001, ++ 0xad8c, 0x0028, 0x080c, 0x54b0, 0x0158, 0x2001, 0xad92, 0x0006, ++ 0xa00e, 0x2400, 0x080c, 0x592e, 0x080c, 0x580a, 0x000e, 0x0807, ++ 0x2418, 0x080c, 0x7d50, 0x62a0, 0x0086, 0x2041, 0x0001, 0x2039, ++ 0x0001, 0x2608, 0x080c, 0x7b2f, 0x008e, 0x080c, 0x7a0e, 0x2f08, ++ 0x2648, 0x080c, 0xbef7, 0x613c, 0x81ff, 0x090c, 0x7be4, 0x080c, ++ 0x7e94, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, ++ 0x8000, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0188, 0x660a, 0x611a, ++ 0x080c, 0xb05e, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x001f, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, ++ 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x958d, ++ 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0008, ++ 0x2d00, 0x6012, 0x2009, 0x0021, 0x080c, 0x9613, 0xa085, 0x0001, ++ 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, ++ 0x8000, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0188, 0x660a, 0x611a, ++ 0x080c, 0xb05e, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x003d, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, ++ 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0xaf0d, ++ 0x001e, 0x0180, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0001, 0x2d00, ++ 0x6012, 0x2009, 0x0000, 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, ++ 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, ++ 0x00c6, 0x080c, 0x958d, 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, ++ 0xb05e, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0044, 0x080c, ++ 0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, ++ 0x0026, 0x00d6, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, ++ 0x6a3e, 0x00de, 0x002e, 0x0005, 0x0006, 0x6000, 0xa086, 0x0000, ++ 0x0190, 0x6013, 0x0000, 0x601f, 0x0007, 0x2001, 0xc8fd, 0x2004, ++ 0x0006, 0xa082, 0x0051, 0x000e, 0x0208, 0x8004, 0x6016, 0x080c, ++ 0xc3e2, 0x603f, 0x0000, 0x000e, 0x0005, 0x0066, 0x00c6, 0x00d6, ++ 0x2031, 0xc653, 0x2634, 0xd6e4, 0x0128, 0x6618, 0x2660, 0x6e48, ++ 0x080c, 0x5469, 0x00de, 0x00ce, 0x006e, 0x0005, 0x0006, 0x0016, ++ 0x6004, 0xa08e, 0x0002, 0x0140, 0xa08e, 0x0003, 0x0128, 0xa08e, ++ 0x0004, 0x0110, 0xa085, 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, ++ 0x00d6, 0x6010, 0xa06d, 0x0148, 0x6834, 0xa086, 0x0139, 0x0138, ++ 0x6838, 0xd0fc, 0x0110, 0xa006, 0x0010, 0xa085, 0x0001, 0x00de, ++ 0x000e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, ++ 0x958d, 0x001e, 0x0190, 0x611a, 0x080c, 0xb05e, 0x601f, 0x0001, ++ 0x2d00, 0x6012, 0x080c, 0x2e46, 0x2009, 0x0028, 0x080c, 0x9613, ++ 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0xa186, ++ 0x0015, 0x1178, 0x2011, 0xc621, 0x2204, 0xa086, 0x0074, 0x1148, ++ 0x080c, 0x9fb9, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, 0x79df, ++ 0x0020, 0x080c, 0x9c09, 0x080c, 0x95e3, 0x0005, 0xa186, 0x0016, ++ 0x1128, 0x2001, 0x0004, 0x080c, 0x5291, 0x00e8, 0xa186, 0x0015, ++ 0x11e8, 0x2011, 0xc621, 0x2204, 0xa086, 0x0014, 0x11b8, 0x00d6, ++ 0x6018, 0x2068, 0x080c, 0x53df, 0x00de, 0x080c, 0xa072, 0x1170, ++ 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, 0x0138, 0x2001, ++ 0x0006, 0x080c, 0x5291, 0x080c, 0x9767, 0x0020, 0x080c, 0x9c09, ++ 0x080c, 0x95e3, 0x0005, 0x6848, 0xa086, 0x0005, 0x1108, 0x0009, ++ 0x0005, 0x6850, 0xc0ad, 0x6852, 0x0005, 0x00e6, 0x0126, 0x2071, ++ 0xc600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0001, 0x0608, 0x704c, ++ 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0, 0x0018, 0x705c, ++ 0xac02, 0x1208, 0x0cb0, 0x2061, 0xce00, 0x0c98, 0x6003, 0x0008, ++ 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502, 0x1230, 0x754e, ++ 0xa085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x704f, 0xce00, 0x0cc0, ++ 0xa006, 0x0cc0, 0x00e6, 0x2071, 0xcc8c, 0x7014, 0xd0e4, 0x0150, ++ 0x6013, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x7999, ++ 0x080c, 0x7e94, 0x00ee, 0x0005, 0x00c6, 0x00f6, 0x2c78, 0x080c, ++ 0x56c3, 0x00fe, 0x0120, 0x601c, 0xa084, 0x000f, 0x0013, 0x00ce, ++ 0x0005, 0xaa35, 0xaf64, 0xaf67, 0xaf6a, 0xc1cf, 0xc1ea, 0xc1ed, ++ 0xaa35, 0xaa35, 0x080c, 0x1519, 0xe000, 0xe000, 0x0005, 0xe000, ++ 0xe000, 0x0005, 0x0009, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x56c3, ++ 0x0538, 0x080c, 0x958d, 0x1128, 0x2001, 0xc8ff, 0x2004, 0x783e, ++ 0x00f8, 0x7818, 0x601a, 0x080c, 0xb05e, 0x781c, 0xa086, 0x0003, ++ 0x0128, 0x7808, 0x6036, 0x2f00, 0x603a, 0x0020, 0x7808, 0x603a, ++ 0x2f00, 0x6036, 0x602a, 0x601f, 0x0001, 0x6007, 0x0035, 0x6003, ++ 0x0001, 0x7950, 0x6152, 0x080c, 0x7999, 0x080c, 0x7e94, 0x2f60, ++ 0x00fe, 0x0005, 0x0016, 0x00f6, 0x682c, 0x6032, 0xa08e, 0x0001, ++ 0x0138, 0xa086, 0x0005, 0x0140, 0xa006, 0x602a, 0x602e, 0x00a0, ++ 0x6820, 0xc0f4, 0xc0d5, 0x6822, 0x6810, 0x2078, 0x787c, 0x6938, ++ 0xa102, 0x7880, 0x6934, 0xa103, 0x1e78, 0x6834, 0x602a, 0x6838, ++ 0xa084, 0xfffc, 0x683a, 0x602e, 0x2d00, 0x6036, 0x6808, 0x603a, ++ 0x6918, 0x611a, 0x6950, 0x6152, 0x601f, 0x0001, 0x6007, 0x0039, ++ 0x6003, 0x0001, 0x080c, 0x7999, 0x6803, 0x0002, 0x00fe, 0x001e, ++ 0x0005, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x1118, 0xa085, 0x0001, ++ 0x0070, 0x6020, 0xd0f4, 0x1150, 0xc0f5, 0x6022, 0x6010, 0x2078, ++ 0x7828, 0x603a, 0x782c, 0x6036, 0x080c, 0x1953, 0xa006, 0x00fe, ++ 0x0005, 0x0006, 0x0016, 0x6004, 0xa08e, 0x0034, 0x01b8, 0xa08e, ++ 0x0035, 0x01a0, 0xa08e, 0x0036, 0x0188, 0xa08e, 0x0037, 0x0170, ++ 0xa08e, 0x0038, 0x0158, 0xa08e, 0x0039, 0x0140, 0xa08e, 0x003a, ++ 0x0128, 0xa08e, 0x003b, 0x0110, 0xa085, 0x0001, 0x001e, 0x000e, ++ 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x2001, 0xc8f9, ++ 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x783f, 0x2001, ++ 0xc8fd, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0xc8fb, ++ 0x200c, 0x8000, 0x2014, 0x2071, 0xc8d5, 0x711a, 0x721e, 0x2001, ++ 0x0064, 0x080c, 0x783f, 0x2001, 0xc8fe, 0x82ff, 0x1110, 0x2011, ++ 0x0014, 0x2202, 0x2009, 0xc8ff, 0xa280, 0x000a, 0x200a, 0x080c, ++ 0x572c, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, ++ 0x00e6, 0x2001, 0xc8fd, 0x2003, 0x0028, 0x2001, 0xc8fe, 0x2003, ++ 0x0014, 0x2071, 0xc8d5, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, ++ 0xc8ff, 0x2003, 0x001e, 0x00ee, 0x000e, 0x0005, 0x00d6, 0x6054, ++ 0xa06d, 0x0110, 0x080c, 0x1619, 0x00de, 0x0005, 0x0005, 0x00c6, ++ 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0178, ++ 0x611a, 0x0ca1, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0033, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, ++ 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xc600, 0xa186, 0x0015, ++ 0x1500, 0x7084, 0xa086, 0x0018, 0x11e0, 0x6010, 0x2068, 0x6a3c, ++ 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x80af, 0x01d8, 0x7070, 0x6a50, ++ 0xa206, 0x1160, 0x7074, 0x6a54, 0xa206, 0x1140, 0x6218, 0xa290, ++ 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2e8b, 0x080c, 0x9767, ++ 0x0020, 0x080c, 0x9c09, 0x080c, 0x95e3, 0x00fe, 0x00ee, 0x00de, ++ 0x0005, 0x7054, 0x6a54, 0xa206, 0x0d48, 0x0c80, 0x00c6, 0x0126, ++ 0x2091, 0x8000, 0x00c6, 0x080c, 0x958d, 0x001e, 0x0180, 0x611a, ++ 0x080c, 0xb05e, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0043, ++ 0x080c, 0x9613, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, ++ 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xc600, 0xa186, 0x0015, ++ 0x11c0, 0x7084, 0xa086, 0x0004, 0x11a0, 0x6010, 0xa0e8, 0x000f, ++ 0x2c78, 0x080c, 0x80af, 0x01a8, 0x7070, 0x6a08, 0xa206, 0x1130, ++ 0x7074, 0x6a0c, 0xa206, 0x1110, 0x080c, 0x2e46, 0x080c, 0x9767, ++ 0x0020, 0x080c, 0x9c09, 0x080c, 0x95e3, 0x00fe, 0x00ee, 0x00de, ++ 0x0005, 0x7054, 0x6a0c, 0xa206, 0x0d78, 0x0c80, 0x0016, 0x0026, ++ 0x684c, 0xd0ac, 0x0178, 0x6914, 0x6a10, 0x2100, 0xa205, 0x0150, ++ 0x6860, 0xa106, 0x1118, 0x685c, 0xa206, 0x0120, 0x6962, 0x6a5e, ++ 0xa085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00d6, 0x0036, 0x6310, ++ 0x2368, 0x684a, 0x6952, 0xa29e, 0x4000, 0x11a0, 0x00c6, 0x6318, ++ 0x2360, 0x2009, 0x0000, 0x6838, 0xd0f4, 0x1140, 0x080c, 0x55de, ++ 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x6a66, 0x696a, ++ 0x00ce, 0x0080, 0x6a66, 0x3918, 0xa398, 0x0006, 0x231c, 0x686b, ++ 0x0004, 0x6b72, 0x00c6, 0x6318, 0x2360, 0x6004, 0xa084, 0x00ff, ++ 0x686e, 0x00ce, 0x080c, 0x580a, 0x6013, 0x0000, 0x003e, 0x00de, ++ 0x0005, 0x00c6, 0x0026, 0x0016, 0xa186, 0x0035, 0x0110, 0x6a34, ++ 0x0008, 0x6a28, 0x080c, 0xac81, 0x01f0, 0x2260, 0x611c, 0xa186, ++ 0x0003, 0x0118, 0xa186, 0x0006, 0x1190, 0x6834, 0xa206, 0x0140, ++ 0x6838, 0xa206, 0x1160, 0x6108, 0x6834, 0xa106, 0x1140, 0x0020, ++ 0x6008, 0x6938, 0xa106, 0x1118, 0x6018, 0x6918, 0xa106, 0x001e, ++ 0x002e, 0x00ce, 0x0005, 0xa085, 0x0001, 0x0cc8, 0x6944, 0xd1cc, ++ 0x0198, 0xa18c, 0x00ff, 0xa18e, 0x0002, 0x1170, 0xad88, 0x001e, ++ 0x210c, 0xa18c, 0x0f00, 0x810f, 0xa18e, 0x0001, 0x1128, 0x6810, ++ 0x6914, 0xa115, 0x190c, 0xa4ba, 0x0005, 0x080c, 0x95e3, 0x0804, ++ 0x7e94, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, ++ 0x006e, 0x0005, 0xb1a2, 0xb6b9, 0xb7e1, 0xb1a2, 0xb1a2, 0xb1a2, ++ 0xb1a2, 0xb1a2, 0xb1da, 0xb865, 0xb1a2, 0xb1a2, 0xb1a2, 0xb1a2, ++ 0xb1a2, 0xb1a2, 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, 0x0010, ++ 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, 0xb1bd, 0xbcec, 0xb1bd, ++ 0xb1bd, 0xb1bd, 0xb1bd, 0xb1bd, 0xb1bd, 0xbcae, 0xbd34, 0xb1bd, ++ 0xc314, 0xc344, 0xc314, 0xc344, 0xb1bd, 0x080c, 0x1519, 0x0066, ++ 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, ++ 0xb1d8, 0xb9b5, 0xba82, 0xbaaf, 0xbb33, 0xb1d8, 0xbc20, 0xbbcb, ++ 0xb871, 0xbc84, 0xbc99, 0xb1d8, 0xb1d8, 0xb1d8, 0xb1d8, 0xb1d8, ++ 0x080c, 0x1519, 0xa1b2, 0x0080, 0x1a0c, 0x1519, 0x2100, 0xa1b2, ++ 0x0040, 0x1a04, 0xb5f1, 0x0002, 0xb224, 0xb3ef, 0xb224, 0xb224, ++ 0xb224, 0xb3f6, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, ++ 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, ++ 0xb224, 0xb224, 0xb224, 0xb226, 0xb284, 0xb293, 0xb2e1, 0xb2ff, ++ 0xb37d, 0xb3dc, 0xb224, 0xb224, 0xb3f9, 0xb224, 0xb224, 0xb40c, ++ 0xb417, 0xb224, 0xb224, 0xb224, 0xb224, 0xb224, 0xb4a2, 0xb224, ++ 0xb224, 0xb4b5, 0xb224, 0xb224, 0xb46d, 0xb224, 0xb224, 0xb224, ++ 0xb4cd, 0xb224, 0xb224, 0xb224, 0xb547, 0xb224, 0xb224, 0xb224, ++ 0xb224, 0xb224, 0xb224, 0xb5b8, 0x080c, 0x1519, 0x080c, 0x570b, ++ 0x1150, 0x2001, 0xc635, 0x2004, 0xd0cc, 0x1128, 0xa084, 0x0009, ++ 0xa086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, ++ 0x0000, 0x0804, 0xb3ea, 0x080c, 0x568d, 0x00e6, 0x00c6, 0x0036, ++ 0x0026, 0x0016, 0x6218, 0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, ++ 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, 0x2c08, ++ 0x080c, 0xbef7, 0x007e, 0x001e, 0x2e60, 0x080c, 0x553e, 0x001e, ++ 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6618, 0x00c6, 0x2660, 0x080c, ++ 0x534c, 0x00ce, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, ++ 0x0006, 0x0278, 0x080c, 0xbe3b, 0x1904, 0xb2db, 0x080c, 0xbddb, ++ 0x1120, 0x6007, 0x0008, 0x0804, 0xb3ea, 0x6007, 0x0009, 0x0804, ++ 0xb3ea, 0x080c, 0xc023, 0x0128, 0x080c, 0xbe3b, 0x0d78, 0x0804, ++ 0xb2db, 0x6013, 0x1900, 0x0c88, 0x080c, 0x2f69, 0x1904, 0xb5ee, ++ 0x6106, 0x080c, 0xbd95, 0x6007, 0x0006, 0x0804, 0xb3ea, 0x6007, ++ 0x0007, 0x0804, 0xb3ea, 0x080c, 0xc378, 0x1904, 0xb5ee, 0x080c, ++ 0x2f69, 0x1904, 0xb5ee, 0x00d6, 0x6618, 0x2668, 0x6e04, 0xa684, ++ 0x00ff, 0xa082, 0x0006, 0x1220, 0x2001, 0x0001, 0x080c, 0x527f, ++ 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0188, 0xa686, 0x0004, ++ 0x0170, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0140, 0xa686, ++ 0x0004, 0x0128, 0xa686, 0x0005, 0x0110, 0x00de, 0x00e0, 0x080c, ++ 0xbe99, 0x11a0, 0xa686, 0x0006, 0x1150, 0x0026, 0x6218, 0xa290, ++ 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2e8b, 0x002e, 0x080c, ++ 0x53df, 0x6007, 0x000a, 0x00de, 0x0804, 0xb3ea, 0x6007, 0x000b, ++ 0x00de, 0x0804, 0xb3ea, 0x080c, 0x2e46, 0x6007, 0x0001, 0x0804, ++ 0xb3ea, 0x080c, 0xc378, 0x1904, 0xb5ee, 0x080c, 0x2f69, 0x1904, ++ 0xb5ee, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de, 0xa686, 0x0707, ++ 0x0d50, 0x0026, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, ++ 0x080c, 0x2e8b, 0x002e, 0x6007, 0x000c, 0x0804, 0xb3ea, 0x080c, ++ 0x570b, 0x1140, 0x2001, 0xc635, 0x2004, 0xa084, 0x0009, 0xa086, ++ 0x0008, 0x1110, 0x0804, 0xb233, 0x080c, 0x568d, 0x6618, 0xa6b0, ++ 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x06e8, 0x1138, ++ 0x0026, 0x2001, 0x0006, 0x080c, 0x52be, 0x002e, 0x0050, 0xa6b4, ++ 0xff00, 0x8637, 0xa686, 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, ++ 0xb2db, 0x080c, 0xbea6, 0x1120, 0x6007, 0x000e, 0x0804, 0xb3ea, ++ 0x0046, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, ++ 0x0046, 0x080c, 0x2e46, 0x004e, 0x0016, 0xa006, 0x2009, 0xc653, ++ 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xc190, 0x6018, ++ 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, 0x004e, ++ 0x6007, 0x0001, 0x0804, 0xb3ea, 0x2001, 0x0001, 0x080c, 0x527f, ++ 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xc605, ++ 0x2011, 0xcc90, 0x080c, 0xa103, 0x003e, 0x002e, 0x001e, 0x015e, ++ 0xa005, 0x0168, 0xa6b4, 0xff00, 0x8637, 0xa682, 0x0004, 0x0a04, ++ 0xb2db, 0xa682, 0x0007, 0x0a04, 0xb329, 0x0804, 0xb2db, 0x6013, ++ 0x1900, 0x6007, 0x0009, 0x0804, 0xb3ea, 0x080c, 0x570b, 0x1140, ++ 0x2001, 0xc635, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, 0x1110, ++ 0x0804, 0xb233, 0x080c, 0x568d, 0x6618, 0xa6b0, 0x0001, 0x2634, ++ 0xa684, 0x00ff, 0xa082, 0x0006, 0x06b8, 0xa6b4, 0xff00, 0x8637, ++ 0xa686, 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, 0xb2db, 0x080c, ++ 0xbece, 0x1138, 0x080c, 0xbddb, 0x1120, 0x6007, 0x0010, 0x0804, ++ 0xb3ea, 0x0046, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, ++ 0x8427, 0x0046, 0x080c, 0x2e46, 0x004e, 0x0016, 0xa006, 0x2009, ++ 0xc653, 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xc190, ++ 0x6018, 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, ++ 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xc023, 0x0140, 0xa6b4, ++ 0xff00, 0x8637, 0xa686, 0x0006, 0x0950, 0x0804, 0xb2db, 0x6013, ++ 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x2f69, 0x1904, 0xb5ee, ++ 0x080c, 0xc378, 0x1904, 0xb5ee, 0x080c, 0xb652, 0x1904, 0xb2db, ++ 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x79df, 0x0005, 0x6007, ++ 0x0001, 0x6003, 0x0001, 0x080c, 0x79df, 0x0cc0, 0x6007, 0x0005, ++ 0x0cc0, 0x080c, 0xc378, 0x1904, 0xb5ee, 0x080c, 0x2f69, 0x1904, ++ 0xb5ee, 0x080c, 0xb652, 0x1904, 0xb2db, 0x6007, 0x0020, 0x6003, ++ 0x0001, 0x080c, 0x79df, 0x0005, 0x080c, 0x2f69, 0x1904, 0xb5ee, ++ 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x79df, 0x0005, 0x080c, ++ 0xc378, 0x1904, 0xb5ee, 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x080c, ++ 0xb652, 0x1904, 0xb2db, 0x0016, 0x0026, 0x2011, 0xcc91, 0x2214, ++ 0xa286, 0xffff, 0x0190, 0x2c08, 0x080c, 0xac81, 0x01e0, 0x2260, ++ 0x2011, 0xcc90, 0x2214, 0x6008, 0xa206, 0x11a8, 0x6018, 0xa190, ++ 0x0006, 0x2214, 0xa206, 0x01e8, 0x0070, 0x2011, 0xcc90, 0x2214, ++ 0x2c08, 0xa006, 0x080c, 0xc162, 0x11a0, 0x2011, 0xcc91, 0x2214, ++ 0xa286, 0xffff, 0x01c0, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700, ++ 0x2011, 0xcc89, 0x2214, 0xa296, 0xffff, 0x1180, 0x6007, 0x0025, ++ 0x0068, 0x601c, 0xa086, 0x0007, 0x1d70, 0x6004, 0xa086, 0x0024, ++ 0x1110, 0x080c, 0x95e3, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, ++ 0x080c, 0x79df, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, ++ 0x527f, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, ++ 0xc605, 0x2011, 0xcc96, 0x080c, 0xa103, 0x003e, 0x002e, 0x001e, ++ 0x015e, 0x0120, 0x6007, 0x0031, 0x0804, 0xb3ea, 0x080c, 0x9df5, ++ 0x080c, 0x5f22, 0x11b0, 0x0006, 0x0026, 0x0036, 0x080c, 0x5f3e, ++ 0x1158, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, 0x2003, ++ 0x0001, 0x080c, 0x5e5a, 0x0010, 0x080c, 0x5ef9, 0x003e, 0x002e, ++ 0x000e, 0x0005, 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x080c, 0xb652, ++ 0x1904, 0xb2db, 0x6106, 0x080c, 0xb66e, 0x6007, 0x002b, 0x0804, ++ 0xb3ea, 0x6007, 0x002c, 0x0804, 0xb3ea, 0x080c, 0xc378, 0x1904, ++ 0xb5ee, 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x080c, 0xb652, 0x1904, ++ 0xb2db, 0x6106, 0x080c, 0xb672, 0x1120, 0x6007, 0x002e, 0x0804, ++ 0xb3ea, 0x6007, 0x002f, 0x0804, 0xb3ea, 0x080c, 0x2f69, 0x1904, ++ 0xb5ee, 0x00e6, 0x00d6, 0x00c6, 0x6018, 0xa080, 0x0001, 0x200c, ++ 0xa184, 0x00ff, 0xa086, 0x0006, 0x0158, 0xa184, 0xff00, 0x8007, ++ 0xa086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, 0xb3ef, ++ 0x2001, 0xc672, 0x2004, 0xd0e4, 0x0904, 0xb544, 0x2071, 0xcc8c, ++ 0x7010, 0x6036, 0x7014, 0x603a, 0x7108, 0x720c, 0x2001, 0xc653, ++ 0x2004, 0xd0a4, 0x0140, 0x6018, 0x2068, 0x6810, 0xa106, 0x1118, ++ 0x6814, 0xa206, 0x01f8, 0x2001, 0xc653, 0x2004, 0xd0ac, 0x1590, ++ 0x2069, 0xc600, 0x6874, 0xa206, 0x1568, 0x6870, 0xa106, 0x1550, ++ 0x7210, 0x080c, 0xac81, 0x0558, 0x080c, 0xc1fc, 0x0540, 0x622a, ++ 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x7999, 0x00ce, 0x00de, ++ 0x00ee, 0x0005, 0x7214, 0xa286, 0xffff, 0x0150, 0x080c, 0xac81, ++ 0x01b0, 0xa280, 0x0002, 0x2004, 0x7110, 0xa106, 0x1180, 0x0c08, ++ 0x7210, 0x2c08, 0xa085, 0x0001, 0x080c, 0xc162, 0x2c10, 0x2160, ++ 0x0130, 0x08b8, 0x6007, 0x0037, 0x6013, 0x1500, 0x08d8, 0x6007, ++ 0x0037, 0x6013, 0x1700, 0x08b0, 0x6007, 0x0012, 0x0898, 0x080c, ++ 0x2f69, 0x1904, 0xb5ee, 0x6018, 0xa080, 0x0001, 0x2004, 0xa084, ++ 0xff00, 0x8007, 0xa086, 0x0006, 0x1904, 0xb3ef, 0x00e6, 0x00d6, ++ 0x00c6, 0x2001, 0xc672, 0x2004, 0xd0e4, 0x0904, 0xb5b0, 0x2069, ++ 0xc600, 0x2071, 0xcc8c, 0x7008, 0x6036, 0x720c, 0x623a, 0xa286, ++ 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0xa085, 0x0001, 0x080c, ++ 0xc162, 0x2c10, 0x00ce, 0x0588, 0x080c, 0xac81, 0x0570, 0x00c6, ++ 0x0026, 0x2260, 0x080c, 0xa954, 0x002e, 0x00ce, 0x7118, 0xa18c, ++ 0xff00, 0x810f, 0xa186, 0x0001, 0x0158, 0xa186, 0x0005, 0x0118, ++ 0xa186, 0x0007, 0x1178, 0xa280, 0x0004, 0x2004, 0xa005, 0x0150, ++ 0x0056, 0x7510, 0x7614, 0x080c, 0xc213, 0x005e, 0x00ce, 0x00de, ++ 0x00ee, 0x0005, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, ++ 0x6003, 0x0001, 0x080c, 0x7999, 0x0c88, 0x6007, 0x003b, 0x602b, ++ 0x0009, 0x6013, 0x1700, 0x6003, 0x0001, 0x080c, 0x7999, 0x0c30, ++ 0x6007, 0x003b, 0x602b, 0x000b, 0x6013, 0x0000, 0x0804, 0xb51a, ++ 0x00e6, 0x0026, 0x080c, 0x570b, 0x0558, 0x080c, 0x568d, 0x080c, ++ 0xc3f3, 0x1520, 0x2071, 0xc600, 0x70d4, 0xc085, 0x70d6, 0x00f6, ++ 0x2079, 0x0100, 0x72a0, 0xa284, 0x00ff, 0x7072, 0x78e6, 0xa284, ++ 0xff00, 0x7274, 0xa205, 0x7076, 0x78ea, 0x00fe, 0x70df, 0x0000, ++ 0x2001, 0xc653, 0x2004, 0xd0a4, 0x0120, 0x2011, 0xc940, 0x2013, ++ 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2c62, 0x0010, 0x080c, 0xc41f, ++ 0x002e, 0x00ee, 0x080c, 0x95e3, 0x0804, 0xb3ee, 0x080c, 0x95e3, ++ 0x0005, 0x2600, 0x0002, 0xb5fc, 0xb630, 0xb641, 0xb5fc, 0xb5fc, ++ 0xb5fe, 0xb617, 0xb5fc, 0xb5fc, 0x080c, 0x1519, 0x080c, 0xc378, ++ 0x1d68, 0x080c, 0x2f69, 0x1d50, 0x080c, 0xb652, 0x1138, 0x6007, ++ 0x0045, 0x6003, 0x0001, 0x080c, 0x79df, 0x0005, 0x080c, 0x2e46, ++ 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x79df, 0x0005, 0x080c, ++ 0x2f69, 0x19a0, 0x080c, 0x768f, 0x1160, 0x2e00, 0xa080, 0x0010, ++ 0x2004, 0x8007, 0xd084, 0x0110, 0x080c, 0xc428, 0x080c, 0x95e3, ++ 0x0005, 0x2009, 0x0046, 0x080c, 0xc44e, 0x080c, 0x95e3, 0x0005, ++ 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x2009, 0x0041, 0x080c, 0xc44e, ++ 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x79df, 0x080c, 0x7e94, ++ 0x0005, 0x080c, 0x2f69, 0x1904, 0xb5ee, 0x2009, 0x0042, 0x080c, ++ 0xc44e, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x79df, 0x080c, ++ 0x7e94, 0x0005, 0x00d6, 0x0066, 0x6618, 0x2668, 0x6e04, 0xa6b4, ++ 0xff00, 0x8637, 0xa686, 0x0006, 0x0170, 0xa686, 0x0004, 0x0158, ++ 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0128, 0xa686, 0x0004, ++ 0x0110, 0xa085, 0x0001, 0x006e, 0x00de, 0x0005, 0x00d6, 0x0449, ++ 0x00de, 0x0005, 0x00d6, 0x0491, 0x11f0, 0x680c, 0xa08c, 0xff00, ++ 0x6820, 0xa084, 0x00ff, 0xa115, 0x6212, 0x6824, 0x602a, 0xd1e4, ++ 0x0118, 0x2009, 0x0001, 0x0060, 0xd1ec, 0x0168, 0x6920, 0xa18c, ++ 0x00ff, 0x6824, 0x080c, 0x29c7, 0x1130, 0x2110, 0x2009, 0x0000, ++ 0x080c, 0x2e8b, 0x0018, 0xa085, 0x0001, 0x0008, 0xa006, 0x00de, ++ 0x0005, 0x2069, 0xcc8d, 0x6800, 0xa082, 0x0010, 0x1228, 0x6013, ++ 0x0000, 0xa085, 0x0001, 0x0008, 0xa006, 0x0005, 0x6013, 0x0000, ++ 0x2069, 0xcc8c, 0x6808, 0xa084, 0xff00, 0xa086, 0x0800, 0x1140, ++ 0x6800, 0xa084, 0x00ff, 0xa08e, 0x0014, 0x0110, 0xa08e, 0x0010, ++ 0x0005, 0x6004, 0xa0b2, 0x0080, 0x1a0c, 0x1519, 0xa1b6, 0x0013, ++ 0x1130, 0x2008, 0xa1b2, 0x0040, 0x1a04, 0xb7bb, 0x0092, 0xa1b6, ++ 0x0027, 0x0120, 0xa1b6, 0x0014, 0x190c, 0x1519, 0x2001, 0x0007, ++ 0x080c, 0x52be, 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, ++ 0x0005, 0xb719, 0xb71b, 0xb719, 0xb719, 0xb719, 0xb71b, 0xb72d, ++ 0xb7b4, 0xb77d, 0xb7b4, 0xb790, 0xb7b4, 0xb72d, 0xb7b4, 0xb7ac, ++ 0xb7b4, 0xb7ac, 0xb7b4, 0xb7b4, 0xb719, 0xb719, 0xb719, 0xb719, ++ 0xb719, 0xb719, 0xb719, 0xb719, 0xb719, 0xb719, 0xb719, 0xb71b, ++ 0xb719, 0xb7b4, 0xb719, 0xb719, 0xb7b4, 0xb719, 0xb7b1, 0xb7b4, ++ 0xb719, 0xb719, 0xb719, 0xb719, 0xb7b4, 0xb7b4, 0xb719, 0xb7b4, ++ 0xb7b4, 0xb719, 0xb727, 0xb719, 0xb719, 0xb719, 0xb719, 0xb7b0, ++ 0xb7b4, 0xb719, 0xb719, 0xb7b4, 0xb7b4, 0xb719, 0xb719, 0xb719, ++ 0xb719, 0x080c, 0x1519, 0x080c, 0x7db1, 0x2001, 0xc8fd, 0x2004, ++ 0x6016, 0x6003, 0x0002, 0x080c, 0x7e94, 0x0804, 0xb7ba, 0x2001, ++ 0x0000, 0x080c, 0x527f, 0x0804, 0xb7b4, 0x00f6, 0x2079, 0xc652, ++ 0x7804, 0x00fe, 0xd0ac, 0x1904, 0xb7b4, 0x2001, 0x0000, 0x080c, ++ 0x527f, 0x6018, 0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, 0x1140, ++ 0x00f6, 0x2079, 0xc600, 0x7898, 0x8000, 0x789a, 0x00fe, 0x00e0, ++ 0x00c6, 0x6018, 0x2060, 0x6000, 0xd0f4, 0x1140, 0x6010, 0xa005, ++ 0x0128, 0x00ce, 0x080c, 0x40ef, 0x0804, 0xb7b4, 0x00ce, 0x2001, ++ 0xc600, 0x2004, 0xa086, 0x0002, 0x1138, 0x00f6, 0x2079, 0xc600, ++ 0x7898, 0x8000, 0x789a, 0x00fe, 0x2001, 0x0002, 0x080c, 0x5291, ++ 0x080c, 0x7db1, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, ++ 0x080c, 0x79df, 0x080c, 0x7e94, 0x00c6, 0x6118, 0x2160, 0x2009, ++ 0x0001, 0x080c, 0x6fb9, 0x00ce, 0x04e8, 0x6618, 0x00d6, 0x2668, ++ 0x6e04, 0x00de, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0560, ++ 0xa686, 0x0004, 0x0548, 0x080c, 0x7669, 0x2001, 0x0004, 0x0410, ++ 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1110, 0x080c, 0x40ef, ++ 0x2001, 0x0006, 0x04a1, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de, ++ 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0170, 0x2001, 0x0006, ++ 0x0048, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0401, 0x0020, ++ 0x0018, 0x0010, 0x080c, 0x52be, 0x080c, 0x7db1, 0x080c, 0x95e3, ++ 0x080c, 0x7e94, 0x0005, 0x2600, 0x0002, 0xb7c6, 0xb7c6, 0xb7c6, ++ 0xb7c6, 0xb7c6, 0xb7c8, 0xb7c6, 0xb7c8, 0xb7c6, 0x080c, 0x1519, ++ 0x080c, 0x7db1, 0x080c, 0x95e3, 0x080c, 0x7e94, 0x0005, 0x0016, ++ 0x00d6, 0x6118, 0x2168, 0x6900, 0xd184, 0x0140, 0x080c, 0x5291, ++ 0x2001, 0x0000, 0x080c, 0x527f, 0x080c, 0x2e6c, 0x00de, 0x001e, ++ 0x0005, 0x00d6, 0x6618, 0x2668, 0x6804, 0xa084, 0xff00, 0x8007, ++ 0x00de, 0xa0b2, 0x000c, 0x1a0c, 0x1519, 0xa1b6, 0x0015, 0x1110, ++ 0x003b, 0x0028, 0xa1b6, 0x0016, 0x190c, 0x1519, 0x006b, 0x0005, ++ 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0xb851, 0xb810, ++ 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, 0x9cda, ++ 0x9cda, 0x9cda, 0xb851, 0xb858, 0x9cda, 0x9cda, 0x9cda, 0x9cda, ++ 0x00f6, 0x2079, 0xc652, 0x7804, 0xd0ac, 0x11e0, 0x6018, 0xa07d, ++ 0x01c8, 0x7800, 0xd0f4, 0x1118, 0x7810, 0xa005, 0x1198, 0x2001, ++ 0x0000, 0x080c, 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x601f, ++ 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, 0x080c, ++ 0x7e94, 0x00e8, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, 0x080c, ++ 0x29c7, 0x11a8, 0x00c6, 0x080c, 0x533d, 0x0120, 0x00ce, 0x080c, ++ 0x95e3, 0x0068, 0x6010, 0x0006, 0x6014, 0x0006, 0x080c, 0x4f47, ++ 0x000e, 0x6016, 0x000e, 0x6012, 0x00ce, 0x080c, 0x95e3, 0x00fe, ++ 0x0005, 0x6604, 0xa6b6, 0x001e, 0x1110, 0x080c, 0x95e3, 0x0005, ++ 0x080c, 0x9fb6, 0x1138, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, ++ 0x79df, 0x0010, 0x080c, 0x95e3, 0x0005, 0x6004, 0xa08a, 0x0080, ++ 0x1a0c, 0x1519, 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, ++ 0x0005, 0xa182, 0x0040, 0x0002, 0xb887, 0xb887, 0xb887, 0xb887, ++ 0xb889, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, ++ 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0xb887, 0x080c, ++ 0x1519, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0046, 0x0026, 0x6218, ++ 0xa280, 0x002f, 0x2004, 0xa005, 0x0120, 0x2021, 0x0000, 0x080c, ++ 0xc3c4, 0x6106, 0x2071, 0xcc80, 0x7444, 0xa4a4, 0xff00, 0x0904, ++ 0xb8ed, 0xa486, 0x2000, 0x1130, 0x2009, 0x0001, 0x2011, 0x0200, ++ 0x080c, 0x712e, 0x080c, 0x1602, 0x090c, 0x1519, 0x6003, 0x0007, ++ 0x2d00, 0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x6c5a, ++ 0x2c00, 0x685e, 0x6008, 0x68b2, 0x6018, 0x2078, 0x78a0, 0x8007, ++ 0x7130, 0x694a, 0x0016, 0xa084, 0xff00, 0x6846, 0x684f, 0x0000, ++ 0x6853, 0x0000, 0x6857, 0x0036, 0x080c, 0x580a, 0x001e, 0xa486, ++ 0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xc10d, 0x0804, 0xb94a, ++ 0xa486, 0x0400, 0x1130, 0x2019, 0x0002, 0x080c, 0xc0bf, 0x0804, ++ 0xb94a, 0xa486, 0x0200, 0x1110, 0x080c, 0xc0a4, 0xa486, 0x1000, ++ 0x1110, 0x080c, 0xc0f2, 0x0804, 0xb94a, 0x2069, 0xc9bc, 0x6a00, ++ 0xd284, 0x0904, 0xb9b1, 0xa284, 0x0300, 0x1904, 0xb9aa, 0x6804, ++ 0xa005, 0x0904, 0xb992, 0x2d78, 0x6003, 0x0007, 0x080c, 0x15e5, ++ 0x0904, 0xb951, 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, ++ 0x6013, 0x0000, 0x6803, 0x0000, 0x6837, 0x0116, 0x683b, 0x0000, ++ 0x6008, 0x68b2, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0, 0x8007, ++ 0x7130, 0x6986, 0x6846, 0x7928, 0x698a, 0x792c, 0x698e, 0x7930, ++ 0x6992, 0x7934, 0x6996, 0x6853, 0x003d, 0x7244, 0xa294, 0x0003, ++ 0xa286, 0x0002, 0x1118, 0x684f, 0x0040, 0x0040, 0xa286, 0x0001, ++ 0x1118, 0x684f, 0x0080, 0x0010, 0x684f, 0x0000, 0x20a9, 0x000a, ++ 0x2001, 0xcc90, 0xad90, 0x0015, 0x200c, 0x810f, 0x2112, 0x8000, ++ 0x8210, 0x1f04, 0xb93c, 0x200c, 0x6982, 0x8000, 0x200c, 0x697e, ++ 0x080c, 0x580a, 0x002e, 0x004e, 0x015e, 0x00fe, 0x00ee, 0x00de, ++ 0x0005, 0x2001, 0xc60e, 0x2004, 0xd084, 0x0120, 0x080c, 0x1602, ++ 0x1904, 0xb902, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, ++ 0x080c, 0x7999, 0x080c, 0x7e94, 0x0c28, 0x2069, 0xcc92, 0x2d04, ++ 0xa084, 0xff00, 0xa086, 0x1200, 0x11a8, 0x2069, 0xcc80, 0x686c, ++ 0xa084, 0x00ff, 0x0016, 0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, ++ 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, 0x080c, 0x7999, 0x080c, ++ 0x7e94, 0x0840, 0x6868, 0x602a, 0x686c, 0x602e, 0x6013, 0x0200, ++ 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x7999, 0x080c, 0x7e94, ++ 0x0804, 0xb94a, 0x2001, 0xc60d, 0x2004, 0xd0ec, 0x0120, 0x2011, ++ 0x8049, 0x080c, 0x407d, 0x6013, 0x0300, 0x0010, 0x6013, 0x0100, ++ 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x7999, 0x080c, 0x7e94, ++ 0x0804, 0xb94a, 0x6013, 0x0500, 0x0c98, 0x6013, 0x0600, 0x0804, ++ 0xb965, 0x6013, 0x0200, 0x0804, 0xb965, 0xa186, 0x0013, 0x1170, ++ 0x6004, 0xa08a, 0x0040, 0x0a0c, 0x1519, 0xa08a, 0x0053, 0x1a0c, ++ 0x1519, 0xa082, 0x0040, 0x2008, 0x0804, 0xba3f, 0xa186, 0x0051, ++ 0x0138, 0xa186, 0x0047, 0x11d8, 0x6004, 0xa086, 0x0041, 0x0518, ++ 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, 0x0126, 0x2091, 0x2800, ++ 0x0006, 0x0016, 0x0026, 0x080c, 0x7873, 0x002e, 0x001e, 0x000e, ++ 0x012e, 0x6000, 0xa086, 0x0002, 0x1170, 0x0804, 0xba82, 0xa186, ++ 0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x1519, 0x6004, 0xa082, ++ 0x0040, 0x2008, 0x001a, 0x080c, 0x962a, 0x0005, 0xba09, 0xba0b, ++ 0xba0b, 0xba2f, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, ++ 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, 0xba09, ++ 0xba09, 0x080c, 0x1519, 0x080c, 0x7db1, 0x080c, 0x7e94, 0x0036, ++ 0x00d6, 0x6010, 0xa06d, 0x01c0, 0xad84, 0xf000, 0x01a8, 0x6003, ++ 0x0002, 0x6018, 0x2004, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, ++ 0xc141, 0x6013, 0x0000, 0x6014, 0xa005, 0x1120, 0x2001, 0xc8fe, ++ 0x2004, 0x6016, 0x6003, 0x0007, 0x00de, 0x003e, 0x0005, 0x00d6, ++ 0x080c, 0x7db1, 0x080c, 0x7e94, 0x080c, 0xac91, 0x0120, 0x6010, ++ 0x2068, 0x080c, 0x1619, 0x080c, 0xae54, 0x00de, 0x0005, 0x0002, ++ 0xba53, 0xba70, 0xba5c, 0xba7c, 0xba53, 0xba53, 0xba53, 0xba53, ++ 0xba53, 0xba53, 0xba53, 0xba53, 0xba53, 0xba53, 0xba53, 0xba53, ++ 0xba53, 0xba53, 0xba53, 0x080c, 0x1519, 0x6010, 0xa088, 0x0013, ++ 0x2104, 0xa085, 0x0400, 0x200a, 0x080c, 0x7db1, 0x6010, 0xa080, ++ 0x0013, 0x2004, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, ++ 0x080c, 0x9613, 0x0010, 0x6003, 0x0002, 0x080c, 0x7e94, 0x0005, ++ 0x080c, 0x7db1, 0x080c, 0xc37f, 0x1120, 0x080c, 0x7103, 0x080c, ++ 0x95e3, 0x080c, 0x7e94, 0x0005, 0x080c, 0x7db1, 0x2009, 0x0041, ++ 0x0804, 0xbbcb, 0xa182, 0x0040, 0x0002, 0xba98, 0xba9a, 0xba98, ++ 0xba98, 0xba98, 0xba98, 0xba98, 0xba9b, 0xba98, 0xba98, 0xba98, ++ 0xba98, 0xba98, 0xba98, 0xba98, 0xba98, 0xba98, 0xbaa6, 0xba98, ++ 0x080c, 0x1519, 0x0005, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, ++ 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1870, 0x0005, 0x00d6, 0x080c, ++ 0x7103, 0x00de, 0x080c, 0xc3e2, 0x080c, 0x95e3, 0x0005, 0xa182, ++ 0x0040, 0x0002, 0xbac5, 0xbac5, 0xbac5, 0xbac5, 0xbac5, 0xbac5, ++ 0xbac5, 0xbac7, 0xbac5, 0xbaca, 0xbb03, 0xbac5, 0xbac5, 0xbac5, ++ 0xbac5, 0xbb03, 0xbac5, 0xbac5, 0xbac5, 0x080c, 0x1519, 0x080c, ++ 0x962a, 0x0005, 0x2001, 0xc672, 0x2004, 0xd0e4, 0x0158, 0x2001, ++ 0x0100, 0x2004, 0xa082, 0x0005, 0x0228, 0x2001, 0x011f, 0x2004, ++ 0x6036, 0x0010, 0x6037, 0x0000, 0x080c, 0x7e47, 0x080c, 0x7f6e, ++ 0x6010, 0x00d6, 0x2068, 0x684c, 0xd0fc, 0x0150, 0xa08c, 0x0003, ++ 0xa18e, 0x0002, 0x0168, 0x2009, 0x0041, 0x00de, 0x0804, 0xbbcb, ++ 0x6003, 0x0007, 0x6017, 0x0000, 0x080c, 0x7103, 0x00de, 0x0005, ++ 0x080c, 0xc37f, 0x0110, 0x00de, 0x0005, 0x080c, 0x7103, 0x080c, ++ 0x95e3, 0x00de, 0x0ca0, 0x0036, 0x080c, 0x7e47, 0x080c, 0x7f6e, ++ 0x6010, 0x00d6, 0x2068, 0x6018, 0x2004, 0xd0bc, 0x0188, 0x684c, ++ 0xa084, 0x0003, 0xa086, 0x0002, 0x0140, 0x687c, 0x632c, 0xa31a, ++ 0x632e, 0x6880, 0x6328, 0xa31b, 0x632a, 0x6003, 0x0002, 0x0080, ++ 0x2019, 0x0004, 0x080c, 0xc141, 0x6014, 0xa005, 0x1128, 0x2001, ++ 0xc8fe, 0x2004, 0x8003, 0x6016, 0x6013, 0x0000, 0x6003, 0x0007, ++ 0x00de, 0x003e, 0x0005, 0xa186, 0x0013, 0x1150, 0x6004, 0xa086, ++ 0x0042, 0x190c, 0x1519, 0x080c, 0x7db1, 0x080c, 0x7e94, 0x0005, ++ 0xa186, 0x0027, 0x0118, 0xa186, 0x0014, 0x1180, 0x6004, 0xa086, ++ 0x0042, 0x190c, 0x1519, 0x2001, 0x0007, 0x080c, 0x52be, 0x080c, ++ 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xa182, 0x0040, ++ 0x0002, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, ++ 0xbb6e, 0xbb7a, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, ++ 0xbb6c, 0xbb6c, 0xbb6c, 0xbb6c, 0x080c, 0x1519, 0x0036, 0x0046, ++ 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1870, 0x004e, ++ 0x003e, 0x0005, 0x6010, 0x00d6, 0x2068, 0x6810, 0x6a14, 0x0006, ++ 0x0046, 0x0056, 0x6c7c, 0xa422, 0x6d80, 0x2200, 0xa52b, 0x602c, ++ 0xa420, 0x642e, 0x6028, 0xa529, 0x652a, 0x005e, 0x004e, 0x000e, ++ 0xa20d, 0x1178, 0x684c, 0xd0fc, 0x0120, 0x2009, 0x0041, 0x00de, ++ 0x0490, 0x6003, 0x0007, 0x6017, 0x0000, 0x080c, 0x7103, 0x00de, ++ 0x0005, 0x0006, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x000e, ++ 0x0120, 0x6003, 0x0002, 0x00de, 0x0005, 0x2009, 0xc60d, 0x210c, ++ 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, 0x0021, ++ 0x080c, 0x7105, 0x00de, 0x0005, 0xd2fc, 0x0140, 0x8002, 0x8000, ++ 0x8212, 0xa291, 0x0000, 0x2009, 0x0009, 0x0010, 0x2009, 0x0015, ++ 0x6a6a, 0x6866, 0x0005, 0xa182, 0x0040, 0x0208, 0x0062, 0xa186, ++ 0x0013, 0x0120, 0xa186, 0x0014, 0x190c, 0x1519, 0x6020, 0xd0dc, ++ 0x090c, 0x1519, 0x0005, 0xbbee, 0xbbf5, 0xbc01, 0xbc0d, 0xbbee, ++ 0xbbee, 0xbbee, 0xbc1c, 0xbbee, 0xbbf0, 0xbbf0, 0xbbee, 0xbbee, ++ 0xbbee, 0xbbee, 0xbbf0, 0xbbee, 0xbbf0, 0xbbee, 0x080c, 0x1519, ++ 0x6020, 0xd0dc, 0x090c, 0x1519, 0x0005, 0x6003, 0x0001, 0x6106, ++ 0x080c, 0x7999, 0x0126, 0x2091, 0x8000, 0x080c, 0x7e94, 0x012e, ++ 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x7999, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, ++ 0x2c10, 0x080c, 0x2068, 0x0126, 0x2091, 0x8000, 0x080c, 0x79fc, ++ 0x080c, 0x7f6e, 0x012e, 0x0005, 0xa016, 0x080c, 0x1870, 0x0005, ++ 0x0126, 0x2091, 0x8000, 0x0036, 0x00d6, 0xa182, 0x0040, 0x0023, ++ 0x00de, 0x003e, 0x012e, 0x0005, 0xbc3c, 0xbc3e, 0xbc50, 0xbc6b, ++ 0xbc3c, 0xbc3c, 0xbc3c, 0xbc80, 0xbc3c, 0xbc3c, 0xbc3c, 0xbc3c, ++ 0xbc3c, 0xbc3c, 0xbc3c, 0xbc3c, 0x080c, 0x1519, 0x6010, 0x2068, ++ 0x684c, 0xd0fc, 0x01f8, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x01d0, ++ 0x6003, 0x0001, 0x6106, 0x080c, 0x7999, 0x080c, 0x7e94, 0x0498, ++ 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0168, 0xa09c, 0x0003, 0xa39e, ++ 0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x7999, 0x080c, ++ 0x7e94, 0x0408, 0x6013, 0x0000, 0x6017, 0x0000, 0x2019, 0x0004, ++ 0x080c, 0xc141, 0x00c0, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0d90, ++ 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0d68, 0x6003, 0x0003, 0x6106, ++ 0x2c10, 0x080c, 0x2068, 0x080c, 0x79fc, 0x080c, 0x7f6e, 0x0018, ++ 0xa016, 0x080c, 0x1870, 0x0005, 0x080c, 0x7db1, 0x6110, 0x81ff, ++ 0x0158, 0x00d6, 0x2168, 0x080c, 0xc4d7, 0x0036, 0x2019, 0x0029, ++ 0x080c, 0xc141, 0x003e, 0x00de, 0x080c, 0xae54, 0x080c, 0x7e94, ++ 0x0005, 0x080c, 0x7e47, 0x6110, 0x81ff, 0x0158, 0x00d6, 0x2168, ++ 0x080c, 0xc4d7, 0x0036, 0x2019, 0x0029, 0x080c, 0xc141, 0x003e, ++ 0x00de, 0x080c, 0xae54, 0x080c, 0x7f6e, 0x0005, 0xa182, 0x0085, ++ 0x0002, 0xbcba, 0xbcb8, 0xbcb8, 0xbcc6, 0xbcb8, 0xbcb8, 0xbcb8, ++ 0x080c, 0x1519, 0x6003, 0x000b, 0x6106, 0x080c, 0x7999, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, 0x0026, 0x00e6, ++ 0x080c, 0xc378, 0x0118, 0x080c, 0x95e3, 0x00d8, 0x2071, 0xcc80, ++ 0x7224, 0x6212, 0x7220, 0x080c, 0xbfef, 0x0118, 0x6007, 0x0086, ++ 0x0040, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x1110, 0x6007, ++ 0x0086, 0x6003, 0x0001, 0x080c, 0x7999, 0x080c, 0x7e94, 0x080c, ++ 0x7f6e, 0x00ee, 0x002e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, ++ 0xa08a, 0x0085, 0x0a0c, 0x1519, 0xa08a, 0x008c, 0x1a0c, 0x1519, ++ 0xa082, 0x0085, 0x00a2, 0xa186, 0x0027, 0x0130, 0xa186, 0x0014, ++ 0x0118, 0x080c, 0x962a, 0x0050, 0x2001, 0x0007, 0x080c, 0x52be, ++ 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xbd16, ++ 0xbd18, 0xbd18, 0xbd16, 0xbd16, 0xbd16, 0xbd16, 0x080c, 0x1519, ++ 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0xa182, ++ 0x0085, 0x0a0c, 0x1519, 0xa182, 0x008c, 0x1a0c, 0x1519, 0xa182, ++ 0x0085, 0x0002, 0xbd31, 0xbd31, 0xbd31, 0xbd33, 0xbd31, 0xbd31, ++ 0xbd31, 0x080c, 0x1519, 0x0005, 0xa186, 0x0013, 0x0148, 0xa186, ++ 0x0014, 0x0130, 0xa186, 0x0027, 0x0118, 0x080c, 0x962a, 0x0030, ++ 0x080c, 0x7db1, 0x080c, 0xae54, 0x080c, 0x7e94, 0x0005, 0x0036, ++ 0x080c, 0xc3e2, 0x603f, 0x0000, 0x2019, 0x000b, 0x0031, 0x601f, ++ 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, ++ 0x8000, 0x0086, 0x2c40, 0x0096, 0x2049, 0x0000, 0x080c, 0x8fc9, ++ 0x009e, 0x008e, 0x1578, 0x0076, 0x2c38, 0x080c, 0x906f, 0x007e, ++ 0x1548, 0x6000, 0xa086, 0x0000, 0x0528, 0x601c, 0xa086, 0x0007, ++ 0x0508, 0x00d6, 0x6000, 0xa086, 0x0004, 0x1150, 0x080c, 0xc3e2, ++ 0x601f, 0x0007, 0x2001, 0xc8fd, 0x2004, 0x6016, 0x080c, 0x1953, ++ 0x6010, 0x2068, 0x080c, 0xac91, 0x0110, 0x080c, 0xc141, 0x00de, ++ 0x6013, 0x0000, 0x080c, 0xc3e2, 0x601f, 0x0007, 0x2001, 0xc8fd, ++ 0x2004, 0x6016, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, 0x0036, ++ 0x0156, 0x2079, 0xcc80, 0x7938, 0x783c, 0x080c, 0x29c7, 0x15b0, ++ 0x0016, 0x00c6, 0x080c, 0x533d, 0x1578, 0x001e, 0x002e, 0x0026, ++ 0x0016, 0x2019, 0x0029, 0x080c, 0x9132, 0x080c, 0x7b16, 0x0076, ++ 0x2039, 0x0000, 0x080c, 0x7a0e, 0x007e, 0x001e, 0x0076, 0x2039, ++ 0x0000, 0x080c, 0xbef7, 0x007e, 0x080c, 0x553e, 0x0026, 0x6204, ++ 0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x0118, 0xa286, 0x0004, ++ 0x1118, 0x62a0, 0x080c, 0x2eff, 0x002e, 0x001e, 0x080c, 0x4f47, ++ 0x6612, 0x6516, 0xa006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, ++ 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x2009, ++ 0xc621, 0x2104, 0xa086, 0x0074, 0x1904, 0xbe30, 0x2069, 0xcc8e, ++ 0x690c, 0xa182, 0x0100, 0x06c0, 0x6908, 0xa184, 0x8000, 0x05e8, ++ 0x2001, 0xc8e5, 0x2004, 0xa005, 0x1160, 0x6018, 0x2070, 0x7010, ++ 0xa084, 0x00ff, 0x0118, 0x7000, 0xd0f4, 0x0118, 0xa184, 0x0800, ++ 0x0560, 0x6910, 0xa18a, 0x0001, 0x0610, 0x6914, 0x2069, 0xccae, ++ 0x6904, 0x81ff, 0x1198, 0x690c, 0xa182, 0x0100, 0x02a8, 0x6908, ++ 0x81ff, 0x1178, 0x6910, 0xa18a, 0x0001, 0x0288, 0x6918, 0xa18a, ++ 0x0001, 0x0298, 0x00d0, 0x6013, 0x0100, 0x00a0, 0x6013, 0x0300, ++ 0x0088, 0x6013, 0x0500, 0x0070, 0x6013, 0x0700, 0x0058, 0x6013, ++ 0x0900, 0x0040, 0x6013, 0x0b00, 0x0028, 0x6013, 0x0f00, 0x0010, ++ 0x6013, 0x2d00, 0xa085, 0x0001, 0x0008, 0xa006, 0x001e, 0x00ee, ++ 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x0026, 0x0036, 0x0156, ++ 0x6218, 0x2268, 0x6b04, 0xa394, 0x00ff, 0xa286, 0x0006, 0x0190, ++ 0xa286, 0x0004, 0x0178, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006, ++ 0x0148, 0xa286, 0x0004, 0x0130, 0x00c6, 0x2d60, 0x080c, 0x534c, ++ 0x00ce, 0x04c0, 0x2011, 0xcc96, 0xad98, 0x000a, 0x20a9, 0x0004, ++ 0x080c, 0xa103, 0x1580, 0x2011, 0xcc9a, 0xad98, 0x0006, 0x20a9, ++ 0x0004, 0x080c, 0xa103, 0x1538, 0x0046, 0x0016, 0x6aa0, 0xa294, ++ 0x00ff, 0x8227, 0xa006, 0x2009, 0xc653, 0x210c, 0xd1a4, 0x0138, ++ 0x2009, 0x0029, 0x080c, 0xc190, 0x6800, 0xc0e5, 0x6802, 0x2019, ++ 0x0029, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, ++ 0x2c08, 0x080c, 0xbef7, 0x007e, 0x2001, 0x0007, 0x080c, 0x52be, ++ 0x001e, 0x004e, 0xa006, 0x015e, 0x003e, 0x002e, 0x00de, 0x00ce, ++ 0x0005, 0x00d6, 0x2069, 0xcc8e, 0x6800, 0xa086, 0x0800, 0x0118, ++ 0x6013, 0x0000, 0x0008, 0xa006, 0x00de, 0x0005, 0x00c6, 0x00f6, ++ 0x0016, 0x0026, 0x0036, 0x0156, 0x2079, 0xcc8c, 0x7930, 0x7834, ++ 0x080c, 0x29c7, 0x11a0, 0x080c, 0x533d, 0x1188, 0x2011, 0xcc90, ++ 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0xa103, 0x1140, 0x2011, ++ 0xcc94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0xa103, 0x015e, ++ 0x003e, 0x002e, 0x001e, 0x00fe, 0x00ce, 0x0005, 0x00c6, 0x0006, ++ 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0xcc83, 0x2204, 0x8211, ++ 0x220c, 0x080c, 0x29c7, 0x11a0, 0x080c, 0x533d, 0x1188, 0x2011, ++ 0xcc96, 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0xa103, 0x1140, ++ 0x2011, 0xcc9a, 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0xa103, ++ 0x015e, 0x003e, 0x002e, 0x001e, 0x000e, 0x00ce, 0x0005, 0x00e6, ++ 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, ++ 0x2091, 0x8000, 0x2740, 0x2029, 0xc930, 0x252c, 0x2021, 0xc936, ++ 0x2424, 0x2061, 0xce00, 0x2071, 0xc600, 0x7648, 0x7068, 0x81ff, ++ 0x0150, 0x0006, 0xa186, 0xca3c, 0x000e, 0x0128, 0x8001, 0xa602, ++ 0x1a04, 0xbf78, 0x0018, 0xa606, 0x0904, 0xbf78, 0x2100, 0xac06, ++ 0x0904, 0xbf6f, 0x080c, 0xc1b8, 0x0904, 0xbf6f, 0x671c, 0xa786, ++ 0x0001, 0x0904, 0xbfc1, 0xa786, 0x0004, 0x0904, 0xbfc1, 0xa786, ++ 0x0007, 0x05e8, 0x2500, 0xac06, 0x05d0, 0x2400, 0xac06, 0x05b8, ++ 0x080c, 0xc1c8, 0x15a0, 0x88ff, 0x0118, 0x6050, 0xa906, 0x1578, ++ 0x00d6, 0x6000, 0xa086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1953, ++ 0x001e, 0xa786, 0x0008, 0x1148, 0x080c, 0xae8f, 0x1130, 0x080c, ++ 0x9c09, 0x00de, 0x080c, 0xae54, 0x00d0, 0x6010, 0x2068, 0x080c, ++ 0xac91, 0x0190, 0xa786, 0x0003, 0x1528, 0x6837, 0x0103, 0x6b4a, ++ 0x6847, 0x0000, 0x080c, 0xc4d7, 0x0016, 0x080c, 0xaf03, 0x080c, ++ 0x580a, 0x001e, 0x080c, 0xae48, 0x00de, 0x080c, 0xae54, 0xace0, ++ 0x0018, 0x2001, 0xc617, 0x2004, 0xac02, 0x1210, 0x0804, 0xbf0b, ++ 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, ++ 0x00ee, 0x0005, 0xa786, 0x0006, 0x1150, 0xa386, 0x0005, 0x0128, ++ 0x080c, 0xc4d7, 0x080c, 0xc141, 0x08f8, 0x00de, 0x0c00, 0xa786, ++ 0x0009, 0x1548, 0x6000, 0xa086, 0x0004, 0x1128, 0x00c6, 0x080c, ++ 0x761a, 0x00ce, 0x00e8, 0x6000, 0xa086, 0x0003, 0x11c8, 0x080c, ++ 0x7e47, 0x00e6, 0x00d6, 0x6110, 0x2168, 0x080c, 0xac91, 0x0140, ++ 0x6018, 0x2070, 0x70b3, 0x0000, 0x70b7, 0x0000, 0x080c, 0x580a, ++ 0x00de, 0x00ee, 0x00c6, 0x080c, 0x95e3, 0x00ce, 0x080c, 0x7f6e, ++ 0x00de, 0x0804, 0xbf6f, 0xa786, 0x000a, 0x0904, 0xbf5f, 0x0804, ++ 0xbf5d, 0x080c, 0xc1c8, 0x1904, 0xbf6f, 0x81ff, 0x0904, 0xbf6f, ++ 0xa180, 0x0001, 0x2004, 0xa086, 0x0018, 0x0138, 0xa180, 0x0001, ++ 0x2004, 0xa086, 0x002d, 0x1904, 0xbf6f, 0x6000, 0xa086, 0x0002, ++ 0x1904, 0xbf6f, 0x080c, 0xae7e, 0x0138, 0x080c, 0xae8f, 0x1904, ++ 0xbf6f, 0x080c, 0x9c09, 0x0038, 0x080c, 0x2e6c, 0x080c, 0xae8f, ++ 0x1110, 0x080c, 0x9c09, 0x080c, 0xae54, 0x0804, 0xbf6f, 0x00c6, ++ 0x00e6, 0x0016, 0x2c08, 0x2170, 0xa006, 0x080c, 0xc162, 0x001e, ++ 0x0120, 0x601c, 0xa084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, ++ 0xc008, 0xc008, 0xc008, 0xc008, 0xc008, 0xc008, 0xc00a, 0xc008, ++ 0xa006, 0x0005, 0x0046, 0x0016, 0x7018, 0xa080, 0x0028, 0x2024, ++ 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009, 0x0020, 0x080c, 0xc190, ++ 0x001e, 0x004e, 0x0036, 0x2019, 0x0002, 0x080c, 0xbd55, 0x003e, ++ 0xa085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x527f, 0x0156, ++ 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xc605, 0x2011, ++ 0xcc96, 0x080c, 0xa103, 0x003e, 0x002e, 0x001e, 0x015e, 0xa005, ++ 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0026, ++ 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0xce00, 0x2079, 0x0001, ++ 0x8fff, 0x0904, 0xc097, 0x2071, 0xc600, 0x7648, 0x7068, 0x8001, ++ 0xa602, 0x1a04, 0xc097, 0x88ff, 0x0128, 0x2800, 0xac06, 0x15b0, ++ 0x2079, 0x0000, 0x080c, 0xc1b8, 0x0588, 0x2400, 0xac06, 0x0570, ++ 0x671c, 0xa786, 0x0006, 0x1550, 0xa786, 0x0007, 0x0538, 0x88ff, ++ 0x1140, 0x6018, 0xa206, 0x1510, 0x85ff, 0x0118, 0x6050, 0xa106, ++ 0x11e8, 0x00d6, 0x6000, 0xa086, 0x0004, 0x1150, 0x080c, 0xc3e2, ++ 0x601f, 0x0007, 0x2001, 0xc8fd, 0x2004, 0x6016, 0x080c, 0x1953, ++ 0x6010, 0x2068, 0x080c, 0xac91, 0x0120, 0x0046, 0x080c, 0xc141, ++ 0x004e, 0x00de, 0x080c, 0xae54, 0x88ff, 0x1198, 0xace0, 0x0018, ++ 0x2001, 0xc617, 0x2004, 0xac02, 0x1210, 0x0804, 0xc048, 0xa006, ++ 0x012e, 0x002e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x00fe, ++ 0x0005, 0xa8c5, 0x0001, 0x0ca0, 0x0076, 0x0056, 0x0086, 0x2041, ++ 0x0000, 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6218, 0x0096, ++ 0x2049, 0x0000, 0x080c, 0x8fc9, 0x009e, 0x008e, 0x2039, 0x0000, ++ 0x080c, 0x906f, 0x080c, 0xc039, 0x005e, 0x007e, 0x0005, 0x0026, ++ 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9, ++ 0x007f, 0x2009, 0x0000, 0x0016, 0x0036, 0x080c, 0x533d, 0x11b0, ++ 0x2c10, 0x0056, 0x0086, 0x2041, 0x0000, 0x2508, 0x2029, 0x0001, ++ 0x0096, 0x2049, 0x0000, 0x080c, 0x8fc9, 0x009e, 0x008e, 0x2039, ++ 0x0000, 0x080c, 0x906f, 0x080c, 0xc039, 0x005e, 0x003e, 0x001e, ++ 0x8108, 0x1f04, 0xc0cb, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, ++ 0x002e, 0x0005, 0x0076, 0x0056, 0x6218, 0x0086, 0x2041, 0x0000, ++ 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x2049, 0x0000, 0x080c, ++ 0x8fc9, 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x906f, 0x2c20, ++ 0x080c, 0xc039, 0x005e, 0x007e, 0x0005, 0x0026, 0x0046, 0x0056, ++ 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9, 0x007f, 0x2009, 0x0000, ++ 0x0016, 0x0036, 0x080c, 0x533d, 0x11c0, 0x2c10, 0x0086, 0x2041, ++ 0x0000, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xc3c4, 0x004e, ++ 0x0096, 0x2049, 0x0000, 0x080c, 0x8fc9, 0x009e, 0x008e, 0x2039, ++ 0x0000, 0x080c, 0x906f, 0x080c, 0xc039, 0x003e, 0x001e, 0x8108, ++ 0x1f04, 0xc118, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x002e, ++ 0x0005, 0x0016, 0x00f6, 0x3800, 0xd08c, 0x0130, 0xad82, 0x1000, ++ 0x02b0, 0xad82, 0xc600, 0x0230, 0xad82, 0xfe00, 0x0280, 0xad82, ++ 0xffff, 0x1268, 0x6800, 0xa07d, 0x0138, 0x6803, 0x0000, 0x6b52, ++ 0x080c, 0x580a, 0x2f68, 0x0cb0, 0x6b52, 0x080c, 0x580a, 0x00fe, ++ 0x001e, 0x0005, 0x00e6, 0x0046, 0x0036, 0x2061, 0xce00, 0xa005, ++ 0x1138, 0x2071, 0xc600, 0x7448, 0x7068, 0x8001, 0xa402, 0x12d8, ++ 0x2100, 0xac06, 0x0168, 0x6000, 0xa086, 0x0000, 0x0148, 0x6008, ++ 0xa206, 0x1130, 0x6018, 0xa1a0, 0x0006, 0x2424, 0xa406, 0x0140, ++ 0xace0, 0x0018, 0x2001, 0xc617, 0x2004, 0xac02, 0x1220, 0x0c40, ++ 0xa085, 0x0001, 0x0008, 0xa006, 0x003e, 0x004e, 0x00ee, 0x0005, ++ 0x00d6, 0x0006, 0x080c, 0x1602, 0x000e, 0x090c, 0x1519, 0x6837, ++ 0x010d, 0x685e, 0x0026, 0x2010, 0x080c, 0xac81, 0x2001, 0x0000, ++ 0x0120, 0x2200, 0xa080, 0x0014, 0x2004, 0x002e, 0x684a, 0x6956, ++ 0x6c46, 0x684f, 0x0000, 0x2001, 0xc905, 0x2004, 0x6852, 0xa006, ++ 0x68b2, 0x6802, 0x683a, 0x685a, 0x080c, 0x580a, 0x00de, 0x0005, ++ 0x6700, 0xa786, 0x0000, 0x0158, 0xa786, 0x0001, 0x0140, 0xa786, ++ 0x000a, 0x0128, 0xa786, 0x0009, 0x0110, 0xa085, 0x0001, 0x0005, ++ 0x00e6, 0x6018, 0x2070, 0x70a0, 0xa206, 0x00ee, 0x0005, 0x0016, ++ 0x6004, 0xa08e, 0x001e, 0x11a0, 0x8007, 0x6130, 0xa18c, 0x00ff, ++ 0xa105, 0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0005, ++ 0x2001, 0xc8fe, 0x2004, 0x6016, 0x080c, 0x7999, 0x080c, 0x7e94, ++ 0x001e, 0x0005, 0xe000, 0xe000, 0x0005, 0x6020, 0xd0e4, 0x0158, ++ 0xd0cc, 0x0118, 0x080c, 0xaf6c, 0x0030, 0x080c, 0xc3e2, 0x080c, ++ 0x7103, 0x080c, 0x95e3, 0x0005, 0xa280, 0x0007, 0x2004, 0xa084, ++ 0x000f, 0x0002, 0xc20b, 0xc20b, 0xc20b, 0xc210, 0xc20b, 0xc20d, ++ 0xc20d, 0xc20b, 0xc20d, 0xa006, 0x0005, 0x00c6, 0x2260, 0x00ce, ++ 0xa085, 0x0001, 0x0005, 0xa280, 0x0007, 0x2004, 0xa084, 0x000f, ++ 0x0002, 0xc222, 0xc222, 0xc222, 0xc222, 0xc222, 0xc222, 0xc22d, ++ 0xc222, 0xc222, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, ++ 0x6003, 0x0001, 0x080c, 0x7999, 0x0005, 0x00c6, 0x2260, 0x080c, ++ 0xc3e2, 0x603f, 0x0000, 0x6020, 0xc0f4, 0xc0cc, 0x6022, 0x6037, ++ 0x0000, 0x00ce, 0x00d6, 0x2268, 0xa186, 0x0007, 0x1904, 0xc288, ++ 0x6810, 0xa005, 0x0138, 0xa080, 0x0013, 0x2004, 0xd0fc, 0x1110, ++ 0x00de, 0x08c0, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, 0x7999, ++ 0x080c, 0x7e94, 0x00c6, 0x2d60, 0x6100, 0xa186, 0x0002, 0x1904, ++ 0xc311, 0x6010, 0xa005, 0x1138, 0x6000, 0xa086, 0x0007, 0x190c, ++ 0x1519, 0x0804, 0xc311, 0xa08c, 0xf000, 0x1130, 0x0028, 0x2068, ++ 0x6800, 0xa005, 0x1de0, 0x2d00, 0xa080, 0x0013, 0x2004, 0xa084, ++ 0x0003, 0xa086, 0x0002, 0x1180, 0x6010, 0x2068, 0x684c, 0xc0dc, ++ 0xc0f4, 0x684e, 0x6850, 0xc0f4, 0xc0fc, 0x6852, 0x2009, 0x0043, ++ 0x080c, 0xbbcb, 0x0804, 0xc311, 0x2009, 0x0041, 0x0804, 0xc30b, ++ 0xa186, 0x0005, 0x15f0, 0x6810, 0xa080, 0x0013, 0x2004, 0xd0bc, ++ 0x1118, 0x00de, 0x0804, 0xc222, 0xd0b4, 0x0128, 0xd0fc, 0x090c, ++ 0x1519, 0x0804, 0xc240, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, ++ 0x7999, 0x080c, 0x7e94, 0x00c6, 0x2d60, 0x6100, 0xa186, 0x0002, ++ 0x0120, 0xa186, 0x0004, 0x1904, 0xc311, 0x2071, 0xc96a, 0x7000, ++ 0xa086, 0x0003, 0x1128, 0x7004, 0xac06, 0x1110, 0x7003, 0x0000, ++ 0x6810, 0xa080, 0x0013, 0x200c, 0xc1f4, 0xc1dc, 0x2102, 0x8000, ++ 0x200c, 0xc1f4, 0xc1fc, 0xc1bc, 0x2102, 0x2009, 0x0042, 0x0804, ++ 0xc30b, 0x0036, 0x00d6, 0x00d6, 0x080c, 0x1602, 0x003e, 0x090c, ++ 0x1519, 0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x685b, ++ 0x0000, 0x6b5e, 0x6857, 0x0045, 0x2c00, 0x6862, 0x6034, 0x6872, ++ 0x2360, 0x6020, 0xc0dd, 0x6022, 0x6018, 0xa080, 0x0028, 0x2004, ++ 0xa084, 0x00ff, 0x8007, 0x6350, 0x6b4a, 0x6846, 0x684f, 0x0000, ++ 0x6853, 0x0000, 0x6d6a, 0x6e66, 0x686f, 0x0001, 0x080c, 0x580a, ++ 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xbd55, 0x2d00, 0x600a, ++ 0x601f, 0x0006, 0x6003, 0x0007, 0x6017, 0x0000, 0x603f, 0x0000, ++ 0x00de, 0x003e, 0x0038, 0x603f, 0x0000, 0x6003, 0x0007, 0x080c, ++ 0xbbcb, 0x00ce, 0x00de, 0x0005, 0xa186, 0x0013, 0x1128, 0x6004, ++ 0xa082, 0x0085, 0x2008, 0x00c2, 0xa186, 0x0027, 0x1178, 0x080c, ++ 0x7db1, 0x0036, 0x00d6, 0x6010, 0x2068, 0x2019, 0x0004, 0x080c, ++ 0xc141, 0x00de, 0x003e, 0x080c, 0x7e94, 0x0005, 0xa186, 0x0014, ++ 0x0d70, 0x080c, 0x962a, 0x0005, 0xc33d, 0xc33b, 0xc33b, 0xc33b, ++ 0xc33b, 0xc33b, 0xc33d, 0x080c, 0x1519, 0x080c, 0x7db1, 0x6003, ++ 0x000c, 0x080c, 0x7e94, 0x0005, 0xa182, 0x008c, 0x1220, 0xa182, ++ 0x0085, 0x0208, 0x001a, 0x080c, 0x962a, 0x0005, 0xc355, 0xc355, ++ 0xc355, 0xc355, 0xc357, 0xc375, 0xc355, 0x080c, 0x1519, 0x00d6, ++ 0x2c68, 0x080c, 0x958d, 0x01a0, 0x6003, 0x0001, 0x6007, 0x001e, ++ 0x2009, 0xcc8e, 0x210c, 0x6136, 0x2009, 0xcc8f, 0x210c, 0x613a, ++ 0x600b, 0xffff, 0x6918, 0x611a, 0x601f, 0x0004, 0x080c, 0x7999, ++ 0x2d60, 0x080c, 0x95e3, 0x00de, 0x0005, 0x080c, 0x95e3, 0x0005, ++ 0x00e6, 0x6018, 0x2070, 0x7000, 0xd0ec, 0x00ee, 0x0005, 0x6010, ++ 0xa08c, 0xf000, 0x0904, 0xc3c3, 0xa080, 0x0013, 0x200c, 0xd1ec, ++ 0x05d0, 0x2001, 0xc672, 0x2004, 0xd0ec, 0x05a8, 0x6003, 0x0002, ++ 0x6020, 0xc0e5, 0x6022, 0xd1ac, 0x0180, 0x00f6, 0x2c78, 0x080c, ++ 0x56bf, 0x00fe, 0x0150, 0x2001, 0xc8ff, 0x2004, 0x603e, 0x2009, ++ 0xc672, 0x210c, 0xd1f4, 0x11e8, 0x0080, 0x2009, 0xc672, 0x210c, ++ 0xd1f4, 0x0128, 0x6020, 0xc0e4, 0x6022, 0xa006, 0x00a0, 0x2001, ++ 0xc8ff, 0x200c, 0x8103, 0xa100, 0x603e, 0x6018, 0xa088, 0x002f, ++ 0x2104, 0xa005, 0x0118, 0xa088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, ++ 0x0000, 0xa085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6150, ++ 0xa2f0, 0x002f, 0x2e04, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, ++ 0x6050, 0xa106, 0x1138, 0x600c, 0x2072, 0x080c, 0x7103, 0x080c, ++ 0x95e3, 0x0010, 0xacf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, ++ 0x001e, 0x0005, 0x00d6, 0x6018, 0xa0e8, 0x002f, 0x2d04, 0xa005, ++ 0x0140, 0xac06, 0x0120, 0x2d04, 0xa0e8, 0x0003, 0x0cb8, 0x600c, ++ 0x206a, 0x00de, 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0xc628, ++ 0x2204, 0xa084, 0x00ff, 0x2019, 0xcc8e, 0x2334, 0xa636, 0x11d8, ++ 0x8318, 0x2334, 0x2204, 0xa084, 0xff00, 0xa636, 0x11a0, 0x2011, ++ 0xcc90, 0x6018, 0xa098, 0x000a, 0x20a9, 0x0004, 0x080c, 0xa103, ++ 0x1150, 0x2011, 0xcc94, 0x6018, 0xa098, 0x0006, 0x20a9, 0x0004, ++ 0x080c, 0xa103, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, ++ 0x2071, 0xc600, 0x080c, 0x4f02, 0x080c, 0x2c62, 0x00ee, 0x0005, ++ 0x00d6, 0x080c, 0x15e5, 0x0500, 0x2d10, 0xa290, 0x000d, 0x2013, ++ 0x0134, 0x8210, 0x2013, 0x0000, 0x8210, 0x703c, 0x2012, 0x8210, ++ 0x7038, 0x2012, 0x8210, 0x2218, 0x7048, 0x2012, 0x8210, 0x704c, ++ 0x2012, 0x8210, 0x7050, 0x2012, 0x8210, 0x7054, 0x2012, 0x2300, ++ 0x080c, 0x3e8f, 0x080c, 0x580a, 0x00de, 0x0005, 0x00d6, 0x0026, ++ 0x080c, 0x1602, 0x090c, 0x1519, 0xad90, 0x000e, 0x20a9, 0x000c, ++ 0x22a0, 0xa016, 0x42a4, 0xa186, 0x0046, 0x1118, 0x6837, 0x0136, ++ 0x0038, 0x6837, 0x0138, 0xa186, 0x0041, 0x0110, 0x684b, 0x0001, ++ 0x7038, 0xa084, 0xff00, 0x7240, 0xa294, 0xff00, 0x8007, 0xa215, ++ 0x6a6a, 0xa186, 0x0046, 0x1168, 0x7038, 0xa084, 0x00ff, 0x723c, ++ 0xa294, 0xff00, 0xa215, 0x6a6e, 0x723c, 0xa294, 0x00ff, 0x6a72, ++ 0x0060, 0x7040, 0xa084, 0x00ff, 0x7244, 0xa294, 0xff00, 0xa215, ++ 0x6a6e, 0x7244, 0xa294, 0x00ff, 0x6a72, 0xa186, 0x0046, 0x1118, ++ 0xae90, 0x0012, 0x0010, 0xae90, 0x001a, 0x2204, 0x8007, 0x6876, ++ 0x8210, 0x2204, 0x8007, 0x687a, 0x8210, 0x2204, 0x8007, 0x687e, ++ 0x8210, 0x2204, 0x8007, 0x6882, 0x8210, 0xa186, 0x0046, 0x1118, ++ 0xae90, 0x0016, 0x0010, 0xae90, 0x001e, 0x2204, 0x8007, 0x6886, ++ 0x8210, 0x2204, 0x8007, 0x688a, 0x8210, 0x2204, 0x8007, 0x688e, ++ 0x8210, 0x2204, 0x8007, 0x6892, 0x8210, 0xa186, 0x0046, 0x1118, ++ 0xae90, 0x0022, 0x0010, 0xae90, 0x002a, 0x00d6, 0xade8, 0x0025, ++ 0x20a9, 0x0008, 0x2204, 0x8007, 0x206a, 0x8210, 0x8d68, 0x1f04, ++ 0xc4ca, 0x00de, 0x002e, 0x080c, 0x580a, 0x00de, 0x0005, 0x00e6, ++ 0x6018, 0x2070, 0x7000, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, ++ 0x6850, 0xc0e5, 0x6852, 0x0005, 0x00e6, 0x00c6, 0x0076, 0x0066, ++ 0x0056, 0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029, ++ 0xc930, 0x252c, 0x2021, 0xc936, 0x2424, 0x2061, 0xce00, 0x2071, ++ 0xc600, 0x7648, 0x7068, 0xa606, 0x0578, 0x671c, 0xa786, 0x0001, ++ 0x0118, 0xa786, 0x0008, 0x1500, 0x2500, 0xac06, 0x01e8, 0x2400, ++ 0xac06, 0x01d0, 0x080c, 0xc1b8, 0x01b8, 0x080c, 0xc1c8, 0x11a0, ++ 0x6000, 0xa086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1953, 0x001e, ++ 0x080c, 0xae7e, 0x1110, 0x080c, 0x2e6c, 0x080c, 0xae8f, 0x1110, ++ 0x080c, 0x9c09, 0x080c, 0xae54, 0xace0, 0x0018, 0x2001, 0xc617, ++ 0x2004, 0xac02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, ++ 0x005e, 0x006e, 0x007e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0006, ++ 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0xc640, 0xd5a4, 0x0118, ++ 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0118, 0x7030, 0x8000, 0x7032, ++ 0xd5ac, 0x0178, 0x2500, 0xa084, 0x0007, 0xa08e, 0x0003, 0x0148, ++ 0xa08e, 0x0004, 0x0130, 0xa08e, 0x0005, 0x0118, 0x2071, 0xc64a, ++ 0x04c9, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, ++ 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0xc640, 0xd5a4, 0x0118, ++ 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0118, 0x7030, 0x8000, 0x7032, ++ 0xd5ac, 0x0178, 0x2500, 0xa084, 0x0007, 0xa08e, 0x0003, 0x0148, ++ 0xa08e, 0x0004, 0x0130, 0xa08e, 0x0005, 0x0118, 0x2071, 0xc64a, ++ 0x0089, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, ++ 0x00e6, 0x2091, 0x8000, 0x2071, 0xc642, 0x0021, 0x00ee, 0x000e, ++ 0x012e, 0x0005, 0x2e04, 0x8000, 0x2072, 0x1220, 0x8e70, 0x2e04, ++ 0x8000, 0x2072, 0x0005, 0x00e6, 0x2071, 0xc640, 0x0c99, 0x00ee, ++ 0x0005, 0x00e6, 0x2071, 0xc644, 0x0c69, 0x00ee, 0x0005, 0x0126, ++ 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0xc640, 0x7044, 0x8000, ++ 0x7046, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0001, 0x0002, 0x0004, ++ 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, ++ 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0xb0c4 ++}; ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2200ip_length01 = 0xb5c6; ++#else ++unsigned short risc_code_length01 = 0xb5c6; ++#endif ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/ql2300tpx_fw.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,6494 @@ ++/************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ *************************************************************************/ ++/* ++ * Firmware Version 3.02.10 (14:20 Apr 17, 2003) ++ */ ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2300tpx_version = 3*1024+2; ++#else ++unsigned short risc_code_version = 3*1024+2; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned char fw2300tpx_version_str[] = {3, 2,10}; ++#else ++unsigned char firmware_version[] = {3, 2,10}; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++#define fw2300tpx_VERSION_STRING "3.02.10" ++#else ++#define FW_VERSION_STRING "3.02.10" ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2300tpx_addr01 = 0x0800 ; ++#else ++unsigned short risc_code_addr01 = 0x0800 ; ++#endif ++ ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2300tpx_code01[] = { ++#else ++unsigned short risc_code01[] = { ++#endif ++ 0x0470, 0x0000, 0x0000, 0xc920, 0x0000, 0x0003, 0x0002, 0x000a, ++ 0x0117, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030, ++ 0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241, ++ 0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972, ++ 0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, ++ 0x332e, 0x3032, 0x2e31, 0x3020, 0x2020, 0x2020, 0x2400, 0x20a9, ++ 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f, ++ 0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001, ++ 0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000, ++ 0x400f, 0x2091, 0x2800, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, ++ 0x2091, 0x2a00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, ++ 0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00, ++ 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001, ++ 0x0000, 0x20c1, 0x0004, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9, ++ 0x1bff, 0x2059, 0x0000, 0x2b78, 0x7883, 0x0004, 0x2089, 0x28b1, ++ 0x2051, 0x1800, 0x2a70, 0x20e1, 0x0001, 0x20e9, 0x0001, 0x2029, ++ 0x4d00, 0x2031, 0xffff, 0x2039, 0x4cd0, 0x2021, 0x0200, 0x20e9, ++ 0x0001, 0x20a1, 0x0000, 0x20a9, 0x0800, 0x900e, 0x4104, 0x20e9, ++ 0x0001, 0x20a1, 0x1000, 0x900e, 0x2001, 0x0cc0, 0x9084, 0x0fff, ++ 0x20a8, 0x4104, 0x2001, 0x0000, 0x9086, 0x0000, 0x0120, 0x21a8, ++ 0x4104, 0x8001, 0x1de0, 0x7566, 0x766a, 0x7762, 0x746e, 0x7472, ++ 0x00e6, 0x2071, 0x1a8a, 0x2472, 0x00ee, 0x20a1, 0x1cd0, 0x7168, ++ 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x000f, 0x2001, 0x0001, ++ 0x9112, 0x900e, 0x21a8, 0x4104, 0x8211, 0x1de0, 0x7168, 0x3400, ++ 0x8001, 0x9102, 0x0120, 0x0218, 0x20a8, 0x900e, 0x4104, 0x2009, ++ 0x1800, 0x810d, 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x001f, ++ 0x2001, 0x0001, 0x9112, 0x20e9, 0x0001, 0x20a1, 0x0800, 0x900e, ++ 0x20a9, 0x0800, 0x4104, 0x8211, 0x1dd8, 0x080c, 0x0ec6, 0x080c, ++ 0x56e7, 0x080c, 0x94ea, 0x080c, 0x107b, 0x080c, 0x1245, 0x080c, ++ 0x18ae, 0x080c, 0x0d1d, 0x080c, 0x1000, 0x080c, 0x2f6e, 0x080c, ++ 0x6b54, 0x080c, 0x5f51, 0x080c, 0x774d, 0x080c, 0x20b6, 0x080c, ++ 0x7a7b, 0x080c, 0x7190, 0x080c, 0x1ef3, 0x080c, 0x2027, 0x080c, ++ 0x20ab, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004, 0x091d, 0x7880, ++ 0x9086, 0x0002, 0x1190, 0x7883, 0x4000, 0x7837, 0x4000, 0x7833, ++ 0x0010, 0x0e04, 0x0911, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, ++ 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2071, 0x1800, 0x7003, ++ 0x0000, 0x2071, 0x1800, 0x7000, 0x908e, 0x0003, 0x1168, 0x080c, ++ 0x44bf, 0x080c, 0x2f92, 0x080c, 0x6bc5, 0x080c, 0x63e8, 0x080c, ++ 0x7778, 0x080c, 0x2849, 0x0c68, 0x000b, 0x0c88, 0x0940, 0x0941, ++ 0x0ab2, 0x093e, 0x0b69, 0x0d14, 0x0d14, 0x0d14, 0x080c, 0x0d84, ++ 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0x9086, 0x0001, ++ 0x1904, 0x0a90, 0x080c, 0x0e2c, 0x080c, 0x6877, 0x0150, 0x080c, ++ 0x689a, 0x1580, 0x2079, 0x0100, 0x7828, 0x9085, 0x1800, 0x782a, ++ 0x0448, 0x080c, 0x67be, 0x7000, 0x9086, 0x0001, 0x1904, 0x0a90, ++ 0x7090, 0x9086, 0x0028, 0x1904, 0x0a90, 0x2001, 0x0161, 0x2003, ++ 0x0001, 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0x9295, 0x5e2f, ++ 0x7a2a, 0x2011, 0x6739, 0x080c, 0x781a, 0x2011, 0x672c, 0x080c, ++ 0x78e7, 0x2011, 0x554d, 0x080c, 0x781a, 0x2011, 0x8030, 0x901e, ++ 0x738e, 0x0460, 0x080c, 0x4e04, 0x2079, 0x0100, 0x7844, 0x9005, ++ 0x1904, 0x0a90, 0x2011, 0x554d, 0x080c, 0x781a, 0x2001, 0x0265, ++ 0x2001, 0x0205, 0x2003, 0x0000, 0x7840, 0x9084, 0xfffb, 0x7842, ++ 0x2001, 0x1973, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100, ++ 0x080c, 0x568f, 0x00ce, 0x0804, 0x0a90, 0x780f, 0x006b, 0x7a28, ++ 0x9295, 0x5e2f, 0x7a2a, 0x2011, 0x8010, 0x73d4, 0x2001, 0x1974, ++ 0x2003, 0x0001, 0x080c, 0x2718, 0x080c, 0x447f, 0x7240, 0xc284, ++ 0x7242, 0x2001, 0x180c, 0x200c, 0xc1ac, 0xc1cc, 0x2102, 0x080c, ++ 0x8d36, 0x2011, 0x0004, 0x080c, 0xb0b9, 0x080c, 0x5e30, 0x080c, ++ 0x6877, 0x1120, 0x080c, 0x275c, 0x02e0, 0x0400, 0x080c, 0x5696, ++ 0x0140, 0x708f, 0x0001, 0x70cf, 0x0000, 0x080c, 0x4fc7, 0x0804, ++ 0x0a90, 0x080c, 0x4dea, 0xd094, 0x0188, 0x2011, 0x180c, 0x2204, ++ 0xc0cd, 0x2012, 0x080c, 0x4dee, 0xd0d4, 0x1118, 0x080c, 0x275c, ++ 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x00a8, 0x080c, 0x4dee, ++ 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x0060, 0x2011, ++ 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x5f25, 0x1128, 0xd0a4, ++ 0x0118, 0x2204, 0xc0fd, 0x2012, 0x080c, 0x5eeb, 0x0120, 0x7a0c, ++ 0xc2b4, 0x7a0e, 0x00a8, 0x7077, 0x0000, 0x080c, 0x6877, 0x1130, ++ 0x70a8, 0x9005, 0x1168, 0x080c, 0xb4bd, 0x0050, 0x080c, 0xb4bd, ++ 0x70d8, 0xd09c, 0x1128, 0x70a8, 0x9005, 0x0110, 0x080c, 0x5677, ++ 0x70e3, 0x0000, 0x70df, 0x0000, 0x709f, 0x0000, 0x72d8, 0x080c, ++ 0x6877, 0x1170, 0x9016, 0x0016, 0x080c, 0x2515, 0x2019, 0x193c, ++ 0x211a, 0x001e, 0x7057, 0xffff, 0x705b, 0x00ef, 0x707b, 0x0000, ++ 0x2079, 0x1852, 0x7804, 0xd0ac, 0x0108, 0xc295, 0x72da, 0x080c, ++ 0x6877, 0x0118, 0x9296, 0x0004, 0x0548, 0x2011, 0x0001, 0x080c, ++ 0xb0b9, 0x70a3, 0x0000, 0x70a7, 0xffff, 0x7003, 0x0002, 0x2079, ++ 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, 0x00fe, ++ 0x080c, 0x2b1e, 0x2011, 0x0005, 0x080c, 0x8e99, 0x080c, 0x8125, ++ 0x080c, 0x6877, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, ++ 0x2515, 0x61e2, 0x001e, 0x00ce, 0x012e, 0x0420, 0x70a3, 0x0000, ++ 0x70a7, 0xffff, 0x7003, 0x0002, 0x00f6, 0x2079, 0x0100, 0x7827, ++ 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, 0x00fe, 0x2011, 0x0005, ++ 0x080c, 0x8e99, 0x080c, 0x8125, 0x080c, 0x6877, 0x0148, 0x00c6, ++ 0x2061, 0x0100, 0x0016, 0x080c, 0x2515, 0x61e2, 0x001e, 0x00ce, ++ 0x00fe, 0x012e, 0x0005, 0x00c6, 0x080c, 0x6877, 0x1118, 0x20a9, ++ 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x6877, 0x1110, 0x900e, ++ 0x0010, 0x2009, 0x007e, 0x080c, 0x2e11, 0x8108, 0x1f04, 0x0aa3, ++ 0x7077, 0x0000, 0x7078, 0x9084, 0x00ff, 0x707a, 0x70ab, 0x0000, ++ 0x00ce, 0x0005, 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, ++ 0x0002, 0x1904, 0x0b66, 0x70a4, 0x9086, 0xffff, 0x0130, 0x080c, ++ 0x2b1e, 0x080c, 0x8125, 0x0804, 0x0b66, 0x70d8, 0xd0ac, 0x1110, ++ 0xd09c, 0x0540, 0xd084, 0x0530, 0x0006, 0x2001, 0x0103, 0x2003, ++ 0x002b, 0x000e, 0xd08c, 0x01f0, 0x70dc, 0x9086, 0xffff, 0x01b0, ++ 0x080c, 0x2c86, 0x080c, 0x8125, 0x70d8, 0xd094, 0x1904, 0x0b66, ++ 0x2011, 0x0001, 0x080c, 0xb759, 0x0110, 0x2011, 0x0003, 0x901e, ++ 0x080c, 0x2cc0, 0x080c, 0x8125, 0x0804, 0x0b66, 0x70e0, 0x9005, ++ 0x1904, 0x0b66, 0x70a0, 0x9005, 0x1904, 0x0b66, 0x70d8, 0xd0a4, ++ 0x0118, 0xd0b4, 0x0904, 0x0b66, 0x080c, 0x5eeb, 0x1904, 0x0b66, ++ 0x080c, 0x5f3e, 0x1904, 0x0b66, 0x080c, 0x5f25, 0x01c0, 0x0156, ++ 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x5c0d, 0x1118, ++ 0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x0b0c, 0x00ce, ++ 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x0b66, 0x0006, ++ 0x2001, 0x0103, 0x2003, 0x006b, 0x000e, 0x2011, 0x1980, 0x080c, ++ 0x0f36, 0x2011, 0x199a, 0x080c, 0x0f36, 0x7030, 0xc08c, 0x7032, ++ 0x7003, 0x0003, 0x70a7, 0xffff, 0x080c, 0x0e0e, 0x9006, 0x080c, ++ 0x23a6, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c, ++ 0x44f9, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x689a, ++ 0x0150, 0x080c, 0x6877, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, ++ 0x9084, 0xffdf, 0x782a, 0x00fe, 0x2001, 0x19b5, 0x2004, 0x9086, ++ 0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0x8e99, 0x2011, 0x0000, ++ 0x080c, 0x8ea3, 0x080c, 0x8125, 0x080c, 0x820b, 0x012e, 0x00be, ++ 0x0005, 0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, ++ 0x0100, 0x7904, 0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, ++ 0x5660, 0x7940, 0x918c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, ++ 0x7827, 0x0040, 0xd19c, 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, ++ 0x0156, 0x7954, 0xd1ac, 0x1904, 0x0bf6, 0x2001, 0x1974, 0x2004, ++ 0x9005, 0x1518, 0x080c, 0x27d7, 0x1148, 0x2001, 0x0001, 0x080c, ++ 0x2747, 0x2001, 0x0001, 0x080c, 0x272a, 0x00b8, 0x080c, 0x27df, ++ 0x1138, 0x9006, 0x080c, 0x2747, 0x9006, 0x080c, 0x272a, 0x0068, ++ 0x080c, 0x27e7, 0x1d50, 0x2001, 0x1965, 0x2004, 0xd0fc, 0x0108, ++ 0x0020, 0x080c, 0x2541, 0x0804, 0x0cd6, 0x080c, 0x6888, 0x0148, ++ 0x080c, 0x689a, 0x1118, 0x080c, 0x6b4f, 0x0050, 0x080c, 0x687f, ++ 0x0dd0, 0x080c, 0x6b4a, 0x080c, 0x6b40, 0x080c, 0x67be, 0x0058, ++ 0x080c, 0x6877, 0x0140, 0x2009, 0x00f8, 0x080c, 0x5660, 0x7843, ++ 0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, ++ 0x080c, 0x6877, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x0cdb, 0x1f04, ++ 0x0bd5, 0x0070, 0x7824, 0x080c, 0x6891, 0x0118, 0xd0ac, 0x1904, ++ 0x0cdb, 0x9084, 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804, 0x0cdb, ++ 0x2001, 0x0001, 0x080c, 0x23a6, 0x0804, 0x0cee, 0x2001, 0x1974, ++ 0x2004, 0x9005, 0x1518, 0x080c, 0x27d7, 0x1148, 0x2001, 0x0001, ++ 0x080c, 0x2747, 0x2001, 0x0001, 0x080c, 0x272a, 0x00b8, 0x080c, ++ 0x27df, 0x1138, 0x9006, 0x080c, 0x2747, 0x9006, 0x080c, 0x272a, ++ 0x0068, 0x080c, 0x27e7, 0x1d50, 0x2001, 0x1965, 0x2004, 0xd0fc, ++ 0x0108, 0x0020, 0x080c, 0x2541, 0x0804, 0x0cd6, 0x7850, 0x9085, ++ 0x0040, 0x7852, 0x7938, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, ++ 0x27ef, 0x9085, 0x2000, 0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04, ++ 0x0c2f, 0x080c, 0x78c7, 0x1f04, 0x0c2f, 0x7850, 0x9085, 0x0400, ++ 0x9084, 0xdfbf, 0x7852, 0x793a, 0x080c, 0x6888, 0x0148, 0x080c, ++ 0x689a, 0x1118, 0x080c, 0x6b4f, 0x0050, 0x080c, 0x687f, 0x0dd0, ++ 0x080c, 0x6b4a, 0x080c, 0x6b40, 0x080c, 0x67be, 0x0020, 0x2009, ++ 0x00f8, 0x080c, 0x5660, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x0c55, ++ 0x7850, 0x9085, 0x1400, 0x7852, 0x080c, 0x6877, 0x0120, 0x7843, ++ 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, 0x2019, 0xea60, 0x080c, ++ 0x0d15, 0x7820, 0xd09c, 0x1588, 0x080c, 0x6877, 0x0904, 0x0cbb, ++ 0x7824, 0xd0ac, 0x1904, 0x0cdb, 0x080c, 0x689a, 0x1530, 0x0046, ++ 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e, 0x7827, 0x1800, 0x080c, ++ 0x27ef, 0x7824, 0x9084, 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, ++ 0x2001, 0x180f, 0x2004, 0x9084, 0x9000, 0x0110, 0x080c, 0x0cfc, ++ 0x8421, 0x1158, 0x1d04, 0x0c96, 0x080c, 0x78c7, 0x080c, 0x6b4a, ++ 0x080c, 0x6b40, 0x7003, 0x0001, 0x04f0, 0x8319, 0x1940, 0x1d04, ++ 0x0ca3, 0x080c, 0x78c7, 0x2009, 0x1968, 0x2104, 0x9005, 0x0118, ++ 0x8001, 0x200a, 0x1178, 0x200b, 0x000a, 0x7827, 0x0048, 0x20a9, ++ 0x0002, 0x080c, 0x27d0, 0x7924, 0x080c, 0x27ef, 0xd19c, 0x0110, ++ 0x080c, 0x2718, 0x00d8, 0x080c, 0x6888, 0x1140, 0x94a2, 0x03e8, ++ 0x1128, 0x080c, 0x6853, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, ++ 0x080c, 0x27ef, 0x7824, 0x080c, 0x6891, 0x0110, 0xd0ac, 0x1158, ++ 0x9084, 0x1800, 0x0950, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, ++ 0x080c, 0x23a6, 0x0078, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, ++ 0x7904, 0x918d, 0x0002, 0x7906, 0x7827, 0x0048, 0x7828, 0x9085, ++ 0x0028, 0x782a, 0x7850, 0x9085, 0x0400, 0x7852, 0x2001, 0x1974, ++ 0x2003, 0x0000, 0x9006, 0x78f2, 0x015e, 0x003e, 0x000e, 0x012e, ++ 0x00fe, 0x004e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0036, 0x0046, ++ 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x2f92, ++ 0x0061, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, ++ 0x003e, 0x001e, 0x000e, 0x0005, 0x0005, 0x080c, 0xb759, 0x0120, ++ 0x1d04, 0x0d1c, 0x080c, 0x78c7, 0x0005, 0x2a70, 0x2061, 0x1978, ++ 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x000a, 0x600f, 0x0117, ++ 0x2001, 0x194b, 0x900e, 0x2102, 0x718e, 0x2001, 0x0100, 0x2004, ++ 0x9082, 0x0002, 0x0218, 0x7057, 0xffff, 0x0008, 0x7156, 0x705f, ++ 0xffff, 0x7176, 0x717a, 0x080c, 0xb4bd, 0x70ef, 0x00c0, 0x2061, ++ 0x193b, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, 0x600f, 0x0200, ++ 0x6013, 0x00ff, 0x6017, 0x000f, 0x611a, 0x601f, 0x07d0, 0x2061, ++ 0x1943, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, 0x0200, 0x6013, ++ 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, 0x1956, 0x6003, ++ 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001, ++ 0x182a, 0x2102, 0x0005, 0x9016, 0x080c, 0x5c0d, 0x1178, 0xb804, ++ 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, 0xff00, 0x98c6, ++ 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, 0x8108, 0x9186, ++ 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, 0x0e04, 0x0d86, ++ 0x0006, 0x0016, 0x2001, 0x8002, 0x0006, 0x2079, 0x0000, 0x000e, ++ 0x7882, 0x7836, 0x001e, 0x798e, 0x000e, 0x788a, 0x000e, 0x7886, ++ 0x3900, 0x789a, 0x7833, 0x0012, 0x2091, 0x5000, 0x0156, 0x00d6, ++ 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1a65, 0x7a18, 0x226a, ++ 0x8d68, 0x7a1c, 0x226a, 0x782c, 0x2019, 0x1a72, 0x201a, 0x2019, ++ 0x1a75, 0x9016, 0x7808, 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, ++ 0x8318, 0x9386, 0x1a8a, 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, ++ 0x2011, 0xdead, 0x2019, 0x1a73, 0x782c, 0x201a, 0x8318, 0x221a, ++ 0x7803, 0x0000, 0x2069, 0x1a45, 0x901e, 0x20a9, 0x0020, 0x7b26, ++ 0x7a28, 0x226a, 0x8d68, 0x8318, 0x1f04, 0x0dcf, 0x002e, 0x003e, ++ 0x00de, 0x015e, 0x2079, 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, ++ 0x2001, 0x0089, 0x2004, 0xd084, 0x0180, 0x2001, 0x19e7, 0x2004, ++ 0x9005, 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, ++ 0x008a, 0x2003, 0x0002, 0x2003, 0x1001, 0x080c, 0x4df9, 0x1108, ++ 0x0011, 0x0cd8, 0x0005, 0x0026, 0x0126, 0x2011, 0x0080, 0x080c, ++ 0x0e8d, 0x20a9, 0x0900, 0x080c, 0x0eae, 0x2011, 0x0040, 0x080c, ++ 0x0e8d, 0x20a9, 0x0900, 0x080c, 0x0eae, 0x0c78, 0x0026, 0x080c, ++ 0x0e9a, 0x1118, 0x2011, 0x0040, 0x0098, 0x2011, 0x010e, 0x2214, ++ 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0xa880, 0x0010, ++ 0x2011, 0x6840, 0xd0e4, 0x70f3, 0x0000, 0x1128, 0x70f3, 0x0fa0, ++ 0x080c, 0x0e9f, 0x002e, 0x0005, 0x0026, 0x080c, 0x0e9a, 0x0128, ++ 0xd0a4, 0x1138, 0x2011, 0xcdd5, 0x0010, 0x2011, 0x0080, 0x080c, ++ 0x0e9f, 0x002e, 0x0005, 0x0026, 0x70f3, 0x0000, 0x080c, 0x0e9a, ++ 0x1148, 0x080c, 0x27e7, 0x1118, 0x2011, 0x8484, 0x0058, 0x2011, ++ 0x8282, 0x0040, 0x080c, 0x27e7, 0x1118, 0x2011, 0xcdc5, 0x0010, ++ 0x2011, 0xcac2, 0x080c, 0x0e9f, 0x002e, 0x0005, 0x00e6, 0x0006, ++ 0x2071, 0x1800, 0xd0b4, 0x70ec, 0x1148, 0xc0e4, 0x0080, 0x70ee, ++ 0x0026, 0x9094, 0x00c0, 0x0449, 0x002e, 0x0048, 0x0006, 0x3b00, ++ 0x9084, 0xff3f, 0x20d8, 0x000e, 0x70f3, 0x0000, 0xc0e5, 0x0079, ++ 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0xd0e4, 0x70ec, ++ 0x1110, 0xc0dc, 0x0008, 0xc0dd, 0x0011, 0x00ee, 0x0005, 0x70ee, ++ 0x7000, 0x9084, 0x0007, 0x000b, 0x0005, 0x0e55, 0x0e2c, 0x0e2c, ++ 0x0e0e, 0x0e3b, 0x0e2c, 0x0e2c, 0x0e3b, 0x0016, 0x3b08, 0x3a00, ++ 0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0, ++ 0x001e, 0x0005, 0x2001, 0x183b, 0x2004, 0xd0dc, 0x0005, 0x9e86, ++ 0x1800, 0x190c, 0x0d84, 0x70ec, 0xd0e4, 0x0108, 0xc2e5, 0x72ee, ++ 0xd0e4, 0x1118, 0x9294, 0x00c0, 0x0c01, 0x0005, 0x1d04, 0x0eae, ++ 0x2091, 0x6000, 0x1f04, 0x0eae, 0x0005, 0x890e, 0x810e, 0x810f, ++ 0x9194, 0x003f, 0x918c, 0xffc0, 0x0005, 0x0006, 0x2200, 0x914d, ++ 0x894f, 0x894d, 0x894d, 0x000e, 0x000e, 0x0005, 0x01d6, 0x0146, ++ 0x0036, 0x0096, 0x2061, 0x1882, 0x600b, 0x0000, 0x600f, 0x0000, ++ 0x6003, 0x0000, 0x6007, 0x0000, 0x2009, 0xffc0, 0x2105, 0x0006, ++ 0x2001, 0xaaaa, 0x200f, 0x2019, 0x5555, 0x9016, 0x2049, 0x0bff, ++ 0xab02, 0xa001, 0xa001, 0xa800, 0x9306, 0x1138, 0x2105, 0x9306, ++ 0x0120, 0x8210, 0x99c8, 0x0400, 0x0c98, 0x000e, 0x200f, 0x2001, ++ 0x1892, 0x928a, 0x000e, 0x1638, 0x928a, 0x0006, 0x2011, 0x0006, ++ 0x1210, 0x2011, 0x0000, 0x2202, 0x9006, 0x2008, 0x82ff, 0x01b0, ++ 0x8200, 0x600a, 0x600f, 0xffff, 0x6003, 0x0002, 0x6007, 0x0000, ++ 0x0026, 0x2019, 0x0010, 0x9280, 0x0001, 0x20e8, 0x21a0, 0x21a8, ++ 0x4104, 0x8319, 0x1de0, 0x8211, 0x1da0, 0x002e, 0x009e, 0x003e, ++ 0x014e, 0x01de, 0x0005, 0x2011, 0x000e, 0x08e8, 0x0016, 0x0026, ++ 0x0096, 0x3348, 0x080c, 0x0eb5, 0x2100, 0x9300, 0x2098, 0x22e0, ++ 0x009e, 0x002e, 0x001e, 0x0036, 0x3518, 0x20a9, 0x0001, 0x4002, ++ 0x8007, 0x4004, 0x8319, 0x1dd8, 0x003e, 0x0005, 0x20e9, 0x0001, ++ 0x71b0, 0x81ff, 0x11c0, 0x9006, 0x2009, 0x0200, 0x20a9, 0x0002, ++ 0x9298, 0x0018, 0x23a0, 0x4001, 0x2009, 0x0700, 0x20a9, 0x0002, ++ 0x9298, 0x0008, 0x23a0, 0x4001, 0x7074, 0x8007, 0x7178, 0x810f, ++ 0x20a9, 0x0002, 0x4001, 0x9298, 0x000c, 0x23a0, 0x900e, 0x080c, ++ 0x0d6b, 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x4001, 0x0005, ++ 0x89ff, 0x0140, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x0fe0, ++ 0x009e, 0x0cb0, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x1057, ++ 0x090c, 0x0d84, 0x00ee, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0026, ++ 0x0036, 0x0126, 0x2091, 0x8000, 0x00c9, 0x2071, 0x1800, 0x73bc, ++ 0x702c, 0x9016, 0x9045, 0x0158, 0x8210, 0x9906, 0x090c, 0x0d84, ++ 0x2300, 0x9202, 0x0120, 0x1a0c, 0x0d84, 0xa000, 0x0c98, 0x012e, ++ 0x003e, 0x002e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x0086, 0x00e6, ++ 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1904, 0x7010, 0x9005, ++ 0x0140, 0x7018, 0x9045, 0x0128, 0x9906, 0x090c, 0x0d84, 0xa000, ++ 0x0cc8, 0x012e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x00e6, 0x2071, ++ 0x1800, 0x0126, 0x2091, 0x8000, 0x70bc, 0x8001, 0x0270, 0x70be, ++ 0x702c, 0x2048, 0x9085, 0x0001, 0xa800, 0x702e, 0xa803, 0x0000, ++ 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, ++ 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x70bc, 0x90ca, 0x0040, ++ 0x0268, 0x8001, 0x70be, 0x702c, 0x2048, 0xa800, 0x702e, 0xa803, ++ 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, ++ 0x00e6, 0x0126, 0x2091, 0x8000, 0x0016, 0x890e, 0x810e, 0x810f, ++ 0x9184, 0x003f, 0xa862, 0x9184, 0xffc0, 0xa85e, 0x001e, 0x0020, ++ 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x702c, 0xa802, ++ 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x012e, 0x00ee, 0x0005, ++ 0x2071, 0x1800, 0x9026, 0x2009, 0x0000, 0x2049, 0x0400, 0x2900, ++ 0x702e, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, ++ 0x9886, 0x0440, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, ++ 0x1882, 0x7000, 0x9005, 0x11a0, 0x2001, 0x0534, 0xa802, 0x2048, ++ 0x2009, 0x4d00, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, ++ 0x8420, 0x9886, 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, ++ 0x2071, 0x1882, 0x7104, 0x7200, 0x82ff, 0x01d0, 0x7308, 0x8318, ++ 0x831f, 0x831b, 0x831b, 0x7312, 0x8319, 0x2001, 0x0800, 0xa802, ++ 0x2048, 0x8900, 0xa802, 0x2040, 0xa95e, 0xaa62, 0x8420, 0x2300, ++ 0x9906, 0x0130, 0x2848, 0x9188, 0x0040, 0x9291, 0x0000, 0x0c88, ++ 0xa803, 0x0000, 0x2071, 0x1800, 0x74ba, 0x74be, 0x0005, 0x00e6, ++ 0x0016, 0x9984, 0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982, ++ 0x0400, 0x02b8, 0x9982, 0x0440, 0x0278, 0x9982, 0x0534, 0x0288, ++ 0x9982, 0x0800, 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, ++ 0x1882, 0x7010, 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, ++ 0x0005, 0x9006, 0x0cd8, 0x00e6, 0x2071, 0x19e6, 0x7007, 0x0000, ++ 0x9006, 0x701e, 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, ++ 0x8004, 0x7012, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, ++ 0xa06f, 0x0000, 0x2071, 0x19e6, 0x701c, 0x9088, 0x19f0, 0x280a, ++ 0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0d84, ++ 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe, ++ 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, ++ 0x19e6, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021, ++ 0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, ++ 0x7007, 0x0006, 0x7000, 0x0002, 0x10ce, 0x10cc, 0x10cc, 0x10cc, ++ 0x1234, 0x1234, 0x1234, 0x1234, 0x080c, 0x0d84, 0x701c, 0x7120, ++ 0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, ++ 0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x19f0, 0x2004, 0x700a, ++ 0x2048, 0x8108, 0x918c, 0x003f, 0x7122, 0x782b, 0x0026, 0xa88c, ++ 0x7802, 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0xa878, ++ 0x700e, 0xa870, 0x7016, 0xa874, 0x701a, 0xa868, 0x009e, 0xd084, ++ 0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, 0x00b1, ++ 0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040, ++ 0x1210, 0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812, 0x782b, ++ 0x0020, 0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, ++ 0x0136, 0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098, 0x20e9, ++ 0x0000, 0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011, 0x0040, ++ 0x9182, 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8, 0x4006, ++ 0x8203, 0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b, 0x0001, ++ 0x015e, 0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009, 0x19e6, ++ 0x2104, 0xc095, 0x200a, 0x080c, 0x10ab, 0x0005, 0x0016, 0x00e6, ++ 0x2071, 0x19e6, 0x00f6, 0x2079, 0x0080, 0x792c, 0x782b, 0x0002, ++ 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee, ++ 0x001e, 0x0005, 0x10bc, 0x1161, 0x1195, 0x0d84, 0x0d84, 0x1240, ++ 0x0d84, 0x918c, 0x0700, 0x1550, 0x0136, 0x0146, 0x0156, 0x7014, ++ 0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088, 0x782b, ++ 0x0040, 0x7010, 0x20a8, 0x4005, 0x3400, 0x701a, 0x015e, 0x014e, ++ 0x013e, 0x700c, 0x9005, 0x0578, 0x7800, 0x7802, 0x7804, 0x7806, ++ 0x080c, 0x1101, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0100, ++ 0x009e, 0x7007, 0x0000, 0x080c, 0x10bc, 0x0005, 0x7008, 0x0096, ++ 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c, 0x0700, 0x1150, ++ 0x700c, 0x9005, 0x0180, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c, ++ 0x1116, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, ++ 0x7007, 0x0000, 0x0080, 0x0096, 0x7008, 0x2048, 0x7800, 0xa88e, ++ 0x7804, 0xa892, 0x7808, 0xa896, 0x780c, 0xa89a, 0xa86f, 0x0100, ++ 0x009e, 0x7007, 0x0000, 0x0096, 0x00d6, 0x7008, 0x2048, 0x2001, ++ 0x18ad, 0x2004, 0x9906, 0x1128, 0xa89c, 0x080f, 0x00de, 0x009e, ++ 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, 0x7008, 0x2048, 0x0081, ++ 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, 0x008e, 0x00de, 0x009e, ++ 0x080c, 0x10ab, 0x0005, 0x00de, 0x009e, 0x080c, 0x10ab, 0x0005, ++ 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d, 0x090c, 0x0d84, ++ 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, 0x0030, 0xa883, 0x0000, ++ 0xa897, 0x4002, 0x080c, 0x619c, 0xa09f, 0x0000, 0xa0a3, 0x0000, ++ 0x2848, 0x080c, 0x0fe0, 0x009e, 0x0005, 0x00a6, 0xa0a0, 0x904d, ++ 0x090c, 0x0d84, 0xa06c, 0x908e, 0x0100, 0x0128, 0xa87b, 0x0001, ++ 0xa883, 0x0000, 0x00c0, 0xa80c, 0x2050, 0xb004, 0x9005, 0x0198, ++ 0xa80e, 0x2050, 0x8006, 0x8006, 0x8007, 0x908c, 0x003f, 0x9084, ++ 0xffc0, 0x9080, 0x0002, 0xa076, 0xa172, 0xb000, 0xa07a, 0x2810, ++ 0x080c, 0x108c, 0x0078, 0xa97c, 0xa894, 0x0016, 0x0006, 0x080c, ++ 0x619c, 0x000e, 0x001e, 0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c, ++ 0x9554, 0x00ce, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, 0x782b, ++ 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, 0x0005, ++ 0x7007, 0x0000, 0x080c, 0x10bc, 0x0005, 0x0126, 0x2091, 0x2200, ++ 0x2079, 0x0300, 0x2071, 0x1a30, 0x7003, 0x0000, 0x78bf, 0x00f6, ++ 0x00c1, 0x7803, 0x0003, 0x780f, 0x0000, 0x20a9, 0x01ec, 0x2061, ++ 0xcd39, 0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002, 0x7916, 0x1f04, ++ 0x1259, 0x7807, 0x0001, 0x7803, 0x0000, 0x7803, 0x0001, 0x012e, ++ 0x0005, 0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c, 0x0110, 0x7820, ++ 0x0cd8, 0x2001, 0x1a31, 0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac, ++ 0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0001, 0x7827, 0x0030, ++ 0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x1a45, 0x781f, 0xff00, ++ 0x781b, 0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f, ++ 0x0303, 0x2061, 0x1a45, 0x602f, 0x1cd0, 0x2001, 0x1818, 0x2004, ++ 0x9082, 0x1cd0, 0x6032, 0x603b, 0x1cdd, 0x00ce, 0x0005, 0x0126, ++ 0x2091, 0x2200, 0x7808, 0xd09c, 0x0158, 0x7820, 0x908c, 0xf000, ++ 0x1588, 0x908a, 0x0021, 0x1a0c, 0x0d84, 0x0043, 0x012e, 0x0005, ++ 0x9084, 0x0070, 0x190c, 0x0d84, 0x012e, 0x0005, 0x12d8, 0x12d8, ++ 0x12e1, 0x12e6, 0x12ea, 0x12ef, 0x1317, 0x131b, 0x1329, 0x132d, ++ 0x12d8, 0x13b6, 0x13ba, 0x141a, 0x12d8, 0x12d8, 0x12d8, 0x12d8, ++ 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, ++ 0x12d8, 0x12f1, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, 0x12d8, ++ 0x080c, 0x0d84, 0x2009, 0x0048, 0x2060, 0x080c, 0x95ce, 0x012e, ++ 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006, 0x0005, 0x7004, 0xc085, ++ 0x7006, 0x0005, 0x080c, 0x1421, 0x080c, 0x14c5, 0x0005, 0x080c, ++ 0x0d84, 0x080c, 0x1421, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, ++ 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0x95ce, 0x2001, 0x015d, ++ 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109, 0x0160, 0x2001, 0x0201, ++ 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, ++ 0x080c, 0x1426, 0x2001, 0x0307, 0x2003, 0x8000, 0x0005, 0x7004, ++ 0xc095, 0x7006, 0x0005, 0x080c, 0x1421, 0x2060, 0x6014, 0x0096, ++ 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0x95ce, ++ 0x0005, 0x080c, 0x1421, 0x080c, 0x0d84, 0x080c, 0x1421, 0x080c, ++ 0x13a1, 0x7827, 0x0018, 0x79ac, 0xd1dc, 0x0540, 0x7827, 0x0015, ++ 0x7828, 0x782b, 0x0000, 0x9065, 0x0138, 0x2001, 0x020d, 0x2003, ++ 0x0050, 0x2003, 0x0020, 0x0400, 0x7004, 0x9005, 0x1180, 0x78ab, ++ 0x0004, 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, 0x0d84, ++ 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0478, 0x78ab, ++ 0x0004, 0x7803, 0x0001, 0x080c, 0x13ba, 0x0005, 0x7828, 0x782b, ++ 0x0000, 0x9065, 0x090c, 0x0d84, 0x6014, 0x2048, 0x78ab, 0x0004, ++ 0x918c, 0x0700, 0x0198, 0x080c, 0x724d, 0x080c, 0x1827, 0x080c, ++ 0xb0ad, 0x0158, 0xa9ac, 0xa936, 0xa9b0, 0xa93a, 0xa83f, 0xffff, ++ 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882, 0x0005, 0x6010, 0x00b6, ++ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c, 0xb456, 0x2029, 0x00c8, ++ 0x8529, 0x0128, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, ++ 0x080c, 0xcce2, 0xd5a4, 0x1118, 0x080c, 0x1426, 0x0005, 0x080c, ++ 0x724d, 0x080c, 0x1827, 0x0005, 0x781f, 0x0300, 0x7803, 0x0001, ++ 0x0005, 0x0016, 0x0066, 0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, ++ 0x918c, 0x0007, 0x9186, 0x0003, 0x0120, 0x2001, 0x0016, 0x080c, ++ 0x1492, 0x00fe, 0x007e, 0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, ++ 0x7006, 0x0005, 0x7104, 0x9184, 0x0004, 0x190c, 0x0d84, 0xd184, ++ 0x1189, 0xd19c, 0x0158, 0xc19c, 0x7106, 0x2001, 0x020d, 0x2003, ++ 0x0050, 0x2003, 0x0020, 0x080c, 0x1426, 0x0005, 0x81ff, 0x190c, ++ 0x0d84, 0x0005, 0xc184, 0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6, ++ 0x15c8, 0x2071, 0x0200, 0x080c, 0x14b9, 0x6014, 0x9005, 0x0590, ++ 0x0096, 0x2048, 0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029, ++ 0x0148, 0x908e, 0x0048, 0x1530, 0x00f6, 0x2c78, 0x080c, 0x150d, ++ 0x00fe, 0x00a8, 0x00f6, 0x2c78, 0x080c, 0x163f, 0x00fe, 0x2009, ++ 0x01f4, 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, ++ 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, 0x0401, 0x0040, 0x2001, ++ 0x020d, 0x2003, 0x0020, 0x080c, 0x1269, 0x7803, 0x0001, 0x00ee, ++ 0x001e, 0x0005, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, ++ 0x0069, 0x0ca8, 0x0031, 0x2060, 0x2009, 0x0053, 0x080c, 0x95ce, ++ 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c, 0x13a1, ++ 0x00d6, 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, 0x0508, 0x6804, ++ 0x9005, 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, 0x79bc, 0xd1a4, ++ 0x1520, 0x79b8, 0x918c, 0x0fff, 0x0178, 0x9182, 0x0841, 0x1260, ++ 0x9188, 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, 0x810c, 0x04e1, ++ 0x6827, 0x0001, 0x8109, 0x1dd8, 0x04b9, 0x6827, 0x0002, 0x04a1, ++ 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, 0x11e0, 0x6804, 0x9005, ++ 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c8, 0x080c, 0x724d, 0x080c, ++ 0x1827, 0x0070, 0x7827, 0x0015, 0x782b, 0x0000, 0x2001, 0x020d, ++ 0x2003, 0x0020, 0x2001, 0x0307, 0x2003, 0x0300, 0x7803, 0x0001, ++ 0x00de, 0x0005, 0x682c, 0x9084, 0x5400, 0x9086, 0x5400, 0x0d50, ++ 0x7827, 0x0015, 0x782b, 0x0000, 0x7803, 0x0001, 0x6800, 0x9085, ++ 0x1800, 0x6802, 0x00de, 0x0005, 0x6824, 0x9084, 0x0003, 0x1de0, ++ 0x0005, 0x2001, 0x0030, 0x2c08, 0x621c, 0x0021, 0x7830, 0x9086, ++ 0x0041, 0x0005, 0x00f6, 0x2079, 0x0300, 0x0006, 0x7808, 0xd09c, ++ 0x0140, 0x0016, 0x0026, 0x00c6, 0x080c, 0x129f, 0x00ce, 0x002e, ++ 0x001e, 0x000e, 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, ++ 0x2009, 0xff00, 0x8109, 0x0130, 0x7818, 0xd0bc, 0x1dd8, 0x000e, ++ 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, ++ 0x0d84, 0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060, ++ 0xd1bc, 0x1110, 0x7054, 0x2060, 0x0005, 0x00e6, 0x0016, 0x2071, ++ 0x0200, 0x0c79, 0x7358, 0x745c, 0x6014, 0x905d, 0x0598, 0x2b48, ++ 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c, 0xb431, ++ 0xab42, 0xac3e, 0x2001, 0x1874, 0x2004, 0xd0b4, 0x1170, 0x601c, ++ 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, ++ 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, 0x080c, 0x1cfd, 0x1190, ++ 0x080c, 0x168e, 0x2a00, 0xa816, 0x0130, 0x2800, 0xa80e, 0x2c05, ++ 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, 0x781f, 0x0300, 0x001e, ++ 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020, 0x001e, 0x00ee, ++ 0x080c, 0x1426, 0x0005, 0x080c, 0x0d84, 0x2ff0, 0x0126, 0x2091, ++ 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0x903e, 0x2730, 0xa864, ++ 0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088, 0x1cdd, 0x2165, 0x0002, ++ 0x1537, 0x1584, 0x1537, 0x1537, 0x1537, 0x1566, 0x1537, 0x153b, ++ 0x1530, 0x157b, 0x1537, 0x1537, 0x1537, 0x1537, 0x154f, 0x1545, ++ 0xa964, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0904, 0x157b, 0x9085, ++ 0x0001, 0x0804, 0x1637, 0xa87c, 0xd0bc, 0x0dc8, 0xa890, 0xa842, ++ 0xa88c, 0xa83e, 0xa888, 0x0804, 0x158b, 0xa87c, 0xd0bc, 0x0d78, ++ 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x15da, 0xa87c, ++ 0xd0bc, 0x0d28, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa804, 0x9045, ++ 0x090c, 0x0d84, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1cdd, ++ 0x2065, 0xa888, 0xd19c, 0x1904, 0x15da, 0x0428, 0xa87c, 0xd0ac, ++ 0x0970, 0xa804, 0x9045, 0x090c, 0x0d84, 0xa164, 0xa91a, 0x91ec, ++ 0x000f, 0x9d80, 0x1cdd, 0x2065, 0x9006, 0xa842, 0xa83e, 0xd19c, ++ 0x1904, 0x15da, 0x0080, 0xa87c, 0xd0ac, 0x0904, 0x1537, 0x9006, ++ 0xa842, 0xa83e, 0x0804, 0x15da, 0xa87c, 0xd0ac, 0x0904, 0x1537, ++ 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d84, ++ 0x9082, 0x001b, 0x0002, 0x15ae, 0x15ae, 0x15b0, 0x15ae, 0x15ae, ++ 0x15ae, 0x15b6, 0x15ae, 0x15ae, 0x15ae, 0x15bc, 0x15ae, 0x15ae, ++ 0x15ae, 0x15c2, 0x15ae, 0x15ae, 0x15ae, 0x15c8, 0x15ae, 0x15ae, ++ 0x15ae, 0x15ce, 0x15ae, 0x15ae, 0x15ae, 0x15d4, 0x080c, 0x0d84, ++ 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x161f, 0xa584, 0xa488, ++ 0xa38c, 0xa290, 0x0804, 0x161f, 0xa594, 0xa498, 0xa39c, 0xa2a0, ++ 0x0804, 0x161f, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x161f, ++ 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x161f, 0xa5c4, 0xa4c8, ++ 0xa3cc, 0xa2d0, 0x0804, 0x161f, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, ++ 0x0804, 0x161f, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d84, 0x9082, ++ 0x001b, 0x0002, 0x15fd, 0x15fb, 0x15fb, 0x15fb, 0x15fb, 0x15fb, ++ 0x1604, 0x15fb, 0x15fb, 0x15fb, 0x15fb, 0x15fb, 0x160b, 0x15fb, ++ 0x15fb, 0x15fb, 0x15fb, 0x15fb, 0x1612, 0x15fb, 0x15fb, 0x15fb, ++ 0x15fb, 0x15fb, 0x1619, 0x080c, 0x0d84, 0xa56c, 0xa470, 0xa774, ++ 0xa678, 0xa37c, 0xa280, 0x00d8, 0xa584, 0xa488, 0xa78c, 0xa690, ++ 0xa394, 0xa298, 0x00a0, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, ++ 0xa2b0, 0x0068, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, ++ 0x0030, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0xab2e, ++ 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, 0x8c60, 0x2c1d, ++ 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x8109, 0xa916, 0x1150, 0x3e60, ++ 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x012e, ++ 0x0005, 0x2800, 0xa80e, 0xab0a, 0x2c00, 0xa812, 0x0c80, 0x2ff0, ++ 0x0126, 0x2091, 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e, ++ 0x2061, 0x1cd8, 0xa80b, 0x1cd8, 0x2c05, 0xa812, 0xa964, 0xa91a, ++ 0xa87c, 0xd0ac, 0x090c, 0x0d84, 0x9006, 0xa842, 0xa83e, 0x2c05, ++ 0x908a, 0x0034, 0x1a0c, 0x0d84, 0xadcc, 0xacd0, 0xafd4, 0xaed8, ++ 0xabdc, 0xaae0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, ++ 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0xa988, 0x918a, 0x0002, 0xa916, ++ 0x1150, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, ++ 0x9006, 0x012e, 0x0005, 0xa804, 0x9045, 0x090c, 0x0d84, 0xa80e, ++ 0xa064, 0xa81a, 0x9084, 0x000f, 0x9080, 0x1cdd, 0x2015, 0x82ff, ++ 0x090c, 0x0d84, 0xaa0a, 0x2205, 0xa812, 0x0c18, 0x903e, 0x2730, ++ 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1783, 0x16e5, 0x16e5, ++ 0x1783, 0x1783, 0x177d, 0x1783, 0x16e5, 0x1783, 0x1734, 0x1734, ++ 0x1783, 0x1783, 0x1783, 0x177a, 0x1734, 0xc0fc, 0xa882, 0xab2c, ++ 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1785, 0x2c05, 0x908a, ++ 0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x16d1, 0x16cf, ++ 0x16cf, 0x16cf, 0x16cf, 0x16cf, 0x16d5, 0x16cf, 0x16cf, 0x16cf, ++ 0x16cf, 0x16cf, 0x16d9, 0x16cf, 0x16cf, 0x16cf, 0x16cf, 0x16cf, ++ 0x16dd, 0x16cf, 0x16cf, 0x16cf, 0x16cf, 0x16cf, 0x16e1, 0x080c, ++ 0x0d84, 0xa774, 0xa678, 0x0804, 0x1785, 0xa78c, 0xa690, 0x0804, ++ 0x1785, 0xa7a4, 0xa6a8, 0x0804, 0x1785, 0xa7bc, 0xa6c0, 0x0804, ++ 0x1785, 0xa7d4, 0xa6d8, 0x0804, 0x1785, 0x2c05, 0x908a, 0x0036, ++ 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x1708, 0x1708, 0x170a, ++ 0x1708, 0x1708, 0x1708, 0x1710, 0x1708, 0x1708, 0x1708, 0x1716, ++ 0x1708, 0x1708, 0x1708, 0x171c, 0x1708, 0x1708, 0x1708, 0x1722, ++ 0x1708, 0x1708, 0x1708, 0x1728, 0x1708, 0x1708, 0x1708, 0x172e, ++ 0x080c, 0x0d84, 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x1785, ++ 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, 0x1785, 0xa594, 0xa498, ++ 0xa39c, 0xa2a0, 0x0804, 0x1785, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, ++ 0x0804, 0x1785, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x1785, ++ 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x1785, 0xa5d4, 0xa4d8, ++ 0xa3dc, 0xa2e0, 0x0804, 0x1785, 0x2c05, 0x908a, 0x0034, 0x1a0c, ++ 0x0d84, 0x9082, 0x001b, 0x0002, 0x1757, 0x1755, 0x1755, 0x1755, ++ 0x1755, 0x1755, 0x175e, 0x1755, 0x1755, 0x1755, 0x1755, 0x1755, ++ 0x1765, 0x1755, 0x1755, 0x1755, 0x1755, 0x1755, 0x176c, 0x1755, ++ 0x1755, 0x1755, 0x1755, 0x1755, 0x1773, 0x080c, 0x0d84, 0xa56c, ++ 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, 0x0438, 0xa584, 0xa488, ++ 0xa78c, 0xa690, 0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, 0xa7a4, ++ 0xa6a8, 0xa3ac, 0xa2b0, 0x00c8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, ++ 0xa3c4, 0xa2c8, 0x0090, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, ++ 0xa2e0, 0x0058, 0x9d86, 0x000e, 0x1130, 0x080c, 0x1c9b, 0x1904, ++ 0x168e, 0x900e, 0x0050, 0x080c, 0x0d84, 0xab2e, 0xaa32, 0xad1e, ++ 0xac22, 0xaf26, 0xae2a, 0x080c, 0x1c9b, 0x0005, 0x6014, 0x2048, ++ 0x6118, 0x810c, 0x810c, 0x810c, 0x81ff, 0x1118, 0xa887, 0x0001, ++ 0x0008, 0xa986, 0x601b, 0x0002, 0xa974, 0xd1dc, 0x1108, 0x0005, ++ 0xa934, 0xa88c, 0x9106, 0x1158, 0xa938, 0xa890, 0x9106, 0x1138, ++ 0x601c, 0xc084, 0x601e, 0x2009, 0x0048, 0x0804, 0x95ce, 0x0005, ++ 0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce, 0x7908, 0x918c, 0x0007, ++ 0x9186, 0x0000, 0x0904, 0x181c, 0x9186, 0x0003, 0x0904, 0x181c, ++ 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0190, 0x00c6, 0x7808, ++ 0xd09c, 0x190c, 0x129f, 0x00ce, 0x2001, 0x0038, 0x2c08, 0x621c, ++ 0x080c, 0x1492, 0x7930, 0x9186, 0x0040, 0x0904, 0x1818, 0x9186, ++ 0x0042, 0x190c, 0x0d84, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, ++ 0x1d28, 0x080c, 0x1876, 0x0026, 0x0056, 0x2001, 0x00d2, 0x8001, ++ 0x1df0, 0x2031, 0x2000, 0x8631, 0x1148, 0x080c, 0x724d, 0x04b9, ++ 0x601c, 0xc084, 0x601e, 0x005e, 0x002e, 0x0410, 0x2001, 0x020b, ++ 0x2004, 0xd0e4, 0x0d80, 0x2001, 0x015d, 0x2003, 0x0000, 0x78ab, ++ 0x0004, 0x2001, 0x0200, 0x200c, 0x918d, 0x1800, 0x2102, 0x080c, ++ 0x1269, 0x601c, 0xc084, 0x601e, 0x7803, 0x0000, 0x7803, 0x0001, ++ 0x005e, 0x002e, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, ++ 0x000e, 0x6022, 0x012e, 0x0005, 0x601c, 0xc084, 0x601e, 0x7827, ++ 0x0015, 0x7828, 0x9c06, 0x1db0, 0x782b, 0x0000, 0x0c98, 0x00f6, ++ 0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c, ++ 0x6877, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, ++ 0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0, ++ 0x0081, 0x0066, 0x2031, 0x0000, 0x080c, 0x691e, 0x006e, 0x0005, ++ 0x0469, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, ++ 0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x27fb, 0x2009, 0x003c, ++ 0x080c, 0x2014, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, ++ 0x003c, 0x1de0, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c, 0x709e, ++ 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, 0x0300, 0x080c, ++ 0x1269, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001, 0x0138, ++ 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000, ++ 0x080c, 0x6877, 0x1108, 0x0005, 0x2021, 0x0260, 0x2001, 0x0141, ++ 0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0x939c, 0x0048, ++ 0x1160, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421, 0x1d70, ++ 0x2001, 0x015d, 0x2003, 0x0000, 0x0005, 0x0046, 0x2021, 0x0019, ++ 0x2003, 0x0048, 0xa001, 0xa001, 0x201c, 0x939c, 0x0048, 0x0120, ++ 0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40, 0x0126, 0x2091, ++ 0x2400, 0x2071, 0x1a33, 0x2079, 0x0090, 0x012e, 0x0005, 0x9280, ++ 0x0005, 0x2004, 0x2048, 0xa97c, 0xd1dc, 0x1904, 0x1932, 0xa964, ++ 0x9184, 0x0007, 0x0002, 0x18cb, 0x191d, 0x18d2, 0x18d2, 0x18d2, ++ 0x1905, 0x18e5, 0x18d4, 0x2100, 0x9084, 0x00ff, 0x9086, 0x0048, ++ 0x0904, 0x191d, 0x080c, 0x0d84, 0xa87c, 0xd0b4, 0x0904, 0x1ae4, ++ 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, ++ 0xa8b0, 0xa84a, 0xa988, 0x0804, 0x1925, 0xa864, 0x9084, 0x00ff, ++ 0x9086, 0x001e, 0x1d38, 0xa87c, 0xd0b4, 0x0904, 0x1ae4, 0xa890, ++ 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, ++ 0xa84a, 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, ++ 0x1cdd, 0x2005, 0xa812, 0xa988, 0x0448, 0x918c, 0x00ff, 0x9186, ++ 0x0015, 0x1540, 0xa87c, 0xd0b4, 0x0904, 0x1ae4, 0xa804, 0xa85a, ++ 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1cdd, 0x2005, 0xa812, ++ 0xa988, 0x9006, 0xa842, 0xa83e, 0x0088, 0xa87c, 0xd0b4, 0x0904, ++ 0x1ae4, 0xa988, 0x9006, 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa864, ++ 0x9084, 0x000f, 0x9080, 0x1cdd, 0x2005, 0xa812, 0xa916, 0xa87c, ++ 0xc0dd, 0xa87e, 0x0005, 0x00f6, 0x2079, 0x0090, 0x782c, 0xd0fc, ++ 0x190c, 0x1b25, 0x00e6, 0x2071, 0x1a33, 0x7000, 0x9005, 0x1904, ++ 0x198c, 0x7206, 0x9280, 0x0005, 0x204c, 0x9280, 0x0004, 0x2004, ++ 0x782b, 0x0004, 0x00f6, 0x2079, 0x0200, 0x7803, 0x0040, 0x00fe, ++ 0x00b6, 0x2058, 0xb86c, 0x7836, 0xb890, 0x00be, 0x00f6, 0x2079, ++ 0x0200, 0x7803, 0x0040, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, ++ 0xa001, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x00fe, 0xa814, ++ 0x2050, 0xa858, 0x2040, 0xa810, 0x2060, 0xa064, 0x90ec, 0x000f, ++ 0xa944, 0x791a, 0x7116, 0xa848, 0x781e, 0x701a, 0x9006, 0x700e, ++ 0x7012, 0x7004, 0xa940, 0xa838, 0x9106, 0x1188, 0xa93c, 0xa834, ++ 0x9106, 0x1168, 0x8aff, 0x01a8, 0x0126, 0x2091, 0x8000, 0x00a1, ++ 0x0108, 0x0091, 0x012e, 0x9006, 0x00ee, 0x00fe, 0x0005, 0x0036, ++ 0x0046, 0xab38, 0xac34, 0x080c, 0x1cfd, 0x004e, 0x003e, 0x0d50, ++ 0x0c98, 0x9085, 0x0001, 0x0c80, 0x0076, 0x0066, 0x0056, 0x0046, ++ 0x0036, 0x0026, 0x8aff, 0x0904, 0x1add, 0x700c, 0x7214, 0x923a, ++ 0x7010, 0x7218, 0x9203, 0x0a04, 0x1adc, 0x9705, 0x0904, 0x1adc, ++ 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1ac0, ++ 0x1a07, 0x1a07, 0x1ac0, 0x1ac0, 0x1aa3, 0x1ac0, 0x1a07, 0x1aa9, ++ 0x1a56, 0x1a56, 0x1ac0, 0x1ac0, 0x1ac0, 0x1a9d, 0x1a56, 0xc0fc, ++ 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1ac2, ++ 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, ++ 0x19f3, 0x19f1, 0x19f1, 0x19f1, 0x19f1, 0x19f1, 0x19f7, 0x19f1, ++ 0x19f1, 0x19f1, 0x19f1, 0x19f1, 0x19fb, 0x19f1, 0x19f1, 0x19f1, ++ 0x19f1, 0x19f1, 0x19ff, 0x19f1, 0x19f1, 0x19f1, 0x19f1, 0x19f1, ++ 0x1a03, 0x080c, 0x0d84, 0xa774, 0xa678, 0x0804, 0x1ac2, 0xa78c, ++ 0xa690, 0x0804, 0x1ac2, 0xa7a4, 0xa6a8, 0x0804, 0x1ac2, 0xa7bc, ++ 0xa6c0, 0x0804, 0x1ac2, 0xa7d4, 0xa6d8, 0x0804, 0x1ac2, 0x2c05, ++ 0x908a, 0x0036, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x1a2a, ++ 0x1a2a, 0x1a2c, 0x1a2a, 0x1a2a, 0x1a2a, 0x1a32, 0x1a2a, 0x1a2a, ++ 0x1a2a, 0x1a38, 0x1a2a, 0x1a2a, 0x1a2a, 0x1a3e, 0x1a2a, 0x1a2a, ++ 0x1a2a, 0x1a44, 0x1a2a, 0x1a2a, 0x1a2a, 0x1a4a, 0x1a2a, 0x1a2a, ++ 0x1a2a, 0x1a50, 0x080c, 0x0d84, 0xa574, 0xa478, 0xa37c, 0xa280, ++ 0x0804, 0x1ac2, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, 0x1ac2, ++ 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1ac2, 0xa5a4, 0xa4a8, ++ 0xa3ac, 0xa2b0, 0x0804, 0x1ac2, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, ++ 0x0804, 0x1ac2, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x1ac2, ++ 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1ac2, 0x2c05, 0x908a, ++ 0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x1a79, 0x1a77, ++ 0x1a77, 0x1a77, 0x1a77, 0x1a77, 0x1a81, 0x1a77, 0x1a77, 0x1a77, ++ 0x1a77, 0x1a77, 0x1a88, 0x1a77, 0x1a77, 0x1a77, 0x1a77, 0x1a77, ++ 0x1a8f, 0x1a77, 0x1a77, 0x1a77, 0x1a77, 0x1a77, 0x1a96, 0x080c, ++ 0x0d84, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, 0x0804, ++ 0x1ac2, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, 0x04d0, ++ 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x0498, 0xa5b4, ++ 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0460, 0xa5cc, 0xa4d0, ++ 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x0428, 0xa864, 0x9084, 0x00ff, ++ 0x9086, 0x001e, 0x11e8, 0x080c, 0x1c9b, 0x1904, 0x19a2, 0x900e, ++ 0x04a0, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0048, 0x190c, 0x0d84, ++ 0x00c6, 0x7004, 0x2060, 0x6004, 0x9086, 0x0043, 0x00ce, 0x0904, ++ 0x1a56, 0xab9c, 0x9016, 0xad8c, 0xac90, 0xaf94, 0xae98, 0x0010, ++ 0x080c, 0x0d84, 0x7b12, 0x7a16, 0x7d02, 0x7c06, 0x7f0a, 0x7e0e, ++ 0x782b, 0x0001, 0x7000, 0x8000, 0x7002, 0xa83c, 0x9300, 0xa83e, ++ 0xa840, 0x9201, 0xa842, 0x700c, 0x9300, 0x700e, 0x7010, 0x9201, ++ 0x7012, 0x080c, 0x1c9b, 0x0008, 0x9006, 0x002e, 0x003e, 0x004e, ++ 0x005e, 0x006e, 0x007e, 0x0005, 0x080c, 0x0d84, 0x0026, 0x2001, ++ 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7003, 0x0000, 0x7004, ++ 0x2060, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0118, 0xa880, 0xc0bd, ++ 0xa882, 0x6020, 0x9086, 0x0006, 0x1180, 0x2061, 0x0100, 0x62c8, ++ 0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4, ++ 0xa89a, 0x60c8, 0xa896, 0x7004, 0x2060, 0x00c6, 0x080c, 0xad1e, ++ 0x00ce, 0x2001, 0x19c3, 0x2004, 0x9c06, 0x1160, 0x2009, 0x0040, ++ 0x080c, 0x2014, 0x080c, 0x901f, 0x2011, 0x0000, 0x080c, 0x8ea3, ++ 0x080c, 0x820b, 0x002e, 0x0804, 0x1c4d, 0x0126, 0x2091, 0x2400, ++ 0xa858, 0x2040, 0x792c, 0x782b, 0x0002, 0x9184, 0x0700, 0x1904, ++ 0x1ae6, 0x7000, 0x0002, 0x1c4d, 0x1b37, 0x1ba0, 0x1c4b, 0x8001, ++ 0x7002, 0xd19c, 0x1150, 0x8aff, 0x0590, 0x080c, 0x199c, 0x0904, ++ 0x1c4d, 0x080c, 0x199c, 0x0804, 0x1c4d, 0x782b, 0x0004, 0xd194, ++ 0x0148, 0xa880, 0xc0fc, 0xa882, 0x8aff, 0x11b8, 0xa87c, 0xc0f5, ++ 0xa87e, 0x0098, 0xab3c, 0xaa40, 0x7810, 0xa82e, 0x931a, 0x7814, ++ 0xa832, 0x9213, 0x7800, 0xa81e, 0x7804, 0xa822, 0xab3e, 0xaa42, ++ 0x080c, 0x1cb3, 0xa880, 0xc0fd, 0xa882, 0x2a00, 0xa816, 0x2800, ++ 0xa85a, 0x2c00, 0xa812, 0x7003, 0x0000, 0x0804, 0x1c4d, 0x00f6, ++ 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14, ++ 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x0036, 0x2019, 0x1000, ++ 0x8319, 0x090c, 0x0d84, 0x7820, 0xd0bc, 0x1dd0, 0x003e, 0x79c8, ++ 0x000e, 0x9102, 0x001e, 0x0006, 0x0016, 0x79c4, 0x000e, 0x9103, ++ 0x78c6, 0x000e, 0x78ca, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, ++ 0x002e, 0x00fe, 0x782b, 0x0008, 0x7003, 0x0000, 0x0804, 0x1c4d, ++ 0x8001, 0x7002, 0xd194, 0x0170, 0x782c, 0xd0fc, 0x1904, 0x1b2a, ++ 0xd19c, 0x1904, 0x1c49, 0x8aff, 0x0904, 0x1c4d, 0x080c, 0x199c, ++ 0x0804, 0x1c4d, 0xab3c, 0xaa40, 0x080c, 0x1cb3, 0xdd9c, 0x1904, ++ 0x1c08, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d84, 0x9082, 0x001b, ++ 0x0002, 0x1bdc, 0x1bdc, 0x1bde, 0x1bdc, 0x1bdc, 0x1bdc, 0x1be4, ++ 0x1bdc, 0x1bdc, 0x1bdc, 0x1bea, 0x1bdc, 0x1bdc, 0x1bdc, 0x1bf0, ++ 0x1bdc, 0x1bdc, 0x1bdc, 0x1bf6, 0x1bdc, 0x1bdc, 0x1bdc, 0x1bfc, ++ 0x1bdc, 0x1bdc, 0x1bdc, 0x1c02, 0x080c, 0x0d84, 0xa07c, 0x931a, ++ 0xa080, 0x9213, 0x0804, 0x1b54, 0xa08c, 0x931a, 0xa090, 0x9213, ++ 0x0804, 0x1b54, 0xa09c, 0x931a, 0xa0a0, 0x9213, 0x0804, 0x1b54, ++ 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1b54, 0xa0bc, 0x931a, ++ 0xa0c0, 0x9213, 0x0804, 0x1b54, 0xa0cc, 0x931a, 0xa0d0, 0x9213, ++ 0x0804, 0x1b54, 0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804, 0x1b54, ++ 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, ++ 0x1c2b, 0x1c29, 0x1c29, 0x1c29, 0x1c29, 0x1c29, 0x1c31, 0x1c29, ++ 0x1c29, 0x1c29, 0x1c29, 0x1c29, 0x1c37, 0x1c29, 0x1c29, 0x1c29, ++ 0x1c29, 0x1c29, 0x1c3d, 0x1c29, 0x1c29, 0x1c29, 0x1c29, 0x1c29, ++ 0x1c43, 0x080c, 0x0d84, 0xa07c, 0x931a, 0xa080, 0x9213, 0x0804, ++ 0x1b54, 0xa094, 0x931a, 0xa098, 0x9213, 0x0804, 0x1b54, 0xa0ac, ++ 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1b54, 0xa0c4, 0x931a, 0xa0c8, ++ 0x9213, 0x0804, 0x1b54, 0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804, ++ 0x1b54, 0x0804, 0x1b52, 0x080c, 0x0d84, 0x012e, 0x0005, 0x00f6, ++ 0x00e6, 0x2071, 0x1a33, 0x7000, 0x9086, 0x0000, 0x0904, 0x1c98, ++ 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, 0xd194, 0x01b8, 0x2009, ++ 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, 0x080c, 0xcd2b, 0x2001, ++ 0x0133, 0x2004, 0x9005, 0x090c, 0x0d84, 0x0016, 0x2009, 0x0040, ++ 0x080c, 0x2014, 0x001e, 0x2001, 0x020c, 0x2102, 0x2009, 0x0206, ++ 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, ++ 0x080c, 0x2014, 0x782c, 0xd0fc, 0x09a8, 0x080c, 0x1b25, 0x7000, ++ 0x9086, 0x0000, 0x1978, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, ++ 0x2009, 0x0040, 0x080c, 0x2014, 0x782b, 0x0002, 0x7003, 0x0000, ++ 0x00ee, 0x00fe, 0x0005, 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51, ++ 0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, ++ 0x000f, 0x9080, 0x1cdd, 0x2065, 0x8cff, 0x090c, 0x0d84, 0x8a51, ++ 0x0005, 0x2050, 0x0005, 0x8a50, 0x8c61, 0x2c05, 0x9005, 0x1190, ++ 0x2800, 0x9906, 0x0120, 0xa000, 0x9005, 0x1108, 0x2900, 0x2040, ++ 0xa85a, 0xa064, 0x9084, 0x000f, 0x9080, 0x1ced, 0x2065, 0x8cff, ++ 0x090c, 0x0d84, 0x0005, 0x0000, 0x001d, 0x0021, 0x0025, 0x0029, ++ 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021, 0x0027, 0x002d, ++ 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000, 0x1cd0, 0x1ccc, ++ 0x0000, 0x0000, 0x1cda, 0x0000, 0x1cd0, 0x1cd7, 0x1cd7, 0x1cd4, ++ 0x0000, 0x0000, 0x0000, 0x1cda, 0x1cd7, 0x0000, 0x1cd2, 0x1cd2, ++ 0x0000, 0x0000, 0x1cda, 0x0000, 0x1cd2, 0x1cd8, 0x1cd8, 0x1cd8, ++ 0x0000, 0x0000, 0x0000, 0x1cda, 0x1cd8, 0x00c6, 0x00d6, 0x0086, ++ 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x1ed4, 0x2940, 0xa064, ++ 0x90ec, 0x000f, 0x9de0, 0x1cdd, 0x9d86, 0x0007, 0x0130, 0x9d86, ++ 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c, 0x9422, 0xa090, ++ 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804, 0x1ed4, 0xa004, ++ 0x9045, 0x0904, 0x1ed4, 0x0c18, 0x2c05, 0x9005, 0x0904, 0x1dbc, ++ 0xdd9c, 0x1904, 0x1d78, 0x908a, 0x0036, 0x1a0c, 0x0d84, 0x9082, ++ 0x001b, 0x0002, 0x1d4d, 0x1d4d, 0x1d4f, 0x1d4d, 0x1d4d, 0x1d4d, ++ 0x1d55, 0x1d4d, 0x1d4d, 0x1d4d, 0x1d5b, 0x1d4d, 0x1d4d, 0x1d4d, ++ 0x1d61, 0x1d4d, 0x1d4d, 0x1d4d, 0x1d67, 0x1d4d, 0x1d4d, 0x1d4d, ++ 0x1d6d, 0x1d4d, 0x1d4d, 0x1d4d, 0x1d73, 0x080c, 0x0d84, 0xa07c, ++ 0x9422, 0xa080, 0x931b, 0x0804, 0x1db2, 0xa08c, 0x9422, 0xa090, ++ 0x931b, 0x0804, 0x1db2, 0xa09c, 0x9422, 0xa0a0, 0x931b, 0x0804, ++ 0x1db2, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804, 0x1db2, 0xa0bc, ++ 0x9422, 0xa0c0, 0x931b, 0x0804, 0x1db2, 0xa0cc, 0x9422, 0xa0d0, ++ 0x931b, 0x0804, 0x1db2, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x04d0, ++ 0x908a, 0x0034, 0x1a0c, 0x0d84, 0x9082, 0x001b, 0x0002, 0x1d9a, ++ 0x1d98, 0x1d98, 0x1d98, 0x1d98, 0x1d98, 0x1d9f, 0x1d98, 0x1d98, ++ 0x1d98, 0x1d98, 0x1d98, 0x1da4, 0x1d98, 0x1d98, 0x1d98, 0x1d98, ++ 0x1d98, 0x1da9, 0x1d98, 0x1d98, 0x1d98, 0x1d98, 0x1d98, 0x1dae, ++ 0x080c, 0x0d84, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0098, 0xa094, ++ 0x9422, 0xa098, 0x931b, 0x0070, 0xa0ac, 0x9422, 0xa0b0, 0x931b, ++ 0x0048, 0xa0c4, 0x9422, 0xa0c8, 0x931b, 0x0020, 0xa0dc, 0x9422, ++ 0xa0e0, 0x931b, 0x0630, 0x2300, 0x9405, 0x0160, 0x8a51, 0x0904, ++ 0x1ed4, 0x8c60, 0x0804, 0x1d24, 0xa004, 0x9045, 0x0904, 0x1ed4, ++ 0x0804, 0x1d07, 0x8a51, 0x0904, 0x1ed4, 0x8c60, 0x2c05, 0x9005, ++ 0x1158, 0xa004, 0x9045, 0x0904, 0x1ed4, 0xa064, 0x90ec, 0x000f, ++ 0x9de0, 0x1cdd, 0x2c05, 0x2060, 0xa880, 0xc0fc, 0xa882, 0x0804, ++ 0x1ec9, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000, 0xac2e, ++ 0xab32, 0xdd9c, 0x1904, 0x1e66, 0x9082, 0x001b, 0x0002, 0x1e02, ++ 0x1e02, 0x1e04, 0x1e02, 0x1e02, 0x1e02, 0x1e12, 0x1e02, 0x1e02, ++ 0x1e02, 0x1e20, 0x1e02, 0x1e02, 0x1e02, 0x1e2e, 0x1e02, 0x1e02, ++ 0x1e02, 0x1e3c, 0x1e02, 0x1e02, 0x1e02, 0x1e4a, 0x1e02, 0x1e02, ++ 0x1e02, 0x1e58, 0x080c, 0x0d84, 0xa17c, 0x2400, 0x9122, 0xa180, ++ 0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa074, 0x9420, 0xa078, 0x9319, ++ 0x0804, 0x1ec4, 0xa18c, 0x2400, 0x9122, 0xa190, 0x2300, 0x911b, ++ 0x0a0c, 0x0d84, 0xa084, 0x9420, 0xa088, 0x9319, 0x0804, 0x1ec4, ++ 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b, 0x0a0c, 0x0d84, ++ 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x1ec4, 0xa1ac, 0x2400, ++ 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa0a4, 0x9420, ++ 0xa0a8, 0x9319, 0x0804, 0x1ec4, 0xa1bc, 0x2400, 0x9122, 0xa1c0, ++ 0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa0b4, 0x9420, 0xa0b8, 0x9319, ++ 0x0804, 0x1ec4, 0xa1cc, 0x2400, 0x9122, 0xa1d0, 0x2300, 0x911b, ++ 0x0a0c, 0x0d84, 0xa0c4, 0x9420, 0xa0c8, 0x9319, 0x0804, 0x1ec4, ++ 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d84, ++ 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x1ec4, 0x9082, 0x001b, ++ 0x0002, 0x1e84, 0x1e82, 0x1e82, 0x1e82, 0x1e82, 0x1e82, 0x1e91, ++ 0x1e82, 0x1e82, 0x1e82, 0x1e82, 0x1e82, 0x1e9e, 0x1e82, 0x1e82, ++ 0x1e82, 0x1e82, 0x1e82, 0x1eab, 0x1e82, 0x1e82, 0x1e82, 0x1e82, ++ 0x1e82, 0x1eb8, 0x080c, 0x0d84, 0xa17c, 0x2400, 0x9122, 0xa180, ++ 0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa06c, 0x9420, 0xa070, 0x9319, ++ 0x0498, 0xa194, 0x2400, 0x9122, 0xa198, 0x2300, 0x911b, 0x0a0c, ++ 0x0d84, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430, 0xa1ac, 0x2400, ++ 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d84, 0xa09c, 0x9420, ++ 0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, 0x9122, 0xa1c8, 0x2300, ++ 0x911b, 0x0a0c, 0x0d84, 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0060, ++ 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d84, ++ 0xa0cc, 0x9420, 0xa0d0, 0x9319, 0xac1e, 0xab22, 0xa880, 0xc0fd, ++ 0xa882, 0x2800, 0xa85a, 0x2c00, 0xa812, 0x2a00, 0xa816, 0x000e, ++ 0x000e, 0x000e, 0x9006, 0x0028, 0x008e, 0x00de, 0x00ce, 0x9085, ++ 0x0001, 0x0005, 0x2001, 0x0005, 0x2004, 0x9084, 0x0007, 0x0002, ++ 0x1ef2, 0x1b25, 0x1ef2, 0x1ee8, 0x1eeb, 0x1eee, 0x1eeb, 0x1eee, ++ 0x080c, 0x1b25, 0x0005, 0x080c, 0x1146, 0x0005, 0x080c, 0x1b25, ++ 0x080c, 0x1146, 0x0005, 0x0126, 0x2091, 0x2600, 0x2079, 0x0200, ++ 0x2071, 0x0260, 0x2069, 0x1800, 0x7817, 0x0000, 0x789b, 0x0814, ++ 0x78a3, 0x0406, 0x789f, 0x0410, 0x2009, 0x013b, 0x200b, 0x0400, ++ 0x781b, 0x0002, 0x783b, 0x001f, 0x7837, 0x0020, 0x7803, 0x1600, ++ 0x012e, 0x0005, 0x2091, 0x2600, 0x781c, 0xd0a4, 0x190c, 0x2011, ++ 0x7900, 0xd1dc, 0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e, ++ 0x0002, 0x1f39, 0x1f31, 0x71ab, 0x1f31, 0x1f33, 0x1f33, 0x1f33, ++ 0x1f33, 0x7191, 0x1f31, 0x1f35, 0x1f31, 0x1f33, 0x1f31, 0x1f33, ++ 0x1f31, 0x080c, 0x0d84, 0x0031, 0x0020, 0x080c, 0x7191, 0x080c, ++ 0x71ab, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xcd2b, 0x7930, ++ 0x9184, 0x0003, 0x01c0, 0x2001, 0x19c3, 0x2004, 0x9005, 0x0170, ++ 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d84, 0x00c6, 0x2001, ++ 0x19c3, 0x2064, 0x080c, 0xad1e, 0x00ce, 0x00f8, 0x2009, 0x0040, ++ 0x080c, 0x2014, 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286, ++ 0x0003, 0x0160, 0x080c, 0x6877, 0x1138, 0x080c, 0x6b40, 0x080c, ++ 0x56d9, 0x080c, 0x67be, 0x0010, 0x080c, 0x55a0, 0x080c, 0x7243, ++ 0x0041, 0x0018, 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e, ++ 0x0005, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a30, 0x080c, ++ 0x1827, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091, ++ 0x2e00, 0x2071, 0x1800, 0x7128, 0x2001, 0x193e, 0x2102, 0x2001, ++ 0x1946, 0x2102, 0x2001, 0x013b, 0x2102, 0x2079, 0x0200, 0x2001, ++ 0x0201, 0x789e, 0x78a3, 0x0200, 0x9198, 0x0007, 0x831c, 0x831c, ++ 0x831c, 0x9398, 0x0005, 0x2320, 0x9182, 0x0204, 0x1230, 0x2011, ++ 0x0008, 0x8423, 0x8423, 0x8423, 0x0488, 0x9182, 0x024c, 0x1240, ++ 0x2011, 0x0007, 0x8403, 0x8003, 0x9400, 0x9400, 0x9420, 0x0430, ++ 0x9182, 0x02bc, 0x1238, 0x2011, 0x0006, 0x8403, 0x8003, 0x9400, ++ 0x9420, 0x00e0, 0x9182, 0x034c, 0x1230, 0x2011, 0x0005, 0x8403, ++ 0x8003, 0x9420, 0x0098, 0x9182, 0x042c, 0x1228, 0x2011, 0x0004, ++ 0x8423, 0x8423, 0x0058, 0x9182, 0x059c, 0x1228, 0x2011, 0x0003, ++ 0x8403, 0x9420, 0x0018, 0x2011, 0x0002, 0x8423, 0x9482, 0x0228, ++ 0x8002, 0x8020, 0x8301, 0x9402, 0x0110, 0x0208, 0x8321, 0x8217, ++ 0x8203, 0x9405, 0x789a, 0x012e, 0x0005, 0x0006, 0x00d6, 0x2069, ++ 0x0200, 0x6814, 0x9084, 0xffc0, 0x910d, 0x6916, 0x00de, 0x000e, ++ 0x0005, 0x00d6, 0x2069, 0x0200, 0x9005, 0x6810, 0x0110, 0xc0a5, ++ 0x0008, 0xc0a4, 0x6812, 0x00de, 0x0005, 0x0006, 0x00d6, 0x2069, ++ 0x0200, 0x6810, 0x9084, 0xfff8, 0x910d, 0x6912, 0x00de, 0x000e, ++ 0x0005, 0x7938, 0x080c, 0x0d84, 0x00f6, 0x2079, 0x0200, 0x7902, ++ 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x7902, 0xa001, ++ 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x00fe, 0x0005, 0x0126, ++ 0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0x1800, 0x2009, 0x0000, ++ 0x080c, 0x27f5, 0x080c, 0x2718, 0x6054, 0x8004, 0x8004, 0x8004, ++ 0x8004, 0x9084, 0x000c, 0x6150, 0x918c, 0xfff3, 0x9105, 0x6052, ++ 0x6050, 0x9084, 0xfbff, 0x9085, 0x2000, 0x6052, 0x2009, 0x196a, ++ 0x2011, 0x196b, 0x6358, 0x939c, 0x38f0, 0x2320, 0x080c, 0x275c, ++ 0x1238, 0x939d, 0x4003, 0x94a5, 0x8603, 0x230a, 0x2412, 0x0030, ++ 0x939d, 0x0203, 0x94a5, 0x8603, 0x230a, 0x2412, 0x9006, 0x080c, ++ 0x2747, 0x9006, 0x080c, 0x272a, 0x20a9, 0x0012, 0x1d04, 0x2066, ++ 0x2091, 0x6000, 0x1f04, 0x2066, 0x602f, 0x0100, 0x602f, 0x0000, ++ 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x6024, 0x6026, ++ 0x080c, 0x2436, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x2446, ++ 0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, ++ 0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x049f, 0x60bb, ++ 0x0000, 0x20a9, 0x0018, 0x60bf, 0x0000, 0x1f04, 0x2093, 0x60bb, ++ 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x60bf, 0x0320, 0x60bf, ++ 0x0018, 0x601b, 0x00f0, 0x601f, 0x001e, 0x600f, 0x006b, 0x602b, ++ 0x402f, 0x012e, 0x0005, 0x00f6, 0x2079, 0x0140, 0x78c3, 0x0080, ++ 0x78c3, 0x0083, 0x78c3, 0x0000, 0x00fe, 0x0005, 0x2001, 0x1834, ++ 0x2003, 0x0000, 0x2001, 0x1833, 0x2003, 0x0001, 0x0005, 0x0126, ++ 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x6124, 0x9184, 0x5e2c, ++ 0x1118, 0x9184, 0x0007, 0x002a, 0x9195, 0x0004, 0x9284, 0x0007, ++ 0x0002, 0x20f3, 0x20d9, 0x20dc, 0x20df, 0x20e4, 0x20e6, 0x20ea, ++ 0x20ee, 0x080c, 0x7ab7, 0x00b8, 0x080c, 0x7b8a, 0x00a0, 0x080c, ++ 0x7b8a, 0x080c, 0x7ab7, 0x0078, 0x0099, 0x0068, 0x080c, 0x7ab7, ++ 0x0079, 0x0048, 0x080c, 0x7b8a, 0x0059, 0x0028, 0x080c, 0x7b8a, ++ 0x080c, 0x7ab7, 0x0029, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, ++ 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c, 0x1904, 0x232f, ++ 0xd1f4, 0x0110, 0x080c, 0x0d84, 0x080c, 0x6877, 0x05a0, 0x7000, ++ 0x9086, 0x0003, 0x01f0, 0x6024, 0x9084, 0x1800, 0x01d0, 0x080c, ++ 0x689a, 0x0118, 0x080c, 0x6888, 0x11a0, 0x6027, 0x0020, 0x6043, ++ 0x0000, 0x709c, 0x9005, 0x1150, 0x709f, 0x0001, 0x00d6, 0x2069, ++ 0x0140, 0x080c, 0x68d0, 0x00de, 0x1904, 0x2332, 0x080c, 0x6b4a, ++ 0x0428, 0x080c, 0x689a, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, ++ 0x0468, 0x080c, 0x6b4a, 0x080c, 0x6b40, 0x080c, 0x56d9, 0x080c, ++ 0x67be, 0x0804, 0x232f, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, ++ 0xd0e4, 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7090, 0x9086, ++ 0x0028, 0x1110, 0x080c, 0x6a2d, 0x0804, 0x232f, 0x080c, 0x6b45, ++ 0x0048, 0x2001, 0x194c, 0x2003, 0x0002, 0x0020, 0x080c, 0x69a3, ++ 0x0804, 0x232f, 0x080c, 0x6ac8, 0x0804, 0x232f, 0xd1ac, 0x0904, ++ 0x224f, 0x080c, 0x6877, 0x11c0, 0x6027, 0x0020, 0x0006, 0x0026, ++ 0x0036, 0x080c, 0x6891, 0x1158, 0x080c, 0x6b40, 0x080c, 0x56d9, ++ 0x080c, 0x67be, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005, 0x003e, ++ 0x002e, 0x000e, 0x080c, 0x6853, 0x0016, 0x0046, 0x00c6, 0x644c, ++ 0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, 0x6043, 0x0090, ++ 0x6043, 0x0010, 0x74d6, 0x948c, 0xff00, 0x7034, 0xd084, 0x0178, ++ 0x9186, 0xf800, 0x1160, 0x7040, 0xd084, 0x1148, 0xc085, 0x7042, ++ 0x0036, 0x2418, 0x2011, 0x8016, 0x080c, 0x447f, 0x003e, 0x080c, ++ 0xb752, 0x1904, 0x222c, 0x9196, 0xff00, 0x05a8, 0x7058, 0x9084, ++ 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130, 0xd184, ++ 0x1550, 0x080c, 0x2e69, 0x0128, 0xc18d, 0x7132, 0x080c, 0x5f25, ++ 0x1510, 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294, 0xff00, ++ 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x222c, 0x7034, ++ 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x222c, ++ 0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c, 0x447f, ++ 0x003e, 0x0804, 0x222c, 0x7034, 0xd08c, 0x1140, 0x2001, 0x180c, ++ 0x200c, 0xd1ac, 0x1904, 0x222c, 0xc1ad, 0x2102, 0x0036, 0x73d4, ++ 0x2011, 0x8013, 0x080c, 0x447f, 0x003e, 0x7130, 0xc185, 0x7132, ++ 0x2011, 0x1853, 0x220c, 0xd1a4, 0x01f0, 0x0016, 0x2009, 0x0001, ++ 0x2011, 0x0100, 0x080c, 0x7a0a, 0x2019, 0x000e, 0x00c6, 0x2061, ++ 0x0000, 0x080c, 0xc941, 0x00ce, 0x9484, 0x00ff, 0x9080, 0x2e6e, ++ 0x200d, 0x918c, 0xff00, 0x810f, 0x2120, 0x9006, 0x2009, 0x000e, ++ 0x080c, 0xc9c5, 0x001e, 0xd1ac, 0x1140, 0x0016, 0x900e, 0x2019, ++ 0x0004, 0x080c, 0x2ce5, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, ++ 0x007f, 0x900e, 0x080c, 0x5c0d, 0x1110, 0x080c, 0x56f3, 0x8108, ++ 0x1f04, 0x2222, 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c, 0x94da, ++ 0x60e3, 0x0000, 0x001e, 0x2001, 0x1800, 0x2014, 0x9296, 0x0004, ++ 0x1170, 0xd19c, 0x11a0, 0x2011, 0x180c, 0x2214, 0xd29c, 0x1120, ++ 0x6204, 0x9295, 0x0002, 0x6206, 0x6228, 0xc29d, 0x622a, 0x2003, ++ 0x0001, 0x2001, 0x1824, 0x2003, 0x0000, 0x6027, 0x0020, 0xd194, ++ 0x0904, 0x232f, 0x0016, 0x6220, 0xd2b4, 0x0904, 0x22db, 0x080c, ++ 0x7893, 0x080c, 0x8b50, 0x6027, 0x0004, 0x00f6, 0x2019, 0x19bd, ++ 0x2304, 0x907d, 0x0904, 0x22ac, 0x7804, 0x9086, 0x0032, 0x1904, ++ 0x22ac, 0x00d6, 0x00c6, 0x00e6, 0x0096, 0x2069, 0x0140, 0x7814, ++ 0x685e, 0x7808, 0x685a, 0x6043, 0x0002, 0x2001, 0x0003, 0x8001, ++ 0x1df0, 0x6043, 0x0000, 0x2001, 0x003c, 0x8001, 0x1df0, 0x2001, ++ 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x2001, 0x001e, ++ 0x8001, 0x0240, 0x20a9, 0x0009, 0x080c, 0x27d0, 0x6904, 0xd1dc, ++ 0x1140, 0x0cb0, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c, ++ 0x28a5, 0x080c, 0x8026, 0x080c, 0x8125, 0x7814, 0x2048, 0xa867, ++ 0x0103, 0x2f60, 0x080c, 0x9554, 0x009e, 0x00ee, 0x00ce, 0x00de, ++ 0x00fe, 0x001e, 0x00ae, 0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140, ++ 0x6804, 0x9084, 0x4000, 0x0138, 0x2001, 0x1000, 0x080c, 0x28a5, ++ 0x9006, 0x080c, 0x28a5, 0x00de, 0x00c6, 0x2061, 0x19b4, 0x6028, ++ 0x909a, 0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x8b2c, ++ 0x0804, 0x232e, 0x2061, 0x0100, 0x62c0, 0x080c, 0x9367, 0x2019, ++ 0x19bd, 0x2304, 0x9065, 0x0120, 0x2009, 0x0027, 0x080c, 0x95ce, ++ 0x00ce, 0x0804, 0x232e, 0xd2bc, 0x05f0, 0x080c, 0x78a0, 0x6014, ++ 0x9084, 0x1984, 0x9085, 0x0010, 0x6016, 0x6027, 0x0004, 0x00d6, ++ 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0138, 0x2001, 0x1000, ++ 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x00de, 0x00c6, 0x2061, ++ 0x19b4, 0x6044, 0x909a, 0x00c8, 0x1608, 0x8000, 0x6046, 0x603c, ++ 0x00ce, 0x9005, 0x0558, 0x2009, 0x07d0, 0x080c, 0x7898, 0x9080, ++ 0x0008, 0x2004, 0x9086, 0x0006, 0x1138, 0x6114, 0x918c, 0x1984, ++ 0x918d, 0x0012, 0x6116, 0x00d0, 0x6114, 0x918c, 0x1984, 0x918d, ++ 0x0016, 0x6116, 0x0098, 0x6027, 0x0004, 0x0080, 0x0036, 0x2019, ++ 0x0001, 0x080c, 0x8dfe, 0x003e, 0x2019, 0x19c3, 0x2304, 0x9065, ++ 0x0120, 0x2009, 0x004f, 0x080c, 0x95ce, 0x00ce, 0x001e, 0xd19c, ++ 0x0904, 0x23a1, 0x7034, 0xd0ac, 0x1904, 0x2376, 0x0016, 0x0156, ++ 0x6027, 0x0008, 0x6050, 0x9085, 0x0040, 0x6052, 0x6050, 0x9084, ++ 0xfbcf, 0x6052, 0x080c, 0x27ef, 0x9085, 0x2000, 0x6052, 0x20a9, ++ 0x0012, 0x1d04, 0x2349, 0x080c, 0x78c7, 0x1f04, 0x2349, 0x6050, ++ 0x9085, 0x0400, 0x9084, 0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, ++ 0x1f04, 0x2357, 0x6150, 0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, ++ 0x1d04, 0x2360, 0x080c, 0x78c7, 0x6020, 0xd09c, 0x1130, 0x015e, ++ 0x6152, 0x001e, 0x6027, 0x0008, 0x04a0, 0x080c, 0x27b7, 0x1f04, ++ 0x2360, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x0016, 0x6028, ++ 0xc09c, 0x602a, 0x080c, 0x94da, 0x60e3, 0x0000, 0x080c, 0xcd0a, ++ 0x080c, 0xcd25, 0x080c, 0x4dee, 0xd0fc, 0x1138, 0x080c, 0xb752, ++ 0x1120, 0x9085, 0x0001, 0x080c, 0x68c0, 0x9006, 0x080c, 0x28a5, ++ 0x2009, 0x0002, 0x080c, 0x27f5, 0x00e6, 0x2071, 0x1800, 0x7003, ++ 0x0004, 0x080c, 0x0e3b, 0x00ee, 0x6027, 0x0008, 0x080c, 0x0b69, ++ 0x001e, 0x918c, 0xffd0, 0x6126, 0x00ae, 0x0005, 0x0006, 0x0016, ++ 0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, ++ 0x1800, 0x71cc, 0x70ce, 0x9116, 0x0904, 0x23f5, 0x81ff, 0x01a0, ++ 0x2009, 0x0000, 0x080c, 0x27f5, 0x2011, 0x8011, 0x2019, 0x010e, ++ 0x231c, 0x939e, 0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, ++ 0x0000, 0x080c, 0x447f, 0x0448, 0x2001, 0x1975, 0x200c, 0x81ff, ++ 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, ++ 0x0008, 0x2118, 0x2011, 0x8012, 0x080c, 0x447f, 0x080c, 0x0e3b, ++ 0x080c, 0x4dee, 0xd0fc, 0x1188, 0x080c, 0xb752, 0x1170, 0x00c6, ++ 0x080c, 0x2491, 0x080c, 0x8d36, 0x2061, 0x0100, 0x2019, 0x0028, ++ 0x2009, 0x0002, 0x080c, 0x2ce5, 0x00ce, 0x012e, 0x00fe, 0x00ee, ++ 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, ++ 0x2130, 0x9094, 0xff00, 0x11f0, 0x2011, 0x1836, 0x2214, 0xd2ac, ++ 0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181d, 0x2204, 0x9106, 0x1190, ++ 0x2011, 0x181e, 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, 0x9206, ++ 0x1148, 0x2011, 0x181e, 0x2214, 0x9294, 0x00ff, 0x9584, 0x00ff, ++ 0x9206, 0x1120, 0x2500, 0x080c, 0x745f, 0x0048, 0x9584, 0x00ff, ++ 0x9080, 0x2e6e, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, ++ 0x9080, 0x2e6e, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, ++ 0x0140, 0x2001, 0x1816, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, ++ 0x6852, 0x6856, 0x1f04, 0x2441, 0x00de, 0x0005, 0x0006, 0x00d6, ++ 0x0026, 0x2069, 0x0140, 0x2001, 0x1816, 0x2102, 0x8114, 0x8214, ++ 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, ++ 0x1128, 0x9184, 0x000f, 0x9080, 0xd10f, 0x2005, 0x6856, 0x8211, ++ 0x1f04, 0x2456, 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, ++ 0x1800, 0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce, ++ 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, 0x0140, ++ 0x6980, 0x9116, 0x0180, 0x9112, 0x1230, 0x8212, 0x8210, 0x22a8, ++ 0x2001, 0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, ++ 0x2486, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, ++ 0x0005, 0x080c, 0x4dea, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, ++ 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xc9c5, 0x004e, 0x0005, ++ 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, ++ 0x24fd, 0x080c, 0x275c, 0x0660, 0x9084, 0x0700, 0x908e, 0x0600, ++ 0x1120, 0x2011, 0x4000, 0x900e, 0x0458, 0x908e, 0x0500, 0x1120, ++ 0x2011, 0x8000, 0x900e, 0x0420, 0x908e, 0x0400, 0x1120, 0x9016, ++ 0x2009, 0x0001, 0x00e8, 0x908e, 0x0300, 0x1120, 0x9016, 0x2009, ++ 0x0002, 0x00b0, 0x908e, 0x0200, 0x1120, 0x9016, 0x2009, 0x0004, ++ 0x0078, 0x908e, 0x0100, 0x1548, 0x9016, 0x2009, 0x0008, 0x0040, ++ 0x9084, 0x0700, 0x908e, 0x0300, 0x1500, 0x2011, 0x0030, 0x0058, ++ 0x2300, 0x9080, 0x0020, 0x2018, 0x080c, 0x7a4b, 0x928c, 0xff00, ++ 0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2, ++ 0x2009, 0x0138, 0x220a, 0x080c, 0x6877, 0x1118, 0x2009, 0x193c, ++ 0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, ++ 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, ++ 0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0d84, ++ 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x2001, 0x0171, 0x2004, ++ 0xd0dc, 0x0168, 0x2001, 0x0170, 0x200c, 0x918c, 0x00ff, 0x918e, ++ 0x004c, 0x1128, 0x200c, 0x918c, 0xff00, 0x810f, 0x0005, 0x900e, ++ 0x2001, 0x0227, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, ++ 0x2001, 0x0226, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, ++ 0x0005, 0x0018, 0x000c, 0x0018, 0x0020, 0x1000, 0x0800, 0x1000, ++ 0x1800, 0x0156, 0x0006, 0x0016, 0x0026, 0x00e6, 0x2001, 0x195d, ++ 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d84, 0x0033, 0x00ee, 0x002e, ++ 0x001e, 0x000e, 0x015e, 0x0005, 0x255b, 0x2579, 0x259d, 0x259f, ++ 0x25c8, 0x25ca, 0x25cc, 0x2001, 0x0001, 0x080c, 0x23a6, 0x080c, ++ 0x27b2, 0x2001, 0x195f, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, ++ 0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x2770, 0x2001, 0x195d, ++ 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x25cd, 0x080c, 0x78a5, ++ 0x0005, 0x2009, 0x1962, 0x200b, 0x0000, 0x2001, 0x1967, 0x2003, ++ 0x0036, 0x2001, 0x1966, 0x2003, 0x002a, 0x2001, 0x195f, 0x2003, ++ 0x0001, 0x9006, 0x080c, 0x272a, 0x2001, 0xffff, 0x20a9, 0x0009, ++ 0x080c, 0x2770, 0x2001, 0x195d, 0x2003, 0x0006, 0x2009, 0x001e, ++ 0x2011, 0x25cd, 0x080c, 0x78a5, 0x0005, 0x080c, 0x0d84, 0x2001, ++ 0x1967, 0x2003, 0x0036, 0x2001, 0x195f, 0x2003, 0x0003, 0x7a38, ++ 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, ++ 0x0001, 0x080c, 0x272a, 0x2001, 0x1963, 0x2003, 0x0000, 0x2001, ++ 0xffff, 0x20a9, 0x0009, 0x080c, 0x2770, 0x2001, 0x195d, 0x2003, ++ 0x0006, 0x2009, 0x001e, 0x2011, 0x25cd, 0x080c, 0x78a5, 0x0005, ++ 0x080c, 0x0d84, 0x080c, 0x0d84, 0x0005, 0x0006, 0x0016, 0x0026, ++ 0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, ++ 0x2001, 0x195f, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d84, 0x0043, ++ 0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, ++ 0x25ef, 0x260f, 0x264f, 0x267f, 0x26a3, 0x26b3, 0x26b5, 0x080c, ++ 0x2764, 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1965, ++ 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0xc08d, ++ 0x0008, 0xc085, 0x200a, 0x2001, 0x195d, 0x2003, 0x0001, 0x0030, ++ 0x080c, 0x26d9, 0x2001, 0xffff, 0x080c, 0x256a, 0x0005, 0x080c, ++ 0x26b7, 0x05e0, 0x2009, 0x1966, 0x2104, 0x8001, 0x200a, 0x080c, ++ 0x2764, 0x1178, 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, 0x9294, ++ 0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x1965, 0x2104, 0xc085, ++ 0x200a, 0x2009, 0x1962, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, ++ 0x0118, 0x080c, 0x26bf, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, ++ 0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, ++ 0x080c, 0x2747, 0x2001, 0x195f, 0x2003, 0x0002, 0x0028, 0x2001, ++ 0x195d, 0x2003, 0x0003, 0x0010, 0x080c, 0x258c, 0x0005, 0x080c, ++ 0x26b7, 0x0560, 0x2009, 0x1966, 0x2104, 0x8001, 0x200a, 0x080c, ++ 0x2764, 0x1168, 0x7850, 0x9084, 0xefff, 0x7852, 0x2001, 0x195d, ++ 0x2003, 0x0003, 0x2001, 0x195e, 0x2003, 0x0000, 0x00b8, 0x2009, ++ 0x1966, 0x2104, 0x9005, 0x1118, 0x080c, 0x26fc, 0x0010, 0x080c, ++ 0x26cc, 0x080c, 0x26bf, 0x2009, 0x1962, 0x200b, 0x0000, 0x2001, ++ 0x195f, 0x2003, 0x0001, 0x080c, 0x258c, 0x0000, 0x0005, 0x04b9, ++ 0x0508, 0x080c, 0x2764, 0x11b8, 0x7850, 0x9084, 0xefff, 0x7852, ++ 0x2009, 0x1963, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108, ++ 0x0078, 0x2001, 0x1968, 0x2003, 0x000a, 0x2009, 0x1965, 0x2104, ++ 0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, 0x195f, 0x2003, 0x0004, ++ 0x080c, 0x25b7, 0x0005, 0x0099, 0x0168, 0x080c, 0x2764, 0x1138, ++ 0x7850, 0x9084, 0xefff, 0x7852, 0x080c, 0x25a3, 0x0018, 0x0079, ++ 0x080c, 0x25b7, 0x0005, 0x080c, 0x0d84, 0x080c, 0x0d84, 0x2009, ++ 0x1967, 0x2104, 0x8001, 0x200a, 0x090c, 0x2718, 0x0005, 0x7a38, ++ 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, ++ 0x0001, 0x080c, 0x2747, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296, ++ 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x272a, ++ 0x0005, 0x2009, 0x1962, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, ++ 0x0108, 0x0068, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296, ++ 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x04d9, 0x7a38, ++ 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, ++ 0x0001, 0x080c, 0x2747, 0x0005, 0x0086, 0x2001, 0x1965, 0x2004, ++ 0x9084, 0x7fff, 0x090c, 0x0d84, 0x2009, 0x1964, 0x2144, 0x8846, ++ 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, 0x080c, ++ 0x0d84, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, 0x0005, ++ 0x0006, 0x0156, 0x2001, 0x195d, 0x20a9, 0x0009, 0x2003, 0x0000, ++ 0x8000, 0x1f04, 0x271e, 0x2001, 0x1964, 0x2003, 0x8000, 0x015e, ++ 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, ++ 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, 0x196a, ++ 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0006, ++ 0x783a, 0x2009, 0x196b, 0x210c, 0x795a, 0x00fe, 0x0005, 0x00f6, ++ 0x2079, 0x0100, 0x9085, 0x0000, 0x0138, 0x7838, 0x9084, 0xfffa, ++ 0x9085, 0x0004, 0x783a, 0x0030, 0x7838, 0x9084, 0xfffb, 0x9085, ++ 0x0005, 0x783a, 0x00fe, 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, ++ 0x9082, 0x0007, 0x000e, 0x0005, 0x0156, 0x20a9, 0x0064, 0x7820, ++ 0x080c, 0x27ef, 0xd09c, 0x1110, 0x1f04, 0x2767, 0x015e, 0x0005, ++ 0x0126, 0x0016, 0x0006, 0x2091, 0x8000, 0x7850, 0x9085, 0x0040, ++ 0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x27ef, 0x9085, ++ 0x2000, 0x7852, 0x000e, 0x2008, 0x9186, 0x0000, 0x1118, 0x783b, ++ 0x0007, 0x0090, 0x9186, 0x0001, 0x1118, 0x783b, 0x0006, 0x0060, ++ 0x9186, 0x0002, 0x1118, 0x783b, 0x0005, 0x0030, 0x9186, 0x0003, ++ 0x1118, 0x783b, 0x0004, 0x0000, 0x0006, 0x1d04, 0x279d, 0x080c, ++ 0x78c7, 0x1f04, 0x279d, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, ++ 0x7852, 0x080c, 0x27ef, 0x9085, 0x1000, 0x7852, 0x000e, 0x001e, ++ 0x012e, 0x0005, 0x7850, 0x9084, 0xffcf, 0x7852, 0x0005, 0x0006, ++ 0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, ++ 0x1130, 0x7820, 0xd0e4, 0x1140, 0x1f04, 0x27c1, 0x0028, 0x7854, ++ 0xd08c, 0x1110, 0x1f04, 0x27c7, 0x00fe, 0x015e, 0x000e, 0x0005, ++ 0x1d04, 0x27d0, 0x080c, 0x78c7, 0x1f04, 0x27d0, 0x0005, 0x0006, ++ 0x2001, 0x1969, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, ++ 0x2001, 0x1969, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, 0x0006, ++ 0x2001, 0x1969, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, 0xa001, ++ 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, 0x1975, ++ 0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140, ++ 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001, 0x200a, ++ 0x0005, 0x0036, 0x0046, 0x2001, 0x0141, 0x200c, 0x918c, 0xff00, ++ 0x9186, 0x2000, 0x0118, 0x9186, 0x0100, 0x1580, 0x2009, 0x017f, ++ 0x200b, 0x00a2, 0x2019, 0x0160, 0x2324, 0x2011, 0x0003, 0x2009, ++ 0x0169, 0x2104, 0xa001, 0x210c, 0x910e, 0x1dc8, 0x9084, 0x0007, ++ 0x9086, 0x0003, 0x11b8, 0x2304, 0x9402, 0x02a0, 0x1d68, 0x8211, ++ 0x1d70, 0x84ff, 0x0170, 0x2001, 0x0141, 0x200c, 0x918c, 0xff00, ++ 0x9186, 0x0100, 0x0130, 0x2009, 0x180c, 0x2104, 0xc0dd, 0x200a, ++ 0x0008, 0x0419, 0x2001, 0x017f, 0x2003, 0x0000, 0x004e, 0x003e, ++ 0x0005, 0x2001, 0x180c, 0x2004, 0xd0dc, 0x01b0, 0x2001, 0x0160, ++ 0x2004, 0x9005, 0x0140, 0x2001, 0x0141, 0x2004, 0x9084, 0xff00, ++ 0x9086, 0x0100, 0x1148, 0x0126, 0x2091, 0x8000, 0x0016, 0x0026, ++ 0x0021, 0x002e, 0x001e, 0x012e, 0x0005, 0x00c6, 0x2061, 0x0100, ++ 0x6014, 0x0006, 0x2001, 0x0161, 0x2003, 0x0000, 0x6017, 0x0018, ++ 0xa001, 0xa001, 0x602f, 0x0008, 0x6104, 0x918e, 0x0010, 0x6106, ++ 0x918e, 0x0010, 0x6106, 0x6017, 0x0040, 0x2001, 0x1000, 0x0429, ++ 0x9006, 0x0419, 0x001e, 0x9184, 0x0003, 0x01c0, 0x0036, 0x2019, ++ 0x0141, 0x2304, 0x9084, 0xff00, 0x9086, 0x0800, 0x1dd0, 0x919c, ++ 0xffe4, 0x9184, 0x0001, 0x0118, 0x9385, 0x0009, 0x6016, 0x9184, ++ 0x0002, 0x0118, 0x9385, 0x0012, 0x6016, 0x003e, 0x2001, 0x180c, ++ 0x200c, 0xc1dc, 0x2102, 0x00ce, 0x0005, 0x0016, 0x0026, 0x2009, ++ 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e, ++ 0x0005, 0x2b1d, 0x2b1d, 0x2941, 0x2941, 0x294d, 0x294d, 0x2959, ++ 0x2959, 0x2967, 0x2967, 0x2973, 0x2973, 0x2981, 0x2981, 0x298f, ++ 0x298f, 0x29a1, 0x29a1, 0x29ad, 0x29ad, 0x29bb, 0x29bb, 0x29d9, ++ 0x29d9, 0x29f9, 0x29f9, 0x29c9, 0x29c9, 0x29e9, 0x29e9, 0x2a07, ++ 0x2a07, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x2a19, 0x2a19, 0x2a25, 0x2a25, 0x2a33, 0x2a33, 0x2a41, ++ 0x2a41, 0x2a51, 0x2a51, 0x2a5f, 0x2a5f, 0x2a6f, 0x2a6f, 0x2a7f, ++ 0x2a7f, 0x2a91, 0x2a91, 0x2a9f, 0x2a9f, 0x2aaf, 0x2aaf, 0x2ad1, ++ 0x2ad1, 0x2af3, 0x2af3, 0x2abf, 0x2abf, 0x2ae2, 0x2ae2, 0x2b02, ++ 0x2b02, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, 0x299f, ++ 0x299f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x20bf, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, ++ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eda, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x1f12, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, ++ 0x0136, 0x0146, 0x0156, 0x080c, 0x20bf, 0x080c, 0x1f12, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x1eda, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x1eda, 0x080c, 0x20bf, 0x080c, 0x1f12, 0x0804, 0x2b15, 0xa001, ++ 0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x129f, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, ++ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20bf, 0x080c, ++ 0x129f, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, ++ 0x0136, 0x0146, 0x0156, 0x080c, 0x1eda, 0x080c, 0x129f, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x20bf, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x080c, 0x129f, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x1eda, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x1eda, 0x080c, 0x20bf, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x2500, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, ++ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2500, 0x080c, ++ 0x20bf, 0x0804, 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, ++ 0x0136, 0x0146, 0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x2500, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x2500, 0x080c, 0x20bf, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x2500, 0x080c, 0x1eda, 0x080c, 0x1f12, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x2500, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x080c, 0x1f12, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x2500, 0x080c, 0x129f, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x2500, 0x080c, 0x20bf, 0x080c, 0x129f, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x2500, 0x080c, 0x1eda, 0x080c, 0x129f, 0x0804, 0x2b15, 0x0106, ++ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, ++ 0x2500, 0x080c, 0x20bf, 0x080c, 0x129f, 0x080c, 0x1f12, 0x0804, ++ 0x2b15, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, ++ 0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x080c, 0x20bf, 0x080c, ++ 0x129f, 0x0498, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, ++ 0x0146, 0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x080c, 0x129f, ++ 0x080c, 0x1f12, 0x0410, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, ++ 0x0136, 0x0146, 0x0156, 0x080c, 0x2500, 0x080c, 0x129f, 0x080c, ++ 0x1f12, 0x0098, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, ++ 0x0146, 0x0156, 0x080c, 0x2500, 0x080c, 0x1eda, 0x080c, 0x20bf, ++ 0x080c, 0x129f, 0x080c, 0x1f12, 0x0000, 0x015e, 0x014e, 0x013e, ++ 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e, 0x000d, 0x00b6, 0x00c6, ++ 0x0026, 0x0046, 0x9026, 0x080c, 0x5eeb, 0x1904, 0x2c03, 0x72d8, ++ 0x2001, 0x194b, 0x2004, 0x9005, 0x1110, 0xd29c, 0x0148, 0xd284, ++ 0x1138, 0xd2bc, 0x1904, 0x2c03, 0x080c, 0x2c08, 0x0804, 0x2c03, ++ 0xd2cc, 0x1904, 0x2c03, 0x080c, 0x6877, 0x1120, 0x70a7, 0xffff, ++ 0x0804, 0x2c03, 0xd294, 0x0120, 0x70a7, 0xffff, 0x0804, 0x2c03, ++ 0x080c, 0x2e64, 0x0140, 0x080c, 0xb759, 0x1904, 0x2ba4, 0x70a7, ++ 0xffff, 0x0804, 0x2c03, 0x2001, 0x1816, 0x203c, 0x728c, 0xd284, ++ 0x0904, 0x2ba4, 0xd28c, 0x1904, 0x2ba4, 0x0036, 0x73a4, 0x938e, ++ 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, 0x2c04, ++ 0x938c, 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, ++ 0x00ff, 0x970e, 0x0540, 0x908e, 0x0000, 0x0528, 0x908e, 0x00ff, ++ 0x1150, 0x7230, 0xd284, 0x1518, 0x728c, 0xc28d, 0x728e, 0x70a7, ++ 0xffff, 0x003e, 0x0408, 0x900e, 0x080c, 0x23fd, 0x080c, 0x5bb0, ++ 0x11a0, 0x080c, 0x5f2d, 0x1150, 0x7030, 0xd08c, 0x0118, 0xb800, ++ 0xd0bc, 0x0120, 0x080c, 0x2c1f, 0x0140, 0x0028, 0x080c, 0x2d5b, ++ 0x080c, 0x2c4b, 0x0110, 0x8318, 0x0838, 0x73a6, 0x0010, 0x70a7, ++ 0xffff, 0x003e, 0x0804, 0x2c03, 0x9780, 0x2e6e, 0x203d, 0x97bc, ++ 0xff00, 0x873f, 0x2041, 0x007e, 0x70a4, 0x9096, 0xffff, 0x1118, ++ 0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, 0x20a8, ++ 0x0020, 0x70a7, 0xffff, 0x0804, 0x2c03, 0x2700, 0x0156, 0x0016, ++ 0x9106, 0x05b0, 0xc484, 0x080c, 0x5c0d, 0x0138, 0x080c, 0xb759, ++ 0x1578, 0x080c, 0x5bb0, 0x15a0, 0x0008, 0xc485, 0x080c, 0x5f2d, ++ 0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x728c, ++ 0xd28c, 0x0180, 0x080c, 0x5f2d, 0x9082, 0x0006, 0x02c8, 0xd484, ++ 0x1118, 0x080c, 0x5bd1, 0x0028, 0x080c, 0x2de6, 0x0188, 0x080c, ++ 0x2e11, 0x0070, 0x080c, 0x2d5b, 0x080c, 0xb759, 0x1148, 0x080c, ++ 0x2c4b, 0x0170, 0x0028, 0x080c, 0x2de6, 0x0110, 0x0441, 0x0140, ++ 0x001e, 0x8108, 0x015e, 0x1f04, 0x2bbd, 0x70a7, 0xffff, 0x0018, ++ 0x001e, 0x015e, 0x71a6, 0x004e, 0x002e, 0x00ce, 0x00be, 0x0005, ++ 0x00c6, 0x0016, 0x70a7, 0x0001, 0x2009, 0x007e, 0x080c, 0x5bb0, ++ 0x1158, 0xb813, 0x00ff, 0xb817, 0xfffe, 0x080c, 0x2d5b, 0x0499, ++ 0x0118, 0x70d8, 0xc0bd, 0x70da, 0x001e, 0x00ce, 0x0005, 0x0016, ++ 0x0076, 0x00d6, 0x00c6, 0x2001, 0x1857, 0x2004, 0x9084, 0x00ff, ++ 0xb842, 0x080c, 0x95a1, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xb4e6, ++ 0x6023, 0x0001, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0000, 0x080c, ++ 0x5b61, 0x0126, 0x2091, 0x8000, 0x70a0, 0x8000, 0x70a2, 0x012e, ++ 0x2009, 0x0004, 0x080c, 0x95ce, 0x9085, 0x0001, 0x00ce, 0x00de, ++ 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, ++ 0x1857, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0x95a1, 0x0548, ++ 0x2b00, 0x6012, 0xb800, 0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, ++ 0x0140, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, ++ 0x2d1a, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x9006, 0x080c, 0x5b4d, ++ 0x2001, 0x0002, 0x080c, 0x5b61, 0x0126, 0x2091, 0x8000, 0x70a0, ++ 0x8000, 0x70a2, 0x012e, 0x2009, 0x0002, 0x080c, 0x95ce, 0x9085, ++ 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, ++ 0x0026, 0x2009, 0x0080, 0x080c, 0x5bb0, 0x1140, 0xb813, 0x00ff, ++ 0xb817, 0xfffc, 0x0039, 0x0110, 0x70df, 0xffff, 0x002e, 0x00ce, ++ 0x00be, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x080c, 0x94fe, ++ 0x01d0, 0x2b00, 0x6012, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x9006, ++ 0x080c, 0x5b4d, 0x2001, 0x0002, 0x080c, 0x5b61, 0x0126, 0x2091, ++ 0x8000, 0x70e0, 0x8000, 0x70e2, 0x012e, 0x2009, 0x0002, 0x080c, ++ 0x95ce, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, ++ 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, 0x080c, ++ 0x5bb0, 0x11b8, 0xb813, 0x00ff, 0xb817, 0xfffd, 0xb8bf, 0x0004, ++ 0x080c, 0x94fe, 0x0170, 0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, ++ 0x620a, 0x080c, 0xb4e6, 0x2009, 0x0022, 0x080c, 0x95ce, 0x9085, ++ 0x0001, 0x012e, 0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, ++ 0x0036, 0x0026, 0x00b6, 0x21f0, 0x080c, 0x7d60, 0x080c, 0x7cef, ++ 0x080c, 0x93ac, 0x080c, 0xa3ab, 0x3e08, 0x2130, 0x81ff, 0x0120, ++ 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e, 0x0016, ++ 0x080c, 0x5c0d, 0x1140, 0x9686, 0x0002, 0x1118, 0xb800, 0xd0bc, ++ 0x1110, 0x080c, 0x56f3, 0x001e, 0x8108, 0x1f04, 0x2cff, 0x86ff, ++ 0x1110, 0x080c, 0x2e3e, 0x00be, 0x002e, 0x003e, 0x006e, 0x00ce, ++ 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, ++ 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x7d55, ++ 0x0076, 0x2039, 0x0000, 0x080c, 0x7c4d, 0x2c08, 0x080c, 0xc73e, ++ 0x007e, 0x001e, 0xba10, 0xbb14, 0x080c, 0x56f3, 0xba12, 0xbb16, ++ 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, ++ 0x0006, 0x00b6, 0x6010, 0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080, ++ 0x0150, 0x2071, 0x1800, 0x70a0, 0x9005, 0x0110, 0x8001, 0x70a2, ++ 0x000e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x70e0, 0x9005, 0x0dc0, ++ 0x8001, 0x70e2, 0x0ca8, 0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6, ++ 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, ++ 0x1118, 0x20a9, 0x0001, 0x0088, 0x080c, 0x4dea, 0xd0c4, 0x0150, ++ 0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, ++ 0xc9c5, 0x004e, 0x20a9, 0x0800, 0x9016, 0x0026, 0x928e, 0x007e, ++ 0x0904, 0x2dc7, 0x928e, 0x007f, 0x0904, 0x2dc7, 0x928e, 0x0080, ++ 0x05f0, 0x9288, 0x1000, 0x210c, 0x81ff, 0x05c8, 0x8fff, 0x1148, ++ 0x2001, 0x195b, 0x0006, 0x2003, 0x0001, 0x04e9, 0x000e, 0x2003, ++ 0x0000, 0x00b6, 0x00c6, 0x2158, 0x2001, 0x0001, 0x080c, 0x5ef7, ++ 0x00ce, 0x00be, 0x2019, 0x0029, 0x080c, 0x7d55, 0x0076, 0x2039, ++ 0x0000, 0x080c, 0x7c4d, 0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, ++ 0x9294, 0x00ff, 0x9286, 0x0006, 0x1118, 0xb807, 0x0404, 0x0028, ++ 0x2001, 0x0004, 0x8007, 0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, ++ 0x0016, 0x2c08, 0x080c, 0xc73e, 0x001e, 0x007e, 0x2160, 0x002e, ++ 0x8210, 0x1f04, 0x2d7d, 0x015e, 0x001e, 0x002e, 0x003e, 0x00ce, ++ 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016, 0x080c, 0x4dea, ++ 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2220, 0x2009, 0x0029, ++ 0x080c, 0xc9c5, 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, ++ 0x0036, 0x00c6, 0x728c, 0x82ff, 0x01e8, 0x080c, 0x5f25, 0x11d0, ++ 0x2100, 0x080c, 0x2430, 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, ++ 0x92e0, 0x1c80, 0x2c04, 0xd384, 0x0120, 0x9084, 0xff00, 0x8007, ++ 0x0010, 0x9084, 0x00ff, 0x9116, 0x0138, 0x9096, 0x00ff, 0x0110, ++ 0x8318, 0x0c68, 0x9085, 0x0001, 0x00ce, 0x003e, 0x002e, 0x001e, ++ 0x0005, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0036, 0x2019, ++ 0x0029, 0x00a9, 0x003e, 0x9180, 0x1000, 0x2004, 0x9065, 0x0158, ++ 0x0016, 0x00c6, 0x2061, 0x1a72, 0x001e, 0x6112, 0x080c, 0x2d1a, ++ 0x001e, 0x080c, 0x5bd1, 0x012e, 0x00ce, 0x001e, 0x0005, 0x0016, ++ 0x0026, 0x2110, 0x080c, 0x905b, 0x080c, 0xcc7a, 0x002e, 0x001e, ++ 0x0005, 0x2001, 0x1836, 0x2004, 0xd0cc, 0x0005, 0x00c6, 0x080c, ++ 0x6877, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, ++ 0x6877, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x9180, 0x1000, ++ 0x2004, 0x9065, 0x0110, 0x080c, 0x5bd1, 0x8108, 0x1f04, 0x2e4e, ++ 0x2061, 0x1800, 0x6077, 0x0000, 0x6078, 0x9084, 0x00ff, 0x607a, ++ 0x60ab, 0x0000, 0x00ce, 0x0005, 0x2001, 0x1874, 0x2004, 0xd0bc, ++ 0x0005, 0x2011, 0x1853, 0x2214, 0xd2ec, 0x0005, 0x7eef, 0x7de8, ++ 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6, ++ 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc, ++ 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc, ++ 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1, ++ 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6, ++ 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797, ++ 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c, ++ 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071, ++ 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66, ++ 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454, ++ 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a, ++ 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039, ++ 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d, ++ 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123, ++ 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f, ++ 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700, ++ 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000, ++ 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000, ++ 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000, ++ 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000, ++ 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700, ++ 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100, ++ 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00, ++ 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, ++ 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400, ++ 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00, ++ 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800, ++ 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400, ++ 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000, ++ 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, ++ 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, ++ 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0x1893, ++ 0x7003, 0x0002, 0x9006, 0x7012, 0x7016, 0x7046, 0x704a, 0x7037, ++ 0x18ae, 0x703b, 0x18ae, 0x7007, 0x0001, 0x080c, 0x0fc7, 0x090c, ++ 0x0d84, 0x2900, 0x7066, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, ++ 0x0fc7, 0x090c, 0x0d84, 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab, ++ 0xdcb0, 0x0005, 0x2071, 0x1893, 0x7004, 0x0002, 0x2f9a, 0x2f9b, ++ 0x2fa3, 0x2fb7, 0x0005, 0x1004, 0x2fa2, 0x0e04, 0x2fa2, 0x2079, ++ 0x0000, 0x0458, 0x0005, 0x2079, 0x0000, 0x2061, 0x18ac, 0x2c4c, ++ 0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, 0x0200, 0x0904, 0x3089, ++ 0x0005, 0x7014, 0x2048, 0x2061, 0x1800, 0x7018, 0x0807, 0x7010, ++ 0x2048, 0xa864, 0x9094, 0x00ff, 0x9296, 0x0029, 0x1120, 0xaa78, ++ 0xd2fc, 0x0128, 0x0005, 0x9086, 0x0103, 0x0108, 0x0005, 0x2079, ++ 0x0000, 0x2061, 0x1800, 0x7018, 0x0807, 0x2061, 0x1800, 0x7880, ++ 0x908a, 0x0040, 0x1210, 0x61cc, 0x0042, 0x2100, 0x908a, 0x003f, ++ 0x1a04, 0x3086, 0x61cc, 0x0804, 0x301d, 0x305f, 0x3095, 0x309f, ++ 0x30a3, 0x30ad, 0x30b3, 0x30b7, 0x30c7, 0x30ca, 0x30d4, 0x30d9, ++ 0x30de, 0x30e9, 0x30f4, 0x3103, 0x3112, 0x3120, 0x3137, 0x3152, ++ 0x31f2, 0x31f7, 0x3235, 0x32dd, 0x32ee, 0x3311, 0x3086, 0x3086, ++ 0x3086, 0x3349, 0x3367, 0x3370, 0x339f, 0x33a5, 0x3086, 0x33dd, ++ 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x33e8, 0x33f1, 0x33f9, ++ 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x33fb, ++ 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x3418, 0x3475, 0x3086, ++ 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x0002, 0x349f, 0x34a2, ++ 0x3502, 0x351b, 0x354b, 0x37ed, 0x3086, 0x49c6, 0x3086, 0x3086, ++ 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x3086, 0x30d4, 0x30d9, ++ 0x3cbf, 0x3086, 0x3cd6, 0x4a55, 0x4aa5, 0x4ba8, 0x3086, 0x4c0a, ++ 0x4c46, 0x4c77, 0x4d79, 0x4ca4, 0x4cfb, 0x3086, 0x3cda, 0x3ea6, ++ 0x3ebc, 0x3ed8, 0x3f3d, 0x3fb1, 0x3fd1, 0x403b, 0x404c, 0x405d, ++ 0x4060, 0x4085, 0x40f9, 0x415b, 0x4163, 0x428b, 0x43b4, 0x43dd, ++ 0x4504, 0x4522, 0x452e, 0x45d0, 0x46a0, 0x3086, 0x3086, 0x3086, ++ 0x3086, 0x4706, 0x4721, 0x48ac, 0x4982, 0x7148, 0x0000, 0x2021, ++ 0x4000, 0x080c, 0x445b, 0x0126, 0x2091, 0x8000, 0x0e04, 0x3069, ++ 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, ++ 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a, 0x7b8e, ++ 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, ++ 0x7007, 0x0001, 0x2091, 0x5000, 0x012e, 0x0005, 0x2021, 0x4001, ++ 0x08c0, 0x2021, 0x4002, 0x08a8, 0x2021, 0x4003, 0x0890, 0x2021, ++ 0x4005, 0x0878, 0x2021, 0x4006, 0x0860, 0x2039, 0x0001, 0x902e, ++ 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x4468, 0x7883, ++ 0x0004, 0x7884, 0x0807, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, ++ 0x7a8c, 0x7884, 0x7990, 0x0804, 0x446b, 0x7984, 0x7888, 0x2114, ++ 0x200a, 0x0804, 0x305f, 0x7984, 0x2114, 0x0804, 0x305f, 0x20e1, ++ 0x0000, 0x2099, 0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9, ++ 0x001f, 0x4003, 0x7984, 0x7a88, 0x7b8c, 0x0804, 0x305f, 0x7884, ++ 0x2060, 0x04d8, 0x2009, 0x0003, 0x2011, 0x0002, 0x2019, 0x000a, ++ 0x789b, 0x0117, 0x0804, 0x305f, 0x2039, 0x0001, 0x7d98, 0x7c9c, ++ 0x0800, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0848, 0x79a0, 0x9182, ++ 0x0040, 0x0210, 0x0804, 0x3092, 0x2138, 0x7d98, 0x7c9c, 0x0804, ++ 0x3099, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3092, 0x2138, ++ 0x7d98, 0x7c9c, 0x0804, 0x30a7, 0x79a0, 0x9182, 0x0040, 0x0210, ++ 0x0804, 0x3092, 0x21e8, 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0, ++ 0x4004, 0x0804, 0x305f, 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15, ++ 0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0x9005, 0x0904, 0x305f, ++ 0x0804, 0x308c, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3092, ++ 0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198, 0x4012, 0x0804, 0x305f, ++ 0x2069, 0x1852, 0x7884, 0x7990, 0x911a, 0x1a04, 0x3092, 0x8019, ++ 0x0904, 0x3092, 0x684a, 0x6942, 0x788c, 0x6852, 0x7888, 0x6856, ++ 0x9006, 0x685a, 0x685e, 0x080c, 0x6b71, 0x0804, 0x305f, 0x2069, ++ 0x1852, 0x7884, 0x7994, 0x911a, 0x1a04, 0x3092, 0x8019, 0x0904, ++ 0x3092, 0x684e, 0x6946, 0x788c, 0x6862, 0x7888, 0x6866, 0x9006, ++ 0x686a, 0x686e, 0x0126, 0x2091, 0x8000, 0x080c, 0x5f97, 0x012e, ++ 0x0804, 0x305f, 0x902e, 0x2520, 0x81ff, 0x1904, 0x308f, 0x7984, ++ 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, 0x189a, ++ 0x4101, 0x080c, 0x441f, 0x0904, 0x308f, 0x2009, 0x0020, 0xa85c, ++ 0x9080, 0x0019, 0xaf60, 0x080c, 0x4468, 0x701b, 0x3170, 0x0005, ++ 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, 0x0168, 0x9096, ++ 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096, 0x0048, 0x0120, ++ 0x9096, 0x0029, 0x1904, 0x308f, 0x810f, 0x918c, 0x00ff, 0x0904, ++ 0x308f, 0x710e, 0x700c, 0x8001, 0x0548, 0x700e, 0x080c, 0x441f, ++ 0x0904, 0x308f, 0x2009, 0x0020, 0x7064, 0x2040, 0xa28c, 0xa390, ++ 0xa494, 0xa598, 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, ++ 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4468, ++ 0x701b, 0x31ab, 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, ++ 0x0120, 0x9096, 0x000a, 0x1904, 0x308f, 0x08a0, 0x7010, 0x2048, ++ 0xa868, 0xc0fd, 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0029, ++ 0x1160, 0xc2fd, 0xaa7a, 0x080c, 0x57e4, 0x0150, 0x0126, 0x2091, ++ 0x8000, 0xa87a, 0xa982, 0x012e, 0x0050, 0x080c, 0x5ac6, 0x1128, ++ 0x7007, 0x0003, 0x701b, 0x31d7, 0x0005, 0x080c, 0x63d1, 0x0126, ++ 0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099, 0x189a, ++ 0x400a, 0x2100, 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, ++ 0x0000, 0xa85c, 0x9080, 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, ++ 0x0804, 0x446b, 0x61b4, 0x7884, 0x60b6, 0x0804, 0x305f, 0x2091, ++ 0x8000, 0x7837, 0x4000, 0x7833, 0x0010, 0x7883, 0x4000, 0x7887, ++ 0x4953, 0x788b, 0x5020, 0x788f, 0x2020, 0x2009, 0x017f, 0x2104, ++ 0x7892, 0x3f00, 0x7896, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, ++ 0x603c, 0x8007, 0x9205, 0x789a, 0x2009, 0x04fd, 0x2104, 0x789e, ++ 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, ++ 0x0180, 0x2001, 0x19e7, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, ++ 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, ++ 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x308f, ++ 0x7984, 0x080c, 0x5c0d, 0x1904, 0x3092, 0x7e98, 0x9684, 0x3fff, ++ 0x9082, 0x4000, 0x0210, 0x0804, 0x3092, 0x7c88, 0x7d8c, 0x080c, ++ 0x5d70, 0x080c, 0x5d3f, 0x0000, 0x1518, 0x2061, 0x1cd0, 0x0126, ++ 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, ++ 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0150, 0x012e, ++ 0x9ce0, 0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, 0x1a04, 0x308f, ++ 0x0c30, 0x080c, 0xad1e, 0x012e, 0x0904, 0x308f, 0x0804, 0x305f, ++ 0x900e, 0x2001, 0x0005, 0x080c, 0x63d1, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0xb37a, 0x080c, 0x61a9, 0x012e, 0x0804, 0x305f, 0x00a6, ++ 0x2950, 0xb198, 0x080c, 0x5c0d, 0x1904, 0x32ca, 0xb6a4, 0x9684, ++ 0x3fff, 0x9082, 0x4000, 0x0208, 0x04e8, 0xb49c, 0xb5a0, 0x080c, ++ 0x5d70, 0x080c, 0x5d3f, 0x1520, 0x2061, 0x1cd0, 0x0126, 0x2091, ++ 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, ++ 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, ++ 0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, ++ 0x0c28, 0x080c, 0xad1e, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, ++ 0x900e, 0x2001, 0x0005, 0x080c, 0x63d1, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0xb37a, 0x080c, 0x61a9, 0x012e, 0x0070, 0xb097, 0x4005, ++ 0xb19a, 0x0010, 0xb097, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, ++ 0x0030, 0x2a48, 0x00ae, 0x0005, 0xb097, 0x4000, 0x9006, 0x918d, ++ 0x0001, 0x2008, 0x2a48, 0x00ae, 0x0005, 0x81ff, 0x1904, 0x308f, ++ 0x080c, 0x4436, 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904, 0x308f, ++ 0x080c, 0x5d76, 0x0904, 0x308f, 0x0804, 0x3fc8, 0x81ff, 0x1904, ++ 0x308f, 0x080c, 0x4452, 0x0904, 0x3092, 0x080c, 0x5e04, 0x0904, ++ 0x308f, 0x2019, 0x0005, 0x79a8, 0x080c, 0x5d91, 0x0904, 0x308f, ++ 0x7888, 0x908a, 0x1000, 0x1a04, 0x3092, 0x8003, 0x800b, 0x810b, ++ 0x9108, 0x080c, 0x7826, 0x7984, 0xd184, 0x1904, 0x305f, 0x0804, ++ 0x3fc8, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, ++ 0x0450, 0x2029, 0x07ff, 0x6454, 0x2400, 0x9506, 0x01f8, 0x2508, ++ 0x080c, 0x5c0d, 0x11d8, 0x080c, 0x5e04, 0x1128, 0x2009, 0x0002, ++ 0x62bc, 0x2518, 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, 0x5d91, ++ 0x1118, 0x2009, 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, 0x1270, ++ 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x7826, 0x8529, 0x1ae0, ++ 0x012e, 0x0804, 0x305f, 0x012e, 0x0804, 0x308f, 0x012e, 0x0804, ++ 0x3092, 0x080c, 0x4436, 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904, ++ 0x308f, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x2061, 0x0000, 0x080c, ++ 0x7d55, 0x0076, 0x2039, 0x0000, 0x080c, 0x7c4d, 0x900e, 0x080c, ++ 0xc73e, 0x007e, 0x00ce, 0x080c, 0x5d70, 0x0804, 0x305f, 0x080c, ++ 0x4436, 0x0904, 0x3092, 0x080c, 0x5d70, 0x2208, 0x0804, 0x305f, ++ 0x0156, 0x00d6, 0x00e6, 0x2069, 0x1904, 0x6810, 0x6914, 0x910a, ++ 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x20a9, 0x007e, 0x2069, ++ 0x1000, 0x2d04, 0x905d, 0x0118, 0xb84c, 0x0059, 0x9210, 0x8d68, ++ 0x1f04, 0x3381, 0x2300, 0x9218, 0x00ee, 0x00de, 0x015e, 0x0804, ++ 0x305f, 0x00f6, 0x0016, 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c, ++ 0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, ++ 0x1904, 0x6910, 0x62b8, 0x0804, 0x305f, 0x81ff, 0x1904, 0x308f, ++ 0x6154, 0x9190, 0x2e6e, 0x2215, 0x9294, 0x00ff, 0x6374, 0x83ff, ++ 0x0108, 0x6278, 0x67d8, 0x97c4, 0x000a, 0x98c6, 0x000a, 0x1118, ++ 0x2031, 0x0001, 0x00f0, 0x97c4, 0x0022, 0x98c6, 0x0022, 0x1118, ++ 0x2031, 0x0003, 0x00b0, 0x97c4, 0x0012, 0x98c6, 0x0012, 0x1118, ++ 0x2031, 0x0002, 0x0070, 0x080c, 0x6877, 0x1118, 0x2031, 0x0004, ++ 0x0040, 0xd79c, 0x0120, 0x2009, 0x0005, 0x0804, 0x308f, 0x2031, ++ 0x0000, 0x7e9a, 0x7f9e, 0x0804, 0x305f, 0x6144, 0x6248, 0x2019, ++ 0x1953, 0x231c, 0x2001, 0x1954, 0x2004, 0x789a, 0x0804, 0x305f, ++ 0x0126, 0x2091, 0x8000, 0x6134, 0x6238, 0x633c, 0x012e, 0x0804, ++ 0x305f, 0x080c, 0x4452, 0x0904, 0x3092, 0xba44, 0xbb38, 0x0804, ++ 0x305f, 0x080c, 0x0d84, 0x6144, 0x6248, 0x7884, 0x6046, 0x7b88, ++ 0x634a, 0x2069, 0x1852, 0x831f, 0x9305, 0x6816, 0x788c, 0x2069, ++ 0x1953, 0x2d1c, 0x206a, 0x7e98, 0x9682, 0x0014, 0x1210, 0x2031, ++ 0x07d0, 0x2069, 0x1954, 0x2d04, 0x266a, 0x789a, 0x0804, 0x305f, ++ 0x0126, 0x2091, 0x8000, 0x6134, 0x7884, 0x6036, 0x910e, 0xd1b4, ++ 0x190c, 0x0e56, 0xd0c4, 0x01a8, 0x00d6, 0x78a8, 0x2009, 0x196a, ++ 0x200a, 0x78ac, 0x2011, 0x196b, 0x2012, 0x2069, 0x0100, 0x6838, ++ 0x9086, 0x0007, 0x1118, 0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a, ++ 0x00de, 0x7884, 0x7888, 0x603a, 0x2011, 0x0114, 0x220c, 0x7888, ++ 0xd08c, 0x0118, 0x918d, 0x0080, 0x0010, 0x918c, 0xff7f, 0x2112, ++ 0x613c, 0x788c, 0x603e, 0x910e, 0xd1e4, 0x190c, 0x0e73, 0x603c, ++ 0xd0cc, 0x0120, 0x78b0, 0x2011, 0x0114, 0x2012, 0x012e, 0x0804, ++ 0x305f, 0x00f6, 0x2079, 0x1800, 0x7a34, 0xa898, 0x9084, 0xfebf, ++ 0x9215, 0xa89c, 0x9084, 0xfebf, 0x8002, 0x9214, 0x79ec, 0x7834, ++ 0x9084, 0x0140, 0x9215, 0x7a36, 0xa897, 0x4000, 0x900e, 0x9085, ++ 0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, 0x7898, 0x9005, 0x01a8, ++ 0x7888, 0x9025, 0x0904, 0x3092, 0x788c, 0x902d, 0x0904, 0x3092, ++ 0x900e, 0x080c, 0x5c0d, 0x1120, 0xba44, 0xbb38, 0xbc46, 0xbd3a, ++ 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x4452, 0x0904, ++ 0x3092, 0x7888, 0x900d, 0x0904, 0x3092, 0x788c, 0x9005, 0x0904, ++ 0x3092, 0xba44, 0xb946, 0xbb38, 0xb83a, 0x0804, 0x305f, 0x2011, ++ 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, 0x4dfe, 0x1904, 0x308f, ++ 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, 0x00ff, 0x1130, 0x2001, ++ 0x1816, 0x2004, 0x9085, 0xff00, 0x0088, 0x9182, 0x007f, 0x16e8, ++ 0x9188, 0x2e6e, 0x210d, 0x918c, 0x00ff, 0x2001, 0x1816, 0x2004, ++ 0x0026, 0x9116, 0x002e, 0x0588, 0x810f, 0x9105, 0x0126, 0x2091, ++ 0x8000, 0x0006, 0x080c, 0x94fe, 0x000e, 0x0518, 0x6016, 0x600b, ++ 0xbc05, 0x7984, 0x00b6, 0x080c, 0x5bb0, 0x2b08, 0x00be, 0x1500, ++ 0x6112, 0x6023, 0x0001, 0x080c, 0x441f, 0x01d0, 0x9006, 0xa866, ++ 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x701b, 0x34fb, ++ 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0x95ce, 0x012e, 0x00ce, ++ 0x0005, 0x012e, 0x00ce, 0x0804, 0x308f, 0x00ce, 0x0804, 0x3092, ++ 0x080c, 0x9554, 0x0cb0, 0xa830, 0x9086, 0x0100, 0x0904, 0x308f, ++ 0x0804, 0x305f, 0x2061, 0x1a3d, 0x0126, 0x2091, 0x8000, 0x6000, ++ 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, 0x634c, 0x606c, ++ 0x789a, 0x60bc, 0x789e, 0x60b8, 0x78aa, 0x012e, 0x0804, 0x305f, ++ 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x308f, 0x080c, 0x6877, ++ 0x0904, 0x308f, 0x0126, 0x2091, 0x8000, 0x624c, 0x606c, 0x9202, ++ 0x0248, 0x9085, 0x0001, 0x080c, 0x2466, 0x080c, 0x4fc7, 0x012e, ++ 0x0804, 0x305f, 0x012e, 0x0804, 0x3092, 0x0006, 0x0016, 0x00c6, ++ 0x00e6, 0x2001, 0x1976, 0x2070, 0x2061, 0x1852, 0x6008, 0x2072, ++ 0x900e, 0x2011, 0x1400, 0x080c, 0x7a4b, 0x7206, 0x00ee, 0x00ce, ++ 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0128, ++ 0x012e, 0x2021, 0x400b, 0x0804, 0x3061, 0x7884, 0xd0fc, 0x0148, ++ 0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, 0x02a8, 0x012e, 0x0804, ++ 0x3092, 0x2001, 0x002a, 0x2004, 0x2069, 0x1852, 0x6908, 0x9102, ++ 0x1218, 0x012e, 0x0804, 0x3092, 0x614c, 0x606c, 0x9106, 0x0118, ++ 0x012e, 0x0804, 0x308f, 0x080c, 0x94d3, 0x0dd0, 0x7884, 0xd0fc, ++ 0x0904, 0x35ca, 0x00c6, 0x080c, 0x441f, 0x00ce, 0x0d88, 0xa867, ++ 0x0000, 0x7884, 0xa80a, 0x7898, 0xa80e, 0x789c, 0xa812, 0x2001, ++ 0x002e, 0x2004, 0xa81a, 0x2001, 0x002f, 0x2004, 0xa81e, 0x2001, ++ 0x0030, 0x2004, 0xa822, 0x2001, 0x0031, 0x2004, 0xa826, 0x2001, ++ 0x0034, 0x2004, 0xa82a, 0x2001, 0x0035, 0x2004, 0xa82e, 0x2001, ++ 0x002a, 0x2004, 0x9080, 0x0003, 0x9084, 0x00fc, 0x8004, 0xa816, ++ 0x080c, 0x3750, 0x0928, 0x7010, 0x2048, 0xad2c, 0xac28, 0xab1c, ++ 0xaa18, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, ++ 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, ++ 0x9080, 0x001b, 0x080c, 0x4468, 0x701b, 0x368d, 0x701f, 0x0001, ++ 0x012e, 0x0005, 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, ++ 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3535, 0x2001, 0x196c, 0x2003, ++ 0x0000, 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, ++ 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, 0x37bf, 0x080c, ++ 0x377e, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x1a33, 0x2079, ++ 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, ++ 0x0035, 0x2004, 0x780e, 0x2001, 0x0034, 0x2004, 0x780a, 0x00de, ++ 0x2011, 0x0001, 0x080c, 0x3b2b, 0x008e, 0x00ee, 0x00fe, 0x080c, ++ 0x3a61, 0x080c, 0x396a, 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, ++ 0x0140, 0x1db8, 0x080c, 0x3b7f, 0x00f6, 0x2079, 0x0300, 0x78bc, ++ 0x00fe, 0x908c, 0x0070, 0x1560, 0x2071, 0x0200, 0x7037, 0x0000, ++ 0x7050, 0x9084, 0xff00, 0x9086, 0x3200, 0x1510, 0x7037, 0x0001, ++ 0x7050, 0x9084, 0xff00, 0x9086, 0xe100, 0x11d0, 0x7037, 0x0000, ++ 0x7054, 0x7037, 0x0000, 0x715c, 0x9106, 0x1190, 0x2001, 0x181e, ++ 0x2004, 0x9106, 0x1168, 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, ++ 0x1e00, 0x00ce, 0x0138, 0x080c, 0x3974, 0x080c, 0x3779, 0x0058, ++ 0x080c, 0x3779, 0x080c, 0x3ac3, 0x080c, 0x3a57, 0x2001, 0x020b, ++ 0x2004, 0xd0e4, 0x0dd8, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, ++ 0x0100, 0x6027, 0x0002, 0x001e, 0x6106, 0x2011, 0x020d, 0x2013, ++ 0x0020, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x2001, ++ 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x1245, 0x2009, ++ 0x0028, 0x080c, 0x2014, 0x2001, 0x0227, 0x200c, 0x2102, 0x00fe, ++ 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x004e, ++ 0x2001, 0x196c, 0x2004, 0x9005, 0x1118, 0x012e, 0x0804, 0x305f, ++ 0x012e, 0x2021, 0x400c, 0x0804, 0x3061, 0x0016, 0x0026, 0x0036, ++ 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x7010, ++ 0x2048, 0x701c, 0x20a8, 0x8000, 0x701e, 0xa804, 0x9005, 0x0904, ++ 0x36e9, 0x2048, 0x1f04, 0x369d, 0x7064, 0x2040, 0xa28c, 0xa390, ++ 0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, ++ 0x2021, 0x0000, 0x0096, 0x7010, 0x2048, 0xa864, 0x009e, 0x9086, ++ 0x0103, 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, ++ 0xffc0, 0x9080, 0x001b, 0x080c, 0x4468, 0x701b, 0x368d, 0x00b0, ++ 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, ++ 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, ++ 0x0f2b, 0x000e, 0x080c, 0x446b, 0x701b, 0x368d, 0x015e, 0x00de, ++ 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, ++ 0x0005, 0x7010, 0x2048, 0xa864, 0x9086, 0x0103, 0x1118, 0x701b, ++ 0x374e, 0x0450, 0x7010, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0x2009, ++ 0x007f, 0x080c, 0x5bb0, 0x0110, 0x9006, 0x0030, 0xb813, 0x00ff, ++ 0xb817, 0xfffd, 0x080c, 0xb535, 0x015e, 0x00de, 0x009e, 0x008e, ++ 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0904, 0x308f, ++ 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, ++ 0x00d6, 0x0156, 0x701b, 0x3720, 0x7007, 0x0003, 0x0804, 0x36de, ++ 0x0076, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, 0x3061, ++ 0xad10, 0xac0c, 0xab24, 0xaa20, 0xa930, 0xa808, 0xd0b4, 0x1120, ++ 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, ++ 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, ++ 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f2b, 0x000e, 0x080c, 0x446b, ++ 0x007e, 0x701b, 0x368d, 0x701f, 0x0001, 0x0005, 0x0804, 0x305f, ++ 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, 0xa833, 0x001e, ++ 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, 0x080c, 0x441f, ++ 0x001e, 0x0130, 0xa800, 0x2040, 0xa008, 0xa80a, 0x2100, 0x0c58, ++ 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x015e, 0x0005, 0x0006, ++ 0x00f6, 0x2079, 0x0000, 0x7880, 0x9086, 0x0044, 0x00fe, 0x000e, ++ 0x0005, 0x2001, 0x196c, 0x2003, 0x0001, 0x0005, 0x00f6, 0x00e6, ++ 0x00c6, 0x2061, 0x0200, 0x2001, 0x1977, 0x2004, 0x601a, 0x2061, ++ 0x0100, 0x2001, 0x1976, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, ++ 0x080c, 0x441f, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, ++ 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, ++ 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x1976, 0x2004, 0x6036, ++ 0x2009, 0x0040, 0x080c, 0x2014, 0x2001, 0x002a, 0x2004, 0x9084, ++ 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, 0x0000, 0x78ca, ++ 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, ++ 0x080c, 0x441f, 0x2940, 0xa013, 0x0019, 0xa017, 0x0001, 0x2800, ++ 0xa05a, 0x2001, 0x0030, 0x2004, 0xa866, 0x2001, 0x0031, 0x2004, ++ 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0xa873, ++ 0x0000, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x0300, 0x2003, ++ 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c, ++ 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0x81ff, 0x0148, 0x080c, 0x27e7, 0x1130, 0x9006, 0x080c, 0x2747, ++ 0x9006, 0x080c, 0x272a, 0x7884, 0x9084, 0x0007, 0x0002, 0x380a, ++ 0x3813, 0x381c, 0x3807, 0x3807, 0x3807, 0x3807, 0x3807, 0x012e, ++ 0x0804, 0x3092, 0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, ++ 0x080c, 0x39ba, 0x00c0, 0x2009, 0x0114, 0x2104, 0x9085, 0x4000, ++ 0x200a, 0x080c, 0x39ba, 0x0078, 0x080c, 0x6877, 0x1128, 0x012e, ++ 0x2009, 0x0016, 0x0804, 0x308f, 0x81ff, 0x0128, 0x012e, 0x2021, ++ 0x400b, 0x0804, 0x3061, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, ++ 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3535, 0x2009, 0x0101, 0x210c, ++ 0x0016, 0x7ec8, 0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058, 0x080c, ++ 0x3c52, 0x080c, 0x3bab, 0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086, ++ 0x2940, 0x2071, 0x1a33, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, ++ 0x6884, 0xd0b4, 0x0120, 0x68d4, 0x780e, 0x68d0, 0x780a, 0x00de, ++ 0x2011, 0x0001, 0x080c, 0x3b2b, 0x080c, 0x27ef, 0x080c, 0x27ef, ++ 0x080c, 0x27ef, 0x080c, 0x27ef, 0x080c, 0x3b2b, 0x008e, 0x00ee, ++ 0x00fe, 0x080c, 0x3a61, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, ++ 0x1dd0, 0x00f6, 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, ++ 0x2001, 0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, 0x3a3f, 0x2d00, ++ 0x9c05, 0x9b05, 0x0120, 0x080c, 0x3974, 0x0804, 0x3921, 0x080c, ++ 0x3b7f, 0x080c, 0x3ac3, 0x080c, 0x3a22, 0x080c, 0x3a57, 0x00f6, ++ 0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3974, ++ 0x00fe, 0x0804, 0x3921, 0x00fe, 0x080c, 0x396a, 0x1150, 0x8d68, ++ 0x2001, 0x0032, 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3974, ++ 0x0080, 0x87ff, 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, ++ 0x8739, 0x0038, 0x2001, 0x1a30, 0x2004, 0x9086, 0x0000, 0x1904, ++ 0x3871, 0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, ++ 0x2500, 0x9605, 0x0904, 0x3921, 0x7884, 0xd0bc, 0x0128, 0x2d00, ++ 0x9c05, 0x9b05, 0x1904, 0x3921, 0xa013, 0x0019, 0x2001, 0x032a, ++ 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a30, 0x2003, ++ 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, 0x0001, ++ 0x78b4, 0x9005, 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, ++ 0x080c, 0x2014, 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, ++ 0x1180, 0xa817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, ++ 0x602b, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x38f8, 0x00ce, ++ 0x0030, 0xa817, 0x0001, 0x78b0, 0x9005, 0x0108, 0xa816, 0x00f6, ++ 0x00c6, 0x2079, 0x0100, 0x2061, 0x0090, 0x7827, 0x0002, 0x2001, ++ 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, 0x2001, 0x002b, ++ 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804, ++ 0x3845, 0x001e, 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, ++ 0x0100, 0x6027, 0x0002, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, ++ 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x1245, ++ 0x7884, 0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, 0x2009, 0x0028, ++ 0x080c, 0x2014, 0x2001, 0x0227, 0x200c, 0x2102, 0x6050, 0x9084, ++ 0xb7ef, 0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090, ++ 0x6043, 0x0010, 0x00ce, 0x2d08, 0x2c10, 0x2b18, 0x2b00, 0x9c05, ++ 0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, ++ 0x008e, 0x1118, 0x012e, 0x0804, 0x305f, 0x012e, 0x2021, 0x400c, ++ 0x0804, 0x3061, 0x9085, 0x0001, 0x1d04, 0x3973, 0x2091, 0x6000, ++ 0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, ++ 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a30, 0x2003, 0x0000, ++ 0x0051, 0x2009, 0x0048, 0x080c, 0x2014, 0x2001, 0x0227, 0x2024, ++ 0x2402, 0x9026, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a33, 0x7000, ++ 0x9086, 0x0000, 0x0520, 0x2079, 0x0090, 0x2009, 0x0206, 0x2104, ++ 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, ++ 0x2014, 0x782c, 0xd0fc, 0x0d88, 0x080c, 0x3b7f, 0x7000, 0x9086, ++ 0x0000, 0x1d58, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, ++ 0x0040, 0x080c, 0x2014, 0x782b, 0x0002, 0x7003, 0x0000, 0x00ee, ++ 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1816, 0x200c, ++ 0x7932, 0x7936, 0x080c, 0x2446, 0x7850, 0x9084, 0xfbff, 0x9085, ++ 0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, 0x9084, 0xffcf, ++ 0x9085, 0x2000, 0x7852, 0x20a9, 0x0046, 0x1d04, 0x39d5, 0x2091, ++ 0x6000, 0x1f04, 0x39d5, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfff, ++ 0x7852, 0x2001, 0x0021, 0x2004, 0x9084, 0x0003, 0x9086, 0x0001, ++ 0x1120, 0x7850, 0x9084, 0xdfff, 0x7852, 0x784b, 0xf7f7, 0x7843, ++ 0x0090, 0x7843, 0x0010, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x39f5, ++ 0x7850, 0x9085, 0x1400, 0x7852, 0x2019, 0x61a8, 0x7854, 0xa001, ++ 0xa001, 0xd08c, 0x1110, 0x8319, 0x1dc8, 0x7827, 0x0048, 0x7850, ++ 0x9085, 0x0400, 0x7852, 0x7843, 0x0040, 0x2019, 0x01f4, 0xa001, ++ 0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x28a5, 0x7827, ++ 0x0020, 0x7843, 0x0000, 0x9006, 0x080c, 0x28a5, 0x7827, 0x0048, ++ 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, ++ 0x1a30, 0x2079, 0x0320, 0x2001, 0x0201, 0x2004, 0x9005, 0x0160, ++ 0x7000, 0x9086, 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108, 0x8738, ++ 0x7003, 0x0003, 0x782b, 0x0019, 0x00ee, 0x00fe, 0x0005, 0x00f6, ++ 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x0178, 0x2009, ++ 0x0032, 0x260a, 0x2009, 0x0033, 0x250a, 0xd0b4, 0x0108, 0x8c60, ++ 0xd0ac, 0x0108, 0x8d68, 0xd0a4, 0x0108, 0x8b58, 0x0005, 0x00f6, ++ 0x2079, 0x0200, 0x781c, 0xd084, 0x0110, 0x7837, 0x0050, 0x00fe, ++ 0x0005, 0x00e6, 0x2071, 0x0100, 0x2001, 0x1977, 0x2004, 0x70e2, ++ 0x080c, 0x376f, 0x1188, 0x2001, 0x181e, 0x2004, 0x2009, 0x181d, ++ 0x210c, 0x918c, 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d, 0x3200, ++ 0x7162, 0x7073, 0xe109, 0x0080, 0x702c, 0x9085, 0x0002, 0x702e, ++ 0x2009, 0x1816, 0x210c, 0x716e, 0x7063, 0x0100, 0x7166, 0x719e, ++ 0x706b, 0x0000, 0x7073, 0x0809, 0x7077, 0x0008, 0x7078, 0x9080, ++ 0x0100, 0x707a, 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa, 0x9006, ++ 0x708a, 0x708e, 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af, 0x95d5, ++ 0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016, 0x080c, 0x3b7f, ++ 0x00f6, 0x2071, 0x1a30, 0x2079, 0x0320, 0x00d6, 0x2069, 0x0000, ++ 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, 0x6898, 0x780a, 0x00de, ++ 0x2011, 0x0011, 0x080c, 0x3b2b, 0x2011, 0x0001, 0x080c, 0x3b2b, ++ 0x00fe, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a30, 0x2079, ++ 0x0320, 0x792c, 0xd1fc, 0x0904, 0x3b28, 0x782b, 0x0002, 0x9026, ++ 0xd19c, 0x1904, 0x3b24, 0x7000, 0x0002, 0x3b28, 0x3ad9, 0x3b09, ++ 0x3b24, 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, ++ 0x0001, 0x080c, 0x3b2b, 0x0904, 0x3b28, 0x080c, 0x3b2b, 0x0804, ++ 0x3b28, 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, ++ 0x7914, 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, ++ 0x81ff, 0x0de8, 0x080c, 0x3a3f, 0x2009, 0x0001, 0x00f6, 0x2079, ++ 0x0300, 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, ++ 0x00f8, 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, ++ 0x1904, 0x3acd, 0x2011, 0x0001, 0x00b1, 0x0090, 0xa010, 0x9092, ++ 0x0004, 0x9086, 0x0015, 0x1120, 0xa000, 0xa05a, 0x2011, 0x0031, ++ 0xa212, 0xd1dc, 0x1960, 0x0828, 0x782b, 0x0004, 0x7003, 0x0000, ++ 0x00ee, 0x00fe, 0x0005, 0xa014, 0x9005, 0x0540, 0x8001, 0x0036, ++ 0x0096, 0xa016, 0xa058, 0x2048, 0xa010, 0x2009, 0x0025, 0x911a, ++ 0x831c, 0x831c, 0x938a, 0x0004, 0x1a0c, 0x0d84, 0x9398, 0x3b57, ++ 0x231d, 0x083f, 0x9080, 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102, ++ 0x009e, 0x003e, 0x908a, 0x0029, 0x1130, 0xa058, 0x2048, 0xa804, ++ 0xa05a, 0x2001, 0x0019, 0xa012, 0x9085, 0x0001, 0x0005, 0x3b76, ++ 0x3b6d, 0x3b64, 0x3b5b, 0xa964, 0x7902, 0xa968, 0x7906, 0xa96c, ++ 0x7912, 0xa970, 0x7916, 0x0005, 0xa974, 0x7902, 0xa978, 0x7906, ++ 0xa97c, 0x7912, 0xa980, 0x7916, 0x0005, 0xa984, 0x7902, 0xa988, ++ 0x7906, 0xa98c, 0x7912, 0xa990, 0x7916, 0x0005, 0xa994, 0x7902, ++ 0xa998, 0x7906, 0xa99c, 0x7912, 0xa9a0, 0x7916, 0x0005, 0x00f6, ++ 0x00e6, 0x0086, 0x2071, 0x1a33, 0x2079, 0x0090, 0x792c, 0xd1fc, ++ 0x01f0, 0x782b, 0x0002, 0x2940, 0x9026, 0x7000, 0x0002, 0x3ba7, ++ 0x3b92, 0x3b9e, 0x8001, 0x7002, 0xd19c, 0x1188, 0x2011, 0x0001, ++ 0x080c, 0x3b2b, 0x0160, 0x080c, 0x3b2b, 0x0048, 0x8001, 0x7002, ++ 0x782c, 0xd0fc, 0x1d30, 0x2011, 0x0001, 0x080c, 0x3b2b, 0x008e, ++ 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061, ++ 0x0200, 0x2001, 0x1977, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, ++ 0x1976, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c, ++ 0x2004, 0x9005, 0x0518, 0x2038, 0x2001, 0x002e, 0x2024, 0x2001, ++ 0x002f, 0x201c, 0x080c, 0x441f, 0xa813, 0x0019, 0xaf16, 0x2900, ++ 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, ++ 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, ++ 0x009e, 0x04c1, 0x1d70, 0x2900, 0xa85a, 0x0080, 0x080c, 0x441f, ++ 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, ++ 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2061, 0x0090, ++ 0x2079, 0x0100, 0x2001, 0x1976, 0x2004, 0x6036, 0x2009, 0x0040, ++ 0x080c, 0x2014, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, ++ 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0xa872, 0x601e, 0x78c6, ++ 0x000e, 0x78ca, 0x9006, 0x600a, 0x600e, 0x008e, 0x00ce, 0x00ee, ++ 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0080, 0xaa60, 0x22e8, 0x20a0, ++ 0x20e1, 0x0000, 0x2099, 0x0088, 0x702b, 0x0026, 0x7402, 0x7306, ++ 0x9006, 0x700a, 0x700e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7112, ++ 0x702b, 0x0041, 0x702c, 0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b, ++ 0x0040, 0x4005, 0x7400, 0x7304, 0x87ff, 0x0190, 0x0086, 0x0096, ++ 0x2940, 0x0086, 0x080c, 0x441f, 0x008e, 0xa058, 0x00a6, 0x2050, ++ 0x2900, 0xb006, 0xa05a, 0x00ae, 0x009e, 0x008e, 0x9085, 0x0001, ++ 0x00ee, 0x0005, 0x00e6, 0x2001, 0x002d, 0x2004, 0x9005, 0x0528, ++ 0x2038, 0x2001, 0x0030, 0x2024, 0x2001, 0x0031, 0x201c, 0x080c, ++ 0x441f, 0x2940, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, ++ 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, ++ 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, ++ 0x3c1a, 0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c, 0x441f, 0x2940, ++ 0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, ++ 0x2004, 0xa066, 0x2001, 0x0031, 0x2004, 0xa06a, 0x2001, 0x002a, ++ 0x2004, 0x9084, 0xfff8, 0xa06e, 0x2001, 0x002b, 0x2004, 0xa072, ++ 0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1180, 0x2001, ++ 0x0101, 0x200c, 0x918d, 0x0200, 0x2102, 0xa017, 0x0000, 0x2001, ++ 0x1a30, 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x2001, ++ 0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, ++ 0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, ++ 0x2091, 0x8000, 0x20a9, 0x0012, 0x2001, 0x1840, 0x20e9, 0x0001, ++ 0x20a0, 0x9006, 0x4004, 0x2009, 0x013c, 0x200a, 0x012e, 0x7880, ++ 0x9086, 0x0052, 0x0108, 0x0005, 0x0804, 0x305f, 0x7d98, 0x7c9c, ++ 0x0804, 0x3154, 0x080c, 0x6877, 0x0110, 0x080c, 0x569e, 0x2069, ++ 0x1852, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, ++ 0x2039, 0x0001, 0x080c, 0x4468, 0x701b, 0x3cef, 0x0005, 0x080c, ++ 0x4df9, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095, 0x20d8, 0x21d0, ++ 0x2069, 0x1852, 0x6800, 0x9005, 0x0904, 0x3092, 0x6804, 0xd0ac, ++ 0x0118, 0xd0a4, 0x0904, 0x3092, 0xd094, 0x00c6, 0x2061, 0x0100, ++ 0x6104, 0x0138, 0x6200, 0x9292, 0x0005, 0x0218, 0x918c, 0xffdf, ++ 0x0010, 0x918d, 0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6, 0x2061, ++ 0x0100, 0x6104, 0x0118, 0x918d, 0x0010, 0x0010, 0x918c, 0xffef, ++ 0x6106, 0x00ce, 0xd084, 0x0158, 0x6a28, 0x928a, 0x007f, 0x1a04, ++ 0x3092, 0x9288, 0x2e6e, 0x210d, 0x918c, 0x00ff, 0x615e, 0xd0dc, ++ 0x0130, 0x6828, 0x908a, 0x007f, 0x1a04, 0x3092, 0x6056, 0x6888, ++ 0x9084, 0x0030, 0x8004, 0x8004, 0x8004, 0x8004, 0x0006, 0x2009, ++ 0x197e, 0x9080, 0x2539, 0x2005, 0x200a, 0x000e, 0x2009, 0x197f, ++ 0x9080, 0x253d, 0x2005, 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, ++ 0x3092, 0x908a, 0x0841, 0x1a04, 0x3092, 0x9084, 0x0007, 0x1904, ++ 0x3092, 0x680c, 0x9005, 0x0904, 0x3092, 0x6810, 0x9005, 0x0904, ++ 0x3092, 0x6848, 0x6940, 0x910a, 0x1a04, 0x3092, 0x8001, 0x0904, ++ 0x3092, 0x684c, 0x6944, 0x910a, 0x1a04, 0x3092, 0x8001, 0x0904, ++ 0x3092, 0x6980, 0xd1e4, 0x0140, 0x00c6, 0x2061, 0x0100, 0x6004, ++ 0x9085, 0x0100, 0x6006, 0x00ce, 0x2009, 0x194e, 0x200b, 0x0000, ++ 0x2001, 0x1874, 0x2004, 0xd0c4, 0x0140, 0x7884, 0x200a, 0x2009, ++ 0x017f, 0x200a, 0x3b00, 0xc085, 0x20d8, 0x6814, 0x908c, 0x00ff, ++ 0x6146, 0x8007, 0x9084, 0x00ff, 0x604a, 0x080c, 0x6b71, 0x080c, ++ 0x5f63, 0x080c, 0x5f97, 0x6808, 0x602a, 0x080c, 0x1f86, 0x2009, ++ 0x0170, 0x200b, 0x0080, 0xa001, 0xa001, 0x200b, 0x0000, 0x0036, ++ 0x6b08, 0x080c, 0x24a0, 0x003e, 0x6000, 0x9086, 0x0000, 0x1904, ++ 0x3e96, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, ++ 0x831f, 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148, ++ 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, ++ 0x0010, 0x9084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, 0x8007, ++ 0x810f, 0x8217, 0x831f, 0x20a9, 0x0004, 0x20a1, 0x1980, 0x20e9, ++ 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1, 0x199a, 0x20e9, 0x0001, ++ 0x4001, 0x080c, 0x791c, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, ++ 0xd384, 0x0510, 0x0068, 0x2009, 0x0100, 0x210c, 0x918e, 0x0008, ++ 0x1110, 0x839d, 0x0010, 0x83f5, 0x3e18, 0x12b0, 0x3508, 0x8109, ++ 0x080c, 0x70f4, 0x6878, 0x6016, 0x6874, 0x2008, 0x9084, 0xff00, ++ 0x8007, 0x600a, 0x9184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, ++ 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x3deb, 0x00ce, 0x00c6, ++ 0x2061, 0x1969, 0x6a88, 0x9284, 0xc000, 0x2010, 0x9286, 0x0000, ++ 0x1158, 0x2063, 0x0000, 0x2001, 0x0001, 0x080c, 0x2747, 0x2001, ++ 0x0001, 0x080c, 0x272a, 0x0088, 0x9286, 0x4000, 0x1148, 0x2063, ++ 0x0001, 0x9006, 0x080c, 0x2747, 0x9006, 0x080c, 0x272a, 0x0028, ++ 0x9286, 0x8000, 0x1d30, 0x2063, 0x0002, 0x00ce, 0x00e6, 0x2c70, ++ 0x080c, 0x0e3b, 0x00ee, 0x6888, 0xd0ec, 0x0130, 0x2011, 0x0114, ++ 0x2204, 0x9085, 0x0100, 0x2012, 0x6a80, 0x9284, 0x0030, 0x9086, ++ 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001, ++ 0x194b, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, 0x928e, ++ 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, ++ 0x2515, 0x2001, 0x193c, 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, ++ 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x6877, ++ 0x0128, 0x080c, 0x46fa, 0x0110, 0x080c, 0x2466, 0x60d0, 0x9005, ++ 0x01c0, 0x6003, 0x0001, 0x2009, 0x3e7e, 0x00d0, 0x080c, 0x6877, ++ 0x1168, 0x2011, 0x6739, 0x080c, 0x781a, 0x2011, 0x672c, 0x080c, ++ 0x78e7, 0x080c, 0x6b45, 0x080c, 0x67be, 0x0040, 0x080c, 0x55a0, ++ 0x0028, 0x6003, 0x0004, 0x2009, 0x3e96, 0x0010, 0x0804, 0x305f, ++ 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, ++ 0x2091, 0x30bd, 0x0817, 0x2091, 0x303d, 0x0817, 0x6000, 0x9086, ++ 0x0000, 0x0904, 0x308f, 0x2069, 0x1852, 0x7890, 0x6842, 0x7894, ++ 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, ++ 0x2039, 0x0001, 0x0804, 0x446b, 0x9006, 0x080c, 0x2466, 0x81ff, ++ 0x1904, 0x308f, 0x080c, 0x6877, 0x1168, 0x080c, 0x6b40, 0x080c, ++ 0x56d9, 0x080c, 0x2e69, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, ++ 0x67be, 0x0020, 0x080c, 0x569e, 0x080c, 0x55a0, 0x0804, 0x305f, ++ 0x81ff, 0x1904, 0x308f, 0x080c, 0x6877, 0x1110, 0x0804, 0x308f, ++ 0x618c, 0x81ff, 0x01a8, 0x704b, 0x0000, 0x2001, 0x1c80, 0x2009, ++ 0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, 0x8000, ++ 0x2039, 0x0001, 0x080c, 0x446b, 0x701b, 0x305d, 0x012e, 0x0005, ++ 0x704b, 0x0001, 0x00d6, 0x2069, 0x1c80, 0x20a9, 0x0040, 0x20e9, ++ 0x0001, 0x20a1, 0x1c80, 0x2019, 0xffff, 0x4304, 0x6554, 0x9588, ++ 0x2e6e, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, 0x0002, ++ 0x2100, 0x9506, 0x01a8, 0x080c, 0x5c0d, 0x1190, 0xb814, 0x821c, ++ 0x0238, 0x9398, 0x1c80, 0x9085, 0xff00, 0x8007, 0x201a, 0x0038, ++ 0x9398, 0x1c80, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a, 0x8210, ++ 0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c, ++ 0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1c80, 0x2099, ++ 0x1c80, 0x080c, 0x5634, 0x0804, 0x3ee5, 0x080c, 0x4452, 0x0904, ++ 0x3092, 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, 0x308f, ++ 0x080c, 0x4dea, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, 0x0538, ++ 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, 0x2e64, ++ 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, 0x9086, ++ 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, ++ 0xb258, 0x1120, 0x2009, 0x0003, 0x0804, 0x308f, 0x7007, 0x0003, ++ 0x701b, 0x3f73, 0x0005, 0x080c, 0x4452, 0x0904, 0x3092, 0x20a9, ++ 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, 0x20e8, 0xa85c, ++ 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, ++ 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, ++ 0x0f2b, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, 0x20a0, ++ 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0f2b, ++ 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, ++ 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, ++ 0x446b, 0x81ff, 0x1904, 0x308f, 0x080c, 0x4436, 0x0904, 0x3092, ++ 0x080c, 0x5d7f, 0x0904, 0x308f, 0x0058, 0xa878, 0x9005, 0x0120, ++ 0x2009, 0x0004, 0x0804, 0x308f, 0xa974, 0xaa94, 0x0804, 0x305f, ++ 0x080c, 0x4df2, 0x0904, 0x305f, 0x701b, 0x3fbd, 0x7007, 0x0003, ++ 0x0005, 0x81ff, 0x1904, 0x308f, 0x7888, 0x908a, 0x1000, 0x1a04, ++ 0x3092, 0x080c, 0x4452, 0x0904, 0x3092, 0x080c, 0x5e04, 0x0904, ++ 0x308f, 0x2019, 0x0004, 0x900e, 0x080c, 0x5d91, 0x0904, 0x308f, ++ 0x7984, 0x7a88, 0x0499, 0x08e0, 0xa89c, 0x908a, 0x1000, 0x12c8, ++ 0x080c, 0x4450, 0x01b0, 0x080c, 0x5e04, 0x2009, 0x0002, 0x0168, ++ 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x5d91, 0x2009, 0x0003, ++ 0x0120, 0xa998, 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, ++ 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, ++ 0x0005, 0xa897, 0x4000, 0x080c, 0x4df2, 0x0110, 0x9006, 0x0018, ++ 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, ++ 0x0110, 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, 0x6454, ++ 0x2400, 0x9506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, ++ 0x080c, 0x5c0d, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, ++ 0x080c, 0x7826, 0x0005, 0x81ff, 0x1904, 0x308f, 0x080c, 0x4436, ++ 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904, 0x308f, 0x080c, 0x5d88, ++ 0x0904, 0x308f, 0x0804, 0x3fc8, 0x81ff, 0x1904, 0x308f, 0x080c, ++ 0x4436, 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904, 0x308f, 0x080c, ++ 0x5d76, 0x0904, 0x308f, 0x0804, 0x3fc8, 0x6100, 0x0804, 0x305f, ++ 0x080c, 0x4452, 0x0904, 0x3092, 0x080c, 0x4dfe, 0x1904, 0x308f, ++ 0x79a8, 0xd184, 0x1158, 0xb834, 0x8007, 0x789e, 0xb830, 0x8007, ++ 0x789a, 0xbb2c, 0x831f, 0xba28, 0x8217, 0x0050, 0xb824, 0x8007, ++ 0x789e, 0xb820, 0x8007, 0x789a, 0xbb1c, 0x831f, 0xba18, 0x8217, ++ 0xb900, 0x918c, 0x0200, 0x0804, 0x305f, 0x78a8, 0x909c, 0x0003, ++ 0xd0b4, 0x1150, 0x939a, 0x0003, 0x1a04, 0x308f, 0x6254, 0x9294, ++ 0x00ff, 0x7884, 0x9206, 0x1560, 0x2031, 0x1848, 0x2009, 0x013c, ++ 0x2136, 0x2001, 0x1840, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, ++ 0x7d98, 0x2039, 0x0001, 0x0006, 0x78a8, 0x9084, 0x0080, 0x1118, ++ 0x000e, 0x0804, 0x446b, 0x000e, 0x2031, 0x0000, 0x2061, 0x18ac, ++ 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, ++ 0xa59a, 0x080c, 0x108c, 0x7007, 0x0002, 0x701b, 0x40df, 0x0005, ++ 0x81ff, 0x1904, 0x308f, 0x080c, 0x4452, 0x0904, 0x3092, 0x080c, ++ 0x5f2d, 0x1904, 0x308f, 0x00c6, 0x080c, 0x441f, 0x00ce, 0x0904, ++ 0x308f, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb1fe, ++ 0x0904, 0x308f, 0x7007, 0x0003, 0x701b, 0x40e3, 0x0005, 0x080c, ++ 0x3cbf, 0x0804, 0x305f, 0xa830, 0x9086, 0x0100, 0x0904, 0x308f, ++ 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, ++ 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, ++ 0x446b, 0x9006, 0x080c, 0x2466, 0x78a8, 0x9084, 0x00ff, 0x9086, ++ 0x00ff, 0x0118, 0x81ff, 0x1904, 0x308f, 0x080c, 0x6877, 0x0110, ++ 0x080c, 0x569e, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3092, 0x7984, ++ 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x3092, 0x2100, ++ 0x080c, 0x2430, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, ++ 0x19c7, 0x601b, 0x0000, 0x601f, 0x0000, 0x080c, 0x6877, 0x1158, ++ 0x080c, 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, 0x080c, 0x68c0, ++ 0x080c, 0x67be, 0x00d0, 0x080c, 0x94da, 0x2061, 0x0100, 0x2001, ++ 0x1816, 0x2004, 0x9084, 0x00ff, 0x810f, 0x9105, 0x604a, 0x6043, ++ 0x0090, 0x6043, 0x0010, 0x2009, 0x1966, 0x200b, 0x0000, 0x2009, ++ 0x002d, 0x2011, 0x55ca, 0x080c, 0x78a5, 0x7984, 0x080c, 0x6877, ++ 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, 0x401e, 0x012e, 0x00ce, ++ 0x002e, 0x0804, 0x305f, 0x7984, 0x080c, 0x5bb0, 0x2b08, 0x1904, ++ 0x3092, 0x0804, 0x305f, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, ++ 0x308f, 0x60d8, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, ++ 0x0804, 0x308f, 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, ++ 0x308f, 0x7984, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, ++ 0x0019, 0x7026, 0xaf60, 0x7732, 0x080c, 0x4468, 0x701b, 0x4189, ++ 0x0005, 0x2009, 0x0080, 0x080c, 0x5c0d, 0x1118, 0x080c, 0x5f2d, ++ 0x0120, 0x2021, 0x400a, 0x0804, 0x3061, 0x00d6, 0x0096, 0xa964, ++ 0xaa6c, 0xab70, 0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, ++ 0x0904, 0x4222, 0x90be, 0x0112, 0x0904, 0x4222, 0x90be, 0x0113, ++ 0x0904, 0x4222, 0x90be, 0x0114, 0x0904, 0x4222, 0x90be, 0x0117, ++ 0x0904, 0x4222, 0x90be, 0x011a, 0x0904, 0x4222, 0x90be, 0x011c, ++ 0x0904, 0x4222, 0x90be, 0x0121, 0x0904, 0x4209, 0x90be, 0x0131, ++ 0x0904, 0x4209, 0x90be, 0x0171, 0x0904, 0x4222, 0x90be, 0x0173, ++ 0x0904, 0x4222, 0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, ++ 0x0804, 0x422d, 0x90be, 0x0212, 0x0904, 0x4216, 0x90be, 0x0213, ++ 0x05e8, 0x90be, 0x0214, 0x0500, 0x90be, 0x0217, 0x0188, 0x90be, ++ 0x021a, 0x1120, 0xa89c, 0x8007, 0xa89e, 0x04e0, 0x90be, 0x021f, ++ 0x05c8, 0x90be, 0x0300, 0x05b0, 0x009e, 0x00de, 0x0804, 0x3092, ++ 0x7024, 0x9080, 0x0010, 0x2098, 0x20a0, 0x7030, 0x20e0, 0x20e8, ++ 0x20a9, 0x0007, 0x080c, 0x426b, 0x7024, 0x9080, 0x000e, 0x2098, ++ 0x20a0, 0x7030, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x426b, ++ 0x00c8, 0x7024, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7030, 0x20e0, ++ 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4278, 0x00b8, 0x7024, 0x9080, ++ 0x000e, 0x2098, 0x20a0, 0x7030, 0x20e0, 0x20e8, 0x20a9, 0x0001, ++ 0x080c, 0x4278, 0x7024, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7030, ++ 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, 0x441f, ++ 0x0550, 0xa868, 0xc0fd, 0xa86a, 0xa867, 0x0119, 0x9006, 0xa882, ++ 0xa87f, 0x0020, 0xa88b, 0x0001, 0x810b, 0xa9ae, 0xa8b2, 0xaab6, ++ 0xabba, 0xacbe, 0xadc2, 0xa9c6, 0xa8ca, 0x00ce, 0x009e, 0x00de, ++ 0xa866, 0xa822, 0xa868, 0xc0fd, 0xa86a, 0xa804, 0x2048, 0x080c, ++ 0xb219, 0x1120, 0x2009, 0x0003, 0x0804, 0x308f, 0x7007, 0x0003, ++ 0x701b, 0x4262, 0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, ++ 0x0804, 0x308f, 0xa820, 0x9086, 0x8001, 0x1904, 0x305f, 0x2009, ++ 0x0004, 0x0804, 0x308f, 0x0016, 0x0026, 0x3510, 0x20a9, 0x0002, ++ 0x4002, 0x4104, 0x4004, 0x8211, 0x1dc8, 0x002e, 0x001e, 0x0005, ++ 0x0016, 0x0026, 0x0036, 0x0046, 0x3520, 0x20a9, 0x0004, 0x4002, ++ 0x4304, 0x4204, 0x4104, 0x4004, 0x8421, 0x1db8, 0x004e, 0x003e, ++ 0x002e, 0x001e, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, ++ 0x308f, 0x60d8, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, ++ 0x0804, 0x308f, 0x7984, 0x78a8, 0x2040, 0x080c, 0x94d3, 0x1120, ++ 0x9182, 0x007f, 0x0a04, 0x3092, 0x9186, 0x00ff, 0x0904, 0x3092, ++ 0x9182, 0x0800, 0x1a04, 0x3092, 0x7a8c, 0x7b88, 0x6074, 0x9306, ++ 0x1140, 0x6078, 0x924e, 0x0904, 0x3092, 0x99cc, 0xff00, 0x0904, ++ 0x3092, 0x080c, 0x435a, 0x0538, 0x90c6, 0x4000, 0x1170, 0x00c6, ++ 0x0006, 0x900e, 0x080c, 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, ++ 0x0108, 0xc18d, 0x000e, 0x00ce, 0x0098, 0x90c6, 0x4007, 0x1110, ++ 0x2408, 0x0070, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0040, ++ 0x90c6, 0x4009, 0x1108, 0x0020, 0x2001, 0x4005, 0x2009, 0x000a, ++ 0x2020, 0x0804, 0x3061, 0x2b00, 0x7022, 0x0016, 0x00b6, 0x00c6, ++ 0x00e6, 0x2c70, 0x080c, 0x95a1, 0x0904, 0x4330, 0x2b00, 0x6012, ++ 0x080c, 0xb4e6, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, 0x441f, ++ 0x00ce, 0x2b70, 0x1150, 0x080c, 0x9554, 0x00ee, 0x00ce, 0x00be, ++ 0x001e, 0x2009, 0x0002, 0x0804, 0x308f, 0x900e, 0xa966, 0xa96a, ++ 0x2900, 0x6016, 0xa932, 0xa868, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, ++ 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2d1a, 0x012e, 0x6023, ++ 0x0001, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0002, 0x080c, 0x5b61, ++ 0x2009, 0x0002, 0x080c, 0x95ce, 0x78a8, 0xd094, 0x0138, 0x00ee, ++ 0x7020, 0x00e6, 0x2058, 0xb8bc, 0xc08d, 0xb8be, 0x9085, 0x0001, ++ 0x00ee, 0x00ce, 0x00be, 0x001e, 0x1120, 0x2009, 0x0003, 0x0804, ++ 0x308f, 0x7007, 0x0003, 0x701b, 0x433e, 0x0005, 0xa830, 0x9086, ++ 0x0100, 0x7020, 0x2058, 0x1138, 0x2009, 0x0004, 0xba04, 0x9294, ++ 0x00ff, 0x0804, 0x4d49, 0x900e, 0xa868, 0xd0f4, 0x1904, 0x305f, ++ 0x080c, 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, ++ 0x0804, 0x305f, 0x00e6, 0x00d6, 0x2029, 0x0000, 0x080c, 0x94d3, ++ 0x0138, 0x2021, 0x0000, 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, ++ 0x2021, 0x0080, 0x20a9, 0x0780, 0x2071, 0x1080, 0x2e04, 0x9005, ++ 0x1130, 0x2100, 0x9406, 0x1550, 0x2428, 0xc5fd, 0x0438, 0x2058, ++ 0xbf10, 0x2700, 0x9306, 0x11a0, 0xbe14, 0x2600, 0x9206, 0x1180, ++ 0x2400, 0x9106, 0x1150, 0xd884, 0x0550, 0xd894, 0x1540, 0x080c, ++ 0x5f2d, 0x1528, 0x2001, 0x4000, 0x0418, 0x2001, 0x4007, 0x0400, ++ 0x2400, 0x9106, 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x09e0, ++ 0x080c, 0x94d3, 0x19c8, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, ++ 0x1f04, 0x436e, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, ++ 0x0001, 0x0030, 0x080c, 0x5bb0, 0x1dd0, 0xbb12, 0xba16, 0x9006, ++ 0x9005, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x1904, 0x308f, 0x080c, ++ 0x441f, 0x0904, 0x308f, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, ++ 0x7884, 0x9005, 0x0904, 0x3092, 0x9096, 0x00ff, 0x0120, 0x9092, ++ 0x0004, 0x1a04, 0x3092, 0x2010, 0x2918, 0x080c, 0x2cc0, 0x0904, ++ 0x308f, 0x7007, 0x0003, 0x701b, 0x43d6, 0x0005, 0xa830, 0x9086, ++ 0x0100, 0x0904, 0x308f, 0x0804, 0x305f, 0x7984, 0x080c, 0x94d3, ++ 0x1120, 0x9182, 0x0080, 0x0a04, 0x3092, 0x9186, 0x00ff, 0x0904, ++ 0x3092, 0x9182, 0x0800, 0x1a04, 0x3092, 0x2001, 0x9000, 0x080c, ++ 0x4da2, 0x1904, 0x308f, 0x0804, 0x305f, 0xa998, 0x080c, 0x94d3, ++ 0x1118, 0x9182, 0x0080, 0x0280, 0x9186, 0x00ff, 0x0168, 0x9182, ++ 0x0800, 0x1250, 0x2001, 0x9000, 0x080c, 0x4da2, 0x11a8, 0x0060, ++ 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, ++ 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x900e, 0x9085, ++ 0x0001, 0x2001, 0x0000, 0x0005, 0x2009, 0x000a, 0x0c48, 0x080c, ++ 0x0fae, 0x0198, 0x9006, 0xa802, 0x7010, 0x9005, 0x1120, 0x2900, ++ 0x7012, 0x7016, 0x0040, 0x7014, 0xa802, 0x0086, 0x2040, 0x2900, ++ 0xa006, 0x7016, 0x008e, 0x9085, 0x0001, 0x0005, 0x7984, 0x080c, ++ 0x5c0d, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, ++ 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x5c0d, 0x1130, 0xae9c, ++ 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, ++ 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x5c0d, 0x1108, 0x0008, ++ 0x905e, 0x8bff, 0x0005, 0x0016, 0x7110, 0x81ff, 0x0128, 0x2148, ++ 0xa904, 0x080c, 0x0fe0, 0x0cc8, 0x7112, 0x7116, 0x001e, 0x0005, ++ 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0x18ac, 0x2c44, ++ 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, ++ 0x080c, 0x108c, 0x7007, 0x0002, 0x701b, 0x305f, 0x0005, 0x00f6, ++ 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, 0x18a4, 0x2004, ++ 0x9005, 0x1188, 0x0e04, 0x449b, 0x7a36, 0x7833, 0x0012, 0x7a82, ++ 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, ++ 0x190c, 0x113e, 0x0408, 0x0016, 0x00c6, 0x00e6, 0x2071, 0x1893, ++ 0x7144, 0x9182, 0x0010, 0x0218, 0x7034, 0x2060, 0x0078, 0x7034, ++ 0x90e0, 0x0004, 0x9c82, 0x18ee, 0x0210, 0x2061, 0x18ae, 0x2c00, ++ 0x7036, 0x81ff, 0x1108, 0x703a, 0x8108, 0x7146, 0x2262, 0x6306, ++ 0x640a, 0x00ee, 0x00ce, 0x001e, 0x012e, 0x00fe, 0x0005, 0x00e6, ++ 0x2071, 0x1893, 0x7044, 0x9005, 0x0590, 0x0126, 0x2091, 0x8000, ++ 0x0e04, 0x44f6, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x7038, 0x2060, ++ 0x2c04, 0x7836, 0x7833, 0x0012, 0x7882, 0x6004, 0x7886, 0x6008, ++ 0x788a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, ++ 0x113e, 0x7044, 0x8001, 0x7046, 0x9005, 0x1130, 0x7037, 0x18ae, ++ 0x703b, 0x18ae, 0x00ce, 0x0048, 0x9c80, 0x0004, 0x90fa, 0x18ee, ++ 0x0210, 0x2001, 0x18ae, 0x703a, 0x00ce, 0x00fe, 0x012e, 0x00ee, ++ 0x0005, 0x0026, 0x080c, 0x4dea, 0xd0c4, 0x0120, 0x2011, 0x8014, ++ 0x080c, 0x447f, 0x002e, 0x0005, 0x81ff, 0x1904, 0x308f, 0x0126, ++ 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, ++ 0x6877, 0x1158, 0x080c, 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, ++ 0x080c, 0x68c0, 0x080c, 0x67be, 0x0010, 0x080c, 0x55a0, 0x012e, ++ 0x0804, 0x305f, 0x7884, 0x2008, 0x918c, 0xfffd, 0x1128, 0x61e4, ++ 0x910d, 0x61e6, 0x0804, 0x305f, 0x0804, 0x3092, 0x81ff, 0x1904, ++ 0x308f, 0x080c, 0x4dfe, 0x1904, 0x308f, 0x080c, 0x5f25, 0x1904, ++ 0x308f, 0x080c, 0x2e64, 0x0128, 0x7984, 0x080c, 0x5bb0, 0x1904, ++ 0x3092, 0x080c, 0x4452, 0x0904, 0x3092, 0x2b00, 0x7022, 0x080c, ++ 0x5f2d, 0x7888, 0x1170, 0x9084, 0x0005, 0x1158, 0x900e, 0x080c, ++ 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, ++ 0x305f, 0x080c, 0x441f, 0x0904, 0x308f, 0x9006, 0xa866, 0xa832, ++ 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb2a8, 0x0904, 0x308f, 0x7888, ++ 0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x7007, 0x0003, 0x701b, ++ 0x45bd, 0x0005, 0x2061, 0x1800, 0x080c, 0x4dfe, 0x2009, 0x0007, ++ 0x1570, 0x080c, 0x5f25, 0x2009, 0x0008, 0x1548, 0x080c, 0x2e64, ++ 0x0120, 0xa998, 0x080c, 0x5bb0, 0x1530, 0x080c, 0x4450, 0x0518, ++ 0x080c, 0x5f2d, 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e, ++ 0x080c, 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, ++ 0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xb2a8, 0x11e0, 0xa89c, ++ 0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x2009, 0x0003, 0xa897, ++ 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, ++ 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0xa99a, 0x9006, 0x918d, ++ 0x0001, 0x2008, 0x0005, 0x9006, 0x0005, 0xa830, 0x9086, 0x0100, ++ 0x7020, 0x2058, 0x1110, 0x0804, 0x4d49, 0x900e, 0x080c, 0x5e2d, ++ 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x305f, ++ 0x080c, 0x4dfe, 0x1904, 0x308f, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c, ++ 0x7d98, 0x080c, 0x441f, 0x0904, 0x308f, 0x900e, 0x2130, 0x7122, ++ 0x712e, 0xa860, 0x20e8, 0x7032, 0xa85c, 0x9080, 0x0005, 0x7026, ++ 0x20a0, 0x080c, 0x5c0d, 0x1904, 0x464d, 0x080c, 0x5f2d, 0x0120, ++ 0x080c, 0x5f35, 0x1904, 0x464d, 0x080c, 0x5f25, 0x1130, 0x080c, ++ 0x5e2d, 0x1118, 0xd79c, 0x0904, 0x464d, 0xd794, 0x1110, 0xd784, ++ 0x01a8, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x3400, ++ 0xd794, 0x0160, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, ++ 0x20e0, 0x20a9, 0x0002, 0x080c, 0x4278, 0x0048, 0x20a9, 0x0004, ++ 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x4278, 0x4104, ++ 0xd794, 0x0528, 0xb8b4, 0x20e0, 0xb8b8, 0x2060, 0x9c80, 0x0000, ++ 0x2098, 0x20a9, 0x0002, 0x4003, 0x9c80, 0x0003, 0x2098, 0x20a9, ++ 0x0001, 0x4005, 0x9c80, 0x0004, 0x2098, 0x3400, 0x20a9, 0x0002, ++ 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x426b, 0x9c80, ++ 0x0026, 0x2098, 0xb8b4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794, ++ 0x0110, 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0x94d3, ++ 0x0118, 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800, ++ 0x0170, 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, ++ 0x0020, 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x45e9, 0x86ff, ++ 0x1120, 0x7120, 0x810b, 0x0804, 0x305f, 0x702f, 0x0001, 0x711e, ++ 0x7020, 0x9600, 0x7022, 0x772a, 0x2061, 0x18ac, 0x2c44, 0xa06b, ++ 0x0000, 0xa67a, 0x7030, 0xa072, 0x7024, 0xa076, 0xa28e, 0xa392, ++ 0xa496, 0xa59a, 0x080c, 0x108c, 0x7007, 0x0002, 0x701b, 0x4689, ++ 0x0005, 0x702c, 0x9005, 0x1180, 0x711c, 0x7024, 0x20a0, 0x7728, ++ 0x9036, 0x7030, 0x20e8, 0x2061, 0x18ac, 0x2c44, 0xa28c, 0xa390, ++ 0xa494, 0xa598, 0x0804, 0x45e9, 0x7120, 0x810b, 0x0804, 0x305f, ++ 0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00, ++ 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04, 0x3092, ++ 0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04, ++ 0x3092, 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3092, ++ 0x9502, 0x0a04, 0x3092, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, ++ 0x3092, 0x9502, 0x0a04, 0x3092, 0x9384, 0xff00, 0x8007, 0x90e2, ++ 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04, 0x3092, 0x9384, 0x00ff, ++ 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04, 0x3092, 0x9484, ++ 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, 0x0a04, ++ 0x3092, 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3092, 0x9502, ++ 0x0a04, 0x3092, 0x2061, 0x1956, 0x6102, 0x6206, 0x630a, 0x640e, ++ 0x0804, 0x305f, 0x0006, 0x080c, 0x4dea, 0xd0cc, 0x000e, 0x0005, ++ 0x0006, 0x080c, 0x4dee, 0xd0bc, 0x000e, 0x0005, 0x616c, 0x7a84, ++ 0x6300, 0x82ff, 0x1118, 0x7986, 0x0804, 0x305f, 0x83ff, 0x1904, ++ 0x3092, 0x2001, 0xfff0, 0x9200, 0x1a04, 0x3092, 0x2019, 0xffff, ++ 0x6070, 0x9302, 0x9200, 0x0a04, 0x3092, 0x7986, 0x626e, 0x0804, ++ 0x305f, 0x080c, 0x4dfe, 0x1904, 0x308f, 0x7c88, 0x7d84, 0x7e98, ++ 0x7f8c, 0x080c, 0x441f, 0x0904, 0x308f, 0x900e, 0x901e, 0x7322, ++ 0x732e, 0xa860, 0x20e8, 0x7032, 0xa85c, 0x9080, 0x0003, 0x7026, ++ 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x5f2d, ++ 0x0118, 0x080c, 0x5f35, 0x1148, 0x20a9, 0x0001, 0xb814, 0x4004, ++ 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, ++ 0x0120, 0x9386, 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, 0x7220, ++ 0x900e, 0x2001, 0x0003, 0x080c, 0x7a4b, 0x2208, 0x0804, 0x305f, ++ 0x702f, 0x0001, 0x711e, 0x7020, 0x9300, 0x7022, 0x2061, 0x18ac, ++ 0x2c44, 0xa06b, 0x0000, 0xa37a, 0x7024, 0xa076, 0x7030, 0xa072, ++ 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x108c, 0x7007, 0x0002, ++ 0x701b, 0x477b, 0x0005, 0x702c, 0x9005, 0x1178, 0x711c, 0x7024, ++ 0x20a0, 0x901e, 0x7030, 0x20e8, 0x2061, 0x18ac, 0x2c44, 0xa48c, ++ 0xa590, 0xa694, 0xa798, 0x0804, 0x4739, 0x7220, 0x900e, 0x2001, ++ 0x0003, 0x080c, 0x7a4b, 0x2208, 0x0804, 0x305f, 0x00f6, 0x00e6, ++ 0x080c, 0x4dfe, 0x2009, 0x0007, 0x1904, 0x480e, 0x2071, 0x1893, ++ 0x7458, 0x84ff, 0x2009, 0x000e, 0x1904, 0x480e, 0xac9c, 0xad98, ++ 0xaea4, 0xafa0, 0x0096, 0x080c, 0x0fc7, 0x2009, 0x0002, 0x0904, ++ 0x480e, 0x2900, 0x705a, 0x900e, 0x901e, 0x7352, 0x735e, 0xa860, ++ 0x7062, 0xa85c, 0x9080, 0x0003, 0x7056, 0x20a0, 0x91d8, 0x1000, ++ 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x5f2d, 0x0118, 0x080c, 0x5f35, ++ 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, ++ 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, ++ 0x01e8, 0x0c20, 0x83ff, 0x11c0, 0x7250, 0x900e, 0x2001, 0x0003, ++ 0x080c, 0x7a4b, 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x7158, ++ 0x81ff, 0x090c, 0x0d84, 0x2148, 0x080c, 0x0fe0, 0x9006, 0x705a, ++ 0x918d, 0x0001, 0x2008, 0x0418, 0x705f, 0x0001, 0x714e, 0x7050, ++ 0x9300, 0x7052, 0x2061, 0x18ad, 0x2c44, 0xa37a, 0x7054, 0xa076, ++ 0x7060, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, 0x481a, ++ 0x000e, 0xa0a2, 0x080c, 0x108c, 0x9006, 0x0048, 0x009e, 0xa897, ++ 0x4005, 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee, ++ 0x00fe, 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0d84, 0x00e6, ++ 0x2071, 0x1893, 0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b, 0x0030, ++ 0xa883, 0x0000, 0xa897, 0x4002, 0x00d8, 0x705c, 0x9005, 0x1158, ++ 0x714c, 0x7054, 0x20a0, 0x901e, 0x7060, 0x20e8, 0xa48c, 0xa590, ++ 0xa694, 0xa798, 0x0428, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, ++ 0x4000, 0x7250, 0x900e, 0x2001, 0x0003, 0x080c, 0x7a4b, 0xaa9a, ++ 0x7158, 0x81ff, 0x090c, 0x0d84, 0x2148, 0x080c, 0x0fe0, 0x705b, ++ 0x0000, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, ++ 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, ++ 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x5f2d, 0x0118, ++ 0x080c, 0x5f35, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, ++ 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, ++ 0x9386, 0x003c, 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7150, 0x810c, ++ 0xa99a, 0xa897, 0x4000, 0x7158, 0x81ff, 0x090c, 0x0d84, 0x2148, ++ 0x080c, 0x0fe0, 0x9006, 0x705a, 0x918d, 0x0001, 0x2008, 0xa0a0, ++ 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0xa09f, ++ 0x0000, 0xa0a3, 0x0000, 0x0070, 0x705f, 0x0001, 0x714e, 0x7050, ++ 0x9300, 0x7052, 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, ++ 0x108c, 0x9006, 0x00ee, 0x0005, 0x81ff, 0x1904, 0x308f, 0x60d8, ++ 0xd0ac, 0x1118, 0xd09c, 0x0904, 0x308f, 0x080c, 0x441f, 0x0904, ++ 0x308f, 0x7984, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, ++ 0x0019, 0xaf60, 0x080c, 0x4468, 0x701b, 0x48c7, 0x0005, 0x0096, ++ 0xa88c, 0x90be, 0x7000, 0x0148, 0x90be, 0x7100, 0x0130, 0x90be, ++ 0x7200, 0x0118, 0x009e, 0x0804, 0x3092, 0xa884, 0xa988, 0x080c, ++ 0x23fd, 0x1500, 0x080c, 0x5bb0, 0x11e8, 0x7122, 0xbe12, 0xbd16, ++ 0xae7c, 0x080c, 0x441f, 0x01b0, 0x080c, 0x441f, 0x0198, 0x009e, ++ 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0xa887, 0x0000, 0xa804, ++ 0x2048, 0x080c, 0xb239, 0x0904, 0x308f, 0x7007, 0x0003, 0x701b, ++ 0x48fd, 0x0005, 0x009e, 0x0804, 0x308f, 0x7120, 0x080c, 0x2e11, ++ 0xa884, 0x9086, 0x8001, 0x0904, 0x308f, 0x2900, 0x701e, 0xa804, ++ 0x2040, 0x0086, 0xa05c, 0x9080, 0x0002, 0x2098, 0x20a0, 0xa060, ++ 0x20e0, 0x20e8, 0x20a9, 0x002a, 0x080c, 0x0f2b, 0xaa6c, 0xab70, ++ 0xac74, 0xad78, 0x2061, 0x18ac, 0x2c44, 0xa06b, 0x0000, 0xae64, ++ 0xaf8c, 0x97c6, 0x7000, 0x1108, 0x0018, 0x97c6, 0x7100, 0x1190, ++ 0x96c2, 0x0004, 0x0a04, 0x3092, 0x2009, 0x0004, 0x009e, 0x8906, ++ 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, ++ 0x0804, 0x446b, 0x97c6, 0x7200, 0x1904, 0x3092, 0x96c2, 0x0054, ++ 0x0a04, 0x3092, 0x009e, 0x2061, 0x18ac, 0x2c44, 0x8906, 0x8006, ++ 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xa076, ++ 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, ++ 0x108c, 0x7007, 0x0002, 0x701b, 0x495e, 0x0005, 0x701c, 0x2048, ++ 0xa804, 0x2048, 0xa804, 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, ++ 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2098, 0x20a0, 0x27e0, ++ 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0f2b, 0x2100, 0x2238, 0x2061, ++ 0x18ac, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x2009, 0x002a, ++ 0x0804, 0x446b, 0x81ff, 0x1904, 0x308f, 0x798c, 0x2001, 0x194d, ++ 0x2102, 0x080c, 0x4436, 0x0904, 0x3092, 0x080c, 0x5cd4, 0x0904, ++ 0x308f, 0x0126, 0x2091, 0x8000, 0x080c, 0x5d9a, 0x012e, 0x0904, ++ 0x308f, 0x0804, 0x3fc8, 0xa9a0, 0x2001, 0x194d, 0xc18d, 0x2102, ++ 0x080c, 0x4443, 0x0170, 0x080c, 0x5cd4, 0x2009, 0x0002, 0x0128, ++ 0x080c, 0x5d9a, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, ++ 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, ++ 0x0005, 0xa897, 0x4000, 0x080c, 0x4df2, 0x0110, 0x9006, 0x0018, ++ 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, ++ 0x1118, 0xd084, 0x0904, 0x3f3d, 0x080c, 0x4452, 0x0904, 0x3092, ++ 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, 0x308f, 0x080c, ++ 0x5f2d, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, ++ 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, ++ 0x4dea, 0xd0b4, 0x0904, 0x3f77, 0x7884, 0x908e, 0x007e, 0x0904, ++ 0x3f77, 0x908e, 0x007f, 0x0904, 0x3f77, 0x908e, 0x0080, 0x0904, ++ 0x3f77, 0xb800, 0xd08c, 0x1904, 0x3f77, 0xa867, 0x0000, 0xa868, ++ 0xc0fd, 0xa86a, 0x080c, 0xb258, 0x1120, 0x2009, 0x0003, 0x0804, ++ 0x308f, 0x7007, 0x0003, 0x701b, 0x4a0e, 0x0005, 0x080c, 0x4452, ++ 0x0904, 0x3092, 0x0804, 0x3f77, 0x080c, 0x2e64, 0x0108, 0x0005, ++ 0x2009, 0x1833, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, ++ 0x308f, 0x080c, 0x4dfe, 0x0120, 0x2009, 0x0007, 0x0804, 0x308f, ++ 0x080c, 0x5f25, 0x0120, 0x2009, 0x0008, 0x0804, 0x308f, 0xb89c, ++ 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x3f77, 0x9006, 0xa866, 0xa832, ++ 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb2a8, 0x1120, 0x2009, 0x0003, ++ 0x0804, 0x308f, 0x7007, 0x0003, 0x701b, 0x4a47, 0x0005, 0xa830, ++ 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x4d49, 0x080c, ++ 0x4452, 0x0904, 0x3092, 0x0804, 0x49e0, 0x81ff, 0x2009, 0x0001, ++ 0x1904, 0x308f, 0x080c, 0x4dfe, 0x2009, 0x0007, 0x1904, 0x308f, ++ 0x080c, 0x5f25, 0x2009, 0x0008, 0x1904, 0x308f, 0x080c, 0x4452, ++ 0x0904, 0x3092, 0x080c, 0x5f2d, 0x2009, 0x0009, 0x1904, 0x308f, ++ 0x080c, 0x441f, 0x2009, 0x0002, 0x0904, 0x308f, 0x9006, 0xa866, ++ 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, 0xff00, 0x918c, ++ 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, 0xa956, ++ 0x0038, 0x928e, 0x0100, 0x1904, 0x3092, 0xc0e5, 0xa952, 0xa956, ++ 0xa83e, 0x080c, 0xb4e7, 0x2009, 0x0003, 0x0904, 0x308f, 0x7007, ++ 0x0003, 0x701b, 0x4a9c, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, ++ 0x0004, 0x0904, 0x308f, 0x0804, 0x305f, 0x7aa8, 0x9284, 0xc000, ++ 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x4dfe, 0x1188, 0x2009, 0x0014, ++ 0x0804, 0x308f, 0xd2dc, 0x1568, 0x81ff, 0x2009, 0x0001, 0x1904, ++ 0x308f, 0x080c, 0x4dfe, 0x2009, 0x0007, 0x1904, 0x308f, 0xd2f4, ++ 0x0130, 0x9284, 0x5000, 0x080c, 0x4dc5, 0x0804, 0x305f, 0xd2fc, ++ 0x0158, 0x080c, 0x4452, 0x0904, 0x3092, 0x7984, 0x9284, 0x9000, ++ 0x080c, 0x4da2, 0x0804, 0x305f, 0x080c, 0x4452, 0x0904, 0x3092, ++ 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, 0x1904, ++ 0x4b85, 0x080c, 0x441f, 0x2009, 0x0002, 0x0904, 0x4b85, 0xa85c, ++ 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88, 0x7c9c, ++ 0x7d98, 0x080c, 0x4468, 0x701b, 0x4af6, 0x0005, 0xa86c, 0x9086, ++ 0x0500, 0x1138, 0xa870, 0x9005, 0x1120, 0xa874, 0x9084, 0xff00, ++ 0x0110, 0x1904, 0x3092, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, ++ 0x080c, 0x4452, 0x1110, 0x0804, 0x3092, 0x2009, 0x0043, 0x080c, ++ 0xb54f, 0x2009, 0x0003, 0x0904, 0x4b85, 0x7007, 0x0003, 0x701b, ++ 0x4b1a, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, ++ 0x4b85, 0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c, 0x4da2, 0x0804, ++ 0x305f, 0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140, 0xd2ec, 0x0168, ++ 0x080c, 0x4dfe, 0x1150, 0x2009, 0x0014, 0x04f0, 0x2061, 0x1800, ++ 0x080c, 0x4dfe, 0x2009, 0x0007, 0x15b8, 0xd2f4, 0x0128, 0x9284, ++ 0x5000, 0x080c, 0x4dc5, 0x0050, 0xd2fc, 0x0178, 0x080c, 0x4450, ++ 0x0588, 0xa998, 0x9284, 0x9000, 0x080c, 0x4da2, 0xa87b, 0x0000, ++ 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x4450, 0x0510, ++ 0x080c, 0x5f2d, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500, ++ 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190, ++ 0x080c, 0x4450, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xb54f, ++ 0x2009, 0x0003, 0x0108, 0x0078, 0x0429, 0x19c0, 0xa897, 0x4005, ++ 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, ++ 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904, ++ 0x308f, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x4da2, ++ 0x001e, 0x1904, 0x308f, 0x0804, 0x305f, 0x00f6, 0x2d78, 0x0011, ++ 0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016, 0xa998, 0x9284, ++ 0x1000, 0xc0fd, 0x080c, 0x4da2, 0x001e, 0x9085, 0x0001, 0x0005, ++ 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x308f, 0x080c, 0x4dfe, ++ 0x0120, 0x2009, 0x0007, 0x0804, 0x308f, 0x7984, 0x7ea8, 0x96b4, ++ 0x00ff, 0x080c, 0x5c0d, 0x1904, 0x3092, 0x9186, 0x007f, 0x0138, ++ 0x080c, 0x5f2d, 0x0120, 0x2009, 0x0009, 0x0804, 0x308f, 0x080c, ++ 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, 0x308f, 0xa867, 0x0000, ++ 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, 0x080c, ++ 0xb272, 0x1120, 0x2009, 0x0003, 0x0804, 0x308f, 0x7007, 0x0003, ++ 0x701b, 0x4be3, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, 0x1120, ++ 0x2009, 0x0004, 0x0804, 0x308f, 0xa8e0, 0xa866, 0xa810, 0x8007, ++ 0x9084, 0x00ff, 0x800c, 0xa814, 0x8007, 0x9084, 0x00ff, 0x8004, ++ 0x9080, 0x0002, 0x9108, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, ++ 0x9084, 0xffc0, 0x9080, 0x0004, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, ++ 0x0804, 0x446b, 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, ++ 0x308f, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, ++ 0x1118, 0x701f, 0x1980, 0x0040, 0x92c6, 0x0001, 0x1118, 0x701f, ++ 0x199a, 0x0010, 0x0804, 0x3092, 0x2009, 0x001a, 0x7a8c, 0x7b88, ++ 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4468, ++ 0x701b, 0x4c33, 0x0005, 0x2001, 0x182c, 0x2003, 0x0001, 0xa85c, ++ 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, 0x701c, ++ 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x305f, 0x080c, 0x441f, ++ 0x1120, 0x2009, 0x0002, 0x0804, 0x308f, 0x7984, 0x9194, 0xff00, ++ 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x1980, 0x0040, ++ 0x92c6, 0x0001, 0x1118, 0x2099, 0x199a, 0x0010, 0x0804, 0x3092, ++ 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, 0x001a, ++ 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, ++ 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x446b, 0x7884, ++ 0x908a, 0x1000, 0x1a04, 0x3092, 0x0126, 0x2091, 0x8000, 0x8003, ++ 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x19c7, 0x6146, 0x00ce, ++ 0x012e, 0x0804, 0x305f, 0x00c6, 0x080c, 0x6877, 0x1160, 0x080c, ++ 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, 0x080c, 0x68c0, 0x080c, ++ 0x67be, 0x080c, 0x0d84, 0x2061, 0x1800, 0x6030, 0xc09d, 0x6032, ++ 0x080c, 0x55a0, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, 0x2004, ++ 0x908e, 0x0000, 0x0904, 0x308f, 0x7884, 0x9005, 0x0188, 0x7888, ++ 0x2061, 0x1969, 0x2c0c, 0x2062, 0x080c, 0x27d7, 0x01a0, 0x080c, ++ 0x27df, 0x0188, 0x080c, 0x27e7, 0x0170, 0x2162, 0x0804, 0x3092, ++ 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, 0x0001, ++ 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x1548, 0x2061, ++ 0x0100, 0x6028, 0xc09c, 0x602a, 0x0026, 0x2011, 0x0003, 0x080c, ++ 0x8e99, 0x2011, 0x0002, 0x080c, 0x8ea3, 0x002e, 0x080c, 0x8d59, ++ 0x0036, 0x901e, 0x080c, 0x8dfe, 0x003e, 0x60e3, 0x0000, 0x080c, ++ 0xcd0a, 0x080c, 0xcd25, 0x9085, 0x0001, 0x080c, 0x68c0, 0x9006, ++ 0x080c, 0x28a5, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, 0x0008, ++ 0x00ce, 0x0804, 0x305f, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, ++ 0x308f, 0x080c, 0x4dfe, 0x0120, 0x2009, 0x0007, 0x0804, 0x308f, ++ 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x5c0d, 0x1904, 0x3092, ++ 0x9186, 0x007f, 0x0138, 0x080c, 0x5f2d, 0x0120, 0x2009, 0x0009, ++ 0x0804, 0x308f, 0x080c, 0x441f, 0x1120, 0x2009, 0x0002, 0x0804, ++ 0x308f, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb275, ++ 0x1120, 0x2009, 0x0003, 0x0804, 0x308f, 0x7007, 0x0003, 0x701b, ++ 0x4d32, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, ++ 0x0804, 0x308f, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c, ++ 0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, ++ 0x446b, 0xa898, 0x9086, 0x000d, 0x1904, 0x308f, 0x2021, 0x4005, ++ 0x0126, 0x2091, 0x8000, 0x0e04, 0x4d56, 0x0010, 0x012e, 0x0cc0, ++ 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, ++ 0x0010, 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8, ++ 0x799e, 0x080c, 0x445b, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, ++ 0xd084, 0x190c, 0x113e, 0x7007, 0x0001, 0x2091, 0x5000, 0x012e, ++ 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0x19c7, 0x7984, ++ 0x6156, 0x6152, 0x605b, 0x0000, 0x604f, 0x0009, 0x7898, 0x606e, ++ 0x789c, 0x606a, 0x7888, 0x6066, 0x788c, 0x6062, 0x2001, 0x19d5, ++ 0x2044, 0x2001, 0x19dd, 0xa076, 0xa060, 0xa072, 0xa07b, 0x0001, ++ 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, 0x00ce, 0x012e, ++ 0x0804, 0x305f, 0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4, ++ 0xc000, 0x0128, 0x0006, 0x080c, 0xb0e3, 0x000e, 0x1198, 0xd0e4, ++ 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160, 0x080c, 0x56f3, ++ 0x080c, 0x94d3, 0x0110, 0xb817, 0x0000, 0x9006, 0x00ce, 0x00be, ++ 0x012e, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x0126, 0x2091, 0x8000, ++ 0x0156, 0x2010, 0x900e, 0x20a9, 0x0800, 0x0016, 0x9180, 0x1000, ++ 0x2004, 0x9005, 0x0180, 0x9186, 0x007e, 0x0168, 0x9186, 0x007f, ++ 0x0150, 0x9186, 0x0080, 0x0138, 0x9186, 0x00ff, 0x0120, 0x0026, ++ 0x2200, 0x0801, 0x002e, 0x001e, 0x8108, 0x1f04, 0x4dcd, 0x015e, ++ 0x012e, 0x0005, 0x2001, 0x1853, 0x2004, 0x0005, 0x2001, 0x1872, ++ 0x2004, 0x0005, 0x0006, 0x2001, 0x180f, 0x2004, 0xd0d4, 0x000e, ++ 0x0005, 0x2001, 0x180d, 0x2004, 0xd0b4, 0x0005, 0x2001, 0x1800, ++ 0x2004, 0x9086, 0x0003, 0x0005, 0x0126, 0x0156, 0x0136, 0x0146, ++ 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, ++ 0x2069, 0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084, ++ 0x0118, 0x080c, 0x4fa3, 0x0068, 0xd08c, 0x0118, 0x080c, 0x4eb6, ++ 0x0040, 0xd094, 0x0118, 0x080c, 0x4e86, 0x0018, 0xd09c, 0x0108, ++ 0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, ++ 0x013e, 0x015e, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, ++ 0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006, 0x7090, 0x9005, 0x000e, ++ 0x0120, 0x7093, 0x0000, 0x708b, 0x0000, 0x624c, 0x9286, 0xf0f0, ++ 0x1150, 0x6048, 0x9086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090, ++ 0x6043, 0x0010, 0x0490, 0x9294, 0xff00, 0x9296, 0xf700, 0x0178, ++ 0x7134, 0xd1a4, 0x1160, 0x6240, 0x9295, 0x0100, 0x6242, 0x9294, ++ 0x0010, 0x0128, 0x2009, 0x00f7, 0x080c, 0x5660, 0x00f0, 0x6040, ++ 0x9084, 0x0010, 0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x707f, ++ 0x0000, 0x709b, 0x0001, 0x70c3, 0x0000, 0x70db, 0x0000, 0x2009, ++ 0x1c80, 0x200b, 0x0000, 0x708f, 0x0000, 0x7083, 0x000f, 0x2009, ++ 0x000f, 0x2011, 0x5546, 0x080c, 0x78a5, 0x0005, 0x2001, 0x1874, ++ 0x2004, 0xd08c, 0x0110, 0x7057, 0xffff, 0x7080, 0x9005, 0x1528, ++ 0x2011, 0x5546, 0x080c, 0x781a, 0x6040, 0x9094, 0x0010, 0x9285, ++ 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, ++ 0x4e9c, 0x6242, 0x7093, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285, ++ 0x0080, 0x6042, 0x6242, 0x0048, 0x6242, 0x7093, 0x0000, 0x7087, ++ 0x0000, 0x9006, 0x080c, 0x56de, 0x0000, 0x0005, 0x7084, 0x908a, ++ 0x0003, 0x1a0c, 0x0d84, 0x000b, 0x0005, 0x4ec0, 0x4f07, 0x4fa2, ++ 0x00f6, 0x7087, 0x0001, 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800, ++ 0x9084, 0x00fc, 0x0120, 0x1f04, 0x4ec7, 0x080c, 0x0d84, 0x68a0, ++ 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, 0xa001, 0x6803, 0x1600, ++ 0x6837, 0x0020, 0x080c, 0x56ba, 0x2079, 0x1c00, 0x7833, 0x1101, ++ 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0001, ++ 0x20a1, 0x1c0e, 0x20a9, 0x0004, 0x4003, 0x080c, 0x9363, 0x20e1, ++ 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, ++ 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, 0x557c, ++ 0x00fe, 0x9006, 0x708a, 0x6043, 0x0008, 0x6042, 0x0005, 0x00f6, ++ 0x7088, 0x708b, 0x0000, 0x9025, 0x0904, 0x4f7f, 0x6020, 0xd0b4, ++ 0x1904, 0x4f7d, 0x7198, 0x81ff, 0x0904, 0x4f6b, 0x9486, 0x000c, ++ 0x1904, 0x4f78, 0x9480, 0x0018, 0x8004, 0x20a8, 0x080c, 0x56b3, ++ 0x2011, 0x0260, 0x2019, 0x1c00, 0x220c, 0x2304, 0x9106, 0x11e8, ++ 0x8210, 0x8318, 0x1f04, 0x4f24, 0x6043, 0x0004, 0x2061, 0x0140, ++ 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006, ++ 0x7087, 0x0002, 0x7093, 0x0002, 0x2009, 0x07d0, 0x2011, 0x554d, ++ 0x080c, 0x78a5, 0x080c, 0x56ba, 0x04c0, 0x080c, 0x56b3, 0x2079, ++ 0x0260, 0x7930, 0x918e, 0x1101, 0x1558, 0x7834, 0x9005, 0x1540, ++ 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005, 0x0190, 0x080c, ++ 0x56b3, 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9, 0x0004, 0x220c, ++ 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318, 0x1f04, 0x4f5f, ++ 0x0078, 0x709b, 0x0000, 0x080c, 0x56b3, 0x20e1, 0x0000, 0x2099, ++ 0x0260, 0x20e9, 0x0001, 0x20a1, 0x1c00, 0x20a9, 0x0014, 0x4003, ++ 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00fe, 0x0005, 0x6040, ++ 0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x080c, 0x9363, ++ 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, ++ 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011, 0x19be, 0x2013, ++ 0x0000, 0x708b, 0x0000, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, ++ 0x8b47, 0x08d8, 0x0005, 0x7090, 0x908a, 0x001d, 0x1a0c, 0x0d84, ++ 0x000b, 0x0005, 0x4fd4, 0x4fe7, 0x5010, 0x5030, 0x5056, 0x5085, ++ 0x50ab, 0x50e3, 0x5109, 0x5137, 0x5172, 0x51aa, 0x51c8, 0x51f3, ++ 0x5215, 0x5230, 0x523a, 0x526e, 0x5294, 0x52c3, 0x52e9, 0x5321, ++ 0x5365, 0x53a2, 0x53c3, 0x541c, 0x543e, 0x546c, 0x546c, 0x00c6, ++ 0x2061, 0x1800, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0x9084, ++ 0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061, 0x0140, 0x605b, 0xbc94, ++ 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0002, 0x7093, 0x0001, ++ 0x2009, 0x07d0, 0x2011, 0x554d, 0x080c, 0x78a5, 0x0005, 0x00f6, ++ 0x7088, 0x9086, 0x0014, 0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0, ++ 0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0, ++ 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, ++ 0x1110, 0x70c3, 0x0001, 0x2011, 0x554d, 0x080c, 0x781a, 0x7093, ++ 0x0010, 0x080c, 0x523a, 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, ++ 0x00f6, 0x7093, 0x0003, 0x6043, 0x0004, 0x2011, 0x554d, 0x080c, ++ 0x781a, 0x080c, 0x5642, 0x2079, 0x0240, 0x7833, 0x1102, 0x7837, ++ 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b, 0x0000, 0x8108, ++ 0x1f04, 0x5025, 0x60c3, 0x0014, 0x080c, 0x557c, 0x00fe, 0x0005, ++ 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, 0x554d, 0x080c, 0x781a, ++ 0x9086, 0x0014, 0x11b8, 0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30, ++ 0x9296, 0x1102, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, ++ 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0004, ++ 0x0029, 0x0010, 0x080c, 0x568f, 0x00fe, 0x0005, 0x00f6, 0x7093, ++ 0x0005, 0x080c, 0x5642, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, ++ 0x0000, 0x080c, 0x56b3, 0x080c, 0x5696, 0x1170, 0x707c, 0x9005, ++ 0x1158, 0x7154, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, ++ 0x54fa, 0x0168, 0x080c, 0x5677, 0x20a9, 0x0008, 0x20e1, 0x0000, ++ 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, ++ 0x0014, 0x080c, 0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, ++ 0x0500, 0x2011, 0x554d, 0x080c, 0x781a, 0x9086, 0x0014, 0x11b8, ++ 0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, ++ 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, ++ 0x1110, 0x70c3, 0x0001, 0x7093, 0x0006, 0x0029, 0x0010, 0x080c, ++ 0x568f, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0007, 0x080c, 0x5642, ++ 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x56b3, ++ 0x080c, 0x5696, 0x11b8, 0x707c, 0x9005, 0x11a0, 0x715c, 0x9186, ++ 0xffff, 0x0180, 0x9180, 0x2e6e, 0x200d, 0x918c, 0xff00, 0x810f, ++ 0x2011, 0x0008, 0x080c, 0x54fa, 0x0180, 0x080c, 0x4700, 0x0110, ++ 0x080c, 0x2466, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, ++ 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, ++ 0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, ++ 0x554d, 0x080c, 0x781a, 0x9086, 0x0014, 0x11b8, 0x080c, 0x56b3, ++ 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, ++ 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, ++ 0x0001, 0x7093, 0x0008, 0x0029, 0x0010, 0x080c, 0x568f, 0x00fe, ++ 0x0005, 0x00f6, 0x7093, 0x0009, 0x080c, 0x5642, 0x2079, 0x0240, ++ 0x7833, 0x1105, 0x7837, 0x0100, 0x080c, 0x5696, 0x1150, 0x707c, ++ 0x9005, 0x1138, 0x080c, 0x546d, 0x1188, 0x9085, 0x0001, 0x080c, ++ 0x2466, 0x20a9, 0x0008, 0x080c, 0x56b3, 0x20e1, 0x0000, 0x2099, ++ 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, ++ 0x080c, 0x557c, 0x0010, 0x080c, 0x4fc7, 0x00fe, 0x0005, 0x00f6, ++ 0x7088, 0x9005, 0x05a8, 0x2011, 0x554d, 0x080c, 0x781a, 0x9086, ++ 0x0014, 0x1560, 0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296, ++ 0x1105, 0x1520, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, ++ 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, ++ 0x0001, 0x7093, 0x000a, 0x00b1, 0x0098, 0x9005, 0x1178, 0x7a38, ++ 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x708f, ++ 0x0000, 0x7093, 0x000e, 0x080c, 0x5215, 0x0010, 0x080c, 0x568f, ++ 0x00fe, 0x0005, 0x00f6, 0x7093, 0x000b, 0x2011, 0x1c0e, 0x20e9, ++ 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304, 0x080c, ++ 0x5642, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, ++ 0x5696, 0x0118, 0x2013, 0x0000, 0x0020, 0x7058, 0x9085, 0x0100, ++ 0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, 0x1c0e, 0x220e, ++ 0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, ++ 0x2009, 0x0240, 0x1f04, 0x5197, 0x60c3, 0x0084, 0x080c, 0x557c, ++ 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01c0, 0x2011, 0x554d, ++ 0x080c, 0x781a, 0x9086, 0x0084, 0x1178, 0x080c, 0x56b3, 0x2079, ++ 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005, 0x1120, ++ 0x7093, 0x000c, 0x0029, 0x0010, 0x080c, 0x568f, 0x00fe, 0x0005, ++ 0x00f6, 0x7093, 0x000d, 0x080c, 0x5642, 0x2079, 0x0240, 0x7833, ++ 0x1107, 0x7837, 0x0000, 0x080c, 0x56b3, 0x20a9, 0x0040, 0x2011, ++ 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, ++ 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, ++ 0x6816, 0x2011, 0x0260, 0x1f04, 0x51db, 0x60c3, 0x0084, 0x080c, ++ 0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01e0, 0x2011, ++ 0x554d, 0x080c, 0x781a, 0x9086, 0x0084, 0x1198, 0x080c, 0x56b3, ++ 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, ++ 0x1140, 0x708f, 0x0001, 0x080c, 0x5614, 0x7093, 0x000e, 0x0029, ++ 0x0010, 0x080c, 0x568f, 0x00fe, 0x0005, 0x918d, 0x0001, 0x080c, ++ 0x56de, 0x7093, 0x000f, 0x708b, 0x0000, 0x2061, 0x0140, 0x605b, ++ 0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043, 0x0005, 0x6043, ++ 0x0004, 0x2009, 0x07d0, 0x2011, 0x554d, 0x080c, 0x780e, 0x0005, ++ 0x7088, 0x9005, 0x0130, 0x2011, 0x554d, 0x080c, 0x781a, 0x7093, ++ 0x0000, 0x0005, 0x7093, 0x0011, 0x080c, 0x9363, 0x080c, 0x56b3, ++ 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, ++ 0x7488, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, ++ 0x20a8, 0x4003, 0x080c, 0x5696, 0x11a0, 0x7174, 0x81ff, 0x0188, ++ 0x900e, 0x7078, 0x9084, 0x00ff, 0x0160, 0x080c, 0x23fd, 0x9186, ++ 0x007e, 0x0138, 0x9186, 0x0080, 0x0120, 0x2011, 0x0008, 0x080c, ++ 0x54fa, 0x60c3, 0x0014, 0x080c, 0x557c, 0x0005, 0x00f6, 0x7088, ++ 0x9005, 0x0500, 0x2011, 0x554d, 0x080c, 0x781a, 0x9086, 0x0014, ++ 0x11b8, 0x080c, 0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, ++ 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, ++ 0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0012, 0x0029, 0x0010, ++ 0x708b, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0013, 0x080c, ++ 0x5650, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, ++ 0x56b3, 0x080c, 0x5696, 0x1170, 0x707c, 0x9005, 0x1158, 0x7154, ++ 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x54fa, 0x0168, ++ 0x080c, 0x5677, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, ++ 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, ++ 0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, ++ 0x554d, 0x080c, 0x781a, 0x9086, 0x0014, 0x11b8, 0x080c, 0x56b3, ++ 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, ++ 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, ++ 0x0001, 0x7093, 0x0014, 0x0029, 0x0010, 0x708b, 0x0000, 0x00fe, ++ 0x0005, 0x00f6, 0x7093, 0x0015, 0x080c, 0x5650, 0x2079, 0x0240, ++ 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x56b3, 0x080c, 0x5696, ++ 0x11b8, 0x707c, 0x9005, 0x11a0, 0x715c, 0x9186, 0xffff, 0x0180, ++ 0x9180, 0x2e6e, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, ++ 0x080c, 0x54fa, 0x0180, 0x080c, 0x4700, 0x0110, 0x080c, 0x2466, ++ 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, ++ 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x557c, 0x00fe, ++ 0x0005, 0x00f6, 0x7088, 0x9005, 0x05f0, 0x2011, 0x554d, 0x080c, ++ 0x781a, 0x9086, 0x0014, 0x15a8, 0x080c, 0x56b3, 0x2079, 0x0260, ++ 0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, 0x9084, 0x0100, 0x2011, ++ 0x0100, 0x921e, 0x1168, 0x9085, 0x0001, 0x080c, 0x56de, 0x7a38, ++ 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x0080, ++ 0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, ++ 0x70c3, 0x0001, 0x9085, 0x0001, 0x080c, 0x56de, 0x708f, 0x0000, ++ 0x7a38, 0xd2f4, 0x0110, 0x70db, 0x0008, 0x7093, 0x0016, 0x0029, ++ 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, 0x080c, 0x9363, 0x080c, ++ 0x56b3, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, ++ 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d, 0x2204, 0x9084, ++ 0x0100, 0x2011, 0x024d, 0x2012, 0x2011, 0x026e, 0x7093, 0x0017, ++ 0x080c, 0x5696, 0x1150, 0x707c, 0x9005, 0x1138, 0x080c, 0x546d, ++ 0x1188, 0x9085, 0x0001, 0x080c, 0x2466, 0x20a9, 0x0008, 0x080c, ++ 0x56b3, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, ++ 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x557c, 0x0010, 0x080c, ++ 0x4fc7, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01d8, 0x2011, 0x554d, ++ 0x080c, 0x781a, 0x9086, 0x0084, 0x1190, 0x080c, 0x56b3, 0x2079, ++ 0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834, 0x9005, 0x1138, ++ 0x9006, 0x080c, 0x56de, 0x7093, 0x0018, 0x0029, 0x0010, 0x708b, ++ 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0019, 0x080c, 0x5650, ++ 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x56b3, ++ 0x2009, 0x026e, 0x2039, 0x1c0e, 0x20a9, 0x0040, 0x213e, 0x8738, ++ 0x8108, 0x9186, 0x0280, 0x1128, 0x6814, 0x8000, 0x6816, 0x2009, ++ 0x0260, 0x1f04, 0x53d6, 0x2039, 0x1c0e, 0x080c, 0x5696, 0x11e8, ++ 0x2728, 0x2514, 0x8207, 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294, ++ 0x00ff, 0x8007, 0x9205, 0x202a, 0x7058, 0x2310, 0x8214, 0x92a0, ++ 0x1c0e, 0x2414, 0x938c, 0x0001, 0x0118, 0x9294, 0xff00, 0x0018, ++ 0x9294, 0x00ff, 0x8007, 0x9215, 0x2222, 0x20a9, 0x0040, 0x2009, ++ 0x024e, 0x270e, 0x8738, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, ++ 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x5409, 0x60c3, 0x0084, ++ 0x080c, 0x557c, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01e0, ++ 0x2011, 0x554d, 0x080c, 0x781a, 0x9086, 0x0084, 0x1198, 0x080c, ++ 0x56b3, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, ++ 0x9005, 0x1140, 0x708f, 0x0001, 0x080c, 0x5614, 0x7093, 0x001a, ++ 0x0029, 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, 0x9085, 0x0001, ++ 0x080c, 0x56de, 0x7093, 0x001b, 0x080c, 0x9363, 0x080c, 0x56b3, ++ 0x2011, 0x0260, 0x2009, 0x0240, 0x7488, 0x9480, 0x0018, 0x9080, ++ 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x220e, 0x8210, 0x8108, ++ 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, ++ 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5455, 0x60c3, ++ 0x0084, 0x080c, 0x557c, 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, ++ 0x1853, 0x252c, 0x20a9, 0x0008, 0x2041, 0x1c0e, 0x20e9, 0x0001, ++ 0x28a0, 0x080c, 0x56b3, 0x20e1, 0x0000, 0x2099, 0x026e, 0x4003, ++ 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800, ++ 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, ++ 0x0008, 0x8211, 0x1f04, 0x5487, 0x0804, 0x54f6, 0x82ff, 0x1160, ++ 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff, ++ 0x0904, 0x54f6, 0x918d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, ++ 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, ++ 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, ++ 0x1f04, 0x54ad, 0x04d8, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, ++ 0x1f04, 0x54bf, 0x2328, 0x8529, 0x92be, 0x0007, 0x0158, 0x0006, ++ 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010, ++ 0x1f04, 0x54ce, 0x7556, 0x95c8, 0x2e6e, 0x292d, 0x95ac, 0x00ff, ++ 0x757a, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2446, 0x001e, ++ 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405, 0x201a, 0x707f, ++ 0x0001, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20e1, 0x0001, 0x2898, ++ 0x20a9, 0x0008, 0x4003, 0x9085, 0x0001, 0x0008, 0x9006, 0x009e, ++ 0x008e, 0x0005, 0x0156, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x22a8, ++ 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x2011, 0x024e, ++ 0x22a0, 0x4003, 0x014e, 0x013e, 0x01de, 0x01ce, 0x015e, 0x2118, ++ 0x9026, 0x2001, 0x0007, 0x939a, 0x0010, 0x0218, 0x8420, 0x8001, ++ 0x0cd0, 0x2118, 0x84ff, 0x0120, 0x939a, 0x0010, 0x8421, 0x1de0, ++ 0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319, 0x1de8, 0x9238, ++ 0x2029, 0x026e, 0x9528, 0x2504, 0x942c, 0x11b8, 0x9405, 0x203a, ++ 0x7156, 0x91a0, 0x2e6e, 0x242d, 0x95ac, 0x00ff, 0x757a, 0x6532, ++ 0x6536, 0x0016, 0x2508, 0x080c, 0x2446, 0x001e, 0x60e7, 0x0000, ++ 0x65ea, 0x707f, 0x0001, 0x9084, 0x0000, 0x0005, 0x00e6, 0x2071, ++ 0x1800, 0x7083, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, ++ 0x0100, 0x2071, 0x0140, 0x080c, 0x5603, 0x080c, 0x8b50, 0x7004, ++ 0x9084, 0x4000, 0x0138, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, ++ 0x080c, 0x28a5, 0x0126, 0x2091, 0x8000, 0x2071, 0x1824, 0x2073, ++ 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x5660, ++ 0x001e, 0x9094, 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, ++ 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x2011, ++ 0x19be, 0x2013, 0x0000, 0x708b, 0x0000, 0x012e, 0x60a3, 0x0056, ++ 0x60a7, 0x9575, 0x080c, 0x8b47, 0x6144, 0xd184, 0x0120, 0x7190, ++ 0x918d, 0x2000, 0x0018, 0x7184, 0x918d, 0x1000, 0x2011, 0x1966, ++ 0x2112, 0x2009, 0x07d0, 0x2011, 0x554d, 0x080c, 0x78a5, 0x0005, ++ 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x94da, ++ 0x2009, 0x00f7, 0x080c, 0x5660, 0x2061, 0x19c7, 0x900e, 0x611a, ++ 0x611e, 0x2061, 0x1800, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, ++ 0x0090, 0x6043, 0x0010, 0x2009, 0x1966, 0x200b, 0x0000, 0x2009, ++ 0x002d, 0x2011, 0x55ca, 0x080c, 0x780e, 0x012e, 0x00ce, 0x002e, ++ 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x0499, ++ 0x2071, 0x0100, 0x080c, 0x8b50, 0x2071, 0x0140, 0x7004, 0x9084, ++ 0x4000, 0x0138, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, ++ 0x28a5, 0x080c, 0x687f, 0x0188, 0x080c, 0x689a, 0x1170, 0x080c, ++ 0x6b4a, 0x0016, 0x080c, 0x2515, 0x2001, 0x193c, 0x2102, 0x001e, ++ 0x080c, 0x6b45, 0x080c, 0x67be, 0x0050, 0x2009, 0x0001, 0x080c, ++ 0x27f5, 0x2001, 0x0001, 0x080c, 0x23a6, 0x080c, 0x55a0, 0x012e, ++ 0x000e, 0x00ee, 0x0005, 0x2001, 0x180d, 0x2004, 0xd0bc, 0x0158, ++ 0x0026, 0x0036, 0x2011, 0x8017, 0x2001, 0x1966, 0x201c, 0x080c, ++ 0x447f, 0x003e, 0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, ++ 0x20a1, 0x1c80, 0x080c, 0x56b3, 0x20e9, 0x0000, 0x2099, 0x026e, ++ 0x0099, 0x20a9, 0x0020, 0x080c, 0x56ad, 0x2099, 0x0260, 0x20a1, ++ 0x1c92, 0x0051, 0x20a9, 0x000e, 0x080c, 0x56b0, 0x2099, 0x0260, ++ 0x20a1, 0x1cb2, 0x0009, 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, ++ 0x2104, 0x8007, 0x2012, 0x8108, 0x8210, 0x1f04, 0x5638, 0x002e, ++ 0x001e, 0x0005, 0x080c, 0x9363, 0x20e1, 0x0001, 0x2099, 0x1c00, ++ 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, ++ 0x080c, 0x9363, 0x080c, 0x56b3, 0x20e1, 0x0000, 0x2099, 0x0260, ++ 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, ++ 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0x1833, 0x2004, ++ 0x9005, 0x1138, 0x2001, 0x1816, 0x2004, 0x9084, 0x00ff, 0x9105, ++ 0x0010, 0x9185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, ++ 0x0046, 0x080c, 0x5f29, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, ++ 0x080c, 0xc9c5, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, ++ 0x002a, 0x900e, 0x080c, 0x2ce5, 0x004e, 0x001e, 0x0005, 0x080c, ++ 0x55a0, 0x7093, 0x0000, 0x708b, 0x0000, 0x0005, 0x0006, 0x2001, ++ 0x180c, 0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006, 0x0016, ++ 0x0126, 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0x918d, 0x0006, ++ 0x2102, 0x012e, 0x001e, 0x000e, 0x0005, 0x2009, 0x0001, 0x0020, ++ 0x2009, 0x0002, 0x0008, 0x900e, 0x6814, 0x9084, 0xffc0, 0x910d, ++ 0x6916, 0x0005, 0x00f6, 0x0156, 0x0146, 0x01d6, 0x9006, 0x20a9, ++ 0x0080, 0x20e9, 0x0001, 0x20a1, 0x1c00, 0x4004, 0x2079, 0x1c00, ++ 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef, 0x7813, 0x0138, ++ 0x7823, 0xffff, 0x7827, 0xffff, 0x01de, 0x014e, 0x015e, 0x00fe, ++ 0x0005, 0x2001, 0x1800, 0x2003, 0x0001, 0x0005, 0x2001, 0x1973, ++ 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, 0x0156, ++ 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, ++ 0x56ed, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, ++ 0x2069, 0x1852, 0x9006, 0xb802, 0xb8be, 0xb807, 0x0707, 0xb80a, ++ 0xb80e, 0xb812, 0x9198, 0x2e6e, 0x231d, 0x939c, 0x00ff, 0xbb16, ++ 0x0016, 0x0026, 0xb8b2, 0x080c, 0x94d3, 0x1120, 0x9192, 0x007e, ++ 0x1208, 0xbbb2, 0x20a9, 0x0004, 0xb8b4, 0x20e8, 0xb9b8, 0x9198, ++ 0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9198, 0x000a, ++ 0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, 0xb842, 0xb84e, 0xb852, ++ 0xb856, 0xb85a, 0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f, 0x0100, ++ 0xb872, 0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008, 0xb896, ++ 0xb89a, 0xb89e, 0xb8ae, 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110, ++ 0x080c, 0x0fe0, 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, ++ 0xb83a, 0x680c, 0xb846, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, ++ 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x57c2, ++ 0x9182, 0x0800, 0x1a04, 0x57c6, 0x2001, 0x180c, 0x2004, 0x9084, ++ 0x0003, 0x1904, 0x57cc, 0x9188, 0x1000, 0x2104, 0x905d, 0x0518, ++ 0xb804, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1508, 0xb8a4, 0x900d, ++ 0x1904, 0x57de, 0xb850, 0x900d, 0x1148, 0xa802, 0x2900, 0xb852, ++ 0xb84e, 0x080c, 0x7be8, 0x9006, 0x012e, 0x0005, 0x00a6, 0x2150, ++ 0x2900, 0xb002, 0xa803, 0x0000, 0x00ae, 0xb852, 0x0c90, 0x2001, ++ 0x0005, 0x900e, 0x04b0, 0x2001, 0x0028, 0x900e, 0x0490, 0x9082, ++ 0x0006, 0x1288, 0x080c, 0x94d3, 0x1158, 0xb8a0, 0xd0bc, 0x1140, ++ 0xb900, 0xd1fc, 0x0998, 0x2001, 0x0029, 0x2009, 0x1000, 0x0408, ++ 0x2001, 0x0028, 0x00a8, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, ++ 0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040, ++ 0x2001, 0x0029, 0xb900, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0048, ++ 0x900e, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, ++ 0x900e, 0x9005, 0x012e, 0x0005, 0x2001, 0x180c, 0x2004, 0xd084, ++ 0x19d0, 0x9188, 0x1000, 0x2104, 0x905d, 0x09a8, 0x080c, 0x5f2d, ++ 0x1990, 0xb800, 0xd0c4, 0x0978, 0x0804, 0x5776, 0x080c, 0x5da9, ++ 0x0904, 0x578f, 0x0804, 0x577a, 0x00b6, 0x00e6, 0x0126, 0x2091, ++ 0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, 0x583f, 0x9188, 0x1000, ++ 0x2104, 0x905d, 0x0528, 0xb8a0, 0x9086, 0x007f, 0x0130, 0x080c, ++ 0x5f35, 0x0118, 0x080c, 0x5f2d, 0x11f0, 0xa87c, 0xd0fc, 0x0138, ++ 0xa894, 0x9005, 0x0120, 0x2060, 0x2900, 0x6016, 0x0058, 0x080c, ++ 0x94fe, 0x05e0, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, 0xffff, ++ 0x6023, 0x000a, 0x2009, 0x0003, 0x080c, 0x95ce, 0x9006, 0x0450, ++ 0x2001, 0x0028, 0x0430, 0x9082, 0x0006, 0x1288, 0x080c, 0x94d3, ++ 0x1158, 0xb8a0, 0xd0bc, 0x1140, 0xb900, 0xd1fc, 0x09b0, 0x2001, ++ 0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, 0x2009, ++ 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, 0xd184, ++ 0x0118, 0x2001, 0x0004, 0x0028, 0x2001, 0x0029, 0x0010, 0x2001, ++ 0x0029, 0x9005, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2001, 0x002c, ++ 0x0cc0, 0x00f6, 0x00b6, 0x0126, 0x2091, 0x8000, 0xa8e0, 0x9005, ++ 0x1550, 0xa8dc, 0x9082, 0x0101, 0x1630, 0xa8c8, 0x9005, 0x1518, ++ 0xa8c4, 0x9082, 0x0101, 0x12f8, 0xa974, 0x2079, 0x1800, 0x9182, ++ 0x0800, 0x12e8, 0x7830, 0x9084, 0x0003, 0x1130, 0xaa98, 0xab94, ++ 0xa878, 0x9084, 0x0007, 0x00ea, 0x7930, 0xd18c, 0x0118, 0x2001, ++ 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, ++ 0x0029, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, 0x2001, ++ 0x0029, 0x900e, 0x9006, 0x0008, 0x9005, 0x012e, 0x00be, 0x00fe, ++ 0x0005, 0x58d5, 0x5891, 0x58a7, 0x58d5, 0x58d5, 0x58d5, 0x58d5, ++ 0x58d5, 0x2100, 0x9082, 0x007e, 0x1270, 0x080c, 0x5bb0, 0x0140, ++ 0xb810, 0x9306, 0x1904, 0x58dd, 0xb814, 0x9206, 0x15f0, 0x0028, ++ 0xbb12, 0xba16, 0x0010, 0x080c, 0x435a, 0x0150, 0x04b0, 0x080c, ++ 0x5c0d, 0x1598, 0xb810, 0x9306, 0x1580, 0xb814, 0x9206, 0x1568, ++ 0x080c, 0x94fe, 0x0530, 0x2b00, 0x6012, 0x080c, 0xb4e6, 0x2900, ++ 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0xa878, 0x9086, 0x0001, ++ 0x1170, 0x080c, 0x2d1a, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0002, ++ 0x080c, 0x5b61, 0x2001, 0x0200, 0xb86e, 0xb893, 0x0002, 0x2009, ++ 0x0003, 0x080c, 0x95ce, 0x9006, 0x0068, 0x2001, 0x0001, 0x900e, ++ 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, 0x2001, 0x0028, 0x900e, ++ 0x9005, 0x0000, 0x012e, 0x00be, 0x00fe, 0x0005, 0x00b6, 0x00f6, ++ 0x00e6, 0x0126, 0x2091, 0x8000, 0xa894, 0x90c6, 0x0015, 0x0904, ++ 0x5aa6, 0x90c6, 0x0056, 0x0904, 0x5aaa, 0x90c6, 0x0066, 0x0904, ++ 0x5aae, 0x90c6, 0x0071, 0x0904, 0x5ab2, 0x90c6, 0x0074, 0x0904, ++ 0x5ab6, 0x90c6, 0x007c, 0x0904, 0x5aba, 0x90c6, 0x007e, 0x0904, ++ 0x5abe, 0x90c6, 0x0037, 0x0904, 0x5ac2, 0x9016, 0x2079, 0x1800, ++ 0xa974, 0x9186, 0x00ff, 0x0904, 0x5aa1, 0x9182, 0x0800, 0x1a04, ++ 0x5aa1, 0x080c, 0x5c0d, 0x1190, 0xb804, 0x9084, 0x00ff, 0x9082, ++ 0x0006, 0x1260, 0xa894, 0x90c6, 0x006f, 0x0140, 0x080c, 0x94d3, ++ 0x1904, 0x5a8a, 0xb8a0, 0xd0bc, 0x1904, 0x5a8a, 0xa894, 0x90c6, ++ 0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, 0x59e6, 0x90c6, 0x0064, ++ 0x0904, 0x5a12, 0x2008, 0x0804, 0x59a8, 0xa998, 0xa8b0, 0x2040, ++ 0x080c, 0x94d3, 0x1120, 0x9182, 0x007f, 0x0a04, 0x59a8, 0x9186, ++ 0x00ff, 0x0904, 0x59a8, 0x9182, 0x0800, 0x1a04, 0x59a8, 0xaaa0, ++ 0xab9c, 0x7874, 0x9306, 0x1188, 0x7878, 0x0096, 0x924e, 0x1128, ++ 0x2208, 0x2310, 0x009e, 0x0804, 0x59a8, 0x99cc, 0xff00, 0x009e, ++ 0x1120, 0x2208, 0x2310, 0x0804, 0x59a8, 0x080c, 0x435a, 0x0904, ++ 0x59b2, 0x900e, 0x9016, 0x90c6, 0x4000, 0x1558, 0x0006, 0x080c, ++ 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x20a9, ++ 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4, ++ 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f2b, 0x20a9, ++ 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b4, ++ 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0f2b, 0x000e, ++ 0x0098, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0070, 0x90c6, 0x4008, ++ 0x1118, 0x2708, 0x2610, 0x0040, 0x90c6, 0x4009, 0x1108, 0x0020, ++ 0x2001, 0x4005, 0x2009, 0x000a, 0xa896, 0xa99a, 0xaa9e, 0x2001, ++ 0x0030, 0x0470, 0x080c, 0x94fe, 0x1130, 0x2001, 0x4005, 0x2009, ++ 0x0003, 0x9016, 0x0c88, 0x2b00, 0x6012, 0x080c, 0xb4e6, 0x2900, ++ 0x6016, 0x6023, 0x0001, 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x2d1a, 0x012e, 0x9006, 0x080c, ++ 0x5b4d, 0x2001, 0x0002, 0x080c, 0x5b61, 0x2009, 0x0002, 0x080c, ++ 0x95ce, 0xa8b0, 0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x9006, ++ 0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x080c, 0x4dfe, ++ 0x0118, 0x2009, 0x0007, 0x0410, 0xa998, 0xaeb0, 0x080c, 0x5c0d, ++ 0x0120, 0x2009, 0x000a, 0x0804, 0x59a8, 0x9186, 0x007f, 0x0130, ++ 0x080c, 0x5f2d, 0x0118, 0x2009, 0x0009, 0x0080, 0x0096, 0x080c, ++ 0x0fae, 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, 0x2900, 0x009e, ++ 0xa806, 0x080c, 0xb275, 0x1998, 0x2009, 0x0003, 0x2001, 0x4005, ++ 0x0804, 0x59ac, 0xa998, 0xaeb0, 0x080c, 0x5c0d, 0x0120, 0x2009, ++ 0x000a, 0x0804, 0x59a8, 0x0096, 0x080c, 0x0fae, 0x1128, 0x009e, ++ 0x2009, 0x0002, 0x0804, 0x5a69, 0x2900, 0x009e, 0xa806, 0x0096, ++ 0x2048, 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, ++ 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, ++ 0x9080, 0x0006, 0x20a0, 0xbbb8, 0x9398, 0x0006, 0x2398, 0x080c, ++ 0x0f2b, 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, ++ 0xd684, 0x1168, 0x080c, 0x4dea, 0xd0b4, 0x1118, 0xa89b, 0x000b, ++ 0x00e0, 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c, ++ 0x5f2d, 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x4dfe, 0x0118, ++ 0xa89b, 0x0007, 0x0050, 0x080c, 0xb258, 0x1904, 0x59df, 0x2009, ++ 0x0003, 0x2001, 0x4005, 0x0804, 0x59ac, 0xa87b, 0x0030, 0xa897, ++ 0x4005, 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, ++ 0xffc0, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, ++ 0x0000, 0x2041, 0x11e3, 0x080c, 0x9a1f, 0x1904, 0x59df, 0x2009, ++ 0x0002, 0x08f8, 0x2001, 0x0028, 0x900e, 0x0804, 0x59e0, 0x2009, ++ 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, ++ 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0804, ++ 0x59e0, 0x2001, 0x0029, 0x900e, 0x0804, 0x59e0, 0x080c, 0x327f, ++ 0x0804, 0x59e1, 0x080c, 0x4b29, 0x0804, 0x59e1, 0x080c, 0x3fec, ++ 0x0804, 0x59e1, 0x080c, 0x43f5, 0x0804, 0x59e1, 0x080c, 0x4572, ++ 0x0804, 0x59e1, 0x080c, 0x4796, 0x0804, 0x59e1, 0x080c, 0x499b, ++ 0x0804, 0x59e1, 0x080c, 0x3459, 0x0804, 0x59e1, 0x00b6, 0xa974, ++ 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1618, 0x9182, 0x0800, ++ 0x1268, 0x9188, 0x1000, 0x2104, 0x905d, 0x0140, 0x080c, 0x5f2d, ++ 0x1148, 0x00e9, 0x080c, 0x5d38, 0x9006, 0x00b0, 0x2001, 0x0028, ++ 0x900e, 0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc, 0x0d88, ++ 0x2001, 0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, 0x900e, ++ 0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005, 0x0126, ++ 0x2091, 0x8000, 0xb850, 0x900d, 0x0150, 0x2900, 0x0096, 0x2148, ++ 0xa802, 0x009e, 0xa803, 0x0000, 0xb852, 0x012e, 0x0005, 0x2900, ++ 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, 0x0126, 0x2091, 0x8000, ++ 0xb84c, 0x9005, 0x0170, 0x00e6, 0x2071, 0x19b4, 0x7004, 0x9086, ++ 0x0002, 0x0168, 0x00ee, 0xb84c, 0xa802, 0x2900, 0xb84e, 0x012e, ++ 0x0005, 0x2900, 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, 0x701c, ++ 0x9b06, 0x1d80, 0xb84c, 0x00a6, 0x2050, 0xb000, 0xa802, 0x2900, ++ 0xb002, 0x00ae, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0xb84c, 0x904d, 0x0130, 0xa800, 0x9005, 0x1108, 0xb852, 0xb84e, ++ 0x9905, 0x012e, 0x0005, 0xb84c, 0x904d, 0x0130, 0xa800, 0x9005, ++ 0x1108, 0xb852, 0xb84e, 0x9905, 0x0005, 0x00b6, 0x0126, 0x00c6, ++ 0x0026, 0x2091, 0x8000, 0x6210, 0x2258, 0xba00, 0x9005, 0x0110, ++ 0xc285, 0x0008, 0xc284, 0xba02, 0x002e, 0x00ce, 0x012e, 0x00be, ++ 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, ++ 0xba04, 0x0006, 0x9086, 0x0006, 0x1170, 0xb89c, 0xd0ac, 0x0158, ++ 0x080c, 0x5f29, 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, ++ 0x1110, 0x2011, 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0xba06, ++ 0x0006, 0x9086, 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, 0x0d84, ++ 0x000e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, ++ 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, ++ 0x1168, 0xb89c, 0xd0a4, 0x0150, 0x080c, 0x5f25, 0x1138, 0x9284, ++ 0x00ff, 0x9086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0x9294, ++ 0x00ff, 0x8007, 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, 0x0005, ++ 0x00d6, 0x0026, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x00b0, ++ 0x9190, 0x1000, 0x2204, 0x905d, 0x1180, 0x0096, 0x080c, 0x0fae, ++ 0x2958, 0x009e, 0x0d90, 0x2b00, 0x2012, 0xb85c, 0xb8ba, 0xb860, ++ 0xb8b6, 0x9006, 0xb8a6, 0x080c, 0x56f3, 0x9006, 0x002e, 0x00de, ++ 0x0005, 0x00b6, 0x0096, 0x0126, 0x2091, 0x8000, 0x0026, 0x9182, ++ 0x0800, 0x0218, 0x9085, 0x0001, 0x0458, 0x00d6, 0x9190, 0x1000, ++ 0x2204, 0x905d, 0x0518, 0x2013, 0x0000, 0xb8a4, 0x904d, 0x0110, ++ 0x080c, 0x0fe0, 0x00d6, 0x00c6, 0xb8ac, 0x2060, 0x8cff, 0x0168, ++ 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0110, 0x080c, ++ 0x0f60, 0x080c, 0x9554, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x2b48, ++ 0xb8b8, 0xb85e, 0xb8b4, 0xb862, 0x080c, 0x0ff0, 0x00de, 0x9006, ++ 0x002e, 0x012e, 0x009e, 0x00be, 0x0005, 0x0016, 0x9182, 0x0800, ++ 0x0218, 0x9085, 0x0001, 0x0030, 0x9188, 0x1000, 0x2104, 0x905d, ++ 0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, ++ 0x9006, 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802, 0x080c, 0x6877, ++ 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0x94d3, 0x11d8, ++ 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x194f, 0x7048, ++ 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, 0x00ce, ++ 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, 0x6886, ++ 0x2069, 0x1800, 0x68ae, 0x7040, 0xb85e, 0x7048, 0xb862, 0x704c, ++ 0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8b4, 0x20e8, 0xb8b8, ++ 0x9088, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099, 0x027a, ++ 0x9088, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069, 0x0200, ++ 0x6817, 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e, 0x7048, 0xb872, ++ 0x7050, 0xb876, 0x2069, 0x0200, 0x6817, 0x0000, 0xb8a0, 0x9086, ++ 0x007e, 0x1110, 0x7144, 0xb96e, 0x9182, 0x0211, 0x1218, 0x2009, ++ 0x0008, 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0, ++ 0x9182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182, 0x0349, ++ 0x1218, 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218, 0x2009, ++ 0x0004, 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010, ++ 0x2009, 0x0002, 0xb992, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, ++ 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0xb896, 0x703c, ++ 0xb89a, 0x7054, 0xb89e, 0x0036, 0xbbbc, 0xc384, 0xba00, 0x2009, ++ 0x1872, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008, ++ 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc, 0x0128, ++ 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbbe, 0x003e, ++ 0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000, ++ 0xb8a4, 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0, 0xaa04, 0x9282, ++ 0x0010, 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x8906, 0x8006, ++ 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9080, 0x0004, ++ 0x2098, 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002, 0x9086, 0xffff, ++ 0x0120, 0x8109, 0x1dd0, 0x080c, 0x0d84, 0x3c00, 0x20e8, 0x3300, ++ 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, 0x014e, ++ 0x013e, 0x0060, 0x080c, 0x0fae, 0x0170, 0x2900, 0xb8a6, 0xa803, ++ 0x0000, 0x080c, 0x5dc9, 0xa807, 0x0001, 0xae12, 0x9085, 0x0001, ++ 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000, ++ 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, 0x080c, ++ 0x5dd8, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, 0xa806, ++ 0x0020, 0x080c, 0x0fe0, 0xb8a7, 0x0000, 0x009e, 0x012e, 0x0005, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x7be8, 0x012e, 0x0005, 0x901e, ++ 0x0010, 0x2019, 0x0001, 0x900e, 0x0126, 0x2091, 0x8000, 0xb84c, ++ 0x2048, 0xb800, 0xd0dc, 0x1170, 0x89ff, 0x0500, 0x83ff, 0x0120, ++ 0xa878, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870, ++ 0x9506, 0x0120, 0x2908, 0xa800, 0x2048, 0x0c70, 0x080c, 0x8eec, ++ 0xaa00, 0xb84c, 0x9906, 0x1110, 0xba4e, 0x0020, 0x00a6, 0x2150, ++ 0xb202, 0x00ae, 0x82ff, 0x1110, 0xb952, 0x89ff, 0x012e, 0x0005, ++ 0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x5e2d, ++ 0x0118, 0x080c, 0xb15e, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, ++ 0x5e2d, 0x0118, 0x080c, 0xb0f8, 0x0010, 0x9085, 0x0001, 0x0005, ++ 0x080c, 0x5e2d, 0x0118, 0x080c, 0xb15b, 0x0010, 0x9085, 0x0001, ++ 0x0005, 0x080c, 0x5e2d, 0x0118, 0x080c, 0xb11c, 0x0010, 0x9085, ++ 0x0001, 0x0005, 0x080c, 0x5e2d, 0x0118, 0x080c, 0xb188, 0x0010, ++ 0x9085, 0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118, 0x9085, 0x0001, ++ 0x0005, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, ++ 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, ++ 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, ++ 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006, 0x01ce, 0x013e, ++ 0x0005, 0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0004, ++ 0x20a0, 0x20a9, 0x0010, 0x2009, 0xffff, 0x4104, 0x01de, 0x014e, ++ 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f, ++ 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098, ++ 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, 0x8109, ++ 0x1dd8, 0x9085, 0x0001, 0x0068, 0x0146, 0x01d6, 0x3300, 0x8001, ++ 0x20a0, 0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004, 0x01de, 0x014e, ++ 0x9006, 0x01ce, 0x013e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000, ++ 0xb8a4, 0x904d, 0x1128, 0x080c, 0x0fae, 0x0168, 0x2900, 0xb8a6, ++ 0x080c, 0x5dc9, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001, ++ 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091, ++ 0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x0fe0, ++ 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005, ++ 0x00b6, 0x00f6, 0x080c, 0x6877, 0x01b0, 0x71c0, 0x81ff, 0x1198, ++ 0x71d8, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004, ++ 0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118, ++ 0xb800, 0xc0ed, 0xb802, 0x2079, 0x1852, 0x7804, 0xd0a4, 0x01d0, ++ 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x5c0d, 0x1168, ++ 0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086, ++ 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04, ++ 0x5e54, 0x015e, 0x080c, 0x5eeb, 0x0120, 0x2001, 0x1952, 0x200c, ++ 0x0038, 0x2079, 0x1852, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0, ++ 0x2011, 0x5e7f, 0x080c, 0x78a5, 0x00fe, 0x00be, 0x0005, 0x00b6, ++ 0x2011, 0x5e7f, 0x080c, 0x781a, 0x080c, 0x5eeb, 0x01d8, 0x2001, ++ 0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x5f29, ++ 0x0130, 0x2009, 0x07d0, 0x2011, 0x5e7f, 0x080c, 0x78a5, 0x00e6, ++ 0x2071, 0x1800, 0x9006, 0x7076, 0x7058, 0x707a, 0x080c, 0x2b1e, ++ 0x00ee, 0x0488, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, ++ 0x080c, 0x5c0d, 0x1510, 0xb800, 0xd0ec, 0x01f8, 0x0046, 0xbaa0, ++ 0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xc9c5, 0xb800, 0xc0e5, ++ 0xc0ec, 0xb802, 0xb804, 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, ++ 0x2019, 0x0029, 0x080c, 0x7d55, 0x0076, 0x903e, 0x080c, 0x7c4d, ++ 0x900e, 0x080c, 0xc73e, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, ++ 0x5ea7, 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, ++ 0xb800, 0xc0ec, 0xb802, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, ++ 0xb800, 0x00be, 0xd0ac, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, ++ 0x00be, 0xd0bc, 0x0005, 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, ++ 0x905d, 0x0110, 0xb800, 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, ++ 0x0026, 0x2091, 0x8000, 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, ++ 0x9b06, 0x190c, 0x0d84, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, ++ 0x0008, 0xc2fc, 0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1836, ++ 0x2204, 0xd0cc, 0x0138, 0x2001, 0x1950, 0x200c, 0x2011, 0x5f1b, ++ 0x080c, 0x78a5, 0x0005, 0x2011, 0x5f1b, 0x080c, 0x781a, 0x2011, ++ 0x1836, 0x2204, 0xc0cc, 0x2012, 0x0005, 0x080c, 0x4dea, 0xd0ac, ++ 0x0005, 0x080c, 0x4dea, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, ++ 0x00ff, 0x908e, 0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, ++ 0xff00, 0x8007, 0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, ++ 0x080c, 0xb759, 0x0158, 0x70d8, 0x9084, 0x0028, 0x0138, 0x2001, ++ 0x107f, 0x2004, 0x905d, 0x0110, 0xb8bc, 0xd094, 0x00fe, 0x00be, ++ 0x0005, 0x2071, 0x1904, 0x7003, 0x0001, 0x7007, 0x0000, 0x9006, ++ 0x7012, 0x7016, 0x701a, 0x701e, 0x700a, 0x7046, 0x2001, 0x1917, ++ 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1918, 0x900e, ++ 0x710a, 0x080c, 0x4dea, 0xd0fc, 0x1140, 0x080c, 0x4dea, 0x900e, ++ 0xd09c, 0x0108, 0x8108, 0x7102, 0x00f8, 0x2001, 0x1872, 0x200c, ++ 0x9184, 0x0007, 0x0002, 0x5f6d, 0x5f6d, 0x5f6d, 0x5f6d, 0x5f6d, ++ 0x5f83, 0x5f91, 0x5f6d, 0x7003, 0x0003, 0x2009, 0x1873, 0x210c, ++ 0x9184, 0xff00, 0x8007, 0x9005, 0x1110, 0x2001, 0x0002, 0x7006, ++ 0x0018, 0x7003, 0x0005, 0x0c88, 0x00ee, 0x001e, 0x0005, 0x00e6, ++ 0x2071, 0x0050, 0x684c, 0x9005, 0x1150, 0x00e6, 0x2071, 0x1904, ++ 0x7028, 0xc085, 0x702a, 0x00ee, 0x9085, 0x0001, 0x0488, 0x6844, ++ 0x9005, 0x0158, 0x080c, 0x6bb2, 0x6a60, 0x9200, 0x7002, 0x6864, ++ 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6860, 0x7002, 0x6864, ++ 0x7006, 0x6868, 0x700a, 0x686c, 0x700e, 0x6844, 0x9005, 0x1110, ++ 0x7012, 0x7016, 0x684c, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e, ++ 0x7037, 0x0019, 0x702b, 0x0001, 0x00e6, 0x2071, 0x1904, 0x7028, ++ 0xc084, 0x702a, 0x7007, 0x0001, 0x700b, 0x0000, 0x00ee, 0x9006, ++ 0x00ee, 0x0005, 0xa868, 0xd0fc, 0x11c8, 0x00e6, 0x0026, 0x2001, ++ 0x1918, 0x2004, 0x9005, 0x0904, 0x61ae, 0xa87c, 0xd0bc, 0x1904, ++ 0x61ae, 0xa978, 0xa874, 0x9105, 0x1904, 0x61ae, 0x2001, 0x1918, ++ 0x2004, 0x0002, 0x61ae, 0x6017, 0x6051, 0x6051, 0x0005, 0xa868, ++ 0xd0fc, 0x11e0, 0x00e6, 0x0026, 0x2009, 0x1918, 0x210c, 0x81ff, ++ 0x0904, 0x61ae, 0xa87c, 0xd0cc, 0x0904, 0x61ae, 0xa880, 0x9084, ++ 0x00ff, 0x9086, 0x0001, 0x1904, 0x61ae, 0x9186, 0x0003, 0x0904, ++ 0x6051, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005, 0xa84f, ++ 0x8020, 0xa853, 0x0016, 0x2071, 0x1904, 0x701c, 0x9005, 0x1904, ++ 0x6360, 0x0e04, 0x63a9, 0x2071, 0x0000, 0xa84c, 0x7082, 0xa850, ++ 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, ++ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2071, 0x1800, ++ 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1148, 0xa802, 0x2900, ++ 0x702e, 0x70bc, 0x9200, 0x70be, 0x002e, 0x00ee, 0x0005, 0x0096, ++ 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x009e, ++ 0x0c68, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x1904, ++ 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, 0x6136, 0x782c, 0x908c, ++ 0x0780, 0x190c, 0x64ce, 0x8004, 0x8004, 0x8004, 0x9084, 0x0003, ++ 0x0002, 0x606f, 0x6136, 0x6092, 0x60d5, 0x080c, 0x0d84, 0x2071, ++ 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1170, 0x2071, 0x19c7, ++ 0x7040, 0x9005, 0x1328, 0x2001, 0x1919, 0x2004, 0x8005, 0x7042, ++ 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, ++ 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, ++ 0x70be, 0x0c20, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, ++ 0x1570, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, ++ 0x2009, 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, ++ 0x0048, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, ++ 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, ++ 0x1d00, 0x2071, 0x19c7, 0x7040, 0x9005, 0x1328, 0x2001, 0x1919, ++ 0x2004, 0x8005, 0x7042, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, ++ 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, ++ 0x702e, 0x70bc, 0x9200, 0x70be, 0x0820, 0x0096, 0x00e6, 0x7824, ++ 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, ++ 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, ++ 0x1d70, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd09c, ++ 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x1560, 0x2071, ++ 0x19c7, 0x7040, 0x9005, 0x1328, 0x2001, 0x1919, 0x2004, 0x8005, ++ 0x7042, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, 0x2908, 0x7010, ++ 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, ++ 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, 0x19c7, 0x7040, ++ 0x9005, 0x1328, 0x2001, 0x1919, 0x2004, 0x8005, 0x7042, 0x00fe, ++ 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, ++ 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, ++ 0x9200, 0x70be, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, ++ 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, ++ 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x6189, 0x782c, 0x9094, ++ 0x0780, 0x190c, 0x64ce, 0xd09c, 0x1198, 0x701c, 0x904d, 0x0180, ++ 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, ++ 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd09c, 0x0d68, ++ 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x01a0, 0x00e6, ++ 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, ++ 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, ++ 0xd0a4, 0x1d70, 0x00ee, 0x2071, 0x19c7, 0x7040, 0x9005, 0x1328, ++ 0x2001, 0x1919, 0x2004, 0x8005, 0x7042, 0x00fe, 0x002e, 0x00ee, ++ 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, ++ 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, ++ 0x70be, 0x00ee, 0x0804, 0x6146, 0xa868, 0xd0fc, 0x1904, 0x61ea, ++ 0x0096, 0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x0f60, 0x009e, ++ 0x0018, 0xa868, 0xd0fc, 0x15f0, 0x00e6, 0x0026, 0xa84f, 0x0000, ++ 0x00f6, 0x2079, 0x0050, 0x2071, 0x1800, 0x70f0, 0x8001, 0x01d0, ++ 0x1678, 0x2071, 0x1904, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, ++ 0x62de, 0x782c, 0x908c, 0x0780, 0x190c, 0x64ce, 0x8004, 0x8004, ++ 0x8004, 0x9084, 0x0003, 0x0002, 0x61eb, 0x62de, 0x6204, 0x6271, ++ 0x080c, 0x0d84, 0x70f3, 0x0fa0, 0x71ec, 0x8107, 0x9106, 0x9094, ++ 0x00c0, 0x9184, 0xff3f, 0x9205, 0x70ee, 0x3b08, 0x3a00, 0x9104, ++ 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0, 0x0888, ++ 0x70f2, 0x0878, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, ++ 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, ++ 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, ++ 0x70bc, 0x9200, 0x70be, 0x0c70, 0x2071, 0x1800, 0x2900, 0x7822, ++ 0xa804, 0x900d, 0x1904, 0x6262, 0x7830, 0x8007, 0x9084, 0x001f, ++ 0x9082, 0x0005, 0x1220, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, ++ 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, 0x182f, ++ 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, 0x0048, 0x00ee, ++ 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, ++ 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x1d00, 0x0e04, ++ 0x6259, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, ++ 0x6836, 0x6833, 0x0013, 0x00de, 0x2001, 0x1915, 0x200c, 0xc184, ++ 0x2102, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, ++ 0x113e, 0x2009, 0x1917, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, ++ 0x0005, 0x2001, 0x1915, 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, ++ 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, ++ 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x0804, ++ 0x6217, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, ++ 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, ++ 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x1d70, 0x00ee, 0x0e04, 0x62b3, ++ 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, ++ 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, ++ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2009, 0x1917, ++ 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd09c, ++ 0x1170, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x11e0, 0x00fe, ++ 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x0c58, 0x009e, ++ 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, ++ 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1120, 0x00fe, ++ 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, ++ 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, ++ 0x9200, 0x70be, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, ++ 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, ++ 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x634d, 0x782c, 0x9094, ++ 0x0780, 0x190c, 0x64ce, 0xd09c, 0x11b0, 0x701c, 0x904d, 0x0198, ++ 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, ++ 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, ++ 0x64ce, 0xd09c, 0x0d50, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, ++ 0xd0a4, 0x05b8, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, ++ 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, ++ 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x1d70, 0x00ee, 0x0e04, 0x6346, ++ 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, ++ 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, ++ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2009, 0x1917, ++ 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, ++ 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, ++ 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, ++ 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x00ee, 0x0804, 0x62ee, ++ 0x2071, 0x1904, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, ++ 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, ++ 0xa804, 0x900d, 0x1128, 0x1e04, 0x6389, 0x002e, 0x00ee, 0x0005, ++ 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, ++ 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x0e04, ++ 0x6375, 0x2071, 0x1904, 0x701c, 0x2048, 0xa84c, 0x900d, 0x0d28, ++ 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, ++ 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, ++ 0x190c, 0x113e, 0x2071, 0x1904, 0x080c, 0x64ba, 0x002e, 0x00ee, ++ 0x0005, 0x2071, 0x1904, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, ++ 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, ++ 0x2148, 0xa804, 0x900d, 0x1118, 0x002e, 0x00ee, 0x0005, 0x2071, ++ 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, ++ 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x002e, 0x00ee, ++ 0x0005, 0x0006, 0xa87c, 0x0006, 0xa867, 0x0103, 0x20a9, 0x001c, ++ 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001d, 0x20a0, 0x9006, 0x4004, ++ 0x000e, 0x9084, 0x00ff, 0xa87e, 0x000e, 0xa87a, 0xa982, 0x0005, ++ 0x2071, 0x1904, 0x7004, 0x0002, 0x63f2, 0x63f3, 0x64b9, 0x63f3, ++ 0x0d84, 0x64b9, 0x0005, 0x2001, 0x1918, 0x2004, 0x0002, 0x63fd, ++ 0x63fd, 0x6452, 0x6453, 0x63fd, 0x6453, 0x0126, 0x2091, 0x8000, ++ 0x1e0c, 0x64d9, 0x701c, 0x904d, 0x01e0, 0xa84c, 0x9005, 0x01d8, ++ 0x0e04, 0x6421, 0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, ++ 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, ++ 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2071, 0x1904, 0x080c, ++ 0x64ba, 0x012e, 0x0470, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, ++ 0x190c, 0x64ce, 0xd09c, 0x2071, 0x1904, 0x1510, 0x2071, 0x1904, ++ 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, ++ 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x2900, 0x00d6, ++ 0x2069, 0x0050, 0x6822, 0x00de, 0x2071, 0x1904, 0x701c, 0x2048, ++ 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, ++ 0x012e, 0x0005, 0x0005, 0x00d6, 0x2008, 0x2069, 0x19c7, 0x6840, ++ 0x9005, 0x0760, 0x0158, 0x9186, 0x0003, 0x0540, 0x2001, 0x1813, ++ 0x2004, 0x2009, 0x1a8a, 0x210c, 0x9102, 0x1500, 0x0126, 0x2091, ++ 0x8000, 0x2069, 0x0050, 0x693c, 0x6838, 0x9106, 0x0190, 0x0e04, ++ 0x6485, 0x2069, 0x0000, 0x6837, 0x8040, 0x6833, 0x0012, 0x6883, ++ 0x8040, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, ++ 0x113e, 0x2069, 0x19c7, 0x6843, 0xffff, 0x012e, 0x00de, 0x0126, ++ 0x2091, 0x8000, 0x1e0c, 0x654b, 0x701c, 0x904d, 0x0540, 0x2001, ++ 0x005b, 0x2004, 0x9094, 0x0780, 0x15c9, 0xd09c, 0x1500, 0x2071, ++ 0x1904, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, 0x0003, ++ 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x2900, ++ 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x701c, 0x2048, 0x7010, ++ 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, ++ 0x0005, 0x0005, 0x0126, 0x2091, 0x8000, 0x701c, 0x904d, 0x0160, ++ 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, ++ 0x012e, 0x080c, 0x0fe0, 0x0005, 0x012e, 0x0005, 0x2091, 0x8000, ++ 0x0e04, 0x64d0, 0x0006, 0x0016, 0x2001, 0x8004, 0x0006, 0x0804, ++ 0x0d8d, 0x0096, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01e0, ++ 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, ++ 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, ++ 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x2009, 0x1917, 0x200b, ++ 0x0000, 0x00fe, 0x009e, 0x0005, 0x782c, 0x9094, 0x0780, 0x1971, ++ 0xd0a4, 0x0db8, 0x2001, 0x1918, 0x2004, 0x2009, 0x1917, 0x2104, ++ 0x8000, 0x200a, 0x9082, 0x000f, 0x0e60, 0x00e6, 0x2071, 0x1800, ++ 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, ++ 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, 0x0048, ++ 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, ++ 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x1d00, ++ 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, ++ 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, ++ 0xd084, 0x190c, 0x113e, 0x2009, 0x1917, 0x200b, 0x0000, 0x00ee, ++ 0x00fe, 0x009e, 0x0005, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, ++ 0x01b8, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, ++ 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, ++ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x113e, 0x00fe, 0x0005, ++ 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, 0xd0a4, 0x0db8, 0x00e6, ++ 0x2071, 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, ++ 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x64ce, ++ 0xd0a4, 0x1d80, 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069, 0x1918, ++ 0x6808, 0x690a, 0x2069, 0x19c7, 0x9102, 0x1118, 0x6840, 0x9005, ++ 0x1328, 0x2001, 0x1919, 0x200c, 0x810d, 0x6942, 0x00de, 0x00ee, ++ 0x00fe, 0x0005, 0x7090, 0x908a, 0x0029, 0x1a0c, 0x0d84, 0x9082, ++ 0x001d, 0x001b, 0x6027, 0x1e00, 0x0005, 0x666d, 0x65f7, 0x6613, ++ 0x663b, 0x665c, 0x669c, 0x66ae, 0x6613, 0x6684, 0x65b2, 0x65e0, ++ 0x65b1, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, ++ 0x6808, 0x9005, 0x1518, 0x7093, 0x0028, 0x2069, 0x195c, 0x2d04, ++ 0x7002, 0x080c, 0x69a3, 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, ++ 0x7093, 0x0028, 0x2069, 0x195c, 0x2d04, 0x7002, 0x6028, 0x9085, ++ 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a30, ++ 0x080c, 0x1827, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, ++ 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, ++ 0x1160, 0x7093, 0x0028, 0x2069, 0x195c, 0x2d04, 0x7002, 0x080c, ++ 0x6a2d, 0x6028, 0x9085, 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, ++ 0x2001, 0x0090, 0x080c, 0x28a5, 0x000e, 0x6124, 0xd1e4, 0x1190, ++ 0x080c, 0x671b, 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, ++ 0x7093, 0x0020, 0x080c, 0x671b, 0x0028, 0x7093, 0x001d, 0x0010, ++ 0x7093, 0x001f, 0x0005, 0x2001, 0x0088, 0x080c, 0x28a5, 0x6124, ++ 0xd1cc, 0x11d8, 0xd1dc, 0x11b0, 0xd1e4, 0x1188, 0x9184, 0x1e00, ++ 0x11c8, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x68a3, ++ 0x2001, 0x0080, 0x080c, 0x28a5, 0x7093, 0x0028, 0x0058, 0x7093, ++ 0x001e, 0x0040, 0x7093, 0x001d, 0x0028, 0x7093, 0x0020, 0x0010, ++ 0x7093, 0x001f, 0x0005, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, ++ 0x080c, 0x68a3, 0x2001, 0x0080, 0x080c, 0x28a5, 0x6124, 0xd1d4, ++ 0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, ++ 0x7093, 0x0028, 0x0040, 0x7093, 0x001e, 0x0028, 0x7093, 0x001d, ++ 0x0010, 0x7093, 0x001f, 0x0005, 0x2001, 0x00a0, 0x080c, 0x28a5, ++ 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, 0x1851, 0x7093, ++ 0x001e, 0x0010, 0x7093, 0x001d, 0x0005, 0x080c, 0x6794, 0x6124, ++ 0xd1dc, 0x1188, 0x080c, 0x671b, 0x0016, 0x080c, 0x1851, 0x001e, ++ 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x7093, 0x001e, 0x0020, 0x7093, ++ 0x001f, 0x080c, 0x671b, 0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, ++ 0x28a5, 0x000e, 0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, ++ 0x1128, 0xd1e4, 0x0140, 0x7093, 0x001e, 0x0028, 0x7093, 0x001d, ++ 0x0010, 0x7093, 0x0021, 0x0005, 0x080c, 0x6794, 0x6124, 0xd1d4, ++ 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x7093, 0x001e, 0x0028, ++ 0x7093, 0x001d, 0x0010, 0x7093, 0x001f, 0x0005, 0x0006, 0x2001, ++ 0x0090, 0x080c, 0x28a5, 0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, ++ 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x7093, 0x001e, 0x0040, ++ 0x7093, 0x001d, 0x0028, 0x7093, 0x0020, 0x0010, 0x7093, 0x001f, ++ 0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, ++ 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x080c, 0x6877, ++ 0x11d8, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x01b0, 0xc1b4, 0x2102, ++ 0x6027, 0x0200, 0x080c, 0x27ef, 0x6024, 0xd0cc, 0x0148, 0x2001, ++ 0x00a0, 0x080c, 0x28a5, 0x080c, 0x6b40, 0x080c, 0x56d9, 0x0428, ++ 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x6891, 0x0150, 0x080c, ++ 0x6888, 0x1138, 0x2001, 0x0001, 0x080c, 0x23a6, 0x080c, 0x6853, ++ 0x00a0, 0x080c, 0x6791, 0x0178, 0x2001, 0x0001, 0x080c, 0x23a6, ++ 0x7090, 0x9086, 0x001e, 0x0120, 0x7090, 0x9086, 0x0022, 0x1118, ++ 0x7093, 0x0025, 0x0010, 0x7093, 0x0021, 0x012e, 0x00ee, 0x00de, ++ 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x672c, 0x080c, 0x78e7, ++ 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x672c, 0x080c, ++ 0x78de, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016, 0x080c, ++ 0x8b50, 0x2071, 0x1800, 0x080c, 0x66c9, 0x001e, 0x00fe, 0x00ee, ++ 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x00f6, ++ 0x0126, 0x080c, 0x8b50, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, ++ 0x1800, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, ++ 0x080c, 0x8e99, 0x2011, 0x0002, 0x080c, 0x8ea3, 0x080c, 0x8d59, ++ 0x080c, 0x7893, 0x0036, 0x901e, 0x080c, 0x8dfe, 0x003e, 0x60e3, ++ 0x0000, 0x080c, 0xcd0a, 0x080c, 0xcd25, 0x2009, 0x0004, 0x080c, ++ 0x27f5, 0x080c, 0x2718, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, ++ 0x0008, 0x080c, 0x0b69, 0x2001, 0x0001, 0x080c, 0x23a6, 0x012e, ++ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, ++ 0x0026, 0x00e6, 0x2011, 0x6739, 0x2071, 0x19c7, 0x701c, 0x9206, ++ 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee, 0x002e, ++ 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe, 0x9086, ++ 0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, 0x28a5, 0x0156, 0x20a9, ++ 0x002d, 0x1d04, 0x67a1, 0x2091, 0x6000, 0x1f04, 0x67a1, 0x015e, ++ 0x00d6, 0x2069, 0x1800, 0x6894, 0x8001, 0x0220, 0x0118, 0x6896, ++ 0x00de, 0x0005, 0x6897, 0x0014, 0x68ec, 0xd0dc, 0x0dc8, 0x6800, ++ 0x9086, 0x0001, 0x1da8, 0x080c, 0x78f3, 0x0c90, 0x00c6, 0x00d6, ++ 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, ++ 0x194c, 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, ++ 0x9186, 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x6843, ++ 0x7093, 0x0022, 0x0040, 0x7093, 0x0021, 0x0028, 0x7093, 0x0023, ++ 0x0010, 0x7093, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, ++ 0x0001, 0x080c, 0x2471, 0x0026, 0x080c, 0x94da, 0x002e, 0x7000, ++ 0x908e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, 0x0020, ++ 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac, ++ 0x0120, 0x012e, 0x015e, 0x0804, 0x684f, 0x6800, 0x9084, 0x00a1, ++ 0xc0bd, 0x6802, 0x080c, 0x27ef, 0x6904, 0xd1d4, 0x1140, 0x2001, ++ 0x0100, 0x080c, 0x28a5, 0x1f04, 0x67fe, 0x080c, 0x68d0, 0x012e, ++ 0x015e, 0x080c, 0x6888, 0x01a8, 0x6044, 0x9005, 0x0168, 0x6050, ++ 0x0006, 0x9085, 0x0020, 0x6052, 0x080c, 0x68d0, 0x9006, 0x8001, ++ 0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, ++ 0x68d0, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009, ++ 0x00c8, 0x2011, 0x6739, 0x080c, 0x78a5, 0x002e, 0x001e, 0x2001, ++ 0x194c, 0x2003, 0x0004, 0x080c, 0x659a, 0x080c, 0x6888, 0x0138, ++ 0x6804, 0xd0d4, 0x1120, 0xd0dc, 0x1100, 0x080c, 0x6b45, 0x00ee, ++ 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, ++ 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x6b4f, 0x2001, 0x193c, ++ 0x2003, 0x0000, 0x9006, 0x7092, 0x60e2, 0x6886, 0x080c, 0x2471, ++ 0x9006, 0x080c, 0x28a5, 0x6043, 0x0090, 0x6043, 0x0010, 0x6027, ++ 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, ++ 0x2001, 0x194b, 0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, ++ 0x080c, 0x4dee, 0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, ++ 0x0006, 0x080c, 0x4dee, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, ++ 0x0005, 0x0006, 0x080c, 0x4dee, 0x9084, 0x0030, 0x9086, 0x0010, ++ 0x000e, 0x0005, 0x0006, 0x080c, 0x4dee, 0x9084, 0x0030, 0x9086, ++ 0x0020, 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, ++ 0x908c, 0x0013, 0x0190, 0x9084, 0x0011, 0x0120, 0x080c, 0x2491, ++ 0x900e, 0x0028, 0x080c, 0x5f25, 0x1dc8, 0x2009, 0x0002, 0x2019, ++ 0x0028, 0x080c, 0x2ce5, 0x9006, 0x0019, 0x001e, 0x003e, 0x0005, ++ 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, 0x080c, 0xb752, 0x1128, ++ 0x9085, 0x0010, 0x0010, 0x9084, 0xffef, 0x2072, 0x00ee, 0x0005, ++ 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c, 0x0006, 0x6004, 0x0006, ++ 0x6028, 0x0006, 0x0016, 0x6138, 0x6050, 0x9084, 0xfbff, 0x9085, ++ 0x2000, 0x6052, 0x613a, 0x20a9, 0x0012, 0x1d04, 0x68e5, 0x2091, ++ 0x6000, 0x1f04, 0x68e5, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, ++ 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x613a, 0x001e, 0x602f, ++ 0x0040, 0x602f, 0x0000, 0x000e, 0x602a, 0x000e, 0x6006, 0x000e, ++ 0x600e, 0x000e, 0x60ee, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, ++ 0x0001, 0x080c, 0x2471, 0x2001, 0x00a0, 0x080c, 0x28a5, 0x000e, ++ 0x6052, 0x6058, 0x0006, 0xc0e5, 0x605a, 0x00f6, 0x2079, 0x0100, ++ 0x080c, 0x2764, 0x00fe, 0x000e, 0x605a, 0x0005, 0x0156, 0x0016, ++ 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, ++ 0x0140, 0x2071, 0x1800, 0x6020, 0x9084, 0x0080, 0x0138, 0x2001, ++ 0x180c, 0x200c, 0xc1c5, 0x2102, 0x0804, 0x6996, 0x2001, 0x180c, ++ 0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff, 0x602a, 0x6027, ++ 0x0200, 0x2001, 0x0090, 0x080c, 0x28a5, 0x20a9, 0x0366, 0x6024, ++ 0xd0cc, 0x11f0, 0x1d04, 0x6947, 0x2091, 0x6000, 0x1f04, 0x6947, ++ 0x2011, 0x0003, 0x080c, 0x8e99, 0x2011, 0x0002, 0x080c, 0x8ea3, ++ 0x080c, 0x8d59, 0x901e, 0x080c, 0x8dfe, 0x2001, 0x00a0, 0x080c, ++ 0x28a5, 0x080c, 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, 0x0470, ++ 0x86ff, 0x1110, 0x080c, 0x1851, 0x60e3, 0x0000, 0x2001, 0x193c, ++ 0x2004, 0x080c, 0x2471, 0x60e2, 0x2001, 0x0080, 0x080c, 0x28a5, ++ 0x20a9, 0x0366, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x27ef, ++ 0x6024, 0x910c, 0x0138, 0x1d04, 0x697a, 0x2091, 0x6000, 0x1f04, ++ 0x697a, 0x0830, 0x6028, 0x9085, 0x1e00, 0x602a, 0x70ac, 0x9005, ++ 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x9006, 0x080c, 0xb759, ++ 0x0110, 0x080c, 0x0cfc, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, ++ 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, ++ 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x2069, 0x0140, ++ 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, 0x9005, 0x1904, 0x69f7, ++ 0x2001, 0x0088, 0x080c, 0x28a5, 0x9006, 0x60e2, 0x6886, 0x080c, ++ 0x2471, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, ++ 0x01c0, 0x6028, 0x9084, 0xfbff, 0x602a, 0x6027, 0x0400, 0x2069, ++ 0x195c, 0x7000, 0x206a, 0x7093, 0x0026, 0x7003, 0x0001, 0x20a9, ++ 0x0002, 0x1d04, 0x69d9, 0x2091, 0x6000, 0x1f04, 0x69d9, 0x0804, ++ 0x6a25, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00, 0x2009, ++ 0x1e00, 0x080c, 0x27ef, 0x6024, 0x910c, 0x0508, 0x9084, 0x1a00, ++ 0x11f0, 0x1d04, 0x69e5, 0x2091, 0x6000, 0x1f04, 0x69e5, 0x2011, ++ 0x0003, 0x080c, 0x8e99, 0x2011, 0x0002, 0x080c, 0x8ea3, 0x080c, ++ 0x8d59, 0x901e, 0x080c, 0x8dfe, 0x2001, 0x00a0, 0x080c, 0x28a5, ++ 0x080c, 0x6b40, 0x080c, 0x56d9, 0x9085, 0x0001, 0x00b0, 0x2001, ++ 0x0080, 0x080c, 0x28a5, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70ac, ++ 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x193c, ++ 0x2004, 0x080c, 0x2471, 0x60e2, 0x9006, 0x00ee, 0x00de, 0x00ce, ++ 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, ++ 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, ++ 0x6020, 0x9084, 0x00c0, 0x01c8, 0x2011, 0x0003, 0x080c, 0x8e99, ++ 0x2011, 0x0002, 0x080c, 0x8ea3, 0x080c, 0x8d59, 0x901e, 0x080c, ++ 0x8dfe, 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c, 0x28a5, 0x080c, ++ 0x6b40, 0x080c, 0x56d9, 0x0804, 0x6ac0, 0x2001, 0x180c, 0x200c, ++ 0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x6721, 0x2069, 0x0140, ++ 0x2001, 0x0080, 0x080c, 0x28a5, 0x60e3, 0x0000, 0x2069, 0x0200, ++ 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0180, 0x6028, 0x9084, ++ 0xfdff, 0x602a, 0x6027, 0x0200, 0x2069, 0x195c, 0x7000, 0x206a, ++ 0x7093, 0x0027, 0x7003, 0x0001, 0x0804, 0x6ac0, 0x6027, 0x1e00, ++ 0x2009, 0x1e00, 0x080c, 0x27ef, 0x6024, 0x910c, 0x01c8, 0x9084, ++ 0x1c00, 0x11b0, 0x1d04, 0x6a7e, 0x0006, 0x0016, 0x00c6, 0x00d6, ++ 0x00e6, 0x080c, 0x7778, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, ++ 0x00e6, 0x2071, 0x19c7, 0x7018, 0x00ee, 0x9005, 0x19f8, 0x0500, ++ 0x0026, 0x2011, 0x6739, 0x080c, 0x781a, 0x2011, 0x672c, 0x080c, ++ 0x78e7, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70ac, 0x9005, ++ 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x193c, 0x2004, ++ 0x080c, 0x2471, 0x60e2, 0x2001, 0x180c, 0x200c, 0xc1b4, 0x2102, ++ 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, ++ 0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, 0x00e6, 0x2061, ++ 0x0100, 0x2071, 0x1800, 0x080c, 0xb752, 0x1904, 0x6b2e, 0x7130, ++ 0xd184, 0x1170, 0x080c, 0x2e69, 0x0138, 0xc18d, 0x7132, 0x2011, ++ 0x1853, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, 0x0904, 0x6b2e, ++ 0x2011, 0x1853, 0x220c, 0xd1a4, 0x0538, 0x0016, 0x2019, 0x000e, ++ 0x080c, 0xc941, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186, ++ 0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, 0x5c0d, 0x1170, ++ 0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, 0xc9c5, 0x2009, ++ 0x0001, 0x2011, 0x0100, 0x080c, 0x7a0a, 0x001e, 0x8108, 0x1f04, ++ 0x6af7, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, ++ 0x0002, 0x2019, 0x0004, 0x080c, 0x2ce5, 0x001e, 0x0078, 0x0156, ++ 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x5c0d, 0x1110, 0x080c, ++ 0x56f3, 0x8108, 0x1f04, 0x6b24, 0x00be, 0x015e, 0x080c, 0x1851, ++ 0x080c, 0x94da, 0x60e3, 0x0000, 0x080c, 0x56d9, 0x080c, 0x67be, ++ 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, ++ 0x2001, 0x194c, 0x2003, 0x0001, 0x0005, 0x2001, 0x194c, 0x2003, ++ 0x0000, 0x0005, 0x2001, 0x194b, 0x2003, 0xaaaa, 0x0005, 0x2001, ++ 0x194b, 0x2003, 0x0000, 0x0005, 0x2071, 0x18ee, 0x7003, 0x0000, ++ 0x7007, 0x0000, 0x080c, 0x0fc7, 0x090c, 0x0d84, 0xa8ab, 0xdcb0, ++ 0x2900, 0x704e, 0x080c, 0x0fc7, 0x090c, 0x0d84, 0xa8ab, 0xdcb0, ++ 0x2900, 0x7052, 0xa867, 0x0000, 0xa86b, 0x0001, 0xa89f, 0x0000, ++ 0x0005, 0x00e6, 0x2071, 0x0040, 0x6848, 0x9005, 0x1118, 0x9085, ++ 0x0001, 0x04b0, 0x6840, 0x9005, 0x0150, 0x04a1, 0x6a50, 0x9200, ++ 0x7002, 0x6854, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6850, ++ 0x7002, 0x6854, 0x7006, 0x6858, 0x700a, 0x685c, 0x700e, 0x6840, ++ 0x9005, 0x1110, 0x7012, 0x7016, 0x6848, 0x701a, 0x701c, 0x9085, ++ 0x0040, 0x701e, 0x2001, 0x0019, 0x7036, 0x702b, 0x0001, 0x2001, ++ 0x0004, 0x200c, 0x918c, 0xfff7, 0x918d, 0x8000, 0x2102, 0x00d6, ++ 0x2069, 0x18ee, 0x6807, 0x0001, 0x00de, 0x080c, 0x70f9, 0x9006, ++ 0x00ee, 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x2011, ++ 0x0100, 0x2214, 0x9296, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5, ++ 0x3e08, 0x1f04, 0x6bb6, 0x015e, 0x0005, 0x2079, 0x0040, 0x2071, ++ 0x18ee, 0x7004, 0x0002, 0x6bd5, 0x6bd6, 0x6c0b, 0x6c66, 0x6d61, ++ 0x6bd3, 0x6bd3, 0x6d8b, 0x080c, 0x0d84, 0x0005, 0x2079, 0x0040, ++ 0x782c, 0x908c, 0x0780, 0x190c, 0x7185, 0xd0a4, 0x01f0, 0x7824, ++ 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, ++ 0x0040, 0x12c0, 0x04db, 0x2001, 0x1800, 0x200c, 0x9186, 0x0003, ++ 0x1160, 0x7104, 0x9186, 0x0004, 0x0140, 0x9186, 0x0007, 0x0128, ++ 0x9186, 0x0003, 0x19e8, 0x080c, 0x6c66, 0x782c, 0xd09c, 0x090c, ++ 0x70f9, 0x0005, 0x9082, 0x005a, 0x1218, 0x2100, 0x002b, 0x0c18, ++ 0x080c, 0x6c9c, 0x0c90, 0x0005, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6cbe, 0x6c9c, 0x6c9c, 0x6c9c, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, ++ 0x6ca8, 0x6c9c, 0x6e60, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, ++ 0x6ca8, 0x6ea1, 0x6ee2, 0x6f29, 0x6f3d, 0x6c9c, 0x6c9c, 0x6cbe, ++ 0x6ca8, 0x6c9c, 0x6c9c, 0x6d35, 0x6fe8, 0x7003, 0x6c9c, 0x6cbe, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6d2b, 0x7003, 0x6c9c, 0x6c9c, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6cd2, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, ++ 0x6c9c, 0x7129, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6ce6, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x6c9c, 0x2079, 0x0040, ++ 0x7004, 0x9086, 0x0003, 0x1198, 0x782c, 0x080c, 0x7122, 0xd0a4, ++ 0x0170, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, ++ 0x00ff, 0x908a, 0x001a, 0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c, ++ 0x70f9, 0x0005, 0x6c9c, 0x6ca8, 0x6e4c, 0x6c9c, 0x6ca8, 0x6c9c, ++ 0x6ca8, 0x6ca8, 0x6c9c, 0x6ca8, 0x6e4c, 0x6ca8, 0x6ca8, 0x6ca8, ++ 0x6ca8, 0x6ca8, 0x6c9c, 0x6ca8, 0x6e4c, 0x6c9c, 0x6c9c, 0x6ca8, ++ 0x6c9c, 0x6c9c, 0x6c9c, 0x6ca8, 0x00e6, 0x2071, 0x18ee, 0x2009, ++ 0x0400, 0x0071, 0x00ee, 0x0005, 0x2009, 0x1000, 0x0049, 0x0005, ++ 0x2009, 0x2000, 0x0029, 0x0005, 0x2009, 0x0800, 0x0009, 0x0005, ++ 0x7007, 0x0001, 0xa868, 0x9084, 0x00ff, 0x9105, 0xa86a, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0x0005, 0xa864, 0x8007, ++ 0x9084, 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, ++ 0x6e0a, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, ++ 0x6e0a, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001, ++ 0x1120, 0x7007, 0x0001, 0x0804, 0x6e25, 0x7007, 0x0003, 0x7012, ++ 0x2900, 0x7016, 0x701a, 0x704b, 0x6e25, 0x0005, 0xa864, 0x8007, ++ 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x6ca4, 0x7007, 0x0001, ++ 0x2009, 0x1833, 0x210c, 0x81ff, 0x11a8, 0xa868, 0x9084, 0x00ff, ++ 0xa86a, 0xa883, 0x0000, 0x080c, 0x58e6, 0x1108, 0x0005, 0x0126, ++ 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a, 0xa982, 0x080c, 0x61a9, ++ 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071, 0x0d38, 0x9186, 0x0064, ++ 0x0d20, 0x9186, 0x007c, 0x0d08, 0x9186, 0x0028, 0x09f0, 0x9186, ++ 0x0038, 0x09d8, 0x9186, 0x0078, 0x09c0, 0x9186, 0x005f, 0x09a8, ++ 0x9186, 0x0056, 0x0990, 0xa897, 0x4005, 0xa89b, 0x0001, 0x2001, ++ 0x0030, 0x900e, 0x08a0, 0xa87c, 0x9084, 0x00c0, 0x9086, 0x00c0, ++ 0x1120, 0x7007, 0x0001, 0x0804, 0x701a, 0x2900, 0x7016, 0x701a, ++ 0x20a9, 0x0004, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0030, 0x2098, ++ 0x7050, 0x2040, 0xa060, 0x20e8, 0xa05c, 0x9080, 0x0023, 0x20a0, ++ 0x4003, 0xa888, 0x7012, 0x9082, 0x0401, 0x1a04, 0x6cac, 0xaab4, ++ 0x928a, 0x0002, 0x1a04, 0x6cac, 0x82ff, 0x1138, 0xa8b8, 0xa9bc, ++ 0x9105, 0x0118, 0x2001, 0x6dc8, 0x0018, 0x9280, 0x6dbe, 0x2005, ++ 0x7056, 0x7010, 0x9015, 0x0904, 0x6da9, 0x080c, 0x0fc7, 0x1118, ++ 0x7007, 0x0004, 0x0005, 0x2900, 0x7022, 0x7054, 0x2060, 0xe000, ++ 0xa866, 0xe004, 0x7050, 0x2040, 0xa95c, 0x9100, 0xa076, 0xa860, ++ 0xa072, 0xe008, 0x920a, 0x1210, 0x900e, 0x2200, 0x7112, 0xe20c, ++ 0x8003, 0x800b, 0x9296, 0x0004, 0x0108, 0x9108, 0xa17a, 0x810b, ++ 0xa17e, 0x080c, 0x108c, 0xa06c, 0x908e, 0x0100, 0x0170, 0x9086, ++ 0x0200, 0x0118, 0x7007, 0x0007, 0x0005, 0x7020, 0x2048, 0x080c, ++ 0x0fe0, 0x7014, 0x2048, 0x0804, 0x6cac, 0x7020, 0x2048, 0x7018, ++ 0xa802, 0xa807, 0x0000, 0x2908, 0x2048, 0xa906, 0x711a, 0x0804, ++ 0x6d61, 0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4, 0x9005, 0x1128, ++ 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864, 0x9084, 0x00ff, ++ 0x9086, 0x001e, 0x0904, 0x701a, 0x0804, 0x6e0a, 0x6dc0, 0x6dc4, ++ 0x0002, 0x001d, 0x0007, 0x0004, 0x000a, 0x001b, 0x0005, 0x0006, ++ 0x000a, 0x001d, 0x0005, 0x0004, 0x0076, 0x0066, 0xafb8, 0xaebc, ++ 0xa804, 0x2050, 0xb0c0, 0xb0e2, 0xb0bc, 0xb0de, 0xb0b8, 0xb0d2, ++ 0xb0b4, 0xb0ce, 0xb6da, 0xb7d6, 0xb0b0, 0xb0ca, 0xb0ac, 0xb0c6, ++ 0xb0a8, 0xb0ba, 0xb0a4, 0xb0b6, 0xb6c2, 0xb7be, 0xb0a0, 0xb0b2, ++ 0xb09c, 0xb0ae, 0xb098, 0xb0a2, 0xb094, 0xb09e, 0xb6aa, 0xb7a6, ++ 0xb090, 0xb09a, 0xb08c, 0xb096, 0xb088, 0xb08a, 0xb084, 0xb086, ++ 0xb692, 0xb78e, 0xb080, 0xb082, 0xb07c, 0xb07e, 0xb078, 0xb072, ++ 0xb074, 0xb06e, 0xb67a, 0xb776, 0xb004, 0x9055, 0x1958, 0x006e, ++ 0x007e, 0x0005, 0x2009, 0x1833, 0x210c, 0x81ff, 0x1178, 0x080c, ++ 0x5755, 0x1108, 0x0005, 0x080c, 0x63d1, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0xb374, 0x080c, 0x61a9, 0x012e, 0x0ca0, 0x080c, 0xb752, ++ 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70, 0x2009, 0x1833, 0x210c, ++ 0x81ff, 0x11d8, 0xa888, 0x9005, 0x01e0, 0xa883, 0x0000, 0xa87c, ++ 0xd0f4, 0x0120, 0x080c, 0x5849, 0x1138, 0x0005, 0x9006, 0xa87a, ++ 0x080c, 0x57e4, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa87a, ++ 0xa982, 0x080c, 0x61a9, 0x012e, 0x0cb0, 0x2001, 0x0028, 0x900e, ++ 0x0c98, 0x2001, 0x0000, 0x0c80, 0x7018, 0xa802, 0x2908, 0x2048, ++ 0xa906, 0x711a, 0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0003, ++ 0x0030, 0x7014, 0x2048, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, ++ 0x00b6, 0x7007, 0x0001, 0xa974, 0xa878, 0x9084, 0x00ff, 0x9096, ++ 0x0004, 0x0540, 0x20a9, 0x0001, 0x9096, 0x0001, 0x0190, 0x900e, ++ 0x20a9, 0x0800, 0x9096, 0x0002, 0x0160, 0x9005, 0x11d8, 0xa974, ++ 0x080c, 0x5c0d, 0x11b8, 0x0066, 0xae80, 0x080c, 0x5d1d, 0x006e, ++ 0x0088, 0x0046, 0x2011, 0x180c, 0x2224, 0xc484, 0x2412, 0x004e, ++ 0x00c6, 0x080c, 0x5c0d, 0x1110, 0x080c, 0x5e1d, 0x8108, 0x1f04, ++ 0x6e89, 0x00ce, 0xa87c, 0xd084, 0x1120, 0x080c, 0x0fe0, 0x00be, ++ 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0x00be, ++ 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x5f29, ++ 0x0580, 0x2061, 0x1a3d, 0x6100, 0xd184, 0x0178, 0xa888, 0x9084, ++ 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, 0x6004, 0x9005, 0x1538, ++ 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, 0x0001, 0xa890, ++ 0x9005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6016, 0xa888, 0x9084, ++ 0x00ff, 0x0178, 0x6006, 0xa888, 0x8007, 0x9084, 0x00ff, 0x0148, ++ 0x600a, 0xa888, 0x8000, 0x1108, 0xc28d, 0x6202, 0x012e, 0x0804, ++ 0x70e3, 0x012e, 0x0804, 0x70dd, 0x012e, 0x0804, 0x70d7, 0x012e, ++ 0x0804, 0x70da, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, ++ 0x5f29, 0x05e0, 0x2061, 0x1a3d, 0x6000, 0xd084, 0x05b8, 0x6204, ++ 0x6308, 0xd08c, 0x1530, 0xac78, 0x9484, 0x0003, 0x0170, 0xa988, ++ 0x918c, 0x00ff, 0x8001, 0x1120, 0x2100, 0x9210, 0x0620, 0x0028, ++ 0x8001, 0x1508, 0x2100, 0x9212, 0x02f0, 0x9484, 0x000c, 0x0188, ++ 0xa988, 0x810f, 0x918c, 0x00ff, 0x9082, 0x0004, 0x1120, 0x2100, ++ 0x9318, 0x0288, 0x0030, 0x9082, 0x0004, 0x1168, 0x2100, 0x931a, ++ 0x0250, 0xa890, 0x9005, 0x0110, 0x8000, 0x6016, 0x6206, 0x630a, ++ 0x012e, 0x0804, 0x70e3, 0x012e, 0x0804, 0x70e0, 0x012e, 0x0804, ++ 0x70dd, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1a3d, ++ 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e, ++ 0x0804, 0x70f1, 0x012e, 0x0804, 0x70e0, 0x00b6, 0x0126, 0x00c6, ++ 0x2091, 0x8000, 0x7007, 0x0001, 0xa87c, 0xd0ac, 0x0148, 0x00c6, ++ 0x2061, 0x1a3d, 0x6000, 0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440, ++ 0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065, 0x0598, 0x2001, 0x1833, ++ 0x2004, 0x9005, 0x0118, 0x080c, 0x9584, 0x0068, 0x6017, 0xf400, ++ 0x605b, 0x0000, 0xa97c, 0xd1a4, 0x0110, 0xa980, 0x615a, 0x2009, ++ 0x0041, 0x080c, 0x95ce, 0xa988, 0x918c, 0xff00, 0x9186, 0x2000, ++ 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, 0x080c, 0x7a0a, 0x002e, ++ 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a3d, 0x6000, 0xd08c, 0x1120, ++ 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, 0x00be, 0x0804, ++ 0x70e3, 0x00ce, 0x012e, 0x00be, 0x0804, 0x70dd, 0xa984, 0x9186, ++ 0x002e, 0x0d30, 0x9186, 0x002d, 0x0d18, 0x9186, 0x0045, 0x0510, ++ 0x9186, 0x002a, 0x1130, 0x2001, 0x180c, 0x200c, 0xc194, 0x2102, ++ 0x08b8, 0x9186, 0x0020, 0x0158, 0x9186, 0x0029, 0x1d10, 0xa974, ++ 0x080c, 0x5c0d, 0x1968, 0xb800, 0xc0e4, 0xb802, 0x0848, 0xa88c, ++ 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, 0x1953, 0x2004, 0x601a, ++ 0x0804, 0x6f78, 0xa88c, 0x9065, 0x0960, 0x00e6, 0xa890, 0x9075, ++ 0x2001, 0x1833, 0x2004, 0x9005, 0x0150, 0x080c, 0x9584, 0x8eff, ++ 0x0118, 0x2e60, 0x080c, 0x9584, 0x00ee, 0x0804, 0x6f78, 0x6024, ++ 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0xa8a0, 0x9005, ++ 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, 0xa8a8, 0x6016, 0x6003, ++ 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x00ee, 0x0804, 0x6f78, ++ 0x2061, 0x1a3d, 0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x70f1, ++ 0x0126, 0x2091, 0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, ++ 0x0804, 0x70f1, 0x012e, 0xa883, 0x0016, 0x0804, 0x70ea, 0xa883, ++ 0x0007, 0x0804, 0x70ea, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0130, ++ 0x8001, 0x1138, 0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x6ca4, ++ 0x0040, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, ++ 0x701a, 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x903e, ++ 0x2061, 0x1800, 0x61cc, 0x81ff, 0x1904, 0x709c, 0x6130, 0xd194, ++ 0x1904, 0x70c6, 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x0a04, 0x7090, ++ 0x6060, 0x9e02, 0x1a04, 0x7090, 0x7120, 0x9186, 0x0006, 0x1904, ++ 0x7082, 0x7010, 0x905d, 0x0904, 0x709c, 0xb800, 0xd0e4, 0x1904, ++ 0x70c0, 0x2061, 0x1a3d, 0x6100, 0x9184, 0x0301, 0x9086, 0x0001, ++ 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x70c9, 0xa883, 0x0000, 0xa803, ++ 0x0000, 0x2908, 0x7014, 0x9005, 0x1198, 0x7116, 0xa87c, 0xd0f4, ++ 0x1904, 0x70cc, 0x080c, 0x4dea, 0xd09c, 0x1118, 0xa87c, 0xc0cc, ++ 0xa87e, 0x2e60, 0x080c, 0x792a, 0x012e, 0x00ee, 0x00be, 0x0005, ++ 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, 0x2148, 0xa87c, 0xd0f4, ++ 0x1904, 0x70cc, 0x012e, 0x00ee, 0x00be, 0x0005, 0x012e, 0x00ee, ++ 0xa883, 0x0006, 0x00be, 0x0804, 0x70ea, 0xd184, 0x0db8, 0xd1c4, ++ 0x1190, 0x00a0, 0xa974, 0x080c, 0x5c0d, 0x15d0, 0xb800, 0xd0e4, ++ 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, 0xa883, 0x0002, 0x0490, ++ 0xa883, 0x0008, 0x0478, 0xa883, 0x000e, 0x0460, 0xa883, 0x0017, ++ 0x0448, 0xa883, 0x0035, 0x0430, 0x080c, 0x4dee, 0xd0fc, 0x01e8, ++ 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x02c0, 0x6060, 0x9e02, 0x12a8, ++ 0x7120, 0x9186, 0x0006, 0x1188, 0x7010, 0x905d, 0x0170, 0xb800, ++ 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0x9086, 0x0007, 0x1904, ++ 0x7026, 0x7003, 0x0002, 0x0804, 0x7026, 0xa883, 0x0028, 0x0010, ++ 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, 0x0420, 0xa883, 0x002a, ++ 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, 0x2019, 0x0002, 0x601b, ++ 0x0014, 0x080c, 0xc58e, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2009, ++ 0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028, ++ 0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0xa884, 0x9084, 0xff00, ++ 0x9105, 0xa886, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, ++ 0x0005, 0x080c, 0x0fe0, 0x0005, 0x00d6, 0x080c, 0x7921, 0x00de, ++ 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x0040, ++ 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, 0x190c, 0x7185, 0xd09c, ++ 0x11a8, 0x2071, 0x1800, 0x70bc, 0x90ea, 0x0040, 0x0278, 0x8001, ++ 0x70be, 0x702c, 0x2048, 0xa800, 0x702e, 0x9006, 0xa802, 0xa806, ++ 0x2071, 0x0040, 0x2900, 0x7022, 0x702c, 0x0c28, 0x012e, 0x00ee, ++ 0x00de, 0x0005, 0x0006, 0x9084, 0x0780, 0x190c, 0x7185, 0x000e, ++ 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, 0x7007, ++ 0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04, 0x7176, 0xa97c, 0x9188, ++ 0x1000, 0x2104, 0x905d, 0xb804, 0xd284, 0x0140, 0x05e8, 0x8007, ++ 0x9084, 0x00ff, 0x9084, 0x0006, 0x1108, 0x04b0, 0x2b10, 0x080c, ++ 0x94fe, 0x1118, 0x080c, 0x95a1, 0x05a8, 0x6212, 0xa874, 0x0002, ++ 0x7154, 0x7159, 0x715c, 0x7162, 0x2019, 0x0002, 0x080c, 0xc941, ++ 0x0060, 0x080c, 0xc8dd, 0x0048, 0x2019, 0x0002, 0xa980, 0x080c, ++ 0xc8f8, 0x0018, 0xa980, 0x080c, 0xc8dd, 0x080c, 0x9554, 0xa887, ++ 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0x00be, ++ 0x001e, 0x002e, 0x003e, 0x00ce, 0x00de, 0x0005, 0xa887, 0x0006, ++ 0x0c80, 0xa887, 0x0002, 0x0c68, 0xa887, 0x0005, 0x0c50, 0xa887, ++ 0x0004, 0x0c38, 0xa887, 0x0007, 0x0c20, 0x2091, 0x8000, 0x0e04, ++ 0x7187, 0x0006, 0x0016, 0x2001, 0x8003, 0x0006, 0x0804, 0x0d8d, ++ 0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, 0x0200, 0x200c, 0xc1e5, ++ 0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120, 0x080c, ++ 0x1426, 0x00fe, 0x0005, 0x2001, 0x020d, 0x2003, 0x0020, 0x781f, ++ 0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c, 0x05e8, 0x7d44, 0x7c40, ++ 0x9584, 0x00f6, 0x1508, 0x9484, 0x7000, 0x0138, 0x908a, 0x2000, ++ 0x1258, 0x9584, 0x0700, 0x8007, 0x04a8, 0x7000, 0x9084, 0xff00, ++ 0x9086, 0x8100, 0x0db0, 0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000, ++ 0x9084, 0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, 0xcce2, 0x080c, ++ 0x7692, 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, ++ 0x76f0, 0x19c8, 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c, 0x724d, ++ 0x080c, 0x1f79, 0x005e, 0x004e, 0x0020, 0x080c, 0xcce2, 0x7817, ++ 0x0140, 0x080c, 0x722e, 0x2001, 0x19bd, 0x2004, 0x9005, 0x090c, ++ 0x8125, 0x0005, 0x0002, 0x7204, 0x74c3, 0x71fb, 0x71fb, 0x71fb, ++ 0x71fb, 0x71fb, 0x71fb, 0x7817, 0x0140, 0x2001, 0x19bd, 0x2004, ++ 0x9005, 0x090c, 0x8125, 0x0005, 0x7000, 0x908c, 0xff00, 0x9194, ++ 0xf000, 0x810f, 0x9484, 0x0fff, 0x688a, 0x9286, 0x2000, 0x1150, ++ 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x4e04, 0x0070, 0x080c, ++ 0x726d, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x73fe, 0x0028, ++ 0x9286, 0x8000, 0x1110, 0x080c, 0x75c8, 0x7817, 0x0140, 0x2001, ++ 0x19bd, 0x2004, 0x9005, 0x090c, 0x8125, 0x0005, 0x2001, 0x180f, ++ 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, ++ 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x447f, ++ 0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, ++ 0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036, 0x0046, 0x0056, ++ 0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019, 0xffff, 0x2001, ++ 0x180f, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800, 0x2004, 0x9086, ++ 0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c, 0x447f, 0x002e, ++ 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, 0x00c6, 0x7010, ++ 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, 0x9096, 0x0023, ++ 0x1904, 0x73cf, 0x9186, 0x0023, 0x1550, 0x080c, 0x7657, 0x0904, ++ 0x73cf, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, ++ 0x0015, 0x080c, 0x95ce, 0x0804, 0x73cf, 0x908e, 0x0214, 0x0118, ++ 0x908e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, 0x95ce, 0x0804, ++ 0x73cf, 0x908e, 0x0100, 0x1904, 0x73cf, 0x7034, 0x9005, 0x1904, ++ 0x73cf, 0x2009, 0x0016, 0x080c, 0x95ce, 0x0804, 0x73cf, 0x9186, ++ 0x0022, 0x1904, 0x73cf, 0x7030, 0x908e, 0x0300, 0x1580, 0x68d8, ++ 0xd0a4, 0x0528, 0xc0b5, 0x68da, 0x7100, 0x918c, 0x00ff, 0x6976, ++ 0x7004, 0x687a, 0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, ++ 0x9084, 0x00ff, 0x0016, 0x2008, 0x080c, 0x2446, 0x7932, 0x7936, ++ 0x001e, 0x000e, 0x00fe, 0x080c, 0x23fd, 0x6956, 0x703c, 0x00e6, ++ 0x2071, 0x0140, 0x7086, 0x2071, 0x1800, 0x70ae, 0x00ee, 0x7034, ++ 0x9005, 0x1904, 0x73cf, 0x2009, 0x0017, 0x0804, 0x739c, 0x908e, ++ 0x0400, 0x1190, 0x7034, 0x9005, 0x1904, 0x73cf, 0x080c, 0x6877, ++ 0x0120, 0x2009, 0x001d, 0x0804, 0x739c, 0x68d8, 0xc0a5, 0x68da, ++ 0x2009, 0x0030, 0x0804, 0x739c, 0x908e, 0x0500, 0x1140, 0x7034, ++ 0x9005, 0x1904, 0x73cf, 0x2009, 0x0018, 0x0804, 0x739c, 0x908e, ++ 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, 0x739c, 0x908e, 0x2110, ++ 0x1120, 0x2009, 0x001a, 0x0804, 0x739c, 0x908e, 0x5200, 0x1140, ++ 0x7034, 0x9005, 0x1904, 0x73cf, 0x2009, 0x001b, 0x0804, 0x739c, ++ 0x908e, 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, 0x73cf, 0x2009, ++ 0x001c, 0x0804, 0x739c, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, ++ 0x0804, 0x739c, 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, ++ 0x73cf, 0x2009, 0x0024, 0x0804, 0x739c, 0x908c, 0xff00, 0x918e, ++ 0x2400, 0x1120, 0x2009, 0x002d, 0x0804, 0x739c, 0x908c, 0xff00, ++ 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x739c, 0x908e, ++ 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x739c, 0x908e, 0x5300, ++ 0x1108, 0x00d8, 0x908e, 0x6104, 0x11c0, 0x2011, 0x026d, 0x8208, ++ 0x2204, 0x9082, 0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015, ++ 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x447f, 0x004e, 0x8108, ++ 0x1f04, 0x735e, 0x2009, 0x0023, 0x0478, 0x908e, 0x6000, 0x1118, ++ 0x2009, 0x003f, 0x0448, 0x908e, 0x7800, 0x1118, 0x2009, 0x0045, ++ 0x0418, 0x908e, 0x1000, 0x1118, 0x2009, 0x004e, 0x00e8, 0x908e, ++ 0x6300, 0x1118, 0x2009, 0x004a, 0x00b8, 0x908c, 0xff00, 0x918e, ++ 0x5600, 0x1118, 0x2009, 0x004f, 0x0078, 0x908c, 0xff00, 0x918e, ++ 0x5700, 0x1118, 0x2009, 0x0050, 0x0038, 0x2009, 0x001d, 0x6834, ++ 0xd0d4, 0x0110, 0x2009, 0x004c, 0x0016, 0x2011, 0x0263, 0x2204, ++ 0x8211, 0x220c, 0x080c, 0x23fd, 0x1568, 0x080c, 0x5bb0, 0x1550, ++ 0xbe12, 0xbd16, 0x001e, 0x0016, 0xb8b0, 0x9005, 0x1168, 0x9186, ++ 0x0046, 0x1150, 0x6874, 0x9606, 0x1138, 0x6878, 0x9506, 0x9084, ++ 0xff00, 0x1110, 0x001e, 0x0098, 0x080c, 0x94fe, 0x01a8, 0x2b08, ++ 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, ++ 0x1110, 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0x95ce, 0x00ce, ++ 0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180d, 0x2004, 0xd0ec, ++ 0x0120, 0x2011, 0x8049, 0x080c, 0x447f, 0x080c, 0x95a1, 0x0d90, ++ 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x0016, ++ 0x9186, 0x0017, 0x0118, 0x9186, 0x0030, 0x1128, 0x6007, 0x0009, ++ 0x6017, 0x2900, 0x0020, 0x6007, 0x0051, 0x6017, 0x0000, 0x602f, ++ 0x0009, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x08a0, 0x080c, 0x2e39, ++ 0x1140, 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, ++ 0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, ++ 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c, 0x7657, 0x0904, 0x745b, ++ 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, ++ 0x15d0, 0x2009, 0x0015, 0x080c, 0x95ce, 0x04a8, 0x908e, 0x0100, ++ 0x1590, 0x7034, 0x9005, 0x1578, 0x2009, 0x0016, 0x080c, 0x95ce, ++ 0x0450, 0x9186, 0x0032, 0x1538, 0x7030, 0x908e, 0x1400, 0x1518, ++ 0x2009, 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, ++ 0x080c, 0x23fd, 0x11b8, 0x080c, 0x5bb0, 0x11a0, 0xbe12, 0xbd16, ++ 0x080c, 0x94fe, 0x0178, 0x2b08, 0x6112, 0x080c, 0xb4e6, 0x6023, ++ 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x95ce, 0x080c, 0x8125, ++ 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x00be, 0x0005, 0x00b6, ++ 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0x9696, 0x00ff, 0x11b8, ++ 0x9592, 0xfffc, 0x02a0, 0x9596, 0xfffd, 0x1120, 0x2009, 0x007f, ++ 0x0804, 0x74bd, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, ++ 0x74bd, 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011, ++ 0x0000, 0x2019, 0x1836, 0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9, ++ 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x0081, 0x20a9, 0x077f, ++ 0x2071, 0x1081, 0x2e1c, 0x93dd, 0x0000, 0x1140, 0x82ff, 0x11d0, ++ 0x9496, 0x00ff, 0x01b8, 0x2410, 0xc2fd, 0x00a0, 0xbf10, 0x2600, ++ 0x9706, 0xb814, 0x1120, 0x9546, 0x1110, 0x2408, 0x00b0, 0x9745, ++ 0x1148, 0x94c6, 0x007e, 0x0130, 0x94c6, 0x007f, 0x0118, 0x94c6, ++ 0x0080, 0x1d20, 0x8420, 0x8e70, 0x1f04, 0x7492, 0x82ff, 0x1118, ++ 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, ++ 0x004e, 0x00be, 0x0005, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184, ++ 0x000f, 0x0002, 0x74da, 0x74da, 0x74da, 0x7669, 0x74da, 0x74e3, ++ 0x750e, 0x759d, 0x74da, 0x74da, 0x74da, 0x74da, 0x74da, 0x74da, ++ 0x74da, 0x74da, 0x7817, 0x0140, 0x2001, 0x19bd, 0x2004, 0x9005, ++ 0x090c, 0x8125, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, ++ 0x2160, 0x9c8c, 0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8, 0x6860, ++ 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, ++ 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, ++ 0x2009, 0x0046, 0x080c, 0x95ce, 0x7817, 0x0140, 0x2001, 0x19bd, ++ 0x2004, 0x9005, 0x090c, 0x8125, 0x00be, 0x0005, 0x00b6, 0x00c6, ++ 0x9484, 0x0fff, 0x0904, 0x7573, 0x7110, 0xd1bc, 0x1904, 0x7573, ++ 0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, ++ 0x15b8, 0x81ff, 0x15a8, 0x9080, 0x2e6e, 0x200d, 0x918c, 0xff00, ++ 0x810f, 0x2001, 0x0080, 0x9106, 0x0904, 0x7573, 0x080c, 0x5bb0, ++ 0x1904, 0x7573, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15e0, 0xba04, ++ 0x9294, 0xff00, 0x9286, 0x0600, 0x11a0, 0x080c, 0x94fe, 0x05f0, ++ 0x2b08, 0x7028, 0x604a, 0x702c, 0x6046, 0x6112, 0x6023, 0x0006, ++ 0x7120, 0x610a, 0x7130, 0x6156, 0x2009, 0x0044, 0x080c, 0xbfdb, ++ 0x0410, 0x080c, 0x5f2d, 0x2010, 0x1138, 0xb807, 0x0606, 0x0c28, ++ 0x190c, 0x745f, 0x11c0, 0x0890, 0x080c, 0x94fe, 0x2b08, 0x0198, ++ 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x9286, 0x0004, 0x1118, ++ 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x7817, 0x0140, 0x2001, 0x19bd, 0x2004, ++ 0x9005, 0x090c, 0x8125, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180d, ++ 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x447f, 0x080c, ++ 0x95a1, 0x0d48, 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, ++ 0x7130, 0x6156, 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041, ++ 0x080c, 0x7bcb, 0x080c, 0x8125, 0x08b0, 0x00b6, 0x7110, 0xd1bc, ++ 0x01e8, 0x7020, 0x2060, 0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0, ++ 0x02a8, 0x6860, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, ++ 0x2158, 0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, ++ 0x7124, 0x610a, 0x2009, 0x0045, 0x080c, 0x95ce, 0x7817, 0x0140, ++ 0x2001, 0x19bd, 0x2004, 0x9005, 0x090c, 0x8125, 0x00be, 0x0005, ++ 0x080c, 0x2e39, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, ++ 0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, ++ 0x0005, 0x75df, 0x75e0, 0x75df, 0x75df, 0x763f, 0x764b, 0x0005, ++ 0x00b6, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x763d, ++ 0x700c, 0x7108, 0x080c, 0x23fd, 0x1904, 0x763d, 0x080c, 0x5bb0, ++ 0x1904, 0x763d, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8, 0x080c, ++ 0x5f2d, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, 0x7657, ++ 0x00ce, 0x05d8, 0x080c, 0x94fe, 0x2b08, 0x05b8, 0x6112, 0x080c, ++ 0xb4e6, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, ++ 0x95ce, 0x0458, 0x080c, 0x5f2d, 0x0148, 0x9086, 0x0004, 0x0130, ++ 0x080c, 0x5f35, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, 0x94fe, ++ 0x2b08, 0x01d8, 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0005, 0x7120, ++ 0x610a, 0x2009, 0x0088, 0x080c, 0x95ce, 0x0078, 0x080c, 0x94fe, ++ 0x2b08, 0x0158, 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0004, 0x7120, ++ 0x610a, 0x2009, 0x0001, 0x080c, 0x95ce, 0x00be, 0x0005, 0x7110, ++ 0xd1bc, 0x0140, 0x00a1, 0x0130, 0x7124, 0x610a, 0x2009, 0x0089, ++ 0x080c, 0x95ce, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x0041, 0x0130, ++ 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0x95ce, 0x0005, 0x7020, ++ 0x2060, 0x9c84, 0x0007, 0x1158, 0x9c82, 0x1cd0, 0x0240, 0x2001, ++ 0x1818, 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, ++ 0x0ce8, 0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, ++ 0x0007, 0x11b0, 0x9c82, 0x1cd0, 0x0298, 0x6860, 0x9c02, 0x1280, ++ 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140, ++ 0x700c, 0xb914, 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0x95ce, ++ 0x7817, 0x0140, 0x2001, 0x19bd, 0x2004, 0x9005, 0x090c, 0x8125, ++ 0x00be, 0x0005, 0x2031, 0x0105, 0x0069, 0x0005, 0x2031, 0x0206, ++ 0x0049, 0x0005, 0x2031, 0x0207, 0x0029, 0x0005, 0x2031, 0x0213, ++ 0x0009, 0x0005, 0x00c6, 0x0096, 0x00f6, 0x7000, 0x9084, 0xf000, ++ 0x9086, 0xc000, 0x05d0, 0x080c, 0x94fe, 0x05b8, 0x0066, 0x00c6, ++ 0x0046, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x23fd, ++ 0x15a0, 0x080c, 0x5bb0, 0x1588, 0xbe12, 0xbd16, 0x2b00, 0x004e, ++ 0x00ce, 0x6012, 0x080c, 0xb4e6, 0x080c, 0x0fae, 0x0510, 0x2900, ++ 0x605a, 0x9006, 0xa802, 0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b, ++ 0x20a9, 0x000e, 0xa860, 0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98, ++ 0x4003, 0x006e, 0x6616, 0x6007, 0x003e, 0x6023, 0x0001, 0x6003, ++ 0x0001, 0x080c, 0x7c1d, 0x080c, 0x8125, 0x00fe, 0x009e, 0x00ce, ++ 0x0005, 0x080c, 0x9554, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, ++ 0x00c6, 0x7000, 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086, ++ 0x2000, 0x1904, 0x7747, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, ++ 0x2004, 0x9005, 0x1904, 0x7749, 0x7030, 0x908e, 0x0400, 0x0904, ++ 0x7749, 0x908e, 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, ++ 0x0300, 0x11d8, 0x2009, 0x1836, 0x210c, 0xd18c, 0x1590, 0xd1a4, ++ 0x1580, 0x080c, 0x5eeb, 0x0558, 0x68a8, 0x9084, 0x00ff, 0x7100, ++ 0x918c, 0x00ff, 0x9106, 0x1518, 0x6878, 0x69a8, 0x918c, 0xff00, ++ 0x9105, 0x7104, 0x9106, 0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c, ++ 0xd1b4, 0x11a8, 0x908e, 0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0, ++ 0x908e, 0x5000, 0x09b8, 0x0058, 0x9186, 0x0023, 0x1140, 0x080c, ++ 0x7657, 0x0128, 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, ++ 0x0010, 0x9085, 0x0001, 0x00ce, 0x0005, 0x2071, 0x19c7, 0x7003, ++ 0x0003, 0x700f, 0x0361, 0x9006, 0x701a, 0x7076, 0x7012, 0x7017, ++ 0x1cd0, 0x7007, 0x0000, 0x7026, 0x702b, 0x8b66, 0x7032, 0x7037, ++ 0x8bc9, 0x703f, 0xffff, 0x7043, 0xffff, 0x7046, 0x704b, 0x4c8b, ++ 0x704e, 0x705f, 0x78ae, 0x080c, 0x0fc7, 0x090c, 0x0d84, 0x2900, ++ 0x703a, 0xa867, 0x0003, 0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, ++ 0x2071, 0x19c7, 0x1d04, 0x7809, 0x2091, 0x6000, 0x700c, 0x8001, ++ 0x700e, 0x1510, 0x2001, 0x1874, 0x2004, 0xd0c4, 0x0158, 0x3a00, ++ 0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, ++ 0x080c, 0x0d84, 0x700f, 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x78f3, 0x7044, 0x900d, 0x0148, 0x8109, 0x7146, ++ 0x1130, 0x7048, 0x080f, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024, ++ 0x900d, 0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009, ++ 0x8109, 0x7126, 0x9186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff, ++ 0x1110, 0x7028, 0x080f, 0x7030, 0x900d, 0x0180, 0x702c, 0x8001, ++ 0x702e, 0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, 0x9184, ++ 0x007f, 0x090c, 0x8c48, 0x0010, 0x7034, 0x080f, 0x703c, 0x9005, ++ 0x0118, 0x0310, 0x8001, 0x703e, 0x7040, 0x9005, 0x0118, 0x0310, ++ 0x8001, 0x7042, 0x7050, 0x900d, 0x0168, 0x704c, 0x8001, 0x704e, ++ 0x1148, 0x704f, 0x0009, 0x8109, 0x7152, 0x1120, 0x7154, 0x7152, ++ 0x705c, 0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7074, 0x900d, ++ 0x0158, 0x7070, 0x8001, 0x7072, 0x1138, 0x7073, 0x0009, 0x8109, ++ 0x7176, 0x1110, 0x7078, 0x080f, 0x001e, 0x7008, 0x8001, 0x700a, ++ 0x1138, 0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c, 0x080f, ++ 0x012e, 0x7004, 0x0002, 0x782f, 0x7830, 0x784a, 0x00e6, 0x2071, ++ 0x19c7, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009, ++ 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19c7, 0x701c, 0x9206, ++ 0x1110, 0x701a, 0x701e, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, ++ 0x19c7, 0xb888, 0x9102, 0x0208, 0xb98a, 0x00ee, 0x0005, 0x0005, ++ 0x00b6, 0x7110, 0x080c, 0x5c0d, 0x1158, 0xb888, 0x8001, 0x0240, ++ 0xb88a, 0x1130, 0x0126, 0x2091, 0x8000, 0x080c, 0x8125, 0x012e, ++ 0x8108, 0x9182, 0x0800, 0x0218, 0x900e, 0x7007, 0x0002, 0x7112, ++ 0x00be, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, 0x6040, ++ 0x9005, 0x0128, 0x8001, 0x6042, 0x1110, 0x080c, 0xb38b, 0x6018, ++ 0x9005, 0x0510, 0x8001, 0x601a, 0x11f8, 0x6120, 0x9186, 0x0003, ++ 0x0118, 0x9186, 0x0006, 0x11b0, 0x6014, 0x2048, 0xa884, 0x908a, ++ 0x199a, 0x0280, 0x9082, 0x1999, 0xa886, 0x908a, 0x199a, 0x0210, ++ 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, ++ 0xd0e4, 0x0110, 0x080c, 0xaddd, 0x012e, 0x9c88, 0x0018, 0x7116, ++ 0x2001, 0x1818, 0x2004, 0x9102, 0x0220, 0x7017, 0x1cd0, 0x7007, ++ 0x0000, 0x0005, 0x00e6, 0x2071, 0x19c7, 0x7027, 0x07d0, 0x7023, ++ 0x0009, 0x00ee, 0x0005, 0x2001, 0x19d0, 0x2003, 0x0000, 0x0005, ++ 0x00e6, 0x2071, 0x19c7, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, ++ 0x2011, 0x19d3, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19c7, ++ 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, ++ 0x7058, 0x8000, 0x705a, 0x2001, 0x19d5, 0x2044, 0xa06c, 0x9086, ++ 0x0000, 0x0150, 0x706c, 0xa09a, 0x7068, 0xa096, 0x7064, 0xa092, ++ 0x7060, 0xa08e, 0x080c, 0x108c, 0x002e, 0x008e, 0x0005, 0x0006, ++ 0x0016, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, ++ 0x0156, 0x080c, 0x7778, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, ++ 0x00be, 0x00ae, 0x009e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, ++ 0x19c7, 0x7176, 0x727a, 0x7073, 0x0009, 0x00ee, 0x0005, 0x00e6, ++ 0x0006, 0x2071, 0x19c7, 0x7078, 0x9206, 0x1110, 0x7076, 0x707a, ++ 0x000e, 0x00ee, 0x0005, 0x2069, 0x1800, 0x69ec, 0xd1e4, 0x1518, ++ 0x0026, 0xd1ec, 0x0140, 0x684c, 0x9082, 0x0200, 0x0288, 0x8117, ++ 0x9294, 0x00c0, 0x0088, 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, ++ 0x0007, 0x0110, 0x69ee, 0x0070, 0x8107, 0x9084, 0x0007, 0x910d, ++ 0x8107, 0x9106, 0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205, 0x68ee, ++ 0x080c, 0x0e8d, 0x002e, 0x0005, 0x00c6, 0x2061, 0x1a3d, 0x00ce, ++ 0x0005, 0x9184, 0x000f, 0x8003, 0x8003, 0x8003, 0x9080, 0x1a3d, ++ 0x2060, 0x0005, 0xa884, 0x908a, 0x199a, 0x1638, 0x9005, 0x1150, ++ 0x00c6, 0x2061, 0x1a3d, 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001, ++ 0x001e, 0x0018, 0x908e, 0xffff, 0x01b0, 0x8003, 0x800b, 0x810b, ++ 0x9108, 0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904, ++ 0x79b4, 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x798d, 0x2009, 0x0006, ++ 0x080c, 0x79e1, 0x0005, 0x900e, 0x0c60, 0x2001, 0x1999, 0x08b0, ++ 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, ++ 0x79db, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4, ++ 0x11e8, 0x2009, 0x1874, 0x2104, 0xd084, 0x1138, 0x87ff, 0x1120, ++ 0x2009, 0x0043, 0x0804, 0x95ce, 0x0005, 0x87ff, 0x1de8, 0x2009, ++ 0x0042, 0x0804, 0x95ce, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, ++ 0xd1ac, 0x0d20, 0x6024, 0xc0cd, 0x6026, 0x0c00, 0xc0d4, 0x6026, ++ 0xa890, 0x602e, 0xa88c, 0x6032, 0x08e0, 0xd0fc, 0x0160, 0x908c, ++ 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x79db, 0x908c, 0x2020, ++ 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78, 0x080c, 0x150d, ++ 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x95ce, ++ 0x0005, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d58, ++ 0x6124, 0xc1cd, 0x6126, 0x0c38, 0xd0fc, 0x0188, 0x908c, 0x2020, ++ 0x918e, 0x2020, 0x01a8, 0x9084, 0x0003, 0x908e, 0x0002, 0x0148, ++ 0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0x95ce, 0x0005, 0x00b9, ++ 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x95ce, 0x0cb0, ++ 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6124, ++ 0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019, 0x0005, 0x2009, ++ 0x0001, 0x0096, 0x080c, 0xb0ad, 0x0518, 0x6014, 0x2048, 0xa982, ++ 0xa800, 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c, 0x918c, 0x8100, ++ 0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a3d, 0x6200, 0xd28c, ++ 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, 0x5ff7, ++ 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c, 0x792a, 0x007e, ++ 0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a3d, 0x6000, 0x81ff, ++ 0x0110, 0x9205, 0x0008, 0x9204, 0x6002, 0x00ce, 0x015e, 0x0005, ++ 0x6800, 0xd08c, 0x1138, 0x6808, 0x9005, 0x0120, 0x8001, 0x680a, ++ 0x9085, 0x0001, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x0046, ++ 0x20a9, 0x0010, 0x9006, 0x8004, 0x2019, 0x0100, 0x231c, 0x93a6, ++ 0x0008, 0x1118, 0x8086, 0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6, ++ 0x3e08, 0x1208, 0x9200, 0x1f04, 0x7a2c, 0x93a6, 0x0008, 0x1118, ++ 0x8086, 0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6, 0x3e08, 0x004e, ++ 0x003e, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0076, 0x0156, ++ 0x20a9, 0x0010, 0x9005, 0x0510, 0x911a, 0x1600, 0x8213, 0x2039, ++ 0x0100, 0x273c, 0x97be, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5, ++ 0x3e08, 0x0228, 0x911a, 0x1220, 0x1f04, 0x7a56, 0x0028, 0x911a, ++ 0x2308, 0x8210, 0x1f04, 0x7a56, 0x0006, 0x3200, 0x9084, 0xefff, ++ 0x2080, 0x000e, 0x015e, 0x007e, 0x012e, 0x0005, 0x0006, 0x3200, ++ 0x9085, 0x1000, 0x0ca8, 0x0126, 0x2091, 0x2800, 0x2079, 0x19b4, ++ 0x012e, 0x00d6, 0x2069, 0x19b4, 0x6803, 0x0005, 0x0156, 0x0146, ++ 0x01d6, 0x20e9, 0x0000, 0x2069, 0x0200, 0x080c, 0x9363, 0x0401, ++ 0x080c, 0x934e, 0x00e9, 0x080c, 0x9351, 0x00d1, 0x080c, 0x9354, ++ 0x00b9, 0x080c, 0x9357, 0x00a1, 0x080c, 0x935a, 0x0089, 0x080c, ++ 0x935d, 0x0071, 0x080c, 0x9360, 0x0059, 0x01de, 0x014e, 0x015e, ++ 0x2069, 0x0004, 0x2d04, 0x9085, 0x8001, 0x206a, 0x00de, 0x0005, ++ 0x20a9, 0x0020, 0x20a1, 0x0240, 0x9006, 0x4004, 0x0005, 0x00c6, ++ 0x6027, 0x0001, 0x7804, 0x9084, 0x0007, 0x0002, 0x7ac8, 0x7aec, ++ 0x7b36, 0x7ace, 0x7aec, 0x7ac8, 0x7ac6, 0x7ac6, 0x080c, 0x0d84, ++ 0x080c, 0x7893, 0x080c, 0x8125, 0x00ce, 0x0005, 0x62c0, 0x82ff, ++ 0x1110, 0x00ce, 0x0005, 0x2011, 0x554d, 0x080c, 0x781a, 0x7828, ++ 0x9092, 0x00c8, 0x1228, 0x8000, 0x782a, 0x080c, 0x558a, 0x0c88, ++ 0x62c0, 0x080c, 0x9367, 0x080c, 0x554d, 0x7807, 0x0003, 0x7827, ++ 0x0000, 0x782b, 0x0000, 0x0c28, 0x080c, 0x7893, 0x6220, 0xd2a4, ++ 0x0178, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, 0x9065, ++ 0x090c, 0x0d84, 0x2009, 0x0013, 0x080c, 0x95ce, 0x00ce, 0x0005, ++ 0x00c6, 0x7824, 0x9065, 0x090c, 0x0d84, 0x7804, 0x9086, 0x0004, ++ 0x0904, 0x7b74, 0x7828, 0x9092, 0xc350, 0x1230, 0x8000, 0x782a, ++ 0x00ce, 0x080c, 0x8b2c, 0x0c50, 0x2011, 0x0130, 0x2214, 0x080c, ++ 0x9367, 0x6104, 0x9186, 0x0003, 0x1188, 0x00e6, 0x2071, 0x1800, ++ 0x70e4, 0x00ee, 0xd08c, 0x0150, 0x00c6, 0x00e6, 0x2061, 0x0100, ++ 0x2071, 0x1800, 0x080c, 0x55a0, 0x00ee, 0x00ce, 0x080c, 0xcd1f, ++ 0x2009, 0x0014, 0x080c, 0x95ce, 0x00ce, 0x0840, 0x2001, 0x19d0, ++ 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, ++ 0x9065, 0x090c, 0x0d84, 0x2009, 0x0013, 0x080c, 0x9620, 0x00ce, ++ 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x7824, 0x9005, 0x090c, 0x0d84, ++ 0x781c, 0x905d, 0x090c, 0x0d84, 0x080c, 0x9367, 0xb800, 0xc0dc, ++ 0xb802, 0x7924, 0x2160, 0x080c, 0x9554, 0xb93c, 0x81ff, 0x090c, ++ 0x0d84, 0x8109, 0xb93e, 0xb854, 0x9015, 0x0110, 0x7a1e, 0x0010, ++ 0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce, ++ 0x00be, 0x080c, 0x8125, 0x0898, 0x6104, 0x9186, 0x0002, 0x0128, ++ 0x9186, 0x0004, 0x0110, 0x0804, 0x7b0a, 0x7808, 0x9c06, 0x0904, ++ 0x7b0a, 0x080c, 0x8026, 0x080c, 0x7c1d, 0x00ce, 0x080c, 0x8125, ++ 0x0804, 0x7afe, 0x00c6, 0x6024, 0x6027, 0x0002, 0xd0f4, 0x1580, ++ 0x62c8, 0x60c4, 0x9205, 0x1170, 0x783c, 0x9065, 0x0130, 0x2009, ++ 0x0049, 0x080c, 0x95ce, 0x00ce, 0x0005, 0x2011, 0x19d3, 0x2013, ++ 0x0000, 0x0cc8, 0x793c, 0x81ff, 0x0dc0, 0x7944, 0x9192, 0x7530, ++ 0x12f0, 0x8108, 0x7946, 0x793c, 0x9188, 0x0008, 0x210c, 0x918e, ++ 0x0006, 0x1138, 0x6014, 0x9084, 0x1984, 0x9085, 0x0012, 0x6016, ++ 0x0c10, 0x6014, 0x9084, 0x1984, 0x9085, 0x0016, 0x6016, 0x08d8, ++ 0x793c, 0x2160, 0x2009, 0x004a, 0x080c, 0x95ce, 0x08a0, 0x7848, ++ 0xc085, 0x784a, 0x0880, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, ++ 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b4, 0x6020, 0x8000, ++ 0x6022, 0x6010, 0x9005, 0x0148, 0x9080, 0x0003, 0x2102, 0x6112, ++ 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, ++ 0x00d6, 0x2069, 0x19b4, 0xb800, 0xd0d4, 0x01b8, 0x6820, 0x8000, ++ 0x6822, 0x9086, 0x0001, 0x1110, 0x2b00, 0x681e, 0x2001, 0x180c, ++ 0x2004, 0xd0fc, 0x0118, 0x00de, 0x0804, 0x8125, 0x6804, 0x9084, ++ 0x0007, 0x0804, 0x813c, 0x00de, 0x0005, 0xc0d5, 0xb802, 0x6818, ++ 0x9005, 0x0168, 0xb856, 0xb85b, 0x0000, 0x0086, 0x0006, 0x2b00, ++ 0x681a, 0x008e, 0xa05a, 0x008e, 0x2069, 0x19b4, 0x08b8, 0xb856, ++ 0xb85a, 0x2b00, 0x681a, 0x681e, 0x0888, 0x0006, 0x0016, 0x00c6, ++ 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b4, ++ 0x6020, 0x8000, 0x6022, 0x6008, 0x9005, 0x0148, 0x9080, 0x0003, ++ 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x610e, ++ 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b4, ++ 0x6034, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, 0x6136, 0x00ce, ++ 0x0005, 0x613a, 0x6136, 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, ++ 0x00c6, 0x00b6, 0x0096, 0x0076, 0x0066, 0x0056, 0x0036, 0x0026, ++ 0x0016, 0x0006, 0x0126, 0x902e, 0x2071, 0x19b4, 0x7638, 0x2660, ++ 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x7cc4, 0x6010, 0x2058, ++ 0xb8a0, 0x9206, 0x1904, 0x7cbf, 0x87ff, 0x0120, 0x6054, 0x9106, ++ 0x1904, 0x7cbf, 0x703c, 0x9c06, 0x1178, 0x0036, 0x2019, 0x0001, ++ 0x080c, 0x8dfe, 0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046, ++ 0x704a, 0x003e, 0x2029, 0x0001, 0x7038, 0x9c36, 0x1110, 0x660c, ++ 0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, ++ 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, ++ 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xb0ad, ++ 0x01c8, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1590, 0xa867, ++ 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, ++ 0xb374, 0x080c, 0xcc6b, 0x080c, 0x61a9, 0x007e, 0x003e, 0x001e, ++ 0x080c, 0xb278, 0x080c, 0x9584, 0x00ce, 0x0804, 0x7c63, 0x2c78, ++ 0x600c, 0x2060, 0x0804, 0x7c63, 0x85ff, 0x0120, 0x0036, 0x080c, ++ 0x820b, 0x003e, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, ++ 0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe, ++ 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, ++ 0x080c, 0xcc6b, 0x080c, 0xc970, 0x007e, 0x003e, 0x001e, 0x0890, ++ 0x6020, 0x9086, 0x000a, 0x0904, 0x7ca9, 0x0804, 0x7ca7, 0x0006, ++ 0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091, ++ 0x8000, 0x2079, 0x19b4, 0x7838, 0x9065, 0x0904, 0x7d3f, 0x600c, ++ 0x0006, 0x600f, 0x0000, 0x783c, 0x9c06, 0x1168, 0x0036, 0x2019, ++ 0x0001, 0x080c, 0x8dfe, 0x7833, 0x0000, 0x901e, 0x7b3e, 0x7b42, ++ 0x7b46, 0x7b4a, 0x003e, 0x080c, 0xb0ad, 0x0520, 0x6014, 0x2048, ++ 0x6020, 0x9086, 0x0003, 0x1568, 0x3e08, 0x918e, 0x0002, 0x1188, ++ 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, ++ 0x0140, 0x6040, 0x9005, 0x1180, 0x2001, 0x1955, 0x2004, 0x6042, ++ 0x0058, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x61a9, ++ 0x080c, 0xb278, 0x080c, 0x9584, 0x000e, 0x0804, 0x7cfc, 0x7e3a, ++ 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e, ++ 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xc970, 0x0c50, ++ 0x6020, 0x9086, 0x000a, 0x09f8, 0x08e0, 0x0016, 0x0026, 0x0086, ++ 0x9046, 0x0099, 0x080c, 0x7e2b, 0x008e, 0x002e, 0x001e, 0x0005, ++ 0x00f6, 0x0126, 0x2079, 0x19b4, 0x2091, 0x8000, 0x080c, 0x7ec2, ++ 0x080c, 0x7f3a, 0x012e, 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, ++ 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, ++ 0x8000, 0x2071, 0x19b4, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, ++ 0x7dfc, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x7df7, 0x88ff, ++ 0x0120, 0x6054, 0x9106, 0x1904, 0x7df7, 0x7024, 0x9c06, 0x1550, ++ 0x2069, 0x0100, 0x68c0, 0x9005, 0x0508, 0x080c, 0x7893, 0x080c, ++ 0x8b50, 0x68c3, 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x0036, ++ 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, ++ 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x2069, 0x0100, 0x6824, ++ 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0020, 0x6003, 0x0009, ++ 0x630a, 0x04e8, 0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, ++ 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, ++ 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, ++ 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xb0ad, ++ 0x01b8, 0x6020, 0x9086, 0x0003, 0x1550, 0xa867, 0x0103, 0xab7a, ++ 0xa877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0xb374, 0x080c, ++ 0xcc6b, 0x080c, 0x61a9, 0x008e, 0x003e, 0x001e, 0x080c, 0xb278, ++ 0x080c, 0x9584, 0x080c, 0x8eec, 0x00ce, 0x0804, 0x7d7e, 0x2c78, ++ 0x600c, 0x2060, 0x0804, 0x7d7e, 0x012e, 0x000e, 0x001e, 0x006e, ++ 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x00be, 0x0005, 0x6020, ++ 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xcc6b, ++ 0x080c, 0xc970, 0x008e, 0x003e, 0x001e, 0x08d0, 0x080c, 0x9e99, ++ 0x6020, 0x9086, 0x0002, 0x1130, 0x6004, 0x9086, 0x0085, 0x0904, ++ 0x7ddd, 0x0870, 0x6020, 0x9086, 0x0005, 0x1950, 0x6004, 0x9086, ++ 0x0085, 0x0d08, 0x0828, 0x00b6, 0x00a6, 0x0096, 0x00c6, 0x0006, ++ 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, 0x0904, ++ 0x7ebb, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071, 0x19b4, 0xbe54, ++ 0x7018, 0x9b06, 0x1108, 0x761a, 0x701c, 0x9b06, 0x1130, 0x86ff, ++ 0x1118, 0x7018, 0x701e, 0x0008, 0x761e, 0xb858, 0x904d, 0x0108, ++ 0xae56, 0x96d5, 0x0000, 0x0110, 0x2900, 0xb05a, 0xb857, 0x0000, ++ 0xb85b, 0x0000, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x5b43, ++ 0x0904, 0x7eb7, 0x7624, 0x86ff, 0x0904, 0x7ea6, 0x9680, 0x0005, ++ 0x2004, 0x9906, 0x15d8, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, ++ 0x0560, 0x080c, 0x7893, 0x080c, 0x8b50, 0x68c3, 0x0000, 0x080c, ++ 0x900f, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, ++ 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c, ++ 0x28a5, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, ++ 0x003e, 0x00de, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, ++ 0x2660, 0x080c, 0x9584, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, ++ 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x7e5e, 0x89ff, 0x0158, ++ 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xb374, 0x080c, ++ 0xcc6b, 0x080c, 0x61a9, 0x080c, 0x8eec, 0x0804, 0x7e5e, 0x006e, ++ 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, 0x009e, 0x00ae, ++ 0x00be, 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036, ++ 0x7814, 0x9065, 0x0904, 0x7f17, 0x600c, 0x0006, 0x600f, 0x0000, ++ 0x7824, 0x9c06, 0x1558, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0508, ++ 0x080c, 0x7893, 0x080c, 0x8b50, 0x68c3, 0x0000, 0x080c, 0x900f, ++ 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, ++ 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, ++ 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, ++ 0x0028, 0x6003, 0x0009, 0x630a, 0x2c30, 0x00b0, 0x6014, 0x2048, ++ 0x080c, 0xb0ab, 0x0168, 0x6020, 0x9086, 0x0003, 0x11c0, 0xa867, ++ 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x61a9, 0x080c, 0xb278, ++ 0x080c, 0x9584, 0x080c, 0x8eec, 0x000e, 0x0804, 0x7ec9, 0x7e16, ++ 0x7e12, 0x00de, 0x00ce, 0x006e, 0x000e, 0x009e, 0x0005, 0x6020, ++ 0x9086, 0x0006, 0x1118, 0x080c, 0xc970, 0x0c50, 0x080c, 0x9e99, ++ 0x6020, 0x9086, 0x0002, 0x1128, 0x6004, 0x9086, 0x0085, 0x09b8, ++ 0x08f8, 0x6020, 0x9086, 0x0005, 0x19d8, 0x6004, 0x9086, 0x0085, ++ 0x0d50, 0x08b0, 0x0006, 0x0066, 0x0096, 0x00b6, 0x00c6, 0x00d6, ++ 0x7818, 0x905d, 0x0904, 0x7fb7, 0xb854, 0x0006, 0x9006, 0xb856, ++ 0xb85a, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x5b43, 0x0904, ++ 0x7fb4, 0x7e24, 0x86ff, 0x0904, 0x7fa7, 0x9680, 0x0005, 0x2004, ++ 0x9906, 0x1904, 0x7fa7, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, ++ 0x05e8, 0x080c, 0x7893, 0x080c, 0x8b50, 0x68c3, 0x0000, 0x080c, ++ 0x900f, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, ++ 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c, ++ 0x28a5, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, ++ 0x003e, 0x00de, 0x00c6, 0x3e08, 0x918e, 0x0002, 0x1168, 0xb800, ++ 0xd0bc, 0x0150, 0x9680, 0x0010, 0x200c, 0x81ff, 0x1508, 0x2009, ++ 0x1955, 0x210c, 0x2102, 0x00e0, 0xb83c, 0x9005, 0x0110, 0x8001, ++ 0xb83e, 0x2660, 0x080c, 0x9584, 0x00ce, 0x0048, 0x00de, 0x00c6, ++ 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x7f4d, 0x89ff, ++ 0x0138, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x61a9, ++ 0x080c, 0x8eec, 0x0804, 0x7f4d, 0x000e, 0x0804, 0x7f41, 0x781e, ++ 0x781a, 0x00de, 0x00ce, 0x00be, 0x009e, 0x006e, 0x000e, 0x0005, ++ 0x00e6, 0x00d6, 0x0096, 0x0066, 0xb800, 0xd0dc, 0x01a0, 0xb84c, ++ 0x904d, 0x0188, 0xa878, 0x9606, 0x1170, 0x2071, 0x19b4, 0x7024, ++ 0x9035, 0x0148, 0x9080, 0x0005, 0x2004, 0x9906, 0x1120, 0xb800, ++ 0xc0dc, 0xb802, 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee, 0x0005, ++ 0x00f6, 0x2079, 0x0100, 0x78c0, 0x9005, 0x1138, 0x00c6, 0x2660, ++ 0x6003, 0x0009, 0x630a, 0x00ce, 0x04b8, 0x080c, 0x8b50, 0x78c3, ++ 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, ++ 0x7b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, ++ 0x9006, 0x080c, 0x28a5, 0x2079, 0x0100, 0x7824, 0xd084, 0x0110, ++ 0x7827, 0x0001, 0x080c, 0x900f, 0x003e, 0x080c, 0x5b43, 0x00c6, ++ 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x080c, 0x9554, ++ 0x00ce, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xb374, ++ 0x080c, 0x61a9, 0x080c, 0x8eec, 0x00fe, 0x0005, 0x00b6, 0x00e6, ++ 0x00c6, 0x2001, 0x180c, 0x2014, 0xc2e4, 0x2202, 0x2071, 0x19b4, ++ 0x7004, 0x9084, 0x0007, 0x0002, 0x803e, 0x8042, 0x8059, 0x8082, ++ 0x80c0, 0x803e, 0x8059, 0x803c, 0x080c, 0x0d84, 0x00ce, 0x00ee, ++ 0x00be, 0x0005, 0x7024, 0x9065, 0x0148, 0x7020, 0x8001, 0x7022, ++ 0x600c, 0x9015, 0x0158, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000, ++ 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7216, 0x7212, ++ 0x0ca8, 0x6010, 0x2058, 0x080c, 0x5b43, 0xb800, 0xc0dc, 0xb802, ++ 0x7007, 0x0000, 0x7027, 0x0000, 0x7020, 0x8001, 0x7022, 0x1148, ++ 0x2001, 0x180c, 0x2014, 0xd2ec, 0x1180, 0x00ce, 0x00ee, 0x00be, ++ 0x0005, 0xb854, 0x9015, 0x0120, 0x721e, 0x080c, 0x8125, 0x0ca8, ++ 0x7218, 0x721e, 0x080c, 0x8125, 0x0c80, 0xc2ec, 0x2202, 0x080c, ++ 0x820b, 0x0c58, 0x7024, 0x9065, 0x05b8, 0x700c, 0x9c06, 0x1160, ++ 0x080c, 0x8eec, 0x600c, 0x9015, 0x0120, 0x720e, 0x600f, 0x0000, ++ 0x0448, 0x720e, 0x720a, 0x0430, 0x7014, 0x9c06, 0x1160, 0x080c, ++ 0x8eec, 0x600c, 0x9015, 0x0120, 0x7216, 0x600f, 0x0000, 0x00d0, ++ 0x7216, 0x7212, 0x00b8, 0x6020, 0x9086, 0x0003, 0x1198, 0x6010, ++ 0x2058, 0x080c, 0x5b43, 0xb800, 0xc0dc, 0xb802, 0x080c, 0x8eec, ++ 0x701c, 0x9065, 0x0138, 0xb854, 0x9015, 0x0110, 0x721e, 0x0010, ++ 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, ++ 0x7024, 0x9065, 0x0140, 0x080c, 0x8eec, 0x600c, 0x9015, 0x0158, ++ 0x720e, 0x600f, 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x00ce, ++ 0x00ee, 0x00be, 0x0005, 0x720e, 0x720a, 0x0ca8, 0x00d6, 0x2069, ++ 0x19b4, 0x6830, 0x9084, 0x0003, 0x0002, 0x80e3, 0x80e5, 0x8109, ++ 0x80e1, 0x080c, 0x0d84, 0x00de, 0x0005, 0x00c6, 0x6840, 0x9086, ++ 0x0001, 0x01b8, 0x683c, 0x9065, 0x0130, 0x600c, 0x9015, 0x0170, ++ 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, ++ 0x19d3, 0x2013, 0x0000, 0x00ce, 0x00de, 0x0005, 0x683a, 0x6836, ++ 0x0c90, 0x6843, 0x0000, 0x6838, 0x9065, 0x0d68, 0x6003, 0x0003, ++ 0x0c50, 0x00c6, 0x9006, 0x6842, 0x6846, 0x684a, 0x683c, 0x9065, ++ 0x0160, 0x600c, 0x9015, 0x0130, 0x6a3a, 0x600f, 0x0000, 0x683f, ++ 0x0000, 0x0018, 0x683e, 0x683a, 0x6836, 0x00ce, 0x00de, 0x0005, ++ 0xc1e5, 0x2001, 0x180c, 0x2102, 0x0005, 0x2001, 0x180c, 0x200c, ++ 0xd1ec, 0x0138, 0xc1ec, 0x2102, 0x080c, 0x820b, 0x2001, 0x180c, ++ 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0d50, 0x00d6, 0x2069, ++ 0x19b4, 0x6804, 0x9084, 0x0007, 0x0002, 0x8147, 0x81ea, 0x81ea, ++ 0x81ea, 0x81ea, 0x81ec, 0x81ea, 0x8145, 0x080c, 0x0d84, 0x6820, ++ 0x9005, 0x1110, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0150, ++ 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x8256, 0x00ce, ++ 0x00de, 0x0005, 0x6814, 0x9065, 0x0150, 0x6807, 0x0001, 0x6826, ++ 0x682b, 0x0000, 0x080c, 0x8256, 0x00ce, 0x00de, 0x0005, 0x00b6, ++ 0x00e6, 0x6a1c, 0x92dd, 0x0000, 0x0904, 0x81d6, 0xb84c, 0x900d, ++ 0x0118, 0xb888, 0x9005, 0x01a0, 0xb854, 0x905d, 0x0120, 0x920e, ++ 0x0904, 0x81d6, 0x0028, 0x6818, 0x920e, 0x0904, 0x81d6, 0x2058, ++ 0xb84c, 0x900d, 0x0d88, 0xb888, 0x9005, 0x1d70, 0x2b00, 0x681e, ++ 0xbb3c, 0xb838, 0x9302, 0x1e40, 0x080c, 0x952b, 0x0904, 0x81d6, ++ 0x8318, 0xbb3e, 0x6116, 0x2b10, 0x6212, 0x0096, 0x2148, 0xa880, ++ 0x9084, 0x00ff, 0x605e, 0xa883, 0x0000, 0xa884, 0x009e, 0x908a, ++ 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b, 0x9318, ++ 0x631a, 0x6114, 0x0096, 0x2148, 0xa964, 0x009e, 0x918c, 0x00ff, ++ 0x918e, 0x0048, 0x0538, 0x00f6, 0x2c78, 0x2061, 0x0100, 0xbab0, ++ 0x629a, 0x2069, 0x0200, 0x2071, 0x0240, 0x080c, 0x8786, 0x2069, ++ 0x19b4, 0xbb00, 0xc3dd, 0xbb02, 0x6807, 0x0002, 0x2f18, 0x6b26, ++ 0x682b, 0x0000, 0x7823, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040, ++ 0x00fe, 0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00ee, 0x00be, ++ 0x00ce, 0x0cd0, 0xbb00, 0xc3dd, 0xbb02, 0x6807, 0x0006, 0x2f18, ++ 0x6b26, 0x682b, 0x0000, 0x080c, 0x9387, 0x00ee, 0x00be, 0x00ce, ++ 0x00de, 0x0005, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0138, ++ 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x8256, 0x00ce, ++ 0x00de, 0x0005, 0x2001, 0x180c, 0x2014, 0xc2ed, 0x2202, 0x00de, ++ 0x00fe, 0x0005, 0x2001, 0x180c, 0x2014, 0xd2e4, 0x0120, 0xc2e4, ++ 0x2202, 0x080c, 0x8136, 0x00f6, 0x00d6, 0x2069, 0x19b4, 0x6830, ++ 0x9086, 0x0000, 0x11f0, 0x2001, 0x180c, 0x200c, 0xd1c4, 0x11e0, ++ 0x6838, 0x907d, 0x01b0, 0x6a04, 0x9296, 0x0000, 0x1588, 0x6833, ++ 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, ++ 0x2091, 0x2400, 0x002e, 0x080c, 0x1933, 0x1178, 0x012e, 0x080c, ++ 0x899e, 0x00de, 0x00fe, 0x0005, 0xc1c4, 0x2102, 0x0066, 0x2031, ++ 0x0001, 0x080c, 0x691e, 0x006e, 0x08d8, 0x012e, 0x6843, 0x0000, ++ 0x7803, 0x0002, 0x780c, 0x9015, 0x0140, 0x6a3a, 0x780f, 0x0000, ++ 0x6833, 0x0000, 0x683f, 0x0000, 0x0c20, 0x683a, 0x6836, 0x0cc0, ++ 0x6a04, 0x9296, 0x0006, 0x0958, 0x0804, 0x81fa, 0x6020, 0x9084, ++ 0x000f, 0x000b, 0x0005, 0x826a, 0x826f, 0x86ca, 0x874f, 0x826f, ++ 0x86ca, 0x874f, 0x826a, 0x826f, 0x826a, 0x826a, 0x826a, 0x826a, ++ 0x826a, 0x826a, 0x080c, 0x8026, 0x080c, 0x8125, 0x0005, 0x00b6, ++ 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, ++ 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0053, ++ 0x1a0c, 0x0d84, 0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061, 0x0100, ++ 0x619a, 0x908a, 0x0040, 0x1a04, 0x82db, 0x005b, 0x00fe, 0x00ee, ++ 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, ++ 0x0005, 0x8451, 0x848c, 0x84b5, 0x8559, 0x857b, 0x8581, 0x858e, ++ 0x8596, 0x85a2, 0x85a8, 0x85b9, 0x85a8, 0x8611, 0x8596, 0x861d, ++ 0x8623, 0x85a2, 0x8623, 0x862f, 0x82d9, 0x82d9, 0x82d9, 0x82d9, ++ 0x82d9, 0x82d9, 0x82d9, 0x82d9, 0x82d9, 0x82d9, 0x82d9, 0x8c9a, ++ 0x8cb0, 0x8cba, 0x8cda, 0x8d0c, 0x858e, 0x82d9, 0x858e, 0x85a8, ++ 0x82d9, 0x84b5, 0x8559, 0x82d9, 0x90fc, 0x85a8, 0x82d9, 0x9118, ++ 0x85a8, 0x82d9, 0x85a2, 0x844b, 0x82fc, 0x82d9, 0x912e, 0x919a, ++ 0x9271, 0x82d9, 0x927e, 0x858b, 0x92a9, 0x82d9, 0x8d16, 0x92d6, ++ 0x82d9, 0x080c, 0x0d84, 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de, ++ 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, ++ 0x82fa, 0x82fa, 0x82fa, 0x8322, 0x83ce, 0x83d9, 0x82fa, 0x82fa, ++ 0x82fa, 0x8420, 0x842c, 0x833d, 0x82fa, 0x8358, 0x838c, 0x9447, ++ 0x948c, 0x85a8, 0x080c, 0x0d84, 0x00d6, 0x0096, 0x080c, 0x8642, ++ 0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800, 0x7814, 0x2048, ++ 0xa83c, 0x700e, 0xa850, 0x7022, 0xa854, 0x7026, 0x60c3, 0x0018, ++ 0x080c, 0x8b24, 0x009e, 0x00de, 0x0005, 0x7810, 0x00b6, 0x2058, ++ 0xb8a0, 0x00be, 0x080c, 0x94d3, 0x1110, 0xd0bc, 0x0110, 0x9085, ++ 0x0001, 0x0005, 0x00d6, 0x0096, 0x080c, 0x8642, 0x7003, 0x0500, ++ 0x7814, 0x2048, 0xa874, 0x700a, 0xa878, 0x700e, 0xa87c, 0x7012, ++ 0xa880, 0x7016, 0xa884, 0x701a, 0xa888, 0x701e, 0x60c3, 0x0010, ++ 0x080c, 0x8b24, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, ++ 0x8642, 0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0, ++ 0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0, ++ 0x701e, 0x60c3, 0x0010, 0x080c, 0x8b24, 0x009e, 0x00de, 0x0005, ++ 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x8642, 0x20e9, ++ 0x0000, 0x2001, 0x1970, 0x2003, 0x0000, 0x7814, 0x2048, 0xa814, ++ 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, ++ 0x001b, 0x2098, 0x2001, 0x1970, 0x0016, 0x200c, 0x2001, 0x0001, ++ 0x080c, 0x1ff9, 0x080c, 0xbd44, 0x9006, 0x080c, 0x1ff9, 0x001e, ++ 0xa804, 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, 0x8b24, ++ 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x868d, 0x20e9, 0x0000, 0x2001, 0x1970, 0x2003, ++ 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200, 0xa873, 0x0000, 0xa814, ++ 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, ++ 0x001b, 0x2098, 0x2001, 0x1970, 0x0016, 0x200c, 0x080c, 0xbd44, ++ 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c60, 0x0051, 0x7814, ++ 0x2048, 0x080c, 0x0f60, 0x080c, 0x8b24, 0x012e, 0x009e, 0x00de, ++ 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003, 0x9005, 0x0130, 0x9082, ++ 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, 0x8642, ++ 0x7003, 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, ++ 0x8b24, 0x00d6, 0x00e6, 0x080c, 0x868d, 0x7814, 0x9084, 0xff00, ++ 0x2073, 0x0200, 0x8e70, 0x8e70, 0x9095, 0x0010, 0x2272, 0x8e70, ++ 0x2073, 0x0034, 0x8e70, 0x2069, 0x1805, 0x20a9, 0x0004, 0x2d76, ++ 0x8d68, 0x8e70, 0x1f04, 0x83ef, 0x2069, 0x1801, 0x20a9, 0x0004, ++ 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x83f8, 0x2069, 0x1980, 0x9086, ++ 0xdf00, 0x0110, 0x2069, 0x199a, 0x20a9, 0x001a, 0x9e86, 0x0260, ++ 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, 0x6012, 0x00ce, ++ 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70, 0x1f04, ++ 0x8406, 0x60c3, 0x004c, 0x080c, 0x8b24, 0x00ee, 0x00de, 0x0005, ++ 0x080c, 0x8642, 0x7003, 0x6300, 0x7007, 0x0028, 0x7808, 0x700e, ++ 0x60c3, 0x0008, 0x0804, 0x8b24, 0x00d6, 0x0026, 0x0016, 0x080c, ++ 0x868d, 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0, 0x0004, ++ 0x2009, 0x0001, 0x2011, 0x000c, 0x2073, 0x0800, 0x8e70, 0x2073, ++ 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x8b24, 0x001e, ++ 0x002e, 0x00de, 0x0005, 0x2001, 0x1816, 0x2004, 0x609a, 0x0804, ++ 0x8b24, 0x080c, 0x8642, 0x7003, 0x5200, 0x2069, 0x1852, 0x6804, ++ 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x2430, 0x710e, 0x001e, ++ 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, ++ 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, ++ 0x0254, 0x4003, 0x080c, 0x94d3, 0x1120, 0xb8a0, 0x9082, 0x007f, ++ 0x0248, 0x2001, 0x181d, 0x2004, 0x7032, 0x2001, 0x181e, 0x2004, ++ 0x7036, 0x0030, 0x2001, 0x1816, 0x2004, 0x9084, 0x00ff, 0x7036, ++ 0x60c3, 0x001c, 0x0804, 0x8b24, 0x080c, 0x8642, 0x7003, 0x0500, ++ 0x080c, 0x94d3, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, ++ 0x181d, 0x2004, 0x700a, 0x2001, 0x181e, 0x2004, 0x700e, 0x0030, ++ 0x2001, 0x1816, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, 0x0004, ++ 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, ++ 0x4003, 0x60c3, 0x0010, 0x0804, 0x8b24, 0x080c, 0x8642, 0x9006, ++ 0x080c, 0x5ef7, 0xb8a0, 0x9086, 0x007e, 0x1130, 0x7003, 0x0400, ++ 0x620c, 0xc2b4, 0x620e, 0x0058, 0x7814, 0x0096, 0x904d, 0x0120, ++ 0x9006, 0xa89a, 0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300, 0xb8a0, ++ 0x9086, 0x007e, 0x1904, 0x8520, 0x00d6, 0x2069, 0x193b, 0x2001, ++ 0x1836, 0x2004, 0xd0a4, 0x0178, 0x6800, 0x700a, 0x6808, 0x9084, ++ 0x2000, 0x7012, 0x680c, 0x7016, 0x701f, 0x2710, 0x6818, 0x7022, ++ 0x681c, 0x7026, 0x0080, 0x6800, 0x700a, 0x6804, 0x700e, 0x6808, ++ 0x080c, 0x6877, 0x1118, 0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff, ++ 0x7012, 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, ++ 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, ++ 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, ++ 0x934e, 0x2069, 0x1943, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, ++ 0x080c, 0x4dee, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04a8, ++ 0x2001, 0x1836, 0x2004, 0xd0a4, 0x0170, 0x0016, 0x2001, 0x193c, ++ 0x200c, 0x60e0, 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, ++ 0x2471, 0x61e2, 0x001e, 0x20e1, 0x0001, 0x2099, 0x193b, 0x20e9, ++ 0x0000, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, ++ 0x2099, 0x1805, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, ++ 0x1801, 0x20a1, 0x025a, 0x4003, 0x080c, 0x934e, 0x20a1, 0x024e, ++ 0x20a9, 0x0008, 0x2099, 0x1943, 0x4003, 0x60c3, 0x0074, 0x0804, ++ 0x8b24, 0x080c, 0x8642, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, ++ 0x0800, 0x700f, 0x2000, 0x9006, 0x00f6, 0x2079, 0x1852, 0x7904, ++ 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, ++ 0x0010, 0x9085, 0x0002, 0x00d6, 0x0804, 0x85f2, 0x7026, 0x60c3, ++ 0x0014, 0x0804, 0x8b24, 0x080c, 0x8642, 0x7003, 0x5000, 0x0804, ++ 0x84cf, 0x080c, 0x8642, 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, ++ 0x0014, 0x0804, 0x8b24, 0x080c, 0x8684, 0x0010, 0x080c, 0x868d, ++ 0x7003, 0x0200, 0x60c3, 0x0004, 0x0804, 0x8b24, 0x080c, 0x868d, ++ 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, ++ 0x0804, 0x8b24, 0x080c, 0x868d, 0x7003, 0x0200, 0x0804, 0x84cf, ++ 0x080c, 0x868d, 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, ++ 0x0010, 0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, ++ 0x8b24, 0x00d6, 0x080c, 0x868d, 0x7003, 0x0210, 0x7007, 0x0014, ++ 0x700b, 0x0800, 0xb894, 0x9086, 0x0014, 0x1198, 0xb99c, 0x9184, ++ 0x0030, 0x0190, 0xb998, 0x9184, 0xc000, 0x1140, 0xd1ec, 0x0118, ++ 0x700f, 0x2100, 0x0058, 0x700f, 0x0100, 0x0040, 0x700f, 0x0400, ++ 0x0028, 0x700f, 0x0700, 0x0010, 0x700f, 0x0800, 0x00f6, 0x2079, ++ 0x1852, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, ++ 0x0110, 0x9085, 0x0010, 0x2009, 0x1874, 0x210c, 0xd184, 0x1110, ++ 0x9085, 0x0002, 0x0026, 0x2009, 0x1872, 0x210c, 0xd1e4, 0x0150, ++ 0xc0c5, 0xbabc, 0xd28c, 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, ++ 0x0010, 0x0140, 0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, ++ 0x0108, 0xc0bd, 0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, ++ 0x8b24, 0x080c, 0x868d, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, ++ 0x0100, 0x60c3, 0x0014, 0x0804, 0x8b24, 0x080c, 0x868d, 0x7003, ++ 0x0200, 0x0804, 0x8455, 0x080c, 0x868d, 0x7003, 0x0100, 0x700b, ++ 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x8b24, 0x080c, ++ 0x868d, 0x7003, 0x0100, 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, ++ 0x8b24, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, ++ 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, ++ 0x2021, 0x0100, 0x080c, 0x9363, 0xb810, 0x9305, 0x7002, 0xb814, ++ 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, 0x700e, 0x9485, ++ 0x0029, 0x7012, 0x004e, 0x003e, 0x00de, 0x080c, 0x8b12, 0x721a, ++ 0x9f95, 0x0000, 0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, ++ 0x0005, 0x0026, 0x080c, 0x9363, 0x7003, 0x02ff, 0x7007, 0xfffc, ++ 0x00d6, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, 0x700e, 0x00de, ++ 0x7013, 0x2029, 0x0c10, 0x7003, 0x0100, 0x7007, 0x0000, 0x700b, ++ 0xfc02, 0x700f, 0x0000, 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046, ++ 0x2019, 0x3300, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, ++ 0x0046, 0x2019, 0x2300, 0x2021, 0x0100, 0x080c, 0x9363, 0xb810, ++ 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, ++ 0x1140, 0xb814, 0x9005, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, ++ 0x0020, 0x6874, 0x700a, 0x6878, 0x700e, 0x0000, 0x9485, 0x0098, ++ 0x7012, 0x004e, 0x003e, 0x00de, 0x080c, 0x8b12, 0x721a, 0x7a08, ++ 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, ++ 0x8b12, 0x721a, 0x7a08, 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, ++ 0x002e, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, ++ 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d84, ++ 0x908a, 0x0092, 0x1a0c, 0x0d84, 0x6110, 0x2158, 0xb9b0, 0x2c78, ++ 0x2061, 0x0100, 0x619a, 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, ++ 0x00de, 0x00ce, 0x00be, 0x0005, 0x86fb, 0x8700, 0x870b, 0x86f9, ++ 0x86f9, 0x86f9, 0x86fb, 0x86f9, 0x86f9, 0x86f9, 0x86f9, 0x86f9, ++ 0x86f9, 0x080c, 0x0d84, 0x00c1, 0x60c3, 0x0000, 0x0804, 0x8b24, ++ 0x0431, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, ++ 0x000c, 0x0804, 0x8b24, 0x0479, 0x7003, 0x0003, 0x7007, 0x0300, ++ 0x60c3, 0x0004, 0x0804, 0x8b24, 0x0026, 0x080c, 0x9363, 0xb810, ++ 0x9085, 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, ++ 0x700a, 0x6878, 0x700e, 0x7013, 0x0009, 0x0804, 0x865d, 0x0026, ++ 0x080c, 0x9363, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, ++ 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, 0x700e, 0x2001, 0x0099, ++ 0x7012, 0x0804, 0x86bf, 0x0026, 0x080c, 0x9363, 0xb810, 0x9085, ++ 0x8500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, ++ 0x6878, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x86bf, 0x00b6, ++ 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, ++ 0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0d84, 0x908a, 0x0054, ++ 0x1a0c, 0x0d84, 0x7910, 0x2158, 0xb9b0, 0x2061, 0x0100, 0x619a, ++ 0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, ++ 0x0005, 0x8786, 0x882d, 0x8800, 0x894f, 0x8784, 0x8784, 0x8784, ++ 0x8784, 0x8784, 0x8784, 0x8784, 0x8eb9, 0x8ec5, 0x8ed1, 0x8edd, ++ 0x8784, 0x92b5, 0x8784, 0x8ead, 0x080c, 0x0d84, 0x0096, 0x780b, ++ 0xffff, 0x080c, 0x87dc, 0x7914, 0x2148, 0xa978, 0x7956, 0x7132, ++ 0xa97c, 0x9184, 0x000f, 0x1118, 0x2001, 0x0005, 0x0040, 0xd184, ++ 0x0118, 0x2001, 0x0004, 0x0018, 0x9084, 0x0006, 0x8004, 0x2010, ++ 0x785c, 0x9084, 0x00ff, 0x8007, 0x9205, 0x7042, 0xd1ac, 0x0128, ++ 0x7047, 0x0002, 0x080c, 0x150d, 0x0050, 0xd1b4, 0x0118, 0x7047, ++ 0x0001, 0x0028, 0x7047, 0x0000, 0x9016, 0x2230, 0x0010, 0xaab0, ++ 0xaeac, 0x726a, 0x766e, 0x20a9, 0x0008, 0x20e9, 0x0000, 0xa860, ++ 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x20a1, 0x0252, 0x2069, ++ 0x0200, 0x6813, 0x0018, 0x4003, 0x6813, 0x0008, 0x60c3, 0x0020, ++ 0x6017, 0x0009, 0x2001, 0x19d0, 0x2003, 0x07d0, 0x2001, 0x19cf, ++ 0x2003, 0x0009, 0x009e, 0x0005, 0x6813, 0x0008, 0xba8c, 0x8210, ++ 0xb8bc, 0xd084, 0x0128, 0x7a46, 0x7b14, 0x7b4a, 0x722e, 0x732a, ++ 0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, 0x9295, 0x0600, ++ 0x7202, 0xba14, 0x7206, 0x2069, 0x1800, 0x6a74, 0x720a, 0x6a78, ++ 0x720e, 0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff, 0x0005, ++ 0x00d6, 0x0096, 0x0081, 0x7814, 0x2048, 0xa890, 0x7002, 0xa88c, ++ 0x7006, 0xa8b0, 0x700a, 0xa8ac, 0x700e, 0x60c3, 0x000c, 0x009e, ++ 0x00de, 0x0804, 0x8b24, 0x6813, 0x0008, 0xb810, 0x9085, 0x0500, ++ 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, ++ 0x700e, 0x7013, 0x0889, 0x080c, 0x8b12, 0x721a, 0x7a08, 0x7222, ++ 0x2f10, 0x7226, 0x2071, 0x024c, 0x0005, 0x00d6, 0x0096, 0x080c, ++ 0x892d, 0x7814, 0x2048, 0x080c, 0xb0ab, 0x1130, 0x7814, 0x9084, ++ 0x0700, 0x8007, 0x0033, 0x0010, 0x9006, 0x001b, 0x009e, 0x00de, ++ 0x0005, 0x884b, 0x88b4, 0x88c4, 0x88ea, 0x88f6, 0x8907, 0x890f, ++ 0x8849, 0x080c, 0x0d84, 0x0016, 0x0036, 0xa97c, 0x918c, 0x0003, ++ 0x0118, 0x9186, 0x0003, 0x1198, 0xaba8, 0x7824, 0xd0cc, 0x1168, ++ 0x7316, 0xa898, 0x701a, 0xa894, 0x701e, 0x003e, 0x001e, 0x2001, ++ 0x197e, 0x2004, 0x60c2, 0x0804, 0x8b24, 0xc3e5, 0x0c88, 0x9186, ++ 0x0001, 0x190c, 0x0d84, 0xaba8, 0x7824, 0xd0cc, 0x1904, 0x88b1, ++ 0x7316, 0xa898, 0x701a, 0xa894, 0x701e, 0xa8a4, 0x7026, 0xa8ac, ++ 0x702e, 0x2009, 0x0018, 0x9384, 0x0300, 0x0570, 0xd3c4, 0x0110, ++ 0xa8ac, 0x9108, 0xd3cc, 0x0110, 0xa8a4, 0x9108, 0x6810, 0x9085, ++ 0x0010, 0x6812, 0x2011, 0x0258, 0x20e9, 0x0000, 0x22a0, 0x0156, ++ 0x20a9, 0x0008, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x002c, 0x2098, ++ 0x4003, 0x6810, 0x8000, 0x6812, 0x2011, 0x0240, 0x22a0, 0x20a9, ++ 0x0005, 0x4003, 0x6810, 0xc084, 0x6812, 0x015e, 0x9184, 0x0003, ++ 0x0118, 0x2019, 0x0245, 0x201a, 0x61c2, 0x003e, 0x001e, 0x0804, ++ 0x8b24, 0xc3e5, 0x0804, 0x8870, 0x2011, 0x0008, 0x2001, 0x180e, ++ 0x2004, 0xd0a4, 0x0110, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1110, ++ 0x7216, 0x0470, 0x0ce8, 0xc2e5, 0x2011, 0x0302, 0x0016, 0x782c, ++ 0x701a, 0x7930, 0x711e, 0x9105, 0x0108, 0xc2dd, 0x001e, 0x7824, ++ 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x7027, 0x0012, 0x702f, 0x0008, ++ 0x7043, 0x7000, 0x7047, 0x0500, 0x704f, 0x000a, 0x2069, 0x0200, ++ 0x6813, 0x0009, 0x2071, 0x0240, 0x700b, 0x2500, 0x60c3, 0x0032, ++ 0x0804, 0x8b24, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1128, 0x7216, ++ 0x60c3, 0x0018, 0x0804, 0x8b24, 0x0cd0, 0xc2e5, 0x2011, 0x0100, ++ 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x702f, 0x0008, 0x7858, ++ 0x9084, 0x00ff, 0x7036, 0x60c3, 0x0020, 0x0804, 0x8b24, 0x2011, ++ 0x0008, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x0c08, 0x0036, ++ 0x7b14, 0x9384, 0xff00, 0x7816, 0x9384, 0x00ff, 0x8001, 0x1138, ++ 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x003e, 0x0888, 0x0046, ++ 0x2021, 0x0800, 0x0006, 0x7824, 0xd0cc, 0x000e, 0x0108, 0xc4e5, ++ 0x7416, 0x004e, 0x701e, 0x003e, 0x0818, 0x00d6, 0x6813, 0x0008, ++ 0xb810, 0x9085, 0x0700, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, ++ 0x6874, 0x700a, 0x6878, 0x700e, 0x7824, 0xd0cc, 0x1168, 0x7013, ++ 0x0898, 0x080c, 0x8b12, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, ++ 0x2071, 0x024c, 0x00de, 0x0005, 0x7013, 0x0889, 0x0c90, 0x0016, ++ 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e, 0x0005, 0x895f, ++ 0x895f, 0x8961, 0x895f, 0x895f, 0x895f, 0x897b, 0x895f, 0x080c, ++ 0x0d84, 0x7914, 0x918c, 0x08ff, 0x918d, 0xf600, 0x7916, 0x2009, ++ 0x0003, 0x00b9, 0x2069, 0x1852, 0x6804, 0xd0bc, 0x0130, 0x682c, ++ 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, 0x7033, 0x3f00, 0x60c3, ++ 0x0001, 0x0804, 0x8b24, 0x2009, 0x0003, 0x0019, 0x7033, 0x7f00, ++ 0x0cb0, 0x0016, 0x080c, 0x9363, 0x001e, 0xb810, 0x9085, 0x0100, ++ 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6a74, 0x720a, 0x6a78, ++ 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, 0x7116, 0x080c, 0x8b12, ++ 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005, 0x00b6, 0x0096, ++ 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, ++ 0x2071, 0x1800, 0x7158, 0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910, ++ 0xba14, 0x7374, 0x7478, 0x7820, 0x90be, 0x0006, 0x0904, 0x8a81, ++ 0x90be, 0x000a, 0x1904, 0x8a3d, 0x609f, 0x0000, 0x7814, 0x2048, ++ 0xa87c, 0xd0fc, 0x05c8, 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062, ++ 0x873f, 0x9784, 0xff00, 0x0006, 0x7814, 0x2048, 0xa878, 0x9005, ++ 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0510, 0x2039, 0x0098, 0x9705, ++ 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0038, 0x9185, 0x2200, ++ 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0x609f, 0x0000, 0x2001, ++ 0x1836, 0x2004, 0xd0ac, 0x11a8, 0xd09c, 0x0130, 0x7814, 0x2048, ++ 0xa874, 0x9082, 0x0080, 0x1268, 0xb814, 0x609e, 0x0050, 0x2039, ++ 0x0029, 0x9705, 0x6072, 0x0c48, 0x9185, 0x0200, 0x6062, 0x6073, ++ 0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94, 0x87ff, 0x1120, 0x2f00, ++ 0x6082, 0x7808, 0x6086, 0x6266, 0x636a, 0x646e, 0x6077, 0x0000, ++ 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f, ++ 0x0000, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, ++ 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x080c, ++ 0x9348, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, ++ 0x2009, 0x1b58, 0x080c, 0x7898, 0x003e, 0x004e, 0x005e, 0x00ce, ++ 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7804, 0x9086, 0x0040, ++ 0x0904, 0x8abd, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, ++ 0x6073, 0x0809, 0x6077, 0x0008, 0x60af, 0x95d5, 0x60d7, 0x0000, ++ 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f, ++ 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7814, 0x2048, 0xa838, ++ 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, 0xb86c, ++ 0x60ce, 0xbab0, 0x629e, 0x080c, 0x9348, 0x2009, 0x07d0, 0x60c4, ++ 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x7898, ++ 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, ++ 0x0005, 0x7814, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, ++ 0x0904, 0x8ad9, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, ++ 0x6073, 0x0880, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084, 0x00ff, ++ 0xb88e, 0x8007, 0x607a, 0x7838, 0x607e, 0x2f00, 0x6086, 0x7808, ++ 0x6082, 0xa890, 0x608a, 0xa88c, 0x608e, 0xa8b0, 0x60c6, 0xa8ac, ++ 0x60ca, 0xa8ac, 0x7930, 0x9108, 0x7932, 0xa8b0, 0x792c, 0x9109, ++ 0x792e, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xbab0, ++ 0x629e, 0x080c, 0x9325, 0x0804, 0x8a6d, 0xb8bc, 0xd084, 0x0148, ++ 0xb88c, 0x7814, 0x2048, 0xb88c, 0x7846, 0xa836, 0x2900, 0xa83a, ++ 0xb04a, 0x9185, 0x0600, 0x6062, 0x6266, 0x636a, 0x646e, 0x6073, ++ 0x0829, 0x6077, 0x0000, 0x60af, 0x9575, 0x60d7, 0x0000, 0x0804, ++ 0x8a50, 0x9185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x7824, ++ 0xd0cc, 0x7826, 0x0118, 0x6073, 0x0889, 0x0010, 0x6073, 0x0898, ++ 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, ++ 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, 0xa838, ++ 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, 0xb86c, ++ 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xbab0, 0x629e, 0x7824, ++ 0xd0cc, 0x0120, 0x080c, 0x9348, 0x0804, 0x8a6d, 0x080c, 0x9325, ++ 0x0804, 0x8a6d, 0x7a10, 0x00b6, 0x2258, 0xba8c, 0x8210, 0x9294, ++ 0x00ff, 0xba8e, 0x00be, 0x8217, 0x0005, 0x00d6, 0x2069, 0x19b4, ++ 0x6843, 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056, 0x60a7, 0x9575, ++ 0x00f1, 0x080c, 0x788a, 0x0005, 0x0016, 0x2001, 0x180c, 0x200c, ++ 0x9184, 0x0600, 0x9086, 0x0600, 0x0128, 0x0089, 0x080c, 0x788a, ++ 0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c, 0x2102, 0x2001, 0x19b5, ++ 0x2003, 0x0000, 0x2001, 0x19bd, 0x2003, 0x0000, 0x0c88, 0x0006, ++ 0x6014, 0x9084, 0x1804, 0x9085, 0x0009, 0x6016, 0x000e, 0x0005, ++ 0x0016, 0x00c6, 0x0006, 0x2061, 0x0100, 0x61a4, 0x60a7, 0x95f5, ++ 0x6014, 0x9084, 0x1804, 0x9085, 0x0008, 0x6016, 0x000e, 0xa001, ++ 0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e, 0x0005, 0x00c6, 0x00d6, ++ 0x0016, 0x0026, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x6877, ++ 0x1198, 0x2001, 0x19d0, 0x2004, 0x9005, 0x15d0, 0x0066, 0x2031, ++ 0x0001, 0x080c, 0x691e, 0x006e, 0x1118, 0x080c, 0x788a, 0x0480, ++ 0x00c6, 0x2061, 0x19b4, 0x00f0, 0x6904, 0x9194, 0x4000, 0x0568, ++ 0x0839, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, ++ 0x00c6, 0x2061, 0x19b4, 0x6128, 0x9192, 0x00c8, 0x1258, 0x8108, ++ 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x788a, 0x080c, ++ 0x8b47, 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, 0x080c, 0xcd1f, ++ 0x080c, 0x7893, 0x2009, 0x0014, 0x080c, 0x95ce, 0x00ce, 0x0000, ++ 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x19d0, 0x2004, ++ 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19b4, 0x6128, 0x9192, 0x0003, ++ 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x788a, 0x080c, 0x55a0, ++ 0x0c38, 0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, ++ 0x78a0, 0x2071, 0x19b4, 0x713c, 0x81ff, 0x0904, 0x8c3c, 0x2061, ++ 0x0100, 0x2069, 0x0140, 0x080c, 0x6877, 0x11b0, 0x0036, 0x2019, ++ 0x0002, 0x080c, 0x8dfe, 0x003e, 0x713c, 0x2160, 0x080c, 0xcd1f, ++ 0x2009, 0x004a, 0x080c, 0x95ce, 0x0066, 0x2031, 0x0001, 0x080c, ++ 0x691e, 0x006e, 0x0804, 0x8c3c, 0x6904, 0xd1f4, 0x0904, 0x8c43, ++ 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x00c6, ++ 0x703c, 0x9065, 0x090c, 0x0d84, 0x6020, 0x00ce, 0x9086, 0x0006, ++ 0x1528, 0x61c8, 0x60c4, 0x9105, 0x1508, 0x2009, 0x180c, 0x2104, ++ 0xd0d4, 0x01e0, 0x6214, 0x9294, 0x1800, 0x1128, 0x6224, 0x9294, ++ 0x0002, 0x1510, 0x0030, 0xc0d4, 0x200a, 0xd0cc, 0x0110, 0x080c, ++ 0x2809, 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, 0x703c, ++ 0x2060, 0x2009, 0x0049, 0x080c, 0x95ce, 0x0070, 0x0036, 0x2019, ++ 0x0001, 0x080c, 0x8dfe, 0x003e, 0x713c, 0x2160, 0x080c, 0xcd1f, ++ 0x2009, 0x004a, 0x080c, 0x95ce, 0x002e, 0x001e, 0x00ee, 0x00de, ++ 0x00ce, 0x009e, 0x0005, 0xd1ec, 0x1904, 0x8bf8, 0x0804, 0x8bff, ++ 0x0026, 0x00e6, 0x2071, 0x19b4, 0x7048, 0xd084, 0x01c0, 0x713c, ++ 0x81ff, 0x01a8, 0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, ++ 0x0006, 0x1138, 0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016, ++ 0x0030, 0x7014, 0x9084, 0x1984, 0x9085, 0x0016, 0x7016, 0x00ee, ++ 0x002e, 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, ++ 0x0046, 0x0006, 0x0126, 0x2091, 0x8000, 0x6010, 0x2058, 0xbca0, ++ 0x2071, 0x19b4, 0x7018, 0x2058, 0x8bff, 0x0190, 0xb8a0, 0x9406, ++ 0x0118, 0xb854, 0x2058, 0x0cc0, 0x6014, 0x0096, 0x2048, 0xac6c, ++ 0xad70, 0xae78, 0x009e, 0x080c, 0x5d3f, 0x0110, 0x9085, 0x0001, ++ 0x012e, 0x000e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, ++ 0x00be, 0x0005, 0x080c, 0x8642, 0x7003, 0x1200, 0x7820, 0x9086, ++ 0x0004, 0x1110, 0x6098, 0x0018, 0x2001, 0x1816, 0x2004, 0x700e, ++ 0x7838, 0x7012, 0x783c, 0x7016, 0x60c3, 0x002c, 0x0804, 0x8b24, ++ 0x080c, 0x8642, 0x7003, 0x0f00, 0x7808, 0x700e, 0x60c3, 0x0008, ++ 0x0804, 0x8b24, 0x0156, 0x080c, 0x868d, 0x7003, 0x0200, 0x2011, ++ 0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019, ++ 0x1841, 0x9ef0, 0x0002, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, ++ 0x0002, 0x9290, 0x0002, 0x1f04, 0x8ccb, 0x60c3, 0x001c, 0x015e, ++ 0x0804, 0x8b24, 0x0016, 0x0026, 0x080c, 0x8669, 0x080c, 0x867b, ++ 0x9e80, 0x0004, 0x20e9, 0x0000, 0x20a0, 0x7814, 0x0096, 0x2048, ++ 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, ++ 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x9192, 0x0010, 0x1250, ++ 0x4003, 0x9080, 0x0004, 0x8003, 0x60c2, 0x080c, 0x8b24, 0x002e, ++ 0x001e, 0x0005, 0x20a9, 0x0010, 0x4003, 0x080c, 0x934e, 0x20a1, ++ 0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c, 0x8642, 0x7003, 0x6200, ++ 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8b24, 0x0016, 0x0026, ++ 0x080c, 0x8642, 0x20e9, 0x0000, 0x20a1, 0x024c, 0x7814, 0x0096, ++ 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, ++ 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x4003, 0x8003, ++ 0x60c2, 0x080c, 0x8b24, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6, ++ 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b4, 0x700c, 0x2060, ++ 0x8cff, 0x0178, 0x080c, 0xb295, 0x1110, 0x080c, 0x9e99, 0x600c, ++ 0x0006, 0x080c, 0xb4de, 0x080c, 0x9554, 0x080c, 0x8eec, 0x00ce, ++ 0x0c78, 0x2c00, 0x700e, 0x700a, 0x012e, 0x000e, 0x00ce, 0x00ee, ++ 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, ++ 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, ++ 0xe7ff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19b4, ++ 0x7024, 0x2060, 0x8cff, 0x0904, 0x8db6, 0x080c, 0x8b50, 0x6ac0, ++ 0x68c3, 0x0000, 0x080c, 0x7893, 0x00c6, 0x2061, 0x0100, 0x080c, ++ 0x9367, 0x00ce, 0x2009, 0x0013, 0x080c, 0x95ce, 0x20a9, 0x01f4, ++ 0x6824, 0xd094, 0x0170, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, ++ 0x01d0, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, ++ 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x8d88, ++ 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, ++ 0x9006, 0x080c, 0x28a5, 0x6824, 0x000e, 0x001e, 0x002e, 0x00ce, ++ 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, ++ 0x2004, 0x9096, 0x0001, 0x05c0, 0x9096, 0x0004, 0x05a8, 0x080c, ++ 0x7893, 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, ++ 0x0008, 0x68c3, 0x0000, 0x2011, 0x554d, 0x080c, 0x781a, 0x20a9, ++ 0x01f4, 0x6824, 0xd094, 0x0170, 0x6827, 0x0004, 0x7804, 0x9084, ++ 0x4000, 0x01d0, 0x2001, 0x1000, 0x080c, 0x28a5, 0x9006, 0x080c, ++ 0x28a5, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, ++ 0x8dd1, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, ++ 0x28a5, 0x9006, 0x080c, 0x28a5, 0x000e, 0x001e, 0x002e, 0x00ce, ++ 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x0126, 0x0156, ++ 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, 0x0016, 0x0006, 0x2091, ++ 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xdbff, 0x2102, 0x2069, ++ 0x0100, 0x2079, 0x0140, 0x2071, 0x19b4, 0x703c, 0x2060, 0x8cff, ++ 0x0904, 0x8e8f, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, 0x0002, ++ 0x0904, 0x8e8f, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, ++ 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x78a0, 0x080c, ++ 0x1c4f, 0x0046, 0x2009, 0x017f, 0x200b, 0x00a5, 0x2021, 0x0169, ++ 0x2404, 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af, 0x95f5, ++ 0x68c6, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090, 0x2071, ++ 0x1a33, 0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816, 0x782b, ++ 0x0008, 0x7003, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002, 0x1128, ++ 0x7884, 0x9005, 0x1110, 0x7887, 0x0001, 0x2001, 0x194e, 0x2004, ++ 0x200a, 0x004e, 0x939d, 0x0000, 0x1120, 0x2009, 0x0049, 0x080c, ++ 0x95ce, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0170, 0x6827, 0x0004, ++ 0x7804, 0x9084, 0x4000, 0x01d0, 0x2001, 0x1000, 0x080c, 0x28a5, ++ 0x9006, 0x080c, 0x28a5, 0x0090, 0xd08c, 0x0118, 0x6827, 0x0002, ++ 0x0010, 0x1f04, 0x8e6b, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, ++ 0x0100, 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x6824, 0x000e, ++ 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, ++ 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19b4, 0x6a06, ++ 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, ++ 0x19b4, 0x6a32, 0x012e, 0x00de, 0x0005, 0x080c, 0x87dc, 0x7814, ++ 0x080c, 0x4df2, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x1000, ++ 0x0478, 0x080c, 0x87dc, 0x7814, 0x080c, 0x4df2, 0x0108, 0x782c, ++ 0x7032, 0x7042, 0x7047, 0x4000, 0x0418, 0x080c, 0x87dc, 0x7814, ++ 0x080c, 0x4df2, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x2000, ++ 0x00b8, 0x080c, 0x87dc, 0x7814, 0x080c, 0x4df2, 0x0108, 0x782c, ++ 0x7032, 0x7042, 0x7047, 0x0400, 0x0058, 0x080c, 0x87dc, 0x7814, ++ 0x080c, 0x4df2, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x0200, ++ 0x60c3, 0x0020, 0x0804, 0x8b24, 0x00e6, 0x2071, 0x19b4, 0x7020, ++ 0x9005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005, 0x00f6, 0x00e6, ++ 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, 0x2091, 0x8000, ++ 0x2071, 0x19b4, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, ++ 0x0904, 0x8f8a, 0x8cff, 0x0904, 0x8f8a, 0x6020, 0x9086, 0x0006, ++ 0x1904, 0x8f85, 0x88ff, 0x0138, 0x2800, 0x9c06, 0x1904, 0x8f85, ++ 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904, 0x8f85, 0x85ff, ++ 0x0120, 0x6054, 0x9106, 0x1904, 0x8f85, 0x7024, 0x9c06, 0x1578, ++ 0x2069, 0x0100, 0x68c0, 0x9005, 0x0530, 0x080c, 0x7893, 0x6820, ++ 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, ++ 0x080c, 0x900f, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, ++ 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x28a5, 0x9006, ++ 0x080c, 0x28a5, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, ++ 0x0001, 0x003e, 0x0020, 0x6003, 0x0009, 0x630a, 0x0470, 0x7014, ++ 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36, 0x1140, 0x2c00, ++ 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, 0x660c, ++ 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x89ff, ++ 0x1168, 0x600f, 0x0000, 0x6014, 0x0096, 0x2048, 0x080c, 0xb0ab, ++ 0x0110, 0x080c, 0xc970, 0x009e, 0x080c, 0x9584, 0x080c, 0x8eec, ++ 0x88ff, 0x1190, 0x00ce, 0x0804, 0x8f07, 0x2c78, 0x600c, 0x2060, ++ 0x0804, 0x8f07, 0x9006, 0x012e, 0x000e, 0x006e, 0x007e, 0x00ce, ++ 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x98c5, ++ 0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x0096, 0x00c6, 0x0066, ++ 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b4, 0x7638, ++ 0x2660, 0x2678, 0x8cff, 0x0904, 0x8ffe, 0x6020, 0x9086, 0x0006, ++ 0x1904, 0x8ff9, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, 0x8ff9, ++ 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, 0x6054, 0x9106, ++ 0x15c0, 0x703c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, ++ 0x8dfe, 0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046, 0x704a, ++ 0x003e, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034, 0x9c36, ++ 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, ++ 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, ++ 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xb0ab, 0x0110, ++ 0x080c, 0xc970, 0x080c, 0x9584, 0x87ff, 0x1198, 0x00ce, 0x0804, ++ 0x8faa, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8faa, 0x9006, 0x012e, ++ 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x00fe, ++ 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80, 0x00e6, ++ 0x2071, 0x19b4, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1118, ++ 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, ++ 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, ++ 0x2071, 0x19b4, 0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0518, ++ 0x2200, 0x9c06, 0x11e0, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, ++ 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, ++ 0x0010, 0x7037, 0x0000, 0x660c, 0x2c00, 0x9f06, 0x0110, 0x7e0e, ++ 0x0008, 0x2678, 0x600f, 0x0000, 0x9085, 0x0001, 0x0020, 0x2c78, ++ 0x600c, 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, ++ 0x00ee, 0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, ++ 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b4, ++ 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0x90eb, 0x6010, 0x00b6, ++ 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904, 0x90e6, 0x7024, 0x9c06, ++ 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x90c2, 0x080c, ++ 0x8b50, 0x68c3, 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x0036, ++ 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, ++ 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x2069, 0x0100, 0x6824, ++ 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x700c, 0x9c36, 0x1110, ++ 0x660c, 0x760e, 0x7008, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, ++ 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000, 0x660c, 0x0066, 0x2c00, ++ 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, ++ 0xb284, 0x1158, 0x080c, 0x2d3f, 0x080c, 0xb295, 0x11f0, 0x080c, ++ 0x9e99, 0x00d8, 0x080c, 0x900f, 0x08c0, 0x080c, 0xb295, 0x1118, ++ 0x080c, 0x9e99, 0x0090, 0x6014, 0x2048, 0x080c, 0xb0ab, 0x0168, ++ 0x6020, 0x9086, 0x0003, 0x1508, 0xa867, 0x0103, 0xab7a, 0xa877, ++ 0x0000, 0x080c, 0x61a9, 0x080c, 0xb278, 0x080c, 0xb4de, 0x080c, ++ 0x9584, 0x080c, 0x8eec, 0x00ce, 0x0804, 0x906b, 0x2c78, 0x600c, ++ 0x2060, 0x0804, 0x906b, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, ++ 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, ++ 0x1d20, 0x080c, 0xc970, 0x0c08, 0x00d6, 0x080c, 0x868d, 0x7003, ++ 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001, 0x2099, ++ 0x1956, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004, 0x4003, ++ 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, 0x8b24, 0x00de, 0x0005, ++ 0x080c, 0x868d, 0x7003, 0x0214, 0x7007, 0x0018, 0x700b, 0x0800, ++ 0x7814, 0x9084, 0xff00, 0x700e, 0x7814, 0x9084, 0x00ff, 0x7022, ++ 0x782c, 0x7026, 0x60c3, 0x0018, 0x0804, 0x8b24, 0x00b6, 0x00d6, ++ 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xb6d9, 0x00de, ++ 0x1904, 0x9192, 0x080c, 0x8642, 0x7003, 0x1300, 0x782c, 0x080c, ++ 0x9294, 0x2068, 0x6820, 0x9086, 0x0003, 0x0558, 0x7810, 0x2058, ++ 0xbaa0, 0x080c, 0x94d3, 0x11d0, 0x9286, 0x007e, 0x1128, 0x700b, ++ 0x00ff, 0x700f, 0xfffe, 0x0490, 0x9286, 0x007f, 0x1128, 0x700b, ++ 0x00ff, 0x700f, 0xfffd, 0x0450, 0xd2bc, 0x0180, 0x9286, 0x0080, ++ 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8, 0x1000, ++ 0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, 0x00c0, 0x6098, 0x700e, ++ 0x00a8, 0x080c, 0x94d3, 0x1130, 0x7810, 0x2058, 0xb8a0, 0x9082, ++ 0x007e, 0x0250, 0x00d6, 0x2069, 0x181d, 0x2d04, 0x700a, 0x8d68, ++ 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e, 0x7838, 0x7012, ++ 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, 0x8b24, ++ 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de, ++ 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c, 0x9186, 0x0006, ++ 0x01c0, 0x9186, 0x0003, 0x0904, 0x920c, 0x9186, 0x0005, 0x0904, ++ 0x91f5, 0x9186, 0x0004, 0x05d8, 0x9186, 0x0008, 0x0904, 0x91fd, ++ 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700, 0x080c, 0x9271, ++ 0x0005, 0x080c, 0x9232, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, ++ 0x4000, 0x6800, 0x0002, 0x91d6, 0x91e1, 0x91d8, 0x91e1, 0x91dd, ++ 0x91d6, 0x91d6, 0x91e1, 0x91e1, 0x91e1, 0x91e1, 0x91d6, 0x91d6, ++ 0x91d6, 0x91d6, 0x91d6, 0x91e1, 0x91d6, 0x91e1, 0x080c, 0x0d84, ++ 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, 0x2009, ++ 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0x922b, 0x080c, ++ 0x9232, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6a00, ++ 0x9286, 0x0002, 0x1108, 0x900e, 0x04b0, 0x04e1, 0x00d6, 0x0026, ++ 0x792c, 0x2168, 0x2009, 0x4000, 0x0470, 0x04a1, 0x00d6, 0x0026, ++ 0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005, 0x0118, 0x9286, ++ 0x0002, 0x1108, 0x900e, 0x00f8, 0x0429, 0x00d6, 0x0026, 0x792c, ++ 0x2168, 0x6814, 0x0096, 0x2048, 0xa9ac, 0xa834, 0x9112, 0xa9b0, ++ 0xa838, 0x009e, 0x9103, 0x7022, 0x7226, 0x792c, 0x9180, 0x0000, ++ 0x2004, 0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009, ++ 0x4000, 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de, ++ 0x0804, 0x8b24, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, ++ 0x868d, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, ++ 0x7810, 0x2058, 0xb8a0, 0x080c, 0x94d3, 0x1118, 0x9092, 0x007e, ++ 0x0268, 0x00d6, 0x2069, 0x181d, 0x2d2c, 0x8d68, 0x2d34, 0x90d8, ++ 0x1000, 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, 0x6498, ++ 0x2029, 0x0000, 0x6634, 0x782c, 0x9080, 0x0008, 0x2004, 0x9086, ++ 0x0003, 0x1128, 0x7512, 0x7616, 0x731a, 0x741e, 0x0020, 0x7312, ++ 0x7416, 0x751a, 0x761e, 0x006e, 0x005e, 0x004e, 0x003e, 0x00be, ++ 0x0005, 0x080c, 0x868d, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, ++ 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8b24, 0x080c, 0x8639, ++ 0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c, ++ 0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a, ++ 0x60c3, 0x0010, 0x0804, 0x8b24, 0x00e6, 0x2071, 0x0240, 0x0006, ++ 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8bc, 0xd084, 0x0120, ++ 0x7848, 0x702a, 0x7844, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee, ++ 0x0005, 0x080c, 0x8684, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, ++ 0x700e, 0x60c3, 0x0008, 0x0804, 0x8b24, 0x0021, 0x60c3, 0x0000, ++ 0x0804, 0x8b24, 0x00d6, 0x080c, 0x9363, 0xb810, 0x9085, 0x0300, ++ 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6874, 0x700a, 0x6878, ++ 0x700e, 0x7013, 0x0819, 0x080c, 0x8b12, 0x721a, 0x2f10, 0x7222, ++ 0x7a08, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x0059, 0x7914, ++ 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x080c, 0x8b47, 0x080c, ++ 0x788a, 0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6, 0x7858, 0x2048, ++ 0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd, 0xaa7e, 0xaa80, 0x9294, ++ 0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff, 0xab74, 0x9384, 0x00ff, ++ 0x908d, 0xc200, 0xa96e, 0x9384, 0xff00, 0x9215, 0xaa76, 0xa870, ++ 0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069, 0x0200, 0x080c, 0x9363, ++ 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000a, 0xa860, ++ 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x4003, 0x60a3, 0x0035, ++ 0xaa68, 0x9294, 0x7000, 0x9286, 0x3000, 0x0110, 0x60a3, 0x0037, ++ 0x00ee, 0x00de, 0x009e, 0x003e, 0x0005, 0x900e, 0x7814, 0x0096, ++ 0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084, 0x0003, 0x11a8, 0x2001, ++ 0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824, 0xd0cc, 0x1168, 0xd0c4, ++ 0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001, 0x180c, 0x200c, 0xc1d5, ++ 0x2102, 0x2009, 0x197f, 0x210c, 0x009e, 0x918d, 0x0092, 0x0010, ++ 0x2009, 0x0096, 0x60ab, 0x0036, 0x6116, 0x0005, 0x2009, 0x0009, ++ 0x00a0, 0x2009, 0x000a, 0x0088, 0x2009, 0x000b, 0x0070, 0x2009, ++ 0x000c, 0x0058, 0x2009, 0x000d, 0x0040, 0x2009, 0x000e, 0x0028, ++ 0x2009, 0x000f, 0x0010, 0x2009, 0x0008, 0x6912, 0x0005, 0x00d6, ++ 0x9290, 0x0018, 0x8214, 0x20e9, 0x0000, 0x2069, 0x0200, 0x6813, ++ 0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128, 0x20a9, 0x0020, 0x9292, ++ 0x0020, 0x0008, 0x9016, 0x20a1, 0x0240, 0x9006, 0x4004, 0x82ff, ++ 0x0120, 0x6810, 0x8000, 0x6812, 0x0c60, 0x00de, 0x0005, 0x00d6, ++ 0x0096, 0x6014, 0x2048, 0x9006, 0xa836, 0xa83a, 0xa99c, 0xa946, ++ 0xa84a, 0x6023, 0x0003, 0x6007, 0x0040, 0x6003, 0x0003, 0x600b, ++ 0xffff, 0xa817, 0x0001, 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa813, ++ 0x1cdb, 0x080c, 0x7c3a, 0x0126, 0x2091, 0x8000, 0x080c, 0x820b, ++ 0x012e, 0x009e, 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, ++ 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b4, ++ 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9433, 0x7024, 0x9c06, ++ 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x940a, 0x080c, ++ 0x8b50, 0x68c3, 0x0000, 0x080c, 0x900f, 0x7027, 0x0000, 0x0036, ++ 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, ++ 0x080c, 0x28a5, 0x9006, 0x080c, 0x28a5, 0x2069, 0x0100, 0x6824, ++ 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x700c, 0x9c36, 0x1110, ++ 0x660c, 0x760e, 0x7008, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, ++ 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000, 0x660c, 0x0066, 0x2c00, ++ 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, ++ 0xb284, 0x1158, 0x080c, 0x2d3f, 0x080c, 0xb295, 0x11f0, 0x080c, ++ 0x9e99, 0x00d8, 0x080c, 0x900f, 0x08c0, 0x080c, 0xb295, 0x1118, ++ 0x080c, 0x9e99, 0x0090, 0x6014, 0x2048, 0x080c, 0xb0ab, 0x0168, ++ 0x6020, 0x9086, 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, ++ 0x0000, 0x080c, 0x61a9, 0x080c, 0xb278, 0x080c, 0xb4de, 0x080c, ++ 0x9584, 0x080c, 0x8eec, 0x00ce, 0x0804, 0x93bb, 0x2c78, 0x600c, ++ 0x2060, 0x0804, 0x93bb, 0x700f, 0x0000, 0x700b, 0x0000, 0x012e, ++ 0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, ++ 0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, 0xc970, 0x08f0, 0x00d6, ++ 0x0156, 0x080c, 0x868d, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100, ++ 0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007, ++ 0x0000, 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110, ++ 0xc38d, 0x0060, 0x080c, 0x6877, 0x1110, 0xc3ad, 0x0008, 0xc3a5, ++ 0x6ad8, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x2011, ++ 0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019, ++ 0x1841, 0x2071, 0x0250, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, ++ 0x0002, 0x9290, 0x0002, 0x1f04, 0x947b, 0x60c3, 0x0040, 0x080c, ++ 0x8b24, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x868d, 0x7a14, ++ 0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238, ++ 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003, ++ 0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x198a, 0x2204, ++ 0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x0421, 0x1120, ++ 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181d, 0x2004, 0x7022, ++ 0x2001, 0x181e, 0x2004, 0x7026, 0x0030, 0x2001, 0x1816, 0x2004, ++ 0x9084, 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, ++ 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c, ++ 0x015e, 0x0804, 0x8b24, 0x0006, 0x2001, 0x1836, 0x2004, 0xd0ac, ++ 0x000e, 0x0005, 0x2011, 0x0003, 0x080c, 0x8e99, 0x2011, 0x0002, ++ 0x080c, 0x8ea3, 0x080c, 0x8d59, 0x0036, 0x901e, 0x080c, 0x8dfe, ++ 0x003e, 0x0005, 0x2071, 0x1882, 0x7000, 0x9005, 0x0140, 0x2001, ++ 0x0976, 0x2071, 0x1800, 0x706e, 0x7072, 0x7063, 0xffe0, 0x2071, ++ 0x1800, 0x706c, 0x704e, 0x7053, 0x1cd0, 0x0005, 0x00e6, 0x0126, ++ 0x2071, 0x1800, 0x2091, 0x8000, 0x754c, 0x9582, 0x0010, 0x0608, ++ 0x7050, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, ++ 0x7060, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, ++ 0x0008, 0x8529, 0x754e, 0x9ca8, 0x0018, 0x7060, 0x9502, 0x1230, ++ 0x7552, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7053, 0x1cd0, ++ 0x0cc0, 0x9006, 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x754c, 0x9582, ++ 0x0010, 0x0600, 0x7050, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, ++ 0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, ++ 0x0c98, 0x6003, 0x0008, 0x8529, 0x754e, 0x9ca8, 0x0018, 0x7060, ++ 0x9502, 0x1228, 0x7552, 0x9085, 0x0001, 0x00ee, 0x0005, 0x7053, ++ 0x1cd0, 0x0cc8, 0x9006, 0x0cc8, 0x9c82, 0x1cd0, 0x0a0c, 0x0d84, ++ 0x2001, 0x1818, 0x2004, 0x9c02, 0x1a0c, 0x0d84, 0x9006, 0x6006, ++ 0x600a, 0x600e, 0x6016, 0x601a, 0x6012, 0x6023, 0x0000, 0x6003, ++ 0x0000, 0x601e, 0x6056, 0x605a, 0x6026, 0x602a, 0x602e, 0x6032, ++ 0x6036, 0x603a, 0x603e, 0x6042, 0x2061, 0x1800, 0x604c, 0x8000, ++ 0x604e, 0x9086, 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x8125, 0x012e, 0x0cc0, 0x0006, 0x6000, 0x9086, 0x0000, ++ 0x01b0, 0x601c, 0xd084, 0x190c, 0x17b0, 0x6017, 0x0000, 0x6023, ++ 0x0007, 0x2001, 0x1953, 0x2004, 0x0006, 0x9082, 0x0051, 0x000e, ++ 0x0208, 0x8004, 0x601a, 0x080c, 0xcc1f, 0x6043, 0x0000, 0x000e, ++ 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x754c, ++ 0x9582, 0x0001, 0x0608, 0x7050, 0x2060, 0x6000, 0x9086, 0x0000, ++ 0x0148, 0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1208, 0x0cb0, 0x2061, ++ 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x754e, 0x9ca8, 0x0018, ++ 0x7060, 0x9502, 0x1230, 0x7552, 0x9085, 0x0001, 0x012e, 0x00ee, ++ 0x0005, 0x7053, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084, ++ 0x000f, 0x0002, 0x95e1, 0x95ea, 0x9605, 0x9620, 0xb77d, 0xb79a, ++ 0xb7b5, 0x95e1, 0x95ea, 0x95e1, 0x963c, 0x95e1, 0x95e1, 0x95e1, ++ 0x95e1, 0x9186, 0x0013, 0x1128, 0x080c, 0x8026, 0x080c, 0x8125, ++ 0x0005, 0x0005, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d84, ++ 0x0013, 0x006e, 0x0005, 0x9603, 0x9d1f, 0x9ee0, 0x9603, 0x9f6e, ++ 0x98e8, 0x9603, 0x9603, 0x9ca1, 0xa463, 0x9603, 0x9603, 0x9603, ++ 0x9603, 0x9603, 0x9603, 0x080c, 0x0d84, 0x0066, 0x6000, 0x90b2, ++ 0x0016, 0x1a0c, 0x0d84, 0x0013, 0x006e, 0x0005, 0x961e, 0xaaef, ++ 0x961e, 0x961e, 0x961e, 0x961e, 0x961e, 0x961e, 0xaa94, 0xac61, ++ 0x961e, 0xab21, 0xaba0, 0xab21, 0xaba0, 0x961e, 0x080c, 0x0d84, ++ 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d84, 0x6000, 0x0002, 0x963a, ++ 0xa4a5, 0xa574, 0xa69f, 0xa838, 0x963a, 0x963a, 0x963a, 0xa47e, ++ 0xaa2b, 0xaa2e, 0x963a, 0x963a, 0x963a, 0x963a, 0xaa57, 0x963a, ++ 0x963a, 0x963a, 0x080c, 0x0d84, 0x0066, 0x6000, 0x90b2, 0x0016, ++ 0x1a0c, 0x0d84, 0x0013, 0x006e, 0x0005, 0x9655, 0x9655, 0x9694, ++ 0x972f, 0x979c, 0x9655, 0x9655, 0x9655, 0x9657, 0x9655, 0x9655, ++ 0x9655, 0x9655, 0x9655, 0x9655, 0x9655, 0x080c, 0x0d84, 0x9186, ++ 0x004c, 0x0588, 0x9186, 0x0003, 0x190c, 0x0d84, 0x0096, 0x601c, ++ 0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa87c, ++ 0x9084, 0x8000, 0xc0b5, 0xa87e, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, ++ 0x9006, 0xa836, 0xa83a, 0xa884, 0x9092, 0x199a, 0x0210, 0x2001, ++ 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x009e, 0x2c10, ++ 0x080c, 0x18b7, 0x080c, 0x7c3a, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0x820b, 0x012e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, ++ 0x2c00, 0x080c, 0x97be, 0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079, ++ 0x1800, 0x7a88, 0x9290, 0x0018, 0x6014, 0x2048, 0xac78, 0x0046, ++ 0xa8e0, 0x9005, 0x1140, 0xa8dc, 0x921a, 0x0140, 0x0220, 0xa87b, ++ 0x0007, 0x2010, 0x0028, 0xa87b, 0x0015, 0x0010, 0xa87b, 0x0000, ++ 0x8214, 0xa883, 0x0000, 0xaa02, 0x0006, 0x0016, 0x0026, 0x00c6, ++ 0x00d6, 0x00e6, 0x00f6, 0x2400, 0x9005, 0x1108, 0x009a, 0x2100, ++ 0x9086, 0x0015, 0x1118, 0x2001, 0x0001, 0x0038, 0x2100, 0x9086, ++ 0x0016, 0x0118, 0x2001, 0x0001, 0x002a, 0x94a4, 0x0007, 0x8423, ++ 0x9405, 0x0002, 0x96f7, 0x96f7, 0x96f2, 0x96f5, 0x96f7, 0x96ef, ++ 0x96e2, 0x96e2, 0x96e2, 0x96e2, 0x96e2, 0x96e2, 0x96e2, 0x96e2, ++ 0x96e2, 0x96e2, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, ++ 0x000e, 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, 0x0d84, 0x080c, ++ 0xa0f1, 0x0028, 0x080c, 0xa1cf, 0x0010, 0x080c, 0xa2bc, 0x00fe, ++ 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e, ++ 0x080c, 0x987c, 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100, ++ 0x00ae, 0x8006, 0x8006, 0x8007, 0x97bc, 0x003f, 0x9084, 0xffc0, ++ 0x9080, 0x0002, 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000, ++ 0x2041, 0x11fd, 0x080c, 0x9a1f, 0x0160, 0x000e, 0x9005, 0x0120, ++ 0x00fe, 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, ++ 0x9554, 0x2001, 0x002c, 0x900e, 0x080c, 0x98db, 0x0c70, 0x9182, ++ 0x0047, 0x0002, 0x973b, 0x973b, 0x973d, 0x9772, 0x973b, 0x973b, ++ 0x973b, 0x973b, 0x9785, 0x080c, 0x0d84, 0x00d6, 0x0016, 0x0096, ++ 0x080c, 0x80d6, 0x080c, 0x820b, 0x6003, 0x0004, 0x6114, 0x2148, ++ 0xa87c, 0xd0fc, 0x01b8, 0xa878, 0x9005, 0x1158, 0xa894, 0x9005, ++ 0x0140, 0x2001, 0x0000, 0x900e, 0x080c, 0x98db, 0x080c, 0x9554, ++ 0x00a8, 0x6003, 0x0002, 0xa8a4, 0xa9a8, 0x9105, 0x1178, 0xa8ae, ++ 0xa8b2, 0x0c78, 0xa87f, 0x0020, 0xa88c, 0xa88a, 0xa8a4, 0xa8ae, ++ 0xa8a8, 0xa8b2, 0xa8c7, 0x0000, 0xa8cb, 0x0000, 0x009e, 0x001e, ++ 0x00de, 0x0005, 0x080c, 0x80d6, 0x00d6, 0x0096, 0x6114, 0x2148, ++ 0x080c, 0xb0ad, 0x0120, 0xa87b, 0x0006, 0x080c, 0x61a9, 0x009e, ++ 0x00de, 0x080c, 0x9554, 0x0804, 0x820b, 0x080c, 0x80d6, 0x080c, ++ 0x2d1a, 0x080c, 0xb76c, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, ++ 0xb0ad, 0x0120, 0xa87b, 0x0029, 0x080c, 0x61a9, 0x009e, 0x00de, ++ 0x080c, 0x9554, 0x0804, 0x820b, 0x9182, 0x0047, 0x0002, 0x97ac, ++ 0x97ae, 0x97ac, 0x97ac, 0x97ac, 0x97ac, 0x97ac, 0x97ac, 0x97ac, ++ 0x97ac, 0x97ac, 0x97ac, 0x97ae, 0x080c, 0x0d84, 0x00d6, 0x0096, ++ 0x080c, 0x1489, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, ++ 0x080c, 0x61a9, 0x009e, 0x00de, 0x0804, 0x9554, 0x0026, 0x0036, ++ 0x0056, 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, 0x0fae, ++ 0x000e, 0x090c, 0x0d84, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, ++ 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079, 0x1800, ++ 0x7988, 0x9188, 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, 0x2950, ++ 0x00a6, 0x2001, 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, 0x0001, ++ 0x9182, 0x0034, 0x1228, 0x2011, 0x001f, 0x080c, 0xace6, 0x04c0, ++ 0x2130, 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xace6, 0x96b2, ++ 0x0034, 0xb004, 0x904d, 0x0110, 0x080c, 0x0f60, 0x080c, 0x0fae, ++ 0x01d0, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, ++ 0x968a, 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, 0xace6, ++ 0x00b8, 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, ++ 0x080c, 0xace6, 0x0c18, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, ++ 0x852f, 0x95ad, 0x0050, 0xb566, 0xb070, 0xc0fd, 0xb072, 0x0048, ++ 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050, ++ 0xb566, 0x2a48, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x61a9, ++ 0x000e, 0x2048, 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e, 0x006e, ++ 0x005e, 0x003e, 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096, 0x0006, ++ 0x080c, 0x0fae, 0x000e, 0x090c, 0x0d84, 0xa960, 0x21e8, 0xa95c, ++ 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xaa66, ++ 0xa87a, 0x2079, 0x1800, 0x7988, 0x810c, 0x9188, 0x000c, 0x9182, ++ 0x001a, 0x0210, 0x2009, 0x001a, 0x21a8, 0x810b, 0xa972, 0xac76, ++ 0x2e98, 0xa85c, 0x9080, 0x001f, 0x20a0, 0x2001, 0x0205, 0x200c, ++ 0x918d, 0x0080, 0x2102, 0x4003, 0x2003, 0x0000, 0x080c, 0x61a9, ++ 0x009e, 0x00fe, 0x00de, 0x0005, 0x0016, 0x00d6, 0x00f6, 0x0096, ++ 0x0016, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x001e, ++ 0x2079, 0x0200, 0x2e98, 0x2021, 0x003e, 0x901e, 0x9282, 0x0020, ++ 0x0218, 0x2011, 0x0020, 0x2018, 0x9486, 0x003e, 0x1170, 0x0096, ++ 0x080c, 0x0fae, 0x2900, 0x009e, 0x05b8, 0xa806, 0x2048, 0xa860, ++ 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x3300, 0x908e, 0x0260, ++ 0x0140, 0x2009, 0x0280, 0x9102, 0x920a, 0x0218, 0x2010, 0x2100, ++ 0x9318, 0x2200, 0x9402, 0x1220, 0x2410, 0x9006, 0x9398, 0x0002, ++ 0x2020, 0x22a8, 0xa800, 0x9200, 0xa802, 0x20e1, 0x0000, 0x4003, ++ 0x83ff, 0x0180, 0x3300, 0x9086, 0x0280, 0x1130, 0x7814, 0x8000, ++ 0x9085, 0x0080, 0x7816, 0x2e98, 0x2310, 0x84ff, 0x0904, 0x988b, ++ 0x0804, 0x988d, 0x9085, 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, ++ 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348, ++ 0xa87a, 0xa982, 0x080c, 0x619c, 0x009e, 0x003e, 0x00de, 0x0005, ++ 0x91b6, 0x0015, 0x1118, 0x080c, 0x9554, 0x0030, 0x91b6, 0x0016, ++ 0x190c, 0x0d84, 0x080c, 0x9554, 0x0005, 0x20a9, 0x000e, 0x20e1, ++ 0x0000, 0x2e98, 0x6014, 0x0096, 0x2048, 0xa860, 0x20e8, 0xa85c, ++ 0x20a0, 0x009e, 0x4003, 0x0136, 0x9080, 0x001b, 0x2011, 0x0006, ++ 0x20a9, 0x0001, 0x3418, 0x8318, 0x23a0, 0x4003, 0x3318, 0x8318, ++ 0x2398, 0x8211, 0x1db8, 0x2011, 0x0006, 0x013e, 0x20a0, 0x3318, ++ 0x8318, 0x2398, 0x4003, 0x3418, 0x8318, 0x23a0, 0x8211, 0x1db8, ++ 0x0096, 0x080c, 0xb0ad, 0x0130, 0x6014, 0x2048, 0xa807, 0x0000, ++ 0xa867, 0x0103, 0x009e, 0x0804, 0x9554, 0x0096, 0x00d6, 0x0036, ++ 0x7330, 0x9386, 0x0200, 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8bf, ++ 0x0000, 0x00be, 0x6014, 0x9005, 0x0130, 0x2048, 0xa807, 0x0000, ++ 0xa867, 0x0103, 0xab32, 0x080c, 0x9554, 0x003e, 0x00de, 0x009e, ++ 0x0005, 0x0011, 0x1d48, 0x0cc8, 0x0006, 0x0016, 0x080c, 0xb759, ++ 0x0188, 0x6014, 0x9005, 0x1170, 0x600b, 0x0003, 0x601b, 0x0000, ++ 0x6043, 0x0000, 0x2009, 0x0022, 0x080c, 0x9cf7, 0x9006, 0x001e, ++ 0x000e, 0x0005, 0x9085, 0x0001, 0x0cd0, 0x0096, 0x0016, 0x20a9, ++ 0x0014, 0x9e80, 0x000c, 0x20e1, 0x0000, 0x2098, 0x6014, 0x2048, ++ 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001, ++ 0x0205, 0x2003, 0x0001, 0x2099, 0x0260, 0x20a9, 0x0016, 0x4003, ++ 0x20a9, 0x000a, 0xa804, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, ++ 0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0002, 0x2099, ++ 0x0260, 0x20a9, 0x0020, 0x4003, 0x2003, 0x0000, 0x6014, 0x2048, ++ 0xa800, 0x2048, 0xa867, 0x0103, 0x080c, 0x9554, 0x001e, 0x009e, ++ 0x0005, 0x0096, 0x0016, 0x900e, 0x7030, 0x9086, 0x0100, 0x0140, ++ 0x7038, 0x9084, 0x00ff, 0x800c, 0x703c, 0x9084, 0x00ff, 0x8004, ++ 0x9080, 0x0004, 0x9108, 0x810b, 0x2011, 0x0002, 0x2019, 0x000c, ++ 0x6014, 0x2048, 0x080c, 0xace6, 0x080c, 0xb0ad, 0x0140, 0x6014, ++ 0x2048, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, ++ 0x9554, 0x001e, 0x009e, 0x0005, 0x0016, 0x0096, 0x7030, 0x9086, ++ 0x0100, 0x1118, 0x2009, 0x0004, 0x0010, 0x7034, 0x800c, 0x810b, ++ 0x2011, 0x000c, 0x2019, 0x000c, 0x6014, 0x2048, 0xa804, 0x0096, ++ 0x9005, 0x0108, 0x2048, 0x080c, 0xace6, 0x009e, 0x080c, 0xb0ad, ++ 0x0148, 0xa804, 0x9005, 0x1158, 0xa807, 0x0000, 0xa864, 0xa8e2, ++ 0xa867, 0x0103, 0x080c, 0x9554, 0x009e, 0x001e, 0x0005, 0x0086, ++ 0x2040, 0xa030, 0x8007, 0x9086, 0x0100, 0x1118, 0x080c, 0x9e99, ++ 0x00e0, 0xa034, 0x8007, 0x800c, 0x8806, 0x8006, 0x8007, 0x90bc, ++ 0x003f, 0x9084, 0xffc0, 0x9080, 0x000c, 0xa87b, 0x0000, 0xa883, ++ 0x0000, 0xa897, 0x4000, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, ++ 0x0000, 0x2041, 0x11e3, 0x0019, 0x0d08, 0x008e, 0x0898, 0x0096, ++ 0x0006, 0x080c, 0x0fae, 0x000e, 0x01b0, 0xa8ab, 0x0dcb, 0xa876, ++ 0x000e, 0xa8a2, 0x0006, 0xae6a, 0x2800, 0xa89e, 0xa97a, 0xaf72, ++ 0xaa8e, 0xab92, 0xac96, 0xad9a, 0x0086, 0x2940, 0x080c, 0x108c, ++ 0x008e, 0x9085, 0x0001, 0x009e, 0x0005, 0x00e6, 0x00d6, 0x0026, ++ 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, ++ 0x9206, 0x1520, 0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, ++ 0x9206, 0x11e0, 0x6043, 0x0000, 0x2c68, 0x0016, 0x2009, 0x0035, ++ 0x080c, 0xb6d9, 0x001e, 0x1158, 0x622c, 0x2268, 0x2071, 0x026c, ++ 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386, 0x0006, 0x0128, 0x080c, ++ 0x9554, 0x0020, 0x0039, 0x0010, 0x080c, 0x9b31, 0x002e, 0x00de, ++ 0x00ee, 0x0005, 0x0096, 0x6814, 0x2048, 0x9186, 0x0015, 0x0904, ++ 0x9b19, 0x918e, 0x0016, 0x1904, 0x9b2f, 0x700c, 0x908c, 0xff00, ++ 0x9186, 0x1700, 0x0120, 0x9186, 0x0300, 0x1904, 0x9af3, 0x89ff, ++ 0x1138, 0x6800, 0x9086, 0x000f, 0x0904, 0x9ad6, 0x0804, 0x9b2d, ++ 0x6808, 0x9086, 0xffff, 0x1904, 0x9b1b, 0xa87c, 0x9084, 0x0060, ++ 0x9086, 0x0020, 0x1128, 0xa83c, 0xa940, 0x9105, 0x1904, 0x9b1b, ++ 0x6824, 0xd0b4, 0x1904, 0x9b1b, 0x080c, 0xb278, 0x685c, 0xa882, ++ 0xa87c, 0xc0dc, 0xc0f4, 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, ++ 0x2001, 0x000a, 0x080c, 0x7a4b, 0xa884, 0x920a, 0x0208, 0x8011, ++ 0xaa86, 0x82ff, 0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0xae04, ++ 0x00ce, 0x0804, 0x9b2d, 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, ++ 0x5755, 0x0010, 0x080c, 0x5ac6, 0x00ce, 0x1904, 0x9b1b, 0x00c6, ++ 0x2d60, 0x080c, 0x9554, 0x00ce, 0x0804, 0x9b2d, 0x00c6, 0x080c, ++ 0x95a1, 0x0198, 0x6017, 0x0000, 0x6810, 0x6012, 0x080c, 0xb4e6, ++ 0x6023, 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0x9554, 0x00ce, ++ 0x080c, 0x95ce, 0x00ce, 0x0804, 0x9b2d, 0x2001, 0x1955, 0x2004, ++ 0x6842, 0x00ce, 0x04d0, 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, ++ 0x00b6, 0x2058, 0xb900, 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, ++ 0xa883, 0x0003, 0x080c, 0xb71f, 0x6007, 0x0085, 0x6003, 0x000b, ++ 0x6023, 0x0002, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x00ce, 0x00e8, ++ 0x700c, 0x9086, 0x2a00, 0x1138, 0x2001, 0x1955, 0x2004, 0x6842, ++ 0x00a0, 0x0479, 0x00a0, 0x89ff, 0x090c, 0x0d84, 0x00c6, 0x00d6, ++ 0x2d60, 0xa867, 0x0103, 0xa87b, 0x0003, 0x080c, 0xacd6, 0x080c, ++ 0xb278, 0x080c, 0x9584, 0x00de, 0x00ce, 0x080c, 0x9554, 0x009e, ++ 0x0005, 0x9186, 0x0015, 0x1128, 0x2001, 0x1955, 0x2004, 0x6842, ++ 0x0068, 0x918e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, ++ 0xcc1f, 0x080c, 0x79df, 0x080c, 0x9554, 0x00ce, 0x080c, 0x9554, ++ 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, ++ 0x0130, 0x2001, 0x1955, 0x2004, 0x6842, 0x0804, 0x9ba9, 0x00c6, ++ 0x2d60, 0x080c, 0xad11, 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, ++ 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, ++ 0x7bcb, 0x080c, 0x8125, 0x00ce, 0x04e0, 0x6800, 0x9086, 0x000f, ++ 0x01b0, 0x89ff, 0x090c, 0x0d84, 0x6800, 0x9086, 0x0004, 0x1198, ++ 0xa87c, 0xd0ac, 0x0180, 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, ++ 0xc0f4, 0xc0fc, 0xa882, 0x2001, 0x0001, 0x6832, 0x00e8, 0x2001, ++ 0x0007, 0x6832, 0x00c8, 0xa87c, 0xd0b4, 0x1138, 0xd0ac, 0x0db8, ++ 0xa838, 0xa934, 0x9105, 0x0d98, 0x0c30, 0xd2ec, 0x1d80, 0x7024, ++ 0x9306, 0x1118, 0x7020, 0x9406, 0x0d50, 0x7020, 0x683e, 0x7024, ++ 0x683a, 0x2001, 0x0005, 0x6832, 0x080c, 0xb3e0, 0x080c, 0x8125, ++ 0x0010, 0x080c, 0x9554, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, ++ 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, ++ 0xba10, 0x00be, 0x9206, 0x1904, 0x9c11, 0x700c, 0x6210, 0x00b6, ++ 0x2258, 0xba14, 0x00be, 0x9206, 0x1904, 0x9c11, 0x6038, 0x2068, ++ 0x6a20, 0x9286, 0x0007, 0x0904, 0x9c11, 0x9286, 0x0002, 0x0904, ++ 0x9c11, 0x9286, 0x0000, 0x05e8, 0x6808, 0x633c, 0x9306, 0x15c8, ++ 0x2071, 0x026c, 0x9186, 0x0015, 0x0570, 0x918e, 0x0016, 0x1100, ++ 0x00c6, 0x6038, 0x2060, 0x6104, 0x9186, 0x004b, 0x01c0, 0x9186, ++ 0x004c, 0x01a8, 0x9186, 0x004d, 0x0190, 0x9186, 0x004e, 0x0178, ++ 0x9186, 0x0052, 0x0160, 0x6014, 0x0096, 0x2048, 0x080c, 0xb0ad, ++ 0x090c, 0x0d84, 0xa883, 0x0003, 0x009e, 0x080c, 0xb71f, 0x6007, ++ 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x7bcb, 0x080c, ++ 0x8125, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001, 0x1955, 0x2004, ++ 0x7042, 0x080c, 0x9554, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00b6, ++ 0x0096, 0x00f6, 0x6014, 0x2048, 0x6010, 0x2058, 0x91b6, 0x0015, ++ 0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c, 0xbc02, 0x0460, 0x0096, ++ 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0010, 0x2019, 0x000a, ++ 0x20a9, 0x0004, 0x080c, 0xa439, 0x002e, 0x003e, 0x015e, 0x009e, ++ 0x1904, 0x9c80, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, ++ 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c, 0xa439, 0x002e, ++ 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a, 0x733c, 0xbb0e, ++ 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e, ++ 0x00be, 0x0804, 0x9920, 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a, ++ 0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, ++ 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, ++ 0x2031, 0x0000, 0x2041, 0x11e3, 0x080c, 0x9a1f, 0x0130, 0x00fe, ++ 0x009e, 0x080c, 0x9554, 0x00be, 0x0005, 0x080c, 0x9e99, 0x0cb8, ++ 0x2b78, 0x00f6, 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x00fe, 0x00c6, ++ 0x080c, 0x94fe, 0x2f00, 0x6012, 0x6017, 0x0000, 0x6023, 0x0001, ++ 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x5b61, ++ 0x080c, 0x5b8d, 0x080c, 0x7c1d, 0x080c, 0x8125, 0x00ce, 0x0804, ++ 0x9c53, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0d84, 0x91b2, 0x0040, ++ 0x1a04, 0x9d09, 0x0002, 0x9cf7, 0x9cf7, 0x9ced, 0x9cf7, 0x9cf7, ++ 0x9cf7, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, ++ 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, ++ 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, ++ 0x9ceb, 0x9ceb, 0x9cf7, 0x9ceb, 0x9cf7, 0x9cf7, 0x9ceb, 0x9ceb, ++ 0x9ceb, 0x9ceb, 0x9ceb, 0x9ced, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, ++ 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9cf7, 0x9cf7, 0x9ceb, ++ 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, 0x9ceb, ++ 0x9cf7, 0x9ceb, 0x9ceb, 0x080c, 0x0d84, 0x0066, 0x00b6, 0x6610, ++ 0x2658, 0xb8bc, 0xc08c, 0xb8be, 0x00be, 0x006e, 0x0000, 0x6003, ++ 0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c, 0x7c1d, 0x0010, ++ 0x080c, 0x7bcb, 0x0126, 0x2091, 0x8000, 0x080c, 0x8125, 0x012e, ++ 0x0005, 0x2600, 0x0002, 0x9d1d, 0x9d1d, 0x9d1d, 0x9cf7, 0x9cf7, ++ 0x9d1d, 0x9d1d, 0x9d1d, 0x9d1d, 0x9cf7, 0x9d1d, 0x9cf7, 0x9d1d, ++ 0x9cf7, 0x9d1d, 0x9d1d, 0x9d1d, 0x9d1d, 0x080c, 0x0d84, 0x6004, ++ 0x90b2, 0x0053, 0x1a0c, 0x0d84, 0x91b6, 0x0013, 0x0904, 0x9dd4, ++ 0x91b6, 0x0027, 0x1904, 0x9d8f, 0x080c, 0x8026, 0x6004, 0x080c, ++ 0xb284, 0x01a8, 0x080c, 0xb295, 0x01a0, 0x908e, 0x0021, 0x0904, ++ 0x9d8c, 0x908e, 0x0022, 0x1130, 0x080c, 0x994c, 0x0904, 0x9d88, ++ 0x0804, 0x9d89, 0x908e, 0x003d, 0x0904, 0x9d8c, 0x04d8, 0x080c, ++ 0x2d3f, 0x2001, 0x0007, 0x080c, 0x5b61, 0x6010, 0x00b6, 0x2058, ++ 0xb9a0, 0x00be, 0x080c, 0x9e99, 0x9186, 0x007e, 0x1148, 0x2001, ++ 0x1836, 0x2014, 0xc285, 0x080c, 0x6877, 0x1108, 0xc2ad, 0x2202, ++ 0x0036, 0x2019, 0x0028, 0x080c, 0x2e2f, 0x003e, 0x0016, 0x0026, ++ 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, 0x7d55, 0x0076, 0x903e, ++ 0x080c, 0x7c4d, 0x6010, 0x00b6, 0x905d, 0x0100, 0x00be, 0x2c08, ++ 0x080c, 0xc73e, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0xb76c, ++ 0x080c, 0x5bd1, 0x080c, 0xb4de, 0x080c, 0x9554, 0x080c, 0x8125, ++ 0x0005, 0x080c, 0x9e99, 0x0cb0, 0x080c, 0x9ed5, 0x0c98, 0x9186, ++ 0x0014, 0x1db0, 0x080c, 0x8026, 0x6004, 0x908e, 0x0022, 0x1118, ++ 0x080c, 0x994c, 0x0d68, 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x080c, ++ 0xb284, 0x1190, 0x080c, 0x2d3f, 0x6010, 0x00b6, 0x2058, 0xb9a0, ++ 0x00be, 0x080c, 0x9e99, 0x9186, 0x007e, 0x1128, 0x2001, 0x1836, ++ 0x200c, 0xc185, 0x2102, 0x0870, 0x080c, 0xb295, 0x1118, 0x080c, ++ 0x9e99, 0x0840, 0x6004, 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, ++ 0x2071, 0x1893, 0x2079, 0x0000, 0x080c, 0x308f, 0x00fe, 0x00ee, ++ 0x0804, 0x9d82, 0x6004, 0x908e, 0x0021, 0x0d48, 0x908e, 0x0022, ++ 0x090c, 0x9e99, 0x0804, 0x9d82, 0x90b2, 0x0040, 0x1a04, 0x9e82, ++ 0x2008, 0x0002, 0x9e1c, 0x9e1d, 0x9e20, 0x9e23, 0x9e26, 0x9e29, ++ 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, ++ 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, ++ 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, ++ 0x9e2c, 0x9e37, 0x9e1a, 0x9e39, 0x9e37, 0x9e1a, 0x9e1a, 0x9e1a, ++ 0x9e1a, 0x9e1a, 0x9e37, 0x9e37, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, ++ 0x9e1a, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e69, 0x9e37, 0x9e1a, 0x9e33, ++ 0x9e1a, 0x9e1a, 0x9e1a, 0x9e34, 0x9e1a, 0x9e1a, 0x9e1a, 0x9e37, ++ 0x9e60, 0x9e1a, 0x080c, 0x0d84, 0x00d0, 0x2001, 0x000b, 0x0410, ++ 0x2001, 0x0003, 0x00f8, 0x2001, 0x0005, 0x00e0, 0x2001, 0x0001, ++ 0x00c8, 0x2001, 0x0009, 0x00b0, 0x080c, 0x8026, 0x6003, 0x0005, ++ 0x080c, 0x8125, 0x0070, 0x0018, 0x0010, 0x080c, 0x5b61, 0x0804, ++ 0x9e7a, 0x080c, 0x8026, 0x080c, 0xb76f, 0x6003, 0x0004, 0x080c, ++ 0x8125, 0x0005, 0x080c, 0x5b61, 0x080c, 0x8026, 0x6003, 0x0002, ++ 0x0036, 0x2019, 0x185d, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, ++ 0x1953, 0x201c, 0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, ++ 0x801b, 0x831b, 0x9318, 0x631a, 0x003e, 0x080c, 0x8125, 0x0c08, ++ 0x080c, 0x8026, 0x080c, 0xb4de, 0x080c, 0x9554, 0x080c, 0x8125, ++ 0x08c0, 0x00e6, 0x00f6, 0x2071, 0x1893, 0x2079, 0x0000, 0x080c, ++ 0x308f, 0x00fe, 0x00ee, 0x080c, 0x8026, 0x080c, 0x9554, 0x080c, ++ 0x8125, 0x0838, 0x080c, 0x8026, 0x6003, 0x0002, 0x080c, 0xb76f, ++ 0x0804, 0x8125, 0x2600, 0x2008, 0x0002, 0x9e97, 0x9e97, 0x9e97, ++ 0x9e7a, 0x9e7a, 0x9e97, 0x9e97, 0x9e97, 0x9e97, 0x9e7a, 0x9e97, ++ 0x9e7a, 0x9e97, 0x9e7a, 0x9e97, 0x9e97, 0x9e97, 0x9e97, 0x080c, ++ 0x0d84, 0x00e6, 0x0096, 0x0026, 0x0016, 0x080c, 0xb0ad, 0x0568, ++ 0x6014, 0x2048, 0xa864, 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086, ++ 0x0056, 0x1148, 0x080c, 0x4b95, 0x0130, 0x2001, 0x0000, 0x900e, ++ 0x2011, 0x4000, 0x0028, 0x2001, 0x0030, 0x900e, 0x2011, 0x4005, ++ 0x080c, 0xb644, 0x0090, 0xa868, 0xd0fc, 0x0178, 0xa807, 0x0000, ++ 0x0016, 0x6004, 0x908e, 0x0021, 0x0168, 0x908e, 0x003d, 0x0150, ++ 0x001e, 0xa867, 0x0103, 0xa833, 0x0100, 0x001e, 0x002e, 0x009e, ++ 0x00ee, 0x0005, 0x001e, 0x0009, 0x0cc0, 0x0096, 0x6014, 0x2048, ++ 0xa800, 0x2048, 0xa867, 0x0103, 0xa823, 0x8001, 0x009e, 0x0005, ++ 0x00b6, 0x6610, 0x2658, 0xb804, 0x9084, 0x00ff, 0x90b2, 0x000c, ++ 0x1a0c, 0x0d84, 0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xb56a, ++ 0x0804, 0x9f5d, 0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xb5b3, ++ 0x0804, 0x9f5d, 0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xb5df, ++ 0x0804, 0x9f5d, 0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xb500, ++ 0x0804, 0x9f5d, 0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xb2c4, ++ 0x0804, 0x9f5d, 0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xb305, ++ 0x0804, 0x9f5d, 0x6604, 0x96b6, 0x001f, 0x1118, 0x080c, 0x98f5, ++ 0x04e0, 0x6604, 0x96b6, 0x0000, 0x1118, 0x080c, 0x9c17, 0x04a8, ++ 0x6604, 0x96b6, 0x0022, 0x1118, 0x080c, 0x992d, 0x0470, 0x6604, ++ 0x96b6, 0x0035, 0x1118, 0x080c, 0x9a3d, 0x0438, 0x6604, 0x96b6, ++ 0x0039, 0x1118, 0x080c, 0x9baf, 0x0400, 0x6604, 0x96b6, 0x003d, ++ 0x1118, 0x080c, 0x9965, 0x00c8, 0x6604, 0x96b6, 0x0044, 0x1118, ++ 0x080c, 0x99a1, 0x0090, 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, ++ 0x99cc, 0x0058, 0x91b6, 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6, ++ 0x0016, 0x1128, 0x00be, 0x0804, 0xa178, 0x00be, 0x0005, 0x080c, ++ 0x95e9, 0x0cd8, 0x9f7a, 0x9f7d, 0x9f7a, 0x9fc2, 0x9f7a, 0xa0f1, ++ 0xa185, 0x9f7a, 0x9f7a, 0xa152, 0x9f7a, 0xa166, 0x0096, 0x080c, ++ 0x1489, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x009e, ++ 0x0804, 0x9554, 0xa001, 0xa001, 0x0005, 0x00e6, 0x2071, 0x1800, ++ 0x7088, 0x9086, 0x0074, 0x1540, 0x080c, 0xc70f, 0x11b0, 0x6010, ++ 0x00b6, 0x2058, 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110, ++ 0xc0c5, 0xb802, 0x00e9, 0x00be, 0x2001, 0x0006, 0x080c, 0x5b61, ++ 0x080c, 0x2d3f, 0x080c, 0x9554, 0x0088, 0x2001, 0x000a, 0x080c, ++ 0x5b61, 0x080c, 0x2d3f, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x0010, 0x080c, 0xa0dc, 0x00ee, 0x0005, ++ 0x00d6, 0xb800, 0xd084, 0x0160, 0x9006, 0x080c, 0x5b4d, 0x2069, ++ 0x1852, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x5b8d, ++ 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, 0x2011, 0x1822, 0x2204, ++ 0x9086, 0x0074, 0x1904, 0xa0c0, 0x6010, 0x2058, 0xbaa0, 0x9286, ++ 0x007e, 0x1120, 0x080c, 0xa2c7, 0x0804, 0xa025, 0x080c, 0xa2bc, ++ 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, 0x9005, ++ 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, ++ 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xb644, 0x0030, ++ 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, 0x0006, ++ 0x080c, 0x5b61, 0x080c, 0x2d3f, 0x080c, 0x9554, 0x0804, 0xa0c1, ++ 0x080c, 0xa0c5, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, 0xd0f4, ++ 0x0170, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, 0x2001, ++ 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xb644, 0x08f8, 0x2001, ++ 0x0004, 0x080c, 0x5b61, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x0804, 0xa0c1, 0xb85c, 0xd0e4, 0x01d0, ++ 0x080c, 0xb480, 0x080c, 0x6877, 0x0110, 0xd0dc, 0x1938, 0x2011, ++ 0x1836, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x193c, 0x2004, 0x00f6, ++ 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x2471, 0x78e2, 0x00fe, ++ 0x0804, 0x9ff6, 0x080c, 0xb4bd, 0x2011, 0x1836, 0x2204, 0xc0a5, ++ 0x2012, 0x0006, 0x080c, 0xc860, 0x000e, 0x1904, 0x9ff6, 0xc0b5, ++ 0x2012, 0x2001, 0x0006, 0x080c, 0x5b61, 0x9006, 0x080c, 0x5b4d, ++ 0x00c6, 0x2001, 0x180e, 0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079, ++ 0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, 0x9084, 0x00ff, 0x78e6, ++ 0x7076, 0x7010, 0x78ea, 0x707a, 0x908c, 0x00ff, 0x00ee, 0x780c, ++ 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2446, 0x00f6, 0x2100, 0x900e, ++ 0x080c, 0x23fd, 0x7956, 0x00fe, 0x9186, 0x0081, 0x01d8, 0x2009, ++ 0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, ++ 0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2446, ++ 0x00f6, 0x2079, 0x1800, 0x797a, 0x2100, 0x900e, 0x080c, 0x23fd, ++ 0x7956, 0x00fe, 0x8108, 0x080c, 0x5bb0, 0x2b00, 0x00ce, 0x1904, ++ 0x9ff6, 0x6012, 0x2009, 0x180e, 0x210c, 0xd19c, 0x0150, 0x2009, ++ 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, ++ 0xb916, 0x2001, 0x0002, 0x080c, 0x5b61, 0x6023, 0x0001, 0x6003, ++ 0x0001, 0x6007, 0x0002, 0x080c, 0x7c1d, 0x080c, 0x8125, 0x0008, ++ 0x00d9, 0x00de, 0x009e, 0x00be, 0x0005, 0x00e6, 0x080c, 0xccd1, ++ 0x0188, 0x2071, 0x0260, 0x7108, 0x720c, 0x918c, 0x00ff, 0x1118, ++ 0x9284, 0xff00, 0x0138, 0x6010, 0x2058, 0xb8a0, 0xd0bc, 0x1110, ++ 0xb912, 0xba16, 0x00ee, 0x0005, 0x2030, 0x2001, 0x0007, 0x080c, ++ 0x5b61, 0x080c, 0x4dfe, 0x1120, 0x2001, 0x0007, 0x080c, 0x5b8d, ++ 0x080c, 0x2d3f, 0x6020, 0x9086, 0x000a, 0x1108, 0x0005, 0x0804, ++ 0x9554, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071, 0x1800, 0x7088, ++ 0x9086, 0x0014, 0x1904, 0xa149, 0x080c, 0x4dfe, 0x1170, 0x6014, ++ 0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, ++ 0x0006, 0x080c, 0x44f9, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, ++ 0x080c, 0x5ca8, 0x080c, 0x9fb0, 0x00de, 0x080c, 0xa38d, 0x1588, ++ 0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, ++ 0x5b61, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff, ++ 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, ++ 0x080c, 0xb644, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029, ++ 0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, ++ 0x080c, 0x2d3f, 0x6020, 0x9086, 0x000a, 0x0138, 0x080c, 0x9554, ++ 0x0020, 0x080c, 0x9e99, 0x080c, 0xa0dc, 0x001e, 0x002e, 0x00ee, ++ 0x00be, 0x0005, 0x2011, 0x1822, 0x2204, 0x9086, 0x0014, 0x1160, ++ 0x2001, 0x0002, 0x080c, 0x5b61, 0x6003, 0x0001, 0x6007, 0x0001, ++ 0x080c, 0x7c1d, 0x0804, 0x8125, 0x0804, 0xa0dc, 0x2030, 0x2011, ++ 0x1822, 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, 0x1120, ++ 0x2001, 0x0007, 0x080c, 0x5b61, 0x0804, 0x9554, 0x0804, 0xa0dc, ++ 0x0002, 0x9f7a, 0xa190, 0x9f7a, 0xa1cf, 0x9f7a, 0xa278, 0xa185, ++ 0x9f7a, 0x9f7a, 0xa28b, 0x9f7a, 0xa29b, 0x6604, 0x9686, 0x0003, ++ 0x0904, 0xa0f1, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9554, 0x0005, ++ 0x00b6, 0x00d6, 0x00c6, 0x080c, 0xa2ab, 0x11a0, 0x9006, 0x080c, ++ 0x5b4d, 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x2001, 0x0002, 0x080c, ++ 0x5b61, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x7c1d, 0x080c, ++ 0x8125, 0x0408, 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, ++ 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001, ++ 0xb842, 0x601b, 0x000a, 0x0078, 0x2009, 0x026f, 0x2104, 0x9084, ++ 0xff00, 0x9086, 0x1900, 0x1108, 0x08a0, 0x080c, 0x2d1a, 0x080c, ++ 0xb76c, 0x080c, 0xa0dc, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, ++ 0x00b6, 0x0026, 0x9016, 0x080c, 0xa2b9, 0x00d6, 0x2069, 0x194b, ++ 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, ++ 0x1138, 0x2069, 0x181e, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, ++ 0x00de, 0x0088, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0002, 0x080c, ++ 0x5b61, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x7c1d, 0x080c, ++ 0x8125, 0x0804, 0xa248, 0x080c, 0xb0ad, 0x01a0, 0x6014, 0x2048, ++ 0xa864, 0x2010, 0x9086, 0x0139, 0x1128, 0x2001, 0x0002, 0x080c, ++ 0xb69a, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, 0x0118, 0x2001, ++ 0x0001, 0x0ca8, 0x2001, 0x180d, 0x2004, 0xd0dc, 0x0148, 0x6010, ++ 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, 0x9006, 0x0c38, ++ 0x080c, 0x9e99, 0x2009, 0x026e, 0x2134, 0x96b4, 0x00ff, 0x9686, ++ 0x0005, 0x0510, 0x9686, 0x000b, 0x01c8, 0x2009, 0x026f, 0x2104, ++ 0x9084, 0xff00, 0x1118, 0x9686, 0x0009, 0x01b0, 0x9086, 0x1900, ++ 0x1168, 0x9686, 0x0009, 0x0180, 0x2001, 0x0004, 0x080c, 0x5b61, ++ 0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0010, 0x080c, 0xa0dc, ++ 0x002e, 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, 0x0160, 0x6014, ++ 0x2048, 0x080c, 0xb0ad, 0x0140, 0xa864, 0x9086, 0x0139, 0x0118, ++ 0xa868, 0xd0fc, 0x0108, 0x0c50, 0x6010, 0x2058, 0xb840, 0x9084, ++ 0x00ff, 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, 0x000a, 0x6007, ++ 0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x00e6, 0x2071, ++ 0x1800, 0x080c, 0x5677, 0x00ee, 0x0010, 0x080c, 0x2d1a, 0x0870, ++ 0x080c, 0xa2b9, 0x1160, 0x2001, 0x0004, 0x080c, 0x5b61, 0x6003, ++ 0x0001, 0x6007, 0x0003, 0x080c, 0x7c1d, 0x0804, 0x8125, 0x080c, ++ 0x9e99, 0x0804, 0xa0dc, 0x0469, 0x1160, 0x2001, 0x0008, 0x080c, ++ 0x5b61, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x7c1d, 0x0804, ++ 0x8125, 0x0804, 0xa0dc, 0x00e9, 0x1160, 0x2001, 0x000a, 0x080c, ++ 0x5b61, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x7c1d, 0x0804, ++ 0x8125, 0x0804, 0xa0dc, 0x2009, 0x026e, 0x2104, 0x9086, 0x0003, ++ 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x2a00, ++ 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, 0x6110, ++ 0x2158, 0x080c, 0x5c1c, 0x001e, 0x00ce, 0x00be, 0x0005, 0x00b6, ++ 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, 0x2009, ++ 0x1836, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, 0xa35f, 0x0560, ++ 0x2009, 0x1836, 0x2104, 0xc0cd, 0x200a, 0x080c, 0x5f29, 0x0158, ++ 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xc9c5, 0x2001, 0x180c, ++ 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x080c, ++ 0x2ce5, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2b1e, 0x00ee, 0x00c6, ++ 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, 0x2e11, 0x8108, ++ 0x1f04, 0xa2fd, 0x015e, 0x00ce, 0x080c, 0xa2bc, 0x2071, 0x0260, ++ 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1836, 0x200c, 0xc1c5, ++ 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, 0x1108, ++ 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1836, 0x2102, 0x2079, 0x0100, ++ 0x2e04, 0x9084, 0x00ff, 0x2069, 0x181d, 0x206a, 0x78e6, 0x0006, ++ 0x8e70, 0x2e04, 0x2069, 0x181e, 0x206a, 0x78ea, 0x7832, 0x7836, ++ 0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, 0x182a, 0x200a, ++ 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x2446, 0x080c, 0x6877, ++ 0x0170, 0x2071, 0x0260, 0x2069, 0x194f, 0x7048, 0x206a, 0x704c, ++ 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xb480, 0x0040, ++ 0x2001, 0x0006, 0x080c, 0x5b61, 0x080c, 0x2d3f, 0x080c, 0x9554, ++ 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x0096, ++ 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182a, 0x231c, 0x83ff, ++ 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084, ++ 0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, 0x0004, ++ 0x2b48, 0x2019, 0x000a, 0x080c, 0xa439, 0x1148, 0x2011, 0x027a, ++ 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xa439, 0x1100, 0x015e, ++ 0x00ee, 0x003e, 0x002e, 0x009e, 0x0005, 0x00e6, 0x2071, 0x0260, ++ 0x7034, 0x9086, 0x0014, 0x11a8, 0x7038, 0x9086, 0x0800, 0x1188, ++ 0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00, 0x9086, 0x0100, 0x1138, ++ 0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0x9006, 0x0010, 0x9085, ++ 0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096, 0x00c6, 0x0076, 0x0056, ++ 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2029, 0x19bd, ++ 0x252c, 0x2021, 0x19c3, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, ++ 0x724c, 0x706c, 0x9202, 0x1a04, 0xa411, 0x080c, 0xc9f1, 0x0904, ++ 0xa40a, 0x6720, 0x9786, 0x0007, 0x05e8, 0x2500, 0x9c06, 0x05d0, ++ 0x2400, 0x9c06, 0x05b8, 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010, ++ 0x9005, 0x0130, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1550, ++ 0x00c6, 0x6000, 0x9086, 0x0004, 0x1110, 0x080c, 0x17b0, 0x9786, ++ 0x0008, 0x1148, 0x080c, 0xb295, 0x1130, 0x00ce, 0x080c, 0x9e99, ++ 0x080c, 0x9584, 0x00b8, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0178, ++ 0x9786, 0x0003, 0x1500, 0x080c, 0xc810, 0x0110, 0xa867, 0x0103, ++ 0xab7a, 0xa877, 0x0000, 0x080c, 0x619c, 0x080c, 0xb278, 0x080c, ++ 0x9584, 0x00ce, 0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1210, 0x0804, ++ 0xa3c0, 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, ++ 0x009e, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118, 0x080c, 0xc970, ++ 0x0c30, 0x9786, 0x000a, 0x09e0, 0x08b0, 0x220c, 0x2304, 0x9106, ++ 0x1130, 0x8210, 0x8318, 0x1f04, 0xa425, 0x9006, 0x0005, 0x2304, ++ 0x9102, 0x0218, 0x2001, 0x0001, 0x0008, 0x9006, 0x918d, 0x0001, ++ 0x0005, 0x0136, 0x01c6, 0x0016, 0x8906, 0x8006, 0x8007, 0x908c, ++ 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9300, 0x2098, 0x3518, 0x20a9, ++ 0x0001, 0x220c, 0x4002, 0x910e, 0x1140, 0x8210, 0x8319, 0x1dc8, ++ 0x9006, 0x001e, 0x01ce, 0x013e, 0x0005, 0x220c, 0x9102, 0x0218, ++ 0x2001, 0x0001, 0x0010, 0x2001, 0x0000, 0x918d, 0x0001, 0x001e, ++ 0x01ce, 0x013e, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d84, ++ 0x080c, 0xb284, 0x0120, 0x080c, 0xb295, 0x0168, 0x0028, 0x080c, ++ 0x2d3f, 0x080c, 0xb295, 0x0138, 0x080c, 0x8026, 0x080c, 0x9554, ++ 0x080c, 0x8125, 0x0005, 0x080c, 0x9e99, 0x0cb0, 0x9182, 0x0040, ++ 0x0002, 0xa495, 0xa495, 0xa495, 0xa495, 0xa495, 0xa495, 0xa495, ++ 0xa495, 0xa495, 0xa495, 0xa495, 0xa497, 0xa497, 0xa497, 0xa497, ++ 0xa495, 0xa495, 0xa495, 0xa497, 0xa495, 0x080c, 0x0d84, 0x600b, ++ 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x7bcb, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x8125, 0x012e, 0x0005, 0x9186, 0x0013, 0x1128, ++ 0x6004, 0x9082, 0x0040, 0x0804, 0xa536, 0x9186, 0x0027, 0x11f0, ++ 0x080c, 0x8026, 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x0096, 0x6114, ++ 0x2148, 0x080c, 0xb0ad, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0029, ++ 0xa877, 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x61a9, 0x080c, ++ 0xb278, 0x009e, 0x080c, 0x9554, 0x0804, 0x8125, 0x9186, 0x0014, ++ 0x1120, 0x6004, 0x9082, 0x0040, 0x0440, 0x9186, 0x0046, 0x0150, ++ 0x9186, 0x0045, 0x0138, 0x9186, 0x0053, 0x0120, 0x9186, 0x0048, ++ 0x190c, 0x0d84, 0x2001, 0x0109, 0x2004, 0xd084, 0x01a8, 0x0126, ++ 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x0036, 0x080c, 0x7ab7, ++ 0x003e, 0x002e, 0x001e, 0x000e, 0x012e, 0xa001, 0x6000, 0x9086, ++ 0x0002, 0x1110, 0x0804, 0xa574, 0x0005, 0x0002, 0xa514, 0xa512, ++ 0xa512, 0xa512, 0xa512, 0xa512, 0xa512, 0xa512, 0xa512, 0xa512, ++ 0xa512, 0xa52f, 0xa52f, 0xa52f, 0xa52f, 0xa512, 0xa52f, 0xa512, ++ 0xa52f, 0xa512, 0x080c, 0x0d84, 0x080c, 0x8026, 0x0096, 0x6114, ++ 0x2148, 0x080c, 0xb0ad, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, ++ 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x61a9, 0x080c, ++ 0xb278, 0x009e, 0x080c, 0x9554, 0x080c, 0x8125, 0x0005, 0x080c, ++ 0x8026, 0x080c, 0x9554, 0x080c, 0x8125, 0x0005, 0x0002, 0xa54d, ++ 0xa54b, 0xa54b, 0xa54b, 0xa54b, 0xa54b, 0xa54b, 0xa54b, 0xa54b, ++ 0xa54b, 0xa54b, 0xa564, 0xa564, 0xa564, 0xa564, 0xa54b, 0xa56e, ++ 0xa54b, 0xa564, 0xa54b, 0x080c, 0x0d84, 0x0096, 0x080c, 0x8026, ++ 0x6014, 0x2048, 0x2001, 0x1955, 0x2004, 0x6042, 0xa97c, 0xd1ac, ++ 0x0140, 0x6003, 0x0004, 0xa87c, 0x9085, 0x0400, 0xa87e, 0x009e, ++ 0x0005, 0x6003, 0x0002, 0x0cb8, 0x080c, 0x8026, 0x080c, 0xb76f, ++ 0x080c, 0xb774, 0x6003, 0x000f, 0x0804, 0x8125, 0x080c, 0x8026, ++ 0x080c, 0x9554, 0x0804, 0x8125, 0x9182, 0x0040, 0x0002, 0xa58b, ++ 0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58d, 0xa66a, 0xa58b, 0xa58b, ++ 0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58b, 0xa58b, ++ 0xa58b, 0xa58b, 0xa69e, 0x080c, 0x0d84, 0x00b6, 0x0096, 0x6114, ++ 0x2148, 0x7644, 0x96b4, 0x0fff, 0x86ff, 0x1528, 0x6010, 0x2058, ++ 0xb800, 0xd0bc, 0x1904, 0xa659, 0xa87b, 0x0000, 0xa867, 0x0103, ++ 0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, ++ 0xa82a, 0x080c, 0x5fda, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, ++ 0x8211, 0xba3e, 0x7044, 0xd0e4, 0x1904, 0xa63d, 0x080c, 0x9554, ++ 0x009e, 0x00be, 0x0005, 0x968c, 0x0c00, 0x0150, 0x6010, 0x2058, ++ 0xb800, 0xd0bc, 0x1904, 0xa641, 0x7348, 0xab92, 0x734c, 0xab8e, ++ 0x968c, 0x00ff, 0x9186, 0x0002, 0x0508, 0x9186, 0x0028, 0x1118, ++ 0xa87b, 0x001c, 0x00e8, 0xd6dc, 0x01a0, 0xa87b, 0x0015, 0xa87c, ++ 0xd0ac, 0x0170, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0148, 0x7048, ++ 0x9106, 0x1118, 0x704c, 0x9206, 0x0118, 0xa992, 0xaa8e, 0xc6dc, ++ 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, ++ 0xa867, 0x0103, 0xae76, 0x901e, 0xd6c4, 0x01d8, 0x9686, 0x0100, ++ 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0x0804, 0xa594, 0x735c, ++ 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, ++ 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xace6, ++ 0x003e, 0xd6cc, 0x0904, 0xa5a9, 0x7154, 0xa98a, 0x81ff, 0x0904, ++ 0xa5a9, 0x9192, 0x0021, 0x1278, 0x8304, 0x9098, 0x0018, 0x2011, ++ 0x0029, 0x080c, 0xace6, 0x2011, 0x0205, 0x2013, 0x0000, 0x080c, ++ 0xb706, 0x0804, 0xa5a9, 0xa868, 0xd0fc, 0x0120, 0x2009, 0x0020, ++ 0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c, 0xac85, 0x00ae, 0x080c, ++ 0xb706, 0x080c, 0xacd6, 0x0804, 0xa5ab, 0x080c, 0xb37e, 0x0804, ++ 0xa5b8, 0xa87c, 0xd0ac, 0x0904, 0xa5c4, 0xa880, 0xd0bc, 0x1904, ++ 0xa5c4, 0x7348, 0xa838, 0x9306, 0x11c8, 0x734c, 0xa834, 0x931e, ++ 0x0904, 0xa5c4, 0xd6d4, 0x0190, 0xab38, 0x9305, 0x0904, 0xa5c4, ++ 0x0068, 0xa87c, 0xd0ac, 0x0904, 0xa59c, 0xa838, 0xa934, 0x9105, ++ 0x0904, 0xa59c, 0xa880, 0xd0bc, 0x1904, 0xa59c, 0x080c, 0xb3ae, ++ 0x0804, 0xa5b8, 0x0096, 0x00f6, 0x6003, 0x0003, 0x6007, 0x0043, ++ 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6014, 0x2048, ++ 0xa87c, 0xd0ac, 0x0140, 0x6003, 0x0002, 0x00fe, 0x009e, 0x0005, ++ 0x2130, 0x2228, 0x0058, 0x2400, 0xa9ac, 0x910a, 0x2300, 0xaab0, ++ 0x9213, 0x2600, 0x9102, 0x2500, 0x9203, 0x0e90, 0xac36, 0xab3a, ++ 0xae46, 0xad4a, 0x00fe, 0x6043, 0x0000, 0x2c10, 0x080c, 0x18b7, ++ 0x080c, 0x7c3a, 0x080c, 0x820b, 0x009e, 0x0005, 0x0005, 0x9182, ++ 0x0040, 0x0002, 0xa6b6, 0xa6b6, 0xa6b6, 0xa6b6, 0xa6b6, 0xa6b8, ++ 0xa74e, 0xa6b6, 0xa6b6, 0xa765, 0xa7f1, 0xa6b6, 0xa6b6, 0xa6b6, ++ 0xa6b6, 0xa806, 0xa6b6, 0xa6b6, 0xa6b6, 0xa6b6, 0x080c, 0x0d84, ++ 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, 0x2150, ++ 0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, ++ 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, ++ 0x86ff, 0x0904, 0xa749, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, ++ 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xa749, ++ 0x080c, 0x0fae, 0x090c, 0x0d84, 0x2900, 0xb07a, 0xb77c, 0xc7cd, ++ 0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070, ++ 0xa872, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, ++ 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, ++ 0x1118, 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, ++ 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, ++ 0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, ++ 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, ++ 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, ++ 0xace6, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, ++ 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, ++ 0x080c, 0xace6, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, ++ 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, ++ 0xac85, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x00f6, 0x00a6, ++ 0x6003, 0x0003, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, ++ 0x6014, 0x2050, 0xb436, 0xb33a, 0xb646, 0xb54a, 0x00ae, 0x00fe, ++ 0x2c10, 0x080c, 0x18b7, 0x0804, 0x8b1d, 0x6003, 0x0002, 0x6004, ++ 0x9086, 0x0040, 0x11c8, 0x0096, 0x6014, 0x2048, 0xa87c, 0xd0ac, ++ 0x0160, 0x601c, 0xd084, 0x1130, 0x00f6, 0x2c00, 0x2078, 0x080c, ++ 0x150d, 0x00fe, 0x6003, 0x0004, 0x0010, 0x6003, 0x0002, 0x009e, ++ 0x080c, 0x8026, 0x080c, 0x8125, 0x0096, 0x2001, 0x1955, 0x2004, ++ 0x6042, 0x080c, 0x80d6, 0x080c, 0x820b, 0x6114, 0x2148, 0xa97c, ++ 0xd1e4, 0x0904, 0xa7ec, 0xd1cc, 0x05a8, 0xa978, 0xa868, 0xd0fc, ++ 0x0538, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0xa860, 0x20e8, ++ 0xa85c, 0x9080, 0x0019, 0x20a0, 0x810e, 0x810e, 0x810f, 0x9184, ++ 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0019, 0x2098, 0x0156, ++ 0x20a9, 0x0020, 0x4003, 0x015e, 0x000e, 0xa882, 0x000e, 0xa87e, ++ 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0f60, 0x001e, 0x0440, ++ 0x0016, 0x080c, 0x0f60, 0x009e, 0xa974, 0x0016, 0x080c, 0xacd6, ++ 0x001e, 0x00f0, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, ++ 0x0002, 0x0180, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, ++ 0xd1dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd1d4, 0x0118, 0xa87b, ++ 0x0007, 0x0010, 0xa87b, 0x0000, 0x0016, 0x080c, 0x5fda, 0x001e, ++ 0xd1e4, 0x1120, 0x080c, 0x9554, 0x009e, 0x0005, 0x080c, 0xb37e, ++ 0x0cd8, 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, 0x8026, 0x080c, ++ 0x8125, 0x2019, 0x0001, 0x080c, 0x8dfe, 0x6003, 0x0002, 0x080c, ++ 0xb774, 0x080c, 0x80d6, 0x080c, 0x820b, 0x0005, 0x6004, 0x9086, ++ 0x0040, 0x1120, 0x080c, 0x8026, 0x080c, 0x8125, 0x080c, 0x80d6, ++ 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x0096, 0x6114, 0x2148, 0x080c, ++ 0xb0ad, 0x0150, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, ++ 0x080c, 0x61a9, 0x080c, 0xb278, 0x009e, 0x080c, 0x9554, 0x080c, ++ 0x820b, 0x0005, 0xa87b, 0x0015, 0xd1fc, 0x0138, 0xa87b, 0x0007, ++ 0x8002, 0x8000, 0x810a, 0x9189, 0x0000, 0xa992, 0xa88e, 0x0005, ++ 0x9182, 0x0040, 0x0002, 0xa84f, 0xa84f, 0xa84f, 0xa84f, 0xa84f, ++ 0xa851, 0xa84f, 0xa84f, 0xa8f4, 0xa84f, 0xa84f, 0xa84f, 0xa84f, ++ 0xa84f, 0xa84f, 0xa84f, 0xa84f, 0xa84f, 0xa84f, 0xaa22, 0x080c, ++ 0x0d84, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, ++ 0x2150, 0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, ++ 0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, ++ 0x00be, 0x86ff, 0x0904, 0xa8ed, 0x9694, 0xff00, 0x9284, 0x0c00, ++ 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, ++ 0xa8ed, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, ++ 0xb676, 0x0c38, 0x080c, 0x0fae, 0x090c, 0x0d84, 0x2900, 0xb07a, ++ 0xb77c, 0x97bd, 0x0200, 0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, ++ 0xb06c, 0xa86e, 0xb070, 0xa872, 0x7044, 0x9084, 0xf000, 0x9635, ++ 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, 0xab8e, ++ 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118, ++ 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, 0x0038, ++ 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xaf7e, ++ 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c, ++ 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, ++ 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xace6, ++ 0x003e, 0xd6cc, 0x01d0, 0x7154, 0xa98a, 0x81ff, 0x01b0, 0x9192, ++ 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, ++ 0xace6, 0x2011, 0x0205, 0x2013, 0x0000, 0x0038, 0xb068, 0xd0fc, ++ 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x080c, 0x178e, 0x009e, ++ 0x00ee, 0x00ae, 0x007e, 0x0005, 0x2001, 0x1955, 0x2004, 0x6042, ++ 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c, ++ 0xc0dc, 0xa87e, 0x6003, 0x0002, 0xa97c, 0xd1e4, 0x0904, 0xaa1d, ++ 0x6043, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, ++ 0x11f8, 0xd1cc, 0x0904, 0xa9ec, 0xa978, 0xa868, 0xd0fc, 0x0904, ++ 0xa9ad, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0x00a6, 0x2150, ++ 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, 0xa97b, 0x9086, ++ 0x0028, 0x15e8, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804, 0xa983, ++ 0x6024, 0xd0f4, 0x11d0, 0xa838, 0xaa34, 0x9205, 0x09d0, 0xa838, ++ 0xaa90, 0x9206, 0x1120, 0xa88c, 0xaa34, 0x9206, 0x0990, 0x6024, ++ 0xd0d4, 0x1148, 0xa9ac, 0xa834, 0x9102, 0x603a, 0xa9b0, 0xa838, ++ 0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x6010, 0x00b6, 0x2058, ++ 0xb83c, 0x8000, 0xb83e, 0x00be, 0x9006, 0xa876, 0xa892, 0xa88e, ++ 0xa87c, 0xc0e4, 0xa87e, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, ++ 0x080c, 0x0f60, 0x009e, 0x080c, 0xb3ae, 0x0804, 0xaa1d, 0xd1dc, ++ 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xb62d, 0x0118, ++ 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, ++ 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, ++ 0x9115, 0x190c, 0xa82a, 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, ++ 0xb08e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, ++ 0x0020, 0x8a06, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, ++ 0xffc0, 0x9080, 0x0019, 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, ++ 0x000e, 0xa87e, 0x080c, 0xb706, 0x001e, 0xa874, 0x0006, 0x2148, ++ 0x080c, 0x0f60, 0x001e, 0x0804, 0xaa19, 0x0016, 0x00a6, 0x2150, ++ 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, ++ 0x1128, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, ++ 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xb62d, 0x0118, 0xb174, ++ 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, ++ 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, ++ 0x190c, 0xa82a, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, ++ 0x00ae, 0x080c, 0x0f60, 0x009e, 0x080c, 0xb706, 0xa974, 0x0016, ++ 0x080c, 0xacd6, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184, ++ 0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, ++ 0x001c, 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xb62d, ++ 0x0118, 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, ++ 0x0007, 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, ++ 0xa938, 0x9115, 0x190c, 0xa82a, 0xa974, 0x0016, 0x080c, 0x5fda, ++ 0x001e, 0xd1e4, 0x1120, 0x080c, 0x9554, 0x009e, 0x0005, 0x080c, ++ 0xb37e, 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4, 0x190c, ++ 0x179c, 0x009e, 0x0005, 0x080c, 0x8026, 0x0010, 0x080c, 0x80d6, ++ 0x080c, 0xb0ad, 0x01c0, 0x0096, 0x6114, 0x2148, 0xa867, 0x0103, ++ 0x2009, 0x180c, 0x210c, 0xd18c, 0x11b8, 0xd184, 0x1190, 0x6108, ++ 0xa97a, 0x918e, 0x0029, 0x1110, 0x080c, 0xcc6b, 0xa877, 0x0000, ++ 0x080c, 0x61a9, 0x009e, 0x080c, 0x9554, 0x080c, 0x8125, 0x0804, ++ 0x820b, 0xa87b, 0x0004, 0x0c90, 0xa87b, 0x0004, 0x0c78, 0x9182, ++ 0x0040, 0x0002, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa70, ++ 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, ++ 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0xaa6e, 0x080c, 0x0d84, ++ 0x080c, 0x4df2, 0x01f8, 0x6014, 0x7144, 0x918c, 0x0fff, 0x9016, ++ 0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff, 0x0096, 0x904d, 0x0188, ++ 0xa87b, 0x0000, 0xa864, 0x9086, 0x0139, 0x0128, 0xa867, 0x0103, ++ 0xa976, 0xaa96, 0x0030, 0xa897, 0x4000, 0xa99a, 0xaa9e, 0x080c, ++ 0x61a9, 0x009e, 0x0804, 0x9554, 0x9182, 0x0085, 0x0002, 0xaaa6, ++ 0xaaa4, 0xaaa4, 0xaab2, 0xaaa4, 0xaaa4, 0xaaa4, 0xaaa4, 0xaaa4, ++ 0xaaa4, 0xaaa4, 0xaaa4, 0xaaa4, 0x080c, 0x0d84, 0x6003, 0x0001, ++ 0x6106, 0x080c, 0x7bcb, 0x0126, 0x2091, 0x8000, 0x080c, 0x8125, ++ 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, 0x2071, 0x0260, ++ 0x7224, 0x6216, 0x7220, 0x080c, 0xb09b, 0x01a0, 0x2268, 0x6800, ++ 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, 0x952e, 0x1158, 0x00c6, ++ 0x2d60, 0x080c, 0xad11, 0x00ce, 0x0128, 0x6803, 0x0002, 0x6007, ++ 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001, 0x080c, 0x7bcb, ++ 0x080c, 0x8125, 0x9280, 0x0004, 0x00b6, 0x2058, 0xb800, 0x00be, ++ 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6, 0x2260, 0x080c, ++ 0xb3ae, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005, 0x9186, ++ 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d84, 0x908a, ++ 0x0092, 0x1a0c, 0x0d84, 0x9082, 0x0085, 0x006a, 0x9186, 0x0027, ++ 0x0120, 0x9186, 0x0014, 0x190c, 0x0d84, 0x080c, 0x8026, 0x080c, ++ 0x9584, 0x0804, 0x8125, 0xab18, 0xab1a, 0xab1a, 0xab18, 0xab18, ++ 0xab18, 0xab18, 0xab18, 0xab18, 0xab18, 0xab18, 0xab18, 0xab18, ++ 0x080c, 0x0d84, 0x080c, 0x8026, 0x080c, 0x9584, 0x080c, 0x8125, ++ 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, ++ 0x04b8, 0x9186, 0x0027, 0x11f8, 0x080c, 0x8026, 0x080c, 0x2d1a, ++ 0x080c, 0xb76c, 0x0096, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0150, ++ 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x61a9, ++ 0x080c, 0xb278, 0x009e, 0x080c, 0x9554, 0x080c, 0x8125, 0x0005, ++ 0x080c, 0x95e9, 0x0ce0, 0x9186, 0x0014, 0x1dd0, 0x080c, 0x8026, ++ 0x0096, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0d60, 0xa867, 0x0103, ++ 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882, 0x08f0, ++ 0x0002, 0xab70, 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0xab88, ++ 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0xab6e, 0x080c, 0x0d84, ++ 0x080c, 0x8026, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, ++ 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1953, 0x0010, 0x2001, ++ 0x1954, 0x2004, 0x601a, 0x6003, 0x000c, 0x080c, 0x8125, 0x0005, ++ 0x080c, 0x8026, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, ++ 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1953, 0x0010, 0x2001, ++ 0x1954, 0x2004, 0x601a, 0x6003, 0x000e, 0x080c, 0x8125, 0x0005, ++ 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x0012, 0x0804, ++ 0x95e9, 0xabb6, 0xabb6, 0xabb6, 0xabb6, 0xabb8, 0xac05, 0xabb6, ++ 0xabb6, 0xabb6, 0xabb6, 0xabb6, 0xabb6, 0xabb6, 0x080c, 0x0d84, ++ 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0168, ++ 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, ++ 0x0035, 0x1118, 0x009e, 0x0804, 0xac19, 0x080c, 0xb0ad, 0x1118, ++ 0x080c, 0xb278, 0x0068, 0x6014, 0x2048, 0xa87c, 0xd0e4, 0x1110, ++ 0x080c, 0xb278, 0xa867, 0x0103, 0x080c, 0xb739, 0x080c, 0x61a9, ++ 0x00d6, 0x2c68, 0x080c, 0x94fe, 0x01d0, 0x6003, 0x0001, 0x6007, ++ 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, ++ 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c, 0xb4e6, 0x6954, ++ 0x6156, 0x6023, 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x2d60, ++ 0x00de, 0x080c, 0x9554, 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058, ++ 0xb800, 0x00be, 0xd0bc, 0x0598, 0x6034, 0x908c, 0xff00, 0x810f, ++ 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118, 0x9186, 0x0039, ++ 0x1530, 0x00d6, 0x2c68, 0x080c, 0xb6d9, 0x1904, 0xac5e, 0x080c, ++ 0x94fe, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001, 0x6910, ++ 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff, ++ 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954, 0x6156, 0x080c, ++ 0xb4e6, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x2d60, 0x00f8, 0x0096, ++ 0x6014, 0x2048, 0x080c, 0xb0ad, 0x01c8, 0xa867, 0x0103, 0xa880, ++ 0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006, 0x0048, 0xd0bc, ++ 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xb37a, ++ 0xa877, 0x0000, 0x080c, 0x61a9, 0x080c, 0xb278, 0x009e, 0x0804, ++ 0x9554, 0x0016, 0x0096, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0140, ++ 0xa867, 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000, 0x080c, 0x61a9, ++ 0x009e, 0x001e, 0x9186, 0x0013, 0x0148, 0x9186, 0x0014, 0x0130, ++ 0x9186, 0x0027, 0x0118, 0x080c, 0x95e9, 0x0030, 0x080c, 0x8026, ++ 0x080c, 0x9584, 0x080c, 0x8125, 0x0005, 0x0056, 0x0066, 0x0096, ++ 0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, 0x0010, 0x2009, ++ 0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, 0x0020, 0x2011, ++ 0x0029, 0x080c, 0xace6, 0x96b2, 0x0020, 0xb004, 0x904d, 0x0110, ++ 0x080c, 0x0f60, 0x080c, 0x0fae, 0x0520, 0x8528, 0xa867, 0x0110, ++ 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1228, 0x2608, ++ 0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2, 0x003c, 0x2009, 0x003c, ++ 0x2950, 0x2011, 0x001b, 0x0451, 0x0c28, 0x2001, 0x0205, 0x2003, ++ 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x95ac, 0x0000, ++ 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, ++ 0x0003, 0xb566, 0x009e, 0x006e, 0x005e, 0x0005, 0x00a6, 0x89ff, ++ 0x0158, 0xa804, 0x9055, 0x0130, 0xa807, 0x0000, 0x080c, 0x61a9, ++ 0x2a48, 0x0cb8, 0x080c, 0x61a9, 0x00ae, 0x0005, 0x00f6, 0x2079, ++ 0x0200, 0x7814, 0x9085, 0x0080, 0x7816, 0xd184, 0x0108, 0x8108, ++ 0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8, 0xa85c, 0x9200, 0x20a0, ++ 0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098, 0x4003, 0x8318, 0x9386, ++ 0x0020, 0x1148, 0x2018, 0x2300, 0x9e00, 0x2098, 0x7814, 0x8000, ++ 0x9085, 0x0080, 0x7816, 0x8109, 0x1d80, 0x7817, 0x0000, 0x00fe, ++ 0x0005, 0x0066, 0x0126, 0x2091, 0x8000, 0x2031, 0x0001, 0x6020, ++ 0x9084, 0x000f, 0x0083, 0x012e, 0x006e, 0x0005, 0x0126, 0x2091, ++ 0x8000, 0x0066, 0x2031, 0x0000, 0x6020, 0x9084, 0x000f, 0x001b, ++ 0x006e, 0x012e, 0x0005, 0xad4c, 0xad4c, 0xad47, 0xad6e, 0xad3a, ++ 0xad47, 0xad6e, 0xad47, 0xad3a, 0xad3a, 0xad47, 0xad47, 0xad47, ++ 0xad3a, 0xad3a, 0x080c, 0x0d84, 0x0036, 0x2019, 0x0010, 0x080c, ++ 0xc58e, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x9006, ++ 0x0005, 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, 0x11d8, 0x6014, ++ 0x2048, 0x080c, 0xb0ad, 0x01c0, 0xa864, 0x9086, 0x0139, 0x1128, ++ 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e, 0x2001, 0x0005, ++ 0x080c, 0x63d1, 0x080c, 0xb37a, 0x080c, 0x61a9, 0x080c, 0x9584, ++ 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0, 0x6000, 0x908a, ++ 0x0016, 0x1a0c, 0x0d84, 0x0002, 0xad84, 0xada9, 0xad86, 0xadc7, ++ 0xada4, 0xad84, 0xad47, 0xad4c, 0xad4c, 0xad47, 0xad47, 0xad47, ++ 0xad47, 0xad47, 0xad47, 0xad47, 0x080c, 0x0d84, 0x86ff, 0x11c8, ++ 0x6020, 0x9086, 0x0006, 0x01a8, 0x0096, 0x6014, 0x2048, 0x080c, ++ 0xb0ad, 0x0110, 0x080c, 0xb37a, 0x009e, 0x080c, 0xb71b, 0x6007, ++ 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x7bcb, 0x080c, ++ 0x8125, 0x9085, 0x0001, 0x0005, 0x0066, 0x080c, 0x17b0, 0x006e, ++ 0x08e8, 0x00e6, 0x2071, 0x19b4, 0x7024, 0x9c06, 0x1110, 0x080c, ++ 0x8d59, 0x6020, 0x9084, 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, ++ 0x0096, 0x2049, 0x0001, 0x2c40, 0x080c, 0x8ef6, 0x009e, 0x008e, ++ 0x0010, 0x080c, 0x8c6a, 0x00ee, 0x1908, 0x0804, 0xad47, 0x0036, ++ 0x00e6, 0x2071, 0x19b4, 0x703c, 0x9c06, 0x1138, 0x901e, 0x080c, ++ 0x8dfe, 0x00ee, 0x003e, 0x0804, 0xad86, 0x080c, 0x901f, 0x00ee, ++ 0x003e, 0x1904, 0xad86, 0x0804, 0xad47, 0x00c6, 0x6020, 0x9084, ++ 0x000f, 0x0013, 0x00ce, 0x0005, 0xadfa, 0xaea2, 0xaff8, 0xae04, ++ 0x9584, 0xadfa, 0xc580, 0xb779, 0xaea2, 0xadf3, 0xb077, 0xadf3, ++ 0xadf3, 0xadf3, 0xadf3, 0x080c, 0x0d84, 0x080c, 0xb295, 0x1110, ++ 0x080c, 0x9e99, 0x0005, 0x080c, 0x8026, 0x080c, 0x8125, 0x0804, ++ 0x9554, 0x601b, 0x0001, 0x0005, 0x080c, 0xb0ad, 0x0130, 0x6014, ++ 0x0096, 0x2048, 0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, 0x0016, ++ 0x1a0c, 0x0d84, 0x0002, 0xae23, 0xae25, 0xae49, 0xae5d, 0xae81, ++ 0xae23, 0xadfa, 0xadfa, 0xadfa, 0xae5d, 0xae5d, 0xae23, 0xae23, ++ 0xae23, 0xae23, 0xae67, 0x080c, 0x0d84, 0x00e6, 0x6014, 0x0096, ++ 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19b4, 0x7024, ++ 0x9c06, 0x01a0, 0x080c, 0x8c6a, 0x080c, 0xb71b, 0x6007, 0x0085, ++ 0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x1954, 0x2004, 0x601a, ++ 0x080c, 0x7bcb, 0x080c, 0x8125, 0x00ee, 0x0005, 0x601b, 0x0001, ++ 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, ++ 0x080c, 0xb71b, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, ++ 0x080c, 0x7bcb, 0x080c, 0x8125, 0x0005, 0x0096, 0x601b, 0x0001, ++ 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, ++ 0x4df2, 0x01a8, 0x6014, 0x0096, 0x904d, 0x0180, 0xa864, 0xa867, ++ 0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, 0x1140, 0xa867, 0x0139, ++ 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x61a9, 0x009e, 0x0804, ++ 0x9554, 0x6014, 0x0096, 0x904d, 0x01c0, 0xa97c, 0xd1e4, 0x01a8, ++ 0xa884, 0x009e, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, ++ 0x0037, 0x2c08, 0x080c, 0x1492, 0x6000, 0x9086, 0x0004, 0x1120, ++ 0x2009, 0x0048, 0x080c, 0x95ce, 0x0005, 0x009e, 0x080c, 0x17b0, ++ 0x0804, 0xae49, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d84, 0x000b, ++ 0x0005, 0xaeb9, 0xae01, 0xaebb, 0xaeb9, 0xaebb, 0xaebb, 0xadfb, ++ 0xaeb9, 0xadf5, 0xadf5, 0xaeb9, 0xaeb9, 0xaeb9, 0xaeb9, 0xaeb9, ++ 0xaeb9, 0x080c, 0x0d84, 0x6010, 0x00b6, 0x2058, 0xb804, 0x9084, ++ 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0d84, 0x00b6, 0x0013, ++ 0x00be, 0x0005, 0xaed6, 0xaf92, 0xaed8, 0xaf13, 0xaed8, 0xaf13, ++ 0xaed8, 0xaee6, 0xaed6, 0xaf13, 0xaed6, 0xaf02, 0x080c, 0x0d84, ++ 0x6004, 0x908e, 0x0016, 0x0598, 0x908e, 0x0004, 0x0580, 0x908e, ++ 0x0002, 0x0568, 0x908e, 0x0052, 0x0904, 0xaf8e, 0x6004, 0x080c, ++ 0xb295, 0x0904, 0xafab, 0x908e, 0x0021, 0x0904, 0xafaf, 0x908e, ++ 0x0022, 0x0904, 0xaff3, 0x908e, 0x003d, 0x0904, 0xafaf, 0x908e, ++ 0x0039, 0x0904, 0xafb3, 0x908e, 0x0035, 0x0904, 0xafb3, 0x908e, ++ 0x001e, 0x0178, 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804, ++ 0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, 0x080c, 0x2d1a, 0x080c, ++ 0x9e99, 0x0804, 0x9584, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, ++ 0x0904, 0xaf7f, 0x9186, 0x0002, 0x15b8, 0x2001, 0x1836, 0x2004, ++ 0xd08c, 0x1178, 0x080c, 0x6877, 0x1160, 0x2001, 0x194c, 0x2003, ++ 0x0001, 0x2001, 0x1800, 0x2003, 0x0001, 0x080c, 0x67be, 0x0804, ++ 0xafdc, 0x6010, 0x2058, 0x2001, 0x1836, 0x2004, 0xd0ac, 0x1904, ++ 0xafdc, 0xb8a0, 0xd0bc, 0x1904, 0xafdc, 0xb840, 0x9084, 0x00ff, ++ 0x9005, 0x0190, 0x8001, 0xb842, 0x6017, 0x0000, 0x6023, 0x0007, ++ 0x601b, 0x0398, 0x6043, 0x0000, 0x080c, 0x94fe, 0x0128, 0x2b00, ++ 0x6012, 0x6023, 0x0001, 0x0458, 0x00de, 0x00ce, 0x6004, 0x908e, ++ 0x0002, 0x11a0, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1170, ++ 0x2009, 0x1836, 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0x1800, ++ 0x080c, 0x5677, 0x00ee, 0x080c, 0x9e99, 0x0030, 0x080c, 0x9e99, ++ 0x080c, 0x2d1a, 0x080c, 0xb76c, 0x00e6, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x2d3f, 0x012e, 0x00ee, 0x080c, 0x9584, 0x0005, 0x2001, ++ 0x0002, 0x080c, 0x5b61, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x2d3f, ++ 0x0804, 0xaf0f, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, ++ 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xaf54, ++ 0x8001, 0xb842, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x080c, 0x8125, ++ 0x00de, 0x00ce, 0x0898, 0x080c, 0x9e99, 0x0804, 0xaf11, 0x080c, ++ 0x9ed5, 0x0804, 0xaf11, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xb6d9, ++ 0x00de, 0x0118, 0x080c, 0x9554, 0x00f0, 0x6004, 0x8007, 0x6134, ++ 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, ++ 0x6023, 0x0002, 0x603c, 0x600a, 0x2001, 0x1954, 0x2004, 0x601a, ++ 0x602c, 0x2c08, 0x2060, 0x6024, 0xc0b5, 0x6026, 0x2160, 0x080c, ++ 0x7bcb, 0x080c, 0x8125, 0x0005, 0x00de, 0x00ce, 0x080c, 0x9e99, ++ 0x080c, 0x2d1a, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2d3f, ++ 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, ++ 0x012e, 0x00ee, 0x0005, 0x080c, 0x994c, 0x1904, 0xafab, 0x0005, ++ 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d84, 0x0096, 0x00d6, 0x001b, ++ 0x00de, 0x009e, 0x0005, 0xb013, 0xb013, 0xb013, 0xb013, 0xb013, ++ 0xb013, 0xb013, 0xb013, 0xb013, 0xadfa, 0xb013, 0xae01, 0xb015, ++ 0xae01, 0xb022, 0xb013, 0x080c, 0x0d84, 0x6004, 0x9086, 0x008b, ++ 0x0148, 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, 0x7bcb, 0x080c, ++ 0x8125, 0x0005, 0x080c, 0xb74d, 0x0118, 0x080c, 0xb75e, 0x0010, ++ 0x080c, 0xb76c, 0x080c, 0xb278, 0x080c, 0xb0ad, 0x0570, 0x080c, ++ 0x2d1a, 0x080c, 0xb0ad, 0x0168, 0x6014, 0x2048, 0xa867, 0x0103, ++ 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c, ++ 0x61a9, 0x2c68, 0x080c, 0x94fe, 0x0150, 0x6810, 0x6012, 0x080c, ++ 0xb4e6, 0x00c6, 0x2d60, 0x080c, 0x9584, 0x00ce, 0x0008, 0x2d60, ++ 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, ++ 0x080c, 0x7c1d, 0x080c, 0x8125, 0x00c8, 0x080c, 0xb74d, 0x0138, ++ 0x6034, 0x9086, 0x4000, 0x1118, 0x080c, 0x2d1a, 0x08d0, 0x6034, ++ 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, ++ 0x1118, 0x080c, 0x2d1a, 0x0868, 0x080c, 0x9584, 0x0005, 0x6000, ++ 0x908a, 0x0016, 0x1a0c, 0x0d84, 0x0002, 0xb08d, 0xb08d, 0xb08f, ++ 0xb08f, 0xb08f, 0xb08d, 0xb08d, 0xb08d, 0xb08d, 0xb08d, 0xb08d, ++ 0xb08d, 0xb08d, 0xb08d, 0xb08d, 0xb08d, 0x080c, 0x0d84, 0x080c, ++ 0x901f, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x61a9, ++ 0x009e, 0x0804, 0x9554, 0x9284, 0x0007, 0x1158, 0x9282, 0x1cd0, ++ 0x0240, 0x2001, 0x1818, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, ++ 0x0005, 0x9006, 0x0ce8, 0x0096, 0x0018, 0x0096, 0x6014, 0x2048, ++ 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, 0x080c, 0x1057, 0x009e, ++ 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, ++ 0x2061, 0x1cd0, 0x2071, 0x1800, 0x734c, 0x706c, 0x9302, 0x12a8, ++ 0x6020, 0x9206, 0x1160, 0x080c, 0xb460, 0x0148, 0x080c, 0xb295, ++ 0x1110, 0x080c, 0x9e99, 0x00c6, 0x080c, 0x9554, 0x00ce, 0x9ce0, ++ 0x0018, 0x7060, 0x9c02, 0x1208, 0x0c38, 0x012e, 0x000e, 0x003e, ++ 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, ++ 0x210c, 0x81ff, 0x0128, 0x2061, 0x1a72, 0x6112, 0x080c, 0x2d1a, ++ 0x9006, 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, ++ 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x94fe, 0x01d8, 0x080c, ++ 0x4df2, 0x0110, 0x662e, 0x0008, 0x6616, 0x2b00, 0x6012, 0x080c, ++ 0x4df2, 0x0118, 0x080c, 0xb1bc, 0x0168, 0x080c, 0xb4e6, 0x6023, ++ 0x0003, 0x2009, 0x004b, 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, ++ 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, ++ 0xbaa0, 0x080c, 0x95a1, 0x0590, 0x080c, 0x4df2, 0x0118, 0x602f, ++ 0x0000, 0x0010, 0x6017, 0x0000, 0x2b00, 0x6012, 0x080c, 0xb4e6, ++ 0x6023, 0x0003, 0x0016, 0x080c, 0x7d55, 0x0076, 0x903e, 0x080c, ++ 0x7c4d, 0x2c08, 0x080c, 0xc73e, 0x007e, 0x001e, 0xd184, 0x0128, ++ 0x080c, 0x9554, 0x9085, 0x0001, 0x0070, 0x080c, 0x4df2, 0x0128, ++ 0xd18c, 0x1170, 0x080c, 0xb1bc, 0x0148, 0x2009, 0x004c, 0x080c, ++ 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, ++ 0x2900, 0x6016, 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, ++ 0x00f6, 0x00c6, 0x0046, 0x0016, 0x080c, 0x94fe, 0x2c78, 0x01d8, ++ 0x080c, 0x4df2, 0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812, ++ 0x7823, 0x0003, 0x2021, 0x0005, 0x080c, 0xb1ce, 0x2f60, 0x080c, ++ 0x4df2, 0x0118, 0x080c, 0xb1bc, 0x0130, 0x001e, 0x0016, 0x080c, ++ 0x95ce, 0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, ++ 0x00f6, 0x00c6, 0x0046, 0x080c, 0x94fe, 0x2c78, 0x0530, 0x080c, ++ 0x4df2, 0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812, 0x7823, ++ 0x0003, 0x0096, 0x2021, 0x0004, 0x0489, 0x009e, 0x2001, 0x194d, ++ 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0x9554, 0x0060, 0x2f60, ++ 0x080c, 0x4df2, 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130, 0x2009, ++ 0x0052, 0x080c, 0x95ce, 0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe, ++ 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, 0x441f, 0x00ce, ++ 0x1120, 0x080c, 0x9554, 0x9006, 0x0005, 0xa867, 0x0000, 0xa86b, ++ 0x8000, 0x2900, 0x6016, 0x9085, 0x0001, 0x0005, 0x0096, 0x0076, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x5d41, 0x0158, 0x2001, 0xb1d3, ++ 0x0006, 0x900e, 0x2400, 0x080c, 0x63d1, 0x080c, 0x61a9, 0x000e, ++ 0x0807, 0x2418, 0x080c, 0x7fc0, 0xbaa0, 0x0086, 0x2041, 0x0001, ++ 0x2039, 0x0001, 0x2608, 0x080c, 0x7d6d, 0x008e, 0x080c, 0x7c4d, ++ 0x2f08, 0x2648, 0x080c, 0xc73e, 0xb93c, 0x81ff, 0x090c, 0x7e2b, ++ 0x080c, 0x8125, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x94fe, 0x0190, 0x660a, 0x2b08, 0x6112, ++ 0x080c, 0xb4e6, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x001f, ++ 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, ++ 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x95a1, 0x01b8, ++ 0x660a, 0x2b08, 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0008, 0x2900, ++ 0x6016, 0x00f6, 0x2c78, 0x080c, 0x150d, 0x00fe, 0x2009, 0x0021, ++ 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, ++ 0x0cd8, 0x2009, 0x003d, 0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, ++ 0x080c, 0x94fe, 0x0198, 0x660a, 0x2b08, 0x6112, 0x080c, 0xb4e6, ++ 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x0016, 0x080c, 0x95ce, ++ 0x9085, 0x0001, 0x001e, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, ++ 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x95a1, 0x0188, 0x2b08, ++ 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, ++ 0x0000, 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, ++ 0x9006, 0x0cd8, 0x2009, 0x0044, 0x0830, 0x2009, 0x0049, 0x0818, ++ 0x0026, 0x00b6, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, ++ 0xba3e, 0x00be, 0x002e, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, ++ 0x0002, 0x0140, 0x908e, 0x0003, 0x0128, 0x908e, 0x0004, 0x0110, ++ 0x9085, 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0096, 0x6014, ++ 0x904d, 0x0148, 0xa864, 0x9086, 0x0139, 0x0138, 0xa868, 0xd0fc, ++ 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x000e, 0x0005, ++ 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x94fe, 0x0198, 0x2b08, ++ 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, ++ 0x2d1a, 0x2009, 0x0028, 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, ++ 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011, ++ 0x1822, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xa0c5, ++ 0x00be, 0x080c, 0xa2bc, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, ++ 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xb69a, 0x080c, ++ 0x9e99, 0x080c, 0x9554, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, ++ 0x0d84, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, ++ 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, ++ 0x012e, 0x009e, 0x080c, 0x9554, 0x0c30, 0x0096, 0x9186, 0x0016, ++ 0x1128, 0x2001, 0x0004, 0x080c, 0x5b61, 0x00e8, 0x9186, 0x0015, ++ 0x1510, 0x2011, 0x1822, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010, ++ 0x00b6, 0x2058, 0x080c, 0x5ca8, 0x00be, 0x080c, 0xa38d, 0x1198, ++ 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001, ++ 0x0006, 0x080c, 0x5b61, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, ++ 0x080c, 0x9920, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, ++ 0x080c, 0x9e99, 0x080c, 0x9554, 0x009e, 0x0005, 0x6014, 0x6310, ++ 0x2358, 0x904d, 0x090c, 0x0d84, 0xa87b, 0x0000, 0xa883, 0x0000, ++ 0xa897, 0x4000, 0x900e, 0x080c, 0x5e2d, 0x1108, 0xc185, 0xb800, ++ 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, ++ 0x61a9, 0x012e, 0x080c, 0x9554, 0x08f8, 0x6014, 0x904d, 0x090c, ++ 0x0d84, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, ++ 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, ++ 0x012e, 0x080c, 0x9554, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, ++ 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043, 0x0000, ++ 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x7bcb, ++ 0x080c, 0x8125, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800, ++ 0x00be, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce, ++ 0x0005, 0xadfa, 0xb3aa, 0xb3aa, 0xb3ad, 0xca0f, 0xca2a, 0xca2d, ++ 0xadfa, 0xadfa, 0xadfa, 0xadfa, 0xadfa, 0xadfa, 0xadfa, 0xadfa, ++ 0x080c, 0x0d84, 0xa001, 0xa001, 0x0005, 0x0000, 0x6010, 0x00b6, ++ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550, 0x00f6, 0x2c78, 0x080c, ++ 0x94fe, 0x1128, 0x2001, 0x1955, 0x2004, 0x7842, 0x00f8, 0x7810, ++ 0x6012, 0x080c, 0xb4e6, 0x7820, 0x9086, 0x0003, 0x0128, 0x7808, ++ 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, 0x2f00, 0x603a, ++ 0x602e, 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x7954, ++ 0x6156, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x2f60, 0x00fe, 0x0005, ++ 0x0016, 0x0096, 0x6814, 0x2048, 0xa87c, 0xd0e4, 0x0170, 0xc0e4, ++ 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, 0x0000, 0xd0cc, ++ 0x0120, 0xa878, 0x2048, 0x080c, 0x0f60, 0x6830, 0x6036, 0x908e, ++ 0x0001, 0x0148, 0x6803, 0x0002, 0x9086, 0x0005, 0x0168, 0x9006, ++ 0x602e, 0x6032, 0x00c8, 0x681c, 0xc085, 0x681e, 0x6803, 0x0004, ++ 0x6824, 0xc0f4, 0xc0d5, 0x6826, 0x6814, 0x2048, 0xa8ac, 0x6938, ++ 0x9102, 0xa8b0, 0x693c, 0x9103, 0x1e50, 0x683c, 0x602e, 0x6838, ++ 0x9084, 0xfffc, 0x683a, 0x6032, 0x2d00, 0x603a, 0x6808, 0x603e, ++ 0x6910, 0x6112, 0x6954, 0x6156, 0x6023, 0x0001, 0x6007, 0x0039, ++ 0x6003, 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x009e, 0x001e, ++ 0x0005, 0x6024, 0xd0d4, 0x0510, 0xd0f4, 0x11f8, 0x6038, 0x940a, ++ 0x603c, 0x9303, 0x0230, 0x9105, 0x0120, 0x6024, 0xc0d4, 0xc0f5, ++ 0x0098, 0x643a, 0x633e, 0xac3e, 0xab42, 0x0046, 0x0036, 0x2400, ++ 0xacac, 0x9402, 0xa836, 0x2300, 0xabb0, 0x9303, 0xa83a, 0x003e, ++ 0x004e, 0x6024, 0xc0d4, 0x0000, 0x6026, 0x0005, 0xd0f4, 0x1138, ++ 0xa83c, 0x603a, 0xa840, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x0005, ++ 0x0006, 0x0016, 0x6004, 0x908e, 0x0034, 0x01b8, 0x908e, 0x0035, ++ 0x01a0, 0x908e, 0x0036, 0x0188, 0x908e, 0x0037, 0x0170, 0x908e, ++ 0x0038, 0x0158, 0x908e, 0x0039, 0x0140, 0x908e, 0x003a, 0x0128, ++ 0x908e, 0x003b, 0x0110, 0x9085, 0x0001, 0x001e, 0x000e, 0x0005, ++ 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x2001, 0x194f, 0x200c, ++ 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x7a4b, 0x2001, 0x1953, ++ 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1951, 0x200c, ++ 0x8000, 0x2014, 0x2071, 0x193b, 0x711a, 0x721e, 0x2001, 0x0064, ++ 0x080c, 0x7a4b, 0x2001, 0x1954, 0x82ff, 0x1110, 0x2011, 0x0014, ++ 0x2202, 0x2001, 0x1955, 0x9288, 0x000a, 0x2102, 0x2001, 0x1a54, ++ 0x2102, 0x2001, 0x0032, 0x080c, 0x1492, 0x080c, 0x5f0e, 0x00ee, ++ 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x00e6, ++ 0x2001, 0x1953, 0x2003, 0x0028, 0x2001, 0x1954, 0x2003, 0x0014, ++ 0x2071, 0x193b, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0x1955, ++ 0x2009, 0x001e, 0x2102, 0x2001, 0x1a54, 0x2102, 0x2001, 0x0032, ++ 0x080c, 0x1492, 0x00ee, 0x001e, 0x000e, 0x0005, 0x0096, 0x6058, ++ 0x904d, 0x0110, 0x080c, 0x0fe0, 0x009e, 0x0005, 0x0005, 0x00c6, ++ 0x0126, 0x2091, 0x8000, 0x080c, 0x94fe, 0x0180, 0x2b08, 0x6112, ++ 0x0ca9, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0033, 0x080c, ++ 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, ++ 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1500, ++ 0x7088, 0x9086, 0x0018, 0x11e0, 0x6014, 0x2048, 0xaa3c, 0xd2e4, ++ 0x1160, 0x2c78, 0x080c, 0x8315, 0x01d8, 0x7074, 0xaa50, 0x9206, ++ 0x1160, 0x7078, 0xaa54, 0x9206, 0x1140, 0x6210, 0x00b6, 0x2258, ++ 0xbaa0, 0x00be, 0x900e, 0x080c, 0x2d5f, 0x080c, 0x9920, 0x0020, ++ 0x080c, 0x9e99, 0x080c, 0x9554, 0x00fe, 0x00ee, 0x009e, 0x0005, ++ 0x7058, 0xaa54, 0x9206, 0x0d48, 0x0c80, 0x00c6, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x94fe, 0x0188, 0x2b08, 0x6112, 0x080c, 0xb4e6, ++ 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x004d, 0x080c, 0x95ce, ++ 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, ++ 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0x94fe, 0x0180, 0x2b08, ++ 0x6112, 0x080c, 0xb4e6, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, ++ 0x080c, 0x95ce, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x001e, ++ 0x9006, 0x0cd0, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0066, ++ 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1568, ++ 0x7188, 0x6014, 0x2048, 0xa814, 0x8003, 0x9106, 0x1530, 0x20e1, ++ 0x0000, 0x2001, 0x196d, 0x2003, 0x0000, 0x6014, 0x2048, 0xa830, ++ 0x20a8, 0x8906, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e8, 0x9084, ++ 0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001, 0x196d, 0x0016, 0x200c, ++ 0x080c, 0xbcf8, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c38, ++ 0x6014, 0x2048, 0xa867, 0x0103, 0x0010, 0x080c, 0x9e99, 0x080c, ++ 0x9554, 0x00fe, 0x00ee, 0x009e, 0x006e, 0x005e, 0x004e, 0x003e, ++ 0x002e, 0x001e, 0x0005, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, ++ 0x9186, 0x0015, 0x11b8, 0x7088, 0x9086, 0x0004, 0x1198, 0x6014, ++ 0x2048, 0x2c78, 0x080c, 0x8315, 0x01a8, 0x7074, 0xaa74, 0x9206, ++ 0x1130, 0x7078, 0xaa78, 0x9206, 0x1110, 0x080c, 0x2d1a, 0x080c, ++ 0x9920, 0x0020, 0x080c, 0x9e99, 0x080c, 0x9554, 0x00fe, 0x00ee, ++ 0x009e, 0x0005, 0x7058, 0xaa78, 0x9206, 0x0d78, 0x0c80, 0x0096, ++ 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1538, 0x7088, ++ 0x9086, 0x0004, 0x1518, 0x6014, 0x2048, 0x2c78, 0x080c, 0x8315, ++ 0x05b8, 0x7074, 0xaacc, 0x9206, 0x1180, 0x7078, 0xaad0, 0x9206, ++ 0x1160, 0x080c, 0x2d1a, 0x0016, 0xa998, 0xaab0, 0x9284, 0x1000, ++ 0xc0fd, 0x080c, 0x4da2, 0x001e, 0x0010, 0x080c, 0x4b95, 0xa87b, ++ 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0060, 0x080c, 0x4b95, ++ 0x6014, 0x2048, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, ++ 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0x080c, ++ 0x61a9, 0x012e, 0x080c, 0x9554, 0x00fe, 0x00ee, 0x009e, 0x0005, ++ 0x7058, 0xaad0, 0x9206, 0x0968, 0x08c0, 0x0016, 0x0026, 0xa87c, ++ 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0150, 0xa890, ++ 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992, 0xaa8e, 0x9085, ++ 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6, 0x0036, 0x0096, ++ 0x6314, 0x2348, 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, ++ 0x00c6, 0x2358, 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, ++ 0x5e2d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, ++ 0xa99a, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, ++ 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, ++ 0x0f2b, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b8, ++ 0x9080, 0x000a, 0x2098, 0x080c, 0x0f2b, 0x00ce, 0x0090, 0xaa96, ++ 0x3918, 0x9398, 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, ++ 0xa89b, 0x0004, 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, ++ 0xa89e, 0x080c, 0x619c, 0x6017, 0x0000, 0x009e, 0x003e, 0x00de, ++ 0x00be, 0x0005, 0x0026, 0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6, ++ 0x6214, 0x2248, 0x6210, 0x2258, 0x2079, 0x0260, 0x9096, 0x0000, ++ 0x11a0, 0xb814, 0x9084, 0x00ff, 0x900e, 0x080c, 0x23fd, 0x2118, ++ 0x831f, 0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, ++ 0x2011, 0x8018, 0x080c, 0x447f, 0x00a8, 0x9096, 0x0001, 0x1148, ++ 0x89ff, 0x0180, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, ++ 0x0048, 0x9096, 0x0002, 0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6, ++ 0x783c, 0xa8aa, 0x00fe, 0x009e, 0x00be, 0x004e, 0x003e, 0x002e, ++ 0x0005, 0x00c6, 0x0026, 0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, ++ 0x0008, 0x6a2c, 0x080c, 0xb09b, 0x01f0, 0x2260, 0x6120, 0x9186, ++ 0x0003, 0x0118, 0x9186, 0x0006, 0x1190, 0x6838, 0x9206, 0x0140, ++ 0x683c, 0x9206, 0x1160, 0x6108, 0x6838, 0x9106, 0x1140, 0x0020, ++ 0x6008, 0x693c, 0x9106, 0x1118, 0x6010, 0x6910, 0x9106, 0x001e, ++ 0x002e, 0x00ce, 0x0005, 0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc, ++ 0x0188, 0x918c, 0x00ff, 0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c, ++ 0x0f00, 0x810f, 0x918e, 0x0001, 0x1128, 0xa834, 0xa938, 0x9115, ++ 0x190c, 0xa82a, 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, 0x0036, ++ 0x901e, 0x0459, 0x01a0, 0x080c, 0xb0ad, 0x0188, 0x6037, 0x4000, ++ 0x6014, 0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, 0xa867, 0x0103, ++ 0xa877, 0x0000, 0x83ff, 0x1129, 0x080c, 0x61a9, 0x009e, 0x003e, ++ 0x0005, 0xa880, 0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, ++ 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, ++ 0x080c, 0xb37a, 0xa877, 0x0000, 0x0005, 0x2001, 0x180f, 0x2004, ++ 0xd0ec, 0x0005, 0x0006, 0x2001, 0x180f, 0x2004, 0xd0f4, 0x000e, ++ 0x0005, 0x2001, 0x180f, 0x2004, 0xd0e4, 0x0005, 0x0036, 0x0046, ++ 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c, ++ 0x44f9, 0x004e, 0x003e, 0x0005, 0x0c61, 0x1d81, 0x0005, 0x2001, ++ 0x1953, 0x2004, 0x601a, 0x0005, 0x2001, 0x1955, 0x2004, 0x6042, ++ 0x0005, 0x080c, 0x9554, 0x0804, 0x8125, 0x00b6, 0x0066, 0x6000, ++ 0x90b2, 0x0016, 0x1a0c, 0x0d84, 0x001b, 0x006e, 0x00be, 0x0005, ++ 0xb798, 0xbdf9, 0xbf54, 0xb798, 0xb798, 0xb798, 0xb798, 0xb798, ++ 0xb7cf, 0xbfcf, 0xb798, 0xb798, 0xb798, 0xb798, 0xb798, 0xb798, ++ 0x080c, 0x0d84, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d84, ++ 0x0013, 0x006e, 0x0005, 0xb7b3, 0xc519, 0xb7b3, 0xb7b3, 0xb7b3, ++ 0xb7b3, 0xb7b3, 0xb7b3, 0xc4c8, 0xc56d, 0xb7b3, 0xcb4c, 0xcb82, ++ 0xcb4c, 0xcb82, 0xb7b3, 0x080c, 0x0d84, 0x6000, 0x9082, 0x0016, ++ 0x1a0c, 0x0d84, 0x6000, 0x000a, 0x0005, 0xb7cd, 0xc1ad, 0xc29d, ++ 0xc2bf, 0xc366, 0xb7cd, 0xc43f, 0xc3ee, 0xbfdb, 0xc49e, 0xc4b3, ++ 0xb7cd, 0xb7cd, 0xb7cd, 0xb7cd, 0xb7cd, 0x080c, 0x0d84, 0x91b2, ++ 0x0053, 0x1a0c, 0x0d84, 0x2100, 0x91b2, 0x0040, 0x1a04, 0xbbfa, ++ 0x0002, 0xb819, 0xb9eb, 0xb819, 0xb819, 0xb819, 0xb9f4, 0xb819, ++ 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, ++ 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, ++ 0xb81b, 0xb871, 0xb880, 0xb8e1, 0xb908, 0xb97f, 0xb9d6, 0xb819, ++ 0xb819, 0xb9f7, 0xb819, 0xb819, 0xba0c, 0xba19, 0xb819, 0xb819, ++ 0xb819, 0xb819, 0xb819, 0xba9c, 0xb819, 0xb819, 0xbab0, 0xb819, ++ 0xb819, 0xba6b, 0xb819, 0xb819, 0xb819, 0xbac8, 0xb819, 0xb819, ++ 0xb819, 0xbb45, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, ++ 0xbbc2, 0x080c, 0x0d84, 0x080c, 0x5eeb, 0x1150, 0x2001, 0x1836, ++ 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, 0x0008, 0x1140, ++ 0x6007, 0x0009, 0x602f, 0x0009, 0x6017, 0x0000, 0x0804, 0xb9e4, ++ 0x080c, 0x5ed5, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6210, ++ 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x7d55, 0x0076, ++ 0x903e, 0x080c, 0x7c4d, 0x2c08, 0x080c, 0xc73e, 0x007e, 0x001e, ++ 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c, ++ 0x5c1c, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0278, 0x080c, ++ 0xc675, 0x1904, 0xb8db, 0x080c, 0xc611, 0x1120, 0x6007, 0x0008, ++ 0x0804, 0xb9e4, 0x6007, 0x0009, 0x0804, 0xb9e4, 0x080c, 0xc860, ++ 0x0128, 0x080c, 0xc675, 0x0d78, 0x0804, 0xb8db, 0x6017, 0x1900, ++ 0x0c88, 0x080c, 0x2e39, 0x1904, 0xbbf7, 0x6106, 0x080c, 0xc5c8, ++ 0x6007, 0x0006, 0x0804, 0xb9e4, 0x6007, 0x0007, 0x0804, 0xb9e4, ++ 0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904, 0xbbf7, ++ 0x00d6, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, ++ 0x1220, 0x2001, 0x0001, 0x080c, 0x5b4d, 0x96b4, 0xff00, 0x8637, ++ 0x9686, 0x0006, 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4, ++ 0x00ff, 0x9686, 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, ++ 0x0005, 0x0110, 0x00de, 0x0478, 0x00e6, 0x2071, 0x0260, 0x7034, ++ 0x90b4, 0x0003, 0x1138, 0x90b2, 0x0014, 0x0220, 0x7030, 0x9084, ++ 0x0003, 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, 0x00b0, ++ 0x00ee, 0x080c, 0xc6d4, 0x1190, 0x9686, 0x0006, 0x1140, 0x0026, ++ 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x2d5f, 0x002e, 0x080c, ++ 0x5ca8, 0x6007, 0x000a, 0x00de, 0x0804, 0xb9e4, 0x6007, 0x000b, ++ 0x00de, 0x0804, 0xb9e4, 0x080c, 0x2d1a, 0x6007, 0x0001, 0x0804, ++ 0xb9e4, 0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904, ++ 0xbbf7, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, 0x1958, 0x90b2, ++ 0x0014, 0x0a40, 0x7030, 0x9084, 0x0003, 0x1920, 0x6610, 0x2658, ++ 0xbe04, 0x9686, 0x0707, 0x09f8, 0x0026, 0x6210, 0x2258, 0xbaa0, ++ 0x900e, 0x080c, 0x2d5f, 0x002e, 0x6007, 0x000c, 0x0804, 0xb9e4, ++ 0x080c, 0x5eeb, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, ++ 0x9086, 0x0008, 0x1110, 0x0804, 0xb828, 0x080c, 0x5ed5, 0x6610, ++ 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x06b8, 0x1138, ++ 0x0026, 0x2001, 0x0006, 0x080c, 0x5b8d, 0x002e, 0x0050, 0x96b4, ++ 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, ++ 0xb8db, 0x080c, 0xc6e1, 0x1120, 0x6007, 0x000e, 0x0804, 0xb9e4, ++ 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2d1a, 0x004e, ++ 0x0016, 0x9006, 0x2009, 0x1853, 0x210c, 0xd1a4, 0x0148, 0x2009, ++ 0x0029, 0x080c, 0xc9c5, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, ++ 0x001e, 0x004e, 0x6007, 0x0001, 0x0804, 0xb9e4, 0x2001, 0x0001, ++ 0x080c, 0x5b4d, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, ++ 0x2019, 0x1805, 0x2011, 0x0270, 0x080c, 0xa425, 0x003e, 0x002e, ++ 0x001e, 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, ++ 0x0004, 0x0a04, 0xb8db, 0x9682, 0x0007, 0x0a04, 0xb931, 0x0804, ++ 0xb8db, 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xb9e4, 0x080c, ++ 0x5eeb, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, ++ 0x0008, 0x1110, 0x0804, 0xb828, 0x080c, 0x5ed5, 0x6610, 0x2658, ++ 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0680, 0x96b4, 0xff00, ++ 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xb8db, ++ 0x080c, 0xc70f, 0x1130, 0x080c, 0xc611, 0x1118, 0x6007, 0x0010, ++ 0x04d8, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2d1a, ++ 0x004e, 0x0016, 0x9006, 0x2009, 0x1853, 0x210c, 0xd1a4, 0x0148, ++ 0x2009, 0x0029, 0x080c, 0xc9c5, 0x6010, 0x2058, 0xb800, 0xc0e5, ++ 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xc860, ++ 0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0988, 0x0804, ++ 0xb8db, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x2e39, ++ 0x1904, 0xbbf7, 0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0xbd93, ++ 0x1904, 0xb8db, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x7c1d, ++ 0x080c, 0x8125, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x0cb0, 0x6007, 0x0005, 0x0c68, 0x080c, ++ 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904, 0xbbf7, 0x080c, ++ 0xbd93, 0x1904, 0xb8db, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x0005, 0x080c, 0x2e39, 0x1904, 0xbbf7, ++ 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x080c, 0x8125, ++ 0x0005, 0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904, ++ 0xbbf7, 0x080c, 0xbd93, 0x1904, 0xb8db, 0x0016, 0x0026, 0x00e6, ++ 0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, 0x080c, ++ 0xb09b, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, 0x6010, ++ 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, 0x2c08, ++ 0x9006, 0x080c, 0xc997, 0x1180, 0x7244, 0x9286, 0xffff, 0x01b0, ++ 0x2160, 0x6007, 0x0026, 0x6017, 0x1700, 0x7214, 0x9296, 0xffff, ++ 0x1180, 0x6007, 0x0025, 0x0068, 0x6020, 0x9086, 0x0007, 0x1d80, ++ 0x6004, 0x9086, 0x0024, 0x1110, 0x080c, 0x9554, 0x2160, 0x6007, ++ 0x0025, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x080c, 0x8125, 0x00ee, ++ 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x5b4d, 0x0156, ++ 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, ++ 0x0276, 0x080c, 0xa425, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120, ++ 0x6007, 0x0031, 0x0804, 0xb9e4, 0x080c, 0xa0dc, 0x080c, 0x6877, ++ 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x6891, 0x1138, 0x080c, ++ 0x6b40, 0x080c, 0x56d9, 0x080c, 0x67be, 0x0010, 0x080c, 0x6853, ++ 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x2e39, 0x1904, 0xbbf7, ++ 0x080c, 0xbd93, 0x1904, 0xb8db, 0x6106, 0x080c, 0xbdaf, 0x1120, ++ 0x6007, 0x002b, 0x0804, 0xb9e4, 0x6007, 0x002c, 0x0804, 0xb9e4, ++ 0x080c, 0xcbbe, 0x1904, 0xbbf7, 0x080c, 0x2e39, 0x1904, 0xbbf7, ++ 0x080c, 0xbd93, 0x1904, 0xb8db, 0x6106, 0x080c, 0xbdb3, 0x1120, ++ 0x6007, 0x002e, 0x0804, 0xb9e4, 0x6007, 0x002f, 0x0804, 0xb9e4, ++ 0x080c, 0x2e39, 0x1904, 0xbbf7, 0x00e6, 0x00d6, 0x00c6, 0x6010, ++ 0x2058, 0xb804, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, 0x9184, ++ 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, ++ 0x0804, 0xb9eb, 0x080c, 0x4dee, 0xd0e4, 0x0904, 0xbb42, 0x2071, ++ 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, 0x080c, ++ 0x5f29, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, 0xb814, ++ 0x9206, 0x0510, 0x080c, 0x5f25, 0x15b8, 0x2069, 0x1800, 0x6878, ++ 0x9206, 0x1590, 0x6874, 0x9106, 0x1578, 0x7210, 0x080c, 0xb09b, ++ 0x0590, 0x080c, 0xbc80, 0x0578, 0x080c, 0xca3c, 0x0560, 0x622e, ++ 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, ++ 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, 0x0150, ++ 0x080c, 0xb09b, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, 0x9106, ++ 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, 0xc997, ++ 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, 0x0009, ++ 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, 0x6017, ++ 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x2e39, 0x1904, ++ 0xbbf7, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, 0x9086, ++ 0x0006, 0x1904, 0xb9eb, 0x00e6, 0x00d6, 0x00c6, 0x080c, 0x4dee, ++ 0xd0e4, 0x0904, 0xbbba, 0x2069, 0x1800, 0x2071, 0x026c, 0x7008, ++ 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, 0x00c6, ++ 0x2c08, 0x9085, 0x0001, 0x080c, 0xc997, 0x2c10, 0x00ce, 0x05e8, ++ 0x080c, 0xb09b, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, 0x9106, ++ 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xad11, 0x002e, 0x00ce, ++ 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, 0x9186, ++ 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, 0x2004, ++ 0x9005, 0x0170, 0x080c, 0xbc80, 0x0904, 0xbb3b, 0x0056, 0x7510, ++ 0x7614, 0x080c, 0xca55, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, ++ 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, ++ 0x080c, 0x7bcb, 0x080c, 0x8125, 0x0c78, 0x6007, 0x003b, 0x602f, ++ 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x080c, 0x7bcb, 0x080c, ++ 0x8125, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, 0x0000, ++ 0x0804, 0xbb12, 0x00e6, 0x0026, 0x080c, 0x5eeb, 0x0550, 0x080c, ++ 0x5ed5, 0x080c, 0xcc30, 0x1518, 0x2071, 0x1800, 0x70d8, 0x9085, ++ 0x0003, 0x70da, 0x00f6, 0x2079, 0x0100, 0x72a8, 0x9284, 0x00ff, ++ 0x7076, 0x78e6, 0x9284, 0xff00, 0x7278, 0x9205, 0x707a, 0x78ea, ++ 0x00fe, 0x70e3, 0x0000, 0x080c, 0x5f29, 0x0120, 0x2011, 0x19cd, ++ 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2b1e, 0x0010, 0x080c, ++ 0xcc62, 0x002e, 0x00ee, 0x080c, 0x9554, 0x0804, 0xb9ea, 0x080c, ++ 0x9554, 0x0005, 0x2600, 0x0002, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc0e, ++ 0xbc0e, 0xbc10, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc2b, 0xbc0e, ++ 0xbc0e, 0xbc0e, 0xbc3d, 0xbc4a, 0xbc7b, 0xbc0e, 0x080c, 0x0d84, ++ 0x080c, 0xcbbe, 0x1d20, 0x080c, 0x2e39, 0x1d08, 0x080c, 0xbd93, ++ 0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, 0x080c, ++ 0x7c1d, 0x0005, 0x080c, 0x2d1a, 0x6007, 0x0001, 0x6003, 0x0001, ++ 0x080c, 0x7c1d, 0x0005, 0x080c, 0xcbbe, 0x1948, 0x080c, 0x2e39, ++ 0x1930, 0x080c, 0xbd93, 0x1d70, 0x703c, 0x6016, 0x6007, 0x004a, ++ 0x6003, 0x0001, 0x080c, 0x7c1d, 0x0005, 0x080c, 0xbc9b, 0x0904, ++ 0xbbf7, 0x6007, 0x004e, 0x6003, 0x0001, 0x080c, 0x7c1d, 0x080c, ++ 0x8125, 0x0005, 0x6007, 0x004f, 0x6017, 0x0000, 0x7134, 0x918c, ++ 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, 0x1160, 0x7140, 0x2001, ++ 0x198a, 0x2004, 0x9106, 0x11b0, 0x7144, 0x2001, 0x198b, 0x2004, ++ 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, 0x2011, 0x0276, 0x20a9, ++ 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xa439, ++ 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, 0x0001, 0x080c, 0x7c1d, ++ 0x080c, 0x8125, 0x0005, 0x6007, 0x0050, 0x703c, 0x6016, 0x0ca0, ++ 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260, 0x6010, 0x2058, ++ 0xb8bc, 0xd084, 0x0150, 0x7128, 0x6048, 0x9106, 0x1120, 0x712c, ++ 0x6044, 0x9106, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, ++ 0x00be, 0x00ee, 0x0005, 0x0016, 0x0096, 0x0086, 0x00e6, 0x01c6, ++ 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x7088, 0x908a, ++ 0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, 0x196d, 0x2003, 0x0000, ++ 0x080c, 0x0fc7, 0x05a0, 0x2900, 0x6016, 0x7088, 0x8004, 0xa816, ++ 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, 0x20a9, 0x001e, 0xa860, ++ 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x196d, 0x0016, ++ 0x200c, 0x0471, 0x001e, 0x2940, 0x080c, 0x0fc7, 0x01c0, 0x2900, ++ 0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18, 0xa832, 0x20a8, 0xa860, ++ 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x196d, 0x0016, ++ 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, 0x0001, 0x0048, 0x2071, ++ 0x1800, 0x708b, 0x0000, 0x6014, 0x2048, 0x080c, 0x0f60, 0x9006, ++ 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, 0x009e, 0x001e, 0x0005, ++ 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x918c, 0xffff, 0x11a8, ++ 0x080c, 0x1fed, 0x2099, 0x026c, 0x2001, 0x0014, 0x3518, 0x9312, ++ 0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8, 0x4003, 0x22a8, 0x8108, ++ 0x080c, 0x1fed, 0x2099, 0x0260, 0x0ca8, 0x080c, 0x1fed, 0x2061, ++ 0x196d, 0x6004, 0x2098, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, ++ 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x1fed, ++ 0x2099, 0x0260, 0x0ca8, 0x2061, 0x196d, 0x2019, 0x0280, 0x3300, ++ 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0260, 0x6006, 0x8108, ++ 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e, ++ 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, ++ 0x00c6, 0x81ff, 0x11b8, 0x080c, 0x2005, 0x20a1, 0x024c, 0x2001, ++ 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8, ++ 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c, 0x2005, 0x20a1, ++ 0x0240, 0x0c98, 0x080c, 0x2005, 0x2061, 0x1970, 0x6004, 0x20a0, ++ 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8, ++ 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c, 0x2005, 0x20a1, ++ 0x0240, 0x0c98, 0x2061, 0x1970, 0x2019, 0x0260, 0x3400, 0x931e, ++ 0x0110, 0x6006, 0x0020, 0x2001, 0x0240, 0x6006, 0x8108, 0x2162, ++ 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e, 0x002e, ++ 0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, 0x6610, 0x2658, 0xbe04, ++ 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0170, 0x9686, 0x0004, ++ 0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x0128, 0x9686, ++ 0x0004, 0x0110, 0x9085, 0x0001, 0x006e, 0x00be, 0x0005, 0x00d6, ++ 0x0441, 0x00de, 0x0005, 0x00d6, 0x0489, 0x11e8, 0x680c, 0x908c, ++ 0xff00, 0x6820, 0x9084, 0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, ++ 0xd1e4, 0x0118, 0x2009, 0x0001, 0x0058, 0xd1ec, 0x0160, 0x6920, ++ 0x918c, 0x00ff, 0x6824, 0x080c, 0x23fd, 0x1128, 0x2110, 0x900e, ++ 0x080c, 0x2d5f, 0x0018, 0x9085, 0x0001, 0x0008, 0x9006, 0x00de, ++ 0x0005, 0x2069, 0x026d, 0x6800, 0x9082, 0x0010, 0x1228, 0x6017, ++ 0x0000, 0x9085, 0x0001, 0x0008, 0x9006, 0x0005, 0x6017, 0x0000, ++ 0x2069, 0x026c, 0x6808, 0x9084, 0xff00, 0x9086, 0x0800, 0x1140, ++ 0x6800, 0x9084, 0x00ff, 0x908e, 0x0014, 0x0110, 0x908e, 0x0010, ++ 0x0005, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0d84, 0x91b6, 0x0013, ++ 0x1130, 0x2008, 0x91b2, 0x0040, 0x1a04, 0xbf24, 0x0092, 0x91b6, ++ 0x0027, 0x0120, 0x91b6, 0x0014, 0x190c, 0x0d84, 0x2001, 0x0007, ++ 0x080c, 0x5b8d, 0x080c, 0x8026, 0x080c, 0x9584, 0x080c, 0x8125, ++ 0x0005, 0xbe59, 0xbe5b, 0xbe59, 0xbe59, 0xbe59, 0xbe5b, 0xbe6a, ++ 0xbf1d, 0xbebc, 0xbf1d, 0xbece, 0xbf1d, 0xbe6a, 0xbf1d, 0xbf15, ++ 0xbf1d, 0xbf15, 0xbf1d, 0xbf1d, 0xbe59, 0xbe59, 0xbe59, 0xbe59, ++ 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbe5b, ++ 0xbe59, 0xbf1d, 0xbe59, 0xbe59, 0xbf1d, 0xbe59, 0xbf1a, 0xbf1d, ++ 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbf1d, 0xbf1d, 0xbe59, 0xbf1d, ++ 0xbf1d, 0xbe59, 0xbe65, 0xbe59, 0xbe59, 0xbe59, 0xbe59, 0xbf19, ++ 0xbf1d, 0xbe59, 0xbe59, 0xbf1d, 0xbf1d, 0xbe59, 0xbe59, 0xbe59, ++ 0xbe59, 0x080c, 0x0d84, 0x080c, 0x8026, 0x080c, 0xb76f, 0x6003, ++ 0x0002, 0x080c, 0x8125, 0x0804, 0xbf23, 0x9006, 0x080c, 0x5b4d, ++ 0x0804, 0xbf1d, 0x080c, 0x5f25, 0x1904, 0xbf1d, 0x9006, 0x080c, ++ 0x5b4d, 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6, ++ 0x2079, 0x1800, 0x78a0, 0x8000, 0x78a2, 0x00fe, 0x0428, 0x6010, ++ 0x2058, 0xb8b0, 0x9005, 0x1178, 0x080c, 0xb759, 0x1904, 0xbf1d, ++ 0x0036, 0x0046, 0xbba0, 0x2021, 0x0007, 0x080c, 0x44f9, 0x004e, ++ 0x003e, 0x0804, 0xbf1d, 0x080c, 0x2e64, 0x1904, 0xbf1d, 0x2001, ++ 0x1800, 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800, ++ 0x78a0, 0x8000, 0x78a2, 0x00fe, 0x2001, 0x0002, 0x080c, 0x5b61, ++ 0x080c, 0x8026, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, ++ 0x080c, 0x7c1d, 0x080c, 0x8125, 0x6110, 0x2158, 0x2009, 0x0001, ++ 0x080c, 0x7826, 0x0804, 0xbf23, 0x6610, 0x2658, 0xbe04, 0x96b4, ++ 0xff00, 0x8637, 0x9686, 0x0006, 0x0904, 0xbf1d, 0x9686, 0x0004, ++ 0x0904, 0xbf1d, 0x2001, 0x0004, 0x0804, 0xbf1b, 0x2001, 0x1800, ++ 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, ++ 0xbba0, 0x2021, 0x0006, 0x080c, 0x44f9, 0x004e, 0x003e, 0x2001, ++ 0x0006, 0x080c, 0xbf41, 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4, ++ 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0168, 0x2001, 0x0006, ++ 0x080c, 0x5b8d, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, 0x2001, ++ 0x0006, 0x080c, 0x5b61, 0x080c, 0x5f25, 0x11f8, 0x2001, 0x1836, ++ 0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, ++ 0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a0, 0x8000, 0x78a2, 0x00fe, ++ 0x0804, 0xbea4, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0449, ++ 0x0020, 0x0018, 0x0010, 0x080c, 0x5b8d, 0x080c, 0x8026, 0x080c, ++ 0x9554, 0x080c, 0x8125, 0x0005, 0x2600, 0x0002, 0xbf38, 0xbf38, ++ 0xbf38, 0xbf38, 0xbf38, 0xbf3a, 0xbf38, 0xbf38, 0xbf38, 0xbf38, ++ 0xbf3a, 0xbf38, 0xbf38, 0xbf38, 0xbf3a, 0xbf3a, 0xbf3a, 0xbf3a, ++ 0x080c, 0x0d84, 0x080c, 0x8026, 0x080c, 0x9554, 0x080c, 0x8125, ++ 0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184, ++ 0x0138, 0x080c, 0x5b61, 0x9006, 0x080c, 0x5b4d, 0x080c, 0x2d3f, ++ 0x00de, 0x00be, 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, 0x9084, ++ 0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0d84, 0x91b6, 0x0015, ++ 0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, 0x0d84, 0x006b, ++ 0x0005, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0xbfb9, ++ 0xbf81, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, 0x9f7a, ++ 0x9f7a, 0x9f7a, 0x9f7a, 0xbfb9, 0xbfc0, 0x9f7a, 0x9f7a, 0x9f7a, ++ 0x9f7a, 0x00f6, 0x080c, 0x5f25, 0x11c0, 0x6010, 0x905d, 0x01a8, ++ 0xb8b0, 0x9005, 0x0190, 0x9006, 0x080c, 0x5b4d, 0x2001, 0x0002, ++ 0x080c, 0x5b61, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, ++ 0x080c, 0x7c1d, 0x080c, 0x8125, 0x00d0, 0x2011, 0x0263, 0x2204, ++ 0x8211, 0x220c, 0x080c, 0x23fd, 0x1190, 0x080c, 0x5c0d, 0x0118, ++ 0x080c, 0x9554, 0x0060, 0xb810, 0x0006, 0xb814, 0x0006, 0x080c, ++ 0x56f3, 0x000e, 0xb816, 0x000e, 0xb812, 0x080c, 0x9554, 0x00fe, ++ 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9554, 0x0005, ++ 0x080c, 0xa2b9, 0x1148, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, ++ 0x7c1d, 0x080c, 0x8125, 0x0010, 0x080c, 0x9554, 0x0005, 0x6004, ++ 0x908a, 0x0053, 0x1a0c, 0x0d84, 0x080c, 0x8026, 0x080c, 0x9584, ++ 0x080c, 0x8125, 0x0005, 0x9182, 0x0040, 0x0002, 0xbff1, 0xbff1, ++ 0xbff1, 0xbff1, 0xbff3, 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1, ++ 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1, 0xbff1, ++ 0xbff1, 0x080c, 0x0d84, 0x0096, 0x00b6, 0x00d6, 0x00e6, 0x00f6, ++ 0x0046, 0x0026, 0x6210, 0x2258, 0xb8ac, 0x9005, 0x11a8, 0x6106, ++ 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xc05a, 0x080c, ++ 0xcccc, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, 0x0001, 0x2011, ++ 0x0200, 0x080c, 0x7a0a, 0x0020, 0x9026, 0x080c, 0xcc03, 0x0c38, ++ 0x080c, 0x0fae, 0x090c, 0x0d84, 0x6003, 0x0007, 0xa867, 0x010d, ++ 0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00, 0xa88e, 0x6008, 0xa8e2, ++ 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a, 0x0016, 0xa876, 0xa87f, ++ 0x0000, 0xa883, 0x0000, 0xa887, 0x0036, 0x080c, 0x61a9, 0x001e, ++ 0x080c, 0xcccc, 0x1904, 0xc0ba, 0x9486, 0x2000, 0x1130, 0x2019, ++ 0x0017, 0x080c, 0xc941, 0x0804, 0xc0ba, 0x9486, 0x0400, 0x1130, ++ 0x2019, 0x0002, 0x080c, 0xc8f8, 0x0804, 0xc0ba, 0x9486, 0x0200, ++ 0x1110, 0x080c, 0xc8dd, 0x9486, 0x1000, 0x1110, 0x080c, 0xc926, ++ 0x0804, 0xc0ba, 0x2069, 0x1a3d, 0x6a00, 0xd284, 0x0904, 0xc124, ++ 0x9284, 0x0300, 0x1904, 0xc11d, 0x6804, 0x9005, 0x0904, 0xc105, ++ 0x2d78, 0x6003, 0x0007, 0x080c, 0x0fc7, 0x0904, 0xc0c6, 0x7800, ++ 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x2001, ++ 0x180e, 0x2004, 0xd084, 0x1904, 0xc128, 0x9006, 0xa802, 0xa867, ++ 0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a, 0x6010, 0x2058, ++ 0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba, 0xb92c, 0xa9be, ++ 0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d, 0x7044, 0x9084, ++ 0x0003, 0x9080, 0xc0c2, 0x2005, 0xa87e, 0x20a9, 0x000a, 0x2001, ++ 0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205, 0x200b, 0x0080, ++ 0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0, 0x4003, 0x200b, ++ 0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000, 0x200c, 0xa9ae, ++ 0x080c, 0x61a9, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be, ++ 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x180f, ++ 0x2004, 0xd084, 0x0120, 0x080c, 0x0fae, 0x1904, 0xc06f, 0x6017, ++ 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x7bcb, 0x080c, ++ 0x8125, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086, ++ 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c, ++ 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, ++ 0x080c, 0x7bcb, 0x080c, 0x8125, 0x0828, 0x6868, 0x602e, 0x686c, ++ 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, ++ 0x7bcb, 0x080c, 0x8125, 0x0804, 0xc0ba, 0x2001, 0x180d, 0x2004, ++ 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x447f, 0x6017, 0xf300, ++ 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, ++ 0x7bcb, 0x080c, 0x8125, 0x0804, 0xc0ba, 0x6017, 0xf500, 0x0c98, ++ 0x6017, 0xf600, 0x0804, 0xc0da, 0x6017, 0xf200, 0x0804, 0xc0da, ++ 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a, ++ 0x7044, 0x9084, 0x0003, 0x9080, 0xc0c2, 0x2005, 0xa87e, 0x2928, ++ 0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a, 0xb82c, 0xa88e, ++ 0xb830, 0xa892, 0xb834, 0xa896, 0xa883, 0x003d, 0x2009, 0x0205, ++ 0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000, 0x2011, 0x0210, ++ 0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111, 0x1a0c, 0x0d84, ++ 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, 0xa85c, ++ 0x9080, 0x0029, 0x20a0, 0x2011, 0xc1a4, 0x2041, 0x0001, 0x223d, ++ 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, 0x931a, ++ 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, 0x0260, ++ 0x2098, 0x0c68, 0x2950, 0x080c, 0x0fc7, 0x0170, 0x2900, 0xb002, ++ 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, 0x9080, ++ 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, 0x0118, ++ 0x080c, 0x0fe0, 0x0cc8, 0x080c, 0x0fe0, 0x0804, 0xc0c6, 0x2548, ++ 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, 0x0000, ++ 0x080c, 0xc970, 0x0804, 0xc0ba, 0x8010, 0x0004, 0x801a, 0x0006, ++ 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, 0x1160, ++ 0x6004, 0x908a, 0x0054, 0x1a0c, 0x0d84, 0x9082, 0x0040, 0x0a0c, ++ 0x0d84, 0x2008, 0x0804, 0xc255, 0x9186, 0x0051, 0x0108, 0x00c0, ++ 0x2001, 0x0109, 0x2004, 0xd084, 0x0904, 0xc206, 0x0126, 0x2091, ++ 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x7ab7, 0x002e, 0x001e, ++ 0x000e, 0x012e, 0x6000, 0x9086, 0x0002, 0x1580, 0x0804, 0xc29d, ++ 0x9186, 0x0027, 0x0530, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014, ++ 0x0500, 0x190c, 0x0d84, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, ++ 0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6, 0x2061, 0x0100, 0x0006, ++ 0x0016, 0x0026, 0x080c, 0x7ab7, 0x002e, 0x001e, 0x000e, 0x00ce, ++ 0x012e, 0x00ce, 0x6000, 0x9086, 0x0004, 0x190c, 0x0d84, 0x0804, ++ 0xc366, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, 0x95e9, ++ 0x0005, 0xc21c, 0xc21e, 0xc21e, 0xc245, 0xc21c, 0xc21c, 0xc21c, ++ 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0xc21c, ++ 0xc21c, 0xc21c, 0xc21c, 0xc21c, 0x080c, 0x0d84, 0x080c, 0x8026, ++ 0x080c, 0x8125, 0x0036, 0x0096, 0x6014, 0x904d, 0x01d8, 0x080c, ++ 0xb0ad, 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6, 0x2058, 0xb800, ++ 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, 0xc970, 0x6017, ++ 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, 0x1954, 0x2004, 0x601a, ++ 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x0096, 0x080c, 0x8026, ++ 0x080c, 0x8125, 0x080c, 0xb0ad, 0x0120, 0x6014, 0x2048, 0x080c, ++ 0x0fe0, 0x080c, 0x9584, 0x009e, 0x0005, 0x0002, 0xc269, 0xc280, ++ 0xc26b, 0xc297, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, ++ 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, 0xc269, ++ 0xc269, 0x080c, 0x0d84, 0x0096, 0x080c, 0x8026, 0x6014, 0x2048, ++ 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c, ++ 0x95ce, 0x0010, 0x6003, 0x0004, 0x080c, 0x8125, 0x009e, 0x0005, ++ 0x080c, 0x8026, 0x080c, 0xb0ad, 0x0138, 0x6114, 0x0096, 0x2148, ++ 0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, 0x79df, 0x080c, 0x9554, ++ 0x080c, 0x8125, 0x0005, 0x080c, 0xcbc7, 0x0db0, 0x0cc8, 0x080c, ++ 0x8026, 0x2009, 0x0041, 0x0804, 0xc3ee, 0x9182, 0x0040, 0x0002, ++ 0xc2b3, 0xc2b5, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, ++ 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, 0xc2b3, ++ 0xc2b3, 0xc2b6, 0xc2b3, 0x080c, 0x0d84, 0x0005, 0x00d6, 0x080c, ++ 0x79df, 0x00de, 0x080c, 0xcc1f, 0x080c, 0x9554, 0x0005, 0x9182, ++ 0x0040, 0x0002, 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d5, ++ 0xc2d5, 0xc2d5, 0xc2d5, 0xc2d7, 0xc32e, 0xc2d5, 0xc2d5, 0xc2d5, ++ 0xc2d5, 0xc32e, 0xc2d5, 0xc2d5, 0xc2d5, 0x080c, 0x0d84, 0x2001, ++ 0x0105, 0x2004, 0x9084, 0x1800, 0x1904, 0xc32e, 0x2001, 0x1872, ++ 0x2004, 0xd0e4, 0x1528, 0x603b, 0x0000, 0x080c, 0x80d6, 0x6014, ++ 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e, ++ 0x0002, 0x0508, 0x2001, 0x180c, 0x2004, 0xd0d4, 0x11e0, 0x080c, ++ 0x8202, 0x2009, 0x0041, 0x009e, 0x0804, 0xc3ee, 0x080c, 0x8202, ++ 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x79df, 0x009e, 0x0005, ++ 0x2001, 0x0100, 0x2004, 0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f, ++ 0x2004, 0x603a, 0x0890, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, ++ 0xd1cc, 0x0110, 0x080c, 0x2809, 0x080c, 0x8202, 0x6014, 0x2048, ++ 0xa97c, 0xd1ec, 0x1130, 0x080c, 0x79df, 0x080c, 0x9554, 0x009e, ++ 0x0005, 0x080c, 0xcbc7, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, ++ 0x200c, 0xc1d4, 0x2102, 0x0036, 0x080c, 0x80d6, 0x080c, 0x8202, ++ 0x6014, 0x0096, 0x2048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, ++ 0xd0bc, 0x0188, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0140, ++ 0xa8ac, 0x6330, 0x931a, 0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e, ++ 0x6003, 0x0002, 0x0080, 0x2019, 0x0004, 0x080c, 0xc970, 0x6018, ++ 0x9005, 0x1128, 0x2001, 0x1954, 0x2004, 0x8003, 0x601a, 0x6017, ++ 0x0000, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, ++ 0x0002, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, ++ 0xc37d, 0xc37f, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc37d, ++ 0xc37d, 0xc37d, 0xc37d, 0xc37d, 0xc3ca, 0x080c, 0x0d84, 0x6014, ++ 0x0096, 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2058, 0xb900, ++ 0x00be, 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, ++ 0x2009, 0x0041, 0x00de, 0x0804, 0xc3ee, 0x6003, 0x0007, 0x601b, ++ 0x0000, 0x080c, 0x79df, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58, ++ 0x0006, 0x0046, 0xacac, 0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030, ++ 0x9420, 0x6432, 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8, ++ 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009, ++ 0x180d, 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, ++ 0x0006, 0x00e9, 0x080c, 0x79e1, 0x009e, 0x0005, 0x6003, 0x0002, ++ 0x009e, 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x1489, 0x1904, ++ 0xc37f, 0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, ++ 0x9105, 0x1120, 0x080c, 0x1489, 0x1904, 0xc37f, 0x0005, 0xd2fc, ++ 0x0140, 0x8002, 0x8000, 0x8212, 0x9291, 0x0000, 0x2009, 0x0009, ++ 0x0010, 0x2009, 0x0015, 0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040, ++ 0x0208, 0x0062, 0x9186, 0x0013, 0x0120, 0x9186, 0x0014, 0x190c, ++ 0x0d84, 0x6024, 0xd0dc, 0x090c, 0x0d84, 0x0005, 0xc411, 0xc418, ++ 0xc424, 0xc430, 0xc411, 0xc411, 0xc411, 0xc411, 0xc411, 0xc413, ++ 0xc413, 0xc411, 0xc411, 0xc411, 0xc411, 0xc413, 0xc411, 0xc413, ++ 0xc411, 0x080c, 0x0d84, 0x6024, 0xd0dc, 0x090c, 0x0d84, 0x0005, ++ 0x6003, 0x0001, 0x6106, 0x080c, 0x7bcb, 0x0126, 0x2091, 0x8000, ++ 0x080c, 0x8125, 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, ++ 0x7bcb, 0x0126, 0x2091, 0x8000, 0x080c, 0x8125, 0x012e, 0x0005, ++ 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x18b7, 0x0126, 0x2091, ++ 0x8000, 0x080c, 0x7c3a, 0x080c, 0x820b, 0x012e, 0x0005, 0x0126, ++ 0x2091, 0x8000, 0x0036, 0x0096, 0x9182, 0x0040, 0x0023, 0x009e, ++ 0x003e, 0x012e, 0x0005, 0xc45b, 0xc45d, 0xc46f, 0xc489, 0xc45b, ++ 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, 0xc45b, ++ 0xc45b, 0xc45b, 0xc45b, 0x080c, 0x0d84, 0x6014, 0x2048, 0xa87c, ++ 0xd0fc, 0x01f8, 0x909c, 0x0003, 0x939e, 0x0003, 0x01d0, 0x6003, ++ 0x0001, 0x6106, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x0470, 0x6014, ++ 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, ++ 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x7bcb, 0x080c, 0x8125, ++ 0x00e0, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xc970, ++ 0x00a0, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, ++ 0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, ++ 0x18b7, 0x080c, 0x7c3a, 0x080c, 0x820b, 0x0005, 0x080c, 0x8026, ++ 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xcc6b, 0x0036, ++ 0x2019, 0x0029, 0x080c, 0xc970, 0x003e, 0x009e, 0x080c, 0x9584, ++ 0x080c, 0x8125, 0x0005, 0x080c, 0x80d6, 0x6114, 0x81ff, 0x0158, ++ 0x0096, 0x2148, 0x080c, 0xcc6b, 0x0036, 0x2019, 0x0029, 0x080c, ++ 0xc970, 0x003e, 0x009e, 0x080c, 0x9584, 0x080c, 0x820b, 0x0005, ++ 0x9182, 0x0085, 0x0002, 0xc4da, 0xc4d8, 0xc4d8, 0xc4e6, 0xc4d8, ++ 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, 0xc4d8, ++ 0x080c, 0x0d84, 0x6003, 0x000b, 0x6106, 0x080c, 0x7bcb, 0x0126, ++ 0x2091, 0x8000, 0x080c, 0x8125, 0x012e, 0x0005, 0x0026, 0x00e6, ++ 0x080c, 0xcbbe, 0x0118, 0x080c, 0x9554, 0x0440, 0x2071, 0x0260, ++ 0x7224, 0x6216, 0x2001, 0x180d, 0x2004, 0xd0e4, 0x0150, 0x6010, ++ 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, ++ 0x9844, 0x7220, 0x080c, 0xc816, 0x0118, 0x6007, 0x0086, 0x0040, ++ 0x6007, 0x0087, 0x7224, 0x9296, 0xffff, 0x1110, 0x6007, 0x0086, ++ 0x6003, 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x00ee, 0x002e, ++ 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, ++ 0x0d84, 0x908a, 0x0092, 0x1a0c, 0x0d84, 0x9082, 0x0085, 0x00a2, ++ 0x9186, 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, 0x95e9, ++ 0x0050, 0x2001, 0x0007, 0x080c, 0x5b8d, 0x080c, 0x8026, 0x080c, ++ 0x9584, 0x080c, 0x8125, 0x0005, 0xc549, 0xc54b, 0xc54b, 0xc549, ++ 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, 0xc549, ++ 0xc549, 0x080c, 0x0d84, 0x080c, 0x8026, 0x080c, 0x9584, 0x080c, ++ 0x8125, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0d84, 0x9182, 0x0092, ++ 0x1a0c, 0x0d84, 0x9182, 0x0085, 0x0002, 0xc56a, 0xc56a, 0xc56a, ++ 0xc56c, 0xc56a, 0xc56a, 0xc56a, 0xc56a, 0xc56a, 0xc56a, 0xc56a, ++ 0xc56a, 0xc56a, 0x080c, 0x0d84, 0x0005, 0x9186, 0x0013, 0x0148, ++ 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x95e9, ++ 0x0030, 0x080c, 0x8026, 0x080c, 0x9584, 0x080c, 0x8125, 0x0005, ++ 0x0036, 0x080c, 0xcc1f, 0x6043, 0x0000, 0x2019, 0x000b, 0x0031, ++ 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, ++ 0x2091, 0x8000, 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0x8ef6, ++ 0x009e, 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, 0x8f9a, 0x007e, ++ 0x1520, 0x6000, 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007, ++ 0x01e0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xcc1f, 0x080c, ++ 0xb76f, 0x080c, 0x17b0, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, ++ 0xb0ad, 0x0110, 0x080c, 0xc970, 0x009e, 0x6017, 0x0000, 0x080c, ++ 0xcc1f, 0x6023, 0x0007, 0x080c, 0xb76f, 0x003e, 0x012e, 0x0005, ++ 0x00f6, 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938, ++ 0x783c, 0x080c, 0x23fd, 0x15b8, 0x0016, 0x00c6, 0x080c, 0x5c0d, ++ 0x1580, 0x001e, 0x00c6, 0x2160, 0x080c, 0xb76c, 0x00ce, 0x002e, ++ 0x0026, 0x0016, 0x2019, 0x0029, 0x080c, 0x905b, 0x080c, 0x7d55, ++ 0x0076, 0x903e, 0x080c, 0x7c4d, 0x007e, 0x001e, 0x0076, 0x903e, ++ 0x080c, 0xc73e, 0x007e, 0x0026, 0xba04, 0x9294, 0xff00, 0x8217, ++ 0x9286, 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c, ++ 0x2dd3, 0x002e, 0x001e, 0x080c, 0x56f3, 0xbe12, 0xbd16, 0x9006, ++ 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe, ++ 0x0005, 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1822, 0x2104, ++ 0x9086, 0x0074, 0x1904, 0xc66a, 0x2069, 0x0260, 0x6944, 0x9182, ++ 0x0100, 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, 0xc667, 0x2001, ++ 0x194b, 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb8b0, 0x9005, ++ 0x0118, 0x9184, 0x0800, 0x0598, 0x6948, 0x918a, 0x0001, 0x0648, ++ 0x080c, 0xccd1, 0x0118, 0x6978, 0xd1fc, 0x11b8, 0x2009, 0x0205, ++ 0x200b, 0x0001, 0x693c, 0x81ff, 0x1198, 0x6944, 0x9182, 0x0100, ++ 0x02a8, 0x6940, 0x81ff, 0x1178, 0x6948, 0x918a, 0x0001, 0x0288, ++ 0x6950, 0x918a, 0x0001, 0x0298, 0x00d0, 0x6017, 0x0100, 0x00a0, ++ 0x6017, 0x0300, 0x0088, 0x6017, 0x0500, 0x0070, 0x6017, 0x0700, ++ 0x0058, 0x6017, 0x0900, 0x0040, 0x6017, 0x0b00, 0x0028, 0x6017, ++ 0x0f00, 0x0010, 0x6017, 0x2d00, 0x9085, 0x0001, 0x0008, 0x9006, ++ 0x001e, 0x00be, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00b6, 0x0026, ++ 0x0036, 0x0156, 0x6210, 0x2258, 0xbb04, 0x9394, 0x00ff, 0x9286, ++ 0x0006, 0x0178, 0x9286, 0x0004, 0x0160, 0x9394, 0xff00, 0x8217, ++ 0x9286, 0x0006, 0x0130, 0x9286, 0x0004, 0x0118, 0x080c, 0x5c1c, ++ 0x04e0, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, ++ 0x000a, 0x080c, 0xa439, 0x009e, 0x1588, 0x2011, 0x027a, 0x20a9, ++ 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xa439, 0x009e, ++ 0x1528, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1853, ++ 0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, 0xc9c5, 0xb800, ++ 0xc0e5, 0xb802, 0x2019, 0x0029, 0x080c, 0x7d55, 0x0076, 0x2039, ++ 0x0000, 0x080c, 0x7c4d, 0x2c08, 0x080c, 0xc73e, 0x007e, 0x2001, ++ 0x0007, 0x080c, 0x5b8d, 0x001e, 0x004e, 0x9006, 0x015e, 0x003e, ++ 0x002e, 0x00be, 0x00ce, 0x0005, 0x00d6, 0x2069, 0x026e, 0x6800, ++ 0x9086, 0x0800, 0x0118, 0x6017, 0x0000, 0x0008, 0x9006, 0x00de, ++ 0x0005, 0x00b6, 0x00f6, 0x0016, 0x0026, 0x0036, 0x0156, 0x2079, ++ 0x026c, 0x7930, 0x7834, 0x080c, 0x23fd, 0x11d0, 0x080c, 0x5c0d, ++ 0x11b8, 0x2011, 0x0270, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, ++ 0x000a, 0x080c, 0xa439, 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, ++ 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xa439, 0x009e, ++ 0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, ++ 0x0006, 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0x0263, 0x2204, ++ 0x8211, 0x220c, 0x080c, 0x23fd, 0x11d0, 0x080c, 0x5c0d, 0x11b8, ++ 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, ++ 0x080c, 0xa439, 0x009e, 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, ++ 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xa439, 0x009e, 0x015e, ++ 0x003e, 0x002e, 0x001e, 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, ++ 0x0086, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, ++ 0x8000, 0x2740, 0x2029, 0x19bd, 0x252c, 0x2021, 0x19c3, 0x2424, ++ 0x2061, 0x1cd0, 0x2071, 0x1800, 0x764c, 0x706c, 0x81ff, 0x0150, ++ 0x0006, 0x9186, 0x1a72, 0x000e, 0x0128, 0x8001, 0x9602, 0x1a04, ++ 0xc7cf, 0x0018, 0x9606, 0x0904, 0xc7cf, 0x2100, 0x9c06, 0x0904, ++ 0xc7c6, 0x080c, 0xca01, 0x1904, 0xc7c6, 0x080c, 0xccd8, 0x0904, ++ 0xc7c6, 0x080c, 0xc9f1, 0x0904, 0xc7c6, 0x6720, 0x9786, 0x0001, ++ 0x1148, 0x080c, 0x2e64, 0x0904, 0xc7ea, 0x6004, 0x9086, 0x0000, ++ 0x1904, 0xc7ea, 0x9786, 0x0004, 0x0904, 0xc7ea, 0x9786, 0x0007, ++ 0x05e8, 0x2500, 0x9c06, 0x05d0, 0x2400, 0x9c06, 0x05b8, 0x88ff, ++ 0x0118, 0x6054, 0x9906, 0x1590, 0x0096, 0x6000, 0x9086, 0x0004, ++ 0x1120, 0x0016, 0x080c, 0x17b0, 0x001e, 0x9786, 0x0008, 0x1148, ++ 0x080c, 0xb295, 0x1130, 0x080c, 0x9e99, 0x009e, 0x080c, 0x9584, ++ 0x00e8, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x01a8, 0x9786, 0x0003, ++ 0x1540, 0x080c, 0xc810, 0x0110, 0xa867, 0x0103, 0xab7a, 0xa877, ++ 0x0000, 0x080c, 0xcc6b, 0x0016, 0x080c, 0xb374, 0x080c, 0x619c, ++ 0x001e, 0x080c, 0xb278, 0x009e, 0x080c, 0x9584, 0x9ce0, 0x0018, ++ 0x2001, 0x1818, 0x2004, 0x9c02, 0x1210, 0x0804, 0xc752, 0x012e, ++ 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, ++ 0x0005, 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128, 0x080c, ++ 0xcc6b, 0x080c, 0xc970, 0x08f8, 0x009e, 0x0c00, 0x9786, 0x000a, ++ 0x0968, 0x0838, 0x81ff, 0x09d0, 0x9180, 0x0001, 0x2004, 0x9086, ++ 0x0018, 0x0130, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, 0x1970, ++ 0x6000, 0x9086, 0x0002, 0x1950, 0x080c, 0xb284, 0x0130, 0x080c, ++ 0xb295, 0x1920, 0x080c, 0x9e99, 0x0038, 0x080c, 0x2d3f, 0x080c, ++ 0xb295, 0x1110, 0x080c, 0x9e99, 0x080c, 0x9584, 0x0804, 0xc7c6, ++ 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6, 0x00e6, ++ 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, 0xc997, 0x001e, 0x0120, ++ 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, 0xc835, ++ 0xc835, 0xc835, 0xc835, 0xc835, 0xc835, 0xc837, 0xc835, 0xc835, ++ 0xc835, 0xc835, 0x9584, 0x9584, 0xc835, 0x9006, 0x0005, 0x0036, ++ 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, ++ 0x2009, 0x0020, 0x080c, 0xc9c5, 0x001e, 0x004e, 0x2019, 0x0002, ++ 0x080c, 0xc58e, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096, 0x080c, ++ 0xb0ad, 0x0140, 0x6014, 0x904d, 0x080c, 0xad1e, 0x687b, 0x0005, ++ 0x080c, 0x61a9, 0x009e, 0x080c, 0x9584, 0x9085, 0x0001, 0x0005, ++ 0x2001, 0x0001, 0x080c, 0x5b4d, 0x0156, 0x0016, 0x0026, 0x0036, ++ 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, 0xa425, ++ 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0005, 0x00f6, 0x00e6, ++ 0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6, 0x0126, 0x2091, 0x8000, ++ 0x2740, 0x2061, 0x1cd0, 0x2079, 0x0001, 0x8fff, 0x0904, 0xc8d0, ++ 0x2071, 0x1800, 0x764c, 0x706c, 0x8001, 0x9602, 0x1a04, 0xc8d0, ++ 0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590, 0x2078, 0x080c, 0xc9f1, ++ 0x0570, 0x2400, 0x9c06, 0x0558, 0x6720, 0x9786, 0x0006, 0x1538, ++ 0x9786, 0x0007, 0x0520, 0x88ff, 0x1140, 0x6010, 0x9b06, 0x11f8, ++ 0x85ff, 0x0118, 0x6054, 0x9106, 0x11d0, 0x0096, 0x601c, 0xd084, ++ 0x0140, 0x080c, 0xcc1f, 0x080c, 0xb76f, 0x080c, 0x17b0, 0x6023, ++ 0x0007, 0x6014, 0x2048, 0x080c, 0xb0ad, 0x0120, 0x0046, 0x080c, ++ 0xc970, 0x004e, 0x009e, 0x080c, 0x9584, 0x88ff, 0x1198, 0x9ce0, ++ 0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, 0x1210, 0x0804, 0xc885, ++ 0x9006, 0x012e, 0x00be, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, ++ 0x00fe, 0x0005, 0x98c5, 0x0001, 0x0ca0, 0x00b6, 0x0076, 0x0056, ++ 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6210, ++ 0x2258, 0x0096, 0x904e, 0x080c, 0x8ef6, 0x009e, 0x008e, 0x903e, ++ 0x080c, 0x8f9a, 0x080c, 0xc876, 0x005e, 0x007e, 0x00be, 0x0005, ++ 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, ++ 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x5c0d, 0x1190, ++ 0x0056, 0x0086, 0x9046, 0x2508, 0x2029, 0x0001, 0x0096, 0x904e, ++ 0x080c, 0x8ef6, 0x009e, 0x008e, 0x903e, 0x080c, 0x8f9a, 0x080c, ++ 0xc876, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xc903, 0x015e, ++ 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005, 0x00b6, 0x0076, ++ 0x0056, 0x6210, 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019, ++ 0x0048, 0x0096, 0x904e, 0x080c, 0x8ef6, 0x009e, 0x008e, 0x903e, ++ 0x080c, 0x8f9a, 0x2c20, 0x080c, 0xc876, 0x005e, 0x007e, 0x00be, ++ 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, ++ 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x5c0d, 0x11a0, ++ 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xcc03, ++ 0x004e, 0x0096, 0x904e, 0x080c, 0x8ef6, 0x009e, 0x008e, 0x903e, ++ 0x080c, 0x8f9a, 0x080c, 0xc876, 0x003e, 0x001e, 0x8108, 0x1f04, ++ 0xc94b, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005, ++ 0x0016, 0x00f6, 0x080c, 0xb0ab, 0x0198, 0xa864, 0x9084, 0x00ff, ++ 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, 0xa803, 0x0000, ++ 0xab82, 0x080c, 0x61a9, 0x2f48, 0x0cb0, 0xab82, 0x080c, 0x61a9, ++ 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, 0xa803, 0x0000, ++ 0x080c, 0x61a9, 0x2f48, 0x0cb8, 0x080c, 0x61a9, 0x0c88, 0x00e6, ++ 0x0046, 0x0036, 0x2061, 0x1cd0, 0x9005, 0x1138, 0x2071, 0x1800, ++ 0x744c, 0x706c, 0x8001, 0x9402, 0x12d8, 0x2100, 0x9c06, 0x0168, ++ 0x6000, 0x9086, 0x0000, 0x0148, 0x6008, 0x9206, 0x1130, 0x6010, ++ 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, 0x0018, 0x2001, ++ 0x1818, 0x2004, 0x9c02, 0x1220, 0x0c40, 0x9085, 0x0001, 0x0008, ++ 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x0096, 0x0006, 0x080c, ++ 0x0fae, 0x000e, 0x090c, 0x0d84, 0xa867, 0x010d, 0xa88e, 0x0026, ++ 0x2010, 0x080c, 0xb09b, 0x2001, 0x0000, 0x0120, 0x2200, 0x9080, ++ 0x0015, 0x2004, 0x002e, 0xa87a, 0xa986, 0xac76, 0xa87f, 0x0000, ++ 0x2001, 0x195b, 0x2004, 0xa882, 0x9006, 0xa8e2, 0xa802, 0xa86a, ++ 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, 0x61a9, 0x012e, 0x009e, ++ 0x0005, 0x6700, 0x9786, 0x0000, 0x0158, 0x9786, 0x0001, 0x0140, ++ 0x9786, 0x000a, 0x0128, 0x9786, 0x0009, 0x0110, 0x9085, 0x0001, ++ 0x0005, 0x00e6, 0x6010, 0x9075, 0x0138, 0x00b6, 0x2058, 0xb8a0, ++ 0x00be, 0x9206, 0x00ee, 0x0005, 0x9085, 0x0001, 0x0cd8, 0x0016, ++ 0x6004, 0x908e, 0x001e, 0x11a0, 0x8007, 0x6134, 0x918c, 0x00ff, ++ 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0005, ++ 0x2001, 0x1954, 0x2004, 0x601a, 0x080c, 0x7bcb, 0x080c, 0x8125, ++ 0x001e, 0x0005, 0xa001, 0xa001, 0x0005, 0x6024, 0xd0e4, 0x0158, ++ 0xd0cc, 0x0118, 0x080c, 0xb3ae, 0x0030, 0x080c, 0xcc1f, 0x080c, ++ 0x79df, 0x080c, 0x9554, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, ++ 0x000f, 0x0002, 0xca50, 0xca50, 0xca50, 0xca52, 0xca50, 0xca52, ++ 0xca52, 0xca50, 0xca52, 0xca50, 0xca50, 0xca50, 0xca50, 0xca50, ++ 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x9280, 0x0008, 0x2004, ++ 0x9084, 0x000f, 0x0002, 0xca69, 0xca69, 0xca69, 0xca69, 0xca69, ++ 0xca69, 0xca76, 0xca69, 0xca69, 0xca69, 0xca69, 0xca69, 0xca69, ++ 0xca69, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, ++ 0x0001, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x0005, 0x0096, 0x00c6, ++ 0x2260, 0x080c, 0xcc1f, 0x6043, 0x0000, 0x6024, 0xc0f4, 0xc0e4, ++ 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, 0x2268, 0x9186, 0x0007, ++ 0x1904, 0xcad0, 0x6814, 0x9005, 0x0138, 0x2048, 0xa87c, 0xd0fc, ++ 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007, 0x003a, 0x6003, 0x0001, ++ 0x080c, 0x7bcb, 0x080c, 0x8125, 0x00c6, 0x2d60, 0x6100, 0x9186, ++ 0x0002, 0x1904, 0xcb48, 0x6014, 0x9005, 0x1138, 0x6000, 0x9086, ++ 0x0007, 0x190c, 0x0d84, 0x0804, 0xcb48, 0x2048, 0x080c, 0xb0ad, ++ 0x1130, 0x0028, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, 0x2048, ++ 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x1170, 0xa87c, 0xc0dc, ++ 0xc0f4, 0xa87e, 0xa880, 0xc0f4, 0xc0fc, 0xa882, 0x2009, 0x0043, ++ 0x080c, 0xc3ee, 0x0804, 0xcb48, 0x2009, 0x0041, 0x0804, 0xcb42, ++ 0x9186, 0x0005, 0x15a8, 0x6814, 0x2048, 0xa87c, 0xd0bc, 0x1120, ++ 0x00de, 0x009e, 0x0804, 0xca69, 0xd0b4, 0x0128, 0xd0fc, 0x090c, ++ 0x0d84, 0x0804, 0xca8a, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, ++ 0x7bcb, 0x080c, 0x8125, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, ++ 0x0120, 0x9186, 0x0004, 0x1904, 0xcb48, 0x6814, 0x2048, 0xa97c, ++ 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1f4, 0xc1fc, 0xc1bc, 0xa982, ++ 0x00f6, 0x2c78, 0x080c, 0x150d, 0x00fe, 0x2009, 0x0042, 0x04d0, ++ 0x0036, 0x080c, 0x0fae, 0x090c, 0x0d84, 0xa867, 0x010d, 0x9006, ++ 0xa802, 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, 0x0045, 0x2c00, ++ 0xa892, 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, 0x6026, 0x6010, ++ 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x2004, 0x6354, 0xab7a, 0xa876, ++ 0x9006, 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001, 0x080c, ++ 0x61a9, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xc58e, 0x2d00, ++ 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a, 0x6342, ++ 0x003e, 0x0038, 0x6043, 0x0000, 0x6003, 0x0007, 0x080c, 0xc3ee, ++ 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, ++ 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178, 0x080c, ++ 0x8026, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, 0x080c, ++ 0xc970, 0x009e, 0x003e, 0x080c, 0x8125, 0x0005, 0x9186, 0x0014, ++ 0x0d70, 0x080c, 0x95e9, 0x0005, 0xcb7b, 0xcb79, 0xcb79, 0xcb79, ++ 0xcb79, 0xcb79, 0xcb7b, 0xcb79, 0xcb79, 0xcb79, 0xcb79, 0xcb79, ++ 0xcb79, 0x080c, 0x0d84, 0x080c, 0x8026, 0x6003, 0x000c, 0x080c, ++ 0x8125, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, ++ 0x001a, 0x080c, 0x95e9, 0x0005, 0xcb99, 0xcb99, 0xcb99, 0xcb99, ++ 0xcb9b, 0xcbbb, 0xcb99, 0xcb99, 0xcb99, 0xcb99, 0xcb99, 0xcb99, ++ 0xcb99, 0x080c, 0x0d84, 0x00d6, 0x2c68, 0x080c, 0x94fe, 0x01b0, ++ 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c, 0x613a, ++ 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910, 0x6112, ++ 0x6023, 0x0004, 0x080c, 0x7bcb, 0x080c, 0x8125, 0x2d60, 0x080c, ++ 0x9554, 0x00de, 0x0005, 0x080c, 0x9554, 0x0005, 0x00e6, 0x6010, ++ 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005, 0x2009, ++ 0x1872, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024, 0xc0e5, ++ 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1955, 0x2004, 0x6042, 0x2009, ++ 0x1872, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1872, 0x210c, ++ 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001, ++ 0x1955, 0x200c, 0x2001, 0x1953, 0x2004, 0x9100, 0x9080, 0x000a, ++ 0x6042, 0x6010, 0x00b6, 0x2058, 0xb8ac, 0x00be, 0x0008, 0x2104, ++ 0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000, ++ 0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6154, 0xb8ac, ++ 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x6054, 0x9106, 0x1138, ++ 0x600c, 0x2072, 0x080c, 0x79df, 0x080c, 0x9554, 0x0010, 0x9cf0, ++ 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6, ++ 0x00b6, 0x6010, 0x2058, 0xb8ac, 0x2068, 0x9005, 0x0130, 0x9c06, ++ 0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e, 0x00be, 0x00de, 0x0005, ++ 0x0026, 0x0036, 0x0156, 0x2011, 0x182a, 0x2204, 0x9084, 0x00ff, ++ 0x2019, 0x026e, 0x2334, 0x9636, 0x1508, 0x8318, 0x2334, 0x2204, ++ 0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, 0x0270, 0x20a9, 0x0004, ++ 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xa439, 0x009e, ++ 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, ++ 0x2019, 0x0006, 0x080c, 0xa439, 0x009e, 0x1100, 0x015e, 0x003e, ++ 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5677, 0x080c, ++ 0x2b1e, 0x00ee, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, ++ 0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, 0xa880, 0xc0e5, ++ 0xa882, 0x0005, 0x00e6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, ++ 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029, 0x19bd, 0x252c, ++ 0x2021, 0x19c3, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x764c, ++ 0x706c, 0x9606, 0x0578, 0x6720, 0x9786, 0x0001, 0x0118, 0x9786, ++ 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400, 0x9c06, 0x01d0, ++ 0x080c, 0xc9f1, 0x01b8, 0x080c, 0xca01, 0x11a0, 0x6000, 0x9086, ++ 0x0004, 0x1120, 0x0016, 0x080c, 0x17b0, 0x001e, 0x080c, 0xb284, ++ 0x1110, 0x080c, 0x2d3f, 0x080c, 0xb295, 0x1110, 0x080c, 0x9e99, ++ 0x080c, 0x9584, 0x9ce0, 0x0018, 0x2001, 0x1818, 0x2004, 0x9c02, ++ 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, ++ 0x007e, 0x00ce, 0x00ee, 0x0005, 0x2001, 0x180f, 0x2004, 0xd0dc, ++ 0x0005, 0x0006, 0x2001, 0x1836, 0x2004, 0xd09c, 0x000e, 0x0005, ++ 0x6004, 0x9086, 0x0001, 0x1128, 0x080c, 0x905b, 0x080c, 0x9584, ++ 0x9006, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, ++ 0x2071, 0x1840, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, 0xd5b4, ++ 0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0178, 0x2500, 0x9084, ++ 0x0007, 0x908e, 0x0003, 0x0148, 0x908e, 0x0004, 0x0130, 0x908e, ++ 0x0005, 0x0118, 0x2071, 0x184a, 0x0089, 0x001e, 0x00ee, 0x000e, ++ 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, ++ 0x1842, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e04, 0x8000, ++ 0x2072, 0x1220, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x0005, 0x00e6, ++ 0x2071, 0x1840, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1844, ++ 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, ++ 0x2071, 0x1840, 0x7044, 0x8000, 0x7046, 0x00ee, 0x000e, 0x012e, ++ 0x0005, 0x0002, 0x0003, 0x03d6, 0x0000, 0x8064, 0x0008, 0x0010, ++ 0x0000, 0x8066, 0x0000, 0x0101, 0x0008, 0x4406, 0x000b, 0x8060, ++ 0x0000, 0x0400, 0x0000, 0x580c, 0x0003, 0x7934, 0x000b, 0x5090, ++ 0x000b, 0x4c09, 0x0003, 0xbac0, 0x0009, 0x0082, 0x0008, 0x0c09, ++ 0x000b, 0x15fe, 0x0008, 0x3409, 0x0003, 0x808c, 0x0008, 0x0001, ++ 0x0000, 0x0000, 0x0007, 0x4047, 0x000a, 0x808c, 0x0008, 0x0002, ++ 0x0000, 0x081b, 0x0003, 0x4022, 0x0000, 0x001c, 0x0003, 0x4122, ++ 0x0008, 0x4447, 0x0002, 0x0de7, 0x0003, 0x0bfe, 0x0008, 0x11a0, ++ 0x0001, 0x11c9, 0x000b, 0x0ca0, 0x0001, 0x11c9, 0x000b, 0x9180, ++ 0x0001, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, ++ 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x442a, 0x0003, 0x808c, ++ 0x0008, 0x0000, 0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x0004, ++ 0x0000, 0x8066, 0x0000, 0x0411, 0x0000, 0x4432, 0x0003, 0x03fe, ++ 0x0000, 0x43e0, 0x0001, 0x0dc6, 0x0003, 0xc2c0, 0x0009, 0x00ff, ++ 0x0008, 0x02e0, 0x0001, 0x0dc6, 0x0003, 0x9180, 0x0001, 0x0005, ++ 0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, ++ 0x0000, 0x0019, 0x0000, 0x4441, 0x000b, 0x0240, 0x0002, 0x09c3, ++ 0x000b, 0x00fe, 0x0000, 0x31c6, 0x0003, 0x112a, 0x0000, 0x002e, ++ 0x0008, 0x022c, 0x0008, 0x3a44, 0x0002, 0x0c09, 0x000b, 0x808c, ++ 0x0008, 0x0002, 0x0000, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, ++ 0x0008, 0x8066, 0x0000, 0x0011, 0x0008, 0x4452, 0x0003, 0x01fe, ++ 0x0008, 0x42e0, 0x0009, 0x0db9, 0x000b, 0x00fe, 0x0000, 0x43e0, ++ 0x0001, 0x0db9, 0x000b, 0x1734, 0x0000, 0x1530, 0x0000, 0x1632, ++ 0x0008, 0x0d2a, 0x0008, 0x9880, 0x0001, 0x0010, 0x0000, 0x8060, ++ 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x1e0a, ++ 0x0008, 0x4464, 0x0003, 0x808a, 0x0008, 0x0003, 0x0008, 0x1a60, ++ 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x586a, 0x0003, 0x8066, ++ 0x0000, 0x3679, 0x0000, 0x446d, 0x0003, 0x586e, 0x000b, 0x8054, ++ 0x0008, 0x0011, 0x0008, 0x8074, 0x0000, 0x1010, 0x0008, 0x1efe, ++ 0x0000, 0x3009, 0x000b, 0x0077, 0x0004, 0x0009, 0x000b, 0x1c60, ++ 0x0000, 0x1b62, 0x0000, 0x8066, 0x0000, 0x0231, 0x0008, 0x447b, ++ 0x000b, 0x587c, 0x000b, 0x0140, 0x0008, 0x0242, 0x0000, 0x1f43, ++ 0x0002, 0x0c86, 0x0003, 0x0d44, 0x0000, 0x0d46, 0x0008, 0x0348, ++ 0x0008, 0x044a, 0x0008, 0x008a, 0x0003, 0x0344, 0x0008, 0x0446, ++ 0x0008, 0x0548, 0x0008, 0x064a, 0x0000, 0x588a, 0x000b, 0x8054, ++ 0x0008, 0x0001, 0x0000, 0x8074, 0x0000, 0x2020, 0x0008, 0x4000, ++ 0x000f, 0x3a40, 0x000a, 0x0c0c, 0x000b, 0x2b24, 0x0008, 0x2b24, ++ 0x0008, 0x5894, 0x000b, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242, ++ 0x0002, 0x08d8, 0x0003, 0x3a45, 0x000a, 0x08c9, 0x0003, 0x1e10, ++ 0x000a, 0x7f3c, 0x0000, 0x08c6, 0x0003, 0x1d00, 0x0002, 0x7f3a, ++ 0x0000, 0x0d60, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, ++ 0x0008, 0x44a4, 0x0003, 0x00fe, 0x0000, 0x34c3, 0x0003, 0x1c60, ++ 0x0000, 0x8062, 0x0008, 0x0001, 0x0000, 0x8066, 0x0000, 0x0009, ++ 0x0008, 0x44ac, 0x000b, 0x00fe, 0x0000, 0x31a2, 0x000b, 0x0038, ++ 0x0000, 0x0060, 0x0008, 0x8062, 0x0008, 0x0019, 0x0000, 0x8066, ++ 0x0000, 0x0009, 0x0008, 0x44b5, 0x0003, 0x80c0, 0x0009, 0x00ff, ++ 0x0008, 0x7f3e, 0x0008, 0x0d60, 0x0000, 0x0efe, 0x0008, 0x1f80, ++ 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x44bf, ++ 0x0003, 0x003a, 0x0008, 0x1dfe, 0x0000, 0x00a0, 0x000b, 0x0036, ++ 0x0008, 0x0077, 0x0004, 0x00d8, 0x000b, 0x8074, 0x0000, 0x2000, ++ 0x0000, 0x00d8, 0x000b, 0x3a44, 0x0002, 0x09cc, 0x000b, 0x8074, ++ 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, 0x2d0e, 0x0000, 0x35a2, ++ 0x0003, 0x26fe, 0x0008, 0x26fe, 0x0008, 0x2700, 0x0008, 0x2700, ++ 0x0008, 0x00d0, 0x0009, 0x0ce6, 0x0003, 0x8074, 0x0000, 0x4040, ++ 0x0008, 0x58d8, 0x0003, 0x5090, 0x000b, 0x3a46, 0x000a, 0x0ce6, ++ 0x0003, 0x3a47, 0x0002, 0x08e3, 0x000b, 0x8054, 0x0008, 0x0004, ++ 0x0000, 0x8074, 0x0000, 0x8000, 0x0000, 0x0127, 0x0003, 0x92c0, ++ 0x0009, 0x0f88, 0x0008, 0x0809, 0x0003, 0x1a60, 0x0000, 0x8062, ++ 0x0008, 0x0002, 0x0000, 0x8066, 0x0000, 0x362a, 0x0000, 0x44eb, ++ 0x000b, 0x2000, 0x0000, 0x2000, 0x0000, 0x2102, 0x0000, 0x2102, ++ 0x0000, 0x2204, 0x0000, 0x2204, 0x0000, 0x2306, 0x0000, 0x2306, ++ 0x0000, 0x2408, 0x0000, 0x2408, 0x0000, 0x250a, 0x0000, 0x250a, ++ 0x0000, 0x260c, 0x0000, 0x260c, 0x0000, 0x270e, 0x0000, 0x270e, ++ 0x0000, 0x2810, 0x0000, 0x2810, 0x0000, 0x2912, 0x0000, 0x2912, ++ 0x0000, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007, 0x0000, 0x8066, ++ 0x0000, 0x0052, 0x0000, 0x4505, 0x0003, 0x92c0, 0x0009, 0x0780, ++ 0x0008, 0x0db3, 0x000b, 0x124b, 0x0002, 0x090e, 0x0003, 0x2e4d, ++ 0x0002, 0x2e4d, 0x0002, 0x09a2, 0x0003, 0x3a46, 0x000a, 0x0d1b, ++ 0x0003, 0x5910, 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, 0x1243, ++ 0x000a, 0x0925, 0x0003, 0x8010, 0x0008, 0x000d, 0x0000, 0x0193, ++ 0x000c, 0x1810, 0x0000, 0x0193, 0x000c, 0x0125, 0x000b, 0x194d, ++ 0x000a, 0x091f, 0x0003, 0x1243, 0x000a, 0x09a9, 0x000b, 0x591f, ++ 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, 0x0188, 0x000c, 0x1810, ++ 0x0000, 0x0193, 0x000c, 0x8074, 0x0000, 0xf000, 0x0008, 0x3a42, ++ 0x0002, 0x0d2d, 0x0003, 0x15fe, 0x0008, 0x344b, 0x0003, 0x0d30, ++ 0x0000, 0x0009, 0x000b, 0x0d30, 0x0000, 0x8074, 0x0000, 0x0501, ++ 0x0000, 0x8010, 0x0008, 0x000c, 0x0008, 0x0193, 0x000c, 0x0009, ++ 0x000b, 0xbbe0, 0x0009, 0x0030, 0x0008, 0x0d44, 0x0003, 0x18fe, ++ 0x0000, 0x3ce0, 0x0009, 0x0941, 0x000b, 0x15fe, 0x0008, 0x3ce0, ++ 0x0009, 0x0941, 0x000b, 0x0183, 0x0004, 0x8076, 0x0008, 0x0040, ++ 0x0000, 0x0180, 0x000b, 0x8076, 0x0008, 0x0041, 0x0008, 0x0180, ++ 0x000b, 0xbbe0, 0x0009, 0x0032, 0x0000, 0x0d49, 0x000b, 0x3c1e, ++ 0x0008, 0x0180, 0x000b, 0xbbe0, 0x0009, 0x0037, 0x0000, 0x0d65, ++ 0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0d41, 0x0003, 0x1a60, ++ 0x0000, 0x8062, 0x0008, 0x000d, 0x0000, 0x2604, 0x0008, 0x2604, ++ 0x0008, 0x2706, 0x0008, 0x2706, 0x0008, 0x2808, 0x0000, 0x2808, ++ 0x0000, 0x290a, 0x0000, 0x290a, 0x0000, 0x8066, 0x0000, 0x0422, ++ 0x0000, 0x455c, 0x0003, 0x0188, 0x000c, 0x8054, 0x0008, 0x0004, ++ 0x0000, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072, 0x0000, 0x8000, ++ 0x0000, 0x0127, 0x0003, 0xbbe0, 0x0009, 0x0038, 0x0000, 0x0d77, ++ 0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0974, 0x000b, 0x15fe, ++ 0x0008, 0x3ce0, 0x0009, 0x0d3d, 0x000b, 0x0183, 0x0004, 0x8076, ++ 0x0008, 0x0040, 0x0000, 0x8072, 0x0000, 0x8000, 0x0000, 0x01c3, ++ 0x0003, 0x8076, 0x0008, 0x0042, 0x0008, 0x0180, 0x000b, 0xbbe0, ++ 0x0009, 0x0016, 0x0000, 0x0d80, 0x000b, 0x3a44, 0x0002, 0x0c0b, ++ 0x0003, 0x8072, 0x0000, 0x8000, 0x0000, 0x8000, 0x000f, 0x0009, ++ 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x0009, 0x000b, 0x3d30, ++ 0x000a, 0x7f00, 0x0000, 0xbc80, 0x0001, 0x0007, 0x0000, 0x018c, ++ 0x000b, 0x1930, 0x000a, 0x7f00, 0x0000, 0x9880, 0x0001, 0x0007, ++ 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, ++ 0x0000, 0x000a, 0x0008, 0x4591, 0x000b, 0x4000, 0x000f, 0x2193, ++ 0x000b, 0x0870, 0x0008, 0x4000, 0x000f, 0xbac0, 0x0009, 0x0090, ++ 0x0008, 0x099c, 0x000b, 0x8074, 0x0000, 0x0706, 0x0000, 0x019e, ++ 0x000b, 0x8074, 0x0000, 0x0703, 0x0000, 0x4000, 0x000f, 0x8010, ++ 0x0008, 0x0008, 0x0000, 0x01d1, 0x0003, 0x0188, 0x000c, 0x8010, ++ 0x0008, 0x0007, 0x0000, 0x0193, 0x000c, 0x1810, 0x0000, 0x0193, ++ 0x000c, 0x01db, 0x0003, 0x0188, 0x000c, 0x8010, 0x0008, 0x001b, ++ 0x0008, 0x0193, 0x000c, 0x1810, 0x0000, 0x0193, 0x000c, 0x8074, ++ 0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, 0x0009, 0x000b, 0x8010, ++ 0x0008, 0x0009, 0x0008, 0x01d1, 0x0003, 0x8010, 0x0008, 0x0005, ++ 0x0008, 0x01d1, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x8010, ++ 0x0008, 0x0004, 0x0000, 0x4143, 0x000a, 0x0859, 0x0003, 0x3a44, ++ 0x0002, 0x0c09, 0x000b, 0x0d2a, 0x0008, 0x01d1, 0x0003, 0x8010, ++ 0x0008, 0x0003, 0x0008, 0x01d3, 0x000b, 0x8010, 0x0008, 0x000b, ++ 0x0000, 0x01d3, 0x000b, 0x8010, 0x0008, 0x0002, 0x0000, 0x01d3, ++ 0x000b, 0x3a47, 0x0002, 0x0cd8, 0x000b, 0x8010, 0x0008, 0x0006, ++ 0x0008, 0x01d3, 0x000b, 0x8074, 0x0000, 0xf000, 0x0008, 0x0193, ++ 0x000c, 0x0196, 0x000c, 0x3a40, 0x000a, 0x0809, 0x0003, 0x8010, ++ 0x0008, 0x000c, 0x0008, 0x0193, 0x000c, 0x0009, 0x000b, 0x8074, ++ 0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, 0x2e4d, 0x0002, 0x2e4d, ++ 0x0002, 0x09e4, 0x000b, 0x8054, 0x0008, 0x0019, 0x0000, 0x0009, ++ 0x000b, 0x8054, 0x0008, 0x0009, 0x0008, 0x0009, 0x000b, 0x3a44, ++ 0x0002, 0x0c09, 0x000b, 0x01c6, 0x0003, 0xc993, 0xf609, 0x0001, ++ 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, ++ 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0xd29e ++}; ++#ifdef UNIQUE_FW_NAME ++unsigned short fw2300tpx_length01 = 0xc920; ++#else ++unsigned short risc_code_length01 = 0xc920; ++#endif ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_cfg.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,2780 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++/* ++ * QLogic ISP2x00 Multi-path LUN Support Driver ++ * ++ */ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++#include "qlfo.h" ++ ++/* ++ * Local Function Prototypes. ++ */ ++ ++static uint32_t qla2x00_add_portname_to_mp_dev(mp_device_t *, uint8_t *); ++ ++static mp_device_t * qla2x00_allocate_mp_dev(uint8_t *, uint8_t *); ++static mp_path_t * qla2x00_allocate_path(mp_host_t *, uint16_t, fc_port_t *, ++ uint16_t); ++static mp_path_list_t * qla2x00_allocate_path_list(void); ++ ++static mp_host_t * qla2x00_find_host_by_name(uint8_t *); ++ ++static mp_device_t * qla2x00_find_or_allocate_mp_dev (mp_host_t *, uint16_t, ++ fc_port_t *); ++static mp_path_t * qla2x00_find_or_allocate_path(mp_host_t *, mp_device_t *, ++ uint16_t, fc_port_t *); ++ ++static uint32_t qla2x00_cfg_register_failover_lun(mp_device_t *,srb_t *, ++ fc_lun_t *); ++static uint32_t qla2x00_send_failover_notify(mp_device_t *, uint8_t, ++ mp_path_t *, mp_path_t *); ++static mp_path_t * qla2x00_select_next_path(mp_host_t *, mp_device_t *, ++ uint8_t); ++ ++static uint8_t qla2x00_update_mp_host(mp_host_t *); ++static uint32_t qla2x00_update_mp_tree (void); ++ ++static fc_lun_t *qla2x00_find_matching_lun(uint8_t , mp_path_t *); ++static mp_path_t *qla2x00_find_path_by_id(mp_device_t *, uint8_t); ++static mp_device_t *qla2x00_find_mp_dev_by_id(mp_host_t *, uint8_t); ++static mp_device_t *qla2x00_find_mp_dev_by_name(mp_host_t *, uint8_t *); ++ ++static mp_path_t *qla2x00_get_visible_path(mp_device_t *dp); ++static void qla2x00_map_os_targets(mp_host_t *); ++static void qla2x00_map_os_luns(mp_host_t *, mp_device_t *, uint16_t); ++static uint8_t qla2x00_map_a_oslun(mp_host_t *, mp_device_t *, uint16_t, uint16_t); ++ ++static uint8_t qla2x00_is_ww_name_zero(uint8_t *); ++static void qla2x00_add_path(mp_path_list_t *, mp_path_t *); ++static void qla2x00_failback_single_lun(mp_device_t *, uint8_t, uint8_t); ++static void qla2x00_failback_luns(mp_host_t *); ++static void qla2x00_setup_new_path(mp_device_t *, mp_path_t *); ++ ++/* ++ * Global data items ++ */ ++mp_host_t *mp_hosts_base = NULL; ++uint8_t mp_config_required = FALSE; ++static int mp_num_hosts = 0; ++static uint8_t mp_initialized = FALSE; ++ ++ ++/* ++ * ENTRY ROUTINES ++ */ ++ ++/* ++ * qla2x00_cfg_init ++ * Initialize configuration structures to handle an instance of ++ * an HBA, QLA2x000 card. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_cfg_init(scsi_qla_host_t *ha) ++{ ++ int rval; ++ ++ ENTER("qla2x00_cfg_init"); ++ set_bit(CFG_ACTIVE, &ha->cfg_flags); ++ if (!mp_initialized) { ++ /* First HBA, initialize the failover global properties */ ++ qla2x00_fo_init_params(ha); ++ ++ /* If the user specified a device configuration then ++ * it is use as the configuration. Otherwise, we wait ++ * for path discovery. ++ */ ++ if ( mp_config_required ) ++ qla2x00_cfg_build_path_tree(ha); ++ } ++ rval = qla2x00_cfg_path_discovery(ha); ++ clear_bit(CFG_ACTIVE, &ha->cfg_flags); ++ LEAVE("qla2x00_cfg_init"); ++ return rval; ++} ++ ++/* ++ * qla2x00_cfg_path_discovery ++ * Discover the path configuration from the device configuration ++ * for the specified host adapter and build the path search tree. ++ * This function is called after the lower level driver has ++ * completed its port and lun discovery. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_cfg_path_discovery(scsi_qla_host_t *ha) ++{ ++ int rval = QLA2X00_SUCCESS; ++ mp_host_t *host; ++ uint8_t *name; ++ ++ ENTER("qla2x00_cfg_path_discovery"); ++ ++ name = &ha->init_cb->node_name[0]; ++ ++ set_bit(CFG_ACTIVE, &ha->cfg_flags); ++ /* Initialize the path tree for this adapter */ ++ host = qla2x00_find_host_by_name(name); ++ if ( mp_config_required ) { ++ if (host == NULL ) { ++ DEBUG4(printk("cfg_path_discovery: host not found, " ++ "node name = " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ name[0], name[1], name[2], name[3], ++ name[4], name[5], name[6], name[7]);) ++ rval = QLA2X00_FUNCTION_FAILED; ++ } else if (ha->instance != host->instance) { ++ DEBUG4(printk("cfg_path_discovery: host instance " ++ "don't match - instance=%ld.\n", ++ ha->instance);) ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ } else if ( host == NULL ) { ++ /* New host adapter so allocate it */ ++ if ( (host = qla2x00_alloc_host(ha)) == NULL ) { ++ printk(KERN_INFO ++ "qla2x00(%d): Couldn't allocate " ++ "host - ha = %p.\n", ++ (int)ha->instance, ha); ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ } ++ ++ /* Fill in information about host */ ++ if (host != NULL ) { ++ host->flags |= MP_HOST_FLAG_NEEDS_UPDATE; ++ host->flags |= MP_HOST_FLAG_LUN_FO_ENABLED; ++ host->fcports = &ha->fcports; ++ ++ /* Check if multipath is enabled */ ++ if (!qla2x00_update_mp_host(host)) { ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ host->flags &= ~MP_HOST_FLAG_LUN_FO_ENABLED; ++ } ++ ++ if (rval != QLA2X00_SUCCESS) { ++ /* EMPTY */ ++ DEBUG4(printk("qla2x00_path_discovery: Exiting FAILED\n");) ++ } else { ++ LEAVE("qla2x00_cfg_path_discovery"); ++ } ++ clear_bit(CFG_ACTIVE, &ha->cfg_flags); ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_cfg_event_notifiy ++ * Callback for host driver to notify us of configuration changes. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * i_type = event type ++ * ++ * Returns: ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_cfg_event_notify(scsi_qla_host_t *ha, uint32_t i_type) ++{ ++ mp_host_t *host; /* host adapter pointer */ ++ ++ ENTER("qla2x00_cfg_event_notify"); ++ ++ set_bit(CFG_ACTIVE, &ha->cfg_flags); ++ switch (i_type) { ++ case MP_NOTIFY_RESET_DETECTED: ++ DEBUG(printk("scsi%ld: MP_NOTIFY_RESET_DETECTED " ++ "- no action\n", ++ ha->host_no);) ++ break; ++ case MP_NOTIFY_PWR_LOSS: ++ DEBUG(printk("scsi%ld: MP_NOTIFY_PWR_LOSS - " ++ "update tree\n", ++ ha->host_no);) ++ /* ++ * Update our path tree in case we are ++ * losing the adapter ++ */ ++ qla2x00_update_mp_tree(); ++ /* Free our resources for adapter */ ++ break; ++ case MP_NOTIFY_LOOP_UP: ++ DEBUG(printk("scsi%ld: MP_NOTIFY_LOOP_UP - " ++ "update host tree\n", ++ ha->host_no);) ++ /* Adapter is back up with new configuration */ ++ if ((host = qla2x00_cfg_find_host(ha)) != NULL) { ++ host->flags |= MP_HOST_FLAG_NEEDS_UPDATE; ++ host->fcports = &ha->fcports; ++ qla2x00_update_mp_tree(); ++ } ++ break; ++ case MP_NOTIFY_LOOP_DOWN: ++ case MP_NOTIFY_BUS_RESET: ++ DEBUG(printk("scsi%ld: MP_NOTIFY_OTHERS - " ++ "no action\n", ++ ha->host_no);) ++ break; ++ default: ++ break; ++ ++ } ++ clear_bit(CFG_ACTIVE, &ha->cfg_flags); ++ ++ LEAVE("qla2x00_cfg_event_notify"); ++ ++ return QLA2X00_SUCCESS; ++} ++ ++/* ++ * qla2x00_cfg_failover ++ * A problem has been detected with the current path for this ++ * lun. Select the next available path as the current path ++ * for this device. ++ * ++ * Inputs: ++ * ha = pointer to host adapter ++ * fp - pointer to failed fc_lun (failback lun) ++ * tgt - pointer to target ++ * ++ * Returns: ++ * pointer to new fc_lun_t, or NULL if failover fails. ++ */ ++fc_lun_t * ++qla2x00_cfg_failover(scsi_qla_host_t *ha, fc_lun_t *fp, ++ os_tgt_t *tgt, srb_t *sp) ++{ ++ mp_host_t *host; /* host adapter pointer */ ++ mp_device_t *dp; /* virtual device pointer */ ++ mp_path_t *new_path; /* new path pointer */ ++ fc_lun_t *new_fp = NULL; ++ ++ ENTER("qla2x00_cfg_failover"); ++ set_bit(CFG_ACTIVE, &ha->cfg_flags); ++ if ((host = qla2x00_cfg_find_host(ha)) != NULL) { ++ if ((dp = qla2x00_find_mp_dev_by_name( ++ host, tgt->node_name)) != NULL ) { ++ ++ DEBUG3(printk("qla2x00_cfg_failover: dp = %p\n", dp);) ++ /* ++ * Point at the next path in the path list if there is ++ * one, and if it hasn't already been failed over by ++ * another I/O. If there is only one path continuer ++ * to point at it. ++ */ ++ new_path = qla2x00_select_next_path(host, dp, fp->lun); ++ DEBUG3(printk("cfg_failover: new path @ %p\n", ++ new_path);) ++ new_fp = qla2x00_find_matching_lun(fp->lun, new_path); ++ DEBUG3(printk("cfg_failover: new fp lun @ %p\n", ++ new_fp);) ++ ++ qla2x00_cfg_register_failover_lun(dp, sp, new_fp); ++ } else { ++ printk(KERN_INFO ++ "qla2x00(%d): Couldn't find device " ++ "to failover\n", ++ host->instance); ++ } ++ } ++ clear_bit(CFG_ACTIVE, &ha->cfg_flags); ++ ++ LEAVE("qla2x00_cfg_failover"); ++ ++ return new_fp; ++} ++ ++/* ++ * IOCTL support ++ */ ++#define CFG_IOCTL ++#if defined(CFG_IOCTL) ++/* ++ * qla2x00_cfg_get_paths ++ * Get list of paths EXT_FO_GET_PATHS. ++ * ++ * Input: ++ * ha = pointer to adapter ++ * bp = pointer to buffer ++ * cmd = Pointer to kernel copy of EXT_IOCTL. ++ * ++ * Return; ++ * 0 on success or errno. ++ * driver ioctl errors are returned via cmd->Status. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_cfg_get_paths(EXT_IOCTL *cmd, FO_GET_PATHS *bp, int mode) ++{ ++ FO_PATHS_INFO *paths, *u_paths; ++ FO_PATH_ENTRY *entry; ++ EXT_DEST_ADDR *sap = &bp->HbaAddr; ++ mp_host_t *host = NULL; /* host adapter pointer */ ++ mp_device_t *dp; /* virtual device pointer */ ++ mp_path_t *path; /* path pointer */ ++ mp_path_list_t *path_list; /* path list pointer */ ++ int cnt; ++ int rval = 0; ++ scsi_qla_host_t *ha; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ u_paths = (FO_PATHS_INFO *) cmd->ResponseAdr; ++ ha = qla2x00_get_hba((int)bp->HbaInstance); ++ ++ if (!ha) { ++ DEBUG2_9_10(printk("%s: no ha matching inst %d.\n", ++ __func__, bp->HbaInstance);) ++ ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (rval); ++ } ++ ++ if (ha->flags.failover_enabled) ++ if ((host = qla2x00_cfg_find_host(ha)) == NULL) { ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ cmd->DetailStatus = EXT_DSTATUS_HBA_INST; ++ DEBUG4(printk("%s: cannot find target (%ld)\n", ++ __func__, ha->instance);) ++ DEBUG9_10(printk("%s: cannot find host inst(%ld).\n", ++ __func__, ha->instance);) ++ ++ return rval; ++ } ++ ++ paths = (FO_PATHS_INFO *)qla2x00_kmem_zalloc( ++ sizeof(FO_PATHS_INFO), GFP_ATOMIC, 20); ++ if (paths == NULL) { ++ DEBUG4(printk("%s: failed to allocate memory of size (%d)\n", ++ __func__, (int)sizeof(FO_PATHS_INFO));) ++ DEBUG9_10(printk("%s: failed allocate memory size(%d).\n", ++ __func__, (int)sizeof(FO_PATHS_INFO));) ++ ++ cmd->Status = EXT_STATUS_NO_MEMORY; ++ ++ return -ENOMEM; ++ } ++ ++ if (!ha->flags.failover_enabled) { ++ /* non-fo case. There's only one path. */ ++ ++ mp_path_list_t *ptmp_plist; ++#define STD_MAX_PATH_CNT 1 ++#define STD_VISIBLE_INDEX 0 ++ int found; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ ++ DEBUG9(printk("%s: non-fo case.\n", __func__);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_plist, ++ sizeof(mp_path_list_t))) { ++ /* not enough memory */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "lun_mask requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(mp_path_list_t));) ++ cmd->Status = EXT_STATUS_NO_MEMORY; ++ ++ return -ENOMEM; ++ } ++ ++ found = 0; ++ fcport = NULL; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (memcmp(fcport->node_name, sap->DestAddr.WWNN, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ found++; ++ break; ++ } ++ } ++ ++ if (found) { ++ DEBUG9(printk("%s: found fcport:" ++ "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.", ++ __func__, ++ sap->DestAddr.WWNN[0], ++ sap->DestAddr.WWNN[1], ++ sap->DestAddr.WWNN[2], ++ sap->DestAddr.WWNN[3], ++ sap->DestAddr.WWNN[4], ++ sap->DestAddr.WWNN[5], ++ sap->DestAddr.WWNN[6], ++ sap->DestAddr.WWNN[7]);) ++ ++ paths->HbaInstance = bp->HbaInstance; ++ paths->PathCount = STD_MAX_PATH_CNT; ++ paths->VisiblePathIndex = STD_VISIBLE_INDEX; ++ ++ /* Copy current path, which is the first one (0). */ ++ memcpy(paths->CurrentPathIndex, ptmp_plist->current_path, ++ sizeof(paths->CurrentPathIndex)); ++ ++ entry = &(paths->PathEntry[STD_VISIBLE_INDEX]); ++ ++ entry->Visible = TRUE; ++ entry->HbaInstance = bp->HbaInstance; ++ ++ memcpy(entry->PortName, fcport->port_name, ++ EXT_DEF_WWP_NAME_SIZE); ++ ++ rval = verify_area(VERIFY_WRITE, (void *)u_paths, ++ cmd->ResponseLen); ++ if (rval) { ++ /* error */ ++ DEBUG9_10(printk("%s: u_paths %p verify write" ++ " error. paths->PathCount=%d.\n", ++ __func__, u_paths, paths->PathCount);) ++ } ++ ++ /* Copy data to user */ ++ if (rval == 0) ++ rval = copy_to_user(&u_paths->PathCount, ++ &paths->PathCount, 4); ++ if (rval == 0) ++ rval = copy_to_user(&u_paths->CurrentPathIndex, ++ &paths->CurrentPathIndex, ++ sizeof(paths->CurrentPathIndex)); ++ if (rval == 0) ++ rval = copy_to_user(&u_paths->PathEntry, ++ &paths->PathEntry, ++ sizeof(paths->PathEntry)); ++ ++ if (rval) { /* if any of the above failed */ ++ DEBUG9_10(printk("%s: data copy failed.\n", ++ __func__);) ++ ++ cmd->Status = EXT_STATUS_COPY_ERR; ++ } ++ } else { ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ cmd->DetailStatus = EXT_DSTATUS_TARGET; ++ ++ DEBUG10(printk("%s: cannot find fcport " ++ "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.", ++ __func__, ++ sap->DestAddr.WWNN[0], ++ sap->DestAddr.WWNN[1], ++ sap->DestAddr.WWNN[2], ++ sap->DestAddr.WWNN[3], ++ sap->DestAddr.WWNN[4], ++ sap->DestAddr.WWNN[5], ++ sap->DestAddr.WWNN[6], ++ sap->DestAddr.WWNN[7]);) ++ DEBUG4(printk("%s: cannot find fcport " ++ "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.", ++ __func__, ++ sap->DestAddr.WWNN[0], ++ sap->DestAddr.WWNN[1], ++ sap->DestAddr.WWNN[2], ++ sap->DestAddr.WWNN[3], ++ sap->DestAddr.WWNN[4], ++ sap->DestAddr.WWNN[5], ++ sap->DestAddr.WWNN[6], ++ sap->DestAddr.WWNN[7]);) ++ } ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ /* end of non-fo case. */ ++ ++ } else if (sap->DestType != EXT_DEF_DESTTYPE_WWNN) { ++ /* Scan for mp_dev by nodename *ONLY* */ ++ ++ cmd->Status = EXT_STATUS_INVALID_PARAM; ++ cmd->DetailStatus = EXT_DSTATUS_TARGET; ++ ++ DEBUG4(printk("%s: target can be accessed by NodeName only.", ++ __func__);) ++ DEBUG10(printk("%s: target can be accessed by NodeName only. " ++ "got type %d.\n", ++ __func__, sap->DestType);) ++ ++ } else if ((dp = qla2x00_find_mp_dev_by_name(host, ++ sap->DestAddr.WWNN)) != NULL) { ++ DEBUG9(printk("%s: Found mp_dev:" ++ "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.", ++ __func__, ++ sap->DestAddr.WWNN[0], ++ sap->DestAddr.WWNN[1], ++ sap->DestAddr.WWNN[2], ++ sap->DestAddr.WWNN[3], ++ sap->DestAddr.WWNN[4], ++ sap->DestAddr.WWNN[5], ++ sap->DestAddr.WWNN[6], ++ sap->DestAddr.WWNN[7]);) ++ ++ path_list = dp->path_list; ++ ++ paths->HbaInstance = bp->HbaInstance; ++ paths->PathCount = path_list->path_cnt; ++ paths->VisiblePathIndex = path_list->visible; ++ ++ /* copy current paths */ ++ memcpy(paths->CurrentPathIndex, ++ path_list->current_path, ++ sizeof(paths->CurrentPathIndex)); ++ ++ path = path_list->last; ++ for (cnt = 0; cnt < path_list->path_cnt; cnt++) { ++ entry = &(paths->PathEntry[path->id]); ++ ++ entry->Visible = (path->id == path_list->visible); ++ entry->HbaInstance = path->host->instance; ++ ++ memcpy(entry->PortName, ++ path->portname, ++ EXT_DEF_WWP_NAME_SIZE); ++ ++ path = path->next; ++ } ++ ++ rval = verify_area(VERIFY_WRITE, (void *)u_paths, ++ cmd->ResponseLen); ++ if (rval) { ++ /* error */ ++ DEBUG9_10(printk("%s: u_paths %p verify write" ++ " error. paths->PathCount=%d.\n", ++ __func__, u_paths, paths->PathCount);) ++ } ++ ++ /* copy data to user */ ++ if (rval == 0) ++ rval = copy_to_user(&u_paths->PathCount, ++ &paths->PathCount, 4); ++ if (rval == 0) ++ rval = copy_to_user(&u_paths->CurrentPathIndex, ++ &paths->CurrentPathIndex, ++ sizeof(paths->CurrentPathIndex)); ++ if (rval == 0) ++ rval = copy_to_user(&u_paths->PathEntry, ++ &paths->PathEntry, ++ sizeof(paths->PathEntry)); ++ ++ if (rval != 0) { /* if any of the above failed */ ++ DEBUG9_10(printk("%s: u_paths %p copy" ++ " error. paths->PathCount=%d.\n", ++ __func__, u_paths, paths->PathCount);) ++ cmd->Status = EXT_STATUS_COPY_ERR; ++ } ++ ++ } else { ++ ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ cmd->DetailStatus = EXT_DSTATUS_TARGET; ++ ++ DEBUG4(printk("%s: cannot find device " ++ "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.", ++ __func__, ++ sap->DestAddr.WWNN[0], ++ sap->DestAddr.WWNN[1], ++ sap->DestAddr.WWNN[2], ++ sap->DestAddr.WWNN[3], ++ sap->DestAddr.WWNN[4], ++ sap->DestAddr.WWNN[5], ++ sap->DestAddr.WWNN[6], ++ sap->DestAddr.WWNN[7]);) ++ } ++ ++ KMEM_FREE(paths, sizeof(FO_PATHS_INFO)); ++ ++ DEBUG9(printk("%s: exiting. rval=%d.\n", __func__, rval);) ++ ++ return rval; ++ ++} /* qla2x00_cfg_get_paths */ ++ ++/* ++ * qla2x00_cfg_set_current_path ++ * Set the current failover path EXT_FO_GET_PATHS IOCTL call. ++ * ++ * Input: ++ * ha = pointer to adapter ++ * bp = pointer to buffer ++ * cmd = Pointer to kernel copy of EXT_IOCTL. ++ * ++ * Return; ++ * 0 on success or errno. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_cfg_set_current_path(EXT_IOCTL *cmd, FO_SET_CURRENT_PATH *bp, int mode ) ++{ ++ uint8_t orig_id, new_id; ++ mp_host_t *host, *new_host; ++ mp_device_t *dp; ++ mp_path_list_t *path_list; ++ EXT_DEST_ADDR *sap = &bp->HbaAddr; ++ uint32_t rval = 0; ++ scsi_qla_host_t *ha; ++ mp_path_t *new_path, *old_path; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ /* First find the adapter with the instance number. */ ++ ha = qla2x00_get_hba((int)bp->HbaInstance); ++ if (!ha) { ++ DEBUG2_9_10(printk("%s: no ha matching inst %d.\n", ++ __func__, bp->HbaInstance);) ++ ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (rval); ++ } ++ ++ if (!ha->flags.failover_enabled) ++ /* non-failover mode. nothing to be done. */ ++ return 0; ++ ++ if ((host = qla2x00_cfg_find_host(ha)) == NULL) { ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ cmd->DetailStatus = EXT_DSTATUS_HBA_INST; ++ DEBUG4(printk("%s: cannot find adapter.\n", ++ __func__);) ++ return (rval); ++ } ++ ++ set_bit(CFG_ACTIVE, &ha->cfg_flags); ++ sap = &bp->HbaAddr; ++ /* Scan for mp_dev by nodename *ONLY* */ ++ if (sap->DestType != EXT_DEF_DESTTYPE_WWNN) { ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ cmd->DetailStatus = EXT_DSTATUS_TARGET; ++ DEBUG4(printk("%s: target can be accessed by NodeName only.", ++ __func__);) ++ DEBUG9_10(printk("%s: target can be accessed by NodeName only.", ++ __func__);) ++ } else if ((dp = qla2x00_find_mp_dev_by_name( ++ host, sap->DestAddr.WWNN)) != NULL) { ++ ++ path_list = dp->path_list; ++ ++ if (bp->NewCurrentPathIndex < MAX_PATHS_PER_DEVICE && ++ sap->Lun < MAX_LUNS && ++ bp->NewCurrentPathIndex < path_list->path_cnt) { ++ ++ orig_id = path_list->current_path[sap->Lun]; ++ ++ DEBUG(printk("%s: dev no %d, lun %d, " ++ "newindex %d, oldindex %d " ++ "nn=%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ __func__, dp->dev_id, sap->Lun, ++ bp->NewCurrentPathIndex, orig_id, ++ host->nodename[0], host->nodename[1], ++ host->nodename[2], host->nodename[3], ++ host->nodename[4], host->nodename[5], ++ host->nodename[6], host->nodename[7]);) ++ ++ if (bp->NewCurrentPathIndex != orig_id) { ++ /* Acquire the update spinlock. */ ++ ++ /* Set the new current path. */ ++ new_id = path_list-> current_path[sap->Lun] = ++ bp->NewCurrentPathIndex; ++ ++ /* Release the update spinlock. */ ++ old_path = qla2x00_find_path_by_id( ++ dp, orig_id); ++ new_path = qla2x00_find_path_by_id(dp, new_id); ++ new_host = new_path->host; ++ ++ /* remap the lun */ ++ qla2x00_map_a_oslun(new_host, dp, ++ dp->dev_id, sap->Lun); ++ ++ qla2x00_send_failover_notify(dp, ++ sap->Lun, old_path, new_path); ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: path index not changed.\n", ++ __func__);) ++ } ++ } else { ++ cmd->Status = EXT_STATUS_INVALID_PARAM; ++ cmd->DetailStatus = EXT_DSTATUS_PATH_INDEX; ++ DEBUG4(printk("%s: invalid index for device.\n", ++ __func__);) ++ DEBUG9_10(printk("%s: invalid index for device.\n", ++ __func__);) ++ } ++ } else { ++ cmd->Status = EXT_STATUS_DEV_NOT_FOUND; ++ cmd->DetailStatus = EXT_DSTATUS_TARGET; ++ DEBUG4(printk("%s: cannot find device.\n", ++ __func__);) ++ DEBUG9_10(printk("%s: cannot find device.\n", ++ __func__);) ++ } ++ clear_bit(CFG_ACTIVE, &ha->cfg_flags); ++ ++ DEBUG9(printk("%s: exiting. rval = %d.\n", __func__, rval);) ++ ++ return rval; ++} ++#endif ++ ++/* ++ * MP SUPPORT ROUTINES ++ */ ++ ++/* ++ * qla2x00_add_mp_host ++ * Add the specified host the host list. ++ * ++ * Input: ++ * node_name = pointer to node name ++ * ++ * Returns: ++ * ++ * Context: ++ * Kernel context. ++ */ ++mp_host_t * ++qla2x00_add_mp_host(uint8_t *node_name) ++{ ++ mp_host_t *host, *temp; ++ ++ host = (mp_host_t *) KMEM_ZALLOC(sizeof(mp_host_t), 1); ++ if (host != NULL) { ++ memcpy(host->nodename, node_name, WWN_SIZE); ++ host->next = NULL; ++ /* add to list */ ++ if (mp_hosts_base == NULL) { ++ mp_hosts_base = host; ++ } else { ++ temp = mp_hosts_base; ++ while (temp->next != NULL) ++ temp = temp->next; ++ temp->next = host; ++ } ++ mp_num_hosts++; ++ } ++ return host; ++} ++ ++/* ++ * qla2x00_alloc_host ++ * Allocate and initialize an mp host structure. ++ * ++ * Input: ++ * ha = pointer to base driver's adapter structure. ++ * ++ * Returns: ++ * Pointer to host structure or null on error. ++ * ++ * Context: ++ * Kernel context. ++ */ ++mp_host_t * ++qla2x00_alloc_host(scsi_qla_host_t *ha) ++{ ++ mp_host_t *host, *temp; ++ uint8_t *name, *portname; ++ ++ name = &ha->init_cb->node_name[0]; ++ portname = &ha->init_cb->port_name[0]; ++ ++ ENTER("qla2x00_alloc_host"); ++ ++ host = (mp_host_t *) KMEM_ZALLOC(sizeof(mp_host_t), 2); ++ ++ if (host != NULL) { ++ host->ha = ha; ++ memcpy(host->nodename, name, WWN_SIZE); ++ memcpy(host->portname, portname, WWN_SIZE); ++ host->next = NULL; ++ host->flags = MP_HOST_FLAG_NEEDS_UPDATE; ++ host->instance = ha->instance; ++ /* host->MaxLunsPerTarget = qla_fo_params.MaxLunsPerTarget; */ ++ ++ if (qla2x00_fo_enabled(host->ha, host->instance)) { ++ host->flags |= MP_HOST_FLAG_FO_ENABLED; ++ DEBUG4(printk("%s: Failover enabled.\n", ++ __func__);) ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Failover disabled.\n", ++ __func__);) ++ } ++ /* add to list */ ++ if (mp_hosts_base == NULL) { ++ mp_hosts_base = host; ++ } else { ++ temp = mp_hosts_base; ++ while (temp->next != NULL) ++ temp = temp->next; ++ temp->next = host; ++ } ++ mp_num_hosts++; ++ ++ DEBUG4(printk("%s: Alloc host @ %p\n", __func__, host);) ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Failed\n", __func__);) ++ } ++ ++ return host; ++} ++ ++/* ++ * qla2x00_add_portname_to_mp_dev ++ * Add the specific port name to the list of port names for a ++ * multi-path device. ++ * ++ * Input: ++ * dp = pointer ti virtual device ++ * portname = Port name to add to device ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint32_t ++qla2x00_add_portname_to_mp_dev(mp_device_t *dp, uint8_t *portname) ++{ ++ uint8_t index; ++ uint32_t rval = QLA2X00_SUCCESS; ++ ++ ENTER("qla2x00_add_portname_to_mp_dev"); ++ ++ /* Look for an empty slot and add the specified portname. */ ++ for (index = 0; index < MAX_NUMBER_PATHS; index++) { ++ if (qla2x00_is_ww_name_zero(&dp->portnames[index][0])) { ++ DEBUG4(printk("%s: adding portname to dp = " ++ "%p at index = %d\n", ++ __func__, dp, index);) ++ memcpy(&dp->portnames[index][0], portname, WWN_SIZE); ++ break; ++ } ++ } ++ if (index == MAX_NUMBER_PATHS) { ++ rval = QLA2X00_FUNCTION_FAILED; ++ DEBUG4(printk("%s: Fail no room\n", __func__);) ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Exit OK\n", __func__);) ++ } ++ ++ LEAVE("qla2x00_add_portname_to_mp_dev"); ++ ++ return rval; ++} ++ ++ ++/* ++ * qla2x00_allocate_mp_dev ++ * Allocate an fc_mp_dev, clear the memory, and log a system ++ * error if the allocation fails. After fc_mp_dev is allocated ++ * ++ * Inputs: ++ * nodename = pointer to nodename of new device ++ * portname = pointer to portname of new device ++ * ++ * Returns: ++ * Pointer to new mp_device_t, or NULL if the allocation fails. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_device_t * ++qla2x00_allocate_mp_dev(uint8_t *nodename, uint8_t *portname) ++{ ++ mp_device_t *dp; /* Virtual device pointer */ ++ ++ ENTER("qla2x00_allocate_mp_dev"); ++ ++ dp = (mp_device_t *)KMEM_ZALLOC(sizeof(mp_device_t), 3); ++ ++ if (dp != NULL) { ++ DEBUG3(printk("%s: mp_device_t allocated at %p\n", ++ __func__, dp);) ++ ++ /* ++ * Copy node name into the mp_device_t. ++ */ ++ if (nodename) ++ memcpy(dp->nodename, nodename, WWN_SIZE); ++ ++ /* ++ * Since this is the first port, it goes at ++ * index zero. ++ */ ++ if (portname) ++ memcpy(&dp->portnames[0][0], portname, PORT_NAME_SIZE); ++ ++ /* Allocate an PATH_LIST for the fc_mp_dev. */ ++ if ((dp->path_list = qla2x00_allocate_path_list()) == NULL) { ++ DEBUG4(printk("%s: allocate path_list Failed.\n", ++ __func__);) ++ KMEM_FREE(dp, sizeof(mp_device_t)); ++ dp = NULL; ++ } else { ++ DEBUG4(printk("%s: mp_path_list_t allocated at %p\n", ++ __func__, dp->path_list);) ++ /* EMPTY */ ++ DEBUG4(printk("qla2x00_allocate_mp_dev: Exit Okay\n");) ++ } ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Allocate failed.\n", __func__);) ++ } ++ ++ LEAVE("qla2x00_allocate_mp_dev"); ++ ++ return dp; ++} ++ ++/* ++ * qla2x00_allocate_path ++ * Allocate a PATH. ++ * ++ * Inputs: ++ * host Host adapter for the device. ++ * path_id path number ++ * port port for device. ++ * dev_id device number ++ * ++ * Returns: ++ * Pointer to new PATH, or NULL if the allocation failed. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_path_t * ++qla2x00_allocate_path(mp_host_t *host, uint16_t path_id, ++ fc_port_t *port, uint16_t dev_id) ++{ ++ mp_path_t *path; ++ uint16_t lun; ++ ++ ENTER("qla2x00_allocate_path"); ++ ++ path = (mp_path_t *) KMEM_ZALLOC(sizeof(mp_path_t), 4); ++ if (path != NULL) { ++ DEBUG3(printk("%s: mp_path_t allocated at %p\n", ++ __func__, path); ) ++ ++ /* Copy the supplied information into the MP_PATH. */ ++ path->host = host; ++ if (!(port->flags & FC_CONFIG) || ++ port->loop_id != FC_NO_LOOP_ID) { ++ ++ path->port = port; ++ } ++ path->id = path_id; ++ port->cur_path = path->id; ++ path->mp_byte = port->mp_byte; ++ path->next = NULL; ++ memcpy(path->portname, port->port_name, WWN_SIZE); ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ path->lun_data.data[lun] |= LUN_DATA_ENABLED; ++ } ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Failed\n", __func__);) ++ } ++ ++ return path; ++} ++ ++ ++/* ++ * qla2x00_allocate_path_list ++ * Allocate a PATH_LIST ++ * ++ * Input: ++ * None ++ * ++ * Returns: ++ * Pointer to new PATH_LIST, or NULL if the allocation fails. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_path_list_t * ++qla2x00_allocate_path_list( void ) ++{ ++ mp_path_list_t *path_list; ++ uint16_t i; ++ uint8_t l; ++ ++ path_list = (mp_path_list_t *) KMEM_ZALLOC(sizeof(mp_path_list_t), 5); ++ ++ if (path_list != NULL) { ++ DEBUG4(printk("%s: allocated at %p\n", ++ __func__, path_list);) ++ ++ path_list->visible = PATH_INDEX_INVALID; ++ /* Initialized current path */ ++ for (i = 0; i < MAX_LUNS_PER_DEVICE; i++) { ++ l = (uint8_t)(i & 0xFF); ++ path_list->current_path[l] = PATH_INDEX_INVALID; ++ } ++ path_list->last = NULL; ++ ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Alloc pool failed for MP_PATH_LIST.\n", ++ __func__);) ++ } ++ ++ return path_list; ++} ++ ++/* ++ * qla2x00_cfg_find_host ++ * Look through the existing multipath tree, and find ++ * a host adapter to match the specified ha. ++ * ++ * Input: ++ * ha = pointer to host adapter ++ * ++ * Return: ++ * Pointer to new host, or NULL if no match found. ++ * ++ * Context: ++ * Kernel context. ++ */ ++mp_host_t * ++qla2x00_cfg_find_host(scsi_qla_host_t *ha) ++{ ++ mp_host_t *host = NULL; /* Host found and null if not */ ++ mp_host_t *tmp_host; ++ ++ ENTER("qla2x00_cfg_find_host"); ++ ++ for (tmp_host = mp_hosts_base; (tmp_host); tmp_host = tmp_host->next) { ++ if (tmp_host->ha == ha) { ++ host = tmp_host; ++ DEBUG3(printk("%s: Found host =%p, instance %d\n", ++ __func__, host, host->instance);) ++ break; ++ } ++ } ++ ++ LEAVE("qla2x00_cfg_find_host"); ++ ++ return host; ++} ++ ++/* ++ * qla2x00_find_host_by_name ++ * Look through the existing multipath tree, and find ++ * a host adapter to match the specified name. ++ * ++ * Input: ++ * name = node name to match. ++ * ++ * Return: ++ * Pointer to new host, or NULL if no match found. ++ * ++ * Context: ++ * Kernel context. ++ */ ++mp_host_t * ++qla2x00_find_host_by_name(uint8_t *name) ++{ ++ mp_host_t *host; /* Host found and null if not */ ++ ++ for (host = mp_hosts_base; (host); host = host->next) { ++ if (memcmp(host->nodename, name, WWN_SIZE) == 0) ++ break; ++ } ++ return host; ++} ++ ++ ++/* ++ * qla2x00_find_or_allocate_mp_dev ++ * Look through the existing multipath control tree, and find ++ * an mp_device_t with the supplied world-wide node name. If ++ * one cannot be found, allocate one. ++ * ++ * Input: ++ * host Adapter to add device to. ++ * dev_id Index of device on adapter. ++ * port port database information. ++ * ++ * Returns: ++ * Pointer to new mp_device_t, or NULL if the allocation fails. ++ * ++ * Side Effects: ++ * If the MP HOST does not already point to the mp_device_t, ++ * a pointer is added at the proper port offset. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_device_t * ++qla2x00_find_or_allocate_mp_dev(mp_host_t *host, uint16_t dev_id, ++ fc_port_t *port) ++{ ++ mp_device_t *dp = NULL; /* pointer to multi-path device */ ++ uint8_t node_found; /* Found matching node name. */ ++ uint8_t port_found; /* Found matching port name. */ ++ uint8_t names_valid; /* Node name and port name are not zero */ ++ mp_host_t *temp_host; /* pointer to temporary host */ ++ ++ uint16_t j; ++ mp_device_t *temp_dp; ++ ++ ENTER("qla2x00_find_or_allocate_mp_dev"); ++ ++ DEBUG3(printk("%s: host =%p, port =%p, id = %d\n", ++ __func__, host, port, dev_id);) ++ ++ temp_dp = qla2x00_find_mp_dev_by_id(host,dev_id); ++ ++ DEBUG3(printk("%s: temp dp =%p\n", __func__, temp_dp);) ++ /* if Device already known at this port. */ ++ if (temp_dp != NULL) { ++ node_found = qla2x00_is_nodename_equal(temp_dp->nodename, ++ port->node_name); ++ port_found = qla2x00_is_portname_in_device(temp_dp, ++ port->port_name); ++ ++ if (node_found && port_found) { ++ DEBUG3(printk("%s: port exists in device %p\n", ++ __func__, temp_dp);) ++ dp = temp_dp; ++ ++ /* ++ * Copy the LUN configuration data ++ * into the mp_device_t. ++ */ ++ } ++ } ++ ++ ++ /* Sanity check the port information */ ++ names_valid = (!qla2x00_is_ww_name_zero(port->node_name) && ++ !qla2x00_is_ww_name_zero(port->port_name)); ++ ++ /* ++ * If the optimized check failed, loop through each known ++ * device on each known adapter looking for the node name. ++ */ ++ if (dp == NULL && names_valid) { ++ DEBUG3(printk("%s: Searching each adapter for the device...\n", ++ __func__);) ++ ++ for (temp_host = mp_hosts_base; (temp_host); ++ temp_host = temp_host->next) { ++ ++ /* Loop through each potential device on adapter. */ ++ for (j = 0; j < MAX_MP_DEVICES; j++) { ++ temp_dp = temp_host->mp_devs[j]; ++ ++ if (temp_dp == NULL) ++ continue; ++ ++ node_found = qla2x00_is_nodename_equal( ++ temp_dp->nodename, ++ port->node_name); ++ port_found = qla2x00_is_portname_in_device( ++ temp_dp, ++ port->port_name); ++ ++ if (node_found || port_found) { ++ DEBUG3(printk("%s: Matching device " ++ "found at %p @ %d\n", ++ __func__, temp_dp, j);) ++ /* ++ * If the node name matches but ++ * the port name was not found, ++ * add the port name to the list ++ * of port names. ++ */ ++ if (!port_found) { ++ qla2x00_add_portname_to_mp_dev( ++ temp_dp, ++ port->port_name); ++ } ++ ++ /* ++ * Set the flag that we have ++ * found the device. ++ */ ++ dp = temp_dp; ++ host->mp_devs[j] = dp; ++ dp->use_cnt++; ++ ++ /* Fixme(dg) ++ * Copy the LUN info into ++ * the mp_device_t ++ */ ++ break; ++ } ++ } ++ ++ /* Break outer loop if inner loop succeeded. */ ++ if (dp != NULL) ++ break; ++ } ++ ++ } ++ ++ /* If we couldn't find one, allocate one. */ ++ if (dp == NULL && ++ ((port->flags & FC_CONFIG) || !mp_config_required ) ) { ++ ++ dp = qla2x00_allocate_mp_dev(port->node_name, port->port_name); ++ host->mp_devs[dev_id] = dp; ++ dp->dev_id = dev_id; ++ dp->use_cnt++; ++ } ++ ++ LEAVE("qla2x00_allocate_mp_dev"); ++ ++ return dp; ++} ++ ++ ++/* ++ * qla2x00_find_or_allocate_path ++ * Look through the path list for the supplied device, and either ++ * find the supplied adapter (path) for the adapter, or create ++ * a new one and add it to the path list. ++ * ++ * Input: ++ * host Adapter (path) for the device. ++ * dp Device and path list for the device. ++ * dev_id Index of device on adapter. ++ * port Device data from port database. ++ * ++ * Returns: ++ * Pointer to new PATH, or NULL if the allocation fails. ++ * ++ * Side Effects: ++ * 1. If the PATH_LIST does not already point to the PATH, ++ * a new PATH is added to the PATH_LIST. ++ * 2. If the new path is found to be a second visible path, it is ++ * marked as hidden, and the device database is updated to be ++ * hidden as well, to keep the miniport synchronized. ++ * ++ * Context: ++ * Kernel context. ++ */ ++/* ARGSUSED */ ++static mp_path_t * ++qla2x00_find_or_allocate_path(mp_host_t *host, mp_device_t *dp, ++ uint16_t dev_id, fc_port_t *port) ++{ ++ mp_path_list_t *path_list = dp->path_list; ++ mp_path_t *path; ++ uint8_t id; ++ ++ ++ ENTER("qla2x00_find_or_allocate_path"); ++ ++ DEBUG4(printk("%s: host =%p, port =%p, dp=%p, dev id = %d\n", ++ __func__, host, port, dp, dev_id);) ++ /* ++ * Loop through each known path in the path list. Look for ++ * a PATH that matches both the adapter and the port name. ++ */ ++ path = qla2x00_find_path_by_name(host, path_list, port->port_name); ++ ++ ++ if (path != NULL ) { ++ DEBUG3(printk("%s: Found an existing " ++ "path - host =%p, port =%p, path id = %d\n", ++ __func__, host, path->port, path->id);) ++ DEBUG3(printk("%s: Luns for path_id %d, instance %d\n", ++ __func__, path->id, host->instance);) ++ DEBUG3(qla2x00_dump_buffer( ++ (char *)&path->lun_data.data[0], 64);) ++ ++ /* If we found an existing path, look for any changes to it. */ ++ if (path->port == NULL) { ++ DEBUG3(printk("%s: update path %p, path id= %d, " ++ "mp_byte=0x%x port=%p\n", ++ __func__, path, path->id, ++ path->mp_byte, path->port);) ++ path->port = port; ++ port->mp_byte = path->mp_byte; ++ } else { ++ if ((path->mp_byte & MP_MASK_HIDDEN) && ++ !(port->mp_byte & MP_MASK_HIDDEN)) { ++ ++ DEBUG3(printk("%s: Adapter(%p) " ++ "Device (%p) Path (%d) " ++ "has become visible.\n", ++ __func__, host, dp, path->id);) ++ ++ path->mp_byte &= ~MP_MASK_HIDDEN; ++ } ++ ++ if (!(path->mp_byte & MP_MASK_HIDDEN) && ++ (port->mp_byte & MP_MASK_HIDDEN)) { ++ ++ DEBUG3(printk("%s: Adapter(%p) " ++ "Device (%p) Path (%d) " ++ "has become hidden.\n", ++ __func__, host, dp, path->id);) ++ ++ path->mp_byte |= MP_MASK_HIDDEN; ++ } ++ } ++ ++ } else { ++ /* ++ * If we couldn't find an existing path, and there is still ++ * room to add one, allocate one and put it in the list. ++ */ ++ if (path_list->path_cnt < MAX_PATHS_PER_DEVICE && ++ path_list->path_cnt < qla_fo_params.MaxPathsPerDevice) { ++ ++ id = path_list->path_cnt; ++ ++ /* Update port with bitmask info */ ++ path = qla2x00_allocate_path(host, id, port, dev_id); ++ DEBUG3(printk("%s: new path %p, path id= %d, " ++ "mp_byte=0x%x port=%p\n", ++ __func__, path, id, ++ path->mp_byte, path->port);) ++ qla2x00_add_path(path_list, path); ++ ++ /* Reconcile the new path against the existing ones. */ ++ qla2x00_setup_new_path(dp, path); ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Err exit, no space to add path.\n", ++ __func__);) ++ } ++ ++ } ++ ++ LEAVE("qla2x00_find_or_allocate_path"); ++ ++ return path; ++} ++ ++static uint32_t ++qla2x00_cfg_register_failover_lun(mp_device_t *dp, srb_t *sp, fc_lun_t *new_lp) ++{ ++ uint32_t status = QLA2X00_SUCCESS; ++ os_tgt_t *tq; ++ os_lun_t *lq; ++ fc_lun_t *old_lp; ++ ++ DEBUG2(printk("%s: NEW fclun = %p, sp = %p\n", ++ __func__, new_lp, sp);) ++ ++ /* ++ * Fix lun descriptors to point to new fclun which is a new fcport. ++ */ ++ if (new_lp == NULL) { ++ DEBUG2(printk("%s: Failed new lun %p\n", ++ __func__, new_lp);) ++ return QLA2X00_FUNCTION_FAILED; ++ } ++ ++ tq = sp->tgt_queue; ++ lq = sp->lun_queue; ++ if (tq == NULL) { ++ DEBUG2(printk("%s: Failed to get old tq %p\n", ++ __func__, tq);) ++ return QLA2X00_FUNCTION_FAILED; ++ } ++ if (lq == NULL) { ++ DEBUG2(printk("%s: Failed to get old lq %p\n", ++ __func__, lq);) ++ return QLA2X00_FUNCTION_FAILED; ++ } ++ old_lp = lq->fclun; ++ lq->fclun = new_lp; ++ ++ /* Log the failover to console */ ++ printk(KERN_INFO ++ "qla2x00: FAILOVER device %d from " ++ "%02x%02x%02x%02x%02x%02x%02x%02x -> " ++ "%02x%02x%02x%02x%02x%02x%02x%02x - " ++ "LUN %02x, reason=0x%x\n", ++ dp->dev_id, ++ old_lp->fcport->port_name[0], old_lp->fcport->port_name[1], ++ old_lp->fcport->port_name[2], old_lp->fcport->port_name[3], ++ old_lp->fcport->port_name[4], old_lp->fcport->port_name[5], ++ old_lp->fcport->port_name[6], old_lp->fcport->port_name[7], ++ new_lp->fcport->port_name[0], new_lp->fcport->port_name[1], ++ new_lp->fcport->port_name[2], new_lp->fcport->port_name[3], ++ new_lp->fcport->port_name[4], new_lp->fcport->port_name[5], ++ new_lp->fcport->port_name[6], new_lp->fcport->port_name[7], ++ new_lp->lun, sp->err_id); ++ printk(KERN_INFO ++ "qla2x00: FROM HBA %d to HBA %d\n", ++ (int)old_lp->fcport->ha->instance, ++ (int)new_lp->fcport->ha->instance); ++ ++ DEBUG3(printk("%s: NEW fclun = %p , port =%p, " ++ "loop_id =0x%x, instance %ld\n", ++ __func__, ++ new_lp, new_lp->fcport, ++ new_lp->fcport->loop_id, ++ new_lp->fcport->ha->instance);) ++ ++ return status; ++} ++ ++ ++/* ++ * qla2x00_send_failover_notify ++ * A failover operation has just been done from an old path ++ * index to a new index. Call lower level driver ++ * to perform the failover notification. ++ * ++ * Inputs: ++ * device Device being failed over. ++ * lun LUN being failed over. ++ * newpath path that was failed over too. ++ * oldpath path that was failed over from. ++ * ++ * Return: ++ * Local function status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++/* ARGSUSED */ ++static uint32_t ++qla2x00_send_failover_notify(mp_device_t *dp, ++ uint8_t lun, mp_path_t *newpath, mp_path_t *oldpath) ++{ ++ fc_lun_t *old_lp, *new_lp; ++ uint32_t status = QLA2X00_SUCCESS; ++ ++ ENTER("qla2x00_send_failover_notify"); ++ ++ old_lp = qla2x00_find_matching_lun(lun, oldpath); ++ new_lp = qla2x00_find_matching_lun(lun, newpath); ++ ++ /* ++ * If the target is the same target, but a new HBA has been selected, ++ * send a third party logout if required. ++ */ ++ if ((qla_fo_params.FailoverNotifyType & ++ FO_NOTIFY_TYPE_LOGOUT_OR_LUN_RESET || ++ qla_fo_params.FailoverNotifyType & ++ FO_NOTIFY_TYPE_LOGOUT_OR_CDB) && ++ qla2x00_is_portname_equal( ++ oldpath->portname, newpath->portname)) { ++ ++ status = qla2x00_send_fo_notification(old_lp, new_lp); ++ if (status == QLA2X00_SUCCESS) { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Logout succeded\n", ++ __func__);) ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Logout Failed\n", ++ __func__);) ++ } ++ } else if ((qla_fo_params.FailoverNotifyType & ++ FO_NOTIFY_TYPE_LUN_RESET) || ++ (qla_fo_params.FailoverNotifyType & ++ FO_NOTIFY_TYPE_LOGOUT_OR_LUN_RESET)) { ++ ++ /* ++ * If desired, send a LUN reset as the ++ * failover notification type. ++ */ ++ if (newpath->lun_data.data[lun] & LUN_DATA_ENABLED) { ++ status = qla2x00_send_fo_notification(old_lp, new_lp); ++ if (status == QLA2X00_SUCCESS) { ++ /* EMPTY */ ++ DEBUG4(printk("%s: LUN reset succeeded.\n", ++ __func__);) ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Failed reset LUN.\n", ++ __func__);) ++ } ++ } ++ ++ } else if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_CDB || ++ qla_fo_params.FailoverNotifyType == ++ FO_NOTIFY_TYPE_LOGOUT_OR_CDB) { ++ ++ if (newpath->lun_data.data[lun] & LUN_DATA_ENABLED) { ++ status = qla2x00_send_fo_notification(old_lp, new_lp); ++ if (status == QLA2X00_SUCCESS) { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Send CDB succeeded.\n", ++ __func__);) ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Send CDB Error " ++ "lun=(%d).\n", __func__, lun);) ++ } ++ } ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: failover disabled or no notify routine " ++ "defined.\n", __func__);) ++ } ++ ++ return status; ++} ++ ++/* ++ * qla2x00_select_next_path ++ * A problem has been detected with the current path for this ++ * device. Try to select the next available path as the current ++ * path for this device. If there are no more paths, the same ++ * path will still be selected. ++ * ++ * Inputs: ++ * dp pointer of device structure. ++ * lun LUN to failover. ++ * ++ * Return Value: ++ * new path or same path ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_path_t * ++qla2x00_select_next_path(mp_host_t *host, mp_device_t *dp, uint8_t lun) ++{ ++ mp_path_t *path = NULL; ++ mp_path_list_t *path_list; ++ mp_path_t *orig_path; ++ int id; ++ uint32_t status; ++ mp_host_t *new_host; ++ ++ ENTER("qla2x00_select_next_path:"); ++ ++ path_list = dp->path_list; ++ if (path_list == NULL) ++ return NULL; ++ ++ /* Get current path */ ++ id = path_list->current_path[lun]; ++ ++ /* Get path for current path id */ ++ if ((orig_path = qla2x00_find_path_by_id(dp, id)) != NULL) { ++ ++ /* select next path */ ++ path = orig_path->next; ++ new_host = path->host; ++ ++ /* FIXME may need to check for HBA being reset */ ++ DEBUG3(printk("%s: orig path = %p new path = %p " ++ "curr idx = %d, new idx = %d\n", ++ __func__, orig_path, path, orig_path->id, path->id);) ++ DEBUG3(printk(" FAILOVER: device nodename: " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ dp->nodename[0], dp->nodename[1], ++ dp->nodename[2], dp->nodename[3], ++ dp->nodename[4], dp->nodename[5], ++ dp->nodename[6], dp->nodename[7]);) ++ DEBUG3(printk(" Original - host nodename: " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ orig_path->host->nodename[0], ++ orig_path->host->nodename[1], ++ orig_path->host->nodename[2], ++ orig_path->host->nodename[3], ++ orig_path->host->nodename[4], ++ orig_path->host->nodename[5], ++ orig_path->host->nodename[6], ++ orig_path->host->nodename[7]);) ++ DEBUG3(printk(" portname: " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ orig_path->port->port_name[0], ++ orig_path->port->port_name[1], ++ orig_path->port->port_name[2], ++ orig_path->port->port_name[3], ++ orig_path->port->port_name[4], ++ orig_path->port->port_name[5], ++ orig_path->port->port_name[6], ++ orig_path->port->port_name[7]);) ++ DEBUG3(printk(" New - host nodename: " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ new_host->nodename[0], new_host->nodename[1], ++ new_host->nodename[2], new_host->nodename[3], ++ new_host->nodename[4], new_host->nodename[5], ++ new_host->nodename[6], new_host->nodename[7]);) ++ DEBUG3(printk(" portname: " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ path->port->port_name[0], ++ path->port->port_name[1], ++ path->port->port_name[2], ++ path->port->port_name[3], ++ path->port->port_name[4], ++ path->port->port_name[5], ++ path->port->port_name[6], ++ path->port->port_name[7]);) ++ ++ path_list->current_path[lun] = path->id; ++ ++ /* If we selected a new path, do failover notification. */ ++ if (path != orig_path) { ++ status = qla2x00_send_failover_notify( ++ dp, lun, path, orig_path); ++ ++ /* ++ * Currently we ignore the returned status from ++ * the notify. however, if failover notify fails ++ */ ++ } ++ } ++ ++ LEAVE("qla2x00_select_next_path:"); ++ ++ return path ; ++} ++ ++ ++ ++/* ++ * qla2x00_update_mp_host ++ * Update the multipath control information from the port ++ * database for that adapter. ++ * ++ * Input: ++ * host Adapter to update. Devices that are new are ++ * known to be attached to this adapter. ++ * ++ * Returns: ++ * TRUE if updated successfully; FALSE if error. ++ * ++ */ ++static uint8_t ++qla2x00_update_mp_host(mp_host_t *host) ++{ ++ uint8_t success = TRUE; ++ uint16_t dev_id; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ scsi_qla_host_t *ha = host->ha; ++ ++ ENTER("qla2x00_update_mp_host"); ++ ++ /* ++ * We make sure each port is attached to some virtual device. ++ */ ++ dev_id = 0; ++ fcport = NULL; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ success |= qla2x00_update_mp_device(host, fcport, dev_id); ++ ++ dev_id++; ++ } ++ if (success) { ++ DEBUG2(printk("%s: Exit OK\n", __func__);) ++ qla2x00_map_os_targets(host); ++ } else { ++ /* EMPTY */ ++ DEBUG2(printk("%s: Exit FAILED\n", __func__);) ++ } ++ ++ LEAVE("qla2x00_update_mp_host"); ++ ++ return success; ++} ++ ++/* ++ * qla2x00_update_mp_device ++ * Update the multipath control information from the port ++ * database for that adapter. ++ * ++ * Inputs: ++ * host Host adapter structure ++ * port Device to add to the path tree. ++ * dev_id Device id ++ * ++ * Synchronization: ++ * The Adapter Lock should have already been acquired ++ * before calling this routine. ++ * ++ * Return ++ * TRUE if updated successfully; FALSE if error. ++ * ++ */ ++uint8_t ++qla2x00_update_mp_device(mp_host_t *host, fc_port_t *port, uint16_t dev_id) ++{ ++ uint8_t success = TRUE; ++ mp_device_t *dp; ++ mp_path_t *path; ++ ++ ENTER("qla2x00_update_mp_device"); ++ ++ DEBUG3(printk("%s: host =%p, port =%p, id = %d\n", ++ __func__, host, port, dev_id);) ++ ++ if (!qla2x00_is_ww_name_zero(port->port_name)) { ++ ++ /* ++ * Search for a device with a matching node name, ++ * or create one. ++ */ ++ dp = qla2x00_find_or_allocate_mp_dev(host, dev_id, port); ++ ++ /* ++ * We either have found or created a path list. Find this ++ * host's path in the path list or allocate a new one ++ * and add it to the list. ++ */ ++ if (dp == NULL) { ++ DEBUG4(printk("%s: Device NOT found or created at.\n", ++ __func__);) ++ return FALSE; ++ } ++ ++ /* ++ * Find the path in the current path list, or allocate ++ * a new one and put it in the list if it doesn't exist. ++ * Note that we do NOT set bSuccess to FALSE in the case ++ * of failure here. We must tolerate the situation where ++ * the customer has more paths to a device than he can ++ * get into a PATH_LIST. ++ */ ++ ++ path = qla2x00_find_or_allocate_path(host, dp, dev_id, port); ++ if (path == NULL) { ++ DEBUG4(printk("%s:Path NOT found or created.\n", ++ __func__);) ++ return FALSE; ++ } ++ ++ /* Set the PATH flag to match the device flag ++ * of whether this device needs a relogin. If any ++ * device needs relogin, set the relogin countdown. ++ */ ++ if (port->flags & FC_CONFIG) ++ path->config = TRUE; ++ ++ if (atomic_read(&port->state) != FC_ONLINE) { ++ path->relogin = TRUE; ++ if (host->relogin_countdown == 0) ++ host->relogin_countdown = 30; ++ } else { ++ path->relogin = FALSE; ++ } ++ ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Failed portname empty.\n", ++ __func__);) ++ } ++ ++ LEAVE("qla2x00_update_mp_device"); ++ ++ return success; ++} ++ ++/* ++ * qla2x00_update_mp_tree ++ * Get port information from each adapter, and build or rebuild ++ * the multipath control tree from this data. This is called ++ * from init and during port database notification. ++ * ++ * Input: ++ * None ++ * ++ * Return: ++ * Local function return code. ++ * ++ */ ++static uint32_t ++qla2x00_update_mp_tree(void) ++{ ++ mp_host_t *host; ++ uint32_t rval = QLA2X00_SUCCESS; ++ ++ ENTER("qla2x00_update_mp_tree:"); ++ ++ /* Loop through each adapter and see what needs updating. */ ++ for (host = mp_hosts_base; (host) ; host = host->next) { ++ ++ DEBUG4(printk("%s: hba(%d) flags (%x)\n", ++ __func__, host->instance, host->flags);) ++ /* Clear the countdown; it may be reset in the update. */ ++ host->relogin_countdown = 0; ++ ++ /* Override the NEEDS_UPDATE flag if disabled. */ ++ if (host->flags & MP_HOST_FLAG_DISABLE || ++ list_empty(host->fcports)) ++ host->flags &= ~MP_HOST_FLAG_NEEDS_UPDATE; ++ ++ if (host->flags & MP_HOST_FLAG_NEEDS_UPDATE) { ++ ++ /* ++ * Perform the actual updates. If this succeeds, clear ++ * the flag that an update is needed, and failback all ++ * devices that are visible on this path to use this ++ * path. If the update fails, leave set the flag that ++ * an update is needed, and it will be picked back up ++ * during the next timer routine. ++ */ ++ if (qla2x00_update_mp_host(host)) { ++ host->flags &= ~MP_HOST_FLAG_NEEDS_UPDATE; ++ ++ qla2x00_failback_luns(host); ++ } else ++ rval = QLA2X00_FUNCTION_FAILED; ++ ++ } ++ ++ } ++ ++ if (rval != QLA2X00_SUCCESS) { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Exit FAILED.\n", __func__);) ++ ++ } else { ++ /* EMPTY */ ++ DEBUG4(printk("%s: Exit OK.\n", __func__);) ++ } ++ return rval; ++} ++ ++ ++ ++/* ++ * qla2x00_find_matching_lun ++ * Find the lun in the path that matches the ++ * specified lun number. ++ * ++ * Input: ++ * lun = lun number ++ * newpath = path to search for lun ++ * ++ * Returns: ++ * NULL or pointer to lun ++ * ++ * Context: ++ * Kernel context. ++ * (dg) ++ */ ++static fc_lun_t * ++qla2x00_find_matching_lun(uint8_t lun, mp_path_t *newpath) ++{ ++ fc_lun_t *lp = NULL; /* lun ptr */ ++ struct list_head *fcll; ++ fc_lun_t *nlp; /* Next lun ptr */ ++ fc_port_t *fcport; /* port ptr */ ++ ++ if ((fcport = newpath->port) != NULL) { ++ list_for_each(fcll, &fcport->fcluns) { ++ nlp = list_entry(fcll, fc_lun_t, list); ++ ++ if (lun == nlp->lun) { ++ lp = nlp; ++ break; ++ } ++ } ++ } ++ return lp; ++} ++ ++/* ++ * qla2x00_find_path_by_name ++ * Find the path specified portname from the pathlist ++ * ++ * Input: ++ * host = host adapter pointer. ++ * pathlist = multi-path path list ++ * portname portname to search for ++ * ++ * Returns: ++ * pointer to the path or NULL ++ * ++ * Context: ++ * Kernel context. ++ */ ++mp_path_t * ++qla2x00_find_path_by_name(mp_host_t *host, mp_path_list_t *plp, ++ uint8_t *portname) ++{ ++ mp_path_t *path = NULL; /* match if not NULL */ ++ mp_path_t *tmp_path; ++ int cnt; ++ ++ if ((tmp_path = plp->last) != NULL) { ++ for (cnt = 0; cnt < plp->path_cnt; cnt++) { ++ if (tmp_path->host == host && ++ qla2x00_is_portname_equal( ++ tmp_path->portname, portname)) { ++ ++ path = tmp_path; ++ break; ++ } ++ tmp_path = tmp_path->next; ++ } ++ } ++ return path ; ++} ++ ++/* ++ * qla2x00_find_path_by_id ++ * Find the path for the specified path id. ++ * ++ * Input: ++ * dp multi-path device ++ * id path id ++ * ++ * Returns: ++ * pointer to the path or NULL ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_path_t * ++qla2x00_find_path_by_id(mp_device_t *dp, uint8_t id) ++{ ++ mp_path_t *path = NULL; ++ mp_path_t *tmp_path; ++ mp_path_list_t *path_list; ++ int cnt; ++ ++ path_list = dp->path_list; ++ tmp_path = path_list->last; ++ for (cnt = 0; (tmp_path) && cnt < path_list->path_cnt; cnt++) { ++ if (tmp_path->id == id) { ++ path = tmp_path; ++ break; ++ } ++ tmp_path = tmp_path->next; ++ } ++ return path ; ++} ++ ++/* ++ * qla2x00_find_mp_dev_by_id ++ * Find the mp_dev for the specified target id. ++ * ++ * Input: ++ * host = host adapter pointer. ++ * tgt = Target id ++ * ++ * Returns: ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_device_t * ++qla2x00_find_mp_dev_by_id(mp_host_t *host, uint8_t id ) ++{ ++ if (id < MAX_MP_DEVICES) ++ return host->mp_devs[id]; ++ else ++ return NULL; ++} ++ ++/* ++ * qla2x00_find_mp_dev_by_name ++ * Find the mp_dev for the specified target name. ++ * ++ * Input: ++ * host = host adapter pointer. ++ * name = Target name ++ * ++ * Returns: ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_device_t * ++qla2x00_find_mp_dev_by_name(mp_host_t *host, uint8_t *name ) ++{ ++ int id; ++ mp_device_t *dp; ++ ++ ENTER("qla2x00_find_mp_dev_by_name"); ++ ++ for (id= 0; id < MAX_MP_DEVICES; id++) { ++ if ((dp = host->mp_devs[id] ) == NULL) ++ continue; ++ ++ if (qla2x00_is_nodename_equal(dp->nodename, name)) { ++ DEBUG3(printk("%s: Found matching device @ index %d:\n", ++ __func__, id);) ++ return dp; ++ } ++ } ++ ++ LEAVE("qla2x00_find_mp_dev_by_name"); ++ ++ return NULL; ++} ++ ++/* ++ * qla2x00_get_visible_path ++ * Find the the visible path for the specified device. ++ * ++ * Input: ++ * dp = device pointer ++ * ++ * Returns: ++ * NULL or path ++ * ++ * Context: ++ * Kernel context. ++ */ ++static mp_path_t * ++qla2x00_get_visible_path(mp_device_t *dp) ++{ ++ uint16_t id; ++ mp_path_list_t *path_list; ++ mp_path_t *path; ++ ++ path_list = dp->path_list; ++ /* if we don't have a visible path skip it */ ++ if ((id = path_list->visible) == PATH_INDEX_INVALID) { ++ return NULL; ++ } ++ ++ if ((path = qla2x00_find_path_by_id(dp,id))== NULL) ++ return NULL; ++ ++ return path ; ++} ++ ++/* ++ * qla2x00_map_os_targets ++ * Allocate the luns and setup the OS target. ++ * ++ * Input: ++ * host = host adapter pointer. ++ * ++ * Returns: ++ * None ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_map_os_targets(mp_host_t *host) ++{ ++ scsi_qla_host_t *ha = host->ha; ++ mp_path_t *path; ++ mp_device_t *dp; ++ os_tgt_t *tgt; ++ int t; ++ ++ ENTER("qla2x00_map_os_targets "); ++ ++ for (t = 0; t < MAX_TARGETS; t++ ) { ++ dp = host->mp_devs[t]; ++ if (dp != NULL) { ++ DEBUG3(printk("%s: (%d) found a dp=%p, " ++ "host=%p, ha=%p\n", ++ __func__, t, dp, host,ha);) ++ ++ if ((path = qla2x00_get_visible_path(dp)) == NULL) { ++ printk(KERN_INFO ++ "qla_cfg(%d): No visible path " ++ "for target %d, dp = %p\n", ++ host->instance, t, dp); ++ continue; ++ } ++ ++ /* if not the visible path skip it */ ++ if (path->host == host) { ++ if (TGT_Q(ha, t) == NULL) { ++ tgt = qla2x00_tgt_alloc(ha, t); ++ memcpy(tgt->node_name, ++ dp->nodename, ++ WWN_SIZE); ++ tgt->vis_port = path->port; ++ } ++ DEBUG3(printk("%s(%ld): host=%d, " ++ "device= %p has VISIBLE " ++ "path=%p, path id=%d\n", ++ __func__, ha->host_no, ++ host->instance, ++ dp, path, path->id);) ++ } else { ++ /* EMPTY */ ++ DEBUG3(printk("%s(%ld): host=%d, " ++ "device= %p has HIDDEN " ++ "path=%p, path id=%d\n", ++ __func__, ha->host_no, ++ host->instance, dp, path,path->id);) ++ } ++ qla2x00_map_os_luns(host, dp, t); ++ } else { ++ if ((tgt= TGT_Q(ha,t)) != NULL) { ++ qla2x00_tgt_free(ha,t); ++ } ++ } ++ } ++ ++ LEAVE("qla2x00_map_os_targets "); ++} ++ ++/* ++ * qla2x00_map_os_luns ++ * Allocate the luns for the OS target. ++ * ++ * Input: ++ * dp = pointer to device ++ * t = OS target number. ++ * ++ * Returns: ++ * None ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_map_os_luns(mp_host_t *host, mp_device_t *dp, uint16_t t) ++{ ++ uint16_t lun; ++ int i; ++ ++ for (lun = 0; lun < MAX_LUNS; lun++ ) { ++ if ( qla2x00_map_a_oslun(host, dp, t, lun) && ++ (host->flags & MP_HOST_FLAG_LUN_FO_ENABLED) ){ ++ /* find a path for us to use */ ++ for ( i = 0; i < dp->path_list->path_cnt; i++ ){ ++ qla2x00_select_next_path(host, dp, lun); ++ if( !qla2x00_map_a_oslun(host, dp, t, lun)) ++ break; ++ } ++ } ++ } ++} ++ ++/* ++ * qla2x00_map_a_osluns ++ * Map the OS lun to the current path ++ * ++ * Input: ++ * host = pointer to host ++ * dp = pointer to device ++ * lun = OS lun number. ++ * ++ * Returns: ++ * None ++ * ++ * Context: ++ * Kernel context. ++ */ ++ ++static uint8_t ++qla2x00_map_a_oslun(mp_host_t *host, mp_device_t *dp, uint16_t t, uint16_t lun) ++{ ++ fc_port_t *fcport; ++ fc_lun_t *fclun; ++ os_lun_t *lq; ++ uint16_t id; ++ mp_path_t *path, *vis_path; ++ mp_host_t *vis_host; ++ uint8_t status = FALSE; ++ ++ if ((id = dp->path_list->current_path[lun]) != PATH_INDEX_INVALID) { ++ path = qla2x00_find_path_by_id(dp,id); ++ if (path) { ++ fcport = path->port; ++ if (fcport) { ++ /* dg 04/26/02 */ ++ fcport->cur_path = id; ++ fclun = qla2x00_find_matching_lun(lun,path); ++ ++ /* Always map all luns if they are enabled */ ++ if (fclun && ++ (path->lun_data.data[lun] & ++ LUN_DATA_ENABLED) ) { ++ ++ /* ++ * Mapped lun on the visible path ++ */ ++ if ((vis_path = ++ qla2x00_get_visible_path(dp)) == ++ NULL ) { ++ ++ printk(KERN_INFO ++ "qla2x00(%d): No visible " ++ "path for target %d, " ++ "dp = %p\n", ++ host->instance, ++ t, dp); ++ ++ return FALSE; ++ } ++ ++ vis_host = vis_path->host; ++ ++ /* ra 11/30/01 */ ++ /* ++ * Always alloc LUN 0 so kernel ++ * will scan past LUN 0. ++ */ ++ if (lun != 0 && ++ (EXT_IS_LUN_BIT_SET( ++ &(fcport->lun_mask), lun))) { ++ ++ /* mask this LUN */ ++ return FALSE; ++ } ++ ++ if ((lq = qla2x00_lun_alloc( ++ vis_host->ha, ++ t, lun)) != NULL) { ++ ++ lq->fclun = fclun; ++ } ++ } ++ } ++ else ++ status = TRUE; ++ } ++ } ++ return status; ++} ++ ++/* ++ * qla2x00_is_ww_name_zero ++ * ++ * Input: ++ * ww_name = Pointer to WW name to check ++ * ++ * Returns: ++ * TRUE if name is 0 else FALSE ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint8_t ++qla2x00_is_ww_name_zero(uint8_t *nn) ++{ ++ int cnt; ++ ++ /* Check for zero node name */ ++ for (cnt = 0; cnt < WWN_SIZE ; cnt++, nn++) { ++ if (*nn != 0) ++ break; ++ } ++ /* if zero return TRUE */ ++ if (cnt == WWN_SIZE) ++ return TRUE; ++ else ++ return FALSE; ++} ++ ++/* ++ * qla2x00_add_path ++ * Add a path to the pathlist ++ * ++ * Input: ++ * pathlist -- path list of paths ++ * path -- path to be added to list ++ * ++ * Returns: ++ * None ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_add_path( mp_path_list_t *pathlist, mp_path_t *path ) ++{ ++ mp_path_t *last = pathlist->last; ++ ++ ENTER("qla2x00_add_path"); ++ ++ DEBUG3(printk("%s: pathlist =%p, path =%p, cnt = %d\n", ++ __func__, pathlist, path, pathlist->path_cnt);) ++ if (last == NULL) { ++ last = path; ++ } else { ++ path->next = last->next; ++ } ++ ++ last->next = path; ++ pathlist->last = path; ++ pathlist->path_cnt++; ++ ++ LEAVE("qla2x00_add_path"); ++} ++ ++ ++/* ++ * qla2x00_is_portname_in_device ++ * Search for the specified "portname" in the device list. ++ * ++ * Input: ++ * dp = device pointer ++ * portname = portname to searched for in device ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++uint8_t ++qla2x00_is_portname_in_device(mp_device_t *dp, uint8_t *portname) ++{ ++ int idx; ++ ++ for (idx = 0; idx < MAX_PATHS_PER_DEVICE; idx++) { ++ if (memcmp(&dp->portnames[idx][0], portname, WWN_SIZE) == 0) ++ return TRUE; ++ } ++ return FALSE; ++} ++ ++ ++/* ++ * qla2x00_set_lun_data_from_bitmask ++ * Set or clear the LUN_DATA_ENABLED bits in the LUN_DATA from ++ * a LUN bitmask provided from the miniport driver. ++ * ++ * Inputs: ++ * lun_data = Extended LUN_DATA buffer to set. ++ * lun_mask = Pointer to lun bit mask union. ++ * ++ * Return Value: none. ++ */ ++void ++qla2x00_set_lun_data_from_bitmask(mp_lun_data_t *lun_data, ++ lun_bit_mask_t *lun_mask) ++{ ++ int16_t lun; ++ ++ ENTER("qla2x00_set_lun_data_from_bitmask"); ++ ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ /* our bit mask is inverted */ ++ if (!(EXT_IS_LUN_BIT_SET(lun_mask,lun))) ++ lun_data->data[lun] |= LUN_DATA_ENABLED; ++ else ++ lun_data->data[lun] &= ~LUN_DATA_ENABLED; ++ ++ DEBUG5(printk("%s: lun data[%d] = 0x%x\n", ++ __func__, lun, lun_data->data[lun]);) ++ } ++ ++ LEAVE("qla2x00_set_lun_data_from_bitmask"); ++ ++ return; ++} ++ ++static void ++qla2x00_failback_single_lun(mp_device_t *dp, uint8_t lun, uint8_t new) ++{ ++ mp_path_list_t *pathlist; ++ mp_path_t *new_path, *old_path; ++ uint8_t old; ++ mp_host_t *host; ++ os_lun_t *lq; ++ mp_path_t *vis_path; ++ mp_host_t *vis_host; ++ ++ /* Failback and update statistics. */ ++ if ((pathlist = dp->path_list) == NULL) ++ return; ++ ++ old = pathlist->current_path[lun]; ++ pathlist->current_path[lun] = new; ++ ++ if ((new_path = qla2x00_find_path_by_id(dp, new)) == NULL) ++ return; ++ if ((old_path = qla2x00_find_path_by_id(dp, old)) == NULL) ++ return; ++ ++ /* An fclun should exist for the failbacked lun */ ++ if (qla2x00_find_matching_lun(lun, new_path) == NULL) ++ return; ++ if (qla2x00_find_matching_lun(lun, old_path) == NULL) ++ return; ++ ++ /* Log to console and to event log. */ ++ printk(KERN_INFO ++ "qla2x00: FAILBACK device %d -> " ++ "%02x%02x%02x%02x%02x%02x%02x%02x LUN %02x\n", ++ dp->dev_id, ++ dp->nodename[0], dp->nodename[1], ++ dp->nodename[2], dp->nodename[3], ++ dp->nodename[4], dp->nodename[5], ++ dp->nodename[6], dp->nodename[7], ++ lun); ++ ++ printk(KERN_INFO ++ "qla2x00: FROM HBA %d to HBA %d \n", ++ old_path->host->instance, ++ new_path->host->instance); ++ ++ ++ /* Send a failover notification. */ ++#if 0 ++ qla2x00_send_failover_notify(dp, lun, new_path, old_path); ++#endif ++ ++ host = new_path->host; ++ ++ /* remap the lun */ ++ qla2x00_map_a_oslun(host, dp, dp->dev_id, lun); ++ ++ /* 7/16 ++ * Reset counts on the visible path ++ */ ++ if ((vis_path = qla2x00_get_visible_path(dp)) == NULL) { ++ printk(KERN_INFO ++ "qla2x00(%d): No visible path for " ++ "target %d, dp = %p\n", ++ host->instance, ++ dp->dev_id, dp); ++ return; ++ } ++ ++ vis_host = vis_path->host; ++ if ((lq = qla2x00_lun_alloc(vis_host->ha, dp->dev_id, lun)) != NULL) { ++ qla2x00_delay_lun(vis_host->ha, lq, recoveryTime); ++ qla2x00_flush_failover_q(vis_host->ha, lq); ++ qla2x00_reset_lun_fo_counts(vis_host->ha, lq); ++ } ++} ++ ++/* ++* qla2x00_failback_luns ++* This routine looks through the devices on an adapter, and ++* for each device that has this adapter as the visible path, ++* it forces that path to be the current path. This allows us ++* to keep some semblance of static load balancing even after ++* an adapter goes away and comes back. ++* ++* Arguments: ++* host Adapter that has just come back online. ++* ++* Return: ++* None. ++*/ ++static void ++qla2x00_failback_luns( mp_host_t *host) ++{ ++ uint16_t dev_no; ++ uint8_t l; ++ uint16_t lun; ++ int i; ++ mp_device_t *dp; ++ mp_path_list_t *path_list; ++ mp_path_t *path; ++ fc_lun_t *new_fp; ++ ++ ENTER("qla2x00_failback_luns"); ++ ++ for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) { ++ dp = host->mp_devs[dev_no]; ++ ++ if (dp == NULL) ++ continue; ++ ++ path_list = dp->path_list; ++ for (path = path_list->last, i= 0; ++ i < path_list->path_cnt; ++ i++, path = path->next) { ++ ++ if (path->host != host ) ++ continue; ++ ++ if (path->port == NULL) ++ continue; ++ ++ if (atomic_read(&path->port->state) == FC_DEVICE_DEAD) ++ continue; ++ ++ /* ++ * Failback all the paths for this host, ++ * the luns could be preferred across all paths ++ */ ++ DEBUG2(printk("%s(%d): Lun Data for device %p, " ++ "id=%d, path id=%d\n", ++ __func__, host->instance, dp, dp->dev_id, ++ path->id);) ++ DEBUG4(qla2x00_dump_buffer( ++ (char *)&path->lun_data.data[0], 64);) ++ DEBUG4(printk("%s(%d): Perferrred Path data:\n", ++ __func__, host->instance);) ++ DEBUG4(qla2x00_dump_buffer( ++ (char *)&path_list->current_path[0], 64);) ++ ++ for (lun = 0; lun < MAX_LUNS_PER_DEVICE; lun++) { ++ l = (uint8_t)(lun & 0xFF); ++ ++ /* ++ * if this is the preferred lun and not ++ * the current path then failback lun. ++ */ ++ DEBUG4(printk("%s: target=%d, cur path id =%d, " ++ "lun data[%d] = %d)\n", ++ __func__, dp->dev_id, path->id, ++ lun, path->lun_data.data[lun]);) ++ ++ if ((path->lun_data.data[l] & ++ LUN_DATA_PREFERRED_PATH) && ++ /* !path->relogin && */ ++ path_list->current_path[l] != ++ path->id) { ++ /* No point in failing back a ++ disconnected lun */ ++ new_fp = qla2x00_find_matching_lun( ++ l, path); ++ ++ if (new_fp == NULL) ++ continue; ++ if (new_fp->flags & FC_DISCON_LUN) ++ continue; ++ ++ qla2x00_failback_single_lun( ++ dp, l, path->id); ++ } ++ } ++ } ++ ++ } ++ ++ LEAVE("qla2x00_failback_luns"); ++ ++ return; ++} ++ ++/* ++ * qla2x00_setup_new_path ++ * Checks the path against the existing paths to see if there ++ * are any incompatibilities. It then checks and sets up the ++ * current path indices. ++ * ++ * Inputs: ++ * dp = pointer to device ++ * path = new path ++ * ++ * Returns: ++ * None ++ */ ++static void ++qla2x00_setup_new_path( mp_device_t *dp, mp_path_t *path) ++{ ++ mp_path_list_t *path_list = dp->path_list; ++ mp_path_t *tmp_path, *first_path; ++ mp_host_t *first_host; ++ mp_host_t *tmp_host; ++ ++ uint16_t lun; ++ uint8_t l; ++ int i; ++ ++ ENTER("qla2x00_setup_new_path"); ++ ++ /* If this is a visible path, and there is not already a ++ * visible path, save it as the visible path. If there ++ * is already a visible path, log an error and make this ++ * path invisible. ++ */ ++ if (!(path->mp_byte & (MP_MASK_HIDDEN | MP_MASK_UNCONFIGURED))) { ++ ++ /* No known visible path */ ++ if (path_list->visible == PATH_INDEX_INVALID) { ++ DEBUG3(printk("%s: No know visible path - make this " ++ "path visible\n", ++ __func__);) ++ ++ path_list->visible = path->id; ++ path->mp_byte &= ~MP_MASK_HIDDEN; ++ } else { ++ DEBUG3(printk("%s: Second visible path found- make " ++ "this one hidden\n", ++ __func__);) ++ ++ path->mp_byte |= MP_MASK_HIDDEN; ++ } ++ } ++ ++ /* ++ * If this is not the first path added, and the setting for ++ * MaxLunsPerTarget does not match that of the first path ++ * then disable qla_cfg for all adapters. ++ */ ++ first_path = qla2x00_find_path_by_id(dp, 0); ++ ++ if (first_path != NULL) { ++ first_host = first_path->host; ++ if ((path->id != 0) && ++ (first_host->MaxLunsPerTarget != ++ path->host->MaxLunsPerTarget)) { ++ ++ for (tmp_path = path_list->last, i = 0; ++ (tmp_path) && i <= path->id; i++) { ++ ++ tmp_host = tmp_path->host; ++ if (!(tmp_host->flags & ++ MP_HOST_FLAG_DISABLE)) { ++ ++ DEBUG4(printk("%s: 2nd visible " ++ "path (%p)\n", ++ __func__, tmp_host);) ++ ++ tmp_host->flags |= MP_HOST_FLAG_DISABLE; ++ } ++ } ++ } ++ } ++ ++ /* ++ * For each LUN, evaluate whether the new path that is added ++ * is better than the existing path. If it is, make it the ++ * current path for the LUN. ++ */ ++ for (lun = 0; lun < MAX_LUNS_PER_DEVICE; lun++) { ++ l = (uint8_t)(lun & 0xFF); ++ ++ /* If this is the first path added, it is the only ++ * available path, so make it the current path. ++ */ ++ ++ DEBUG4(printk("%s: lun_data 0x%x, LUN %d\n", ++ __func__, path->lun_data.data[l], lun);) ++ ++ if (first_path == path) { ++ path_list->current_path[l] = 0; ++ path->lun_data.data[l] |= LUN_DATA_PREFERRED_PATH; ++ } else if (path->lun_data.data[l] & LUN_DATA_PREFERRED_PATH) { ++ /* ++ * If this is not the first path added, if this is ++ * the preferred path, make it the current path. ++ */ ++ path_list->current_path[l] = path->id; ++ } ++ } ++ ++ LEAVE("qla2x00_setup_new_path"); ++ ++ return; ++} ++ ++/* ++ * qla2x00_cfg_mem_free ++ * Free all configuration structures. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++void ++qla2x00_cfg_mem_free(scsi_qla_host_t *ha) ++{ ++ mp_device_t *dp; ++ mp_path_list_t *path_list; ++ mp_path_t *tmp_path, *path; ++ mp_host_t *host, *temp; ++ int id, cnt; ++ ++ if ((host = qla2x00_cfg_find_host(ha)) != NULL) { ++ if( mp_num_hosts == 0 ) ++ return; ++ ++ for (id= 0; id < MAX_MP_DEVICES; id++) { ++ if ((dp = host->mp_devs[id]) == NULL) ++ continue; ++ if ((path_list = dp->path_list) == NULL) ++ continue; ++ if ((tmp_path = path_list->last) == NULL) ++ continue; ++ for (cnt = 0; cnt < path_list->path_cnt; cnt++) { ++ path = tmp_path; ++ tmp_path = tmp_path->next; ++ DEBUG(printk(KERN_INFO ++ "host%d - Removing path[%d] " ++ "= %p\n", ++ host->instance, ++ cnt, path);) ++ KMEM_FREE(path,sizeof(mp_path_t)); ++ } ++ KMEM_FREE(path_list, sizeof(mp_path_list_t)); ++ host->mp_devs[id] = NULL; ++ /* remove dp from other hosts */ ++ for (temp = mp_hosts_base; (temp); temp = temp->next) { ++ if (temp->mp_devs[id] == dp) { ++ DEBUG(printk(KERN_INFO ++ "host%d - Removing host[%d] = " ++ "%p\n", ++ host->instance, ++ temp->instance,temp);) ++ temp->mp_devs[id] = NULL; ++ } ++ } ++ KMEM_FREE(dp, sizeof(mp_device_t)); ++ } ++ ++ /* remove this host from host list */ ++ temp = mp_hosts_base; ++ if (temp != NULL) { ++ /* Remove from top of queue */ ++ if (temp == host) { ++ mp_hosts_base = host->next; ++ } else { ++ /* ++ * Remove from middle of queue ++ * or bottom of queue ++ */ ++ for (temp = mp_hosts_base; ++ temp != NULL; ++ temp = temp->next) { ++ ++ if (temp->next == host) { ++ temp->next = host->next; ++ break; ++ } ++ } ++ } ++ } ++ KMEM_FREE(host, sizeof(mp_host_t)); ++ mp_num_hosts--; ++ } ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_cfg.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,181 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++/* ++ * QLogic ISP2x00 Multi-path LUN Support ++ * Multi-path include file. ++ */ ++ ++#if !defined(_QLA_CFG_H) ++#define _QLA_CFG_H ++ ++#if defined(__cplusplus) ++extern "C" ++{ ++#endif ++ ++/* ++ * Failover definitions ++ */ ++#define FAILOVER_TYPE_COUNT 4 ++#define MP_NOTIFY_RESET_DETECTED 1 ++#define MP_NOTIFY_PWR_LOSS 2 ++#define MP_NOTIFY_LOOP_UP 3 ++#define MP_NOTIFY_LOOP_DOWN 4 ++#define MP_NOTIFY_BUS_RESET 5 ++#define FAILOVER_TYPE_ERROR_RETRY 1 ++#define MAX_NUMBER_PATHS FO_MAX_PATHS ++#define PORT_NAME_SIZE WWN_SIZE ++#define FAILOVER_NOTIFY_STATUS_ERROR QLA2X00_SUCCESS ++#define FAILOVER_NOTIFY_STATUS_SUCCESS QLA2X00_SUCCESS ++#define FAILOVER_NOTIFY_CDB_LENGTH_MAX FO_NOTIFY_CDB_LENGTH_MAX ++#define MAX_TARGETS_PER_DEVICE SDM_DEF_MAX_TARGETS_PER_DEVICE ++ ++/* ++ * Limits definitions. ++ */ ++#define MAX_LUNS_PER_DEVICE MAX_LUNS /* Maximum # of luns */ ++#define MAX_MP_DEVICES MAX_TARGETS /* Maximum # of virtual devs */ ++#define MAX_PATHS_PER_DEVICE 8 /* Maximum # of paths */ ++#if !defined(MAX_LUNS) ++#define MAX_LUNS 256 ++#endif ++#define MAX_HOSTS MAX_HOST_COUNT ++ ++/* Async notification types */ ++#define NOTIFY_EVENT_LINK_DOWN 1 /* Link went down */ ++#define NOTIFY_EVENT_LINK_UP 2 /* Link is back up */ ++#define NOTIFY_EVENT_RESET_DETECTED 3 /* Reset detected */ ++ ++/* MACROS */ ++#define qla2x00_is_portname_equal(N1,N2) \ ++ ((memcmp((N1),(N2),WWN_SIZE)==0?TRUE:FALSE)) ++#define qla2x00_is_nodename_equal(N1,N2) \ ++ ((memcmp((N1),(N2),WWN_SIZE)==0?TRUE:FALSE)) ++#if 0 ++#define qla2x00_allocate_path_list() \ ++ ((mp_path_list_t *)KMEM_ZALLOC(sizeof(mp_path_list_t))) ++#endif ++ ++/* ++ * Per-multipath driver parameters ++ */ ++typedef struct _mp_lun_data { ++ uint8_t data[MAX_LUNS]; ++#define LUN_DATA_ENABLED BIT_7 ++#define LUN_DATA_PREFERRED_PATH BIT_6 ++} ++mp_lun_data_t; ++ ++ ++#define PATH_INDEX_INVALID 0xff ++ ++/* ++ * Per-device collection of all paths. ++ */ ++typedef struct _mp_path_list { ++ struct _mp_path *last; /* ptrs to end of circular list of paths */ ++ uint8_t path_cnt; /* number of paths */ ++ uint8_t visible; /* visible path */ ++ uint16_t reserved1; /* Memory alignment */ ++ uint32_t reserved2; /* Memory alignment */ ++ uint8_t current_path[ MAX_LUNS_PER_DEVICE ]; /* current path for a given lun */ ++ uint16_t failover_cnt[ FAILOVER_TYPE_COUNT ]; ++} ++mp_path_list_t; ++ ++/* ++ * Definitions for failover notify SRBs. These SRBs contain failover notify ++ * CDBs to notify a target that a failover has occurred. ++ * ++ */ ++typedef struct _failover_notify_srb { ++ srb_t *srb; ++ uint16_t status; ++ uint16_t reserved; ++} ++failover_notify_srb_t; ++ ++/* ++ * Per-device multipath control data. ++ */ ++typedef struct _mp_device { ++ mp_path_list_t *path_list; /* Path list for device. */ ++ int dev_id; ++ int use_cnt; /* number of users */ ++ uint8_t nodename[WWN_SIZE]; /* World-wide node name. */ ++ /* World-wide port names. */ ++ uint8_t portnames[MAX_PATHS_PER_DEVICE][WWN_SIZE]; ++} ++mp_device_t; ++ ++/* ++ * Per-adapter multipath Host ++ */ ++typedef struct _mp_host { ++ struct _mp_host *next; /* ptr to next host adapter in list */ ++ scsi_qla_host_t *ha; /* ptr to lower-level driver adapter struct */ ++ int instance; /* OS instance number */ ++ struct list_head *fcports; /* Port chain for this adapter */ ++ mp_device_t *mp_devs[MAX_MP_DEVICES]; /* Multipath devices */ ++ ++ uint32_t flags; ++#define MP_HOST_FLAG_NEEDS_UPDATE BIT_0 /* Need to update device data. */ ++#define MP_HOST_FLAG_FO_ENABLED BIT_1 /* Failover enabled for this host */ ++#define MP_HOST_FLAG_DISABLE BIT_2 /* Bypass qla_cfg. */ ++#define MP_HOST_FLAG_LUN_FO_ENABLED BIT_3 /* lun Failover enabled */ ++ ++ uint8_t nodename[WWN_SIZE]; ++ uint8_t portname[WWN_SIZE]; ++ uint16_t MaxLunsPerTarget; ++ ++ uint16_t relogin_countdown; ++} ++mp_host_t; ++ ++/* ++ * Describes path a single. ++ */ ++typedef struct _mp_path { ++ struct _mp_path *next; /* next path in list */ ++ struct _mp_host *host; /* Pointer to adapter */ ++ fc_port_t *port; /* FC port info */ ++ uint16_t id; /* Path id (index) */ ++ uint8_t mp_byte; /* Multipath control byte */ ++#define MP_MASK_HIDDEN 0x80 ++#define MP_MASK_UNCONFIGURED 0x40 ++#define MP_MASK_PRIORITY 0x07 ++ ++ uint8_t relogin; /* Need to relogin to port */ ++ uint8_t config; /* User configured path */ ++ uint8_t reserved[3]; ++ mp_lun_data_t lun_data; /* Lun data information */ ++ uint8_t portname[WWN_SIZE]; /* Port name of this target. */ ++} ++mp_path_t; ++ ++/* ++ * Failover notification requests from host driver. ++ */ ++typedef struct failover_notify_entry { ++ struct scsi_address *os_addr; ++} ++failover_notify_t; ++ ++#endif /* _QLA_CFG_H */ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_cfgln.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,726 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++/* ++ * QLogic ISP2x00 Multi-path LUN Support Driver ++ * Solaris specific functions ++ * ++ */ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++#include "qlfo.h" ++ ++#define MAX_SEARCH_STR_SIZE 512 ++ ++/* ++ * qla2x00_set_lun_data_from_config ++ * Set lun_data byte from the configuration parameters. ++ * ++ * Input: ++ * host -- pointer to host adapter structure. ++ * port -- pointer to port ++ * tgt -- target number ++ * dev_no -- device number ++ */ ++void ++qla2x00_set_lun_data_from_config(mp_host_t *host, fc_port_t *port, ++ uint16_t tgt, uint16_t dev_no) ++{ ++ char *propbuf; /* As big as largest search string */ ++ int rval; ++ int16_t lun, l; ++ scsi_qla_host_t *ha = host->ha; ++ mp_device_t *dp; ++ lun_bit_mask_t *plun_mask; ++ lun_bit_mask_t *mask_ptr; ++ mp_path_list_t *pathlist; ++#if 0 ++ uint8_t control_byte; ++#endif ++ ++ mp_path_t *path; ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&propbuf, ++ MAX_SEARCH_STR_SIZE)) { ++ /* not enough memory */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "propbuf requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ MAX_SEARCH_STR_SIZE);) ++ return; ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&plun_mask, ++ sizeof(lun_bit_mask_t))) { ++ /* not enough memory */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "lun_mask requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(lun_bit_mask_t));) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ mask_ptr = plun_mask; ++ ++ dp = host->mp_devs[tgt]; ++ if (dp == NULL) { ++ printk("qla2x00_set_lun_data_from_config: Target %d " ++ "not found for hba %d\n",tgt, host->instance); ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ if ( (pathlist = dp->path_list) == NULL ) { ++ printk("qla2x00_set_lun_data_from_config: path list " ++ "not found for target %d\n", tgt); ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ ++ if ((path = qla2x00_find_path_by_name(host, pathlist, ++ port->port_name)) == NULL ) { ++ printk("qla2x00_set_lun_data_from_config: No path found " ++ "for target %d\n", tgt); ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ ++ /* clear port information */ ++ path->port = NULL; ++ ++#if 0 ++ /* 02/06/01 - move to build path tree */ ++ /* ++ * Get "target-N-device-N-control" if property is present then all ++ * luns are visible. ++ */ ++ sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-control", ++ host->instance, tgt, dev_no); ++ DEBUG3(printk("build_tree: %s\n",propbuf);) ++ rval = qla2x00_get_prop_xstr(ha, propbuf, ++ (uint8_t *)(&control_byte), sizeof(control_byte)); ++ if (rval != -1) { ++ if (!((control_byte & MP_MASK_HIDDEN) || ++ (control_byte & MP_MASK_UNCONFIGURED))) { ++ pathlist->visible = path->id; ++ DEBUG(printk("qla2x00_set_lun_data_from_config: " ++ "found visible path id %d hba %d\n", ++ path->id, host->instance);) ++ } else { ++ pathlist->visible = PATH_INDEX_INVALID; /* 01/30 */ ++ DEBUG(printk("qla2x00_set_lun_data_from_config: " ++ "found hidden path id %d hba %d\n", ++ path->id, host->instance);) ++ } ++ path->mp_byte = control_byte; ++ DEBUG(printk("qla2x00_set_lun_data_from_config: " ++ "control byte 0x%x for path id %d hba %d\n", ++ path->mp_byte, path->id, host->instance);) ++ } ++#endif ++ ++ /* Get "target-N-device-N-preferred" as a 256 bit lun_mask*/ ++ sprintf(propbuf, "scsi-qla%ld-tgt-%d-di-%d-preferred", ++ ha->instance, tgt, dev_no); ++ DEBUG2(printk("build_tree: %s\n",propbuf);) ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, ++ (uint8_t *)(plun_mask), sizeof(lun_bit_mask_t)); ++ ++ if (rval == -1) { ++ /* EMPTY */ ++ DEBUG2(printk("qla2x00_set_lun_data_from_config: " ++ "NO Preferred mask - ret %d\n", rval);) ++ } else { ++ if (rval != sizeof(lun_bit_mask_t)) { ++ /* EMPTY */ ++ printk("qla2x00_set_lun_data_from_config: " ++ "Preferred mask len %d is incorrect.\n", rval); ++ } ++ ++ DEBUG3(printk("qla2x00_set_lun_data_from_config: " ++ "Preferred mask read:\n");) ++ DEBUG3(qla2x00_dump_buffer((char *)plun_mask, ++ sizeof(lun_bit_mask_t));) ++ ++ for (lun = MAX_LUNS-1, l =0; lun >= 0; lun--, l++ ) { ++ if (EXT_IS_LUN_BIT_SET(mask_ptr, lun)) { ++ path->lun_data.data[l] |= ++ LUN_DATA_PREFERRED_PATH; ++ pathlist->current_path[l] = path->id; ++ } else { ++ path->lun_data.data[l] &= ++ ~LUN_DATA_PREFERRED_PATH; ++ } ++ } ++ ++ } ++ ++ /* Get "target-N-device-N-lun-disable" as a 256 bit lun_mask*/ ++ sprintf(propbuf, "scsi-qla%ld-tgt-%d-di-%d-lun-disabled", ++ ha->instance, tgt, dev_no); ++ DEBUG3(printk("build_tree: %s\n",propbuf);) ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, ++ (uint8_t *)plun_mask, sizeof(lun_bit_mask_t)); ++ if (rval == -1) { ++ /* default: all luns enabled */ ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ path->lun_data.data[lun] |= LUN_DATA_ENABLED; ++ } ++ } else { ++ if (rval != sizeof(lun_bit_mask_t)) { ++ printk("qla2x00_set_lun_data_from_config: Enable " ++ "mask has wrong size %d != %d\n", ++ rval, (int)sizeof(lun_bit_mask_t)); ++ } else { ++ for (lun = MAX_LUNS-1, l =0; lun >= 0; lun--, l++) { ++ /* our bit mask is inverted */ ++ if (!EXT_IS_LUN_BIT_SET(mask_ptr,lun)) ++ path->lun_data.data[l] |= ++ LUN_DATA_ENABLED; ++ else ++ path->lun_data.data[l] &= ++ ~LUN_DATA_ENABLED; ++ } ++ } ++ } ++ ++ DEBUG3(printk("qla2x00_set_lun_data_from_config: Luns data for " ++ "device %p, instance %d, path id=%d\n", ++ dp,host->instance,path->id);) ++ DEBUG3(qla2x00_dump_buffer((char *)&path->lun_data.data[0], 64);) ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ LEAVE("qla2x00_set_lun_data_from_config"); ++} ++ ++ ++ ++/* ++ * qla2x00_cfg_build_path_tree ++ * Find all path properties and build a path tree. The ++ * resulting tree has no actual port assigned to it ++ * until the port discovery is done by the lower level. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++void ++qla2x00_cfg_build_path_tree(scsi_qla_host_t *ha) ++{ ++ char *propbuf; ++ uint8_t node_name[WWN_SIZE]; ++ uint8_t port_name[WWN_SIZE]; ++ fc_port_t *port; ++ uint16_t dev_no = 0, tgt_no; ++ int instance, rval; ++ mp_host_t *host = NULL; ++ uint8_t *name; ++ int done; ++ uint8_t control_byte; ++ ++ ++ ENTER("qla2x00_cfg_build_path_tree"); ++ ++ printk(KERN_INFO ++ "qla02%d: ConfigRequired is set. \n", (int)ha->instance); ++ DEBUG(printk("qla2x00_cfg_build_path_tree: hba =%d", ++ (int)ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&propbuf, ++ MAX_SEARCH_STR_SIZE)) { ++ /* not enough memory */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "propbuf requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ MAX_SEARCH_STR_SIZE);) ++ return; ++ } ++ ++ /* Look for adapter nodename in properties */ ++ sprintf(propbuf, "scsi-qla%ld-adapter-port", ha->instance); ++ DEBUG(printk("build_tree: %s\n",propbuf);) ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, port_name, WWN_SIZE); ++ if (rval != WWN_SIZE) { ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ ++ /* Does nodename match the host adapter nodename? */ ++ name = &ha->init_cb->port_name[0]; ++ if (!qla2x00_is_nodename_equal(name, port_name)) { ++ printk(KERN_INFO ++ "scsi(%d): Adapter nodenames don't match - ha = %p.\n", ++ (int)ha->instance,ha); ++ DEBUG(printk("qla(%d): Adapter nodenames don't match - " ++ "ha = %p.\n", ++ (int)ha->instance,ha);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ ++ instance = ha->instance; ++ if ((host = qla2x00_alloc_host(ha)) == NULL) { ++ printk(KERN_INFO ++ "scsi(%d): Couldn't allocate host - ha = %p.\n", ++ (int)instance,ha); ++ } else { ++ /* create a dummy port */ ++ port = (fc_port_t *)KMEM_ZALLOC(sizeof (fc_port_t),9); ++ if (port == NULL) { ++ printk(KERN_INFO ++ "scsi(%d): Couldn't allocate port.\n", ++ (int)instance); ++ DEBUG(printk("qla(%d): Couldn't allocate port.\n", ++ (int)host->instance);) ++ /* remove host */ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return; ++ } ++ ++ done = 0; ++ ++ /* For each target on the host bus adapter */ ++ for (tgt_no = 0; tgt_no < MAX_MP_DEVICES && ++ !done; tgt_no++) { ++ ++ /* get all paths for this target */ ++ for (dev_no = 0; dev_no < MAX_PATHS_PER_DEVICE && ++ !done ; dev_no++) { ++ ++ /* ++ * O(N*M) scan, should ideally check if there ++ * are any tgt entries present, if not, then ++ * continue. ++ * ++ * sprintf(propbuf, ++ * "scsi-qla%d-tgt-%d-", ++ * instance, tgt_no); ++ * if (strstr(ha->cmdline, propbuf) == NULL) ++ * continue; ++ * ++ */ ++ memset(port, 0, sizeof (fc_port_t)); ++ ++ /* ++ * Get "target-N-device-N-node" is a 16-chars ++ * number ++ */ ++ sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-node", ++ instance, tgt_no, dev_no); ++ DEBUG(printk("build_tree: %s\n",propbuf);) ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, ++ node_name, WWN_SIZE); ++ if (rval != WWN_SIZE) ++ continue; ++ ++ memcpy(port->node_name, node_name, WWN_SIZE); ++ ++ /* ++ * Get "target-N-device-N-port" is a 16-chars ++ * number ++ */ ++ sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-port", ++ instance, tgt_no, dev_no); ++ DEBUG(printk("build_tree: %s\n",propbuf);) ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, ++ port_name, WWN_SIZE); ++ if (rval != WWN_SIZE) ++ continue; ++ ++ memcpy(port->node_name, node_name, WWN_SIZE); ++ memcpy(port->port_name, port_name, WWN_SIZE); ++ port->flags |= FC_CONFIG; ++ ++ /* ++ * Get "target-N-device-N-control" if property ++ * is present then all luns are visible. ++ */ ++ sprintf(propbuf, ++ "scsi-qla%d-tgt-%d-di-%d-control", ++ instance, tgt_no, dev_no); ++ DEBUG3(printk("build_tree: %s\n",propbuf);) ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, ++ (uint8_t *)(&control_byte), ++ sizeof(control_byte)); ++ if (rval == -1) { ++ /* error getting string. go to next. */ ++ continue; ++ } ++ ++ DEBUG(printk("build_tree: control byte 0x%x\n", ++ control_byte);) ++ ++ port->mp_byte = control_byte; ++ DEBUG(printk("build_tree: update_mp_device " ++ "host=%p, port=%p, tgt_no=%d\n", ++ host, port, tgt_no);) ++ ++ qla2x00_update_mp_device(host, port, tgt_no); ++ qla2x00_set_lun_data_from_config(host, ++ port, tgt_no, dev_no); ++ } ++ } ++ KMEM_FREE(port, sizeof (fc_port_t)); ++ } ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ LEAVE("qla2x00_cfg_build_path_tree"); ++ DEBUG(printk("Leaving: qla2x00_cfg_build_path_tree\n");) ++} ++ ++/* ++ * qla2x00_cfg_display_devices ++ * This routine will the node names of the different devices found ++ * after port inquiry. ++ * ++ * Input: ++ * ++ * Returns: ++ * None. ++ */ ++void qla2x00_cfg_display_devices(void) ++{ ++ mp_host_t *host; ++ int id; ++ mp_device_t *dp; ++ mp_path_t *path; ++ mp_path_list_t *path_list; ++ int cnt, i, dev_no; ++ int instance; ++ lun_bit_mask_t lun_mask; ++ int mask_set; ++ uint8_t l; ++ ++ printk("qla2x00_cfg_display_devices\n"); ++ for (host = mp_hosts_base; (host); host = host->next) { ++ ++ instance = (int) host->instance; ++ /* Display the node name for adapter */ ++ printk(KERN_INFO ++ "scsi-qla%d-adapter-port=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x\\;\n", ++ instance, ++ host->portname[0], ++ host->portname[1], ++ host->portname[2], ++ host->portname[3], ++ host->portname[4], ++ host->portname[5], ++ host->portname[6], ++ host->portname[7]); ++ ++ for (id = 0; id < MAX_MP_DEVICES; id++) { ++ if( (dp = host->mp_devs[id] ) == NULL ) ++ continue; ++ ++ path_list = dp->path_list; ++ ++ ++ if( (path = path_list->last) != NULL ) { ++ /* Print out device port names */ ++ path = path->next; /* first path */ ++ for (dev_no = 0, cnt = 0; ++ cnt < path_list->path_cnt; ++ path = path->next, cnt++) { ++ ++ /* skip others if not our host */ ++ if (host != path->host) ++ continue; ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-%d-node=" ++ "%02x%02x%02x%02x" ++ "%02x%02x%02x%02x\\;\n", ++ instance, id, path->id, ++ dp->nodename[0], ++ dp->nodename[1], ++ dp->nodename[2], ++ dp->nodename[3], ++ dp->nodename[4], ++ dp->nodename[5], ++ dp->nodename[6], ++ dp->nodename[7]); ++ ++ /* port_name */ ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-%d-port=" ++ "%02x%02x%02x%02x" ++ "%02x%02x%02x%02x\\;\n", ++ instance, id, path->id, ++ path->portname[0], ++ path->portname[1], ++ path->portname[2], ++ path->portname[3], ++ path->portname[4], ++ path->portname[5], ++ path->portname[6], ++ path->portname[7]); ++ ++ /* control byte */ ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-%d-" ++ "control=%02x\\;\n", ++ instance, id, path->id, ++ path->mp_byte); ++ ++ /* ++ * Build preferred bit mask for this ++ * path */ ++ memset(&lun_mask, 0, sizeof(lun_mask)); ++ mask_set = 0; ++ for (i = 0; i < MAX_LUNS; i++) { ++ l = (uint8_t)(i & 0xFF); ++ if (path_list->current_path[l] == path->id ) { ++ EXT_SET_LUN_BIT((&lun_mask),l); ++ mask_set++; ++ } ++ } ++ if (mask_set) { ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-%d-preferred=%08x%08x%08x%08x%08x%08x%08x%08x\\;\n", ++ instance, id, path->id, ++ *((uint32_t *) &lun_mask.mask[28]), ++ *((uint32_t *) &lun_mask.mask[24]), ++ *((uint32_t *) &lun_mask.mask[20]), ++ *((uint32_t *) &lun_mask.mask[16]), ++ *((uint32_t *) &lun_mask.mask[12]), ++ *((uint32_t *) &lun_mask.mask[8]), ++ *((uint32_t *) &lun_mask.mask[4]), ++ *((uint32_t *) &lun_mask.mask[0]) ); ++ } ++ /* ++ * Build disable bit mask for this path ++ */ ++ mask_set = 0; ++ for (i = 0; i < MAX_LUNS; i++) { ++ l = (uint8_t)(i & 0xFF); ++ if (!(path->lun_data.data[l] & ++ LUN_DATA_ENABLED) ) { ++ ++ mask_set++; ++ } ++ } ++ if (mask_set) { ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-%d-lun-disable=%08x%08x%08x%08x%08x%08x%08x%08x\\;\n", ++ instance, id, path->id, ++ *((uint32_t *) &lun_mask.mask[28]), ++ *((uint32_t *) &lun_mask.mask[24]), ++ *((uint32_t *) &lun_mask.mask[20]), ++ *((uint32_t *) &lun_mask.mask[16]), ++ *((uint32_t *) &lun_mask.mask[12]), ++ *((uint32_t *) &lun_mask.mask[8]), ++ *((uint32_t *) &lun_mask.mask[4]), ++ *((uint32_t *) &lun_mask.mask[0]) ); ++ } ++ dev_no++; ++ } ++ ++ } ++ } ++ } ++} ++ ++#if 0 ++int qla2x00_cfg_build_range( mp_path_t *path, uint8_t *buf, int siz, uint8_t mask ) ++{ ++ int i; ++ int max, min; ++ int colonflg = FALSE; ++ int len = 0; ++ ++ max = -1; ++ min = 0; ++ for (i = 0; i < MAX_LUNS; i++) { ++ if( (path->lun_data.data[i] & mask) ) { ++ max = i; ++ } else { ++ if( colonflg && max >= min ) { ++ len += sprintf(&buf[len],":"); ++ if( len > siz) ++ return len; ++ colonflg = FALSE; ++ } ++ if (max > min ) { ++ len += sprintf(&buf[len],"%02x-%02x",min,max); ++ if( len > siz) ++ return len; ++ colonflg = TRUE; ++ } else if ( max == min ) { ++ len += sprintf(&buf[len],"%02x",max); ++ if( len > siz) ++ return len; ++ colonflg = TRUE; ++ } ++ min = i + 1; ++ max = i; ++ } ++ } ++ DEBUG4(printk("build_range: return len =%d\n",len);) ++ return(len); ++} ++#endif ++ ++#if 0 ++/* ++ * qla2x00_cfg_proc_display_devices ++ * This routine will the node names of the different devices found ++ * after port inquiry. ++ * ++ * Input: ++ * ++ * Returns: ++ * None. ++ */ ++int qla2x00_cfg_proc_display_devices(scsi_qla_host_t *ha) ++{ ++ mp_host_t *host; ++ int id; ++ mp_device_t *dp; ++ mp_path_t *path; ++ mp_path_list_t *path_list; ++ int cnt, i; ++ int instance; ++ lun_bit_mask_t lun_mask; ++ int mask_set; ++ uint8_t l; ++ fc_port_t *port; ++ int len = 0; ++ ++ for (host = mp_hosts_base; (host); host = host->next) { ++ ++ if( host->ha != ha ) ++ continue; ++ ++ instance = (int) host->instance; ++ ++ /* Display the node name for adapter */ ++ len += sprintf(PROC_BUF, ++ "scsi-qla%d-adapter-node=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ instance, ++ host->nodename[0], ++ host->nodename[1], ++ host->nodename[2], ++ host->nodename[3], ++ host->nodename[4], ++ host->nodename[5], ++ host->nodename[6], ++ host->nodename[7]); ++ ++ ++ for (id = 0; id < MAX_MP_DEVICES; id++) { ++ if( (dp = host->mp_devs[id] ) == NULL ) ++ continue; ++ ++ path_list = dp->path_list; ++ ++ if( (path = path_list->last) != NULL ) { ++ /* Print out device port names */ ++ path = path->next; /* first path */ ++ for (cnt = 0; cnt < path_list->path_cnt; path = path->next, cnt++) { ++ /* skip others if not our host */ ++ if (host != path->host) ++ continue; ++ len += sprintf(PROC_BUF, ++ "scsi-qla%d-target-%d-path-%d-node=%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ instance, id, path->id, ++ dp->nodename[0], ++ dp->nodename[1], ++ dp->nodename[2], ++ dp->nodename[3], ++ dp->nodename[4], ++ dp->nodename[5], ++ dp->nodename[6], ++ dp->nodename[7]); ++ ++ /* port_name */ ++ len += sprintf(PROC_BUF, ++ "scsi-qla%d-target-%d-path-%d-port=%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ instance, id, path->id, ++ path->portname[0], ++ path->portname[1], ++ path->portname[2], ++ path->portname[3], ++ path->portname[4], ++ path->portname[5], ++ path->portname[6], ++ path->portname[7]); ++ ++ if( path_list->visible == path->id ) { ++ len += sprintf(PROC_BUF, "scsi-qla%d-target-%d-path-%d-visible=%02x;\n", ++ instance, id, path->id, path->id); ++ } ++ ++ len +=sprintf(PROC_BUF, "scsi-qla%d-target-%d-path-%d-control=%02x;\n", ++ instance, id, path->id, path->mp_byte); ++ ++ /* Build preferred bit mask for this path */ ++ memset(&lun_mask, 0, sizeof(lun_mask)); ++ mask_set = 0; ++ for (i = 0; i < MAX_LUNS_PER_DEVICE; i++) { ++ l = (uint8_t)(i & 0xFF); ++ if( path_list->current_path[l] == path->id ) { ++ EXT_SET_LUN_BIT((&lun_mask),l); ++ mask_set++; ++ } ++ } ++ if( mask_set && EXT_DEF_MAX_LUNS <= 256 ) { ++ len += sprintf(PROC_BUF, ++ "scsi-qla%d-target-%d-path-%d-preferred=%08x%08x%08x%08x%08x%08x%08x%08x;\n", ++ instance, id, path->id, ++ *((uint32_t *) &lun_mask.mask[0]), ++ *((uint32_t *) &lun_mask.mask[4]), ++ *((uint32_t *) &lun_mask.mask[8]), ++ *((uint32_t *) &lun_mask.mask[12]), ++ *((uint32_t *) &lun_mask.mask[16]), ++ *((uint32_t *) &lun_mask.mask[20]), ++ *((uint32_t *) &lun_mask.mask[24]), ++ *((uint32_t *) &lun_mask.mask[28]) ); ++ } ++ ++ len += sprintf(PROC_BUF, ++ "scsi-qla%d-target-%d-path-%d-lun-enable=%08x%08x%08x%08x%08x%08x%08x%08x;\n", ++ instance, id, path->id, ++ *((uint32_t *) &path->lun_data.data[0]), ++ *((uint32_t *) &path->lun_data.data[4]), ++ *((uint32_t *) &path->lun_data.data[8]), ++ *((uint32_t *) &path->lun_data.data[12]), ++ *((uint32_t *) &path->lun_data.data[16]), ++ *((uint32_t *) &path->lun_data.data[20]), ++ *((uint32_t *) &path->lun_data.data[24]), ++ *((uint32_t *) &path->lun_data.data[28]) ); ++ ++ } /* for */ ++ } ++ } ++ } ++ return( len ); ++} ++#endif +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_dbg.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,1000 @@ ++/* ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ */ ++#include "qla_os.h" ++ ++#include "qla_def.h" ++ ++ ++#if defined(ISP2300) ++/** ++ * qla2x00_fw_dump() - Dumps binary data from the 2300 firmware. ++ * @ha: SCSI driver HA context ++ * @hardware_locked: Called with the hardware_lock ++ */ ++void ++qla2x00_dump_isp(scsi_qla_host_t *ha, int hardware_locked) ++{ ++ int rval; ++ uint32_t i; ++ uint32_t cnt, timer; ++ uint32_t risc_address; ++ uint16_t risc_code_size; ++ uint16_t mb0, mb2; ++ ++ uint16_t data, stat; ++ device_reg_t *reg; ++ uint16_t *dmp_reg; ++ unsigned long flags; ++ ++ ++ reg = ha->iobase; ++ flags = 0; ++ ++ if (!hardware_locked) ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ printk("\n\n[==>BEG]\n"); ++ ++ printk("HCCR Register:\n"); ++ printk("%04x\n\n", RD_REG_WORD(®->hccr)); ++ ++ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); ++ SYS_DELAY(100); ++ ++ printk("PBIU Registers:\n"); ++ dmp_reg = (uint16_t *)(reg + 0); ++ for (i = 0; i < 8; i++) ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ ++ printk("\n\n"); ++ ++ printk("ReqQ-RspQ-Risc2Host Status registers:\n"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x10); ++ for (i = 0; i < 8; i++) ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ ++ printk("\n\n"); ++ ++ printk("Mailbox Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x40); ++ for (i = 0; i < 32; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x40); ++ printk("Auto Request Response DMA Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 32; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x50); ++ printk("DMA Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 48; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x00); ++ printk("RISC Hardware Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0xA0); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2000); ++ printk("RISC GP0 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2200); ++ printk("RISC GP1 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2400); ++ printk("RISC GP2 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2600); ++ printk("RISC GP3 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2800); ++ printk("RISC GP4 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2A00); ++ printk("RISC GP5 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2C00); ++ printk("RISC GP6 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2E00); ++ printk("RISC GP7 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x10); ++ printk("Frame Buffer Hardware Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 64; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x20); ++ printk("FPM B0 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 64; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x30); ++ printk("FPM B1 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 64; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); ++ ++ data = RD_REG_WORD(®->ctrl_status); ++ for (i = 6000000; i && data & CSR_ISP_SOFT_RESET; i--) { ++ SYS_DELAY(5); ++ data = RD_REG_WORD(®->ctrl_status); ++ } ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ SYS_DELAY(10); ++ } else { ++ data = RD_REG_WORD(®->mailbox0); ++ for (i = 6000000; i && data == MBS_BUSY; i--) { ++ SYS_DELAY(5); ++ data = RD_REG_WORD(®->mailbox0); ++ } ++ } ++ ++ rval = QLA2X00_SUCCESS; ++ mb0 = mb2 = 0; ++ printk("Code RAM Dump:"); ++ risc_address = 0x800; ++ risc_code_size = 0xffff - 0x800 + 1; ++ WRT_REG_WORD(®->mailbox0, MBC_READ_RAM_WORD); ++ clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ for (cnt = 0; cnt < risc_code_size && rval == QLA2X00_SUCCESS; cnt++) { ++ if ((cnt % 8) == 0) ++ printk("\n%04x: ", cnt + 0x0800); ++ WRT_REG_WORD(®->mailbox1, (uint16_t)risc_address++); ++ WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); ++ ++ for (timer = 6000000; timer != 0; timer--) { ++ /* Check for pending interrupts. */ ++ if ((stat = RD_REG_WORD(®->host_status_lo)) & HSR_INT) { ++ stat &= 0xff; ++ ++ if (stat == 0x1 || stat == 0x2) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ /* Release mailbox registers. */ ++ WRT_REG_WORD(®->semaphore, 0); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } else if (stat == 0x10 || stat == 0x11) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } ++ ++ /* clear this intr; it wasn't a mailbox intr */ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ } ++ ++ mdelay(5); ++ } ++ ++ if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { ++ rval = mb0 & MBS_MASK; ++ printk("%04x ", mb2); ++ } else { ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ } ++ ++ printk("\n\n"); ++ ++ mb0 = mb2 = 0; ++ printk("Stack RAM Dump:"); ++ risc_address = 0x10000; ++ risc_code_size = 0x107ff - 0x10000 + 1; ++ WRT_REG_WORD(®->mailbox0, 0xf /* MBC_READ_RAM_EXTENDED */); ++ clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ for (cnt = 0; cnt < risc_code_size && rval == QLA2X00_SUCCESS; cnt++) { ++ if ((cnt % 8) == 0) ++ printk("\n%05x: ", cnt + 0x10000); ++ WRT_REG_WORD(®->mailbox1, LSW(risc_address)); ++ WRT_REG_WORD(®->mailbox8, MSW(risc_address++)); ++ WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); ++ ++ for (timer = 6000000; timer != 0; timer--) { ++ /* Check for pending interrupts. */ ++ if ((stat = RD_REG_WORD(®->host_status_lo)) & HSR_INT) { ++ stat &= 0xff; ++ ++ if (stat == 0x1 || stat == 0x2) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ /* Release mailbox registers. */ ++ WRT_REG_WORD(®->semaphore, 0); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } else if (stat == 0x10 || stat == 0x11) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } ++ ++ /* clear this intr; it wasn't a mailbox intr */ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ } ++ ++ mdelay(5); ++ } ++ ++ if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { ++ rval = mb0 & MBS_MASK; ++ printk("%04x ", mb2); ++ } else { ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ } ++ ++ printk("\n\n"); ++ ++ mb0 = mb2 = 0; ++ printk("Data RAM Dump:"); ++ risc_address = 0x10800; ++ risc_code_size = 0x1ffff - 0x10800 + 1; ++ WRT_REG_WORD(®->mailbox0, 0xf /* MBC_READ_RAM_EXTENDED */); ++ clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ for (cnt = 0; cnt < risc_code_size && rval == QLA2X00_SUCCESS; cnt++) { ++ if ((cnt % 8) == 0) ++ printk("\n%05x: ", cnt + 0x10800); ++ WRT_REG_WORD(®->mailbox1, LSW(risc_address)); ++ WRT_REG_WORD(®->mailbox8, MSW(risc_address++)); ++ WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); ++ ++ for (timer = 6000000; timer != 0; timer--) { ++ /* Check for pending interrupts. */ ++ if ((stat = RD_REG_WORD(®->host_status_lo)) & HSR_INT) { ++ stat &= 0xff; ++ ++ if (stat == 0x1 || stat == 0x2) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ /* Release mailbox registers. */ ++ WRT_REG_WORD(®->semaphore, 0); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } else if (stat == 0x10 || stat == 0x11) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } ++ ++ /* clear this intr; it wasn't a mailbox intr */ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ } ++ ++ mdelay(5); ++ } ++ ++ if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { ++ rval = mb0 & MBS_MASK; ++ printk("%04x ", mb2); ++ } else { ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ } ++ ++ printk("\n[<==END] ISP DEBUG DUMP\n"); ++ ++ if (!hardware_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++} ++ ++#elif defined(ISP2200) ++ ++/** ++ * qla2x00_fw_dump() - Dumps binary data from the 2200 firmware. ++ * @ha: SCSI driver HA context ++ * @hardware_locked: Called with the hardware_lock ++ */ ++void ++qla2x00_dump_isp(scsi_qla_host_t *ha, int hardware_locked) ++{ ++ int rval; ++ uint32_t i; ++ uint32_t cnt, timer; ++ uint32_t risc_address; ++ uint16_t risc_code_size; ++ uint16_t mb0, mb2; ++ ++ uint16_t data, stat; ++ device_reg_t *reg; ++ uint16_t *dmp_reg; ++ unsigned long flags; ++ ++ ++ reg = ha->iobase; ++ flags = 0; ++ ++ if (!hardware_locked) ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ printk("\n\n[==>BEG]\n"); ++ ++ printk("HCCR Register:\n"); ++ printk("%04x\n\n", RD_REG_WORD(®->hccr)); ++ ++ /* Pause RISC. */ ++ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); ++ for (cnt = 30000; cnt; cnt--) { ++ if ((RD_REG_WORD(®->hccr) & HCCR_RISC_PAUSE) != 0) ++ break; ++ SYS_DELAY(10); ++ } ++ if (!cnt) ++ goto done; ++ ++ printk("PBIU Registers:\n"); ++ dmp_reg = (uint16_t *)(reg + 0); ++ for (i = 0; i < 8; i++) ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ ++ printk("\n\n"); ++ ++ printk("Mailbox Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x10); ++ for (i = 0; i < 32; i++) { ++ if (i == 8) ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0xe0); ++ ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ printk("DMA Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x20); ++ for (i = 0; i < 48; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x00); ++ printk("RISC Hardware Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0xA0); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2000); ++ printk("RISC GP0 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2100); ++ printk("RISC GP1 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2200); ++ printk("RISC GP2 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2300); ++ printk("RISC GP3 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2400); ++ printk("RISC GP4 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2500); ++ printk("RISC GP5 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2600); ++ printk("RISC GP6 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->pcr, 0x2700); ++ printk("RISC GP7 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x10); ++ printk("Frame Buffer Hardware Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 16; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x20); ++ printk("FPM B0 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 64; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, 0x30); ++ printk("FPM B1 Registers:"); ++ dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80); ++ for (i = 0; i < 64; i++) { ++ if ((i % 8) == 0) ++ printk("\n"); ++ printk("%04x ", RD_REG_WORD(dmp_reg++)); ++ } ++ ++ printk("\n\n"); ++ ++ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); ++ ++ data = RD_REG_WORD(®->ctrl_status); ++ for (i = 6000000; i && data & CSR_ISP_SOFT_RESET; i--) { ++ SYS_DELAY(5); ++ data = RD_REG_WORD(®->ctrl_status); ++ } ++ data = RD_REG_WORD(®->mailbox0); ++ for (i = 6000000; i && data == MBS_BUSY; i--) { ++ SYS_DELAY(5); ++ data = RD_REG_WORD(®->mailbox0); ++ } ++ ++ /* Pause RISC. */ ++ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); ++ for (cnt = 30000; cnt; cnt--) { ++ if ((RD_REG_WORD(®->hccr) & HCCR_RISC_PAUSE) != 0) ++ break; ++ SYS_DELAY(10); ++ } ++ if (!cnt) ++ goto done; ++ ++ rval = QLA2X00_SUCCESS; ++ mb0 = mb2 = 0; ++ printk("RISC SRAM:"); ++ risc_address = 0x1000; ++ risc_code_size = 0xffff - 0x1000 + 1; ++ WRT_REG_WORD(®->mailbox0, MBC_READ_RAM_WORD); ++ clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ for (cnt = 0; cnt < risc_code_size && rval == QLA2X00_SUCCESS; cnt++) { ++ if ((cnt % 8) == 0) ++ printk("\n%04x: ", cnt + 0x1000); ++ WRT_REG_WORD(®->mailbox1, (uint16_t)risc_address++); ++ WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); ++ ++ for (timer = 6000000; timer != 0; timer--) { ++ /* Check for pending interrupts. */ ++ if ((stat = RD_REG_WORD(®->host_status_lo)) & HSR_INT) { ++ stat &= 0xff; ++ ++ if (stat == 0x1 || stat == 0x2) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ /* Release mailbox registers. */ ++ WRT_REG_WORD(®->semaphore, 0); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } else if (stat == 0x10 || stat == 0x11) { ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ mb0 = RD_REG_WORD(®->mailbox0); ++ mb2 = RD_REG_WORD(®->mailbox2); ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ break; ++ } ++ ++ /* clear this intr; it wasn't a mailbox intr */ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ } ++ ++ mdelay(5); ++ } ++ ++ if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { ++ rval = mb0 & MBS_MASK; ++ printk("%04x ", mb2); ++ } else { ++ rval = QLA2X00_FUNCTION_FAILED; ++ } ++ } ++ ++ printk("\n[<==END] ISP DEBUG DUMP\n"); ++ ++done: ++ if (!hardware_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++} ++#else /* if defined(ISP2100) */ ++ ++/** ++ * qla2x00_fw_dump() - Dumps binary data from the 2100 firmware. ++ * @ha: SCSI driver HA context ++ * @hardware_locked: Called with the hardware_lock ++ * ++ * NOTE: On the ISP2100, this function will not be implemented. ++ */ ++void ++qla2x00_dump_isp(scsi_qla_host_t *ha, int hardware_locked) ++{ ++ /* NO-OP */ ++ printk("\n\n[==>BEG]\n"); ++ printk("\n[<==END] ISP DEBUG DUMP\n"); ++} ++ ++#endif /* if defined(ISP2300) */ ++ ++//FIXME ++ ++/****************************************************************************/ ++/* Driver Debug Functions. */ ++/****************************************************************************/ ++ ++void ++qla2x00_dump_regs(struct Scsi_Host *host) ++{ ++ /* Assumes non-memory mapped I/O */ ++ printk("Mailbox registers:\n"); ++ printk("scsi(%d): mbox 0 0x%04x \n", ++ host->host_no, inw(host->io_port + 0x10)); ++ printk("scsi(%d): mbox 1 0x%04x \n", ++ host->host_no, inw(host->io_port + 0x12)); ++ printk("scsi(%d): mbox 2 0x%04x \n", ++ host->host_no, inw(host->io_port + 0x14)); ++ printk("scsi(%d): mbox 3 0x%04x \n", ++ host->host_no, inw(host->io_port + 0x16)); ++ printk("scsi(%d): mbox 4 0x%04x \n", ++ host->host_no, inw(host->io_port + 0x18)); ++ printk("scsi(%d): mbox 5 0x%04x \n", ++ host->host_no, inw(host->io_port + 0x1a)); ++} ++ ++ ++void ++qla2x00_dump_buffer(uint8_t * b, uint32_t size) ++{ ++ uint32_t cnt; ++ uint8_t c; ++ ++ printk(" 0 1 2 3 4 5 6 7 8 9 " ++ "Ah Bh Ch Dh Eh Fh\n"); ++ printk("-----------------------------------------" ++ "----------------------\n"); ++ ++ for (cnt = 0; cnt < size;) { ++ c = *b++; ++ printk("%02x",(uint32_t) c); ++ cnt++; ++ if (!(cnt % 16)) ++ printk("\n"); ++ else ++ printk(" "); ++ } ++ if (cnt % 16) ++ printk("\n"); ++} ++ ++/************************************************************************** ++ * qla2x00_print_scsi_cmd ++ * Dumps out info about the scsi cmd and srb. ++ * Input ++ * cmd : Scsi_Cmnd ++ **************************************************************************/ ++void ++qla2x00_print_scsi_cmd(Scsi_Cmnd * cmd) ++{ ++ struct scsi_qla_host *ha; ++ struct Scsi_Host *host; ++ srb_t *sp; ++ struct os_lun *lq; ++ fc_port_t *fcport; ++ ++ int i; ++ ++ host = cmd->device->host; ++ ha = (struct scsi_qla_host *) host->hostdata; ++ ++ sp = (srb_t *) CMD_SP(cmd); ++ printk("SCSI Command @= 0x%p, Handle=0x%08lx\n", ++ cmd, (u_long) CMD_HANDLE(cmd)); ++ printk(" chan=%d, target = 0x%02x, lun = 0x%02x, cmd_len = 0x%02x\n", ++ SCSI_BUS_32(cmd), SCSI_TCN_32(cmd), SCSI_LUN_32(cmd), ++ cmd->cmd_len); ++ printk(" CDB = "); ++ for (i = 0; i < cmd->cmd_len; i++) { ++ printk("0x%02x ", cmd->cmnd[i]); ++ } ++ printk("\n seg_cnt =%d, retries=%d, serial_number_at_timeout=0x%lx\n", ++ cmd->use_sg, ++ cmd->retries, cmd->serial_number_at_timeout); ++ printk(" request buffer=0x%p, request buffer len=0x%x\n", ++ cmd->request_buffer, ++ cmd->request_bufflen); ++ printk(" tag=%d, flags=0x%x, transfersize=0x%x \n", ++ cmd->tag, cmd->flags, cmd->transfersize); ++ printk(" serial_number=%d, SP=%p\n", (int) cmd->serial_number,sp); ++ printk(" data direction=%d\n", cmd->sc_data_direction); ++ if (sp) { ++ printk(" sp flags=0x%x\n", sp->flags); ++ printk(" r_start=0x%lx, u_start=0x%lx, " ++ "f_start=0x%lx, state=%d\n", ++ sp->r_start, sp->u_start, ++ sp->f_start, sp->state); ++ ++ lq = sp->lun_queue; ++ fcport = lq->fclun->fcport; ++ printk(" e_start= 0x%lx, ext_history= %d, " ++ "fo retry=%d, loopid =%x, port path=%d\n", ++ sp->e_start, sp->ext_history, ++ sp->fo_retry_cnt, ++ fcport->loop_id, ++ fcport->cur_path); ++ } ++} ++ ++/* ++ * qla2x00_print_q_info ++ * Prints queue info ++ * Input ++ * q: lun queue ++ */ ++void ++qla2x00_print_q_info(struct os_lun *q) ++{ ++ printk("Queue info: flags=0x%lx\n", q->q_flag); ++} ++ ++#if defined(QL_DEBUG_ROUTINES) ++/* ++ * qla2x00_formatted_dump_buffer ++ * Prints string plus buffer. ++ * ++ * Input: ++ * string = Null terminated string (no newline at end). ++ * buffer = buffer address. ++ * wd_size = word size 8, 16, 32 or 64 bits ++ * count = number of words. ++ */ ++void ++qla2x00_formatted_dump_buffer(char *string, uint8_t * buffer, ++ uint8_t wd_size, uint32_t count) ++{ ++ uint32_t cnt; ++ uint16_t *buf16; ++ uint32_t *buf32; ++ ++ if (strcmp(string, "") != 0) ++ printk("%s\n",string); ++ ++ switch (wd_size) { ++ case 8: ++ printk(" 0 1 2 3 4 5 6 7 " ++ "8 9 Ah Bh Ch Dh Eh Fh\n"); ++ printk("-----------------------------------------" ++ "-------------------------------------\n"); ++ ++ for (cnt = 1; cnt <= count; cnt++, buffer++) { ++ printk("%02x",*buffer); ++ if (cnt % 16 == 0) ++ printk("\n"); ++ else ++ printk(" "); ++ } ++ if (cnt % 16 != 0) ++ printk("\n"); ++ break; ++ case 16: ++ printk(" 0 2 4 6 8 Ah " ++ " Ch Eh\n"); ++ printk("-----------------------------------------" ++ "-------------\n"); ++ ++ buf16 = (uint16_t *) buffer; ++ for (cnt = 1; cnt <= count; cnt++, buf16++) { ++ printk("%4x",*buf16); ++ ++ if (cnt % 8 == 0) ++ printk("\n"); ++ else if (*buf16 < 10) ++ printk(" "); ++ else ++ printk(" "); ++ } ++ if (cnt % 8 != 0) ++ printk("\n"); ++ break; ++ case 32: ++ printk(" 0 4 8 Ch\n"); ++ printk("------------------------------------------\n"); ++ ++ buf32 = (uint32_t *) buffer; ++ for (cnt = 1; cnt <= count; cnt++, buf32++) { ++ printk("%8x", *buf32); ++ ++ if (cnt % 4 == 0) ++ printk("\n"); ++ else if (*buf32 < 10) ++ printk(" "); ++ else ++ printk(" "); ++ } ++ if (cnt % 4 != 0) ++ printk("\n"); ++ break; ++ default: ++ break; ++ } ++} ++ ++#endif ++ ++ ++#if STOP_ON_ERROR ++/************************************************************************** ++* qla2x00_panic ++* ++**************************************************************************/ ++static void ++qla2x00_panic(char *cp, struct Scsi_Host *host) ++{ ++ struct scsi_qla_host *ha; ++ long *fp; ++ ++ ha = (struct scsi_qla_host *) host->hostdata; ++ DEBUG2(ql2x_debug_print = 1;); ++ printk("qla2100 - PANIC: %s\n", cp); ++ printk("Current time=0x%lx\n", jiffies); ++ printk("Number of pending commands =0x%lx\n", ha->actthreads); ++ printk("Number of queued commands =0x%lx\n", ha->qthreads); ++ printk("Number of free entries = (%d)\n", ha->req_q_cnt); ++ printk("Request Queue @ 0x%lx, Response Queue @ 0x%lx\n", ++ ha->request_dma, ha->response_dma); ++ printk("Request In Ptr %d\n", ha->req_ring_index); ++ fp = (long *) &ha->flags; ++ printk("HA flags =0x%lx\n", *fp); ++ qla2x00_dump_requests(ha); ++ qla2x00_dump_regs(host); ++ cli(); ++ for (;;) { ++ udelay(2); ++ barrier(); ++ /* cpu_relax();*/ ++ } ++ sti(); ++} ++ ++#endif ++ ++/************************************************************************** ++* qla2x00_dump_requests ++* ++**************************************************************************/ ++void ++qla2x00_dump_requests(scsi_qla_host_t *ha) ++{ ++ ++ Scsi_Cmnd *cp; ++ srb_t *sp; ++ int i; ++ ++ printk("Outstanding Commands on controller:\n"); ++ ++ for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) { ++ if ((sp = ha->outstanding_cmds[i]) == NULL) ++ continue; ++ if ((cp = sp->cmd) == NULL) ++ continue; ++ ++ printk("(%d): Pid=%d, sp flags=0x%lx, cmd=0x%p\n", ++ i, ++ (int)sp->cmd->serial_number, ++ (long)sp->flags,CMD_SP(sp->cmd)); ++ } ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_dbg.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,138 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++#undef ENTER_TRACE ++/* ++* Macros use for debugging the driver. ++*/ ++#if defined(ENTER_TRACE) ++#define ENTER(x) do { printk("qla2100 : Entering %s()\n", x); } while (0) ++#define LEAVE(x) do { printk("qla2100 : Leaving %s()\n", x); } while (0) ++#define ENTER_INTR(x) do { printk("qla2100 : Entering %s()\n", x); } while (0) ++#define LEAVE_INTR(x) do { printk("qla2100 : Leaving %s()\n", x); } while (0) ++#else ++#define ENTER(x) do {} while (0) ++#define LEAVE(x) do {} while (0) ++#define ENTER_INTR(x) do {} while (0) ++#define LEAVE_INTR(x) do {} while (0) ++#endif ++ ++#if DEBUG_QLA2100 ++#define DEBUG(x) do {x;} while (0); ++#else ++#define DEBUG(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_1) ++#define DEBUG1(x) do {x;} while (0); ++#else ++#define DEBUG1(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_2) ++#define DEBUG2(x) do {x;} while (0); ++#define DEBUG2_3(x) do {x;} while (0); ++#define DEBUG2_3_11(x) do {x;} while (0); ++#define DEBUG2_9_10(x) do {x;} while (0); ++#define DEBUG2_11(x) do {x;} while (0); ++#else ++#define DEBUG2(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_3) ++#define DEBUG3(x) do {x;} while (0); ++#define DEBUG2_3(x) do {x;} while (0); ++#define DEBUG2_3_11(x) do {x;} while (0); ++#define DEBUG3_11(x) do {x;} while (0); ++#else ++#define DEBUG3(x) do {} while (0); ++ #if !defined(QL_DEBUG_LEVEL_2) ++ #define DEBUG2_3(x) do {} while (0); ++ #endif ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_4) ++#define DEBUG4(x) do {x;} while (0); ++#else ++#define DEBUG4(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_5) ++#define DEBUG5(x) do {x;} while (0); ++#else ++#define DEBUG5(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_7) ++#define DEBUG7(x) do {x;} while (0); ++#else ++#define DEBUG7(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_9) ++#define DEBUG9(x) do {x;} while (0); ++#define DEBUG9_10(x) do {x;} while (0); ++#define DEBUG2_9_10(x) do {x;} while (0); ++#else ++#define DEBUG9(x) do {} while (0); ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_10) ++#define DEBUG10(x) do {x;} while (0); ++#define DEBUG2_9_10(x) do {x;} while (0); ++#define DEBUG9_10(x) do {x;} while (0); ++#else ++#define DEBUG10(x) do {} while (0); ++ #if !defined(DEBUG2_9_10) ++ #define DEBUG2_9_10(x) do {} while (0); ++ #endif ++ #if !defined(DEBUG9_10) ++ #define DEBUG9_10(x) do {} while (0); ++ #endif ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_11) ++#define DEBUG11(x) do{x;} while(0); ++#if !defined(DEBUG2_11) ++#define DEBUG2_11(x) do{x;} while(0); ++#endif ++#if !defined(DEBUG2_3_11) ++#define DEBUG2_3_11(x) do{x;} while(0); ++#endif ++#if !defined(DEBUG3_11) ++#define DEBUG3_11(x) do{x;} while(0); ++#endif ++#else ++#define DEBUG11(x) do{} while(0); ++ #if !defined(QL_DEBUG_LEVEL_2) ++ #define DEBUG2_11(x) do{} while(0); ++ #if !defined(QL_DEBUG_LEVEL_3) ++ #define DEBUG2_3_11(x) do{} while(0); ++ #endif ++ #endif ++ #if !defined(QL_DEBUG_LEVEL_3) ++ #define DEBUG3_11(x) do{} while(0); ++ #endif ++#endif ++ ++#if defined(QL_DEBUG_LEVEL_12) ++#define DEBUG12(x) do {x;} while (0); ++#else ++#define DEBUG12(x) do {} while (0); ++#endif +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_def.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,2484 @@ ++/******************************************************************************** ++* QLOGIC LINUX SOFTWARE ++* ++* QLogic ISP2x00 device driver for Linux 2.5.x ++* Copyright (C) 2003 Qlogic Corporation ++* (www.qlogic.com) ++* ++* This program is free software; you can redistribute it and/or modify it ++* under the terms of the GNU General Public License as published by the ++* Free Software Foundation; either version 2, or (at your option) any ++* later version. ++* ++* This program is distributed in the hope that it will be useful, but ++* WITHOUT ANY WARRANTY; without even the implied warranty of ++* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++* General Public License for more details. ++** ++******************************************************************************/ ++ ++#ifndef __QLA_DEF_H ++#define __QLA_DEF_H ++ ++#if defined(qla23xx) ++ #define MAILBOX_REGISTER_COUNT 32 ++ #define ISP_NAME "23xx" ++ #define DRIVER_NAME "qla2300" ++ #define ISP2300 ++ #undef ISP2322 ++#elif defined(qla22xx) ++ #define MAILBOX_REGISTER_COUNT 32 ++ #define ISP_NAME "22xx" ++ #define DRIVER_NAME "qla2200" ++ #define ISP2200 ++#else /* qla21xx */ ++ #define MAILBOX_REGISTER_COUNT 8 ++ #define ISP_NAME "21xx" ++ #define DRIVER_NAME "qla2100" ++ #define ISP2100 ++#endif ++ ++/*****************************************/ ++/* ISP Boards supported by this driver */ ++/*****************************************/ ++#define QLA2X00_VENDOR_ID 0x1077 ++ ++#define QLA2100_DEVICE_ID 0x2100 ++ ++#define QLA2200_DEVICE_ID 0x2200 ++#define QLA2200A_RISC_ROM_VER 4 ++ ++#define QLA2300_DEVICE_ID 0x2300 ++#define QLA2312_DEVICE_ID 0x2312 ++#define QLA2322_DEVICE_ID 0x2322 ++#define FPM_2300 6 ++#define FPM_2310 7 ++ ++#include "qla_settings.h" ++#include "exioct.h" ++#include "inioct.h" ++ ++/* ++ * Data bit definitions ++ */ ++#define BIT_0 0x1 ++#define BIT_1 0x2 ++#define BIT_2 0x4 ++#define BIT_3 0x8 ++#define BIT_4 0x10 ++#define BIT_5 0x20 ++#define BIT_6 0x40 ++#define BIT_7 0x80 ++#define BIT_8 0x100 ++#define BIT_9 0x200 ++#define BIT_10 0x400 ++#define BIT_11 0x800 ++#define BIT_12 0x1000 ++#define BIT_13 0x2000 ++#define BIT_14 0x4000 ++#define BIT_15 0x8000 ++#define BIT_16 0x10000 ++#define BIT_17 0x20000 ++#define BIT_18 0x40000 ++#define BIT_19 0x80000 ++#define BIT_20 0x100000 ++#define BIT_21 0x200000 ++#define BIT_22 0x400000 ++#define BIT_23 0x800000 ++#define BIT_24 0x1000000 ++#define BIT_25 0x2000000 ++#define BIT_26 0x4000000 ++#define BIT_27 0x8000000 ++#define BIT_28 0x10000000 ++#define BIT_29 0x20000000 ++#define BIT_30 0x40000000 ++#define BIT_31 0x80000000 ++ ++#define LSB(x) ((uint8_t)(x)) ++#define MSB(x) ((uint8_t)((uint16_t)(x) >> 8)) ++ ++#define LSW(x) ((uint16_t)(x)) ++#define MSW(x) ((uint16_t)((uint32_t)(x) >> 16)) ++ ++#define LSD(x) ((uint32_t)((uint64_t)(x))) ++#define MSD(x) ((uint32_t)((uint64_t)(x) >> 32)) ++ ++ ++/* ++ * I/O register ++*/ ++/* #define MEMORY_MAPPED_IO */ /* Enable memory mapped I/O */ ++#undef MEMORY_MAPPED_IO /* Disable memory mapped I/O */ ++ ++#if defined(MEMORY_MAPPED_IO) ++#define RD_REG_BYTE(addr) readb(addr) ++#define RD_REG_WORD(addr) readw(addr) ++#define RD_REG_DWORD(addr) readl(addr) ++#define WRT_REG_BYTE(addr, data) writeb(data,addr) ++#define WRT_REG_WORD(addr, data) writew(data,addr) ++#define WRT_REG_DWORD(addr, data) writel(data,addr) ++#else /* MEMORY_MAPPED_IO */ ++#define RD_REG_BYTE(addr) (inb((unsigned long)addr)) ++#define RD_REG_WORD(addr) (inw((unsigned long)addr)) ++#define RD_REG_DWORD(addr) (inl((unsigned long)addr)) ++#define WRT_REG_BYTE(addr, data) (outb(data,(unsigned long)addr)) ++#define WRT_REG_WORD(addr, data) (outw(data,(unsigned long)addr)) ++#define WRT_REG_DWORD(addr, data) (outl(data,(unsigned long)addr)) ++#endif /* MEMORY_MAPPED_IO */ ++ ++/* ++ * Fibre Channel device definitions. ++ */ ++#define WWN_SIZE 8 /* Size of WWPN, WWN & WWNN */ ++#define MAX_FIBRE_DEVICES 256 ++#define MAX_FIBRE_LUNS 256 ++#define MAX_RSCN_COUNT 10 ++#define MAX_HOST_COUNT 16 ++ ++/* ++ * Host adapter default definitions. ++ */ ++#define MAX_BUSES 1 /* We only have one bus today */ ++#define MAX_TARGETS_2100 MAX_FIBRE_DEVICES ++#define MAX_TARGETS_2200 MAX_FIBRE_DEVICES ++#define MAX_TARGETS MAX_FIBRE_DEVICES ++#define MIN_LUNS 8 ++#define MAX_LUNS MAX_FIBRE_LUNS ++#define MAX_CMDS_PER_LUN 255 ++#define MAX_SRBS 4096 ++ ++/* ++ * Fibre Channel device definitions. ++ */ ++#define LAST_LOCAL_LOOP_ID 0x7d ++#define SNS_FL_PORT 0x7e ++#define FABRIC_CONTROLLER 0x7f ++#define SIMPLE_NAME_SERVER 0x80 ++#define SNS_FIRST_LOOP_ID 0x81 ++#define LAST_SNS_LOOP_ID 0xfe ++#define MANAGEMENT_SERVER 0xfe ++#define BROADCAST 0xff ++#define SNS_ACCEPT 0x0280 /* 8002 swapped */ ++#define SNS_REJECT 0x0180 /* 8001 swapped */ ++ ++/* Loop ID's used as database flags, must be higher than any valid Loop ID */ ++#define PORT_UNUSED 0x100 /* Port never been used. */ ++#define PORT_AVAILABLE 0x101 /* Device does not exist on port. */ ++#define PORT_NEED_MAP 0x102 ++#define PORT_LOST_ID 0x200 ++#define PORT_LOGIN_NEEDED 0x400 ++ ++/* ++ * Timeout timer counts in seconds ++ */ ++#define QLA2100_WDG_TIME_QUANTUM 5 /* In seconds */ ++#define PORT_RETRY_TIME 2 ++#define LOOP_DOWN_TIMEOUT 60 ++#define LOOP_DOWN_TIME 120 /* 240 */ ++#define LOOP_DOWN_RESET (LOOP_DOWN_TIME - 30) ++ ++/* Maximum outstanding commands in ISP queues (1-65535) */ ++#define MAX_OUTSTANDING_COMMANDS 1024 ++ ++/* ISP request and response entry counts (37-65535) */ ++#define REQUEST_ENTRY_CNT 1024 /* Number of request entries. */ ++#if defined(ISP2100) || defined(ISP2200) ++#define RESPONSE_ENTRY_CNT 64 /* Number of response entries.*/ ++#else ++#define RESPONSE_ENTRY_CNT 512 /* Number of response entries.*/ ++#endif ++ ++/* Number of segments 1 - 65535 */ ++#define SG_SEGMENTS 32 /* Cmd entry + 6 continuations */ ++ ++/* ++ * SCSI Request Block ++ */ ++typedef struct srb { ++ struct list_head list; ++ ++ Scsi_Cmnd *cmd; /* Linux SCSI command pkt */ ++ struct scsi_qla_host *ha; /* ha this SP is queued on */ ++ ++ uint8_t dir; /* direction of transfer */ ++ uint8_t unused1; ++ ++ uint16_t flags; /* Status flags - defined below */ ++ ++ uint16_t state; ++#define SRB_FREE_STATE 0 /* Request returned back */ ++#define SRB_PENDING_STATE 1 /* Request being queued in LUN Q */ ++#define SRB_ACTIVE_STATE 2 /* Request in Active Array */ ++#define SRB_DONE_STATE 3 /* Request Queued in Done Queue */ ++#define SRB_RETRY_STATE 4 /* Request in Retry Queue */ ++#define SRB_SUSPENDED_STATE 5 /* Request in suspended state */ ++#define SRB_NO_QUEUE_STATE 6 /* Request is in between states */ ++#define SRB_ACTIVE_TIMEOUT_STATE 7 /* Request in Active Array but timed out */ ++#define SRB_FAILOVER_STATE 8 /* Request in Failover Queue */ ++#define SRB_SCSI_RETRY_STATE 9 /* Request in Scsi Retry Queue */ ++ ++ uint8_t used; /* used by allocation code */ ++ uint8_t ref_num; /* reference SRB number */ ++ uint16_t magic; /* qlogic magic number */ ++#define SRB_MAGIC 0x10CB ++ ++ u_long host_no; /* Host number of allocating host */ ++ struct timer_list timer; /* used to timeout command */ ++ dma_addr_t saved_dma_handle; /* for unmap of single transfers */ ++ ++ atomic_t ref_count; /* reference count for this structure */ ++ ++ /* Target/LUN queue pointers. */ ++ struct os_tgt *tgt_queue; /* ptr to visible ha's target */ ++ struct os_lun *lun_queue; /* ptr to visible ha's lun */ ++ struct fc_lun *fclun; /* FC LUN context pointer. */ ++ ++ /* Raw completion info for use by failover ? */ ++ uint8_t fo_retry_cnt; /* Retry count this request */ ++ uint8_t err_id; /* error id */ ++ uint8_t cmd_length; /* command length */ ++ uint8_t unused3; ++ ++ int delay; /* delay in seconds */ ++ int ext_history; /* */ ++ ++ u_long e_start; /* jiffies at start of extend timeout */ ++ u_long r_start; /* jiffies at start of request */ ++ u_long u_start; /* jiffies when sent to F/W */ ++ u_long f_start; /* ra 10/29/01*/ ++ /*jiffies when put in failover queue*/ ++ ++ uint32_t resid; /* Residual transfer length */ ++ uint16_t sense_len; /* Sense data length */ ++ uint32_t request_sense_length; ++ void *request_sense_ptr; ++ ++#if defined(IOCB_THROLLE_USAGE) ++ uint32_t iocb_cnt; ++#endif ++} srb_t; ++ ++/* ++ * SRB flag definitions ++ */ ++#define SRB_TIMEOUT BIT_0 /* Command timed out */ ++#define SRB_DMA_VALID BIT_1 /* Command sent to ISP */ ++#define SRB_WATCHDOG BIT_2 /* Command on watchdog list */ ++#define SRB_ABORT_PENDING BIT_3 /* Command abort sent to device */ ++ ++#define SRB_ABORTED BIT_4 /* Command aborted command already */ ++#define SRB_RETRY BIT_5 /* Command needs retrying */ ++#define SRB_GOT_SENSE BIT_6 /* Command has sense data */ ++#define SRB_FAILOVER BIT_7 /* Command in failover state */ ++ ++#define SRB_BUSY BIT_8 /* Command is in busy retry state */ ++#define SRB_FO_CANCEL BIT_9 /* Command don't need to do failover */ ++#define SRB_IOCTL BIT_10 /* IOCTL command. */ ++#define SRB_ISP_STARTED BIT_11 /* Command sent to ISP. */ ++ ++#define SRB_ISP_COMPLETED BIT_12 /* ISP finished with command */ ++ ++ ++/* ++ * ISP PCI Configuration Register Set ++ */ ++typedef volatile struct { ++ uint16_t vendor_id; /* 0x0 */ ++ uint16_t device_id; /* 0x2 */ ++ uint16_t command; /* 0x4 */ ++ uint16_t status; /* 0x6 */ ++ uint8_t revision_id; /* 0x8 */ ++ uint8_t programming_interface; /* 0x9 */ ++ uint8_t sub_class; /* 0xa */ ++ uint8_t base_class; /* 0xb */ ++ uint8_t cache_line; /* 0xc */ ++ uint8_t latency_timer; /* 0xd */ ++ uint8_t header_type; /* 0xe */ ++ uint8_t bist; /* 0xf */ ++ uint32_t base_port; /* 0x10 */ ++ uint32_t mem_base_addr; /* 0x14 */ ++ uint32_t base_addr[4]; /* 0x18-0x24 */ ++ uint32_t reserved_1[2]; /* 0x28-0x2c */ ++ uint16_t expansion_rom; /* 0x30 */ ++ uint32_t reserved_2[2]; /* 0x34-0x38 */ ++ uint8_t interrupt_line; /* 0x3c */ ++ uint8_t interrupt_pin; /* 0x3d */ ++ uint8_t min_grant; /* 0x3e */ ++ uint8_t max_latency; /* 0x3f */ ++} config_reg_t __attribute__((packed)); ++ ++ ++/* ++ * ISP I/O Register Set structure definitions. ++ */ ++typedef volatile struct { ++ volatile uint16_t flash_address; /* Flash BIOS address */ ++ volatile uint16_t flash_data; /* Flash BIOS data */ ++ uint16_t unused_1[1]; /* Gap */ ++ volatile uint16_t ctrl_status; /* Control/Status */ ++#define CSR_FLASH_64K_BANK BIT_3 /* Flash upper 64K bank select */ ++#define CSR_FLASH_ENABLE BIT_1 /* Flash BIOS Read/Write enable */ ++#define CSR_ISP_SOFT_RESET BIT_0 /* ISP soft reset */ ++ ++ volatile uint16_t ictrl; /* Interrupt control */ ++#define ICR_EN_INT BIT_15 /* ISP enable interrupts. */ ++#define ICR_EN_RISC BIT_3 /* ISP enable RISC interrupts. */ ++ ++ volatile uint16_t istatus; /* Interrupt status */ ++#define ISR_RISC_INT BIT_3 /* RISC interrupt */ ++ ++ volatile uint16_t semaphore; /* Semaphore */ ++ volatile uint16_t nvram; /* NVRAM register. */ ++#define NVR_DESELECT 0 ++#define NVR_CLOCK BIT_0 ++#define NVR_SELECT BIT_1 ++#define NVR_DATA_OUT BIT_2 ++#define NVR_DATA_IN BIT_3 ++#define NVR_BUSY BIT_15 ++ ++#if defined(ISP2100) || defined(ISP2200) ++ volatile uint16_t mailbox0; ++ volatile uint16_t mailbox1; ++ volatile uint16_t mailbox2; ++ volatile uint16_t mailbox3; ++ volatile uint16_t mailbox4; ++#define ISP_REQ_Q_IN(reg) (&(reg)->mailbox4) ++#define ISP_REQ_Q_OUT(reg) (&(reg)->mailbox4) ++ volatile uint16_t mailbox5; ++#define ISP_RSP_Q_IN(reg) (&(reg)->mailbox5) ++#define ISP_RSP_Q_OUT(reg) (&(reg)->mailbox5) ++ volatile uint16_t mailbox6; ++ volatile uint16_t mailbox7; ++ uint16_t unused_2[0x3b]; /* Gap */ ++#else /* defined(ISP2300) */ ++ volatile uint16_t req_q_in; /* Request Queue In-Pointer */ ++#define ISP_REQ_Q_IN(reg) (&(reg)->req_q_in) ++ volatile uint16_t req_q_out; /* Request Queue Out-Pointer */ ++#define ISP_REQ_Q_OUT(reg) (&(reg)->req_q_out) ++ volatile uint16_t rsp_q_in; /* Response Queue In-Pointer */ ++#define ISP_RSP_Q_IN(reg) (&(reg)->rsp_q_in) ++ volatile uint16_t rsp_q_out; /* Response Queue Out-Pointer */ ++#define ISP_RSP_Q_OUT(reg) (&(reg)->rsp_q_out) ++ ++ volatile uint16_t host_status_lo; /* RISC to Host Status Low */ ++#define HSR_INT BIT_15 /* RISC int */ ++#define HSR_RISC_PAUSED BIT_8 /* RISC Paused */ ++ volatile uint16_t host_status_hi; /* RISC to Host Status High */ ++#define HSR_ROM_MB_CMD_COMP 0x01 /* ROM mailbox cmd complete */ ++#define HSR_ROM_MB_CMD_ERROR 0x02 /*ROM mailbox cmd unsuccessful*/ ++#define HSR_MB_CMD_COMP 0x10 /* Mailbox cmd complete */ ++#define HSR_MB_CMD_ERROR 0x11 /* Mailbox cmd unsuccessful */ ++#define HSR_ASYNC_EVENT 0x12 /* Asynchronous event */ ++#define HSR_RESPONSE_QUEUE_UP 0x13 /* Response Queue update */ ++#define HSR_RIO_ONE 0x15 /* RIO one 16 bit handle */ ++#define HSR_FAST_SCSI_COMP 0x16 /* Fast Post SCSI complete */ ++ ++ volatile uint16_t host_semaphore; /* Host to Host Semaphore */ ++ uint16_t unused_3[0x11]; /* Gap */ ++ volatile uint16_t mailbox0; ++ volatile uint16_t mailbox1; ++ volatile uint16_t mailbox2; ++ volatile uint16_t mailbox3; ++ volatile uint16_t mailbox4; ++ volatile uint16_t mailbox5; ++ volatile uint16_t mailbox6; ++ volatile uint16_t mailbox7; ++ volatile uint16_t mailbox8; ++ volatile uint16_t mailbox9; ++ volatile uint16_t mailbox10; ++ volatile uint16_t mailbox11; ++ volatile uint16_t mailbox12; ++ volatile uint16_t mailbox13; ++ volatile uint16_t mailbox14; ++ volatile uint16_t mailbox15; ++ volatile uint16_t mailbox16; ++ volatile uint16_t mailbox17; ++ volatile uint16_t mailbox18; ++ volatile uint16_t mailbox19; ++ volatile uint16_t mailbox20; ++ volatile uint16_t mailbox21; ++ volatile uint16_t mailbox22; ++ volatile uint16_t mailbox23; ++ volatile uint16_t mailbox24; ++ volatile uint16_t mailbox25; ++ volatile uint16_t mailbox26; ++ volatile uint16_t mailbox27; ++ volatile uint16_t mailbox28; ++ volatile uint16_t mailbox29; ++ volatile uint16_t mailbox30; ++ volatile uint16_t mailbox31; ++ volatile uint16_t fb_cmd; ++ uint16_t unused_4[0xa]; /* Gap */ ++#endif /* defined(ISP2100) || defined(ISP2200) */ ++ volatile uint16_t fpm_diag_config; ++ uint16_t unused_5[0x6]; /* Gap */ ++ volatile uint16_t pcr; /* Processor Control Register. */ ++ uint16_t unused_6[0x5]; /* Gap */ ++ volatile uint16_t mctr; /* Memory Configuration and Timing. */ ++ uint16_t unused_7[0x3]; /* Gap */ ++#if defined(ISP2100) || defined(ISP2200) ++ volatile uint16_t fb_cmd; ++#else /* defined(ISP2300) */ ++ uint16_t unused_11; ++#endif /* defined(ISP2100) || defined(ISP2200) */ ++ uint16_t unused_8[0x3]; /* Gap */ ++ volatile uint16_t hccr; /* Host command & control register. */ ++#define HCCR_HOST_INT BIT_7 /* Host interrupt bit */ ++#define HCCR_RISC_PAUSE BIT_5 /* Pause mode bit */ ++ /* HCCR commands */ ++#define HCCR_RESET_RISC 0x1000 /* Reset RISC */ ++#define HCCR_PAUSE_RISC 0x2000 /* Pause RISC */ ++#define HCCR_RELEASE_RISC 0x3000 /* Release RISC from reset. */ ++#define HCCR_SET_HOST_INT 0x5000 /* Set host interrupt */ ++#define HCCR_CLR_HOST_INT 0x6000 /* Clear HOST interrupt */ ++#define HCCR_CLR_RISC_INT 0x7000 /* Clear RISC interrupt */ ++#define HCCR_DISABLE_PARITY_PAUSE 0x4001 /* Disable parity error RISC pause. */ ++#define HCCR_ENABLE_PARITY 0xA000 /* Enable PARITY interrupt */ ++ ++ uint16_t unused_9[5]; /* Gap */ ++ volatile uint16_t gpiod; /* GPIO Data register. */ ++ volatile uint16_t gpioe; /* GPIO Enable register. */ ++#if defined(ISP2200) ++ uint16_t unused_10[8]; /* Gap */ ++ volatile uint16_t mailbox8; ++ volatile uint16_t mailbox9; ++ volatile uint16_t mailbox10; ++ volatile uint16_t mailbox11; ++ volatile uint16_t mailbox12; ++ volatile uint16_t mailbox13; ++ volatile uint16_t mailbox14; ++ volatile uint16_t mailbox15; ++ volatile uint16_t mailbox16; ++ volatile uint16_t mailbox17; ++ volatile uint16_t mailbox18; ++ volatile uint16_t mailbox19; ++ volatile uint16_t mailbox20; ++ volatile uint16_t mailbox21; ++ volatile uint16_t mailbox22; ++ volatile uint16_t mailbox23; /* Also probe reg. */ ++#endif /* defined(ISP2200) */ ++} device_reg_t; ++ ++typedef struct { ++ uint32_t out_mb; /* outbound from driver */ ++ uint32_t in_mb; /* Incoming from RISC */ ++ uint16_t mb[MAILBOX_REGISTER_COUNT]; ++ long buf_size; ++ void *bufp; ++ uint32_t tov; ++ uint8_t flags; ++#define MBX_DMA_IN BIT_0 ++#define MBX_DMA_OUT BIT_1 ++#define IOCTL_CMD BIT_2 ++} mbx_cmd_t; ++ ++#define MBX_TOV_SECONDS 30 ++ ++/* ++ * ISP product identification definitions in mailboxes after reset. ++ */ ++#define PROD_ID_1 0x4953 ++#define PROD_ID_2 0x0000 ++#define PROD_ID_2a 0x5020 ++#define PROD_ID_3 0x2020 ++#define PROD_ID_4 0x1 ++#define PROD_ID_4a 0x2 ++ ++/* ++ * ISP mailbox Self-Test status codes ++ */ ++#define MBS_FRM_ALIVE 0 /* Firmware Alive. */ ++#define MBS_CHKSUM_ERR 1 /* Checksum Error. */ ++#define MBS_BUSY 4 /* Busy. */ ++ ++/* ++ * ISP mailbox command complete status codes ++ */ ++#define MBS_CMD_CMP 0x4000 /* Command Complete. */ ++#define MBS_INV_CMD 0x4001 /* Invalid Command. */ ++#define MBS_HOST_INF_ERR 0x4002 /* Host Interface Error. */ ++#define MBS_TEST_FAILED 0x4003 /* Test Failed. */ ++#define MBS_CMD_ERR 0x4005 /* Command Error. */ ++#define MBS_CMD_PARAM_ERR 0x4006 /* Command Parameter Error. */ ++#define MBS_FATAL_ERROR 0xF000 /* Command Fatal Error. */ ++//TODO consolidate these definitions ++#define MBS_FIRMWARE_ALIVE 0x0000 ++#define MBS_COMMAND_COMPLETE 0x4000 ++#define MBS_INVALID_COMMAND 0x4001 ++ ++/* QLogic subroutine status definitions */ ++#define QL_STATUS_SUCCESS 0 ++#define QL_STATUS_ERROR 1 ++#define QL_STATUS_FATAL_ERROR 2 ++#define QL_STATUS_RESOURCE_ERROR 3 ++#define QL_STATUS_LOOP_ID_IN_USE 4 ++#define QL_STATUS_NO_DATA 5 ++#define QL_STATUS_TIMEOUT 6 ++/* ++ * ISP mailbox asynchronous event status codes ++ */ ++#define MBA_ASYNC_EVENT 0x8000 /* Asynchronous event. */ ++#define MBA_RESET 0x8001 /* Reset Detected. */ ++#define MBA_SYSTEM_ERR 0x8002 /* System Error. */ ++#define MBA_REQ_TRANSFER_ERR 0x8003 /* Request Transfer Error. */ ++#define MBA_RSP_TRANSFER_ERR 0x8004 /* Response Transfer Error. */ ++#define MBA_WAKEUP_THRES 0x8005 /* Request Queue Wake-up. */ ++#define MBA_LIP_OCCURRED 0x8010 /* Loop Initialization Procedure */ ++ /* occurred. */ ++#define MBA_LOOP_UP 0x8011 /* FC Loop UP. */ ++#define MBA_LOOP_DOWN 0x8012 /* FC Loop Down. */ ++#define MBA_LIP_RESET 0x8013 /* LIP reset occurred. */ ++#define MBA_PORT_UPDATE 0x8014 /* Port Database update. */ ++#define MBA_SCR_UPDATE 0x8015 /* State Change Registration. */ ++#define MBA_RSCN_UPDATE MBA_SCR_UPDATE ++#define MBA_SCSI_COMPLETION 0x8020 /* SCSI Command Complete. */ ++#define MBA_CTIO_COMPLETION 0x8021 /* CTIO Complete. */ ++#if !defined(ISP2100) ++#define MBA_LINK_MODE_UP 0x8030 /* FC Link Mode UP. */ ++#define MBA_UPDATE_CONFIG 0x8036 /* FC Update Configuration. */ ++#endif ++ ++/* ++ * ISP mailbox commands ++ */ ++#define MBC_LOAD_RAM 1 /* Load RAM. */ ++#define MBC_EXECUTE_FIRMWARE 2 /* Execute firmware. */ ++#define MBC_WRITE_RAM_WORD 4 /* Write RAM word. */ ++#define MBC_READ_RAM_WORD 5 /* Read RAM word. */ ++#define MBC_MAILBOX_REGISTER_TEST 6 /* Wrap incoming mailboxes */ ++#define MBC_VERIFY_CHECKSUM 7 /* Verify checksum. */ ++#define MBC_ABOUT_FIRMWARE 8 /* Get firmware revision. */ ++#define MBC_LOAD_RAM_A64 9 /* Load RAM by 64-bit address. */ ++#define MBC_DUMP_RAM 0xA /* READ BACK FW */ ++#define MBC_LOAD_RAM_EXTENDED 0xB /* Load Extended RAM */ ++#define MBC_DUMP_SRAM 0xC /* Dump SRAM */ ++#define MBC_WRITE_RAM_WORD_EXTENDED 0xD /* Write RAM word extended */ ++#define MBC_IOCB_EXECUTE 0x12 /* Execute an IOCB command */ ++#define MBC_ABORT_COMMAND 0x15 /* Abort IOCB command. */ ++#define MBC_ABORT_DEVICE 0x16 /* Abort device (ID/LUN). */ ++#define MBC_ABORT_TARGET 0x17 /* Abort target (ID). */ ++#define MBC_TARGET_RESET_ALL 0x18 /* Reset all local targets. */ ++#define MBC_GET_ADAPTER_LOOP_ID 0x20 /* Get loop id of ISP2100. */ ++#define MBC_GET_RETRY_COUNT 0x22 /* GET RATOV & retry count */ ++#define MBC_GET_FIRMWARE_OPTIONS 0x28 /* Get firmware options. */ ++#define MBC_SET_RETRY_COUNT 0x32 /* SET RATOV & retry count. */ ++#define MBC_SET_FIRMWARE_OPTIONS 0x38 /* Set firmware options. */ ++#define MBC_GET_RESOURCE_COUNTS 0x42 /* GET Resource counts */ ++#define MBC_DIAGNOSTIC_LOOP_BACK 0x45 /* Perform LoopBack diagnostic */ ++#define MBC_ENHANCED_GET_PORT_DATABASE 0x47 /* Get port database. */ ++#define MBC_IOCB_EXECUTE_A64 0x54 /* Execute an IOCB command (64bit) */ ++#define MBC_SEND_RNID_ELS 0x57 /* Send RNID ELS request */ ++#define MBC_SET_RNID_PARAMS 0x59 /* Set RNID parameters */ ++#define MBC_GET_RNID_PARAMS 0x5a /* Get RNID parameters */ ++#define MBC_INITIALIZE_FIRMWARE 0x60 /* Initialize firmware */ ++#define MBC_INITIATE_LIP 0x62 /* Initiate Loop Initialization */ ++ /* Procedure */ ++#define MBC_GET_FCAL_MAP 0x63 /* Get FC/AL position map */ ++#define MBC_GET_PORT_DATABASE 0x64 /* Get port database. */ ++#define MBC_TARGET_RESET 0x66 /* Target reset. */ ++#define MBC_GET_FIRMWARE_STATE 0x69 /* Get firmware state. */ ++#define MBC_GET_PORT_NAME 0x6a /* Get port name. */ ++#define MBC_GET_LINK_STATUS 0x6b /* Get link status. */ ++#define MBC_LIP_RESET 0x6c /* LIP reset. */ ++#define MBC_SEND_SNS_COMMAND 0x6e /* Send Simple Name Server command. */ ++#define MBC_LOGIN_FABRIC_PORT 0x6f /* Login fabric port. */ ++#define MBC_LOGOUT_FABRIC_PORT 0x71 /* Logout fabric port. */ ++#define MBC_LIP_FULL_LOGIN 0x72 /* Full login LIP. */ ++#define MBC_LOGIN_LOOP_PORT 0x74 /* Login Loop Port. */ ++#define MBC_GET_PORT_LIST 0x75 /* Get port list. */ ++#define MBC_INITIALIZE_RECEIVE_QUEUE 0x77 /* Initialize receive queue */ ++#define MBC_SEND_FARP_REQ_COMMAND 0x78 /* FARP request. */ ++#define MBC_SEND_FARP_REPLY_COMMAND 0x79 /* FARP reply. */ ++#define MBC_PORT_LOOP_NAME_LIST 0x7C /* Get port/node name list. */ ++#define MBC_SEND_LFA_COMMAND 0x7D /* Send Loop Fabric Address */ ++#define MBC_LUN_RESET 0x7E /* Send LUN reset */ ++ ++/* Firmware return data sizes */ ++#define FCAL_MAP_SIZE 128 ++ ++/* Mailbox bit definitions for out_mb and in_mb */ ++#define MBX_31 BIT_31 ++#define MBX_30 BIT_30 ++#define MBX_29 BIT_29 ++#define MBX_28 BIT_28 ++#define MBX_27 BIT_27 ++#define MBX_26 BIT_26 ++#define MBX_25 BIT_25 ++#define MBX_24 BIT_24 ++#define MBX_23 BIT_23 ++#define MBX_22 BIT_22 ++#define MBX_21 BIT_21 ++#define MBX_20 BIT_20 ++#define MBX_19 BIT_19 ++#define MBX_18 BIT_18 ++#define MBX_17 BIT_17 ++#define MBX_16 BIT_16 ++#define MBX_15 BIT_15 ++#define MBX_14 BIT_14 ++#define MBX_13 BIT_13 ++#define MBX_12 BIT_12 ++#define MBX_11 BIT_11 ++#define MBX_10 BIT_10 ++#define MBX_9 BIT_9 ++#define MBX_8 BIT_8 ++#define MBX_7 BIT_7 ++#define MBX_6 BIT_6 ++#define MBX_5 BIT_5 ++#define MBX_4 BIT_4 ++#define MBX_3 BIT_3 ++#define MBX_2 BIT_2 ++#define MBX_1 BIT_1 ++#define MBX_0 BIT_0 ++ ++/* ++ * Firmware state codes from get firmware state mailbox command ++ */ ++#define FSTATE_CONFIG_WAIT 0 ++#define FSTATE_WAIT_AL_PA 1 ++#define FSTATE_WAIT_LOGIN 2 ++#define FSTATE_READY 3 ++#define FSTATE_LOSS_OF_SYNC 4 ++#define FSTATE_ERROR 5 ++#define FSTATE_REINIT 6 ++#define FSTATE_NON_PART 7 ++ ++#define FSTATE_CONFIG_CORRECT 0 ++#define FSTATE_P2P_RCV_LIP 1 ++#define FSTATE_P2P_CHOOSE_LOOP 2 ++#define FSTATE_P2P_RCV_UNIDEN_LIP 3 ++#define FSTATE_FATAL_ERROR 4 ++#define FSTATE_LOOP_BACK_CONN 5 ++ ++/* ++ * Port Database structure definition ++ * Little endian except where noted. ++ */ ++#define PORT_DATABASE_SIZE 128 /* bytes */ ++typedef struct { ++ uint8_t options; ++ uint8_t control; ++ uint8_t master_state; ++ uint8_t slave_state; ++#define PD_STATE_DISCOVERY 0 ++#define PD_STATE_WAIT_DISCOVERY_ACK 1 ++#define PD_STATE_PORT_LOGIN 2 ++#define PD_STATE_WAIT_PORT_LOGIN_ACK 3 ++#define PD_STATE_PROCESS_LOGIN 4 ++#define PD_STATE_WAIT_PROCESS_LOGIN_ACK 5 ++#define PD_STATE_PORT_LOGGED_IN 6 ++#define PD_STATE_PORT_UNAVAILABLE 7 ++#define PD_STATE_PROCESS_LOGOUT 8 ++#define PD_STATE_WAIT_PROCESS_LOGOUT_ACK 9 ++#define PD_STATE_PORT_LOGOUT 10 ++#define PD_STATE_WAIT_PORT_LOGOUT_ACK 11 ++ uint8_t reserved[2]; ++ uint8_t hard_address; ++ uint8_t reserved_1; ++ uint8_t port_id[4]; ++ uint8_t node_name[8]; /* Big endian. */ ++ uint8_t port_name[8]; /* Big endian. */ ++ uint16_t execution_throttle; ++ uint16_t execution_count; ++ uint8_t reset_count; ++ uint8_t reserved_2; ++ uint16_t resource_allocation; ++ uint16_t current_allocation; ++ uint16_t queue_head; ++ uint16_t queue_tail; ++ uint16_t transmit_execution_list_next; ++ uint16_t transmit_execution_list_previous; ++ uint16_t common_features; ++ uint16_t total_concurrent_sequences; ++ uint16_t RO_by_information_category; ++ uint8_t recipient; ++ uint8_t initiator; ++ uint16_t receive_data_size; ++ uint16_t concurrent_sequences; ++ uint16_t open_sequences_per_exchange; ++ uint16_t lun_abort_flags; ++ uint16_t lun_stop_flags; ++ uint16_t stop_queue_head; ++ uint16_t stop_queue_tail; ++ uint16_t port_retry_timer; ++ uint16_t next_sequence_id; ++ uint16_t frame_count; ++ uint16_t PRLI_payload_length; ++ uint8_t prli_svc_param_word_0[2]; /* Big endian */ ++ /* Bits 15-0 of word 0 */ ++ uint8_t prli_svc_param_word_3[2]; /* Big endian */ ++ /* Bits 15-0 of word 3 */ ++ uint16_t loop_id; ++ uint16_t extended_lun_info_list_pointer; ++ uint16_t extended_lun_stop_list_pointer; ++} port_database_t; ++ ++/* ++ * ISP Initialization Control Block. ++ */ ++ ++#define SO_DATA_RATE_1GB 0 ++#define SO_DATA_RATE_2GB 1 ++#define SO_DATA_RATE_AUTO 2 ++ ++/* ++ * ISP Initialization Control Block. ++ * Little endian except where noted. ++ */ ++#define ICB_VERSION 1 ++typedef struct { ++ uint8_t version; ++ uint8_t reserved_1; ++ ++ /* ++ * LSB BIT 0 = Enable Hard Loop Id ++ * LSB BIT 1 = Enable Fairness ++ * LSB BIT 2 = Enable Full-Duplex ++ * LSB BIT 3 = Enable Fast Posting ++ * LSB BIT 4 = Enable Target Mode ++ * LSB BIT 5 = Disable Initiator Mode ++ * LSB BIT 6 = Enable ADISC ++ * LSB BIT 7 = Enable Target Inquiry Data ++ * ++ * MSB BIT 0 = Enable PDBC Notify ++ * MSB BIT 1 = Non Participating LIP ++ * MSB BIT 2 = Descending Loop ID Search ++ * MSB BIT 3 = Acquire Loop ID in LIPA ++ * MSB BIT 4 = Stop PortQ on Full Status ++ * MSB BIT 5 = Full Login after LIP ++ * MSB BIT 6 = Node Name Option ++ * MSB BIT 7 = Ext IFWCB enable bit ++ */ ++ uint8_t firmware_options[2]; ++ ++ uint16_t frame_payload_size; ++ uint16_t max_iocb_allocation; ++ uint16_t execution_throttle; ++ uint8_t retry_count; ++ uint8_t retry_delay; /* unused */ ++ uint8_t port_name[WWN_SIZE]; /* Big endian. */ ++ uint16_t hard_address; ++ uint8_t inquiry_data; ++ uint8_t login_timeout; ++ uint8_t node_name[WWN_SIZE]; /* Big endian. */ ++ ++ uint16_t request_q_outpointer; ++ uint16_t response_q_inpointer; ++ uint16_t request_q_length; ++ uint16_t response_q_length; ++ uint32_t request_q_address[2]; ++ uint32_t response_q_address[2]; ++ ++ uint16_t lun_enables; ++ uint8_t command_resource_count; ++ uint8_t immediate_notify_resource_count; ++ uint16_t timeout; ++ uint8_t reserved_2[2]; ++ ++ /* ++ * LSB BIT 0 = Timer Operation mode bit 0 ++ * LSB BIT 1 = Timer Operation mode bit 1 ++ * LSB BIT 2 = Timer Operation mode bit 2 ++ * LSB BIT 3 = Timer Operation mode bit 3 ++ * LSB BIT 4 = Init Config Mode bit 0 ++ * LSB BIT 5 = Init Config Mode bit 1 ++ * LSB BIT 6 = Init Config Mode bit 2 ++ * LSB BIT 7 = Enable Non part on LIHA failure ++ * ++ * MSB BIT 0 = Enable class 2 ++ * MSB BIT 1 = Enable ACK0 ++ * MSB BIT 2 = ++ * MSB BIT 3 = ++ * MSB BIT 4 = FC Tape Enable ++ * MSB BIT 5 = Enable FC Confirm ++ * MSB BIT 6 = Enable command queuing in target mode ++ * MSB BIT 7 = No Logo On Link Down ++ */ ++ uint8_t add_firmware_options[2]; ++ ++ uint8_t response_accumulation_timer; ++ uint8_t interrupt_delay_timer; ++ ++ /* ++ * LSB BIT 0 = Enable Read xfr_rdy ++ * LSB BIT 1 = Soft ID only ++ * LSB BIT 2 = ++ * LSB BIT 3 = ++ * LSB BIT 4 = FCP RSP Payload [0] ++ * LSB BIT 5 = FCP RSP Payload [1] / Sbus enable - 2200 ++ * LSB BIT 6 = Enable Out-of-Order frame handling ++ * LSB BIT 7 = Disable Automatic PLOGI on Local Loop ++ * ++ * MSB BIT 0 = Sbus enable - 2300 ++ * MSB BIT 1 = ++ * MSB BIT 2 = ++ * MSB BIT 3 = ++ * MSB BIT 4 = ++ * MSB BIT 5 = enable 50 ohm termination ++ * MSB BIT 6 = Data Rate (2300 only) ++ * MSB BIT 7 = Data Rate (2300 only) ++ */ ++ uint8_t special_options[2]; ++ ++ uint8_t reserved_3[26]; ++} init_cb_t; ++ ++/* ++ * ISP Get/Set Target Parameters mailbox command control flags. ++ */ ++ ++/* ++ * Get Link Status mailbox command return buffer. ++ */ ++typedef struct { ++ uint32_t link_fail_cnt; ++ uint32_t loss_sync_cnt; ++ uint32_t loss_sig_cnt; ++ uint32_t prim_seq_err_cnt; ++ uint32_t inval_xmit_word_cnt; ++ uint32_t inval_crc_cnt; ++} link_stat_t; ++ ++/* ++ * NVRAM Command values. ++ */ ++#define NV_START_BIT BIT_2 ++#define NV_WRITE_OP (BIT_26+BIT_24) ++#define NV_READ_OP (BIT_26+BIT_25) ++#define NV_ERASE_OP (BIT_26+BIT_25+BIT_24) ++#define NV_MASK_OP (BIT_26+BIT_25+BIT_24) ++#define NV_DELAY_COUNT 10 ++ ++/* ++ * QLogic ISP2100, ISP2200 and ISP2300 NVRAM structure definition. ++ */ ++typedef struct { ++ /* ++ * NVRAM header ++ */ ++ uint8_t id[4]; ++ uint8_t nvram_version; ++ uint8_t reserved_0; ++ ++ /* ++ * NVRAM RISC parameter block ++ */ ++ uint8_t parameter_block_version; ++ uint8_t reserved_1; ++ ++ /* ++ * LSB BIT 0 = Enable Hard Loop Id ++ * LSB BIT 1 = Enable Fairness ++ * LSB BIT 2 = Enable Full-Duplex ++ * LSB BIT 3 = Enable Fast Posting ++ * LSB BIT 4 = Enable Target Mode ++ * LSB BIT 5 = Disable Initiator Mode ++ * LSB BIT 6 = Enable ADISC ++ * LSB BIT 7 = Enable Target Inquiry Data ++ * ++ * MSB BIT 0 = Enable PDBC Notify ++ * MSB BIT 1 = Non Participating LIP ++ * MSB BIT 2 = Descending Loop ID Search ++ * MSB BIT 3 = Acquire Loop ID in LIPA ++ * MSB BIT 4 = Stop PortQ on Full Status ++ * MSB BIT 5 = Full Login after LIP ++ * MSB BIT 6 = Node Name Option ++ * MSB BIT 7 = Ext IFWCB enable bit ++ */ ++ uint8_t firmware_options[2]; ++ ++ uint16_t frame_payload_size; ++ uint16_t max_iocb_allocation; ++ uint16_t execution_throttle; ++ uint8_t retry_count; ++ uint8_t retry_delay; /* unused */ ++ uint8_t port_name[WWN_SIZE]; /* Big endian. */ ++ uint16_t hard_address; ++ uint8_t inquiry_data; ++ uint8_t login_timeout; ++ uint8_t node_name[WWN_SIZE]; /* Big endian. */ ++ ++ /* ++ * LSB BIT 0 = Timer Operation mode bit 0 ++ * LSB BIT 1 = Timer Operation mode bit 1 ++ * LSB BIT 2 = Timer Operation mode bit 2 ++ * LSB BIT 3 = Timer Operation mode bit 3 ++ * LSB BIT 4 = Init Config Mode bit 0 ++ * LSB BIT 5 = Init Config Mode bit 1 ++ * LSB BIT 6 = Init Config Mode bit 2 ++ * LSB BIT 7 = Enable Non part on LIHA failure ++ * ++ * MSB BIT 0 = Enable class 2 ++ * MSB BIT 1 = Enable ACK0 ++ * MSB BIT 2 = ++ * MSB BIT 3 = ++ * MSB BIT 4 = FC Tape Enable ++ * MSB BIT 5 = Enable FC Confirm ++ * MSB BIT 6 = Enable command queuing in target mode ++ * MSB BIT 7 = No Logo On Link Down ++ */ ++ uint8_t add_firmware_options[2]; ++ ++ uint8_t response_accumulation_timer; ++ uint8_t interrupt_delay_timer; ++ ++ /* ++ * LSB BIT 0 = Enable Read xfr_rdy ++ * LSB BIT 1 = Soft ID only ++ * LSB BIT 2 = ++ * LSB BIT 3 = ++ * LSB BIT 4 = FCP RSP Payload [0] ++ * LSB BIT 5 = FCP RSP Payload [1] / Sbus enable - 2200 ++ * LSB BIT 6 = Enable Out-of-Order frame handling ++ * LSB BIT 7 = Disable Automatic PLOGI on Local Loop ++ * ++ * MSB BIT 0 = Sbus enable - 2300 ++ * MSB BIT 1 = ++ * MSB BIT 2 = ++ * MSB BIT 3 = ++ * MSB BIT 4 = ++ * MSB BIT 5 = enable 50 ohm termination ++ * MSB BIT 6 = Data Rate (2300 only) ++ * MSB BIT 7 = Data Rate (2300 only) ++ */ ++ uint8_t special_options[2]; ++ ++ /* Reserved for expanded RISC parameter block */ ++ uint8_t reserved_2[24]; ++ ++ /* ++ * LSB BIT 0 = Output Swing 1G bit 0 ++ * LSB BIT 1 = Output Swing 1G bit 1 ++ * LSB BIT 2 = Output Swing 1G bit 2 ++ * LSB BIT 3 = Output Emphasis 1G bit 0 ++ * LSB BIT 4 = Output Emphasis 1G bit 1 ++ * LSB BIT 5 = Output Swing 2G bit 0 ++ * LSB BIT 6 = Output Swing 2G bit 1 ++ * LSB BIT 7 = Output Swing 2G bit 2 ++ * ++ * MSB BIT 0 = Output Emphasis 2G bit 0 ++ * MSB BIT 1 = Output Emphasis 2G bit 1 ++ * MSB BIT 2 = Output Enable ++ * MSB BIT 3 = ++ * MSB BIT 4 = ++ * MSB BIT 5 = ++ * MSB BIT 6 = ++ * MSB BIT 7 = ++ */ ++ uint8_t seriallink_options[2]; ++ ++ /* ++ * NVRAM host parameter block ++ * ++ * LSB BIT 0 = Enable spinup delay ++ * LSB BIT 1 = Disable BIOS ++ * LSB BIT 2 = Enable Memory Map BIOS ++ * LSB BIT 3 = Enable Selectable Boot ++ * LSB BIT 4 = Disable RISC code load ++ * LSB BIT 5 = Set cache line size 1 ++ * LSB BIT 6 = PCI Parity Disable ++ * LSB BIT 7 = Enable extended logging ++ * ++ * MSB BIT 0 = Enable 64bit addressing ++ * MSB BIT 1 = Enable lip reset ++ * MSB BIT 2 = Enable lip full login ++ * MSB BIT 3 = Enable target reset ++ * MSB BIT 4 = Enable database storage ++ * MSB BIT 5 = Enable cache flush read ++ * MSB BIT 6 = Enable database load ++ * MSB BIT 7 = Enable alternate WWN ++ */ ++ uint8_t host_p[2]; ++ ++ uint8_t boot_node_name[WWN_SIZE]; ++ uint8_t boot_lun_number; ++ uint8_t reset_delay; ++ uint8_t port_down_retry_count; ++ uint8_t boot_id_number; ++ uint16_t max_luns_per_target; ++ uint8_t fcode_boot_port_name[WWN_SIZE]; ++ uint8_t alternate_port_name[WWN_SIZE]; ++ uint8_t alternate_node_name[WWN_SIZE]; ++ ++ /* ++ * BIT 0 = Boot Zoning ++ * BIT 1 = Alt-Boot Enable ++ * BIT 2 = Report SCSI Path ++ * BIT 3 = unused ++ * BIT 4 = unused ++ * BIT 5 = unused ++ * BIT 6 = unused ++ * BIT 7 = unused ++ */ ++ uint8_t efi_parameters; ++ ++ uint8_t link_down_timeout; ++ ++ uint8_t adapter_id_0[4]; ++ uint8_t adapter_id_1[4]; ++ uint8_t adapter_id_2[4]; ++ uint8_t adapter_id_3[4]; ++ ++ uint8_t alt1_boot_node_name[WWN_SIZE]; ++ uint16_t alt1_boot_lun_number; ++ uint8_t alt2_boot_node_name[WWN_SIZE]; ++ uint16_t alt2_boot_lun_number; ++ uint8_t alt3_boot_node_name[WWN_SIZE]; ++ uint16_t alt3_boot_lun_number; ++ uint8_t alt4_boot_node_name[WWN_SIZE]; ++ uint16_t alt4_boot_lun_number; ++ uint8_t alt5_boot_node_name[WWN_SIZE]; ++ uint16_t alt5_boot_lun_number; ++ uint8_t alt6_boot_node_name[WWN_SIZE]; ++ uint16_t alt6_boot_lun_number; ++ uint8_t alt7_boot_node_name[WWN_SIZE]; ++ uint16_t alt7_boot_lun_number; ++ ++ uint8_t reserved_3[2]; ++ ++ uint8_t oem_id; ++ uint8_t oem_specific[31]; ++ ++ /* ++ * NVRAM Adapter Features offset 232-239 ++ * ++ * LSB BIT 0 = External GBIC ++ * LSB BIT 1 = Risc RAM parity ++ * LSB BIT 2 = Buffer Plus Module ++ * LSB BIT 3 = Multi Chip Adapter ++ * LSB BIT 4 = Internal connector ++ * LSB BIT 5 = ++ * LSB BIT 6 = ++ * LSB BIT 7 = ++ * ++ * MSB BIT 0 = ++ * MSB BIT 1 = ++ * MSB BIT 2 = ++ * MSB BIT 3 = ++ * MSB BIT 4 = ++ * MSB BIT 5 = ++ * MSB BIT 6 = ++ * MSB BIT 7 = ++ */ ++ uint8_t adapter_features[2]; ++ ++ uint8_t reserved_4[16]; ++ ++ /* Subsystem vendor ID for ISP2200 */ ++ uint16_t subsystem_vendor_id_2200; ++ ++ /* Subsystem device ID for ISP2200 */ ++ uint16_t subsystem_device_id_2200; ++ ++ uint8_t reserved_5; ++ uint8_t checksum; ++} nvram_t; ++ ++ ++/* ++ * ISP queue - command entry structure definition. ++ */ ++#define MAX_CMDSZ 16 /* SCSI maximum CDB size. */ ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++#define COMMAND_TYPE 0x11 /* Command entry */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++ uint32_t handle; /* System handle. */ ++#if defined(EXTENDED_IDS) ++ uint16_t target; /* SCSI ID */ ++#else ++ uint8_t reserved; ++ uint8_t target; /* SCSI ID */ ++#endif ++ uint16_t lun; /* SCSI LUN */ ++ uint16_t control_flags; /* Control flags. */ ++#define CF_HEAD_TAG BIT_1 ++#define CF_ORDERED_TAG BIT_2 ++#define CF_SIMPLE_TAG BIT_3 ++#define CF_READ BIT_5 ++#define CF_WRITE BIT_6 ++ uint16_t reserved_1; ++ uint16_t timeout; /* Command timeout. */ ++ uint16_t dseg_count; /* Data segment count. */ ++ uint8_t scsi_cdb[MAX_CMDSZ]; /* SCSI command words. */ ++ uint32_t byte_count; /* Total byte count. */ ++ uint32_t dseg_0_address; /* Data segment 0 address. */ ++ uint32_t dseg_0_length; /* Data segment 0 length. */ ++ uint32_t dseg_1_address; /* Data segment 1 address. */ ++ uint32_t dseg_1_length; /* Data segment 1 length. */ ++ uint32_t dseg_2_address; /* Data segment 2 address. */ ++ uint32_t dseg_2_length; /* Data segment 2 length. */ ++} cmd_entry_t; ++ ++/* ++ * ISP queue - 64-Bit addressing, command entry structure definition. ++ */ ++#define COMMAND_A64_TYPE 0x19 /* Command A64 entry */ ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++ uint32_t handle; /* System handle. */ ++#if defined(EXTENDED_IDS) ++ uint16_t target; /* SCSI ID */ ++#else ++ uint8_t reserved; ++ uint8_t target; /* SCSI ID */ ++#endif ++ uint16_t lun; /* SCSI LUN */ ++ uint16_t control_flags; /* Control flags. */ ++ uint16_t reserved_1; ++ uint16_t timeout; /* Command timeout. */ ++ uint16_t dseg_count; /* Data segment count. */ ++ uint8_t scsi_cdb[MAX_CMDSZ]; /* SCSI command words. */ ++ uint32_t byte_count; /* Total byte count. */ ++ uint32_t dseg_0_address[2]; /* Data segment 0 address. */ ++ uint32_t dseg_0_length; /* Data segment 0 length. */ ++ uint32_t dseg_1_address[2]; /* Data segment 1 address. */ ++ uint32_t dseg_1_length; /* Data segment 1 length. */ ++} cmd_a64_entry_t, request_t; ++ ++/* ++ * ISP queue - continuation entry structure definition. ++ */ ++#define CONTINUE_TYPE 0x02 /* Continuation entry. */ ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++ uint32_t reserved; ++ uint32_t dseg_0_address; /* Data segment 0 address. */ ++ uint32_t dseg_0_length; /* Data segment 0 length. */ ++ uint32_t dseg_1_address; /* Data segment 1 address. */ ++ uint32_t dseg_1_length; /* Data segment 1 length. */ ++ uint32_t dseg_2_address; /* Data segment 2 address. */ ++ uint32_t dseg_2_length; /* Data segment 2 length. */ ++ uint32_t dseg_3_address; /* Data segment 3 address. */ ++ uint32_t dseg_3_length; /* Data segment 3 length. */ ++ uint32_t dseg_4_address; /* Data segment 4 address. */ ++ uint32_t dseg_4_length; /* Data segment 4 length. */ ++ uint32_t dseg_5_address; /* Data segment 5 address. */ ++ uint32_t dseg_5_length; /* Data segment 5 length. */ ++ uint32_t dseg_6_address; /* Data segment 6 address. */ ++ uint32_t dseg_6_length; /* Data segment 6 length. */ ++} cont_entry_t; ++ ++/* ++ * ISP queue - 64-Bit addressing, continuation entry structure definition. ++ */ ++#define CONTINUE_A64_TYPE 0x0A /* Continuation A64 entry. */ ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++ uint32_t dseg_0_address[2]; /* Data segment 0 address. */ ++ uint32_t dseg_0_length; /* Data segment 0 length. */ ++ uint32_t dseg_1_address[2]; /* Data segment 1 address. */ ++ uint32_t dseg_1_length; /* Data segment 1 length. */ ++ uint32_t dseg_2_address[2]; /* Data segment 2 address. */ ++ uint32_t dseg_2_length; /* Data segment 2 length. */ ++ uint32_t dseg_3_address[2]; /* Data segment 3 address. */ ++ uint32_t dseg_3_length; /* Data segment 3 length. */ ++ uint32_t dseg_4_address[2]; /* Data segment 4 address. */ ++ uint32_t dseg_4_length; /* Data segment 4 length. */ ++} cont_a64_entry_t; ++ ++/* ++ * ISP queue - status entry structure definition. ++ */ ++#define STATUS_TYPE 0x03 /* Status entry. */ ++#define STS_SENSE_BUF_LEN 32 ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++#define RF_INV_E_ORDER BIT_5 /* Invalid entry order. */ ++#define RF_INV_E_COUNT BIT_4 /* Invalid entry count. */ ++#define RF_INV_E_PARAM BIT_3 /* Invalid entry parameter. */ ++#define RF_INV_E_TYPE BIT_2 /* Invalid entry type. */ ++#define RF_BUSY BIT_1 /* Busy */ ++ uint32_t handle; /* System handle. */ ++ uint16_t scsi_status; /* SCSI status. */ ++ uint16_t comp_status; /* Completion status. */ ++ uint16_t state_flags; /* State flags. */ ++ uint16_t status_flags; /* Status flags. */ ++#define IOCBSTAT_SF_LOGO BIT_13 /* Logo after 2 abts w/no */ ++ /* response (2 sec) */ ++ uint16_t rsp_info_len; /* Response Info Length. */ ++ uint16_t req_sense_length; /* Request sense data length. */ ++ uint32_t residual_length; /* Residual transfer length. */ ++ uint8_t rsp_info[8]; /* FCP response information. */ ++ /* Request sense data. */ ++ uint8_t req_sense_data[STS_SENSE_BUF_LEN]; ++} sts_entry_t, response_t; ++ ++/* ++ * ISP queue - marker entry structure definition. ++ */ ++#define MARKER_TYPE 0x04 /* Marker entry. */ ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++ uint32_t sys_define_2; /* System defined. */ ++#if defined(EXTENDED_IDS) ++ uint16_t target; /* SCSI ID */ ++#else ++ uint8_t reserved; ++ uint8_t target; /* SCSI ID */ ++#endif ++ uint8_t modifier; /* Modifier (7-0). */ ++#define MK_SYNC_ID_LUN 0 /* Synchronize ID/LUN */ ++#define MK_SYNC_ID 1 /* Synchronize ID */ ++#define MK_SYNC_ALL 2 /* Synchronize all ID/LUN */ ++#define MK_SYNC_LIP 3 /* Synchronize all ID/LUN, */ ++ /* clear port changed, */ ++ /* use sequence number. */ ++ uint8_t reserved_1; ++ uint16_t sequence_number; /* Sequence number of event */ ++ uint16_t lun; /* SCSI LUN */ ++ uint8_t reserved_2[48]; ++} mrk_entry_t; ++ ++/* ++ * ISP queue - Status Contination entry structure definition. ++ */ ++#define STATUS_CONT_TYPE 0x10 /* Status contination entry */ ++#define EXT_STS_SENSE_BUF_LEN 60 ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t reserved; ++ uint8_t entry_status; /* Entry Status. */ ++ /* Extended sense data. */ ++ uint8_t req_sense_data[EXT_STS_SENSE_BUF_LEN]; ++} sts_cont_entry_t; ++ ++/* ++ * ISP queue - Management Server entry structure definition. ++ */ ++#define MS_IOCB_TYPE 0x29 /* Management Server IOCB entry */ ++typedef struct { ++ uint8_t entry_type; /* Entry type. */ ++ uint8_t entry_count; /* Entry count. */ ++ uint8_t sys_define; /* System defined. */ ++ uint8_t entry_status; /* Entry Status. */ ++ uint32_t handle1; /* System handle. */ ++#if defined(EXTENDED_IDS) ++ uint16_t loop_id; ++#else ++ uint8_t reserved; ++ uint8_t loop_id; ++#endif ++ uint16_t status; ++ uint16_t control_flags; /* Control flags. */ ++ uint16_t reserved2; ++ uint16_t timeout; ++ uint16_t cmd_dsd_count; ++ uint16_t total_dsd_count; ++ uint8_t type; ++ uint8_t r_ctl; ++ uint16_t rx_id; ++ uint16_t reserved3; ++ uint32_t handle2; ++ uint32_t rsp_bytecount; ++ uint32_t req_bytecount; ++ uint32_t dseg_req_address[2]; /* Data segment 0 address. */ ++ uint32_t dseg_req_length; /* Data segment 0 length. */ ++ uint32_t dseg_rsp_address[2]; /* Data segment 1 address. */ ++ uint32_t dseg_rsp_length; /* Data segment 1 length. */ ++} ms_iocb_entry_t; ++ ++ ++/* ++ * ISP queue - Mailbox Command entry structure definition. ++ */ ++#define ET_MAILBOX_COMMAND 0x39 ++struct mbx_entry { ++ uint8_t entry_type; ++ ++ uint8_t entry_count; ++ uint8_t sys_define1; ++ /* Use sys_define1 for source type */ ++#define SOURCE_SCSI 0x00 ++#define SOURCE_IP 0x01 ++#define SOURCE_VI 0x02 ++#define SOURCE_SCTP 0x03 ++#define SOURCE_MP 0x04 ++#define SOURCE_MPIOCTL 0x05 ++ ++ uint8_t entry_status; ++ ++ uint32_t handle; ++#if defined(EXTENDED_IDS) ++ uint16_t loop_id; ++#else ++ uint8_t reserved_1; ++ uint8_t loop_id; ++#endif ++ ++ uint16_t status; ++ uint16_t state_flags; ++ uint16_t status_flags; ++ uint16_t sys_define2[4]; ++ uint16_t mb0; ++ /* Mailbox command completion status */ ++#define MBS_PORT_ID_IN_USE 0x4007 ++#define MBS_LOOP_ID_IN_USE 0x4008 ++#define MBS_ALL_LOOP_IDS_IN_USE 0x4009 ++#define MBS_NAME_SERVER_NOT_LOGGED_IN 0x400A ++ ++ uint16_t mb1; ++ /* Fabric login mailbox command option bits */ ++#define MBC_NO_PLOGI_IF_LOGGED_IN 0x01 ++#define MBC_NO_PROCESS_LOGIN 0x02 ++ ++ uint16_t mb2; ++ uint16_t mb3; ++ uint16_t mb6; ++ uint16_t mb7; ++#if defined(EXTENDED_IDS) ++ uint16_t mb9; ++ uint16_t mb10; ++ uint32_t reserved_2[6]; ++#else ++ uint32_t reserved_2[7]; ++#endif ++}; ++ ++/* ++ * ISP request and response queue entry sizes ++ */ ++#define RESPONSE_ENTRY_SIZE (sizeof(response_t)) ++#define REQUEST_ENTRY_SIZE (sizeof(request_t)) ++ ++/* ++ * ISP status entry - completion status definitions. ++ */ ++#define CS_COMPLETE 0x0 /* No errors */ ++#define CS_INCOMPLETE 0x1 /* Incomplete transfer of cmd. */ ++#define CS_DMA 0x2 /* A DMA direction error. */ ++#define CS_TRANSPORT 0x3 /* Transport error. */ ++#define CS_RESET 0x4 /* SCSI bus reset occurred */ ++#define CS_ABORTED 0x5 /* System aborted command. */ ++#define CS_TIMEOUT 0x6 /* Timeout error. */ ++#define CS_DATA_OVERRUN 0x7 /* Data overrun. */ ++#define CS_DATA_UNDERRUN 0x15 /* Data Underrun. */ ++#define CS_ABORT_MSG 0xE /* Target rejected abort msg. */ ++#define CS_DEV_RESET_MSG 0x12 /* Target rejected dev rst msg. */ ++#define CS_PORT_UNAVAILABLE 0x28 /* Port unavailable (selection timeout) */ ++#define CS_PORT_LOGGED_OUT 0x29 /* Port Logged Out */ ++#define CS_PORT_CONFIG_CHG 0x2A /* Port Configuration Changed */ ++#define CS_PORT_BUSY 0x2B /* Port Busy */ ++#define CS_BAD_PAYLOAD 0x80 /* Driver defined */ ++#define CS_UNKNOWN 0x81 /* Driver defined */ ++#define CS_RETRY 0x82 /* Driver defined */ ++#define CS_QUEUE_FULL 0x1c /* Target queue full*/ ++ ++/* ++ * ISP status entry - SCSI status byte bit definitions. ++ */ ++#define SS_MASK 0xfff /* Mask off reserved bits BIT_12-BIT_15*/ ++#define SS_RESIDUAL_UNDER BIT_11 ++#define SS_RESIDUAL_OVER BIT_10 ++#define SS_SENSE_LEN_VALID BIT_9 ++#if defined(ISP2100) ++#define SS_RESIDUAL_LEN_VALID BIT_8 ++#else ++#define SS_RESPONSE_INFO_LEN_VALID BIT_8 ++#endif ++ ++#define SS_RESERVE_CONFLICT (BIT_4 | BIT_3) ++#define SS_BUSY_CONDITION BIT_3 ++#define SS_CONDITION_MET BIT_2 ++#define SS_CHECK_CONDITION BIT_1 ++ ++/* ++ * 24 bit port ID type definition. ++ */ ++typedef union { ++ uint32_t b24 : 24; ++ ++ struct { ++ uint8_t d_id[3]; ++ uint8_t rsvd_1; ++ } r; ++ ++ struct { ++ uint8_t al_pa; ++ uint8_t area; ++ uint8_t domain; ++ uint8_t rsvd_1; ++ } b; ++} port_id_t; ++ ++/* ++ * Switch info gathering structure. ++ */ ++typedef struct { ++ port_id_t d_id; ++ uint8_t node_name[WWN_SIZE]; ++ uint8_t port_name[WWN_SIZE]; ++ uint32_t type; ++#define SW_TYPE_SCSI BIT_0 ++#define SW_TYPE_IP BIT_1 ++} sw_info_t; ++ ++//TODO This should be removed (simplified fcport list) ++typedef struct ++{ ++ port_id_t d_id; ++ uint8_t name[WWN_SIZE]; ++ uint8_t wwn[WWN_SIZE]; /* port name */ ++ uint16_t loop_id; ++ uint16_t flag; ++ /* flags bits defined as follows */ ++#define DEV_PUBLIC BIT_0 ++#define DEV_LUNMASK_SET BIT_1 /* some LUNs masked for this device */ ++#define DEV_TAPE_DEVICE BIT_2 ++#define DEV_RELOGIN BIT_3 ++#define DEV_PORT_DOWN BIT_4 ++#define DEV_CONFIGURED BIT_5 ++#define DEV_ABSENCE BIT_6 ++#define DEV_RETURN BIT_7 ++#define DEV_INITIATOR BIT_8 ++#define DEV_FLAG_VSA BIT_9 ++ int port_login_retry_count; ++ uint8_t port_timer; ++}fcdev_t; ++ ++/* New device name list struct; used in configure_fabric. */ ++struct new_dev { ++ port_id_t d_id; ++ uint8_t name[WWN_SIZE]; ++ uint8_t wwn[WWN_SIZE]; /* port name */ ++}; ++#define LOGOUT_PERFORMED 0x01 ++ ++ ++/* ++ * Inquiry command structure. ++ */ ++#define INQ_SCSI_OPCODE 0x12 ++#define INQ_DATA_SIZE 36 ++ ++/* ++ * Inquiry mailbox IOCB packet definition. ++ */ ++typedef struct { ++ union { ++ cmd_a64_entry_t cmd; ++ sts_entry_t rsp; ++ } p; ++ uint8_t inq[INQ_DATA_SIZE]; ++} inq_cmd_rsp_t; ++ ++/* ++ * Report LUN command structure. ++ */ ++#define RPT_LUN_SCSI_OPCODE 0xA0 ++#define CHAR_TO_SHORT(a, b) (uint16_t)((uint8_t)b << 8 | (uint8_t)a) ++ ++typedef struct { ++ uint32_t len; ++ uint32_t rsrv; ++} rpt_hdr_t; ++ ++typedef struct { ++ struct { ++ uint8_t b : 6; ++ uint8_t address_method : 2; ++ } msb; ++ uint8_t lsb; ++ uint8_t unused[6]; ++} rpt_lun_t; ++ ++typedef struct { ++ rpt_hdr_t hdr; ++ rpt_lun_t lst[MAX_LUNS]; ++} rpt_lun_lst_t; ++ ++/* ++ * Report Lun mailbox IOCB packet definition. ++ */ ++typedef struct { ++ union { ++ cmd_a64_entry_t cmd; ++ sts_entry_t rsp; ++ } p; ++ rpt_lun_lst_t list; ++} rpt_lun_cmd_rsp_t; ++ ++//TODO Continue formatting ++/* ++ * SCSI Target Queue structure ++ */ ++typedef struct os_tgt { ++ struct os_lun *olun[MAX_LUNS]; /* LUN context pointer. */ ++ uint8_t port_down_retry_count; ++ struct scsi_qla_host *ha; ++ uint32_t down_timer; ++ ++ /* Persistent binding information */ ++ port_id_t d_id; ++ uint8_t node_name[WWN_SIZE]; ++ uint8_t port_name[WWN_SIZE]; ++ struct fc_port *vis_port; ++ ++ uint8_t flags; ++#define TGT_BUSY BIT_0 /* Reached hi-water mark */ ++#define TGT_TAGGED_QUEUE BIT_1 /* Tagged queuing. */ ++} os_tgt_t; ++ ++/* ++ * SCSI LUN Queue structure ++ */ ++typedef struct os_lun { ++ struct fc_lun *fclun; /* FC LUN context pointer. */ ++ spinlock_t q_lock; /* Lun Lock */ ++ ++ u_long io_cnt; /* total xfer count since boot */ ++ u_long out_cnt; /* total outstanding IO count */ ++ u_long w_cnt; /* total writes */ ++ u_long r_cnt; /* total reads */ ++ u_long avg_time; /* */ ++ ++ unsigned long q_flag; ++#define LUN_MPIO_BUSY 2 /* Lun is changing paths */ ++#define LUN_SCSI_SCAN_DONE BIT_3 /* indicates the scsi scan is done */ ++#define LUN_EXEC_DELAYED 7 /* Lun execution is delayed */ ++ ++ u_long q_timeout; /* total command timeouts */ ++ atomic_t q_timer; /* suspend timer */ ++ uint32_t q_count; /* current count */ ++ uint32_t q_max; /* maxmum count lun can be suspended */ ++ uint8_t q_state; /* lun State */ ++#define LUN_STATE_READY 1 /* indicates the lun is ready for i/o */ ++#define LUN_STATE_RUN 2 /* indicates the lun has a timer running */ ++#define LUN_STATE_WAIT 3 /* indicates the lun is suspended */ ++#define LUN_STATE_TIMEOUT 4 /* indicates the lun has timed out */ ++ ++} os_lun_t; ++ ++ ++/* LUN BitMask structure definition, array of 32bit words, ++ * 1 bit per lun. When bit == 1, the lun is masked. ++ * Most significant bit of mask[0] is lun 0, bit 24 is lun 7. ++ */ ++typedef struct lun_bit_mask { ++ /* Must allocate at least enough bits to accomodate all LUNs */ ++#if ((MAX_FIBRE_LUNS & 0x7) == 0) ++ UINT8 mask[MAX_FIBRE_LUNS >> 3]; ++#else ++ uint8_t mask[(MAX_FIBRE_LUNS + 8) >> 3]; ++#endif ++} lun_bit_mask_t; ++ ++/* ++ * Fibre channel port structure. ++ */ ++typedef struct fc_port { ++ struct list_head list; ++ ++ struct list_head fcluns; ++ ++ struct scsi_qla_host *ha; ++ struct scsi_qla_host *vis_ha; /* only used when suspending lun */ ++ port_id_t d_id; ++ uint16_t loop_id; ++ uint16_t old_loop_id; ++ int16_t lun_cnt; ++ int16_t dev_id; /* index in fc_dev table */ ++#define FC_NO_LOOP_ID 0x100 ++ uint8_t node_name[WWN_SIZE]; /* Big Endian. */ ++ uint8_t port_name[WWN_SIZE]; /* Big Endian. */ ++ uint8_t mp_byte; /* multi-path byte (not used) */ ++ uint8_t cur_path; /* current path id */ ++ int port_login_retry_count; ++ int login_retry; ++ atomic_t state; /* port state */ ++#define FC_DEVICE_DEAD 1 ++#define FC_DEVICE_LOST 2 ++#define FC_ONLINE 3 ++#define FC_LOGIN_NEEDED 4 ++ ++ uint8_t flags; ++#define FC_FABRIC_DEVICE BIT_0 ++#define FC_TAPE_DEVICE BIT_1 ++#define FC_INITIATOR_DEVICE BIT_2 ++#define FC_CONFIG BIT_3 ++#define FC_VSA BIT_4 ++#define FC_HD_DEVICE BIT_5 ++#define FC_SUPPORT_RPT_LUNS BIT_6 ++ atomic_t port_down_timer; ++ lun_bit_mask_t lun_mask; ++} fc_port_t; ++ ++/* ++ * Fibre channel LUN structure. ++ */ ++typedef struct fc_lun { ++ struct list_head list; ++ ++ fc_port_t *fcport; ++ uint16_t lun; ++ uint8_t max_path_retries; ++ uint8_t flags; ++#define FC_DISCON_LUN BIT_0 ++} fc_lun_t; ++ ++typedef struct ++{ ++ uint8_t in_use; ++}fabricid_t; ++ ++typedef struct { ++ struct list_head list; ++ ++ uint8_t node_name[WWN_SIZE]; ++ uint8_t port_name[WWN_SIZE]; ++ port_id_t d_id; ++ uint16_t loop_id; ++} fc_initiator_t; ++ ++/* ++ * Registered State Change Notification structures. ++ */ ++typedef struct { ++ port_id_t d_id; ++ uint8_t format; ++} rscn_t; ++ ++/* ++ * Flash Database structures. ++ */ ++#define FLASH_DATABASE_0 0x1c000 ++#define FLASH_DATABASE_1 0x18000 ++#define FLASH_DATABASE_VERSION 1 ++ ++typedef struct ++{ ++ uint32_t seq; ++ uint8_t version; ++ uint8_t checksum; ++ uint16_t size; ++ uint8_t spares[8]; ++}flash_hdr_t; ++ ++typedef struct ++{ ++ uint8_t name[WWN_SIZE]; ++ uint8_t spares[8]; ++}flash_node_t; ++ ++typedef struct ++{ ++ flash_hdr_t hdr; ++ flash_node_t node[MAX_FIBRE_DEVICES]; ++}flash_database_t; ++//TODO End formatting ++ ++/* ++ * FC-CT interface ++ * ++ * NOTE: All structures are in big-endian in form. ++ */ ++ ++#define CT_REJECT_RESPONSE 0x8001 ++#define CT_ACCEPT_RESPONSE 0x8002 ++ ++#define NS_N_PORT_TYPE 0x01 ++#define NS_NL_PORT_TYPE 0x02 ++#define NS_NX_PORT_TYPE 0x7F ++ ++#define GA_NXT_CMD 0x100 ++#define GA_NXT_REQ_SIZE (16 + 4) ++#define GA_NXT_RSP_SIZE (16 + 620) ++ ++#define GID_PT_CMD 0x1A1 ++#define GID_PT_REQ_SIZE (16 + 4) ++#define GID_PT_RSP_SIZE (16 + (MAX_FIBRE_DEVICES * 4)) ++ ++#define GPN_ID_CMD 0x112 ++#define GPN_ID_REQ_SIZE (16 + 4) ++#define GPN_ID_RSP_SIZE (16 + 8) ++ ++#define GNN_ID_CMD 0x113 ++#define GNN_ID_REQ_SIZE (16 + 4) ++#define GNN_ID_RSP_SIZE (16 + 8) ++ ++#define GFT_ID_CMD 0x117 ++#define GFT_ID_REQ_SIZE (16 + 4) ++#define GFT_ID_RSP_SIZE (16 + 32) ++ ++#define RFT_ID_CMD 0x217 ++#define RFT_ID_REQ_SIZE (16 + 4 + 32) ++#define RFT_ID_RSP_SIZE 16 ++ ++#define RFF_ID_CMD 0x21F ++#define RFF_ID_REQ_SIZE (16 + 4 + 2 + 1 + 1) ++#define RFF_ID_RSP_SIZE 16 ++ ++#define RNN_ID_CMD 0x213 ++#define RNN_ID_REQ_SIZE (16 + 4 + 8) ++#define RNN_ID_RSP_SIZE 16 ++ ++#define RSNN_NN_CMD 0x239 ++#define RSNN_NN_REQ_SIZE (16 + 8 + 1 + 255) ++#define RSNN_NN_RSP_SIZE 16 ++ ++/* CT command header -- request/response common fields */ ++struct ct_cmd_hdr { ++ uint8_t revision; ++ uint8_t in_id[3]; ++ uint8_t gs_type; ++ uint8_t gs_subtype; ++ uint8_t options; ++ uint8_t reserved; ++}; ++ ++/* CT command request */ ++struct ct_sns_req { ++ struct ct_cmd_hdr header; ++ uint16_t command; ++ uint16_t max_rsp_size; ++ uint32_t reserved; ++ ++ union { ++ /* GA_NXT, GPN_ID, GNN_ID, GFT_ID */ ++ struct { ++ uint8_t reserved; ++ uint8_t port_id[3]; ++ } port_id; ++ ++ struct { ++ uint8_t port_type; ++ uint8_t domain; ++ uint8_t area; ++ uint8_t reserved; ++ } gid_pt; ++ ++ struct { ++ uint8_t reserved; ++ uint8_t port_id[3]; ++ uint8_t fc4_types[32]; ++ } rft_id; ++ ++ struct { ++ uint8_t reserved; ++ uint8_t port_id[3]; ++ uint16_t reserved2; ++ uint8_t fc4_feature; ++ uint8_t fc4_type; ++ } rff_id; ++ ++ struct { ++ uint8_t reserved; ++ uint8_t port_id[3]; ++ uint8_t node_name[8]; ++ } rnn_id; ++ ++ struct { ++ uint8_t node_name[8]; ++ uint8_t name_len; ++ uint8_t sym_node_name[255]; ++ } rsnn_nn; ++ } req; ++}; ++ ++/* CT command response header */ ++struct ct_rsp_hdr { ++ struct ct_cmd_hdr header; ++ uint16_t response; ++ uint16_t residual; ++ uint8_t reserved; ++ uint8_t reason_code; ++ uint8_t explanation_code; ++ uint8_t vendor_unique; ++}; ++ ++struct ct_sns_gid_pt_data { ++ uint8_t control_byte; ++ uint8_t port_id[3]; ++}; ++ ++struct ct_sns_rsp { ++ struct ct_rsp_hdr header; ++ ++ union { ++ struct { ++ uint8_t port_type; ++ uint8_t port_id[3]; ++ uint8_t port_name[8]; ++ uint8_t sym_port_name_len; ++ uint8_t sym_port_name[255]; ++ uint8_t node_name[8]; ++ uint8_t sym_node_name_len; ++ uint8_t sym_node_name[255]; ++ uint8_t init_proc_assoc[8]; ++ uint8_t node_ip_addr[16]; ++ uint8_t class_of_service[4]; ++ uint8_t fc4_types[32]; ++ uint8_t ip_address[16]; ++ uint8_t fabric_port_name[8]; ++ uint8_t reserved; ++ uint8_t hard_address[3]; ++ } ga_nxt; ++ ++ struct { ++ struct ct_sns_gid_pt_data entries[MAX_FIBRE_DEVICES]; ++ } gid_pt; ++ ++ struct { ++ uint8_t port_name[8]; ++ } gpn_id; ++ ++ struct { ++ uint8_t node_name[8]; ++ } gnn_id; ++ ++ struct { ++ uint8_t fc4_types[32]; ++ } gft_id; ++ } rsp; ++}; ++ ++struct ct_sns_pkt { ++ union { ++ struct ct_sns_req req; ++ struct ct_sns_rsp rsp; ++ } p; ++}; ++ ++#if defined(ISP2100) ++#define GN_LIST_LENGTH 126 * sizeof(port_list_entry_t) ++#else ++#define GN_LIST_LENGTH 256 * sizeof(port_list_entry_t) ++#endif ++ ++/* ++ * Structure used in Get Port List mailbox command (0x75). ++ */ ++typedef struct { ++ uint8_t name[WWN_SIZE]; ++ uint16_t loop_id; ++} port_list_entry_t; ++ ++/* ++ * Structure used for device info. ++ */ ++typedef struct { ++ uint8_t name[WWN_SIZE]; ++ uint8_t wwn[WWN_SIZE]; ++ uint16_t loop_id; ++ uint8_t port_id[3]; ++} device_data_t; ++ ++//TODO Complete Formatting... ++ ++/* Mailbox command completion status */ ++#define MBS_PORT_ID_IN_USE 0x4007 ++#define MBS_LOOP_ID_IN_USE 0x4008 ++#define MBS_ALL_LOOP_IDS_IN_USE 0x4009 ++#define MBS_NAME_SERVER_NOT_LOGGED_IN 0x400A ++ ++ ++#define MAX_IOCTL_WAIT_THREADS 32 ++typedef struct _wait_q_t { ++ uint8_t flags; ++#define WQ_IN_USE 0x1 ++ ++ struct semaphore wait_q_sem; ++ struct _wait_q_t *pnext; ++} wait_q_t; ++ ++typedef struct hba_ioctl{ ++ ++ /* Ioctl cmd serialization */ ++ uint16_t access_bits; /* bits should be used atomically */ ++#define IOCTL_ACTIVE 1 /* first bit */ ++#define IOCTL_WANT 2 /* 2nd bit */ ++ ++ spinlock_t wait_q_lock; /* IOCTL wait_q Queue Lock */ ++ wait_q_t wait_q_arr[MAX_IOCTL_WAIT_THREADS]; ++ wait_q_t *wait_q_head; ++ wait_q_t *wait_q_tail; ++ ++ /* Passthru cmd/completion */ ++ struct semaphore cmpl_sem; ++ struct timer_list cmpl_timer; ++ uint8_t ioctl_tov; ++ uint8_t SCSIPT_InProgress; ++ uint8_t MSIOCB_InProgress; ++ ++ os_tgt_t *ioctl_tq; ++ os_lun_t *ioctl_lq; ++ ++ /* AEN queue */ ++ void *aen_tracking_queue;/* points to async events buffer */ ++ uint8_t aen_q_head; /* index to the current head of q */ ++ uint8_t aen_q_tail; /* index to the current tail of q */ ++ ++ /* Misc. */ ++ uint32_t flags; ++#define IOCTL_OPEN BIT_0 ++#define IOCTL_AEN_TRACKING_ENABLE BIT_1 ++ uint8_t *scrap_mem; /* per ha scrap buf for ioctl usage */ ++ uint32_t scrap_mem_size; /* total size */ ++ uint32_t scrap_mem_used; /* portion used */ ++ ++} hba_ioctl_context; ++ ++/* Mailbox command semaphore queue for command serialization */ ++typedef struct _mbx_cmdq_t { ++ struct semaphore cmd_sem; ++ struct _mbx_cmdq_t *pnext; ++} mbx_cmdq_t; ++ ++/* ++ * Linux Host Adapter structure ++ */ ++typedef struct scsi_qla_host ++{ ++ struct list_head list; ++ ++ /* Linux adapter configuration data */ ++ struct Scsi_Host *host; /* pointer to host data */ ++ struct pci_dev *pdev; ++ ++ u_long host_no; ++ u_long instance; ++ ++ device_reg_t *iobase; /* Base Memory-mapped I/O address */ ++ volatile unsigned char *mmpbase; /* memory mapped address */ ++ ++ struct qla_board_info *brd_info; ++ uint16_t fw_major_version; ++ uint16_t fw_minor_version; ++ uint16_t fw_subminor_version; ++ uint16_t fw_attributes; ++ uint32_t fw_transfer_size; ++ ++ uint16_t fw_options1; ++ uint16_t fw_options2; ++ uint16_t fw_options3; ++ uint8_t fw_seriallink_options[2]; ++ ++ ms_iocb_entry_t *ms_iocb; ++ dma_addr_t ms_iocb_dma; ++ struct ct_sns_pkt *ct_sns; ++ dma_addr_t ct_sns_dma; ++ ++ uint16_t isp_ctrl_status; ++ ++ uint16_t revision; ++ uint8_t ports; ++ u_long actthreads; ++ u_long ipreq_cnt; ++ u_long qthreads; ++ u_long spurious_int; ++ uint32_t total_isr_cnt; /* Interrupt count */ ++ uint32_t total_isp_aborts; /* controller err cnt */ ++ uint32_t total_lip_cnt; /* LIP cnt */ ++ uint32_t total_dev_errs; /* device error cnt */ ++ uint32_t total_ios; /* IO cnt */ ++ uint64_t total_bytes; /* xfr byte cnt */ ++ ++ /* Adapter I/O statistics for failover */ ++ uint64_t IosRequested; ++ uint64_t BytesRequested; ++ uint64_t IosExecuted; ++ uint64_t BytesExecuted; ++ ++ /* ISP connection configuration data */ ++ uint16_t max_public_loop_ids; ++ uint16_t min_external_loopid; /* First external loop Id */ ++ uint8_t current_topology; /* Current ISP configuration */ ++ uint8_t prev_topology; /* Previous ISP configuration */ ++ #define ISP_CFG_NL 1 ++ #define ISP_CFG_N 2 ++ #define ISP_CFG_FL 4 ++ #define ISP_CFG_F 8 ++ uint8_t id; /* Host adapter SCSI id */ ++ uint16_t loop_id; /* Host adapter loop id */ ++ port_id_t d_id; /* Host adapter port id */ ++ ++ uint8_t operating_mode; /* current F/W operating mode */ ++ #define LOOP 0 ++ #define P2P 1 ++ #define LOOP_P2P 2 ++ #define P2P_LOOP 3 ++ ++ uint8_t active_fc4_types;/* active fc4 types */ ++ uint8_t current_speed; /* current F/W operating speed */ ++ ++ /* NVRAM configuration data */ ++ uint16_t loop_reset_delay; /* Loop reset delay. */ ++ uint16_t hiwat; /* High water mark per device. */ ++ uint16_t execution_throttle; /* queue depth */ ++ uint16_t minimum_timeout; /* Minimum timeout. */ ++ uint8_t retry_count; ++ uint8_t login_timeout; ++ int port_down_retry_count; ++ uint8_t loop_down_timeout; ++ uint16_t max_probe_luns; ++ uint16_t max_luns; ++ uint16_t max_targets; ++ ++ /* Fibre Channel Device List. */ ++ struct list_head fcports; ++ ++ /* OS target queue pointers. */ ++ os_tgt_t *otgt[MAX_FIBRE_DEVICES]; ++ ++ /* Fibre Channel Device Database and LIP sequence. */ ++ fcdev_t fc_db[MAX_FIBRE_DEVICES]; /* Driver database. */ ++ uint32_t flash_db; /* Flash database address in use. */ ++ fabricid_t fabricid[MAX_FIBRE_DEVICES]; /* Fabric ids table . */ ++ uint32_t flash_seq; /* Flash database seq # in use. */ ++ volatile uint16_t lip_seq; /* LIP sequence number. */ ++ ++ /* Tracks host adapters we find */ ++ struct list_head fcinitiators; /* Initiator database */ ++ ++ /* RSCN queue. */ ++ rscn_t rscn_queue[MAX_RSCN_COUNT]; ++ uint8_t rscn_in_ptr; ++ uint8_t rscn_out_ptr; ++ ++ /* Doneq bottom half handler */ ++ struct work_struct run_qla_task; ++ ++ /* __get_free_pages() srb_t pool */ ++ srb_t *srb_pool; ++ int srb_pool_order; ++ ++ /* ++ * Need to hold the list_lock with irq's disabled in order to ++ * access the following list. ++ * This list_lock is of lower priority than the io_request_lock. ++ */ ++ /*********************************************************/ ++ spinlock_t list_lock; /* lock to guard lists which ++ hold srb_t's*/ ++ struct list_head retry_queue; /* watchdog queue */ ++ struct list_head done_queue; /* job on done queue */ ++ struct list_head failover_queue; /* failover list link. */ ++ struct list_head free_queue; /* SRB free queue */ ++ struct list_head scsi_retry_queue; /* SCSI retry queue */ ++ ++ struct list_head pending_queue; /* SCSI command pending queue */ ++ ++ /*********************************************************/ ++ ++ /* This spinlock is used to protect "io transactions", you must ++ * aquire it before doing any IO to the card, eg with RD_REG*() and ++ * WRT_REG*() for the duration of your entire commandtransaction. ++ * ++ * This spinlock is of lower priority than the io request lock. ++ */ ++ ++ spinlock_t hardware_lock; ++ ++ /* Linux kernel thread */ ++#if 0 ++ struct task_struct *dpc_handler; /* kernel thread */ ++ struct semaphore *dpc_notify; /* requester waits for DPC on this semaphore */ ++ struct semaphore dpc_sem; /* DPC's semaphore */ ++#endif ++ pid_t dpc_pid; ++ int dpc_should_die; ++ struct completion dpc_inited; ++ struct completion dpc_exited; ++ struct semaphore *dpc_wait; ++ ++ uint8_t dpc_active; /* DPC routine is active */ ++ ++ /* Received ISP mailbox data. */ ++ volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT]; ++ ++ /* Outstandings ISP commands. */ ++ srb_t *outstanding_cmds[MAX_OUTSTANDING_COMMANDS]; ++ uint32_t current_outstanding_cmd; ++ ++ /* ISP ring lock, rings, and indexes */ ++ dma_addr_t request_dma; /* Physical address. */ ++ request_t *request_ring; /* Base virtual address */ ++ request_t *request_ring_ptr; /* Current address. */ ++ uint16_t req_ring_index; /* Current index. */ ++ uint16_t req_q_cnt; /* Number of available entries. */ ++ ++ dma_addr_t response_dma; /* Physical address. */ ++ response_t *response_ring; /* Base virtual address */ ++ response_t *response_ring_ptr; /* Current address. */ ++ uint16_t rsp_ring_index; /* Current index. */ ++ ++#if defined(FC_IP_SUPPORT) ++ /* Data for IP support */ ++ uint8_t ip_port_name[WWN_SIZE]; ++ ++ struct risc_rec_entry *risc_rec_q; /* RISC receive queue */ ++ dma_addr_t risc_rec_q_dma; /* physical address */ ++ uint16_t rec_entries_in; ++ uint16_t rec_entries_out; ++ ++ struct send_cb *active_scb_q[MAX_SEND_PACKETS]; ++ uint32_t current_scb_q_idx; ++ ++ uint32_t mtu; ++ uint16_t header_size; ++ uint16_t max_receive_buffers; ++ struct buffer_cb *receive_buffers; ++ uint32_t receive_buff_data_size; ++ ++ void (*send_completion_routine) ++ (struct send_cb *scb); ++ void *receive_packets_context; ++ void (*receive_packets_routine) ++ (void *context, struct buffer_cb *bcb); ++ void *notify_context; ++ void (*notify_routine) ++ (void *context, uint32_t type); ++ ++ struct ip_device ipdev_db[QLLAN_MAX_IP_DEVICES]; ++ struct ip_device *ipdev_db_next_free; ++ struct ip_device *ipdev_db_top; ++ struct ip_device *ipdev_db_bottom; ++#endif ++ ++ /* Firmware Initialization Control Block data */ ++ dma_addr_t init_cb_dma; /* Physical address. */ ++ init_cb_t *init_cb; ++ ++ /* Timeout timers. */ ++ uint8_t queue_restart_timer; ++ atomic_t loop_down_timer; /* loop down timer */ ++ uint8_t loop_down_abort_time; /* port down timer */ ++ uint32_t timer_active; ++ uint32_t forceLip; ++ struct timer_list timer; ++ ++ /* These are used by mailbox operations. */ ++ mbx_cmd_t *mcp; ++ unsigned long mbx_cmd_flags; ++#define MBX_CMD_ACTIVE 1 /* first bit */ ++#define MBX_CMD_WANT 2 /* 2nd bit */ ++#define MBX_INTERRUPT 3 /* 3rd bit */ ++#define MBX_INTR_WAIT 4 /* 4rd bit */ ++ ++ spinlock_t mbx_reg_lock; /* Mbx Cmd Register Lock */ ++ spinlock_t mbx_q_lock; /* Mbx Active Cmd Queue Lock */ ++ spinlock_t mbx_bits_lock; /* Mailbox access bits Lock */ ++ ++ uint32_t mbx_lock_bits; /* controlled by mbx_bits_lock */ ++#define MBX_CMD_LOCK 1 /* first bit */ ++#define MBX_CMD_WANT 2 /* 2nd bit */ ++ ++ struct semaphore mbx_intr_sem; /* Used for completion notification */ ++ ++ mbx_cmdq_t *mbx_sem_pool_head; /* Head Pointer to a list of ++ * recyclable mbx semaphore pool ++ * to be used during run time. ++ */ ++ mbx_cmdq_t *mbx_sem_pool_tail; /* Tail Pointer to semaphore pool*/ ++#define MBQ_INIT_LEN 16 /* initial mbx sem pool q len. actual len may vary */ ++ ++ mbx_cmdq_t *mbx_q_head; /* Head Pointer to sem q for active cmds */ ++ mbx_cmdq_t *mbx_q_tail; /* Tail Pointer to sem q for active cmds */ ++ ++ ++ uint32_t retry_q_cnt; ++ uint32_t scsi_retry_q_cnt; ++ uint32_t failover_cnt; ++ ++ uint8_t *cmdline; ++ ++ uint32_t login_retry_count; ++ ++ volatile struct ++ { ++ uint32_t online :1; /* 0 */ ++ uint32_t enable_64bit_addressing :1; /* 1 */ ++ uint32_t mbox_int :1; /* 2 */ ++ uint32_t mbox_busy :1; /* 3 */ ++ // UNUSED and UNASSIGNED ++ uint32_t port_name_used :1; /* 4 */ ++ uint32_t failover_enabled :1; /* 5 */ ++ uint32_t watchdog_enabled :1; /* 6 */ ++ uint32_t cfg_suspended :1; /* 7 */ ++ ++ uint32_t disable_host_adapter :1; /* 8 */ ++ uint32_t rscn_queue_overflow :1; /* 9 */ ++ uint32_t reset_active :1; /* 10 */ ++ uint32_t link_down_error_enable :1; /* 11 */ ++ ++ uint32_t disable_risc_code_load :1; /* 12 */ ++ uint32_t set_cache_line_size_1 :1; /* 13 */ ++ uint32_t enable_target_mode :1; /* 14 */ ++ uint32_t disable_luns :1; /* 15 */ ++ ++ uint32_t enable_lip_reset :1; /* 16 */ ++ uint32_t enable_lip_full_login :1; /* 17 */ ++ uint32_t enable_target_reset :1; /* 18 */ ++ uint32_t updated_fc_db :1; /* 19 */ ++ ++ uint32_t enable_flash_db_update :1; /* 20 */ ++ uint32_t in_isr :1; /* 21 */ ++ uint32_t dpc_sched :1; /* 23 */ ++ ++ uint32_t nvram_config_done :1; /* 24 */ ++ uint32_t update_config_needed :1; /* 25 */ ++ uint32_t management_server_logged_in :1; /* 26 */ ++#if defined(FC_IP_SUPPORT) ++ uint32_t enable_ip :1; /* 27 */ ++#endif ++ ++ } flags; ++ ++ uint32_t device_flags; ++#define DFLG_LOCAL_DEVICES BIT_0 ++#define DFLG_RETRY_LOCAL_DEVICES BIT_1 ++#define DFLG_FABRIC_DEVICES BIT_2 ++#define SWITCH_FOUND BIT_3 ++#define DFLG_NO_CABLE BIT_4 ++ ++ unsigned long cpu_flags; ++ ++ uint8_t marker_needed; ++ uint8_t missing_targets; ++ uint8_t sns_retry_cnt; ++ uint8_t cmd_wait_cnt; ++ uint8_t mem_err; ++ ++ unsigned long dpc_flags; ++#define RESET_MARKER_NEEDED 0 /* initiate sending a marker to ISP */ ++#define RESET_ACTIVE 1 ++#define ISP_ABORT_NEEDED 2 /* initiate ISP Abort */ ++#define ABORT_ISP_ACTIVE 3 /* isp abort in progress */ ++ ++#define LOOP_RESYNC_NEEDED 4 /* initiate a configure fabric sequence */ ++#define LOOP_RESYNC_ACTIVE 5 ++#define COMMAND_WAIT_NEEDED 6 ++#define COMMAND_WAIT_ACTIVE 7 ++ ++#define LOCAL_LOOP_UPDATE 8 /* Perform a local loop update */ ++#define RSCN_UPDATE 9 /* Perform a RSCN update */ ++#define MAILBOX_RETRY 10 ++#define ISP_RESET_NEEDED 11 /* Initiate a ISP reset ??? */ ++ ++#define FAILOVER_EVENT_NEEDED 12 ++#define FAILOVER_EVENT 13 ++#define FAILOVER_NEEDED 14 ++#define LOOP_RESET_NEEDED 15 ++ ++#define DEVICE_RESET_NEEDED 16 ++#define DEVICE_ABORT_NEEDED 17 ++#define SCSI_RESTART_NEEDED 18 /* Processes any requests in scsi retry queue */ ++#define PORT_RESTART_NEEDED 19 /* Processes any requests in retry queue */ ++ ++#define RESTART_QUEUES_NEEDED 20 /* Restarts requeusts in the lun queue */ ++#define ABORT_QUEUES_NEEDED 21 ++#define RELOGIN_NEEDED 22 ++#define LOGIN_RETRY_NEEDED 23 /* initiates any fabric logins that are required */ ++#define REGISTER_FC4_NEEDED 24 /* set when need to register again.*/ ++ ++#define TASKLET_SCHED 25 /* Tasklet is scheduled. */ ++#define DONE_RUNNING 26 /* Done task is running. */ ++#define ISP_ABORT_RETRY 27 /* ISP aborted. */ ++ ++ ++/* macro for timer to start dpc for handling mailbox commands */ ++#define MAILBOX_CMD_NEEDED (LOOP_RESET_NEEDED|DEVICE_RESET_NEEDED| \ ++ DEVICE_ABORT_NEEDED|ISP_ABORT_NEEDED) ++ ++ /* These 3 fields are used by the reset done in dpc thread */ ++ uint16_t reset_bus_id; ++ uint16_t reset_tgt_id; ++ uint16_t reset_lun; ++ ++ uint8_t interrupts_on; ++ uint8_t init_done; ++ ++ volatile uint16_t loop_state; ++#define LOOP_TIMEOUT 0x01 ++#define LOOP_DOWN 0x02 ++#define LOOP_UP 0x04 ++#define LOOP_UPDATE 0x08 ++#define LOOP_READY 0x10 ++ ++ mbx_cmd_t mc; ++ uint32_t mbx_flags; ++#define MBX_IN_PROGRESS BIT_0 ++#define MBX_BUSY BIT_1 /* Got the Access */ ++#define MBX_SLEEPING_ON_SEM BIT_2 ++#define MBX_POLLING_FOR_COMP BIT_3 ++#define MBX_COMPLETED BIT_4 ++#define MBX_TIMEDOUT BIT_5 ++#define MBX_ACCESS_TIMEDOUT BIT_6 ++ ++/* following are new and needed for IOCTL support */ ++ hba_ioctl_context *ioctl; ++ uint8_t node_name[WWN_SIZE]; ++ ++ uint8_t optrom_major; ++ uint8_t optrom_minor; ++ ++ uint8_t nvram_version; ++ ++ void *ioctl_mem; ++ dma_addr_t ioctl_mem_phys; ++ uint32_t ioctl_mem_size; ++ uint32_t isp_abort_cnt; ++ ++ /* HBA serial number */ ++ uint8_t serial0; ++ uint8_t serial1; ++ uint8_t serial2; ++ ++ /* oem related items */ ++ uint8_t oem_id; ++ uint8_t oem_specific[31]; ++ ++ uint32_t dump_done; ++ unsigned long done_q_cnt; ++ unsigned long pending_in_q; ++ ++ uint32_t failover_type; ++ uint32_t failback_delay; ++ unsigned long cfg_flags; ++#define CFG_ACTIVE 0 /* CFG during a failover, event update, or ioctl */ ++ /* uint8_t cfg_active; */ ++ int eh_start; ++ ++#if defined(IOCB_THROLLE_USAGE) ++ uint32_t iocb_hiwat; ++ uint32_t iocb_cnt; ++ uint32_t iocb_overflow_cnt; ++#endif ++ ++ int srb_cnt; ++ int srb_alloc_cnt; /*Number of allocated SRBs */ ++ ++ uint32_t mbox_trace; ++ ++ uint32_t binding_type; ++#define BIND_BY_PORT_NAME 0 ++#define BIND_BY_PORT_ID 1 ++#define BIND_BY_NODE_NAME 2 ++ ++ srb_t *status_srb; /* Keep track of Status Continuation Entries */ ++ ++ uint32_t dropped_frame_error_cnt; ++} scsi_qla_host_t; ++ ++#if defined(__BIG_ENDIAN) ++/* Big endian machine correction defines. */ ++#define LITTLE_ENDIAN_16(x) qla2x00_chg_endian((uint8_t *)&(x), 2) ++#define LITTLE_ENDIAN_24(x) qla2x00_chg_endian((uint8_t *)&(x), 3) ++#define LITTLE_ENDIAN_32(x) qla2x00_chg_endian((uint8_t *)&(x), 4) ++#define LITTLE_ENDIAN_64(x) qla2x00_chg_endian((uint8_t *)&(x), 8) ++#define BIG_ENDIAN_16(x) ++#define BIG_ENDIAN_24(x) ++#define BIG_ENDIAN_32(x) ++#define BIG_ENDIAN_64(x) ++ ++#else ++/* Little endian machine correction defines. */ ++#define LITTLE_ENDIAN_16(x) ++#define LITTLE_ENDIAN_24(x) ++#define LITTLE_ENDIAN_32(x) ++#define LITTLE_ENDIAN_64(x) ++#define BIG_ENDIAN_16(x) qla2x00_chg_endian((uint8_t *)&(x), 2) ++#define BIG_ENDIAN_24(x) qla2x00_chg_endian((uint8_t *)&(x), 3) ++#define BIG_ENDIAN_32(x) qla2x00_chg_endian((uint8_t *)&(x), 4) ++#define BIG_ENDIAN_64(x) qla2x00_chg_endian((uint8_t *)&(x), 8) ++ ++#endif ++ ++/* ++ * Macros to help code, maintain, etc. ++ */ ++#define LOOP_TRANSITION(ha) ( test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || \ ++ test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) ) ++ ++#define LOOP_NOT_READY(ha) ( (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || \ ++ test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) || \ ++ test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || \ ++ test_bit(LOOP_RESYNC_ACTIVE, &ha->dpc_flags) || \ ++ test_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags) || \ ++ test_bit(COMMAND_WAIT_ACTIVE, &ha->dpc_flags)) || \ ++ ha->loop_state == LOOP_DOWN) ++ ++#define LOOP_RDY(ha) ( !LOOP_NOT_READY(ha) ) ++ ++#define TGT_Q(ha, t) (ha->otgt[t]) ++#define LUN_Q(ha, t, l) (TGT_Q(ha, t)->olun[l]) ++#define GET_LU_Q(ha, t, l) ( (TGT_Q(ha,t) != NULL)? TGT_Q(ha, t)->olun[l] : NULL) ++#define PORT_DOWN_TIMER(ha, t) ((ha)->fc_db[(t)].port_timer) ++#define PORT(ha, t) ((ha)->fc_db[(t)]) ++#define PORT_LOGIN_RETRY(fcport) ((fcport)->port_login_retry_count) ++ ++#define MBOX_TRACE(ha,b) {(ha)->mbox_trace |= (b);} ++ ++#define MBS_MASK 0x3fff ++#define MBS_END 0x100 ++#define QLA2X00_SUCCESS (MBS_COMMAND_COMPLETE & MBS_MASK) ++#define QLA2X00_FAILED (MBS_END + 2) ++#define QLA2X00_FUNCTION_FAILED (MBS_END + 2) ++ ++#define KMEM_ZALLOC(siz,id) qla2x00_kmem_zalloc((siz), GFP_ATOMIC, (id)) ++#define KMEM_FREE(ip,siz) kfree((ip)) ++ ++/* ++ * LOCK MACROS ++ */ ++#define QLA_MBX_REG_LOCK(ha) \ ++ spin_lock_irqsave(&(ha)->mbx_reg_lock, mbx_flags); ++#define QLA_MBX_REG_UNLOCK(ha) \ ++ spin_unlock_irqrestore(&(ha)->mbx_reg_lock, mbx_flags); ++ ++/* ++* Stat info for all adpaters ++*/ ++struct _qla2x00stats { ++ unsigned long mboxtout; /* mailbox timeouts */ ++ unsigned long mboxerr; /* mailbox errors */ ++ unsigned long ispAbort; /* ISP aborts */ ++ unsigned long debugNo; ++ unsigned long loop_resync; ++ unsigned long outarray_full; ++ unsigned long retry_q_cnt; ++}; ++ ++#define SYS_DELAY(x) udelay(x);barrier() ++#define QLA2100_DELAY(sec) mdelay(sec * HZ) ++#define NVRAM_DELAY() udelay(10) ++#define UDELAY(x) udelay(x) ++ ++#define CACHE_FLUSH(a) (RD_REG_WORD(a)) ++#define INVALID_HANDLE (MAX_OUTSTANDING_COMMANDS+1) ++ ++#define ABORTS_ACTIVE ((test_bit(LOOP_RESET_NEEDED, &ha->dpc_flags)) || \ ++ (test_bit(DEVICE_RESET_NEEDED, &ha->dpc_flags)) || \ ++ (test_bit(DEVICE_ABORT_NEEDED, &ha->dpc_flags)) || \ ++ (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags))) ++ ++/* ++ * Flash support definitions ++ */ ++#define FLASH_IMAGE_SIZE 131072 ++ ++#include "qla_fo.h" ++#include "qla_cfg.h" ++#include "qla_gbl.h" ++#include "qla_dbg.h" ++#include "qla_inline.h" ++#include "qla_listops.h" ++ ++#endif +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_fo.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,1681 @@ ++/******************************************************************************** ++* QLOGIC LINUX SOFTWARE ++* ++* QLogic ISP2x00 device driver for Linux 2.5.x ++* Copyright (C) 2003 Qlogic Corporation ++* (www.qlogic.com) ++* ++* This program is free software; you can redistribute it and/or modify it ++* under the terms of the GNU General Public License as published by the ++* Free Software Foundation; either version 2, or (at your option) any ++* later version. ++* ++* This program is distributed in the hope that it will be useful, but ++* WITHOUT ANY WARRANTY; without even the implied warranty of ++* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++* General Public License for more details. ++* ++****************************************************************************** ++* Failover include file ++******************************************************************************/ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++#include "qlfo.h" ++#include "qlfolimits.h" ++ ++//TODO Why?? ++#include "qla_fo.cfg" ++ ++/* ++ * Global variables ++ */ ++SysFoParams_t qla_fo_params; ++ ++/* ++ * Local routines ++ */ ++#if !defined(linux) ++static int qla2x00_sdm_setup(EXT_IOCTL *cmd_stp, void *arg, int mode); ++#endif ++static uint32_t qla2x00_fo_get_params(PFO_PARAMS pp); ++static uint32_t qla2x00_fo_set_params(PFO_PARAMS pp); ++static uint8_t qla2x00_fo_count_retries(scsi_qla_host_t *ha, srb_t *sp); ++static int qla2x00_fo_get_lun_data(EXT_IOCTL *pext, ++ FO_LUN_DATA_INPUT *bp, int mode); ++static int qla2x00_fo_set_lun_data(EXT_IOCTL *pext, ++ FO_LUN_DATA_INPUT *bp, int mode); ++static uint32_t qla2x00_fo_stats(FO_HBA_STAT *stat_p, uint8_t reset); ++static int qla2x00_fo_set_target_data(EXT_IOCTL *pext, ++ FO_TARGET_DATA_INPUT *bp, int mode); ++static int qla2x00_fo_get_target_data(EXT_IOCTL *pext, ++ FO_TARGET_DATA_INPUT *bp, int mode); ++ ++/* ++ * qla2x00_get_hba ++ * Searches the hba structure chain for the requested instance ++ * aquires the mutex and returns a pointer to the hba structure. ++ * ++ * Input: ++ * inst = adapter instance number. ++ * ++ * Returns: ++ * Return value is a pointer to the adapter structure or ++ * NULL if instance not found. ++ * ++ * Context: ++ * Kernel context. ++ */ ++scsi_qla_host_t * ++qla2x00_get_hba(int instance) ++{ ++ int found; ++ struct list_head *hal; ++ scsi_qla_host_t *ha; ++ ++ ha = NULL; ++ found = 0; ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (ha->instance == instance) { ++ found++; ++ break; ++ } ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ return (found ? ha : NULL); ++} ++ ++/* ++ * qla2x00_fo_stats ++ * Searches the hba structure chan for the requested instance ++ * aquires the mutex and returns a pointer to the hba structure. ++ * ++ * Input: ++ * stat_p = Pointer to FO_HBA_STAT union. ++ * reset = Flag, TRUE = reset statistics. ++ * FALSE = return statistics values. ++ * ++ * Returns: ++ * 0 = success ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint32_t ++qla2x00_fo_stats(FO_HBA_STAT *stat_p, uint8_t reset) ++{ ++ int32_t inst, idx; ++ uint32_t rval = 0; ++ struct list_head *hal; ++ scsi_qla_host_t *ha; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ inst = stat_p->input.HbaInstance; ++ stat_p->info.HbaCount = 0; ++ ++ ha = NULL; ++ ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (inst == FO_ADAPTER_ALL) { ++ stat_p->info.HbaCount++; ++ idx = ha->instance; ++ } else if (ha->instance == inst) { ++ stat_p->info.HbaCount = 1; ++ idx = inst; ++ } ++ if (reset == TRUE) { ++ DEBUG9(printk("%s: reset stats.\n", __func__);) ++ ha->IosRequested = 0; ++ ha->BytesRequested = 0; ++ ha->IosExecuted = 0; ++ ha->BytesExecuted = 0; ++ } else { ++ DEBUG9(printk("%s: get stats for inst %d.\n", ++ __func__, inst);) ++ ++#if 0 ++ stat_p->info.StatEntry[idx].IosRequested = ++ ha->IosRequested; ++ stat_p->info.StatEntry[idx].BytesRequested = ++ ha->BytesRequested; ++ stat_p->info.StatEntry[idx].IosExecuted = ++ ha->IosExecuted; ++ stat_p->info.StatEntry[idx].BytesExecuted = ++ ha->BytesExecuted; ++#endif ++ } ++ if (inst != FO_ADAPTER_ALL) ++ break; ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_fo_get_lun_data ++ * Get lun data from all devices attached to a HBA (FO_GET_LUN_DATA). ++ * Gets lun mask if failover not enabled. ++ * ++ * Input: ++ * ha = pointer to adapter ++ * bp = pointer to buffer ++ * ++ * Return; ++ * 0 on success or errno. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_fo_get_lun_data(EXT_IOCTL *pext, FO_LUN_DATA_INPUT *bp, int mode) ++{ ++ scsi_qla_host_t *ha; ++ struct list_head *fcports, *fcpl; ++ fc_port_t *fcport; ++ int ret = 0; ++ mp_host_t *host = NULL; ++ mp_device_t *dp; ++ mp_path_t *path; ++ mp_path_list_t *pathlist; ++ os_tgt_t *ostgt; ++ uint8_t path_id; ++ uint16_t dev_no; ++ uint16_t cnt; ++ uint16_t lun; ++ FO_EXTERNAL_LUN_DATA_ENTRY *u_entry, *entry; ++ FO_LUN_DATA_LIST *u_list, *list; ++ ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ ha = qla2x00_get_hba((int)bp->HbaInstance); ++ ++ if (!ha) { ++ DEBUG2_9_10(printk("%s: no ha matching inst %d.\n", ++ __func__, bp->HbaInstance);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s: ha inst %ld, buff %p.\n", ++ __func__, ha->instance, bp);) ++ DEBUG4(printk("%s: hba %p, buff %p bp->HbaInstance(%x).\n", ++ __func__, ha, bp, (int)bp->HbaInstance)); ++ ++ if (ha->flags.failover_enabled) ++ if ((host = qla2x00_cfg_find_host(ha)) == NULL) { ++ DEBUG2_9_10(printk("%s: no HOST for ha inst %ld.\n", ++ __func__, ha->instance);) ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ list = (FO_LUN_DATA_LIST *)qla2x00_kmem_zalloc( ++ sizeof(FO_LUN_DATA_LIST), GFP_ATOMIC, 12); ++ if (list == NULL) { ++ DEBUG2_9_10(printk("%s: failed to alloc memory of size (%d)\n", ++ __func__, (int)sizeof(FO_LUN_DATA_LIST));) ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (-ENOMEM); ++ } ++ ++ entry = &list->DataEntry[0]; ++ ++ u_list = (FO_LUN_DATA_LIST *)pext->ResponseAdr; ++ u_entry = &u_list->DataEntry[0]; ++ ++ /* find the correct fcport list */ ++ if (!ha->flags.failover_enabled) ++ fcports = &ha->fcports; ++ else ++ fcports = host->fcports; ++ ++ /* Check thru this adapter's fcport list */ ++ fcport = NULL; ++ list_for_each(fcpl, fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ memcpy(entry->NodeName, ++ fcport->node_name, EXT_DEF_WWN_NAME_SIZE); ++ memcpy(entry->PortName, ++ fcport->port_name, EXT_DEF_WWN_NAME_SIZE); ++ ++ if (!ha->flags.failover_enabled) { ++ /* ++ * Failover disabled. Just return LUN mask info ++ * in lun data entry of this port. ++ */ ++ entry->TargetId = 0; ++ for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { ++ if (!(ostgt = ha->otgt[cnt])) { ++ continue; ++ } ++ ++ if (ostgt->vis_port == fcport) { ++ entry->TargetId = cnt; ++ break; ++ } ++ } ++ if (cnt == MAX_FIBRE_DEVICES) { ++ /* Not found? For now just go to next port. */ ++#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_10) ++ uint8_t *tmp_name; ++ ++ tmp_name = fcport->port_name; ++ ++ printk("%s(%ld): ERROR - port " ++ "%02x%02x%02x%02x%02x%02x%02x%02x " ++ "not configured.\n", ++ __func__, ha->host_no, ++ tmp_name[0], tmp_name[1], tmp_name[2], ++ tmp_name[3], tmp_name[4], tmp_name[5], ++ tmp_name[6], tmp_name[7]); ++#endif /* DEBUG */ ++ ++ continue; ++ } ++ ++ /* Got a valid port */ ++ list->EntryCount++; ++ ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ /* set MSB if masked */ ++ entry->Data[lun] = LUN_DATA_PREFERRED_PATH; ++ if (!EXT_IS_LUN_BIT_SET(&(fcport->lun_mask), ++ lun)) { ++ entry->Data[lun] |= LUN_DATA_ENABLED; ++ } ++ } ++ ++ DEBUG9(printk("%s: got lun_mask for tgt %d\n", ++ __func__, cnt);) ++ DEBUG9(qla2x00_dump_buffer((char *)&(fcport->lun_mask), ++ sizeof(lun_bit_mask_t));) ++ ++ ret = verify_area(VERIFY_WRITE, (void *)u_entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ if (ret) { ++ /* error */ ++ DEBUG9_10(printk("%s: u_entry %p verify write" ++ " error. list->EntryCount=%d.\n", ++ __func__, u_entry, list->EntryCount);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ ret = copy_to_user(u_entry, entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ ++ if (ret) { ++ /* error */ ++ DEBUG9_10(printk("%s: u_entry %p copy " ++ "error. list->EntryCount=%d.\n", ++ __func__, u_entry, list->EntryCount);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ copy_to_user(u_entry, entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ ++ /* Go to next port */ ++ u_entry++; ++ continue; ++ } ++ ++ /* ++ * Failover is enabled. Go through the mp_devs list and return ++ * lun data in configured path. ++ */ ++ for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) { ++ dp = host->mp_devs[dev_no]; ++ ++ if (dp == NULL) ++ continue; ++ ++ /* Lookup entry name */ ++ if (!qla2x00_is_portname_in_device(dp, entry->PortName)) ++ continue; ++ ++ if ((pathlist = dp->path_list) == NULL) ++ continue; ++ ++ path = pathlist->last; ++ for (path_id = 0; path_id < pathlist->path_cnt; ++ path_id++, path = path->next) { ++ ++ if (path->host != host) ++ continue; ++ ++ if (!qla2x00_is_portname_equal(path->portname, ++ entry->PortName)) ++ continue; ++ ++ /* Got an entry */ ++ entry->TargetId = dp->dev_id; ++ entry->Dev_No = path->id; ++ list->EntryCount++; ++ ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ entry->Data[lun] = ++ path->lun_data.data[lun]; ++ } ++ ++ ret = verify_area(VERIFY_WRITE, (void *)u_entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p " ++ "verify wrt err. EntryCount=%d.\n", ++ __func__, u_entry, list->EntryCount);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ ret = copy_to_user(u_entry, entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p " ++ "copy out err. EntryCount=%d.\n", ++ __func__, u_entry, list->EntryCount);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ u_entry++; ++ ++ DEBUG9(printk("%s: (output) get_lun_data - " ++ "u_entry(%p) - lun entry[%d] :\n", ++ __func__, u_entry,list->EntryCount - 1);) ++ ++ DEBUG9(qla2x00_dump_buffer((void *)entry, 64);) ++ ++ /* ++ * We found the right path for this port. ++ * Continue with next port. ++ */ ++ break; ++ } ++ ++ /* Continue with next port. */ ++ break; ++ } ++ } ++ ++ DEBUG9(printk("%s: get_lun_data - entry count = [%d]\n", ++ __func__, list->EntryCount);) ++ DEBUG4(printk("%s: get_lun_data - entry count = [%d]\n", ++ __func__, list->EntryCount);) ++ ++ if (ret == 0) { ++ ret = verify_area(VERIFY_WRITE, (void *)&u_list->EntryCount, ++ sizeof(list->EntryCount)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_list->EntryCount %p verify " ++ " write error. list->EntryCount=%d.\n", ++ __func__, u_entry, list->EntryCount);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ } else { ++ /* copy number of entries */ ++ ret = copy_to_user(&u_list->EntryCount, &list->EntryCount, ++ sizeof(list->EntryCount)); ++ pext->ResponseLen = FO_LUN_DATA_LIST_MAX_SIZE; ++ } ++ } ++ ++ KMEM_FREE(list, sizeof(FO_LUN_DATA_LIST)); ++ ++ DEBUG9(printk("%s: exiting. ret=%d.\n", __func__, ret);) ++ ++ return ret; ++} ++ ++/* ++ * qla2x00_fo_set_lun_data ++ * Set lun data for the specified device on the attached hba ++ * (FO_SET_LUN_DATA). ++ * Sets lun mask if failover not enabled. ++ * ++ * Input: ++ * bp = pointer to buffer ++ * ++ * Return; ++ * 0 on success or errno. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_fo_set_lun_data(EXT_IOCTL *pext, FO_LUN_DATA_INPUT *bp, int mode) ++{ ++ scsi_qla_host_t *ha; ++ fc_port_t *fcport; ++ int i; ++ int ret = 0; ++ mp_host_t *host = NULL; ++ mp_device_t *dp; ++ mp_path_t *path; ++ mp_path_list_t *pathlist; ++ os_tgt_t *ostgt; ++ uint8_t path_id; ++ uint16_t dev_no; ++ uint16_t lun; ++ FO_LUN_DATA_LIST *u_list, *list; ++ FO_EXTERNAL_LUN_DATA_ENTRY *u_entry, *entry; ++ ++ typedef struct _tagStruct { ++ FO_LUN_DATA_INPUT foLunDataInput; ++ FO_LUN_DATA_LIST foLunDataList; ++ } ++ com_struc; ++ com_struc *com_iter; ++ ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ ha = qla2x00_get_hba((int)bp->HbaInstance); ++ ++ if (!ha) { ++ DEBUG2_9_10(printk("%s: no ha matching inst %d.\n", ++ __func__, bp->HbaInstance);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s: ha inst %ld, buff %p.\n", ++ __func__, ha->instance, bp);) ++ ++ if (ha->flags.failover_enabled) ++ if ((host = qla2x00_cfg_find_host(ha)) == NULL) { ++ DEBUG2_9_10(printk("%s: no HOST for ha inst %ld.\n", ++ __func__, ha->instance);) ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ list = (FO_LUN_DATA_LIST *)qla2x00_kmem_zalloc( ++ sizeof(FO_LUN_DATA_LIST), GFP_ATOMIC, 13); ++ if (list == NULL) { ++ DEBUG2_9_10(printk("%s: failed to alloc memory of size (%d)\n", ++ __func__, (int)sizeof(FO_LUN_DATA_LIST));) ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (-ENOMEM); ++ } ++ ++ entry = &list->DataEntry[0]; ++ ++ /* get lun data list from user */ ++ com_iter = (com_struc *)pext->RequestAdr; ++ u_list = &(com_iter->foLunDataList); ++ u_entry = &u_list->DataEntry[0]; ++ ++ ret = verify_area(VERIFY_READ, (void *)u_list, ++ sizeof(FO_LUN_DATA_LIST)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_list %p verify read error.\n", ++ __func__, u_list);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ KMEM_FREE(list, FO_LUN_DATA_LIST); ++ return (ret); ++ } ++ ++ ret = copy_from_user(list, u_list, sizeof(FO_LUN_DATA_LIST)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_list %p copy error.\n", ++ __func__, u_list);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ KMEM_FREE(list, FO_LUN_DATA_LIST); ++ return (ret); ++ } ++ ++ DEBUG2(printk("qla_fo_set_lun_data: pext->RequestAdr(%p) u_list (%p) " ++ "sizeof(FO_LUN_DATA_INPUT) =(%d) and 64 bytes...\n", ++ pext->RequestAdr, u_list, ++ (int)sizeof(FO_LUN_DATA_INPUT));) ++ DEBUG2(qla2x00_dump_buffer((void *)u_list, 64);) ++ ++ for (i = 0; i < list->EntryCount; i++, u_entry++) { ++ ++ ret = verify_area(VERIFY_READ, (void *)u_entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p verify " ++ " read error.\n", ++ __func__, u_entry);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ret = copy_from_user(entry, u_entry, ++ sizeof(FO_EXTERNAL_LUN_DATA_ENTRY)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p copy error.\n", ++ __func__, u_entry);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ if (!ha->flags.failover_enabled) { ++ /* ++ * Failover disabled. Just find the port and set ++ * LUN mask values in lun_mask field of this port. ++ */ ++ ++ if (entry->TargetId >= MAX_FIBRE_DEVICES) ++ /* ERROR */ ++ continue; ++ ++ if (!(ostgt = ha->otgt[entry->TargetId])) ++ /* ERROR */ ++ continue; ++ ++ if (!(fcport = ostgt->vis_port)) ++ /* ERROR */ ++ continue; ++ ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ /* set MSB if masked */ ++ if (entry->Data[lun] | LUN_DATA_ENABLED) { ++ EXT_CLR_LUN_BIT(&(fcport->lun_mask), ++ lun); ++ } else { ++ EXT_SET_LUN_BIT(&(fcport->lun_mask), ++ lun); ++ } ++ } ++ ++ /* Go to next entry */ ++ continue; ++ } ++ ++ /* ++ * Failover is enabled. Go through the mp_devs list and set lun ++ * data in configured path. ++ */ ++ for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) { ++ dp = host->mp_devs[dev_no]; ++ ++ if (dp == NULL) ++ continue; ++ ++ /* Lookup entry name */ ++ if (!qla2x00_is_portname_in_device(dp, entry->PortName)) ++ continue; ++ ++ if ((pathlist = dp->path_list) == NULL) ++ continue; ++ ++ path = pathlist->last; ++ for (path_id = 0; path_id < pathlist->path_cnt; ++ path_id++, path = path->next) { ++ ++ if (path->host != host) ++ continue; ++ ++ if (!qla2x00_is_portname_equal(path->portname, ++ entry->PortName)) ++ continue; ++ ++ for (lun = 0; lun < MAX_LUNS; lun++) { ++ path->lun_data.data[lun] = ++ entry->Data[lun]; ++ DEBUG4(printk("cfg_set_lun_data: lun " ++ "data[%d] = 0x%x \n", lun, ++ path->lun_data.data[lun]);) ++ } ++ ++ break; ++ } ++ break; ++ } ++ } ++ ++ KMEM_FREE(list, FO_LUN_DATA_LIST); ++ ++ DEBUG9(printk("%s: exiting. ret = %d.\n", __func__, ret);) ++ ++ return ret; ++} ++ ++/* ++ * qla2x00_fo_get_target_data ++ * Get the target control byte for all devices attached to a HBA. ++ * ++ * Input: ++ * bp = pointer to buffer ++ * ++ * Return; ++ * 0 on success or errno. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_fo_get_target_data(EXT_IOCTL *pext, FO_TARGET_DATA_INPUT *bp, int mode) ++{ ++ scsi_qla_host_t *ha; ++ struct list_head *fcports, *fcpl; ++ fc_port_t *fcport; ++ int ret = 0; ++ mp_host_t *host = NULL; ++ mp_device_t *dp; ++ mp_path_t *path; ++ mp_path_list_t *pathlist; ++ os_tgt_t *ostgt; ++ uint8_t i, cnt; ++ uint8_t path_id; ++ uint16_t dev_no; ++ FO_DEVICE_DATA *entry, *u_entry; ++ uint32_t b; ++ ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ ha = qla2x00_get_hba((int)bp->HbaInstance); ++ ++ if (!ha) { ++ DEBUG2_9_10(printk("%s: no ha matching inst %d.\n", ++ __func__, bp->HbaInstance);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s: ha inst %ld, buff %p.\n", ++ __func__, ha->instance, bp);) ++ ++ if (ha->flags.failover_enabled) ++ if ((host = qla2x00_cfg_find_host(ha)) == NULL) { ++ DEBUG2_9_10(printk("%s: no HOST for ha inst %ld.\n", ++ __func__, ha->instance);) ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ entry = (FO_DEVICE_DATA *)qla2x00_kmem_zalloc( ++ sizeof(FO_DEVICE_DATA), GFP_ATOMIC, 14); ++ if (entry == NULL) { ++ DEBUG2_9_10(printk("%s: failed to alloc memory of size (%d)\n", ++ __func__, (int)sizeof(FO_DEVICE_DATA));) ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (-ENOMEM); ++ } ++ ++ u_entry = (FO_DEVICE_DATA *) pext->ResponseAdr; ++ ++ /* find the correct fcport list */ ++ if (!ha->flags.failover_enabled) ++ fcports = &ha->fcports; ++ else ++ fcports = host->fcports; ++ ++ /* Check thru this adapter's fcport list */ ++ i = 0; ++ fcport = NULL; ++ list_for_each(fcpl, fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (i >= MAX_TARGETS) ++ break; ++ ++ memcpy(entry->WorldWideName, ++ fcport->node_name, EXT_DEF_WWN_NAME_SIZE); ++ memcpy(entry->PortName, ++ fcport->port_name, EXT_DEF_WWN_NAME_SIZE); ++ ++ for (b = 0; b < 3 ; b++) ++ entry->PortId[b] = fcport->d_id.r.d_id[2-b]; ++ ++ if (!ha->flags.failover_enabled) { ++ /* ++ * Failover disabled. Just find the port and return ++ * target info. ++ */ ++ for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { ++ if (!(ostgt = ha->otgt[cnt])) { ++ continue; ++ } ++ ++ if (ostgt->vis_port == fcport) { ++ entry->TargetId = cnt; ++ break; ++ } ++ } ++ if (cnt == MAX_FIBRE_DEVICES) { ++ /* Not found? For now just go to next port. */ ++#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_10) ++ uint8_t *tmp_name; ++ ++ tmp_name = fcport->port_name; ++ ++ printk("fo_get_target_data(%ld): ERROR " ++ "port %02x%02x%02x%02x%02x%02x%02x%02x " ++ "not configured.\n", ha->host_no, ++ tmp_name[0], tmp_name[1], tmp_name[2], ++ tmp_name[3], tmp_name[4], tmp_name[5], ++ tmp_name[6], tmp_name[7]); ++#endif /* DEBUG */ ++ ++ continue; ++ } ++ ++ entry->MultipathControl = 0; /* always configured */ ++ ++ ret = verify_area(VERIFY_WRITE, (void *)u_entry, ++ sizeof(FO_DEVICE_DATA)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p verify " ++ " wrt err. tgt id=%d.\n", ++ __func__, u_entry, cnt);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ ret = copy_to_user(u_entry, entry, ++ sizeof(FO_DEVICE_DATA)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p copy " ++ "out err. tgt id=%d.\n", ++ __func__, u_entry, cnt);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ u_entry++; ++ ++ i++; ++ continue; ++ } ++ ++ /* ++ * Failover is enabled. Go through the mp_devs list and ++ * get target data in configured path. ++ */ ++ for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) { ++ dp = host->mp_devs[dev_no]; ++ ++ if (dp == NULL) ++ continue; ++ ++ /* Lookup entry name */ ++ if (!qla2x00_is_portname_in_device(dp, entry->PortName)) ++ continue; ++ ++ if ((pathlist = dp->path_list) == NULL) ++ continue; ++ ++ path = pathlist->last; ++ for (path_id = 0; path_id < pathlist->path_cnt; ++ path_id++, path= path->next) { ++ ++ if (path->host != host) ++ continue; ++ ++ if (!qla2x00_is_portname_equal(path->portname, ++ entry->PortName)) ++ continue; ++ ++ entry->TargetId = dp->dev_id; ++ entry->Dev_No = path->id; ++ entry->MultipathControl = path->mp_byte; ++ ++ DEBUG9(printk("cfg_get_target_data: path->id " ++ "= %d, target data = 0x%x \n", ++ path->id, path->mp_byte);) ++ ++ ret = verify_area(VERIFY_WRITE, (void *)u_entry, ++ sizeof(FO_DEVICE_DATA)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p " ++ "verify wrt err. tgt id=%d.\n", ++ __func__, u_entry, dp->dev_id);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ ret = copy_to_user(u_entry, entry, ++ sizeof(FO_DEVICE_DATA)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p " ++ "copy out err. tgt id=%d.\n", ++ __func__, u_entry, dp->dev_id);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ u_entry++; ++ ++ /* Path found. Continue with next fcport */ ++ break; ++ } ++ break; ++ } ++ i++; ++ } ++ ++ if (ret == 0) { ++ pext->ResponseLen = sizeof(FO_DEVICE_DATABASE); ++ } ++ ++ KMEM_FREE(entry, sizeof(FO_DEVICE_DATA)); ++ ++ DEBUG9(printk("%s: exiting. ret = %d.\n", __func__, ret);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_fo_set_target_data ++ * Set multipath control byte for all devices on the attached hba ++ * ++ * Input: ++ * bp = pointer to buffer ++ * ++ * Return; ++ * 0 on success or errno. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_fo_set_target_data(EXT_IOCTL *pext, FO_TARGET_DATA_INPUT *bp, int mode) ++{ ++ scsi_qla_host_t *ha; ++ int i; ++ int ret = 0; ++ mp_host_t *host; ++ mp_device_t *dp; ++ mp_path_t *path; ++ mp_path_list_t *pathlist; ++ uint16_t dev_no; ++ uint8_t path_id; ++ FO_DEVICE_DATA *entry, *u_entry; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ ha = qla2x00_get_hba((int)bp->HbaInstance); ++ ++ if (!ha) { ++ DEBUG2_9_10(printk("%s: no ha matching inst %d.\n", ++ __func__, bp->HbaInstance);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s: ha inst %ld, buff %p.\n", ++ __func__, ha->instance, bp);) ++ ++ if (!ha->flags.failover_enabled) ++ /* non-failover mode. nothing to be done. */ ++ return 0; ++ ++ if ((host = qla2x00_cfg_find_host(ha)) == NULL) { ++ DEBUG2_9_10(printk("%s: no HOST for ha inst %ld.\n", ++ __func__, ha->instance);) ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ entry = (FO_DEVICE_DATA *)qla2x00_kmem_zalloc( ++ sizeof(FO_DEVICE_DATA), GFP_ATOMIC, 15); ++ if (entry == NULL) { ++ DEBUG2_9_10(printk("%s: failed to alloc memory of size (%d)\n", ++ __func__, (int)sizeof(FO_DEVICE_DATA));) ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (-ENOMEM); ++ } ++ ++ u_entry = (FO_DEVICE_DATA *)(pext->RequestAdr + ++ sizeof(FO_TARGET_DATA_INPUT)); ++ ++ for (i = 0; i < MAX_TARGETS; i++, u_entry++) { ++ ret = verify_area(VERIFY_READ, (void *)u_entry, ++ sizeof(FO_DEVICE_DATA)); ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p verify read err.\n", ++ __func__, u_entry);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ ret = copy_from_user(entry, u_entry, sizeof(FO_DEVICE_DATA)); ++ ++ if (ret) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: u_entry %p copy error.\n", ++ __func__, u_entry);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ break; ++ } ++ ++ for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) { ++ dp = host->mp_devs[dev_no]; ++ ++ if (dp == NULL) ++ continue; ++ ++ /* Lookup entry name */ ++ if (!qla2x00_is_portname_in_device(dp, entry->PortName)) ++ continue; ++ ++ if ((pathlist = dp->path_list) == NULL) ++ continue; ++ ++ path = pathlist->last; ++ for (path_id = 0; path_id < pathlist->path_cnt; ++ path_id++, path= path->next) { ++ ++ if (path->host != host) ++ continue; ++ ++ if (!qla2x00_is_portname_equal(path->portname, ++ entry->PortName)) ++ continue; ++ ++ path->mp_byte = entry->MultipathControl; ++ ++ DEBUG9(printk("cfg_set_target_data: %d target " ++ "data = 0x%x \n", ++ path->id,path->mp_byte);) ++ ++ /* ++ * If this is the visible path, then make it ++ * available on next reboot. ++ */ ++ if (!((path->mp_byte & MP_MASK_HIDDEN) || ++ (path->mp_byte & MP_MASK_UNCONFIGURED))) { ++ pathlist->visible = path->id; ++ } ++ ++ /* Found path. Go to next entry. */ ++ break; ++ } ++ break; ++ } ++ } ++ ++ KMEM_FREE(entry, sizeof(FO_DEVICE_DATA)); ++ ++ DEBUG9(printk("%s: exiting. ret = %d.\n", __func__, ret);) ++ ++ return (ret); ++ ++} ++ ++/* ++ * qla2x00_fo_ioctl ++ * Provides functions for failover ioctl() calls. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ioctl_code = ioctl function to perform ++ * arg = Address of application EXT_IOCTL cmd data ++ * mode = flags ++ * ++ * Returns: ++ * Return value is the ioctl rval_p return value. ++ * 0 = success ++ * ++ * Context: ++ * Kernel context. ++ */ ++/* ARGSUSED */ ++int ++qla2x00_fo_ioctl(scsi_qla_host_t *ha, int ioctl_code, void *ret_arg, int mode) ++{ ++ static EXT_IOCTL cmd_struct; ++ int rval = 0; ++ size_t in_size, out_size; ++ static union { ++ FO_PARAMS params; ++ FO_GET_PATHS path; ++ FO_SET_CURRENT_PATH set_path; ++ /* FO_HBA_STAT_INPUT stat; */ ++ FO_HBA_STAT stat; ++ FO_LUN_DATA_INPUT lun_data; ++ FO_TARGET_DATA_INPUT target_data; ++ } buff; ++ ++ ++ ENTER("qla2x00_fo_ioctl"); ++ DEBUG9(printk("%s: entered. arg (%p):\n", __func__, ret_arg);) ++ ++ memcpy(&cmd_struct, ret_arg, sizeof(cmd_struct)); ++ ++ /* ++ * default case for this switch not needed, ++ * ioctl_code validated by caller. ++ */ ++ in_size = out_size = 0; ++ switch (ioctl_code) { ++ case FO_CC_GET_PARAMS: ++ out_size = sizeof(FO_PARAMS); ++ break; ++ case FO_CC_SET_PARAMS: ++ in_size = sizeof(FO_PARAMS); ++ break; ++ case FO_CC_GET_PATHS: ++ in_size = sizeof(FO_GET_PATHS); ++ break; ++ case FO_CC_SET_CURRENT_PATH: ++ in_size = sizeof(FO_SET_CURRENT_PATH); ++ break; ++ case FO_CC_GET_HBA_STAT: ++ case FO_CC_RESET_HBA_STAT: ++ in_size = sizeof(FO_HBA_STAT_INPUT); ++ break; ++ case FO_CC_GET_LUN_DATA: ++ in_size = sizeof(FO_LUN_DATA_INPUT); ++ break; ++ case FO_CC_SET_LUN_DATA: ++ in_size = sizeof(FO_LUN_DATA_INPUT); ++ break; ++ case FO_CC_GET_TARGET_DATA: ++ in_size = sizeof(FO_TARGET_DATA_INPUT); ++ break; ++ case FO_CC_SET_TARGET_DATA: ++ in_size = sizeof(FO_TARGET_DATA_INPUT); ++ break; ++ ++ } ++ if (in_size != 0) { ++ if ((int)cmd_struct.RequestLen < in_size) { ++ cmd_struct.Status = EXT_STATUS_INVALID_PARAM; ++ cmd_struct.DetailStatus = EXT_DSTATUS_REQUEST_LEN; ++ DEBUG10(printk("%s: got invalie req len (%d).\n", ++ __func__, cmd_struct.RequestLen);) ++ ++ } else { ++ ++ rval = verify_area(VERIFY_READ, ++ (void *)cmd_struct.RequestAdr, in_size); ++ if (rval) { ++ /* error */ ++ DEBUG2_9_10(printk("%s: req buf verify read " ++ "error. size=%d.\n", ++ __func__, in_size);) ++ cmd_struct.Status = EXT_STATUS_COPY_ERR; ++ } ++ rval = copy_from_user(&buff, ++ (void *)cmd_struct.RequestAdr, in_size); ++ ++ if (rval) { ++ DEBUG2_9_10(printk("%s: req buf copy error. " ++ "size=%d.\n", ++ __func__, in_size);) ++ ++ cmd_struct.Status = EXT_STATUS_COPY_ERR; ++ } else { ++ DEBUG9(printk("qla2x00_fo_ioctl: req buf " ++ "copied ok.\n")); ++ } ++ } ++ } else if (out_size != 0 && (int)cmd_struct.ResponseLen < out_size) { ++ cmd_struct.Status = EXT_STATUS_BUFFER_TOO_SMALL; ++ cmd_struct.DetailStatus = out_size; ++ DEBUG10(printk("%s: got invalie resp len (%d).\n", ++ __func__, cmd_struct.ResponseLen);) ++ } ++ ++ if (rval != 0 || cmd_struct.Status != 0) ++ goto done_fo_ioctl; ++ ++ cmd_struct.Status = EXT_STATUS_OK; ++ cmd_struct.DetailStatus = EXT_STATUS_OK; ++ ++ switch (ioctl_code) { ++ case FO_CC_GET_PARAMS: ++ rval = qla2x00_fo_get_params(&buff.params); ++ break; ++ case FO_CC_SET_PARAMS: ++ rval = qla2x00_fo_set_params(&buff.params); ++ break; ++ case FO_CC_GET_PATHS: ++ rval = qla2x00_cfg_get_paths(&cmd_struct, ++ &buff.path,mode); ++ if (rval != 0) ++ out_size = 0; ++ break; ++ case FO_CC_SET_CURRENT_PATH: ++ rval = qla2x00_cfg_set_current_path(&cmd_struct, ++ &buff.set_path,mode); ++ break; ++ case FO_CC_RESET_HBA_STAT: ++ rval = qla2x00_fo_stats(&buff.stat, TRUE); ++ break; ++ case FO_CC_GET_HBA_STAT: ++ rval = qla2x00_fo_stats(&buff.stat, FALSE); ++ break; ++ case FO_CC_GET_LUN_DATA: ++ ++ DEBUG4(printk("calling qla2x00_fo_get_lun_data\n");) ++ DEBUG4(printk("cmd_struct.RequestAdr (%p):\n", ++ cmd_struct.RequestAdr);) ++ ++ rval = qla2x00_fo_get_lun_data(&cmd_struct, ++ &buff.lun_data, mode); ++ ++ if (rval != 0) ++ out_size = 0; ++ break; ++ case FO_CC_SET_LUN_DATA: ++ ++ DEBUG4(printk("calling qla2x00_fo_set_lun_data\n");) ++ DEBUG4(printk(" cmd_struct.RequestAdr (%p):\n", ++ cmd_struct.RequestAdr);) ++ ++ rval = qla2x00_fo_set_lun_data(&cmd_struct, ++ &buff.lun_data, mode); ++ break; ++ case FO_CC_GET_TARGET_DATA: ++ DEBUG4(printk("calling qla2x00_fo_get_target_data\n");) ++ DEBUG4(printk("cmd_struct.RequestAdr (%p):\n", ++ cmd_struct.RequestAdr);) ++ ++ rval = qla2x00_fo_get_target_data(&cmd_struct, ++ &buff.target_data, mode); ++ ++ if (rval != 0) { ++ out_size = 0; ++ } ++ break; ++ case FO_CC_SET_TARGET_DATA: ++ DEBUG4(printk("calling qla2x00_fo_set_target_data\n");) ++ DEBUG4(printk(" cmd_struct.RequestAdr (%p):\n", ++ cmd_struct.RequestAdr);) ++ rval = qla2x00_fo_set_target_data(&cmd_struct, ++ &buff.target_data, mode); ++ break; ++ ++ } ++ ++ if (rval == 0 && (cmd_struct.ResponseLen = out_size) != 0) { ++ rval = verify_area(VERIFY_WRITE, (void *)cmd_struct.ResponseAdr, ++ out_size); ++ if (rval != 0) { ++ DEBUG10(printk("%s: resp buf very write error.\n", ++ __func__);) ++ cmd_struct.Status = EXT_STATUS_COPY_ERR; ++ } ++ } ++ ++ if (rval == 0) { ++ rval = copy_to_user((void *)cmd_struct.ResponseAdr, ++ &buff, out_size); ++ ++ if (rval != 0) { ++ DEBUG10(printk("%s: resp buf copy error. size=%d.\n", ++ __func__, out_size);) ++ cmd_struct.Status = EXT_STATUS_COPY_ERR; ++ } ++ } ++ ++done_fo_ioctl: ++ ++ /* Set Status and DetailStatus fields in application EXT_IOCTL */ ++ (((EXT_IOCTL*)ret_arg)->Status) = cmd_struct.Status; ++ (((EXT_IOCTL*)ret_arg)->DetailStatus) = cmd_struct.DetailStatus; ++ (((EXT_IOCTL*)ret_arg)->ResponseLen) = cmd_struct.ResponseLen; ++ ++ if (rval != 0) { ++ /*EMPTY*/ ++ DEBUG10(printk("%s: **** FAILED ****\n", __func__);) ++ } else { ++ /*EMPTY*/ ++ DEBUG9(printk("%s: exiting normally\n", __func__);) ++ } ++ ++ return rval; ++} ++ ++ ++/* ++ * qla2x00_fo_count_retries ++ * Increment the retry counter for the command. ++ * Set or reset the SRB_RETRY flag. ++ * ++ * Input: ++ * sp = Pointer to command. ++ * ++ * Returns: ++ * TRUE -- retry ++ * FALSE -- don't retry ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint8_t ++qla2x00_fo_count_retries(scsi_qla_host_t *ha, srb_t *sp) ++{ ++ uint8_t retry = TRUE; ++ os_lun_t *lq; ++ os_tgt_t *tq; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ if (++sp->fo_retry_cnt > qla_fo_params.MaxRetriesPerIo) { ++ /* no more failovers for this request */ ++ retry = FALSE; ++ sp->fo_retry_cnt = 0; ++ printk(KERN_INFO ++ "qla2x00: no more failovers for request - " ++ "pid= %ld\n", sp->cmd->serial_number); ++ } else { ++ /* ++ * We haven't exceeded the max retries for this request, check ++ * max retries this path ++ */ ++ if ((sp->fo_retry_cnt % qla_fo_params.MaxRetriesPerPath) == 0) { ++ DEBUG(printk(" qla2x00_fo_count_retries: FAILOVER - " ++ "queuing ha=%ld, sp=%p, pid =%ld, " ++ "fo retry= %d \n", ++ ha->host_no, ++ sp, sp->cmd->serial_number, ++ sp->fo_retry_cnt);) ++ ++ /* ++ * Note: we don't want it to timeout, so it is ++ * recycling on the retry queue and the fialover queue. ++ */ ++ lq = sp->lun_queue; ++ tq = sp->tgt_queue; ++ set_bit(LUN_MPIO_BUSY, &lq->q_flag); ++ ++ /* ++ * ??? We can get a path error on any ha, but always ++ * queue failover on originating ha. This will allow us ++ * to syncronized the requests for a given lun. ++ */ ++ sp->f_start=jiffies;/*ra 10/29/01*/ ++ /* Now queue it on to be failover */ ++ sp->ha = ha; ++ add_to_failover_queue(ha,sp); ++ } ++ } ++ ++ DEBUG9(printk("%s: exiting. retry = %d.\n", __func__, retry);) ++ ++ return retry ; ++} ++ ++ ++/* ++ * qla2x00_fo_check ++ * This function is called from the done routine to see if ++ * the SRB requires a failover. ++ * ++ * This function examines the available os returned status and ++ * if meets condition, the command(srb) is placed ont the failover ++ * queue for processing. ++ * ++ * Input: ++ * sp = Pointer to the SCSI Request Block ++ * ++ * Output: ++ * sp->flags SRB_RETRY bit id command is to ++ * be retried otherwise bit is reset. ++ * ++ * Returns: ++ * None. ++ * ++ * Context: ++ * Kernel/Interrupt context. ++ */ ++uint8_t ++qla2x00_fo_check(scsi_qla_host_t *ha, srb_t *sp) ++{ ++ uint8_t retry = FALSE; ++ int host_status; ++#if DEBUG_QLA2100 ++ static char *reason[] = { ++ "DID_OK", ++ "DID_NO_CONNECT", ++ "DID_BUS_BUSY", ++ "DID_TIME_OUT", ++ "DID_BAD_TARGET", ++ "DID_ABORT", ++ "DID_PARITY", ++ "DID_ERROR", ++ "DID_RESET", ++ "DID_BAD_INTR" ++ }; ++#endif ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ /* we failover on selction timeouts only */ ++ host_status = CMD_RESULT(sp->cmd) >>16; ++ if( host_status == DID_NO_CONNECT) { ++ if( qla2x00_fo_count_retries(ha,sp) ) { ++ /* Force a retry on this request, it will ++ * cause the LINUX timer to get reset, while we ++ * we are processing the failover. ++ */ ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ retry = TRUE; ++ } ++ DEBUG(printk("qla2x00_fo_check: pid= %ld sp %p " ++ "retry count=%d, retry flag = %d, " ++ "host status (%s)\n\r", ++ sp->cmd->serial_number, ++ sp, sp->fo_retry_cnt, ++ retry, reason[host_status]);) ++ } ++ ++ DEBUG9(printk("%s: exiting. retry = %d.\n", __func__, retry);) ++ ++ return retry; ++} ++ ++/* ++ * qla2x00_fo_path_change ++ * This function is called from configuration mgr to notify ++ * of a path change. ++ * ++ * Input: ++ * type = Failover notify type, FO_NOTIFY_LUN_RESET or FO_NOTIFY_LOGOUT ++ * newlunp = Pointer to the fc_lun struct for current path. ++ * oldlunp = Pointer to fc_lun struct for previous path. ++ * ++ * Returns: ++ * ++ * Context: ++ * Kernel context. ++ */ ++uint32_t ++qla2x00_fo_path_change(uint32_t type, fc_lun_t *newlunp, fc_lun_t *oldlunp) ++{ ++ uint32_t ret = QLA2X00_SUCCESS; ++ ++ newlunp->max_path_retries = 0; ++ return ret; ++} ++ ++/* ++ * qla2x00_fo_get_params ++ * Process an ioctl request to get system wide failover parameters. ++ * ++ * Input: ++ * pp = Pointer to FO_PARAMS structure. ++ * ++ * Returns: ++ * EXT_STATUS code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint32_t ++qla2x00_fo_get_params(PFO_PARAMS pp) ++{ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ pp->MaxPathsPerDevice = qla_fo_params.MaxPathsPerDevice; ++ pp->MaxRetriesPerPath = qla_fo_params.MaxRetriesPerPath; ++ pp->MaxRetriesPerIo = qla_fo_params.MaxRetriesPerIo; ++ pp->Flags = qla_fo_params.Flags; ++ pp->FailoverNotifyType = qla_fo_params.FailoverNotifyType; ++ pp->FailoverNotifyCdbLength = qla_fo_params.FailoverNotifyCdbLength; ++ memset(pp->FailoverNotifyCdb, 0, sizeof(pp->FailoverNotifyCdb)); ++ memcpy(pp->FailoverNotifyCdb, ++ &qla_fo_params.FailoverNotifyCdb[0], sizeof(pp->FailoverNotifyCdb)); ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return EXT_STATUS_OK; ++} ++ ++/* ++ * qla2x00_fo_set_params ++ * Process an ioctl request to set system wide failover parameters. ++ * ++ * Input: ++ * pp = Pointer to FO_PARAMS structure. ++ * ++ * Returns: ++ * EXT_STATUS code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint32_t ++qla2x00_fo_set_params(PFO_PARAMS pp) ++{ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ /* Check values for defined MIN and MAX */ ++ if ((pp->MaxPathsPerDevice > SDM_DEF_MAX_PATHS_PER_DEVICE) || ++ (pp->MaxRetriesPerPath < FO_MAX_RETRIES_PER_PATH_MIN) || ++ (pp->MaxRetriesPerPath > FO_MAX_RETRIES_PER_PATH_MAX) || ++ (pp->MaxRetriesPerIo < FO_MAX_RETRIES_PER_IO_MIN) || ++ (pp->MaxRetriesPerPath > FO_MAX_RETRIES_PER_IO_MAX)) { ++ DEBUG2_9_10(printk("%s: got invalid params.\n", __func__);) ++ return EXT_STATUS_INVALID_PARAM; ++ } ++ ++ /* Update the global structure. */ ++ qla_fo_params.MaxPathsPerDevice = pp->MaxPathsPerDevice; ++ qla_fo_params.MaxRetriesPerPath = pp->MaxRetriesPerPath; ++ qla_fo_params.MaxRetriesPerIo = pp->MaxRetriesPerIo; ++ qla_fo_params.Flags = pp->Flags; ++ qla_fo_params.FailoverNotifyType = pp->FailoverNotifyType; ++ qla_fo_params.FailoverNotifyCdbLength = pp->FailoverNotifyCdbLength; ++ if (pp->FailoverNotifyType & FO_NOTIFY_TYPE_CDB) { ++ if (pp->FailoverNotifyCdbLength > ++ sizeof(qla_fo_params.FailoverNotifyCdb)) { ++ DEBUG2_9_10(printk("%s: got invalid cdb length.\n", ++ __func__);) ++ return EXT_STATUS_INVALID_PARAM; ++ } ++ ++ memcpy(qla_fo_params.FailoverNotifyCdb, ++ pp->FailoverNotifyCdb, ++ sizeof(qla_fo_params.FailoverNotifyCdb)); ++ } ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return EXT_STATUS_OK; ++} ++ ++ ++/* ++ * qla2x00_fo_init_params ++ * Gets driver configuration file failover properties to initalize ++ * the global failover parameters structure. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++void ++qla2x00_fo_init_params(scsi_qla_host_t *ha) ++{ ++ DEBUG3(printk("%s: entered.\n", __func__);) ++ ++ /* For parameters that are not completely implemented yet, */ ++ ++ memset(&qla_fo_params, 0, sizeof(qla_fo_params)); ++ ++ if(MaxPathsPerDevice) { ++ qla_fo_params.MaxPathsPerDevice = MaxPathsPerDevice; ++ } else ++ qla_fo_params.MaxPathsPerDevice =FO_MAX_PATHS_PER_DEVICE_DEF ; ++ if(MaxRetriesPerPath) { ++ qla_fo_params.MaxRetriesPerPath = MaxRetriesPerPath; ++ } else ++ qla_fo_params.MaxRetriesPerPath =FO_MAX_RETRIES_PER_PATH_DEF; ++ if(MaxRetriesPerIo) { ++ qla_fo_params.MaxRetriesPerIo =MaxRetriesPerIo; ++ } else ++ qla_fo_params.MaxRetriesPerIo =FO_MAX_RETRIES_PER_IO_DEF; ++ ++ qla_fo_params.Flags = 0; ++ qla_fo_params.FailoverNotifyType = FO_NOTIFY_TYPE_NONE; ++ ++ DEBUG3(printk("%s: exiting.\n", __func__);) ++ ++} ++ ++/* ++ * qla2x00_send_fo_notification ++ * Sends failover notification if needed. Change the fc_lun pointer ++ * in the old path lun queue. ++ * ++ * Input: ++ * old_lp = Pointer to old fc_lun. ++ * new_lp = Pointer to new fc_lun. ++ * ++ * Returns: ++ * Local function status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++uint32_t ++qla2x00_send_fo_notification(fc_lun_t *old_lp, fc_lun_t *new_lp) ++{ ++ scsi_qla_host_t *old_ha = old_lp->fcport->ha; ++ int rval = QLA2X00_SUCCESS; ++ inq_cmd_rsp_t *pkt; ++ uint16_t loop_id, lun; ++ dma_addr_t phys_address; ++ ++ ++ ENTER("qla2x00_send_fo_notification"); ++ DEBUG3(printk("%s: entered.\n", __func__);) ++ ++ loop_id = old_lp->fcport->loop_id; ++ lun = old_lp->lun; ++ ++ if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_LUN_RESET) { ++ rval = qla2x00_lun_reset(old_ha, loop_id, lun); ++ if (rval == QLA2X00_SUCCESS) { ++ DEBUG4(printk("qla2x00_send_fo_notification: LUN " ++ "reset succeded\n");) ++ } else { ++ DEBUG4(printk("qla2x00_send_fo_notification: LUN " ++ "reset failed\n");) ++ } ++ ++ } ++ if ( (qla_fo_params.FailoverNotifyType == ++ FO_NOTIFY_TYPE_LOGOUT_OR_LUN_RESET) || ++ (qla_fo_params.FailoverNotifyType == ++ FO_NOTIFY_TYPE_LOGOUT_OR_CDB) ) { ++ ++ rval = qla2x00_fabric_logout(old_ha, loop_id); ++ if (rval == QLA2X00_SUCCESS) { ++ DEBUG4(printk("qla2x00_send_fo_failover_notify: " ++ "logout succeded\n");) ++ } else { ++ DEBUG4(printk("qla2x00_send_fo_failover_notify: " ++ "logout failed\n");) ++ } ++ ++ } ++ ++ if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_CDB) { ++ pkt = pci_alloc_consistent(old_ha->pdev, ++ sizeof(inq_cmd_rsp_t), &phys_address); ++ if (pkt == NULL) { ++ DEBUG4(printk("qla2x00_send_fo_failover_notify: " ++ "memory allocation failed\n");) ++ ++ return(QLA2X00_FUNCTION_FAILED); ++ } ++ ++ memset(pkt,0, sizeof(inq_cmd_rsp_t)); ++ pkt->p.cmd.entry_type = COMMAND_A64_TYPE; ++ pkt->p.cmd.entry_count = 1; ++ pkt->p.cmd.lun = lun; ++ pkt->p.cmd.target = (uint8_t)loop_id; ++ pkt->p.cmd.control_flags = CF_SIMPLE_TAG; ++ memcpy(pkt->p.cmd.scsi_cdb, ++ qla_fo_params.FailoverNotifyCdb, ++ qla_fo_params.FailoverNotifyCdbLength); ++ /* FIXME This setup needs to be verified with Dennis. */ ++ pkt->p.cmd.dseg_count = __constant_cpu_to_le16(1); ++ pkt->p.cmd.byte_count = __constant_cpu_to_le32(0); ++ pkt->p.cmd.dseg_0_address[0] = cpu_to_le32( ++ LSD(phys_address + sizeof (sts_entry_t))); ++ pkt->p.cmd.dseg_0_address[1] = cpu_to_le32( ++ MSD(phys_address + sizeof (sts_entry_t))); ++ pkt->p.cmd.dseg_0_length = __constant_cpu_to_le32(0); ++ ++ rval = qla2x00_issue_iocb(old_ha, ++ pkt, phys_address, sizeof (inq_cmd_rsp_t)); ++ ++ if (rval != QLA2X00_SUCCESS || ++ pkt->p.rsp.comp_status != CS_COMPLETE || ++ pkt->p.rsp.scsi_status & SS_CHECK_CONDITION || ++ pkt->inq[0] == 0x7f) { ++ ++ DEBUG4(printk("qla2x00_fo_notification: send CDB " ++ "failed: comp_status = %x" ++ "scsi_status = %x inq[0] = %x\n", ++ pkt->p.rsp.comp_status, ++ pkt->p.rsp.scsi_status, ++ pkt->inq[0]);) ++ } ++ ++ pci_free_consistent(old_ha->pdev, ++ sizeof(inq_cmd_rsp_t), pkt, phys_address); ++ } ++ ++ DEBUG3(printk("%s: exiting. rval = %d.\n", __func__, rval);) ++ ++ return rval; ++} ++ ++ ++/* ++ * qla2100_fo_enabled ++ * Reads and validates the failover enabled property. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * instance = HBA number. ++ * ++ * Returns: ++ * TRUE when failover is authorized else FALSE ++ * ++ * Context: ++ * Kernel context. ++ */ ++uint8_t ++qla2x00_fo_enabled(scsi_qla_host_t *ha, int instance) ++{ ++ uint8_t enable = FALSE; ++ ++ if (ha->flags.failover_enabled) ++ enable = TRUE; ++ ++ return enable; ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_fo.cfg Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,31 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.4.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++/* ++ * QLogic ISP2x00 Multi-path LUN Support Driver ++ */ ++int MaxPathsPerDevice = 0; ++int MaxRetriesPerPath =0 ; ++int MaxRetriesPerIo =0; ++#if defined(MODULE) ++/* insmod qla2100 ql2xopts= */ ++MODULE_PARM(MaxPathsPerDevice, "i"); ++MODULE_PARM(MaxRetriesPerPath, "i"); ++MODULE_PARM(MaxRetriesPerIo, "i"); ++#endif +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_fo.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,75 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++/* ++ * QLogic ISP2x00 Failover Header ++ * ++ */ ++#ifndef _QLA_FO_H ++#define _QLA_FO_H ++ ++#if defined(__cplusplus) ++extern "C" ++{ ++#endif ++ ++#include "qlfo.h" ++ /* ++ * This structure definition is for a scsi I/O request NOT subject to ++ * failover re-routing. It is for the use of configuration operations ++ * and diagnostics functions as definted in ExIoct.h ++ */ ++ typedef struct scsi_cdb_request { ++ struct adapter_state *ha; ++ uint16_t target; ++ uint16_t lun; ++ uint8_t *cdb_ptr; /* Pointer to cdb to be sent */ ++ uint8_t cdb_len; /* cdb length */ ++ uint8_t direction; /* Direction of I/O for buffer */ ++ uint8_t scb_len; /* Scsi completion block length */ ++ uint8_t *scb_ptr; /* Scsi completion block pointer */ ++ uint8_t *buf_ptr; /* Pointer to I/O buffer */ ++ uint16_t buf_len; /* Buffer size */ ++ } ++ SCSI_REQ_t, *SCSI_REQ_p; ++ ++ ++ /* ++ * Special defines ++ */ ++ typedef union _FO_HBA_STAT { ++ FO_HBA_STAT_INPUT input; ++ FO_HBA_STAT_INFO info; ++ } FO_HBA_STAT; ++ ++ typedef union _FO_LUN_DATA { ++ FO_LUN_DATA_INPUT input; ++ FO_LUN_DATA_LIST list; ++ } FO_LUN_DATA; ++ ++ typedef union _FO_TARGET_DATA { ++ FO_TARGET_DATA_INPUT input; ++ FO_DEVICE_DATABASE list; ++ } FO_TARGET_DATA; ++ ++#if defined(__cplusplus) ++} ++#endif ++ ++#endif /* ifndef _QLA_FO_H */ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_gbl.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,395 @@ ++/******************************************************************************** ++* QLOGIC LINUX SOFTWARE ++* ++* QLogic ISP2x00 device driver for Linux 2.5.x ++* Copyright (C) 2003 Qlogic Corporation ++* (www.qlogic.com) ++* ++* This program is free software; you can redistribute it and/or modify it ++* under the terms of the GNU General Public License as published by the ++* Free Software Foundation; either version 2, or (at your option) any ++* later version. ++* ++* This program is distributed in the hope that it will be useful, but ++* WITHOUT ANY WARRANTY; without even the implied warranty of ++* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++* General Public License for more details. ++* ++****************************************************************************** ++* Global include file. ++******************************************************************************/ ++ ++ ++#ifndef __QLA_GBL_H ++#define __QLA_GBL_H ++ ++/* ++ * Global Data in FW files. ++ */ ++extern unsigned char fw2100tp_version[]; ++extern unsigned char fw2100tp_version_str[]; ++extern unsigned short fw2100tp_addr01; ++extern unsigned short fw2100tp_code01[]; ++extern unsigned short fw2100tp_length01; ++ ++extern unsigned char fw2200ip_version[]; ++extern unsigned char fw2200ip_version_str[]; ++extern unsigned short fw2200ip_addr01; ++extern unsigned short fw2200ip_code01[]; ++extern unsigned short fw2200ip_length01; ++ ++extern unsigned char fw2300tpx_version[]; ++extern unsigned char fw2300tpx_version_str[]; ++extern unsigned short fw2300tpx_addr01; ++extern unsigned short fw2300tpx_code01[]; ++extern unsigned short fw2300tpx_length01; ++ ++extern unsigned char fw2300ipx_version[]; ++extern unsigned char fw2300ipx_version_str[]; ++extern unsigned short fw2300ipx_addr01; ++extern unsigned short fw2300ipx_code01[]; ++extern unsigned short fw2300ipx_length01; ++ ++#if defined(ISP2322) ++extern unsigned char fw2322tpx_version[]; ++extern unsigned char fw2322tpx_version_str[]; ++extern unsigned short fw2322tpx_addr01; ++extern unsigned short fw2322tpx_code01[]; ++extern unsigned short fw2322tpx_length01; ++extern unsigned long rseqtpx_code_addr01; ++extern unsigned short rseqtpx_code01[]; ++extern unsigned short rseqtpx_code_length01; ++extern unsigned long xseqtpx_code_addr01; ++extern unsigned short xseqtpx_code01[]; ++extern unsigned short xseqtpx_code_length01; ++ ++extern unsigned char fw2322ipx_version[]; ++extern unsigned char fw2322ipx_version_str[]; ++extern unsigned short fw2322ipx_addr01; ++extern unsigned short fw2322ipx_code01[]; ++extern unsigned short fw2322ipx_length01; ++extern unsigned long rseqipx_code_addr01; ++extern unsigned short rseqipx_code01[]; ++extern unsigned short rseqipx_code_length01; ++extern unsigned long xseqipx_code_addr01; ++extern unsigned short xseqipx_code01[]; ++extern unsigned short xseqipx_code_length01; ++#endif ++ ++/* ++ * Global Function Prototypes in qla_init.c source file. ++ */ ++extern uint8_t qla2x00_initialize_adapter(scsi_qla_host_t *); ++extern uint8_t qla2x00_loop_resync(scsi_qla_host_t *); ++extern void qla2x00_tgt_free(scsi_qla_host_t *ha, uint16_t t); ++extern uint8_t qla2x00_fabric_login(scsi_qla_host_t *, fcdev_t *); ++extern uint8_t qla2x00_local_device_login(scsi_qla_host_t *, uint16_t); ++ ++extern void qla2x00_restart_queues(scsi_qla_host_t *, uint8_t); ++ ++extern os_tgt_t *qla2x00_tgt_alloc(scsi_qla_host_t *, uint16_t); ++extern os_lun_t * qla2x00_lun_alloc(scsi_qla_host_t *, uint16_t, uint16_t); ++ ++extern uint8_t qla2x00_abort_isp(scsi_qla_host_t *, uint8_t); ++ ++ ++/* ++ * Global Data in qla_os.c source file. ++ */ ++extern char qla2x00_version_str[]; ++extern unsigned long qla2x00_verbose; ++extern unsigned long qla2x00_quiet; ++extern unsigned long qla2x00_reinit; ++extern unsigned long qla2x00_req_dmp; ++ ++extern int num_hosts; ++extern int apiHBAInstance; ++ ++extern struct _qla2x00stats qla2x00_stats; ++extern char *ql2xdevconf; ++extern int ql2xretrycount; ++extern int qla2xenbinq; ++extern int max_srbs; ++#if defined(ISP2200) || defined(ISP2300) ++extern int ql2xlogintimeout; ++extern int qlport_down_retry; ++#endif ++extern int ql2xmaxqdepth; ++extern int displayConfig; ++ ++extern int ql2xfailover; ++ ++extern int ConfigRequired; ++extern int recoveryTime; ++extern int failbackTime; ++ ++extern int Bind; ++extern int ql2xsuspendcount; ++extern int qla2x00_retryq_dmp; ++#if defined(MODULE) ++extern char *ql2xopts; ++#endif ++extern struct list_head qla_hostlist; ++extern rwlock_t qla_hostlist_lock; ++ ++extern int qla2x00_queuecommand(Scsi_Cmnd *, void (*)(Scsi_Cmnd *)); ++ ++extern uint8_t ++__qla2x00_suspend_lun(scsi_qla_host_t *, os_lun_t *, int, int, int); ++ ++extern int qla2x00_done(scsi_qla_host_t *); ++extern void qla2x00_next(scsi_qla_host_t *); ++extern void qla2x00_flush_failover_q(scsi_qla_host_t *, os_lun_t *); ++extern void qla2x00_reset_lun_fo_counts(scsi_qla_host_t *, os_lun_t *); ++ ++extern uint8_t qla2x00_check_tgt_status(scsi_qla_host_t *, Scsi_Cmnd *); ++extern uint8_t qla2x00_check_port_status(scsi_qla_host_t *, fc_port_t *); ++ ++extern void qla2x00_extend_timeout(Scsi_Cmnd *, int); ++extern srb_t * qla2x00_get_new_sp (scsi_qla_host_t *ha); ++ ++extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *); ++extern void qla2x00_mark_all_devices_lost(scsi_qla_host_t *); ++ ++extern int qla2x00_get_prop_xstr(scsi_qla_host_t *, char *, uint8_t *, int); ++ ++extern void qla2x00_abort_queues(scsi_qla_host_t *, uint8_t); ++ ++/* ++ * Global Function Prototypes in qla_iocb.c source file. ++ */ ++extern request_t *qla2x00_req_pkt(scsi_qla_host_t *); ++extern request_t *qla2x00_ms_req_pkt(scsi_qla_host_t *, srb_t *); ++extern void qla2x00_isp_cmd(scsi_qla_host_t *); ++extern int qla2x00_start_scsi(srb_t *sp); ++int qla2x00_marker(scsi_qla_host_t *, uint16_t, uint16_t, uint8_t); ++int __qla2x00_marker(scsi_qla_host_t *, uint16_t, uint16_t, uint8_t); ++ ++/* ++ * Global Function Prototypes in qla_mbx.c source file. ++ */ ++extern uint8_t ++qla2x00_mailbox_command(scsi_qla_host_t *, mbx_cmd_t *); ++ ++extern int ++qla2x00_load_ram(scsi_qla_host_t *, dma_addr_t, uint16_t, uint16_t); ++ ++extern int ++qla2x00_load_ram_ext(scsi_qla_host_t *, dma_addr_t, uint32_t, uint16_t); ++ ++extern int ++qla2x00_execute_fw(scsi_qla_host_t *); ++ ++extern void ++qla2x00_get_fw_version(scsi_qla_host_t *, uint16_t *, ++ uint16_t *, uint16_t *, uint16_t *); ++ ++extern int ++qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *, uint16_t *, uint16_t *); ++ ++extern int ++qla2x00_set_fw_options(scsi_qla_host_t *, ++ uint16_t, uint16_t, uint16_t, uint16_t, uint16_t); ++ ++extern int ++qla2x00_read_ram_word(scsi_qla_host_t *, uint16_t, uint16_t *); ++extern int ++qla2x00_write_ram_word(scsi_qla_host_t *, uint16_t, uint16_t); ++extern int ++qla2x00_write_ram_word_ext(scsi_qla_host_t *, uint32_t, uint16_t); ++ ++extern int ++qla2x00_mbx_reg_test(scsi_qla_host_t *); ++ ++extern int ++qla2x00_verify_checksum(scsi_qla_host_t *); ++ ++extern int ++qla2x00_issue_iocb(scsi_qla_host_t *, void *, dma_addr_t, size_t); ++ ++extern int ++qla2x00_abort_command(scsi_qla_host_t *, srb_t *); ++ ++extern int ++qla2x00_abort_device(scsi_qla_host_t *, uint16_t, uint16_t); ++ ++#if USE_ABORT_TGT ++extern int ++qla2x00_abort_target(fc_port_t *fcport); ++#endif ++ ++extern int ++qla2x00_target_reset(scsi_qla_host_t *, uint16_t, uint16_t); ++ ++extern int ++qla2x00_get_adapter_id(scsi_qla_host_t *, uint16_t *, uint8_t *, uint8_t *, ++ uint8_t *, uint16_t *); ++ ++extern int ++qla2x00_get_retry_cnt(scsi_qla_host_t *, uint8_t *, uint8_t *); ++ ++int ++qla2x00_loopback_test(scsi_qla_host_t *, INT_LOOPBACK_REQ *, uint16_t *); ++ ++extern int ++qla2x00_init_firmware(scsi_qla_host_t *, uint16_t); ++ ++extern int ++qla2x00_get_port_database(scsi_qla_host_t *, fcdev_t *, uint8_t); ++ ++extern int ++qla2x00_get_firmware_state(scsi_qla_host_t *, uint16_t *); ++ ++extern int ++qla2x00_get_port_name(scsi_qla_host_t *, uint16_t, uint8_t *, uint8_t); ++ ++extern uint8_t ++qla2x00_get_link_status(scsi_qla_host_t *, uint8_t, void *, uint16_t *); ++ ++extern int ++qla2x00_lip_reset(scsi_qla_host_t *); ++ ++extern int ++qla2x00_send_sns(scsi_qla_host_t *, dma_addr_t, uint16_t, size_t); ++ ++extern int ++qla2x00_login_fabric(scsi_qla_host_t *, uint16_t, uint8_t, uint8_t, uint8_t, ++ uint16_t *, uint8_t); ++ ++extern int ++qla2x00_login_local_device(scsi_qla_host_t *, uint16_t, uint16_t *, uint8_t); ++ ++extern int ++qla2x00_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id); ++ ++extern int ++qla2x00_full_login_lip(scsi_qla_host_t *ha); ++ ++extern int ++qla2x00_get_port_list(scsi_qla_host_t *, port_list_entry_t *, dma_addr_t, ++ uint16_t, uint16_t *); ++ ++#if 0 /* not yet needed */ ++extern int ++qla2x00_dump_ram(scsi_qla_host_t *, uint32_t, dma_addr_t, uint32_t); ++#endif ++ ++extern int ++qla2x00_lun_reset(scsi_qla_host_t *, uint16_t, uint16_t); ++ ++extern int ++qla2x00_send_rnid_mbx(scsi_qla_host_t *, uint16_t, uint8_t, dma_addr_t, ++ size_t, uint16_t *); ++ ++extern int ++qla2x00_set_rnid_params_mbx(scsi_qla_host_t *, dma_addr_t, size_t, uint16_t *); ++ ++extern int ++qla2x00_get_rnid_params_mbx(scsi_qla_host_t *, dma_addr_t, size_t, uint16_t *); ++ ++#if defined(QL_DEBUG_LEVEL_3) ++extern int ++qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map); ++#endif ++ ++/* ++ * Global Data in qla_fo.c source file. ++ */ ++extern SysFoParams_t qla_fo_params; ++ ++/* ++ * Global Function Prototypes in qla_fo.c source file. ++ */ ++extern scsi_qla_host_t *qla2x00_get_hba(int); ++extern uint32_t qla2x00_send_fo_notification(fc_lun_t *fclun_p, fc_lun_t *olun_p); ++extern void qla2x00_fo_init_params(scsi_qla_host_t *ha); ++extern uint8_t qla2x00_fo_enabled(scsi_qla_host_t *ha, int instance); ++ ++/* ++ * Global Data in qla_cfg.c source file. ++ */ ++extern mp_host_t *mp_hosts_base; ++extern uint8_t mp_config_required; ++/* ++ * Global Function Prototypes in qla_cfg.c source file. ++ */ ++extern mp_host_t * qla2x00_cfg_find_host(scsi_qla_host_t *); ++extern uint8_t qla2x00_is_portname_in_device(mp_device_t *, uint8_t *); ++extern int qla2x00_cfg_init (scsi_qla_host_t *ha); ++extern int qla2x00_cfg_path_discovery(scsi_qla_host_t *ha); ++extern int qla2x00_cfg_event_notify(scsi_qla_host_t *ha, uint32_t i_type); ++extern fc_lun_t *qla2x00_cfg_failover(scsi_qla_host_t *ha, fc_lun_t *fp, ++ os_tgt_t *tgt, srb_t *sp); ++extern int qla2x00_cfg_get_paths( EXT_IOCTL *, FO_GET_PATHS *, int); ++extern int qla2x00_cfg_set_current_path( EXT_IOCTL *, ++ FO_SET_CURRENT_PATH *, int); ++extern void qla2x00_fo_properties(scsi_qla_host_t *ha); ++extern mp_host_t * qla2x00_add_mp_host(uint8_t *); ++extern void qla2x00_cfg_mem_free(scsi_qla_host_t *ha); ++extern mp_host_t * qla2x00_alloc_host(scsi_qla_host_t *); ++extern uint8_t qla2x00_fo_check(scsi_qla_host_t *ha, srb_t *sp); ++extern mp_path_t *qla2x00_find_path_by_name(mp_host_t *, mp_path_list_t *, ++ uint8_t *name); ++ ++/* ++ * Global Function Prototypes in qla_cfgln.c source file. ++ */ ++extern void qla2x00_cfg_build_path_tree( scsi_qla_host_t *ha); ++extern uint8_t qla2x00_update_mp_device(mp_host_t *, ++ fc_port_t *, uint16_t ); ++extern void qla2x00_cfg_display_devices(void); ++ ++/* ++ * Global Function Prototypes in qla_xioctl.c source file. ++ */ ++extern void qla2x00_enqueue_aen(scsi_qla_host_t *, uint16_t, void *); ++extern int qla2x00_fo_ioctl(scsi_qla_host_t *, int, void *, int); ++extern int qla2x00_alloc_ioctl_mem(scsi_qla_host_t *); ++extern void qla2x00_free_ioctl_mem(scsi_qla_host_t *); ++extern int qla2x00_get_ioctl_scrap_mem(scsi_qla_host_t *, void **, uint32_t); ++extern void qla2x00_free_ioctl_scrap_mem(scsi_qla_host_t *); ++ ++/* ++ * Global Function Prototypes in qla_inioctl.c source file. ++ */ ++extern int qla2x00_read_nvram(scsi_qla_host_t *, EXT_IOCTL *, int); ++extern int qla2x00_update_nvram(scsi_qla_host_t *, EXT_IOCTL *, int); ++extern int qla2x00_write_nvram_word(scsi_qla_host_t *, uint8_t, uint16_t); ++extern int qla2x00_send_loopback(scsi_qla_host_t *, EXT_IOCTL *, int); ++extern int qla2x00_read_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int); ++extern int qla2x00_update_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++ ++/* ++ * Global Function Prototypes in qla_isr.c source file. ++ */ ++extern irqreturn_t qla2x00_intr_handler(int, void *, struct pt_regs *); ++ ++ ++/* ++ * Global Function Prototypes in qla_sup.c source file. ++ */ ++extern uint16_t qla2x00_get_nvram_word(scsi_qla_host_t *, uint32_t); ++extern void qla2x00_nv_write(scsi_qla_host_t *, uint16_t); ++extern void qla2x00_nv_deselect(scsi_qla_host_t *); ++extern uint8_t qla2x00_read_flash_byte(scsi_qla_host_t *, uint32_t); ++extern uint8_t qla2x00_get_flash_manufacturer(scsi_qla_host_t *); ++extern uint16_t qla2x00_get_flash_version(scsi_qla_host_t *); ++extern uint16_t qla2x00_get_flash_image(scsi_qla_host_t *, uint8_t *); ++extern uint16_t qla2x00_set_flash_image(scsi_qla_host_t *, uint8_t *); ++ ++/* ++ * Global Function Prototypes in qla_vendor.c source file. ++ */ ++void qla2x00_set_vend_direction(scsi_qla_host_t *, Scsi_Cmnd *, cmd_entry_t *); ++ ++/* ++ * Global Function Prototypes in qla_dbg.c source file. ++ */ ++extern void qla2x00_dump_isp(scsi_qla_host_t *, int); ++extern void qla2x00_dump_regs(struct Scsi_Host *); ++extern void qla2x00_dump_buffer(uint8_t *, uint32_t); ++extern void qla2x00_print_scsi_cmd(Scsi_Cmnd *); ++extern void qla2x00_print_q_info(struct os_lun *); ++ ++#endif /* _QLA_GBL_H */ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_inioct.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,495 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++#include "inioct.h" ++ ++extern int qla2x00_loopback_test(scsi_qla_host_t *ha, INT_LOOPBACK_REQ *req, ++ uint16_t *ret_mb); ++ ++int qla2x00_read_nvram(scsi_qla_host_t *, EXT_IOCTL *, int); ++int qla2x00_update_nvram(scsi_qla_host_t *, EXT_IOCTL *, int); ++int qla2x00_write_nvram_word(scsi_qla_host_t *, uint8_t, uint16_t); ++int qla2x00_send_loopback(scsi_qla_host_t *, EXT_IOCTL *, int); ++int qla2x00_read_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int); ++int qla2x00_update_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++int ++qla2x00_read_nvram(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ uint8_t *usr_temp, *kernel_tmp; ++ uint16_t data; ++ uint32_t i, cnt; ++ uint32_t transfer_size; ++ ++ DEBUG9(printk("qla2x00_read_nvram: entered.\n");) ++ ++ if (pext->ResponseLen < sizeof(nvram_t)) ++ transfer_size = pext->ResponseLen / 2; ++ else ++ transfer_size = sizeof(nvram_t) / 2; ++ ++ /* Dump NVRAM. */ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ for (i = 0, cnt = 0; cnt < transfer_size; cnt++, i++) { ++ data = cpu_to_le16(qla2x00_get_nvram_word(ha, cnt)); ++ ++ kernel_tmp = (uint8_t *)&data; ++ ++ __put_user(*kernel_tmp, usr_temp); ++ ++ /* next byte */ ++ usr_temp++; ++ kernel_tmp++; ++ ++ __put_user(*kernel_tmp, usr_temp); ++ ++ usr_temp++; ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ ++ DEBUG9(printk("qla2x00_read_nvram: exiting.\n");) ++ ++ return 0; ++} ++ ++/* ++ * qla2x00_update_nvram ++ * Write data to NVRAM. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * pext = pointer to driver internal IOCTL structure. ++ * ++ * Returns: ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_update_nvram(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ uint8_t i, cnt; ++ uint8_t *usr_tmp, *kernel_tmp; ++ nvram_t *pnew_nv; ++ uint16_t *wptr; ++ uint16_t data; ++ uint32_t transfer_size; ++ uint8_t chksum = 0; ++ int ret = 0; ++ ++ // FIXME: Endianess? ++ DEBUG9(printk("qla2x00_update_nvram: entered.\n");) ++ ++ if (pext->RequestLen < sizeof(nvram_t)) ++ transfer_size = pext->RequestLen; ++ else ++ transfer_size = sizeof(nvram_t); ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pnew_nv, ++ sizeof(nvram_t))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(nvram_t));) ++ return (ret); ++ } ++ ++ /* Read from user buffer */ ++ kernel_tmp = (uint8_t *)pnew_nv; ++ usr_tmp = (uint8_t *)pext->RequestAdr; ++ ++ ret = verify_area(VERIFY_READ, (void *)usr_tmp, transfer_size); ++ if (ret) { ++ DEBUG9_10(printk( ++ "qla2x00_update_nvram: ERROR in buffer verify READ. " ++ "RequestAdr=%p\n", pext->RequestAdr);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return ret; ++ } ++ ++ copy_from_user(kernel_tmp, usr_tmp, transfer_size); ++ ++ kernel_tmp = (uint8_t *)pnew_nv; ++ ++ /* we need to checksum the nvram */ ++ for (i = 0; i < sizeof(nvram_t) - 1; i++) { ++ chksum += *kernel_tmp; ++ kernel_tmp++; ++ } ++ ++ chksum = ~chksum + 1; ++ ++ *kernel_tmp = chksum; ++ ++ /* Write to NVRAM */ ++ wptr = (uint16_t *)pnew_nv; ++ for (cnt = 0; cnt < transfer_size / 2; cnt++) { ++ data = *wptr++; ++ qla2x00_write_nvram_word(ha, cnt, data); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ ++ DEBUG9(printk("qla2x00_update_nvram: exiting.\n");) ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return 0; ++} ++ ++int ++qla2x00_write_nvram_word(scsi_qla_host_t *ha, uint8_t addr, uint16_t data) ++{ ++ int count; ++ uint16_t word; ++ uint32_t nv_cmd; ++ device_reg_t *reg = ha->iobase; ++ ++ qla2x00_nv_write(ha, NVR_DATA_OUT); ++ qla2x00_nv_write(ha, 0); ++ qla2x00_nv_write(ha, 0); ++ ++ for (word = 0; word < 8; word++) ++ qla2x00_nv_write(ha, NVR_DATA_OUT); ++ ++ qla2x00_nv_deselect(ha); ++ ++ /* Erase Location */ ++ nv_cmd = (addr << 16) | NV_ERASE_OP; ++ nv_cmd <<= 5; ++ for (count = 0; count < 11; count++) { ++ if (nv_cmd & BIT_31) ++ qla2x00_nv_write(ha, NVR_DATA_OUT); ++ else ++ qla2x00_nv_write(ha, 0); ++ ++ nv_cmd <<= 1; ++ } ++ ++ qla2x00_nv_deselect(ha); ++ ++ /* Wait for Erase to Finish */ ++ WRT_REG_WORD(®->nvram, NVR_SELECT); ++ do { ++ NVRAM_DELAY(); ++ word = RD_REG_WORD(®->nvram); ++ } while ((word & NVR_DATA_IN) == 0); ++ ++ qla2x00_nv_deselect(ha); ++ ++ /* Write data */ ++ nv_cmd = (addr << 16) | NV_WRITE_OP; ++ nv_cmd |= data; ++ nv_cmd <<= 5; ++ for (count = 0; count < 27; count++) { ++ if (nv_cmd & BIT_31) ++ qla2x00_nv_write(ha, NVR_DATA_OUT); ++ else ++ qla2x00_nv_write(ha, 0); ++ ++ nv_cmd <<= 1; ++ } ++ ++ qla2x00_nv_deselect(ha); ++ ++ /* Wait for NVRAM to become ready */ ++ WRT_REG_WORD(®->nvram, NVR_SELECT); ++ do { ++ NVRAM_DELAY(); ++ word = RD_REG_WORD(®->nvram); ++ } while ((word & NVR_DATA_IN) == 0); ++ ++ qla2x00_nv_deselect(ha); ++ ++ /* Disable writes */ ++ qla2x00_nv_write(ha, NVR_DATA_OUT); ++ for (count = 0; count < 10; count++) ++ qla2x00_nv_write(ha, 0); ++ ++ qla2x00_nv_deselect(ha); ++ ++ DEBUG9(printk("qla2x00_write_nvram_word: exiting.\n");) ++ ++ return 0; ++} ++ ++int ++qla2x00_send_loopback(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int status; ++ uint16_t ret_mb[MAILBOX_REGISTER_COUNT]; ++ INT_LOOPBACK_REQ req; ++ INT_LOOPBACK_RSP rsp; ++ ++ DEBUG9(printk("qla2x00_send_loopback: entered.\n");) ++ ++ ++ if (pext->RequestLen != sizeof(INT_LOOPBACK_REQ)) { ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk( ++ "qla2x00_send_loopback: invalid RequestLen =%d.\n", ++ pext->RequestLen);) ++ return pext->Status; ++ } ++ ++ if (pext->ResponseLen != sizeof(INT_LOOPBACK_RSP)) { ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk( ++ "qla2x00_send_loopback: invalid ResponseLen =%d.\n", ++ pext->ResponseLen);) ++ return pext->Status; ++ } ++ ++ status = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ pext->RequestLen); ++ if (status) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify read of " ++ "request buffer.\n");) ++ return pext->Status; ++ } ++ ++ copy_from_user((uint8_t *)&req, (uint8_t *)pext->RequestAdr, ++ pext->RequestLen); ++ ++ status = verify_area(VERIFY_READ, (void *)pext->ResponseAdr, ++ pext->ResponseLen); ++ if (status) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify read of " ++ "response buffer.\n");) ++ return pext->Status; ++ } ++ ++ copy_from_user((uint8_t *)&rsp, (uint8_t *)pext->ResponseAdr, ++ pext->ResponseLen); ++ ++ if (req.TransferCount > req.BufferLength || ++ req.TransferCount > rsp.BufferLength) { ++ ++ /* Buffer lengths not large enough. */ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ ++ DEBUG9_10(printk( ++ "qla2x00_send_loopback: invalid TransferCount =%d. " ++ "req BufferLength =%d rspBufferLength =%d.\n", ++ req.TransferCount, req.BufferLength, rsp.BufferLength);) ++ ++ return pext->Status; ++ } ++ ++ status = verify_area(VERIFY_READ, (void *)req.BufferAddress, ++ req.TransferCount); ++ if (status) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify read of " ++ "user loopback data buffer.\n");) ++ return pext->Status; ++ } ++ ++ copy_from_user((uint8_t *)ha->ioctl_mem, (uint8_t *)req.BufferAddress, ++ req.TransferCount); ++ ++ DEBUG9(printk("qla2x00_send_loopback: req -- bufadr=%p, buflen=%x, " ++ "xfrcnt=%x, rsp -- bufadr=%p, buflen=%x.\n", ++ req.BufferAddress, req.BufferLength, req.TransferCount, ++ rsp.BufferAddress, rsp.BufferLength);) ++ ++ /* ++ * AV - the caller of this IOCTL expects the FW to handle ++ * a loopdown situation and return a good status for the ++ * call function and a LOOPDOWN status for the test operations ++ */ ++ /*if (ha->loop_state != LOOP_READY || */ ++ if ( ++ (test_bit(CFG_ACTIVE, &ha->cfg_flags)) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE || ha->dpc_active) { ++ ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("qla2x00_send_loopback(%ld): " ++ "loop not ready.\n", ha->host_no);) ++ return pext->Status; ++ } ++ ++ status = qla2x00_loopback_test(ha, &req, ret_mb); ++ ++ if (status) { ++ if (status == QL_STATUS_TIMEOUT ) { ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("qla2x00_send_loopback: ERROR " ++ "command timed out.\n");) ++ return pext->Status; ++ } else { ++ /* EMPTY. Just proceed to copy back mailbox reg ++ * values for users to interpret. ++ */ ++ DEBUG10(printk("qla2x00_send_loopback: ERROR " ++ "loopback command failed 0x%x.\n", ret_mb[0]);) ++ } ++ } ++ ++ status = verify_area(VERIFY_WRITE, (void *)rsp.BufferAddress, ++ req.TransferCount); ++ if (status) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify " ++ "write of return data buffer.\n");) ++ return pext->Status; ++ } ++ ++ DEBUG9(printk("qla2x00_send_loopback: loopback mbx cmd ok. " ++ "copying data.\n");) ++ ++ /* put loopback return data in user buffer */ ++ copy_to_user((uint8_t *)rsp.BufferAddress, ++ (uint8_t *)ha->ioctl_mem, req.TransferCount); ++ ++ rsp.CompletionStatus = ret_mb[0]; ++ if (rsp.CompletionStatus == INT_DEF_LB_COMPLETE) { ++ rsp.CrcErrorCount = ret_mb[1]; ++ rsp.DisparityErrorCount = ret_mb[2]; ++ rsp.FrameLengthErrorCount = ret_mb[3]; ++ rsp.IterationCountLastError = (ret_mb[19] << 16) | ret_mb[18]; ++ } ++ ++ status = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ pext->ResponseLen); ++ if (status) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify " ++ "write of response buffer.\n");) ++ return pext->Status; ++ } ++ ++ copy_to_user((uint8_t *)pext->ResponseAdr, (uint8_t *)&rsp, ++ pext->ResponseLen); ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ ++ DEBUG9(printk("qla2x00_send_loopback: exiting.\n");) ++ ++ return pext->Status; ++} ++ ++int qla2x00_read_option_rom(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ uint8_t *usr_tmp; ++ uint32_t addr; ++ uint32_t midpoint; ++ uint32_t transfer_size; ++ uint8_t data; ++ device_reg_t *reg = ha->iobase; ++ unsigned long cpu_flags; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ if (pext->ResponseLen != FLASH_IMAGE_SIZE) { ++ pext->Status = EXT_STATUS_BUFFER_TOO_SMALL; ++ return (1); ++ } ++ ++ transfer_size = FLASH_IMAGE_SIZE; ++ ++ midpoint = FLASH_IMAGE_SIZE / 2; ++ usr_tmp = (uint8_t *)pext->ResponseAdr; ++ ++ /* Dump FLASH. */ ++ spin_lock_irqsave(&ha->hardware_lock, cpu_flags); ++ WRT_REG_WORD(®->nvram, 0); ++ for (addr = 0; addr < transfer_size; addr++, usr_tmp++) { ++ if (addr == midpoint) ++ WRT_REG_WORD(®->nvram, NVR_SELECT); ++ ++ data = qla2x00_read_flash_byte(ha, addr); ++ __put_user(data, usr_tmp); ++ } ++ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return (0); ++} ++ ++int qla2x00_update_option_rom(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret; ++ uint8_t *usr_tmp; ++ uint8_t *kern_tmp; ++ uint16_t status; ++ unsigned long cpu_flags; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ if (pext->RequestLen != FLASH_IMAGE_SIZE) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ return (1); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ ++ /* Read from user buffer */ ++ usr_tmp = (uint8_t *)pext->RequestAdr; ++ ret = verify_area(VERIFY_READ, (void *)usr_tmp, FLASH_IMAGE_SIZE); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s: ERROR in buffer verify READ. " ++ "RequestAdr=%p\n", ++ __func__, pext->RequestAdr);) ++ return (ret); ++ } ++ ++ kern_tmp = (uint8_t *)KMEM_ZALLOC(FLASH_IMAGE_SIZE, 30); ++ if (kern_tmp == NULL) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ printk(KERN_WARNING ++ "%s: ERROR in flash allocation.\n", __func__); ++ return (1); ++ } ++ copy_from_user(kern_tmp, usr_tmp, FLASH_IMAGE_SIZE); ++ ++ /* Go with update */ ++ spin_lock_irqsave(&ha->hardware_lock, cpu_flags); ++ status = qla2x00_set_flash_image(ha, kern_tmp); ++ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); ++ ++ KMEM_FREE(kern_tmp, FLASH_IMAGE_SIZE); ++ ++ if (status) { ++ ret = 1; ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s: ERROR updating flash.\n", __func__);) ++ } ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return (ret); ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_init.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,5945 @@ ++/* ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ */ ++#include "qla_os.h" ++ ++#include "qla_def.h" ++ ++/* ++* QLogic ISP2x00 Hardware Support Function Prototypes. ++*/ ++uint8_t qla2x00_initialize_adapter(scsi_qla_host_t *); ++ ++static uint8_t qla2x00_isp_firmware(scsi_qla_host_t *); ++static void qla2x00_reset_chip(scsi_qla_host_t *); ++static uint8_t qla2x00_pci_config(scsi_qla_host_t *); ++static uint8_t qla2x00_set_cache_line(scsi_qla_host_t *); ++static uint8_t qla2x00_chip_diag(scsi_qla_host_t *); ++static uint8_t qla2x00_setup_chip(scsi_qla_host_t *ha); ++static uint8_t qla2x00_init_rings(scsi_qla_host_t *ha); ++static uint8_t qla2x00_fw_ready(scsi_qla_host_t *ha); ++static uint8_t qla2x00_nvram_config(scsi_qla_host_t *); ++ ++static void qla2x00_init_fc_db(scsi_qla_host_t *); ++static void qla2x00_init_tgt_map(scsi_qla_host_t *); ++ ++static uint8_t qla2x00_configure_loop(scsi_qla_host_t *); ++static uint8_t qla2x00_configure_local_loop(scsi_qla_host_t *, uint8_t ); ++static uint8_t qla2x00_configure_fabric(scsi_qla_host_t *, uint8_t ); ++static uint8_t qla2x00_find_all_fabric_devs(scsi_qla_host_t *, ++ struct new_dev *, uint16_t *, uint8_t *); ++static void qla2x00_device_resync(scsi_qla_host_t *); ++static int qla2x00_ga_nxt(scsi_qla_host_t *, sw_info_t *); ++static int qla2x00_gid_pt(scsi_qla_host_t *, sw_info_t *); ++static int qla2x00_gpn_id(scsi_qla_host_t *, sw_info_t *); ++static int qla2x00_gnn_id(scsi_qla_host_t *, sw_info_t *); ++static int qla2x00_gft_id(scsi_qla_host_t *, sw_info_t *); ++static int qla2x00_rft_id(scsi_qla_host_t *); ++static int qla2x00_rff_id(scsi_qla_host_t *); ++static int qla2x00_rnn_id(scsi_qla_host_t *); ++static int qla2x00_rsnn_nn(scsi_qla_host_t *); ++ ++static int qla2x00_add_initiator_device(scsi_qla_host_t *, fcdev_t *); ++ ++uint8_t qla2x00_fabric_login(scsi_qla_host_t *, fcdev_t *); ++uint8_t qla2x00_local_device_login(scsi_qla_host_t *, uint16_t); ++ ++static uint8_t qla2x00_update_fc_database(scsi_qla_host_t *, ++ fcdev_t *, uint8_t); ++static int qla2x00_build_fcport_list(scsi_qla_host_t *ha); ++static void qla2x00_config_os(scsi_qla_host_t *ha); ++static uint16_t qla2x00_fcport_bind(scsi_qla_host_t *ha, fc_port_t *fcport); ++static int qla2x00_update_fcport(scsi_qla_host_t *ha, fc_port_t *fcport, int); ++static int qla2x00_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport, int); ++static int qla2x00_rpt_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport); ++static void qla2x00_cfg_lun(fc_port_t *fcport, uint16_t lun); ++ ++static void qla2x00_lun_free(scsi_qla_host_t *, uint16_t, uint16_t); ++ ++static void qla2x00_get_lun_mask_from_config(scsi_qla_host_t *, ++ fc_port_t *, uint16_t, uint16_t); ++static int qla2x00_bstr_to_hex(char *, uint8_t *, int); ++ ++static uint8_t qla2x00_find_propname(scsi_qla_host_t *, ++ char *, char *, char *, int); ++static int qla2x00_get_prop_16chars(scsi_qla_host_t *, ++ char *, char *, char *); ++static void qla2x00_get_properties(scsi_qla_host_t *, char *); ++ ++static void qla2x00_cfg_persistent_binding(scsi_qla_host_t *); ++ ++static int qla2x00_restart_isp(scsi_qla_host_t *); ++static void qla2x00_reset_adapter(scsi_qla_host_t *); ++ ++#define MAX_LOCAL_LOOP_IDS 127 ++static uint8_t alpa_table[MAX_LOCAL_LOOP_IDS] = { ++ 0xEF, 0xE8, 0xE4, 0xE2, 0xE1, 0xE0, 0xDC, 0xDA, ++ 0xD9, 0xD6, 0xD5, 0xD4, 0xD3, 0xD2, 0xD1, 0xCE, ++ 0xCD, 0xCC, 0xCB, 0xCA, 0xC9, 0xC7, 0xC6, 0xC5, ++ 0xC3, 0xBC, 0xBA, 0xB9, 0xB6, 0xB5, 0xB4, 0xB3, ++ 0xB2, 0xB1, 0xAE, 0xAD, 0xAC, 0xAB, 0xAA, 0xA9, ++ 0xA7, 0xA6, 0xA5, 0xA3, 0x9F, 0x9E, 0x9D, 0x9B, ++ 0x98, 0x97, 0x90, 0x8F, 0x88, 0x84, 0x82, 0x81, ++ 0x80, 0x7C, 0x7A, 0x79, 0x76, 0x75, 0x74, 0x73, ++ 0x72, 0x71, 0x6E, 0x6D, 0x6C, 0x6B, 0x6A, 0x69, ++ 0x67, 0x66, 0x65, 0x63, 0x5C, 0x5A, 0x59, 0x56, ++ 0x55, 0x54, 0x53, 0x52, 0x51, 0x4E, 0x4D, 0x4C, ++ 0x4B, 0x4A, 0x49, 0x47, 0x46, 0x45, 0x43, 0x3C, ++ 0x3A, 0x39, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, ++ 0x2E, 0x2D, 0x2C, 0x2B, 0x2A, 0x29, 0x27, 0x26, ++ 0x25, 0x23, 0x1F, 0x1E, 0x1D, 0x1B, 0x18, 0x17, ++ 0x10, 0x0F, 0x08, 0x04, 0x02, 0x01, 0x00 ++}; ++ ++/****************************************************************************/ ++/* QLogic ISP2x00 Hardware Support Functions. */ ++/****************************************************************************/ ++ ++/* ++* qla2x00_initialize_adapter ++* Initialize board. ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Returns: ++* 0 = success ++*/ ++uint8_t ++qla2x00_initialize_adapter(scsi_qla_host_t *ha) ++{ ++ uint8_t status; ++ uint8_t isp_init = 0; ++ uint8_t restart_risc = 0; ++ uint8_t retry; ++ unsigned long wait_device = 0; ++ ++ ENTER(__func__); ++ ++ /* Clear adapter flags. */ ++ ha->forceLip = 0; ++ ha->flags.online = FALSE; ++ ha->flags.disable_host_adapter = FALSE; ++ ha->flags.reset_active = FALSE; ++ ha->flags.watchdog_enabled = FALSE; ++ atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); ++ ha->loop_state = LOOP_DOWN; ++ ha->device_flags = 0; ++ ha->sns_retry_cnt = 0; ++ ha->device_flags = 0; ++ ha->dpc_flags = 0; ++ ha->sns_retry_cnt = 0; ++ ha->failback_delay = 0; ++#if defined(IOCB_THROLLE_USAGE) ++ ha->iocb_cnt = 0; ++ ha->iocb_overflow_cnt = 0; ++#endif ++ ha->flags.management_server_logged_in = 0; ++ ha->marker_needed = 0; ++ ha->mbx_flags = 0; ++ ha->isp_abort_cnt = 0; ++ ++ if (!(status = qla2x00_pci_config(ha))) { ++ ++ qla2x00_reset_chip(ha); ++ ++ /* Initialize Fibre Channel database. */ ++ qla2x00_init_fc_db(ha); ++ ++ /* Initialize target map database. */ ++ qla2x00_init_tgt_map(ha); ++ ++ /* Get Flash Version */ ++ qla2x00_get_flash_version(ha); ++ ++ if (qla2x00_verbose) ++ printk("scsi(%ld): Configure NVRAM parameters...\n", ++ ha->host_no); ++ ++ qla2x00_nvram_config(ha); ++ ++ ha->retry_count = ql2xretrycount; ++ ++ if (qla2x00_verbose) ++ printk("scsi(%ld): Verifying loaded RISC code...\n", ++ ha->host_no); ++ ++ qla2x00_set_cache_line(ha); ++ ++ /* ++ * If the user specified a device configuration on the command ++ * line then use it as the configuration. Otherwise, we scan ++ * for all devices. ++ */ ++ if (ql2xdevconf) { ++ ha->cmdline = ql2xdevconf; ++ if (!ha->flags.failover_enabled) ++ qla2x00_get_properties(ha, ql2xdevconf); ++ } ++ ++ retry = 10; ++ /* ++ * Try an configure the loop. ++ */ ++ do { ++ restart_risc = 0; ++ isp_init = 0; ++ ++ /* If firmware needs to be loaded */ ++ if (qla2x00_isp_firmware(ha)) { ++ if (qla2x00_verbose) ++ printk("scsi(%ld): Verifying chip...\n", ++ ha->host_no); ++ ++ if (!(status = qla2x00_chip_diag(ha))) ++ status = qla2x00_setup_chip(ha); ++ ++ if (!status) { ++ DEBUG(printk("scsi(%ld): Chip verified " ++ "and RISC loaded...\n", ++ ha->host_no)); ++ } ++ } ++ ++ /* Retrieve firmware information */ ++ qla2x00_get_fw_version(ha, &ha->fw_major_version, ++ &ha->fw_minor_version, &ha->fw_subminor_version, ++ &ha->fw_attributes); ++ ++ if (!status && !(status = qla2x00_init_rings(ha))) { ++ /* dg - 7/3/1999 ++ * ++ * Wait for a successful LIP up to a maximum ++ * of (in seconds): RISC login timeout value, ++ * RISC retry count value, and port down retry ++ * value OR a minimum of 4 seconds OR If no ++ * cable, only 5 seconds. ++ */ ++ DEBUG(printk("scsi(%ld): Init rings OK..." ++ "calling qla2x00_fw_ready()...\n", ++ ha->host_no)); ++ ++ if (!qla2x00_fw_ready(ha)) { ++ clear_bit(RESET_MARKER_NEEDED, ++ &ha->dpc_flags); ++ clear_bit(COMMAND_WAIT_NEEDED, ++ &ha->dpc_flags); ++ ++ /* ++ * Go setup flash database devices ++ * with proper Loop ID's. ++ */ ++ do { ++ clear_bit(LOOP_RESYNC_NEEDED, ++ &ha->dpc_flags); ++ status = qla2x00_configure_loop(ha); ++ ++ /* ++ * Temp code: delay a while for certain ++ * slower devices to become ready. ++ */ ++ for ((wait_device = jiffies + HZ); ++ !time_after_eq(jiffies,wait_device);) { ++ qla2x00_check_fabric_devices(ha); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(5); ++ } ++ ++ } while (!atomic_read(&ha->loop_down_timer) && ++ !(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) && ++ (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) ); ++ } ++ ++ if (ha->flags.update_config_needed) { ++ ha->init_cb->add_firmware_options[0] |= ++ ((ha->operating_mode << 4) & ++ (BIT_6 | BIT_5 | BIT_4)); ++ ++ restart_risc = 1; ++ } ++ ++ if (ha->mem_err) { ++ restart_risc = 1; ++ } ++ isp_init = 1; ++ ++ } ++ } while (restart_risc && retry--); ++ ++ if (isp_init) { ++ clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ ha->marker_needed = 1; ++ qla2x00_marker(ha, 0, 0, MK_SYNC_ALL); ++ ha->marker_needed = 0; ++ ++ ha->flags.online = TRUE; ++ } ++ ++ } ++ ++#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) ++ if (status) ++ printk("%s(): **** FAILED ****\n", __func__); ++#endif ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_isp_firmware() - Choose firmware image. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_isp_firmware(scsi_qla_host_t *ha) ++{ ++ uint8_t status; ++ ++ ++ ENTER(__func__); ++ ++ /* Assume loading risc code */ ++ status = 1; ++ ++ if (ha->flags.disable_risc_code_load) { ++ DEBUG2(printk("scsi(%ld): RISC CODE NOT loaded\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): RISC CODE NOT loaded\n", ha->host_no); ++ ++ /* Verify checksum of loaded RISC code. */ ++ status = qla2x00_verify_checksum(ha); ++ } ++ ++ if (status) { ++ DEBUG2_3(printk("scsi(%ld): **** Load RISC code ****\n", ++ ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_reset_chip() - Reset ISP chip. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static void ++qla2x00_reset_chip(scsi_qla_host_t *ha) ++{ ++ unsigned long flags = 0; ++ device_reg_t *reg = ha->iobase; ++ uint32_t cnt; ++ unsigned long mbx_flags = 0; ++ uint16_t cmd; ++ ++ ENTER(__func__); ++ ++ /* Disable ISP interrupts. */ ++ qla2x00_disable_intrs(ha); ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Turn off master enable */ ++ cmd = 0; ++ pci_read_config_word(ha->pdev, PCI_COMMAND, &cmd); ++ cmd &= ~PCI_COMMAND_MASTER; ++ pci_write_config_word(ha->pdev, PCI_COMMAND, cmd); ++ ++#if defined(ISP2200) || defined(ISP2300) ++ /* Pause RISC. */ ++ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ for (cnt = 0; cnt < 30000; cnt++) { ++ if ((RD_REG_WORD(®->hccr) & HCCR_RISC_PAUSE) != 0) ++ break; ++ udelay(100); ++ } ++ } else { ++ udelay(10); ++ } ++ ++ /* Select FPM registers. */ ++ WRT_REG_WORD(®->ctrl_status, 0x20); ++ ++ /* FPM Soft Reset. */ ++ WRT_REG_WORD(®->fpm_diag_config, 0x100); ++ ++#if defined(ISP2300) ++ /* Toggle Fpm Reset. */ ++ WRT_REG_WORD(®->fpm_diag_config, 0x0); ++#endif ++ ++ /* Select frame buffer registers. */ ++ WRT_REG_WORD(®->ctrl_status, 0x10); ++ ++ /* Reset frame buffer FIFOs. */ ++#if defined(ISP2200) ++ WRT_REG_WORD(®->fb_cmd, 0xa000); ++#else ++ WRT_REG_WORD(®->fb_cmd, 0x00fc); ++ ++ /* Read back fb_cmd until zero or 3 seconds max */ ++ for (cnt = 0; cnt < 3000; cnt++) { ++ if ((RD_REG_WORD(®->fb_cmd) & 0xff) == 0) ++ break; ++ udelay(100); ++ } ++#endif /* defined(ISP2200) */ ++ ++ /* Select RISC module registers. */ ++ WRT_REG_WORD(®->ctrl_status, 0); ++ ++ /* Reset RISC processor. */ ++ WRT_REG_WORD(®->hccr, HCCR_RESET_RISC); ++ ++ /* Release RISC processor. */ ++ WRT_REG_WORD(®->hccr, HCCR_RELEASE_RISC); ++ ++#endif /* defined(ISP2200) || defined(ISP2300) */ ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_HOST_INT); ++ ++ /* Reset ISP chip. */ ++ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); ++ ++ /* Wait for RISC to recover from reset. */ ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ udelay(10); ++ } else { ++ for (cnt = 30000; cnt; cnt--) { ++ if ((RD_REG_WORD(®->ctrl_status) & ++ CSR_ISP_SOFT_RESET) == 0) ++ break; ++ udelay(100); ++ } ++ } ++ ++ /* Reset RISC processor. */ ++ WRT_REG_WORD(®->hccr, HCCR_RESET_RISC); ++ ++ WRT_REG_WORD(®->semaphore, 0); ++ ++ /* Release RISC processor. */ ++ WRT_REG_WORD(®->hccr, HCCR_RELEASE_RISC); ++ ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ udelay(100); ++ } else { ++ for (cnt = 0; cnt < 30000; cnt++) { ++ if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) ++ QLA_MBX_REG_LOCK(ha); ++ ++ if (RD_REG_WORD(®->mailbox0) != MBS_BUSY) { ++ if (!(test_bit(ABORT_ISP_ACTIVE, ++ &ha->dpc_flags))) ++ QLA_MBX_REG_UNLOCK(ha); ++ break; ++ } ++ ++ if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) ++ QLA_MBX_REG_UNLOCK(ha); ++ ++ udelay(100); ++ } ++ } ++ ++ /* Turn on master enable */ ++ cmd |= PCI_COMMAND_MASTER; ++ pci_write_config_word(ha->pdev, PCI_COMMAND, cmd); ++ ++#if defined(ISP2200) || defined(ISP2300) ++ /* Disable RISC pause on FPM parity error. */ ++ WRT_REG_WORD(®->hccr, HCCR_DISABLE_PARITY_PAUSE); ++#endif ++ ++ /* Save PCI information. */ ++ ha->isp_ctrl_status = RD_REG_WORD(®->ctrl_status); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_pci_config() - Setup device PCI configuration registers. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_pci_config(scsi_qla_host_t *ha) ++{ ++ uint8_t status; ++ uint16_t w; ++#if defined(ISP2300) ++ uint32_t cnt; ++ unsigned long flags = 0; ++#endif ++#if MEMORY_MAPPED_IO ++ uint32_t mmapbase; ++ uint32_t page_offset, base; ++#endif ++ ++ ENTER(__func__); ++ ++ if (qla2x00_verbose) ++ printk("scsi(%ld): Configuring PCI space...\n", ++ ha->host_no); ++ ++ /* ++ * Turn on PCI master; for system BIOSes that don't turn it on by ++ * default. ++ */ ++ pci_set_master(ha->pdev); ++ pci_read_config_word(ha->pdev, PCI_REVISION_ID, &ha->revision); ++ ++ if (ha->iobase) ++ return 0; ++ ++ /* ++ * We want to respect framework's setting of PCI configuration space ++ * command register and also want to make sure that all bits of ++ * interest to us are properly set in command register. ++ */ ++ pci_read_config_word(ha->pdev, PCI_COMMAND, &w); ++ w |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | ++ PCI_COMMAND_INVALIDATE | PCI_COMMAND_PARITY | PCI_COMMAND_SERR); ++ ++#if MEMORY_MAPPED_IO ++ DEBUG(printk("scsi(%ld): I/O SPACE and MEMORY MAPPED I/O enabled.\n", ++ ha->host_no)); ++#else ++ DEBUG(printk("scsi(%ld): I/O SPACE enabled and MEMORY MAPPED I/O " ++ "disabled.\n", ha->host_no)); ++ ++ w &= ~PCI_COMMAND_MEMORY; ++#endif ++ ++#if defined(ISP2300) ++ /* PCI Specification Revision 2.3 changes */ ++ if (ha->pdev->device == QLA2322_DEVICE_ID) { ++ /* Command Register -- Reset Interrupt Disable -- BIT_10 */ ++ w &= ~BIT_10; ++ } ++ ++ /* ++ * If this is a 2300 card and not 2312, reset the COMMAND_INVALIDATE ++ * due to a bug in the 2300. Unfortunately, the 2310 also reports ++ * itself as a 2300 so we need to get the fb revision level -- a 6 ++ * indicates it really is a 2300 and not a 2310. ++ */ ++ if (ha->pdev->device == QLA2300_DEVICE_ID) { ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Pause RISC. */ ++ WRT_REG_WORD(&ha->iobase->hccr, HCCR_PAUSE_RISC); ++ for (cnt = 0; cnt < 30000; cnt++) { ++ if ((RD_REG_WORD(&ha->iobase->hccr) & ++ HCCR_RISC_PAUSE) != 0) ++ break; ++ ++ udelay(10); ++ } ++ ++ /* Select FPM registers. */ ++ WRT_REG_WORD(&ha->iobase->ctrl_status, 0x20); ++ ++ /* Get the fb rev level */ ++ if (RD_REG_WORD(&ha->iobase->fb_cmd) == FPM_2300) ++ w &= ~PCI_COMMAND_INVALIDATE; ++ ++ /* Deselect FPM registers. */ ++ WRT_REG_WORD(&ha->iobase->ctrl_status, 0x0); ++ ++ /* Release RISC module. */ ++ WRT_REG_WORD(&ha->iobase->hccr, HCCR_RELEASE_RISC); ++ for (cnt = 0; cnt < 30000; cnt++) { ++ if ((RD_REG_WORD(&ha->iobase->hccr) & ++ HCCR_RISC_PAUSE) == 0) ++ break; ++ ++ udelay(10); ++ } ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ } ++#endif ++ ++ pci_write_config_word(ha->pdev, PCI_COMMAND, w); ++ ++ /* Reset expansion ROM address decode enable */ ++ pci_read_config_word(ha->pdev, PCI_ROM_ADDRESS, &w); ++ w &= ~PCI_ROM_ADDRESS_ENABLE; ++ pci_write_config_word(ha->pdev, PCI_ROM_ADDRESS, w); ++ ++ status = 0; ++#if MEMORY_MAPPED_IO ++ /* Get memory mapped I/O address */ ++ pci_read_config_dword(ha->pdev, PCI_BASE_ADDRESS_1, &mmapbase); ++ mmapbase &= PCI_BASE_ADDRESS_MEM_MASK; ++ ++ /* Find proper memory chunk for memory map I/O reg */ ++ base = mmapbase & PAGE_MASK; ++ page_offset = mmapbase - base; ++ ++ /* Get virtual address for I/O registers */ ++ ha->mmpbase = ioremap(base, page_offset + 256); ++ if (ha->mmpbase) { ++ ha->mmpbase += page_offset; ++ ha->iobase = ha->mmpbase; ++ status = 0; ++ } ++#endif ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_set_cache_line() - Sets PCI cache line parameter. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_set_cache_line(struct scsi_qla_host * ha) ++{ ++ unsigned char cache_size; ++ ++ ENTER(__func__); ++ ++ /* Set the cache line. */ ++ if (!ha->flags.set_cache_line_size_1) { ++ LEAVE(__func__); ++ ++ return (0); ++ } ++ ++ /* Taken from drivers/net/acenic.c */ ++ pci_read_config_byte(ha->pdev, PCI_CACHE_LINE_SIZE, &cache_size); ++ cache_size <<= 2; ++ if (cache_size != SMP_CACHE_BYTES) { ++ printk(KERN_INFO ++ "scsi(%ld): PCI cache line size set incorrectly " ++ "(%d bytes) by BIOS/FW, ", ++ ha->host_no, cache_size); ++ ++ if (cache_size > SMP_CACHE_BYTES) { ++ printk(KERN_INFO "expecting %d.\n", SMP_CACHE_BYTES); ++ } else { ++ printk(KERN_INFO ++ "correcting to %d.\n", SMP_CACHE_BYTES); ++ pci_write_config_byte(ha->pdev, ++ PCI_CACHE_LINE_SIZE, SMP_CACHE_BYTES >> 2); ++ } ++ } ++ ++ LEAVE(__func__); ++ ++ return (0); ++} ++ ++/** ++ * qla2x00_chip_diag() - Test chip for proper operation. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_chip_diag(scsi_qla_host_t *ha) ++{ ++ uint8_t status; ++ device_reg_t *reg = ha->iobase; ++ unsigned long flags = 0; ++ uint16_t data; ++ uint32_t cnt; ++ uint16_t mb[5]; ++ ++ ENTER(__func__); ++ ++ /* Assume a failed state */ ++ status = 1; ++ ++ DEBUG3(printk("scsi(%ld): Testing device at %lx.\n", ++ ha->host_no, (u_long)®->flash_address)); ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Reset ISP chip. */ ++ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); ++ data = qla2x00_debounce_register(®->ctrl_status); ++ for (cnt = 6000000 ; cnt && (data & CSR_ISP_SOFT_RESET); cnt--) { ++ udelay(5); ++ data = RD_REG_WORD(®->ctrl_status); ++ barrier(); ++ } ++ ++ if (!cnt) ++ goto chip_diag_failed; ++ ++ DEBUG3(printk("scsi(%ld): Reset register cleared by chip reset\n", ++ ha->host_no)); ++ ++ /* Reset RISC processor. */ ++ WRT_REG_WORD(®->hccr, HCCR_RESET_RISC); ++ WRT_REG_WORD(®->hccr, HCCR_RELEASE_RISC); ++ ++#if defined(ISP2300) ++ /* Workaround for QLA2312 PCI parity error */ ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ udelay(10); ++ } else { ++ data = qla2x00_debounce_register(®->mailbox0); ++ for (cnt = 6000000; cnt && (data == MBS_BUSY); cnt--) { ++ udelay(5); ++ data = RD_REG_WORD(®->mailbox0); ++ barrier(); ++ } ++ } ++#else ++ data = qla2x00_debounce_register(®->mailbox0); ++ for (cnt = 6000000; cnt && (data == MBS_BUSY); cnt--) { ++ udelay(5); ++ data = RD_REG_WORD(®->mailbox0); ++ barrier(); ++ } ++#endif ++ if (!cnt) ++ goto chip_diag_failed; ++ ++ /* Check product ID of chip */ ++ DEBUG3(printk("scsi(%ld): Checking product ID of chip\n", ++ ha->host_no)); ++ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ mb[2] = RD_REG_WORD(®->mailbox2); ++ mb[3] = RD_REG_WORD(®->mailbox3); ++ mb[4] = qla2x00_debounce_register(®->mailbox4); ++ ++ if (mb[1] != PROD_ID_1 || ++ (mb[2] != PROD_ID_2 && mb[2] != PROD_ID_2a) || ++ mb[3] != PROD_ID_3 || ++ (mb[4] != PROD_ID_4 && mb[4] != PROD_ID_4a)) { ++ ++ printk(KERN_WARNING ++ "scsi(%ld): Wrong product ID = 0x%x,0x%x,0x%x,0x%x\n", ++ ha->host_no, mb[1], mb[2], mb[3], mb[4]); ++ ++ goto chip_diag_failed; ++ } ++ ++ /* Adjust fw RISC transfer size */ ++ ha->fw_transfer_size = REQUEST_ENTRY_SIZE * REQUEST_ENTRY_CNT; ++#if defined(ISP2200) ++ if (ha->pdev->device == QLA2200_DEVICE_ID && ++ RD_REG_WORD(®->mailbox7) == QLA2200A_RISC_ROM_VER) { ++ ++ /* Limit firmware transfer size with a 2200A */ ++ DEBUG3(printk("scsi(%ld): Found QLA2200A chip.\n", ++ ha->host_no)); ++ ++ ha->fw_transfer_size = 128; ++ } ++#endif ++ ++ /* Wrap Incoming Mailboxes Test. */ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ DEBUG3(printk("scsi(%ld): Checking mailboxes.\n", ha->host_no)); ++ status = qla2x00_mbx_reg_test(ha); ++ if (status) { ++ DEBUG(printk("scsi(%ld): Failed mailbox send register test\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): Failed mailbox send register test\n", ++ ha->host_no); ++ } ++ else { ++ /* Flag a successful status */ ++ status = 0; ++ } ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++chip_diag_failed: ++ if (status) ++ DEBUG2_3(printk("scsi(%ld): Chip diagnostics **** FAILED " ++ "****\n", ha->host_no)); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_setup_chip() - Load and start RISC firmware. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_setup_chip(scsi_qla_host_t *ha) ++{ ++ uint8_t status = 0; ++ uint16_t cnt; ++ uint16_t *risc_code; ++ unsigned long risc_address; ++ unsigned long risc_code_size; ++ int num; ++ int i; ++ uint16_t *req_ring; ++ struct qla_fw_info *fw_iter; ++ ++ ENTER(__func__); ++ ++ /* Load firmware sequences */ ++ fw_iter = ha->brd_info->fwinfo; ++ while (fw_iter->addressing != FW_INFO_ADDR_NOMORE) { ++ risc_code = fw_iter->fwcode; ++ risc_code_size = *fw_iter->fwlen; ++ ++ if (fw_iter->addressing == FW_INFO_ADDR_NORMAL) { ++ risc_address = *fw_iter->fwstart; ++ } else { ++ /* Extended address */ ++ risc_address = *fw_iter->lfwstart; ++ } ++ ++ num = 0; ++ status = 0; ++ while (risc_code_size > 0 && !status) { ++ cnt = (uint16_t)(ha->fw_transfer_size >> 1); ++ if (cnt > risc_code_size) ++ cnt = risc_code_size; ++ ++ DEBUG7(printk("scsi(%ld): Loading risc segment@ " ++ "addr %p, number of bytes 0x%x, offset 0x%lx.\n", ++ ha->host_no, risc_code, cnt, risc_address)); ++ ++ req_ring = (uint16_t *)ha->request_ring; ++ for (i = 0; i < cnt; i++) ++ req_ring[i] = cpu_to_le16(risc_code[i]); ++ ++ /* ++ * Flush written firmware to the ha->request_ring buffer ++ * before DMA. ++ */ ++ flush_cache_all(); ++ ++ if (fw_iter->addressing == FW_INFO_ADDR_NORMAL) { ++ status = qla2x00_load_ram(ha, ++ ha->request_dma, risc_address, cnt); ++ } else { ++ status = qla2x00_load_ram_ext(ha, ++ ha->request_dma, risc_address, cnt); ++ } ++ if (status) { ++ DEBUG(printk("scsi(%ld): [ERROR] Failed to " ++ "load segment %d of firmware\n", ++ ha->host_no, num)); ++ printk(KERN_WARNING ++ "scsi(%ld): [ERROR] Failed to load " ++ "segment %d of firmware\n", ++ ha->host_no, num); ++ ++ qla2x00_dump_regs(ha->host); ++ break; ++ } ++ ++ risc_code += cnt; ++ risc_address += cnt; ++ risc_code_size -= cnt; ++ num++; ++ } ++ ++ /* Next firmware sequence */ ++ fw_iter++; ++ } ++ ++ /* Verify checksum of loaded RISC code. */ ++ if (!status) { ++ DEBUG(printk("scsi(%ld): Verifying Checksum of loaded RISC " ++ "code.\n", ha->host_no)); ++ ++ status = qla2x00_verify_checksum(ha); ++ if (status == QL_STATUS_SUCCESS) { ++ /* Start firmware execution. */ ++ DEBUG(printk("scsi(%ld): Checksum OK, start " ++ "firmware.\n", ha->host_no)); ++ ++ status = qla2x00_execute_fw(ha); ++ } ++ else { ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld): ISP Firmware failed checksum.\n", ++ ha->host_no)); ++ } ++ } ++ ++ if (status) { ++ DEBUG2_3(printk("scsi(%ld): Setup chip **** FAILED ****.\n", ++ ha->host_no)); ++ } ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_init_rings() - Initializes firmware. ++ * @ha: HA context ++ * ++ * Beginning of request ring has initialization control block already built ++ * by nvram config routine. ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_init_rings(scsi_qla_host_t *ha) ++{ ++ unsigned long flags = 0; ++ uint8_t status; ++ int cnt; ++ device_reg_t *reg = ha->iobase; ++ ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Clear outstanding commands array. */ ++ for (cnt = 0; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) ++ ha->outstanding_cmds[cnt] = 0; ++ ++ ha->current_outstanding_cmd = 0; ++ ++ /* Clear RSCN queue. */ ++ ha->rscn_in_ptr = 0; ++ ha->rscn_out_ptr = 0; ++ ++ /* Initialize firmware. */ ++ ha->request_ring_ptr = ha->request_ring; ++ ha->req_ring_index = 0; ++ ha->req_q_cnt = REQUEST_ENTRY_CNT; ++ ha->response_ring_ptr = ha->response_ring; ++ ha->rsp_ring_index = 0; ++ ++ WRT_REG_WORD(ISP_REQ_Q_IN(reg), 0); ++ WRT_REG_WORD(ISP_REQ_Q_OUT(reg), 0); ++ WRT_REG_WORD(ISP_RSP_Q_IN(reg), 0); ++ WRT_REG_WORD(ISP_RSP_Q_OUT(reg), 0); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ DEBUG(printk("scsi(%ld): Issue init firmware.\n", ha->host_no)); ++ status = qla2x00_init_firmware(ha, sizeof(init_cb_t)); ++ if (status) { ++ DEBUG2_3(printk("scsi(%ld): Init firmware **** FAILED ****.\n", ++ ha->host_no)); ++ } else { ++ /* Setup seriallink options */ ++ uint16_t swing, emphasis; ++ uint16_t opt10, opt11; ++ ++ DEBUG3(printk("scsi(%ld): Serial link options:\n", ++ ha->host_no)); ++ DEBUG3(qla2x00_dump_buffer( ++ (uint8_t *)&ha->fw_seriallink_options, ++ sizeof(ha->fw_seriallink_options))); ++ ++ qla2x00_get_fw_options(ha, ++ &ha->fw_options1, &ha->fw_options2, &ha->fw_options3); ++ ++ ha->fw_options1 &= ~BIT_8; ++ if (ha->fw_seriallink_options[1] & BIT_2) ++ ha->fw_options1 |= BIT_8; ++ ++ /* 1G settings */ ++ swing = ha->fw_seriallink_options[0] & (BIT_2 | BIT_1 | BIT_0); ++ emphasis = ha->fw_seriallink_options[0] & (BIT_4 | BIT_3); ++ emphasis >>= 3; ++ opt10 = (emphasis << 14) | (swing << 8) | 0x3; ++ ++ /* 2G settings */ ++ swing = ha->fw_seriallink_options[0] & (BIT_7 | BIT_6 | BIT_5); ++ swing >>= 5; ++ emphasis = ha->fw_seriallink_options[1] & (BIT_1 | BIT_0); ++ opt11 = (emphasis << 14) | (swing << 8) | 0x3; ++ ++ qla2x00_set_fw_options(ha, ha->fw_options1, ++ ha->fw_options2, ha->fw_options3, opt10, opt11); ++ ++ DEBUG3(printk("scsi(%ld): Init firmware -- success.\n", ++ ha->host_no)); ++ } ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_fw_ready() - Waits for firmware ready. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static uint8_t ++qla2x00_fw_ready(scsi_qla_host_t *ha) ++{ ++ uint8_t status = 0; ++ unsigned long wtime, mtime; ++ uint16_t min_wait; /* Minimum wait time if loop is down */ ++ uint16_t wait_time; /* Wait time if loop is coming ready */ ++ uint16_t pause_time; ++ uint16_t fw_state; ++ ++ /* 20 seconds for loop down. */ ++ min_wait = 20; ++ ha->device_flags &= ~DFLG_NO_CABLE; ++ ++ /* ++ * Firmware should take at most one RATOV to login, plus 5 seconds for ++ * our own processing. ++ */ ++ if ((wait_time = (ha->retry_count*ha->login_timeout) + 5) < min_wait) { ++ wait_time = min_wait; ++ } ++ ++ pause_time = 1000; /* 1000 usec */ ++ ++ /* Min wait time if loop down */ ++ mtime = jiffies + (min_wait * HZ); ++ ++ /* wait time before firmware ready */ ++ wtime = jiffies + (wait_time * HZ); ++ ++ /* Wait for ISP to finish LIP */ ++ if (!qla2x00_quiet) ++ printk(KERN_INFO ++ "scsi(%ld): Waiting for LIP to complete...\n", ha->host_no); ++ ++ DEBUG3(printk("scsi(%ld): Waiting for LIP to complete...\n", ++ ha->host_no)); ++ ++ do { ++ status = qla2x00_get_firmware_state(ha, &fw_state); ++ ++ if (status == QL_STATUS_SUCCESS) { ++ if (fw_state == FSTATE_READY) { ++ DEBUG(printk("scsi(%ld): F/W Ready - OK \n", ++ ha->host_no)); ++ ++ qla2x00_get_retry_cnt(ha, ++ &ha->retry_count, &ha->login_timeout); ++ ++ status = QL_STATUS_SUCCESS; ++ break; ++ } ++ ++ status = QL_STATUS_ERROR; ++ ++ if (atomic_read(&ha->loop_down_timer) || ++ fw_state == FSTATE_LOSS_OF_SYNC) { ++ ++ /* Loop down. Timeout on min_wait */ ++ if (time_after_eq(jiffies, mtime)) { ++ printk(KERN_INFO ++ "scsi(%ld): Cable is " ++ "unplugged...\n", ++ ha->host_no); ++ ++ ha->device_flags |= DFLG_NO_CABLE; ++ break; ++ } ++ } ++ } else { ++ /* Mailbox cmd failed. Timeout on min_wait. */ ++ if (time_after_eq(jiffies, mtime)) ++ break; ++ } ++ ++ if (time_after_eq(jiffies, wtime)) ++ break; ++ ++ /* Delay for a while */ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ / 2); ++ ++ DEBUG3(printk("scsi(%ld): fw_state=%x curr time=%lx.\n", ++ ha->host_no, fw_state, jiffies)); ++ } while (1); ++ ++ DEBUG(printk("scsi(%ld): fw_state=%x curr time=%lx.\n", ++ ha->host_no, fw_state, jiffies)); ++ ++ if (status) { ++ DEBUG2_3(printk("scsi(%ld): Firmware ready **** FAILED ****.\n", ++ ha->host_no)); ++ } ++ ++ return (status); ++} ++ ++/* ++* qla2x00_configure_hba ++* Setup adapter context. ++* ++* Input: ++* ha = adapter state pointer. ++* ++* Returns: ++* 0 = success ++* ++* Context: ++* Kernel context. ++*/ ++static uint8_t ++qla2x00_configure_hba(scsi_qla_host_t *ha) ++{ ++ uint8_t rval; ++ uint16_t loop_id; ++ uint16_t topo; ++ uint8_t al_pa; ++ uint8_t area; ++ uint8_t domain; ++ char connect_type[22]; ++ ++ ENTER(__func__); ++ ++ /* Get host addresses. */ ++ rval = qla2x00_get_adapter_id(ha, ++ &loop_id, &al_pa, &area, &domain, &topo); ++ if (rval != QL_STATUS_SUCCESS) { ++ printk(KERN_WARNING ++ "scsi(%ld): ERROR -- Unable to get host loop ID.\n", ++ ha->host_no); ++ return (rval); ++ } ++ ++ if (topo == 4) { ++ printk(KERN_INFO ++ "scsi(%ld): Cannot get topology - retrying.\n", ++ ha->host_no); ++ return (QL_STATUS_ERROR); ++ } ++ ++ ha->loop_id = loop_id; ++ ++#if defined(ISP2100) ++ /* Make sure 2100 only has loop, in case of any firmware bug. */ ++ topo = 0; ++#endif ++ ++ /* initialize */ ++ ha->min_external_loopid = SNS_FIRST_LOOP_ID; ++ ha->operating_mode = LOOP; ++ ++ switch (topo) { ++ case 0: ++ DEBUG3(printk("scsi(%ld): HBA in NL topology.\n", ++ ha->host_no)); ++ ha->current_topology = ISP_CFG_NL; ++ strcpy(connect_type, "(Loop)"); ++ break; ++ ++ case 1: ++ DEBUG3(printk("scsi(%ld): HBA in FL topology.\n", ++ ha->host_no)); ++ ha->current_topology = ISP_CFG_FL; ++ strcpy(connect_type, "(FL_Port)"); ++ break; ++ ++ case 2: ++ DEBUG3(printk("scsi(%ld): HBA in N P2P topology.\n", ++ ha->host_no)); ++ ha->operating_mode = P2P; ++ ha->current_topology = ISP_CFG_N; ++ strcpy(connect_type, "(N_Port-to-N_Port)"); ++ break; ++ ++ case 3: ++ DEBUG3(printk("scsi(%ld): HBA in F P2P topology.\n", ++ ha->host_no)); ++ ha->operating_mode = P2P; ++ ha->current_topology = ISP_CFG_F; ++ strcpy(connect_type, "(F_Port)"); ++ break; ++ ++ default: ++ DEBUG3(printk("scsi(%ld): HBA in unknown topology %x. " ++ "Using NL.\n", ++ ha->host_no, topo)); ++ ha->current_topology = ISP_CFG_NL; ++ strcpy(connect_type, "(Loop)"); ++ break; ++ } ++ ++ /* Save Host port and loop ID. */ ++ /* byte order - Big Endian */ ++ ha->d_id.b.domain = domain; ++ ha->d_id.b.area = area; ++ ha->d_id.b.al_pa = al_pa; ++ ++ if (!qla2x00_quiet) ++ printk(KERN_INFO ++ "scsi(%ld): Topology - %s, Host Loop address 0x%x\n", ++ ha->host_no, connect_type, ha->loop_id); ++ ++ if (rval) { ++ DEBUG2_3(printk("scsi(%ld): FAILED.\n", ha->host_no)); ++ } else { ++ DEBUG3(printk("scsi(%ld): exiting normally.\n", ha->host_no)); ++ } ++ ++ return(rval); ++} ++ ++/* ++* NVRAM configuration for ISP 2xxx ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Output: ++* initialization control block in response_ring ++* host adapters parameters in host adapter block ++* ++* Returns: ++* 0 = success. ++*/ ++static uint8_t ++qla2x00_nvram_config(scsi_qla_host_t *ha) ++{ ++ uint8_t status = 0; ++ uint8_t chksum = 0; ++ uint16_t cnt, base; ++ uint8_t *dptr1, *dptr2; ++ init_cb_t *icb = ha->init_cb; ++ nvram_t *nv = (nvram_t *)ha->request_ring; ++ uint16_t *wptr = (uint16_t *)ha->request_ring; ++#if defined(ISP2300) ++ device_reg_t *reg = ha->iobase; ++ uint16_t data; ++#endif ++ ++ if (ha->flags.nvram_config_done) ++ return (status); ++ ++ ENTER(__func__); ++ ++ /* Determine NVRAM starting address. */ ++ base = 0; ++#if defined(ISP2300) ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ data = RD_REG_WORD(®->ctrl_status); ++ if ((data >> 14) == 1) ++ base = 0x80; ++ ++ data = RD_REG_WORD(®->nvram); ++ while (data & NVR_BUSY) { ++ udelay(100); ++ data = RD_REG_WORD(®->nvram); ++ } ++ ++ /* Lock resource */ ++ WRT_REG_WORD(®->host_semaphore, 0x1); ++ udelay(5); ++ data = RD_REG_WORD(®->host_semaphore); ++ while ((data & BIT_0) == 0) { ++ /* Lock failed */ ++ udelay(100); ++ WRT_REG_WORD(®->host_semaphore, 0x1); ++ udelay(5); ++ data = RD_REG_WORD(®->host_semaphore); ++ } ++ } ++#endif ++ ++ /* Get NVRAM data and calculate checksum. */ ++ for (cnt = 0; cnt < sizeof(nvram_t)/2; cnt++) { ++ *wptr = cpu_to_le16(qla2x00_get_nvram_word(ha, (cnt+base))); ++ chksum += (uint8_t)*wptr; ++ chksum += (uint8_t)(*wptr >> 8); ++ wptr++; ++ } ++ ++#if defined(ISP2300) ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) { ++ /* Unlock resource */ ++ WRT_REG_WORD(®->host_semaphore, 0); ++ } ++#endif ++ ++ DEBUG5(printk("scsi(%ld): Contents of NVRAM\n", ha->host_no)); ++ DEBUG5(qla2x00_dump_buffer( ++ (uint8_t *)ha->request_ring, sizeof(nvram_t))); ++ ++ /* Bad NVRAM data, set defaults parameters. */ ++ if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || ++ nv->id[2] != 'P' || nv->id[3] != ' ' || nv->nvram_version < 1) { ++ ++ /* Reset NVRAM data. */ ++ DEBUG(printk("scsi(%ld): Using defaults for NVRAM - " ++ "checksum=0x%x, Id=%c, version=0x%x\n", ++ ha->host_no, ++ chksum, nv->id[0], nv->nvram_version)); ++ ++ memset(nv, 0, sizeof(nvram_t)); ++ ++ /* ++ * Set default initialization control block. ++ */ ++ nv->parameter_block_version = ICB_VERSION; ++ ++#if defined(ISP2300) ++ nv->firmware_options[0] = BIT_2 | BIT_1; ++ nv->firmware_options[1] = BIT_7 | BIT_5; ++ nv->add_firmware_options[0] = BIT_5; ++ nv->add_firmware_options[1] = BIT_5 | BIT_4; ++ nv->frame_payload_size = __constant_cpu_to_le16(2048); ++#elif defined(ISP2200) ++ nv->firmware_options[0] = BIT_3 | BIT_2 | BIT_1; ++ nv->firmware_options[1] = BIT_7 | BIT_5; ++ nv->add_firmware_options[0] = BIT_5 | BIT_4; ++ nv->add_firmware_options[1] = BIT_5 | BIT_4; ++ nv->frame_payload_size = __constant_cpu_to_le16(1024); ++#else /* defined(ISP2100) */ ++ nv->firmware_options[0] = BIT_3 | BIT_1; ++ nv->firmware_options[1] = BIT_5; ++ nv->frame_payload_size = __constant_cpu_to_le16(1024); ++#endif ++ ++ nv->max_iocb_allocation = __constant_cpu_to_le16(256); ++ nv->execution_throttle = __constant_cpu_to_le16(16); ++ nv->retry_count = 8; ++ nv->retry_delay = 1; ++ ++ nv->port_name[0] = 33; ++ nv->port_name[3] = 224; ++ nv->port_name[4] = 139; ++ ++ nv->login_timeout = 4; ++ ++ /* ++ * Set default host adapter parameters ++ */ ++ nv->host_p[1] = BIT_2; ++ nv->reset_delay = 5; ++ nv->port_down_retry_count = 8; ++ nv->max_luns_per_target = __constant_cpu_to_le16(8); ++ ++ status = 1; ++ } ++ ++ /* Reset Initialization control block */ ++ memset(icb, 0, sizeof(init_cb_t)); ++ ++ /* ++ * Setup driver NVRAM options. ++ */ ++ nv->firmware_options[0] |= (BIT_6 | BIT_1); ++ nv->firmware_options[0] &= ~(BIT_5 | BIT_4); ++ nv->firmware_options[1] |= (BIT_5 | BIT_0); ++ nv->firmware_options[1] &= ~BIT_4; ++#if defined(ISP2300) ++ nv->firmware_options[0] |= BIT_2; ++ nv->firmware_options[0] &= ~BIT_3; ++#elif defined(ISP2200) ++ nv->firmware_options[0] |= BIT_2; ++#endif ++ ++#if !defined(FC_IP_SUPPORT) ++ /* Enable FC-Tape support */ ++ nv->firmware_options[1] |= BIT_7; ++ nv->add_firmware_options[1] |= (BIT_5 | BIT_4); ++#endif ++ ++ /* ++ * Copy over NVRAM RISC parameter block to initialization control block. ++ */ ++ dptr1 = (uint8_t *)icb; ++ dptr2 = (uint8_t *)&nv->parameter_block_version; ++ cnt = (uint8_t *)&icb->request_q_outpointer - (uint8_t *)&icb->version; ++ while (cnt--) ++ *dptr1++ = *dptr2++; ++ ++ /* Copy 2nd half. */ ++ dptr1 = (uint8_t *)icb->add_firmware_options; ++ cnt = (uint8_t *)icb->reserved_3 - (uint8_t *)icb->add_firmware_options; ++ while (cnt--) ++ *dptr1++ = *dptr2++; ++ ++ /* Prepare nodename */ ++ if ((icb->firmware_options[1] & BIT_6) == 0) { ++ /* ++ * Firmware will apply the following mask if the nodename was ++ * not provided. ++ */ ++ memcpy(icb->node_name, icb->port_name, WWN_SIZE); ++ icb->node_name[0] &= 0xF0; ++ } ++ ++ /* ++ * Set host adapter parameters. ++ */ ++ ha->nvram_version = nv->nvram_version; ++ ++ ha->flags.disable_luns = ((nv->host_p[0] & BIT_2) ? 1 : 0); ++ ha->flags.disable_risc_code_load = ((nv->host_p[0] & BIT_4) ? 1 : 0); ++ ha->flags.set_cache_line_size_1 = ((nv->host_p[0] & BIT_5) ? 1 : 0); ++ ha->flags.enable_64bit_addressing = ((nv->host_p[1] & BIT_0) ? 1 : 0); ++ ha->flags.enable_lip_reset = ((nv->host_p[1] & BIT_1) ? 1 : 0); ++ ha->flags.enable_lip_full_login = ((nv->host_p[1] & BIT_2) ? 1 : 0); ++ ha->flags.enable_target_reset = ((nv->host_p[1] & BIT_3) ? 1 : 0); ++ ha->flags.enable_flash_db_update = ((nv->host_p[1] & BIT_4) ? 1 : 0); ++ ++ ha->flags.link_down_error_enable = 1; ++ ++ ha->flags.enable_target_mode = ++ ((icb->firmware_options[0] & BIT_4) ? 1 : 0); ++ ha->operating_mode = ++ (icb->add_firmware_options[0] & (BIT_6 | BIT_5 | BIT_4)) >> 4; ++ ++ qla2x00_config_dma_addressing(ha); ++ ++ ha->fw_seriallink_options[0] = nv->seriallink_options[0]; ++ ha->fw_seriallink_options[1] = nv->seriallink_options[1]; ++ ++ /* save HBA serial number */ ++ ha->serial0 = icb->port_name[5]; ++ ha->serial1 = icb->port_name[6]; ++ ha->serial2 = icb->port_name[7]; ++ memcpy(ha->node_name, icb->node_name, WWN_SIZE); ++#if defined(FC_IP_SUPPORT) ++ memcpy(ha->ip_port_name, icb->port_name, WWN_SIZE); ++#endif ++ ++ ha->hiwat = le16_to_cpu(icb->max_iocb_allocation); ++ ha->execution_throttle = 0xFFFF; ++ icb->execution_throttle = __constant_cpu_to_le16(0xFFFF); ++ ++ ha->retry_count = nv->retry_count; ++ ++ /* Set minimum login_timeout to 4 seconds. */ ++ if (nv->login_timeout < ql2xlogintimeout) ++ nv->login_timeout = ql2xlogintimeout; ++ if (nv->login_timeout < 4) ++ nv->login_timeout = 4; ++ ha->login_timeout = nv->login_timeout; ++ icb->login_timeout = nv->login_timeout; ++ ++/* FIXME ++ * ++ * port_down_retry_count updated twice ++ * ++ */ ++ ha->port_down_retry_count = nv->port_down_retry_count; ++ ha->minimum_timeout = ++ (ha->login_timeout * ha->retry_count) + ha->port_down_retry_count; ++ ha->loop_reset_delay = nv->reset_delay; ++ ++ /* Will get the value from NVRAM. */ ++ ha->loop_down_timeout = LOOP_DOWN_TIMEOUT; ++ ha->loop_down_abort_time = LOOP_DOWN_TIME - ha->loop_down_timeout; ++ ++ /* save OEM related items for QLA2200s and QLA2300s */ ++ ha->oem_id = nv->oem_id; ++ memcpy(ha->oem_specific, nv->oem_specific, sizeof(ha->oem_specific)); ++ ++ ha->max_probe_luns = le16_to_cpu(nv->max_luns_per_target); ++ if (ha->max_probe_luns == 0) ++ ha->max_probe_luns = MIN_LUNS; ++ ++#if defined(IOCB_THROLLE_USAGE) ++ /* High-water mark of IOCBs */ ++ ha->iocb_hiwat = MAX_IOCBS_AVAILBALE; ++#endif ++ ++#if USE_BIOS_MAX_LUNS ++ ha->max_luns = le16_to_cpu(nv->max_luns_per_target); ++ if (ha->max_luns == 0) ++ ha->max_luns = MAX_LUNS; ++ else if (ha->max_luns > MAX_LUNS) ++ ha->max_luns = MAX_LUNS; ++#else ++ ha->max_luns = MAX_LUNS; ++#endif ++ ++/* FIXME ++ * ++ * port_down_retry_count updated twice ++ * ++ */ ++ /* ++ * Need enough time to try and get the port back. ++ */ ++ if (qlport_down_retry) ++ ha->port_down_retry_count = qlport_down_retry; ++ /* Set login_retry_count */ ++ ha->login_retry_count = nv->retry_count; ++ if (ha->port_down_retry_count == nv->port_down_retry_count && ++ ha->port_down_retry_count > 3) ++ ha->login_retry_count = ha->port_down_retry_count; ++ else if (ha->port_down_retry_count > ha->login_retry_count) ++ ha->login_retry_count = ha->port_down_retry_count; ++ ++ ha->binding_type = Bind; ++ if ((ha->binding_type != BIND_BY_PORT_NAME) && ++ (ha->binding_type != BIND_BY_PORT_ID) && ++ (ha->binding_type != BIND_BY_NODE_NAME)) { ++ ++ printk(KERN_WARNING ++ "scsi(%ld): Invalid binding type specified (%d), " ++ "defaulting to BIND_BY_PORT_NAME!!!\n", ++ ha->host_no, ha->binding_type); ++ ++ ha->binding_type = BIND_BY_PORT_NAME; ++ } ++ ++ /* ++ * Setup ring parameters in initialization control block ++ */ ++ icb->request_q_outpointer = __constant_cpu_to_le16(0); ++ icb->response_q_inpointer = __constant_cpu_to_le16(0); ++ icb->request_q_length = __constant_cpu_to_le16(REQUEST_ENTRY_CNT); ++ icb->response_q_length = __constant_cpu_to_le16(RESPONSE_ENTRY_CNT); ++ icb->request_q_address[0] = cpu_to_le32(LSD(ha->request_dma)); ++ icb->request_q_address[1] = cpu_to_le32(MSD(ha->request_dma)); ++ icb->response_q_address[0] = cpu_to_le32(LSD(ha->response_dma)); ++ icb->response_q_address[1] = cpu_to_le32(MSD(ha->response_dma)); ++ ++ icb->lun_enables = __constant_cpu_to_le16(0); ++ icb->command_resource_count = 0; ++ icb->immediate_notify_resource_count = 0; ++ icb->timeout = __constant_cpu_to_le16(0); ++ ++ ha->flags.nvram_config_done = 1; ++ ++ if (status) { ++ DEBUG2_3(printk(KERN_WARNING ++ "scsi(%ld): NVRAM configuration failed!\n", ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/* ++* qla2x00_init_fc_db ++* Initializes Fibre Channel Device Database. ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Output: ++* ha->fc_db = initialized ++*/ ++static void ++qla2x00_init_fc_db(scsi_qla_host_t *ha) ++{ ++ uint16_t cnt; ++ ++ ENTER(__func__); ++ ++ /* Initialize fc database if it is not initialized. */ ++ if (!ha->fc_db[0].loop_id && !ha->fc_db[1].loop_id) { ++ ha->flags.updated_fc_db = FALSE; ++ ++ /* Initialize target database. */ ++ for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { ++ ha->fc_db[cnt].name[0] = 0L; ++ ha->fc_db[cnt].name[1] = 0L; ++ ha->fc_db[cnt].loop_id = PORT_UNUSED; ++ ha->fc_db[cnt].port_login_retry_count = ++ ha->port_down_retry_count * PORT_RETRY_TIME; ++ ha->fc_db[cnt].flag = 0; /* v2.19.5b3 */ ++ } ++ } ++ ++ LEAVE(__func__); ++} ++ ++ ++/* ++* qla2x00_init_tgt_map ++* Initializes target map. ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Output: ++* TGT_Q initialized ++*/ ++static void ++qla2x00_init_tgt_map(scsi_qla_host_t *ha) ++{ ++ uint32_t t; ++ ++ ENTER(__func__); ++ ++ for (t = 0; t < MAX_TARGETS; t++) ++ TGT_Q(ha, t) = (os_tgt_t *)NULL; ++ ++ LEAVE(__func__); ++} ++ ++/* ++ * qla2x00_configure_loop ++ * Updates Fibre Channel Device Database with what is actually on loop. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Output: ++ * ha->fc_db = updated ++ * ++ * Returns: ++ * 0 = success. ++ * 1 = error. ++ * 2 = database was full and device was not configured. ++ */ ++static uint8_t ++qla2x00_configure_loop(scsi_qla_host_t *ha) ++{ ++ uint8_t rval = 0; ++ uint8_t rval1 = 0; ++ uint8_t enable_slot_reuse = FALSE; ++ uint16_t cnt; ++ static unsigned long flags, save_flags; ++#if defined(FC_IP_SUPPORT) ++ struct ip_device *ipdev; ++#endif ++ ++ ENTER(__func__); ++ ++ DEBUG(printk("scsi(%ld): Begin configure loop.\n", ha->host_no)); ++ ++ /* Get Initiator ID */ ++ if (qla2x00_configure_hba(ha)) { ++ DEBUG(printk("scsi(%ld): Unable to configure HBA.\n", ++ ha->host_no)); ++ return(1); ++ } ++ ++#if defined(FC_IP_SUPPORT) ++ /* Disable all IP devices in linked list */ ++ for (ipdev = ha->ipdev_db_top; ipdev; ipdev = ipdev->next) ++ ipdev->flags &= ~IP_DEV_FLAG_PRESENT; ++#endif /* FC_IP_SUPPORT */ ++ ++ save_flags = flags = ha->dpc_flags; ++ DEBUG(printk("scsi(%ld): Configure loop -- dpc flags =0x%lx\n", ++ ha->host_no, flags)); ++ ++ /* dg 02/26/02 ha->dpc_flags &= ~(LOCAL_LOOP_UPDATE | RSCN_UPDATE); */ ++ ++ /* ++ * If we have both an RSCN and PORT UPDATE pending then handle them ++ * both at the same time. ++ */ ++ clear_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); ++ clear_bit(RSCN_UPDATE, &ha->dpc_flags); ++ ha->mem_err = 0 ; ++ ++ /* Determine what we need to do */ ++ if (ha->current_topology == ISP_CFG_FL && ++ (test_bit(LOCAL_LOOP_UPDATE, &flags))) { ++ ++ ha->flags.rscn_queue_overflow = TRUE; ++ set_bit(RSCN_UPDATE, &flags); ++ ++ } else if (ha->current_topology == ISP_CFG_F && ++ (test_bit(LOCAL_LOOP_UPDATE, &flags))) { ++ ++ ha->flags.rscn_queue_overflow = TRUE; ++ set_bit(RSCN_UPDATE, &flags); ++ clear_bit(LOCAL_LOOP_UPDATE, &flags); ++ ++ } else if (!ha->flags.online || ++ (test_bit(ABORT_ISP_ACTIVE, &flags))) { ++ ++ ha->flags.rscn_queue_overflow = TRUE; ++ set_bit(RSCN_UPDATE, &flags); ++ set_bit(LOCAL_LOOP_UPDATE, &flags); ++ } ++ ++ do { ++ if (test_bit(LOCAL_LOOP_UPDATE, &flags)) { ++ rval = rval | ++ qla2x00_configure_local_loop(ha, enable_slot_reuse); ++ } ++ ++ if (test_bit(RSCN_UPDATE, &flags)) { ++ rval1 = qla2x00_configure_fabric(ha, enable_slot_reuse); ++ if ((rval1 & BIT_0) && ha->sns_retry_cnt < 8) { ++ ha->sns_retry_cnt++; ++ set_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags); ++ } ++ } ++ ++ /* If devices not configured first time try reusing slots.*/ ++ if (enable_slot_reuse == FALSE && (rval & BIT_1)) ++ enable_slot_reuse = TRUE; ++ else ++ enable_slot_reuse = FALSE; ++ ++ /* Isolate error status. */ ++ if (rval & BIT_0) { ++ rval = 1; ++ } else { ++ rval = 0; ++ } ++ ++ } while (enable_slot_reuse == TRUE && rval == 0); ++ ++ if (!atomic_read(&ha->loop_down_timer) && ++ !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))) { ++ ++ /* Mark devices that are not present as DEV_ABSENCE */ ++ for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { ++ if (ha->fc_db[cnt].loop_id & PORT_LOST_ID) { ++ ha->fc_db[cnt].flag |= DEV_ABSENCE; ++ } else { ++ /* device returned */ ++ if (ha->fc_db[cnt].loop_id < ++ LAST_SNS_LOOP_ID && ++ ha->fc_db[cnt].flag & DEV_ABSENCE) { ++ ha->fc_db[cnt].flag &= ~DEV_ABSENCE; ++ ha->fc_db[cnt].flag |= DEV_RETURN; ++ ha->fc_db[cnt].port_login_retry_count = ++ ha->port_down_retry_count * ++ PORT_RETRY_TIME; ++ } ++ } ++ } ++ ++ rval1 = qla2x00_build_fcport_list(ha); ++ if (((rval1 & BIT_0) || ha->mem_err != 0) && ++ ha->sns_retry_cnt < 8) { ++ ++ ha->sns_retry_cnt++; ++ set_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags); ++ } ++ ++ if (!ha->flags.failover_enabled) ++ qla2x00_config_os(ha); ++ ++ /* If we found all devices then go ready */ ++ if (!(test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags))) { ++ ha->loop_state = LOOP_READY; ++ ++ if (ha->flags.failover_enabled) { ++ DEBUG(printk("scsi(%ld): schedule FAILBACK " ++ "EVENT\n", ha->host_no)); ++ if (!(test_and_set_bit(FAILOVER_EVENT_NEEDED, ++ &ha->dpc_flags))) { ++ ha->failback_delay = failbackTime; ++ } ++ set_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags); ++ ha->failover_type = MP_NOTIFY_LOOP_UP; ++ } ++ ++ DEBUG(printk("scsi(%ld): LOOP READY\n", ha->host_no)); ++ } else { ++ if (test_bit(LOCAL_LOOP_UPDATE, &save_flags)) ++ set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); ++ if (test_bit(RSCN_UPDATE, &save_flags)) ++ set_bit(RSCN_UPDATE, &ha->dpc_flags); ++ } ++ } else { ++ DEBUG(printk("scsi(%ld): Loop down counter running= %d or " ++ "Resync needed- dpc flags= %ld\n", ++ ha->host_no, ++ atomic_read(&ha->loop_down_timer), ha->dpc_flags)); ++ /* ???? dg 02/26/02 rval = 1; */ ++ } ++ ++ if (rval) { ++ DEBUG2_3(printk("%s(%ld): *** FAILED ***\n", ++ __func__, ha->host_no)); ++ } else { ++ DEBUG3(printk("%s: exiting normally\n", __func__)); ++ } ++ ++ return(rval); ++} ++ ++/* ++ * qla2x00_configure_local_loop ++ * Updates Fibre Channel Device Database with local loop devices. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * enable_slot_reuse = allows the use of PORT_AVAILABLE slots. ++ * ++ * Returns: ++ * 0 = success. ++ * BIT_0 = error. ++ * BIT_1 = database was full and a device was not configured. ++ */ ++static uint8_t ++qla2x00_configure_local_loop(scsi_qla_host_t *ha, uint8_t enable_slot_reuse) ++{ ++ uint8_t status = 0; ++ uint8_t rval; ++ uint8_t port_name[8]; ++ uint8_t update_status = 0; ++ uint16_t index, size; ++ dma_addr_t phys_address = 0; ++ fcdev_t device; ++ port_list_entry_t *gn_list, *port_entry; ++ uint16_t localdevices = 0; ++#if defined(FC_IP_SUPPORT) ++ uint16_t list_entry_loop_id; ++#endif ++ ++ ENTER(__func__); ++ ++ /* ++ * No point in continuing if the loop is in a volatile state -- ++ * reschedule LOCAL_LOOP_UPDATE for later processing ++ */ ++ if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) { ++ set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); ++ return (0); ++ } ++ ++ gn_list = pci_alloc_consistent(ha->pdev, ++ sizeof(GN_LIST_LENGTH), &phys_address); ++ if (gn_list == NULL) { ++ DEBUG2(printk("scsi(%ld): Failed to allocate memory, No local " ++ "loop\n", ++ ha->host_no)); ++ ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - port_list", ++ ha->host_no); ++ ++ ha->mem_err++; ++ return (BIT_0); ++ } ++ memset(gn_list, 0, sizeof(GN_LIST_LENGTH)); ++ ++ /* Mark all local devices PORT_LOST_ID first */ ++ for (index = 0; index < MAX_FIBRE_DEVICES; index++) { ++ if (ha->fc_db[index].loop_id <= LAST_SNS_LOOP_ID && ++ !(ha->fc_db[index].flag & DEV_PUBLIC)) { ++ ++ DEBUG(printk("scsi(%ld): Marking port lost @ slot " ++ "%d %02x%02x%02x\n", ++ ha->host_no, ++ index, ++ ha->fc_db[index].d_id.b.domain, ++ ha->fc_db[index].d_id.b.area, ++ ha->fc_db[index].d_id.b.al_pa)); ++ ++ ha->fc_db[index].loop_id |= PORT_LOST_ID; ++ } ++ } ++ ++ DEBUG3(printk("scsi(%ld): Getting FCAL position map\n", ha->host_no)); ++ DEBUG3(qla2x00_get_fcal_position_map(ha, NULL)); ++ ++ /* Get port name list ++ * ++ * Via qla2x00_get_port_list: ++ * ++ * Bit 0 - return node names, ++ * Bit 1 - loop IDs 0-255 ++ */ ++#if defined(FC_IP_SUPPORT) ++ if (ha->flags.enable_ip == FALSE) ++ rval = qla2x00_get_port_list(ha, ++ gn_list, phys_address, BIT_0, &size); ++ else ++ rval = qla2x00_get_port_list(ha, ++ gn_list, phys_address, BIT_0|BIT_1, &size); ++#else ++ rval = qla2x00_get_port_list(ha, gn_list, phys_address, BIT_0, &size); ++#endif ++ if (rval) { ++ status = BIT_0; ++ goto cleanup_allocation; ++ } ++ ++ DEBUG3(printk("scsi(%ld): Port list size (%d)\n", ha->host_no, size)); ++ DEBUG3(qla2x00_dump_buffer((uint8_t *)gn_list, size)); ++ ++ /* Any valid entries returned? */ ++ if (size / sizeof(port_list_entry_t) == 0) ++ goto cleanup_allocation; ++ ++ port_entry = gn_list; ++ for ( ; size >= sizeof(port_list_entry_t); ++ size -= sizeof(port_list_entry_t), port_entry++) { ++ ++ device.loop_id = le16_to_cpu(port_entry->loop_id); ++ ++#if defined(FC_IP_SUPPORT) ++ list_entry_loop_id = device.loop_id; ++ device.loop_id &= LOOP_ID_MASK; ++#endif ++ ++ /* Skip any non-local loop-ids - this includes 'known ports' */ ++ if (device.loop_id > LAST_LOCAL_LOOP_ID) ++ continue; ++#if NOT_NEEDED ++ /* Skip the known ports. */ ++ if ((device.loop_id == SNS_FL_PORT) || ++ (device.loop_id == FABRIC_CONTROLLER) || ++ (device.loop_id == SIMPLE_NAME_SERVER)) ++ continue; ++#endif ++ ++ device.flag = 0; ++ ++ /* Prep node name -- big-endian format */ ++ *((u64 *)device.name) = __swab64p((u64 *)port_entry->name); ++ ++ /* Retrieve port name */ ++ rval = qla2x00_get_port_name(ha, device.loop_id, port_name, 0); ++ if (rval || qla2x00_is_wwn_zero(port_name)) { ++ DEBUG2(printk("scsi(%ld): Loop -- error retrieving " ++ "port_name.\n", ++ ha->host_no)); ++ ++ status = BIT_0; ++ break; ++ } ++ memcpy(device.wwn, port_name, WWN_SIZE); ++ ++ /* Derive portid from alpa table */ ++ device.d_id.b24 = 0; ++ device.d_id.b.al_pa = alpa_table[device.loop_id]; ++ ++ DEBUG2_3(printk("scsi(%ld): Loop scan found device - " ++ "nodename %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portname %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portid %02x%02x%02x.\n", ++ ha->host_no, ++ device.name[0], device.name[1], ++ device.name[2], device.name[3], ++ device.name[4], device.name[5], ++ device.name[6], device.name[7], ++ device.wwn[0], device.wwn[1], device.wwn[2], device.wwn[3], ++ device.wwn[4], device.wwn[5], device.wwn[6], device.wwn[7], ++ device.d_id.b.domain, ++ device.d_id.b.area, ++ device.d_id.b.al_pa)); ++ ++#if !defined(FC_IP_SUPPORT) ++ /* SCSI type device */ ++ update_status = qla2x00_update_fc_database(ha, ++ &device, enable_slot_reuse); ++ if (update_status) ++ status |= update_status; ++ else ++ localdevices++; ++#else ++ if (!(list_entry_loop_id & PLE_NOT_SCSI_DEVICE)) { ++ /* SCSI type device */ ++ update_status = qla2x00_update_fc_database(ha, ++ &device, enable_slot_reuse); ++ ++ if (update_status) ++ status |= update_status; ++ else ++ localdevices++; ++ } else if (ha->flags.enable_ip == TRUE) { ++ /* SCSI login failed, assume it is IP device */ ++ DEBUG12(printk("scsi(%ld): Loop scan found IP device " ++ "WWNN:%02x%02x%02x%02x%02x%02x%02x%02x " ++ "DID:%02x%02x%02x.\n", ++ ha->host_no, ++ device.name[0], device.name[1], ++ device.name[2], device.name[3], ++ device.name[4], device.name[5], ++ device.name[6], device.name[7], ++ device.d_id.b.domain, ++ device.d_id.b.area, ++ device.d_id.b.al_pa)); ++ ++ update_status = ++ qla2x00_update_ip_device_data(ha, &device); ++ if (update_status == QL_STATUS_SUCCESS) ++ localdevices++; ++ else if (update_status == QL_STATUS_RESOURCE_ERROR) ++ status |= BIT_1; ++ else ++ status |= BIT_0; ++ } ++#endif ++ } /* for each port entry */ ++ ++cleanup_allocation: ++ pci_free_consistent(ha->pdev, ++ sizeof(GN_LIST_LENGTH), gn_list, phys_address); ++ ++ if (status & BIT_0) { ++ DEBUG2(printk("scsi(%ld): Configure local loop error exit: " ++ "rval=%x\n", ha->host_no, rval)); ++ } ++ ++ if (localdevices > 0) { ++ ha->device_flags |= DFLG_LOCAL_DEVICES; ++ ha->device_flags &= ~DFLG_RETRY_LOCAL_DEVICES; ++ } ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/* ++ * qla2x00_configure_fabric ++ * Setup SNS devices with loop ID's. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * 0 = success. ++ * BIT_0 = error ++ * BIT_1 = database was full and device was not configured. ++ */ ++#define MAX_PUBLIC_LOOP_IDS LAST_SNS_LOOP_ID + 1 ++ ++static uint8_t ++qla2x00_configure_fabric(scsi_qla_host_t *ha, uint8_t enable_slot_reuse) ++{ ++ uint8_t rval = 0; ++ uint8_t rval1; ++ uint8_t local_flags = 0; ++ uint8_t tmp_name[8]; ++ fcdev_t dev; ++ uint16_t i, index, found_cnt; ++ uint16_t new_dev_cnt; ++ uint16_t tmp_loop_id; ++ uint16_t tmp_topo; ++ struct new_dev *new_dev_list; ++ struct list_head *fcil, *fcitemp; ++ fc_initiator_t *fcinitiator; ++ ++ ENTER(__func__); ++ ++ DEBUG2(printk("scsi(%ld): Begin configure fabric -- hba=%p\n", ++ ha->host_no, ha)); ++ ++ /* If FL port exists, then SNS is present */ ++ rval1 = qla2x00_get_port_name(ha, SNS_FL_PORT, tmp_name, 0); ++ if (rval1 || qla2x00_is_wwn_zero(tmp_name)) { ++ DEBUG2(printk("scsi(%ld): MBC_GET_PORT_NAME Failed, No FL " ++ "Port\n", ha->host_no)); ++ ++ ha->device_flags &= ~SWITCH_FOUND; ++ return (0); ++ } ++ ++ new_dev_list = kmalloc(sizeof(struct new_dev) * MAX_FIBRE_DEVICES, ++ GFP_ATOMIC); ++ if (new_dev_list == NULL) { ++ DEBUG2(printk("scsi(%ld): Configure Fabric allocation failed, " ++ "device list\n", ha->host_no)); ++ ha->mem_err++; ++ return (BIT_0); ++ } ++ ++ /* Get adapter port ID. */ ++ rval = qla2x00_get_adapter_id(ha, &tmp_loop_id, ++ &ha->d_id.b.al_pa, &ha->d_id.b.area, &ha->d_id.b.domain, &tmp_topo); ++ ++ /* Mark devices that need re-synchronization. */ ++ qla2x00_device_resync(ha); ++ found_cnt = 0; ++ do { ++ if (test_and_clear_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags)) { ++ if (qla2x00_rft_id(ha)) { ++ /* EMPTY */ ++ DEBUG2(printk("scsi(%ld): Register FC-4 " ++ "TYPE failed.\n", ha->host_no)); ++ } ++ if (qla2x00_rff_id(ha)) { ++ /* EMPTY */ ++ DEBUG2(printk("scsi(%ld): Register FC-4 " ++ "Features failed.\n", ha->host_no)); ++ } ++ if (qla2x00_rnn_id(ha)) { ++ /* EMPTY */ ++ DEBUG2(printk("scsi(%ld): Register Node Name " ++ "failed.\n", ha->host_no)); ++ } ++ if (qla2x00_rsnn_nn(ha)) { ++ /* EMPTY */ ++ DEBUG2(printk("scsi(%ld): Register Symbolic " ++ "Node Name failed.\n", ha->host_no)); ++ } ++ } ++ ++ rval = qla2x00_find_all_fabric_devs(ha, ++ new_dev_list, &new_dev_cnt, &local_flags); ++ if (rval != 0) ++ break; ++ ++ /* ++ * Logout all previous fabric devices marked lost, except ++ * tape devices. ++ */ ++ for (index = 0; index < MAX_FIBRE_DEVICES && ++ !atomic_read(&ha->loop_down_timer) && ++ !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); index++) { ++ ++ if (ha->fc_db[index].loop_id & PORT_LOST_ID && ++ (ha->fc_db[index].flag & DEV_PUBLIC) && ++ !(ha->fc_db[index].flag & DEV_TAPE_DEVICE)) { ++ ++ qla2x00_fabric_logout(ha, ++ ha->fc_db[index].loop_id & 0xff); ++ local_flags |= LOGOUT_PERFORMED; ++ } ++ } ++ ++ /* Logout and remove any lost initiator devices */ ++ list_for_each_safe(fcil, fcitemp, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ if ((fcinitiator->loop_id & PORT_LOST_ID) == 0) ++ continue; ++ ++ qla2x00_fabric_logout(ha, fcinitiator->loop_id & 0xff); ++ ha->fabricid[fcinitiator->loop_id &0xFF].in_use = FALSE; ++ ++ list_del(&fcinitiator->list); ++ kfree(fcinitiator); ++ } ++ ++ /* ++ * Scan through our database and login entries already in our ++ * database. ++ */ ++ for (index = 0; index < MAX_FIBRE_DEVICES && ++ !atomic_read(&ha->loop_down_timer) && ++ !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); index++) { ++ ++ if (!(ha->fc_db[index].loop_id & PORT_LOGIN_NEEDED)) ++ continue; ++ ++ ha->fc_db[index].loop_id &= ~PORT_LOGIN_NEEDED; ++ if (ha->fc_db[index].loop_id <= LAST_SNS_LOOP_ID) { ++ /* loop_id reusable */ ++ dev.loop_id = ha->fc_db[index].loop_id & 0xff; ++ } else { ++ for (i = ha->min_external_loopid; ++ i < MAX_PUBLIC_LOOP_IDS; i++) { ++ ++ if (!ha->fabricid[i].in_use) { ++ ha->fabricid[i].in_use = TRUE; ++ dev.loop_id = i; ++ break; ++ } ++ } ++ ++ if (i == MAX_PUBLIC_LOOP_IDS) ++ break; ++ } ++ ++ dev.d_id.b24 = ha->fc_db[index].d_id.b24; ++ ++ /* login and update database */ ++ if (qla2x00_fabric_login(ha, &dev) == 0) { ++ ha->fc_db[index].loop_id = dev.loop_id; ++ found_cnt++; ++ } ++ } ++ ++ /* ++ * Scan through new device list and login and add to our ++ * database. ++ */ ++ for (index = 0; index < new_dev_cnt && ++ !atomic_read(&ha->loop_down_timer) && ++ !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); index++) { ++ ++ memcpy(&dev, ++ &new_dev_list[index], sizeof(struct new_dev)); ++ ++ dev.flag = DEV_PUBLIC; ++ ++ for (i = ha->min_external_loopid; ++ i < MAX_PUBLIC_LOOP_IDS; i++) { ++ ++ if (!ha->fabricid[i].in_use) { ++ ha->fabricid[i].in_use = TRUE; ++ dev.loop_id = i; ++ break; ++ } ++ } ++ ++ if (i == MAX_PUBLIC_LOOP_IDS) ++ break; ++ ++ if (qla2x00_fabric_login(ha, &dev) == 0) { ++ found_cnt++; ++ rval = qla2x00_update_fc_database(ha, ++ &dev, enable_slot_reuse); ++ ++ if (rval) { ++ qla2x00_fabric_logout(ha, dev.loop_id); ++ ha->fabricid[i].in_use = FALSE; ++ break; ++ } ++ } ++ } ++ } while(0); ++ ++ kfree(new_dev_list); ++ ++ if (rval) { ++ DEBUG2(printk("scsi(%ld): Configure fabric error exit: " ++ "rval=%d\n", ha->host_no, rval)); ++ } else { ++ /* EMPTY */ ++ DEBUG2(if (found_cnt)) ++ DEBUG2(printk("scsi(%ld) Found (%d) ports\n", ++ ha->host_no, found_cnt)); ++ } ++ ++ LEAVE(__func__); ++ ++ return(rval); ++} ++ ++ ++/* ++ * qla2x00_find_all_fabric_devs ++ * Go through GAN list to find all fabric devices. Will perform ++ * necessary logout of previously existed devices that have changed ++ * and save new devices in a new device list. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * dev = database device entry pointer. ++ * ++ * Returns: ++ * 0 = success. ++ * BIT_0 = error. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint8_t ++qla2x00_find_all_fabric_devs(scsi_qla_host_t *ha, ++ struct new_dev *new_dev_list, uint16_t *new_dev_cnt, uint8_t *flags) ++{ ++ fcdev_t dev; ++ uint8_t rval = 0; ++ int status = 0; ++ uint16_t i; ++ uint16_t index; ++ uint16_t new_cnt; ++ uint16_t public_count; ++ uint16_t initiator; ++ struct list_head *fcil; ++ fc_initiator_t *fcinitiator; ++ ++ sw_info_t *swl; ++ sw_info_t swl_entry; ++ int swl_idx; ++ int first_dev, last_dev; ++ port_id_t wrap; ++ int ip_dev; ++ ++ ENTER(__func__); ++ ++ /* Try GID_PT to get device list, else GAN. */ ++ swl = kmalloc(sizeof(sw_info_t) * MAX_FIBRE_DEVICES, GFP_ATOMIC); ++ if (swl == NULL) { ++ /*EMPTY*/ ++ DEBUG2(printk("scsi(%ld): GID_PT allocations failed, fallback " ++ "on GAN\n", ha->host_no)); ++ } else if (qla2x00_gid_pt(ha, swl) != QL_STATUS_SUCCESS) { ++ kfree(swl); ++ swl = NULL; ++ } else if (qla2x00_gpn_id(ha, swl) != QL_STATUS_SUCCESS) { ++ kfree(swl); ++ swl = NULL; ++ } else if (qla2x00_gnn_id(ha, swl) != QL_STATUS_SUCCESS) { ++ kfree(swl); ++ swl = NULL; ++ } else if (qla2x00_gft_id(ha, swl) != QL_STATUS_SUCCESS) { ++ kfree(swl); ++ swl = NULL; ++ } ++ swl_idx = 0; ++ ++ /* ++ * Loop getting devices from switch. Logout the devices that were in ++ * our database but changed port ID. ++ */ ++#if defined(ISP2100) ++ ha->max_public_loop_ids = LAST_SNS_LOOP_ID - SNS_FIRST_LOOP_ID + 1; ++ public_count = ha->max_public_loop_ids; ++#else ++ ha->max_public_loop_ids = MAX_PUBLIC_LOOP_IDS; ++ public_count = ha->max_public_loop_ids - ha->min_external_loopid + 2; ++#endif ++ ++ /* Set start port ID scan at adapter ID. */ ++ swl_entry.d_id.b24 = ha->d_id.b24; ++ first_dev = 1; ++ last_dev = 0; ++ ++ new_cnt = 0; /* new device count */ ++ ++ for (i = 0; ++ i < public_count && !atomic_read(&ha->loop_down_timer) && ++ !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); i++) { ++ ++ if (swl != NULL) { ++ if (last_dev) { ++ wrap.b24 = dev.d_id.b24; ++ } else { ++ dev.flag = DEV_PUBLIC; ++ dev.d_id.b24 = swl[swl_idx].d_id.b24; ++ memcpy(dev.name, ++ swl[swl_idx].node_name, WWN_SIZE); ++ memcpy(dev.wwn, ++ swl[swl_idx].port_name, WWN_SIZE); ++ ++ /* IP capable device */ ++ ip_dev = 0; ++ if (swl[swl_idx].type & SW_TYPE_IP) ++ ip_dev = 1; ++ ++ if (swl[swl_idx].d_id.b.rsvd_1 != 0) { ++ last_dev = 1; ++ } ++ swl_idx++; ++ } ++ } else { ++ /* Send GAN to the switch */ ++ rval = 0; ++ if (qla2x00_ga_nxt(ha, &swl_entry) != ++ QL_STATUS_SUCCESS) { ++ rval |= BIT_0; ++ break; ++ } ++ ++ dev.flag = DEV_PUBLIC; ++ dev.d_id.b24 = swl_entry.d_id.b24; ++ memcpy(dev.name, swl_entry.node_name, WWN_SIZE); ++ memcpy(dev.wwn, swl_entry.port_name, WWN_SIZE); ++ ++ /* IP capable device */ ++ ip_dev = 0; ++ if (swl_entry.type & SW_TYPE_IP) ++ ip_dev = 1; ++ } ++ ++ /* If wrap on switch device list, exit. */ ++ if (first_dev) { ++ wrap.b24 = dev.d_id.b24; ++ first_dev = 0; ++ } else if (dev.d_id.b24 == wrap.b24) { ++ DEBUG2(printk("scsi(%ld): device wrap (%02x%02x%02x)\n", ++ ha->host_no, ++ dev.d_id.b.domain, ++ dev.d_id.b.area, ++ dev.d_id.b.al_pa)); ++ break; ++ } ++ ++ DEBUG(printk("scsi(%ld): Fabric scan found device(%d) - port " ++ "Id=%02x%02x%02x\n", ++ ha->host_no, i, ++ dev.d_id.b.domain, dev.d_id.b.area, dev.d_id.b.al_pa)); ++ ++ /* Bypass if host adapter. */ ++ if (dev.d_id.b24 == ha->d_id.b24) ++ continue; ++ ++ /* Bypass reserved domain fields. */ ++ if ((dev.d_id.b.domain & 0xf0) == 0xf0) ++ continue; ++ ++ /* Bypass if same domain and area of adapter. */ ++ if ((dev.d_id.b24 & 0xffff00) == (ha->d_id.b24 & 0xffff00)) ++ continue; ++ ++#if defined(FC_IP_SUPPORT) ++ /* Check for IP device */ ++ if (ip_dev) { ++ /* Found IP device */ ++ DEBUG12(printk("scsi(%ld): IP fabric " ++ "WWN: %02x%02x%02x%02x%02x%02x%02x%02x " ++ "DID: %02x%02x%02x.\n", ++ ha->host_no, ++ dev.name[0], dev.name[1], dev.name[2], dev.name[3], ++ dev.name[4], dev.name[5], dev.name[6], dev.name[7], ++ dev.d_id.b.domain, ++ dev.d_id.b.area, ++ dev.d_id.b.al_pa)); ++ ++ qla2x00_update_ip_device_data(ha, &dev); ++ continue; ++ } ++#endif ++ ++ /* Bypass if initiator */ ++ initiator = FALSE; ++ list_for_each(fcil, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ if (memcmp(dev.wwn, fcinitiator->port_name, 8) != 0) ++ continue; ++ ++ initiator = TRUE; ++ DEBUG(printk("scsi(%ld): found host " ++ "%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "portid=%02x%02x%02x.\n", ++ ha->host_no, ++ dev.name[0], dev.name[1], dev.name[2], dev.name[3], ++ dev.name[4], dev.name[5], dev.name[6], dev.name[7], ++ dev.d_id.b.domain, ++ dev.d_id.b.area, ++ dev.d_id.b.al_pa)); ++ ++ /* ++ * If the initiator was marked as lost, perform the ++ * required logout and relogin the initiator by ++ * assuming a new device. ++ */ ++ if ((fcinitiator->loop_id & PORT_LOST_ID) == 0) ++ break; ++ ++ initiator = FALSE; ++ break; ++ } ++ ++ /* Bypass if initiator */ ++ if (initiator) ++ continue; ++ ++ /* Locate matching device in database. */ ++ for (index = 0; index < MAX_FIBRE_DEVICES; index++) { ++ if (ha->fc_db[index].loop_id == PORT_UNUSED) ++ continue; ++ ++ status = 1; ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ status = memcmp(dev.wwn, ++ ha->fc_db[index].wwn, WWN_SIZE); ++ break; ++ ++ case BIND_BY_PORT_ID: ++ status = (dev.d_id.b24 != ++ ha->fc_db[index].d_id.b24); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ status = memcmp(dev.name, ++ ha->fc_db[index].name, WWN_SIZE); ++ break; ++ } ++ if (status) ++ continue; ++ ++ /* ++ * Update volatile unbound fields for PortID binding ++ * only ++ */ ++ if (ha->binding_type == BIND_BY_PORT_ID) { ++ memcpy(ha->fc_db[index].name, ++ dev.name, WWN_SIZE); ++ memcpy(ha->fc_db[index].wwn, ++ dev.wwn, WWN_SIZE); ++ } ++ ++ /* Now we found a matching device name */ ++ DEBUG(printk("scsi(%ld): Found fabric dev %d in " ++ "tgt %d db, flags= 0x%x, loop_id=0x%04x, port=" ++ "%02x%02x%02x, " ++ "name=%02x%02x%02x%02x%02x%02x%02x%02x.\n", ++ ha->host_no, i, index, ++ ha->fc_db[index].flag, ++ ha->fc_db[index].loop_id, ++ ha->fc_db[index].d_id.b.domain, ++ ha->fc_db[index].d_id.b.area, ++ ha->fc_db[index].d_id.b.al_pa, ++ dev.wwn[0], dev.wwn[1], dev.wwn[2], dev.wwn[3], ++ dev.wwn[4], dev.wwn[5], dev.wwn[6], dev.wwn[7])); ++ ++ if (!(ha->fc_db[index].flag & DEV_PUBLIC)) { ++ /* ++ * This was in our database as a local device. ++ * Here we assume this device either has ++ * changed location so configure_local_loop has ++ * already done necessary clean up, or it's ++ * saved here due to persistent name binding. ++ * We'll just add it in as a fabric device. ++ */ ++ /* Copy port id and name fields. */ ++ ha->fc_db[index].flag |= DEV_PUBLIC; ++ ha->fc_db[index].d_id.b24 = dev.d_id.b24; ++ ha->fc_db[index].loop_id |= PORT_LOGIN_NEEDED; ++ ++ break; ++ } ++ ++ /* This was in our database as a fabric device. */ ++ if ((ha->fc_db[index].d_id.b24 == dev.d_id.b24) && ++ (ha->fc_db[index].loop_id <= LAST_SNS_LOOP_ID)) ++ /* Device didn't change */ ++ break; ++ ++ if (ha->fc_db[index].loop_id == PORT_AVAILABLE) { ++ ha->fc_db[index].flag |= DEV_PUBLIC; ++ ha->fc_db[index].d_id.b24 = dev.d_id.b24; ++ ha->fc_db[index].loop_id |= PORT_LOGIN_NEEDED; ++ break; ++ } ++ ++ /* ++ * Port ID changed or device was marked to be updated; ++ * logout and mark it for relogin later. ++ */ ++ qla2x00_fabric_logout(ha, ++ ha->fc_db[index].loop_id & 0xff); ++ ha->fc_db[index].flag |= DEV_PUBLIC; ++ ha->fc_db[index].d_id.b24 = dev.d_id.b24; ++ ++ ha->fc_db[index].loop_id |= PORT_LOGIN_NEEDED; ++ ha->fc_db[index].loop_id &= ~PORT_LOST_ID; ++ ++ *flags |= LOGOUT_PERFORMED; ++ ++ break; ++ } ++ ++ if (index == MAX_FIBRE_DEVICES) { ++ /* ++ * Did not find a match in our database. This is a new ++ * device. ++ */ ++ DEBUG3(printk("scsi(%ld): Found new device " ++ "%02x%02x%02x%02x%02x%02x%02x%02x.\n", ++ ha->host_no, ++ dev.wwn[0], dev.wwn[1], dev.wwn[2], dev.wwn[3], ++ dev.wwn[4], dev.wwn[5], dev.wwn[6], dev.wwn[7])); ++ ++ memcpy(&new_dev_list[new_cnt], ++ &dev, sizeof(struct new_dev)); ++ new_cnt++; ++ } ++ } ++ ++ if (swl) ++ kfree(swl); ++ ++ *new_dev_cnt = new_cnt; ++ ++ if (new_cnt > 0) ++ ha->device_flags |= DFLG_FABRIC_DEVICES; ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_device_resync ++ * Marks devices in the database that needs resynchronization. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_device_resync(scsi_qla_host_t *ha) ++{ ++ uint16_t index; ++ uint32_t mask; ++ rscn_t dev; ++ struct list_head *fcil; ++ fc_initiator_t *fcinitiator; ++ ++ ENTER(__func__); ++ ++ while (ha->rscn_out_ptr != ha->rscn_in_ptr || ++ ha->flags.rscn_queue_overflow) { ++ ++ memcpy(&dev, &ha->rscn_queue[ha->rscn_out_ptr], sizeof(rscn_t)); ++ ++ DEBUG(printk("scsi(%ld): device_resync: rscn_queue[%d], " ++ "portID=%02x%02x%02x.\n", ++ ha->host_no, ++ ha->rscn_out_ptr, ++ ha->rscn_queue[ha->rscn_out_ptr].d_id.b.domain, ++ ha->rscn_queue[ha->rscn_out_ptr].d_id.b.area, ++ ha->rscn_queue[ha->rscn_out_ptr].d_id.b.al_pa)); ++ ++ ha->rscn_out_ptr++; ++ if (ha->rscn_out_ptr == MAX_RSCN_COUNT) ++ ha->rscn_out_ptr = 0; ++ ++ /* Queue overflow, set switch default case. */ ++ if (ha->flags.rscn_queue_overflow) { ++ DEBUG(printk("scsi(%ld): device_resync: rscn " ++ "overflow.\n", ha->host_no)); ++ ++ dev.format = 3; ++ ha->flags.rscn_queue_overflow = 0; ++ } ++ ++ switch (dev.format) { ++ case 0: ++ mask = 0xffffff; ++ break; ++ case 1: ++ mask = 0xffff00; ++ break; ++ case 2: ++ mask = 0xff0000; ++ break; ++ default: ++ mask = 0x0; ++ dev.d_id.b24 = 0; ++ ha->rscn_out_ptr = ha->rscn_in_ptr; ++ break; ++ } ++ ++ /* Mark target devices indicated by RSCN for later processing */ ++ for (index = 0; index < MAX_FIBRE_DEVICES; index++) { ++ if ((ha->fc_db[index].flag & DEV_PUBLIC) && ++ (ha->fc_db[index].d_id.b24 & mask) == ++ dev.d_id.b24) { ++ ++ /* fabric device */ ++ if (ha->fc_db[index].loop_id != PORT_UNUSED) { ++ ha->fc_db[index].loop_id |= ++ PORT_LOST_ID; ++ ++ DEBUG(printk("scsi(%ld): RSCN port @ " ++ "slot %d port_id=%02x%02x%02x.\n", ++ ha->host_no, ++ index, ++ ha->fc_db[index].d_id.b.domain, ++ ha->fc_db[index].d_id.b.area, ++ ha->fc_db[index].d_id.b.al_pa)); ++ } ++ } ++ } ++ ++ if (dev.format == 3) ++ continue; ++ ++ /* ++ * Invalidate initiator devices indicated by RSCN so we know ++ * they are no longer logged in. ++ */ ++ list_for_each(fcil, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ if ((fcinitiator->d_id.b24 & mask) != dev.d_id.b24) ++ continue; ++ if (fcinitiator->loop_id & PORT_LOST_ID || ++ fcinitiator->loop_id & PORT_LOGIN_NEEDED) ++ continue; ++ ++ fcinitiator->loop_id |= PORT_LOST_ID; ++ fcinitiator->d_id.b24 = 0; ++ } ++ } ++ ++ LEAVE(__func__); ++} ++ ++ ++/* ++ * qla2x00_loop_resync ++ * Resync with fibre channel devices. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * 0 = success ++ */ ++uint8_t ++qla2x00_loop_resync(scsi_qla_host_t *ha) ++{ ++ uint8_t status; ++ ++ ENTER(__func__); ++ ++ ha->loop_state = LOOP_UPDATE; ++ qla2x00_stats.loop_resync++; ++ clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags); ++ if (ha->flags.online) { ++ if (!(status = qla2x00_fw_ready(ha))) { ++ do { ++ /* v2.19.05b6 */ ++ ha->loop_state = LOOP_UPDATE; ++ ++ /* ++ * Issue marker command only when we are going ++ * to start the I/O . ++ */ ++ ha->marker_needed = 1; ++ ++ /* Remap devices on Loop. */ ++ clear_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ ++ qla2x00_configure_loop(ha); ++ ++ } while (!atomic_read(&ha->loop_down_timer) && ++ !(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) && ++ (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))); ++ } ++ qla2x00_restart_queues(ha,TRUE); ++ } else ++ status = 0; ++ ++ if (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) { ++ return (1); ++ } ++ ++ if (status) { ++ DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__)); ++ } ++ ++ LEAVE(__func__); ++ ++ return(status); ++} ++ ++/* ++ * qla2x00_fabric_login ++ * Issue fabric login command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * device = pointer to FC device type structure. ++ * ++ * Returns: ++ * 0 - Login successfully ++ * 1 - Login failed ++ * 2 - Initiator device ++ * 3 - Fatal error ++ */ ++uint8_t ++qla2x00_fabric_login(scsi_qla_host_t *ha, fcdev_t *device) ++{ ++ uint16_t status[3]; ++ ++ for (;;) { ++ DEBUG(printk("scsi(%ld): Trying Fabric Login w/loop id 0x%04x " ++ "for port %02x%02x%02x.\n", ++ ha->host_no, device->loop_id, ++ device->d_id.b.domain, ++ device->d_id.b.area, ++ device->d_id.b.al_pa)); ++ ++ /* Login device on switch. */ ++ qla2x00_login_fabric(ha, ++ device->loop_id, device->d_id.b.domain, ++ device->d_id.b.area, device->d_id.b.al_pa, ++ &status[0], BIT_0); ++ ++ if (status[0] == 0x4007) { ++ ha->fabricid[device->loop_id].in_use = FALSE; ++ device->loop_id = status[1]; ++ ++ DEBUG(printk("Fabric Login: port in use - next " ++ "loop id=0x%04x, port Id=%02x%02x%02x.\n", ++ device->loop_id, ++ device->d_id.b.domain, ++ device->d_id.b.area, ++ device->d_id.b.al_pa)); ++ ++ if (device->loop_id <= LAST_SNS_LOOP_ID) ++ ha->fabricid[device->loop_id].in_use = TRUE; ++ else ++ return 1; ++ ++ } else if (status[0] == 0x4000) { ++ if (status[1] & 0x0001) { ++ /* Initiator only device */ ++ qla2x00_add_initiator_device(ha, device); ++ ++ return 2; ++ } ++ ++ /* This is target capable device */ ++ qla2x00_get_port_database(ha, device, 0); ++ ++ DEBUG(printk("scsi(%ld): Fabric Login OK. loop " ++ "id=0x%04x, port Id=%02x%02x%02x.\n", ++ ha->host_no, ++ device->loop_id, ++ device->d_id.b.domain, ++ device->d_id.b.area, ++ device->d_id.b.al_pa)); ++ return 0; ++ ++ } else if (status[0] == 0x4008) { ++ if (device->loop_id++ <= LAST_SNS_LOOP_ID) ++ ha->fabricid[device->loop_id].in_use = TRUE; ++ else ++ return 1; ++ ++ } else if (status[0] == 0x4006) { ++ /* No more retry needed. */ ++ return 3; ++ } else { ++ DEBUG2(printk("%s(%ld): failed=%x port_id=%02x%02x%02x " ++ "loop_id=%x jiffies=%lx.\n", ++ __func__, ha->host_no, status[0], ++ device->d_id.b.domain, ++ device->d_id.b.area, ++ device->d_id.b.al_pa, ++ device->loop_id, jiffies)); ++ return 1; ++ } ++ } ++} ++ ++/* ++ * qla2x00_local_device_login ++ * Issue local device login command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = loop id of device to login to. ++ * ++ * Returns (Where's the #define!!!!): ++ * 0 - Login successfully ++ * 1 - Login failed ++ * 3 - Fatal error ++ */ ++uint8_t ++qla2x00_local_device_login(scsi_qla_host_t *ha, uint16_t loop_id) ++{ ++ int rval; ++ uint16_t mb[MAILBOX_REGISTER_COUNT]; ++ ++ memset(mb, 0, sizeof(mb)); ++ rval = qla2x00_login_local_device(ha, loop_id, mb, BIT_0); ++ if (rval == QL_STATUS_SUCCESS) { ++ /* Interrogate mailbox registers for any errors */ ++ if (mb[0] == 0x4005) ++ rval = 1; ++ else if (mb[0] == 0x4006) ++ /* device not in PCB table */ ++ rval = 3; ++ } ++ return rval; ++} ++ ++ ++/** ++ * qla2x00_ga_nxt() - SNS scan for fabric devices via GA_NXT command. ++ * @ha: HA context ++ * @swl_entry: switch info entry to updated ++ * ++ * NOTE: Non-Nx_Ports are skipped. ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_ga_nxt(scsi_qla_host_t *ha, sw_info_t *swl_entry) ++{ ++ int rval; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++retry_ga_nxt: ++ /* Issue GA_NXT */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, GA_NXT_REQ_SIZE, GA_NXT_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(GA_NXT_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((GA_NXT_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id */ ++ ct_req->req.port_id.port_id[0] = swl_entry->d_id.b.domain; ++ ct_req->req.port_id.port_id[1] = swl_entry->d_id.b.area; ++ ct_req->req.port_id.port_id[2] = swl_entry->d_id.b.al_pa; ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): GA_NXT issue IOCB failed (%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): GA_NXT failed, rejected request, " ++ "ga_nxt_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else if (ct_rsp->rsp.ga_nxt.port_type != NS_N_PORT_TYPE && ++ ct_rsp->rsp.ga_nxt.port_type != NS_NL_PORT_TYPE) { ++ /* We're only interested in Nx ports */ ++ DEBUG2_3(printk("scsi(%ld): GA_NXT skipping *NON* Nx_Port - " ++ "nodename %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portname %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portid=%02x%02x%02x port_type=%x.\n", ++ ha->host_no, ++ ct_rsp->rsp.ga_nxt.node_name[0], ++ ct_rsp->rsp.ga_nxt.node_name[1], ++ ct_rsp->rsp.ga_nxt.node_name[2], ++ ct_rsp->rsp.ga_nxt.node_name[3], ++ ct_rsp->rsp.ga_nxt.node_name[4], ++ ct_rsp->rsp.ga_nxt.node_name[5], ++ ct_rsp->rsp.ga_nxt.node_name[6], ++ ct_rsp->rsp.ga_nxt.node_name[7], ++ ct_rsp->rsp.ga_nxt.port_name[0], ++ ct_rsp->rsp.ga_nxt.port_name[1], ++ ct_rsp->rsp.ga_nxt.port_name[2], ++ ct_rsp->rsp.ga_nxt.port_name[3], ++ ct_rsp->rsp.ga_nxt.port_name[4], ++ ct_rsp->rsp.ga_nxt.port_name[5], ++ ct_rsp->rsp.ga_nxt.port_name[6], ++ ct_rsp->rsp.ga_nxt.port_name[7], ++ ct_rsp->rsp.ga_nxt.port_id[0], ++ ct_rsp->rsp.ga_nxt.port_id[1], ++ ct_rsp->rsp.ga_nxt.port_id[2], ++ ct_rsp->rsp.ga_nxt.port_type)); ++ goto retry_ga_nxt; ++ } else { ++ /* Populate switch info entry. */ ++ swl_entry->d_id.b.domain = ct_rsp->rsp.ga_nxt.port_id[0]; ++ swl_entry->d_id.b.area = ct_rsp->rsp.ga_nxt.port_id[1]; ++ swl_entry->d_id.b.al_pa = ct_rsp->rsp.ga_nxt.port_id[2]; ++ ++ memcpy(swl_entry->node_name, ++ ct_rsp->rsp.ga_nxt.node_name, WWN_SIZE); ++ memcpy(swl_entry->port_name, ++ ct_rsp->rsp.ga_nxt.port_name, WWN_SIZE); ++ ++ swl_entry->type = SW_TYPE_SCSI; ++ if (ct_rsp->rsp.ga_nxt.fc4_types[3] & 0x20) ++ swl_entry->type |= SW_TYPE_IP; ++ ++ DEBUG2_3(printk("scsi(%ld): GA_NXT entry - " ++ "nodename %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portname %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portid=%02x%02x%02x type=%02x.\n", ++ ha->host_no, ++ swl_entry->node_name[0], swl_entry->node_name[1], ++ swl_entry->node_name[2], swl_entry->node_name[3], ++ swl_entry->node_name[4], swl_entry->node_name[5], ++ swl_entry->node_name[6], swl_entry->node_name[7], ++ swl_entry->port_name[0], swl_entry->port_name[1], ++ swl_entry->port_name[2], swl_entry->port_name[3], ++ swl_entry->port_name[4], swl_entry->port_name[5], ++ swl_entry->port_name[6], swl_entry->port_name[7], ++ swl_entry->d_id.b.domain, ++ swl_entry->d_id.b.area, ++ swl_entry->d_id.b.al_pa, ++ swl_entry->type)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_gid_pt() - SNS scan for fabric devices via GID_PT command. ++ * @ha: HA context ++ * @list: switch info entries to populate ++ * ++ * NOTE: Non-Nx_Ports are not requested. ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_gid_pt(scsi_qla_host_t *ha, sw_info_t *list) ++{ ++ int rval; ++ uint16_t i; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ struct ct_sns_gid_pt_data *gid_data; ++ ++ ENTER(__func__); ++ ++ gid_data = NULL; ++ ++ /* Issue GID_PT */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, GID_PT_REQ_SIZE, GID_PT_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(GID_PT_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((GID_PT_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_type */ ++ ct_req->req.gid_pt.port_type = NS_NX_PORT_TYPE; ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): GID_PT issue IOCB failed (%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): GID_PT failed, rejected request, " ++ "gid_pt_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ /* Set port IDs in switch info list. */ ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ memset(&list[i], 0, sizeof(sw_info_t)); ++ gid_data = &ct_rsp->rsp.gid_pt.entries[i]; ++ list[i].d_id.b.domain = gid_data->port_id[0]; ++ list[i].d_id.b.area = gid_data->port_id[1]; ++ list[i].d_id.b.al_pa = gid_data->port_id[2]; ++ ++ /* Last one exit. */ ++ if (gid_data->control_byte & BIT_7) { ++ list[i].d_id.b.rsvd_1 = gid_data->control_byte; ++ break; ++ } ++ } ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_gpn_id() - SNS Get Port Name (GPN_ID) query. ++ * @ha: HA context ++ * @list: switch info entries to populate ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_gpn_id(scsi_qla_host_t *ha, sw_info_t *list) ++{ ++ int rval; ++ uint16_t i; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ /* Issue GPN_ID */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, ++ GPN_ID_REQ_SIZE, GPN_ID_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(GPN_ID_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((GPN_ID_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id */ ++ ct_req->req.port_id.port_id[0] = list[i].d_id.b.domain; ++ ct_req->req.port_id.port_id[1] = list[i].d_id.b.area; ++ ct_req->req.port_id.port_id[2] = list[i].d_id.b.al_pa; ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): GPN_ID issue IOCB failed " ++ "(%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): GPN_ID failed, rejected " ++ "request, gpn_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ /* Save portname */ ++ memcpy(list[i].port_name, ++ ct_rsp->rsp.gpn_id.port_name, WWN_SIZE); ++ } ++ ++ /* Last device exit. */ ++ if (list[i].d_id.b.rsvd_1 != 0) ++ break; ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_gnn_id() - SNS Get Node Name (GPN_ID) query. ++ * @ha: HA context ++ * @list: switch info entries to populate ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_gnn_id(scsi_qla_host_t *ha, sw_info_t *list) ++{ ++ int rval; ++ uint16_t i; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ /* Issue GNN_ID */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, ++ GNN_ID_REQ_SIZE, GNN_ID_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(GNN_ID_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((GNN_ID_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id */ ++ ct_req->req.port_id.port_id[0] = list[i].d_id.b.domain; ++ ct_req->req.port_id.port_id[1] = list[i].d_id.b.area; ++ ct_req->req.port_id.port_id[2] = list[i].d_id.b.al_pa; ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): GNN_ID issue IOCB failed " ++ "(%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): GNN_ID failed, rejected " ++ "request, gnn_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ /* Save nodename */ ++ memcpy(list[i].node_name, ++ ct_rsp->rsp.gnn_id.node_name, WWN_SIZE); ++ } ++ ++ /* Last device exit. */ ++ if (list[i].d_id.b.rsvd_1 != 0) ++ break; ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_gft_id() - SNS Get FC-4 TYPEs (GFT_ID) query. ++ * @ha: HA context ++ * @list: switch info entries to populate ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_gft_id(scsi_qla_host_t *ha, sw_info_t *list) ++{ ++ int rval; ++ uint16_t i; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ /* Issue GFT_ID */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, ++ GFT_ID_REQ_SIZE, GFT_ID_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(GFT_ID_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((GFT_ID_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id */ ++ ct_req->req.port_id.port_id[0] = list[i].d_id.b.domain; ++ ct_req->req.port_id.port_id[1] = list[i].d_id.b.area; ++ ct_req->req.port_id.port_id[2] = list[i].d_id.b.al_pa; ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): GFT_ID issue IOCB failed " ++ "(%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): GFT_ID failed, rejected " ++ "request, gft_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ /* FCP-3 check necessary? No, assume FCP-3 */ ++ /*if (ct_rsp->rsp.gft_id.fc4_types[2] & 0x01)*/ ++ list[i].type = SW_TYPE_SCSI; ++ if (ct_rsp->rsp.gft_id.fc4_types[3] & 0x20) ++ list[i].type |= SW_TYPE_IP; ++ ++ DEBUG2_3(printk("scsi(%ld): GID_PT entry - " ++ "nodename %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portname %02x%02x%02x%02x%02x%02x%02x%02x " ++ "portid=%02x%02x%02x type=%02x.\n", ++ ha->host_no, ++ list[i].node_name[0], list[i].node_name[1], ++ list[i].node_name[2], list[i].node_name[3], ++ list[i].node_name[4], list[i].node_name[5], ++ list[i].node_name[6], list[i].node_name[7], ++ list[i].port_name[0], list[i].port_name[1], ++ list[i].port_name[2], list[i].port_name[3], ++ list[i].port_name[4], list[i].port_name[5], ++ list[i].port_name[6], list[i].port_name[7], ++ list[i].d_id.b.domain, ++ list[i].d_id.b.area, ++ list[i].d_id.b.al_pa, ++ list[i].type)); ++ } ++ ++ /* Last device exit. */ ++ if (list[i].d_id.b.rsvd_1 != 0) ++ break; ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_rft_id() - SNS Register FC-4 TYPEs (RFT_ID) supported by the HBA. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_rft_id(scsi_qla_host_t *ha) ++{ ++ int rval; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ /* Issue RFT_ID */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, RFT_ID_REQ_SIZE, RFT_ID_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(RFT_ID_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((RFT_ID_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id, FC-4 types */ ++ ct_req->req.rft_id.port_id[0] = ha->d_id.b.domain; ++ ct_req->req.rft_id.port_id[1] = ha->d_id.b.area; ++ ct_req->req.rft_id.port_id[2] = ha->d_id.b.al_pa; ++ ++ ct_req->req.rft_id.fc4_types[2] = 0x01; /* FCP-3 */ ++ ha->active_fc4_types = EXT_DEF_FC4_TYPE_SCSI; ++ ++#if defined(FC_IP_SUPPORT) ++ if (ha->flags.enable_ip) { ++ ct_req->req.rft_id.fc4_types[3] = 0x20; /* IP over FC */ ++ ha->active_fc4_types |= EXT_DEF_FC4_TYPE_IP; ++ } ++#endif ++#if defined(FC_VI_SUPPORT) ++ ct_req->req.rft_id.fc4_types[8] = 0x01; /* FC-VI */ ++ ha->active_fc4_types |= EXT_DEF_FC4_TYPE_VI; ++#endif ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): RFT_ID issue IOCB failed (%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): RFT_ID failed, rejected " ++ "request, rft_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ DEBUG2(printk("scsi(%ld): RFT_ID exiting normally.\n", ++ ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_rff_id() - SNS Register FC-4 Features (RFF_ID) supported by the HBA. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_rff_id(scsi_qla_host_t *ha) ++{ ++ int rval; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ /* Issue RFF_ID */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, RFF_ID_REQ_SIZE, RFF_ID_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(RFF_ID_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((RFF_ID_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id, FC-4 feature, FC-4 type */ ++ ct_req->req.rff_id.port_id[0] = ha->d_id.b.domain; ++ ct_req->req.rff_id.port_id[1] = ha->d_id.b.area; ++ ct_req->req.rff_id.port_id[2] = ha->d_id.b.al_pa; ++ ++ if (!ha->flags.enable_target_mode) ++ ct_req->req.rff_id.fc4_feature = 0x02; /* SCSI Initiator */ ++ ++ ct_req->req.rff_id.fc4_type = 0x08; /* SCSI - FCP */ ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): RFF_ID issue IOCB failed (%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): RFF_ID failed, rejected " ++ "request, rff_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ DEBUG2(printk("scsi(%ld): RFF_ID exiting normally.\n", ++ ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_rnn_id() - SNS Register Node Name (RNN_ID) of the HBA. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_rnn_id(scsi_qla_host_t *ha) ++{ ++ int rval; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ /* Issue RNN_ID */ ++ /* Prepare common MS IOCB */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, RNN_ID_REQ_SIZE, RNN_ID_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(RNN_ID_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((RNN_ID_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- port_id, node_name */ ++ ct_req->req.rnn_id.port_id[0] = ha->d_id.b.domain; ++ ct_req->req.rnn_id.port_id[1] = ha->d_id.b.area; ++ ct_req->req.rnn_id.port_id[2] = ha->d_id.b.al_pa; ++ ++ memcpy(ct_req->req.rnn_id.node_name, ha->init_cb->node_name, WWN_SIZE); ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): RNN_ID issue IOCB failed (%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): RNN_ID failed, rejected " ++ "request, rnn_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ DEBUG2(printk("scsi(%ld): RNN_ID exiting normally.\n", ++ ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/** ++ * qla2x00_rsnn_nn() - SNS Register Symbolic Node Name (RSNN_NN) of the HBA. ++ * @ha: HA context ++ * ++ * Returns 0 on success. ++ */ ++static int ++qla2x00_rsnn_nn(scsi_qla_host_t *ha) ++{ ++ int rval; ++ uint8_t *snn; ++ uint8_t version[20]; ++ ++ ms_iocb_entry_t *ms_pkt; ++ struct ct_sns_req *ct_req; ++ struct ct_sns_rsp *ct_rsp; ++ ++ ENTER(__func__); ++ ++ /* Issue RSNN_NN */ ++ /* Prepare common MS IOCB */ ++ /* Request size adjusted after CT preparation */ ++ ms_pkt = qla2x00_prep_ms_iocb(ha, 0, RSNN_NN_RSP_SIZE); ++ ++ /* Prepare CT request */ ++ ct_req = &ha->ct_sns->p.req; ++ ct_rsp = &ha->ct_sns->p.rsp; ++ memset(ct_req, 0, sizeof(struct ct_sns_pkt)); ++ ++ ct_req->header.revision = 0x01; ++ ct_req->header.gs_type = 0xFC; ++ ct_req->header.gs_subtype = 0x02; ++ ct_req->command = __constant_cpu_to_be16(RSNN_NN_CMD); ++ ct_req->max_rsp_size = ++ __constant_cpu_to_be16((RSNN_NN_RSP_SIZE - 16) / 4); ++ ++ /* Prepare CT arguments -- node_name, symbolic node_name, size */ ++ memcpy(ct_req->req.rsnn_nn.node_name, ha->init_cb->node_name, WWN_SIZE); ++ ++ /* Prepare the Symbolic Node Name */ ++ /* Board type */ ++ snn = ct_req->req.rsnn_nn.sym_node_name; ++#if defined(ISP2300) ++ if (ha->pdev->device == QLA2312_DEVICE_ID) { ++ switch (ha->pdev->subsystem_device) { ++ case 0x0100: ++ strcpy(snn , "QLA2340"); ++ break; ++ ++ case 0x0101: ++ strcpy(snn , "QLA2342"); ++ break; ++ ++ case 0x0102: ++ strcpy(snn , "QLA2312"); ++ break; ++ ++ default: ++ strcpy(snn , "QLA2312"); ++ break; ++ } ++ } else { ++ strcpy(snn ,"QLA23xx"); ++ } ++#else ++ sprintf(snn, "QLA%04x", ha->pdev->device); ++#endif ++ ++ /* Firmware version */ ++ strcat(snn, " FW:v"); ++ sprintf(version, "%d.%02d.%02d", ha->fw_major_version, ++ ha->fw_minor_version, ha->fw_subminor_version); ++ strcat(snn, version); ++ ++ /* Driver version */ ++ strcat(snn, " DVR:v"); ++ strcat(snn, qla2x00_version_str); ++ ++ /* Calculate SNN length */ ++ ct_req->req.rsnn_nn.name_len = (uint8_t)strlen(snn); ++ ++ /* Update MS IOCB request */ ++ ms_pkt->req_bytecount = ++ cpu_to_le32(24 + 1 + ct_req->req.rsnn_nn.name_len); ++ ms_pkt->dseg_req_length = ms_pkt->req_bytecount; ++ ++ /* Execute MS IOCB */ ++ rval = qla2x00_issue_iocb(ha, ++ ha->ms_iocb, ha->ms_iocb_dma, sizeof(ms_iocb_entry_t)); ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3(printk("scsi(%ld): RSNN_NN issue IOCB failed (%d).\n", ++ ha->host_no, rval)); ++ } else if (ct_rsp->header.response != ++ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { ++ DEBUG2_3(printk("scsi(%ld): RSNN_NN failed, rejected " ++ "request, rsnn_id_rsp:\n", ha->host_no)); ++ DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header, ++ sizeof(struct ct_rsp_hdr))); ++ rval = QL_STATUS_ERROR; ++ } else { ++ DEBUG2(printk("scsi(%ld): RSNN_NN exiting normally.\n", ++ ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++static int ++qla2x00_add_initiator_device(scsi_qla_host_t *ha, fcdev_t *device) ++{ ++ int ret; ++ fc_initiator_t *fcinitiator; ++ ++ ret = 1; ++ fcinitiator = kmalloc(sizeof(fc_initiator_t), GFP_ATOMIC); ++ if (fcinitiator != NULL) { ++ /* Setup initiator structure. */ ++ memset(fcinitiator, 0, sizeof(fc_initiator_t)); ++ ++ memcpy(fcinitiator->node_name, device->name, WWN_SIZE); ++ memcpy(fcinitiator->port_name, device->wwn, WWN_SIZE); ++ fcinitiator->d_id.b24 = device->d_id.b24; ++ fcinitiator->loop_id = device->loop_id; ++ list_add_tail(&fcinitiator->list, &ha->fcinitiators); ++ ret = 0; ++ } else { ++ printk(KERN_WARNING ++ "%s(): Memory Allocation failed - FCINITIATOR\n", ++ __func__); ++ } ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_restart_queues ++ * Restart device queues. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Kernel/Interrupt context. ++ */ ++void ++qla2x00_restart_queues(scsi_qla_host_t *ha, uint8_t flush) ++{ ++ srb_t *sp; ++ int retry_q_cnt = 0; ++ int pending_q_cnt = 0; ++ struct list_head *list, *temp; ++ unsigned long flags = 0; ++ struct list_head *hal; ++ scsi_qla_host_t *vis_ha; ++ ++ ++ ENTER(__func__); ++ ++ clear_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags); ++ ++ /* ++ * start pending queue ++ */ ++ pending_q_cnt = ha->qthreads; ++ if (flush) { ++ spin_lock_irqsave(&ha->list_lock,flags); ++ list_for_each_safe(list, temp, &ha->pending_queue) { ++ sp = list_entry(list, srb_t, list); ++ /* ++ * When time expire return request back to OS as BUSY ++ */ ++ __del_from_pending_queue(ha, sp); ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ CMD_HANDLE(sp->cmd) = (unsigned char *)NULL; ++ __add_to_done_queue(ha, sp); ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ } else { ++ if (!list_empty(&ha->pending_queue)) ++ qla2x00_next(ha); ++ } ++ ++ /* ++ * Clear out our retry queue ++ */ ++ if (flush) { ++ spin_lock_irqsave(&ha->list_lock, flags); ++ retry_q_cnt = ha->retry_q_cnt; ++ list_for_each_safe(list, temp, &ha->retry_queue) { ++ sp = list_entry(list, srb_t, list); ++ /* when time expire return request back to OS as BUSY */ ++ __del_from_retry_queue(ha, sp); ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ CMD_HANDLE(sp->cmd) = (unsigned char *) NULL; ++ __add_to_done_queue(ha, sp); ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ ++ DEBUG2(printk("%s(%ld): callback %d commands.\n", ++ __func__, ++ ha->host_no, ++ retry_q_cnt);) ++ } ++ ++ DEBUG2(printk("%s(%ld): active=%ld, retry=%d, pending=%d, " ++ "done=%ld, failover=%d, scsi retry=%d commands.\n", ++ __func__, ++ ha->host_no, ++ ha->actthreads, ++ ha->retry_q_cnt, ++ pending_q_cnt, ++ ha->done_q_cnt, ++ ha->failover_cnt, ++ ha->scsi_retry_q_cnt);) ++ ++ if (ha->flags.failover_enabled) { ++ /* Try and start all visible adapters */ ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ vis_ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (!list_empty(&vis_ha->pending_queue)) ++ qla2x00_next(vis_ha); ++ ++ DEBUG2(printk("host(%ld):Commands busy=%d " ++ "failed=%d\nin_recovery=%d " ++ "eh_active=%d\n ", ++ vis_ha->host_no, ++ vis_ha->host->host_busy, ++ vis_ha->host->host_failed, ++ vis_ha->host->in_recovery, ++ vis_ha->host->eh_active);) ++ } ++ read_unlock(&qla_hostlist_lock); ++ } ++ ++ if (!list_empty(&ha->done_queue)) ++ schedule_work(&ha->run_qla_task); ++ ++ LEAVE(__func__); ++} ++ ++/* ++ * qla2x00_update_fc_database ++ * This routine updates the device data in the database. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * device = device data pointer. ++ * ++ * Returns: ++ * 0 = success, if device found or added to database. ++ * BIT_0 = error ++ * BIT_1 = database was full and device was not configured. ++ */ ++static uint8_t ++qla2x00_update_fc_database(scsi_qla_host_t *ha, ++ fcdev_t *device, uint8_t enable_slot_reuse) ++{ ++ int rval; ++ uint16_t cnt, i; ++ ++ DEBUG(printk("scsi(%ld): Found device - " ++ "nodename=%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "portname=%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "port Id=%02x%02x%02x, loop id=%04x\n", ++ ha->host_no, ++ device->name[0], device->name[1], ++ device->name[2], device->name[3], ++ device->name[4], device->name[5], ++ device->name[6], device->name[7], ++ device->wwn[0], device->wwn[1], ++ device->wwn[2], device->wwn[3], ++ device->wwn[4], device->wwn[5], ++ device->wwn[6], device->wwn[7], ++ device->d_id.b.domain, device->d_id.b.area, device->d_id.b.al_pa, ++ device->loop_id)); ++ ++ /* Look for device in database. */ ++ for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { ++ if (ha->fc_db[cnt].loop_id == PORT_UNUSED) ++ continue; ++ ++ rval = 1; ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ rval = memcmp(device->wwn, ++ ha->fc_db[cnt].wwn, WWN_SIZE); ++ break; ++ ++ case BIND_BY_PORT_ID: ++ rval = (device->d_id.b24 != ha->fc_db[cnt].d_id.b24); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ rval = memcmp(device->name, ++ ha->fc_db[cnt].name, WWN_SIZE); ++ break; ++ } ++ if (rval) ++ continue; ++ ++ DEBUG(printk("scsi(%ld): Reusing slot %d for device " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ ha->host_no, cnt, ++ device->wwn[0], ++ device->wwn[1], ++ device->wwn[2], ++ device->wwn[3], ++ device->wwn[4], ++ device->wwn[5], ++ device->wwn[6], ++ device->wwn[7])); ++ ++ if (device->flag & DEV_PUBLIC) { ++ ha->fc_db[cnt].flag |= DEV_PUBLIC; ++ } else { ++ if (ha->fc_db[cnt].flag & DEV_PUBLIC) { ++ ha->fc_db[cnt].flag &= ~DEV_PUBLIC; ++ ha->fabricid[ha->fc_db[cnt].loop_id].in_use ++ = FALSE; ++ } ++ } ++ ++ ha->fc_db[cnt].loop_id = device->loop_id; ++ ha->fc_db[cnt].d_id.b24 = device->d_id.b24; ++ ++ /* Update volatile unbound fields for PortID binding only */ ++ if (ha->binding_type == BIND_BY_PORT_ID) { ++ memcpy(ha->fc_db[cnt].name, device->name, WWN_SIZE); ++ memcpy(ha->fc_db[cnt].wwn, device->wwn, WWN_SIZE); ++ } ++ ++ return (0); ++ } ++ ++ /* Find a empty slot and add device into database. */ ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ ++/* FlexServ Patch */ ++#if QLA2XXX_HOTSWAP_ENUMERATION ++ /* ++ * Enumerate upon the actual ID so add-single-device works ++ */ ++ if (i != device->loop_id) { ++ continue; ++ } ++#endif ++ ++ if ((ha->fc_db[i].loop_id == PORT_UNUSED) || ++ (ha->fc_db[i].loop_id == PORT_NEED_MAP)) { ++ ++ DEBUG(printk("scsi(%ld): New slot %d for device " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ ha->host_no, i, ++ device->wwn[0], ++ device->wwn[1], ++ device->wwn[2], ++ device->wwn[3], ++ device->wwn[4], ++ device->wwn[5], ++ device->wwn[6], ++ device->wwn[7])); ++ ++ memcpy(ha->fc_db[i].name, device->name, WWN_SIZE); ++ memcpy(ha->fc_db[i].wwn, device->wwn, WWN_SIZE); ++ ha->fc_db[i].loop_id = device->loop_id; ++ ha->fc_db[i].d_id.b24 = device->d_id.b24; ++ ++ if (device->flag & DEV_PUBLIC) ++ ha->fc_db[i].flag |= DEV_PUBLIC; ++ ++ ha->flags.updated_fc_db = TRUE; ++ ++ return (0); ++ } ++ } ++ ++ if (enable_slot_reuse) { ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ if (ha->fc_db[i].loop_id == PORT_AVAILABLE) { ++ DEBUG(printk("scsi(%ld): Assigned slot %d " ++ "reuse for device " ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ ha->host_no, i, ++ device->wwn[0], ++ device->wwn[1], ++ device->wwn[2], ++ device->wwn[3], ++ device->wwn[4], ++ device->wwn[5], ++ device->wwn[6], ++ device->wwn[7])); ++ ++ memcpy(ha->fc_db[i].name, ++ device->name, WWN_SIZE); ++ memcpy(ha->fc_db[i].wwn, ++ device->wwn, WWN_SIZE); ++ ha->fc_db[i].loop_id = device->loop_id; ++ ha->fc_db[i].d_id.b24 = device->d_id.b24; ++ ++ if (device->flag & DEV_PUBLIC) ++ ha->fc_db[i].flag |= DEV_PUBLIC; ++ ++ ha->flags.updated_fc_db = TRUE; ++ ++ return (0); ++ } ++ } ++ } ++ ++ return(BIT_1); ++} ++ ++/* ++ * qla2x00_build_fcport_list ++ * Updates device on list. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * fcport = port structure pointer. ++ * ++ * Return: ++ * 0 - Success ++ * BIT_0 - error ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_build_fcport_list(scsi_qla_host_t *ha) ++{ ++// FIXME: FIX THIS C*!P!!! ++ int rval; ++ fcdev_t *dev; ++ int found = 0; ++ int cnt, i; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ ++ ENTER(__func__); ++ ++ for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { ++ dev = &ha->fc_db[cnt]; ++ ++ /* Skip if zero port name */ ++ if (qla2x00_is_wwn_zero(dev->wwn)) { ++ continue; ++ } ++ ++ DEBUG3(printk("scsi(%ld): found tgt %d in fc_db.\n", ++ ha->host_no, cnt)); ++ ++ /* Check for matching device in port list. */ ++ i = 0; ++ found = 0; ++ fcport = NULL; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ rval = 1; ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ rval = memcmp(dev->wwn, ++ fcport->port_name, ++ WWN_SIZE); ++ break; ++ ++ case BIND_BY_PORT_ID: ++ rval = (dev->d_id.b24 != ++ fcport->d_id.b24); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ rval = memcmp(dev->name, ++ fcport->node_name, ++ WWN_SIZE); ++ break; ++ } ++ if (rval) { ++ i++; ++ continue; ++ } ++ ++ /* ++ * Update volatile unbound fields for PortID binding ++ * only ++ */ ++ if (ha->binding_type == BIND_BY_PORT_ID) { ++ memcpy(fcport->node_name, dev->name, WWN_SIZE); ++ memcpy(fcport->port_name, dev->wwn, WWN_SIZE); ++ } ++ ++ DEBUG(printk("%s(): Found matching port %02x%02x%02x, " ++ "device flags= 0x%x\n", ++ __func__, ++ dev->d_id.b.domain, ++ dev->d_id.b.area, ++ dev->d_id.b.al_pa, ++ dev->flag);) ++ ++ /* if device found is missing then mark it */ ++ if (dev->flag & DEV_ABSENCE) { ++ DEBUG(printk("%s(): Port missing --- " ++ "(port_name) -> " ++ "%02x%02x%02x%02x%02x" ++ "%02x%02x%02x, " ++ "loop id = 0x%04x\n", ++ __func__, ++ fcport->port_name[0], ++ fcport->port_name[1], ++ fcport->port_name[2], ++ fcport->port_name[3], ++ fcport->port_name[4], ++ fcport->port_name[5], ++ fcport->port_name[6], ++ fcport->port_name[7], ++ fcport->loop_id);) ++ ++ fcport->loop_id = FC_NO_LOOP_ID; ++ ++ qla2x00_mark_device_lost(ha, fcport); ++ ++ found++; ++ break; ++ } ++ ++ /* if device was missing but returned */ ++ if (fcport->loop_id == FC_NO_LOOP_ID || ++ !(dev->flag & DEV_PUBLIC) || ++ atomic_read(&fcport->state) != FC_ONLINE) { ++ ++ DEBUG(printk("%s(): Port returned +++ " ++ "(port_name) -> " ++ "%02x%02x%02x%02x%02x" ++ "%02x%02x%02x, " ++ "loop id = 0x%04x\n", ++ __func__, ++ fcport->port_name[0], ++ fcport->port_name[1], ++ fcport->port_name[2], ++ fcport->port_name[3], ++ fcport->port_name[4], ++ fcport->port_name[5], ++ fcport->port_name[6], ++ fcport->port_name[7], ++ fcport->loop_id);) ++ ++ fcport->loop_id = dev->loop_id; ++ fcport->old_loop_id = dev->loop_id; ++ fcport->d_id.b24 = dev->d_id.b24; ++ ++ if (qla2x00_update_fcport(ha, fcport, cnt)) { ++ DEBUG2(printk("%s(%ld): update_fcport " ++ "failed.\n", ++ __func__, ++ ha->host_no);) ++ ++ return BIT_0; ++ } ++ ++ found++; ++ break; ++ } ++ ++ DEBUG(printk("%s(): Match - fcport[%d] = fc_db[%d] " ++ "(ignored) -> " ++ "%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "loop id = 0x%04x\n", ++ __func__, ++ i, ++ cnt, ++ fcport->port_name[0], ++ fcport->port_name[1], ++ fcport->port_name[2], ++ fcport->port_name[3], ++ fcport->port_name[4], ++ fcport->port_name[5], ++ fcport->port_name[6], ++ fcport->port_name[7], ++ fcport->loop_id);) ++ ++ fcport->loop_id = dev->loop_id; ++ fcport->old_loop_id = dev->loop_id; ++ ++ found++; ++ break; ++ } ++ if (found) ++ continue; ++ ++ /* Add device to port list. */ ++ DEBUG3(printk("%s(%ld): adding new device to list.\n", ++ __func__, ++ ha->host_no);) ++ ++ fcport = kmalloc(sizeof(fc_port_t), GFP_ATOMIC); ++ if (fcport == NULL) ++ break; ++ ++ memset(fcport, 0, sizeof(fc_port_t)); ++ ++ INIT_LIST_HEAD(&fcport->fcluns); ++ ++ /* copy fields into fcport */ ++ memcpy(fcport->port_name, dev->wwn, WWN_SIZE); ++ memcpy(fcport->node_name, dev->name, WWN_SIZE); ++ ++ fcport->dev_id = cnt; ++ ++ if (dev->flag & DEV_ABSENCE) { ++ DEBUG(printk("%s(): Port missing --- " ++ "(port_name) -> " ++ "%02x%02x%02x%02x" ++ "%02x%02x%02x%02x, " ++ "loop id = 0x%04x\n", ++ __func__, ++ fcport->port_name[0], ++ fcport->port_name[1], ++ fcport->port_name[2], ++ fcport->port_name[3], ++ fcport->port_name[4], ++ fcport->port_name[5], ++ fcport->port_name[6], ++ fcport->port_name[7], ++ fcport->loop_id);) ++ ++ fcport->loop_id = FC_NO_LOOP_ID; ++ ++ qla2x00_mark_device_lost(ha, fcport); ++ } else { ++ fcport->loop_id = dev->loop_id; ++ fcport->old_loop_id = dev->loop_id; ++ } ++ ++ fcport->d_id.b24 = dev->d_id.b24; ++ ++ DEBUG(printk("%s(): New Device +++ (port_name) -> " ++ "%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "loop id = 0x%04x\n", ++ __func__, ++ fcport->port_name[0], ++ fcport->port_name[1], ++ fcport->port_name[2], ++ fcport->port_name[3], ++ fcport->port_name[4], ++ fcport->port_name[5], ++ fcport->port_name[6], ++ fcport->port_name[7], ++ fcport->loop_id);) ++ ++ /* flags */ ++ if (dev->flag & DEV_PUBLIC) ++ fcport->flags |= FC_FABRIC_DEVICE; ++ ++ if (dev->flag & DEV_INITIATOR) ++ fcport->flags |= FC_INITIATOR_DEVICE; ++ ++ /* Assume the device supports RLC */ ++ fcport->flags |= FC_SUPPORT_RPT_LUNS; ++ ++ if (!ha->flags.failover_enabled) ++ qla2x00_get_lun_mask_from_config(ha, fcport, cnt, 0); ++ ++ /* Add to our list */ ++ list_add_tail(&fcport->list, &ha->fcports); ++ ++ if (qla2x00_update_fcport(ha, fcport, cnt)) { ++ DEBUG2(printk("%s(%ld): update_fcport failed.\n", ++ __func__, ++ ha->host_no);) ++ ++ return BIT_0; ++ } ++ } ++ ++ LEAVE(__func__); ++ ++ return (0); ++} ++ ++/* ++ * qla2x00_config_os ++ * Setup OS target and LUN structures. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_config_os(scsi_qla_host_t *ha) ++{ ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ struct list_head *fcll; ++ fc_lun_t *fclun; ++ os_lun_t *lq; ++ uint16_t t, l; ++ ++ ++ DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);) ++ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ /* Allocate target */ ++#if 0 ++ if (fcport->loop_id == FC_NO_LOOP_ID) ++ continue; ++#endif ++ ++ /* Bind fcport to target number. */ ++ DEBUG5(printk("%s(%ld): fcport bind= %p\n", ++ __func__, ++ ha->host_no, fcport);) ++ ++ if ((t = qla2x00_fcport_bind(ha, fcport)) == MAX_TARGETS) ++ continue; ++ ++#if VSA ++ if ((ha->fc_db[t].flag & DEV_FLAG_VSA)) ++ fcport->flags |= FC_VSA; ++#endif ++ DEBUG5(printk("%s(%ld): going to alloc lun for tgt %d. mask=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" ++ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" ++ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" ++ ".\n", ++ __func__, ++ ha->host_no, ++ t, ++ fcport->lun_mask.mask[0], ++ fcport->lun_mask.mask[1], ++ fcport->lun_mask.mask[2], ++ fcport->lun_mask.mask[3], ++ fcport->lun_mask.mask[4], ++ fcport->lun_mask.mask[5], ++ fcport->lun_mask.mask[6], ++ fcport->lun_mask.mask[7], ++ fcport->lun_mask.mask[8], ++ fcport->lun_mask.mask[9], ++ fcport->lun_mask.mask[10], ++ fcport->lun_mask.mask[11], ++ fcport->lun_mask.mask[12], ++ fcport->lun_mask.mask[13], ++ fcport->lun_mask.mask[14], ++ fcport->lun_mask.mask[15], ++ fcport->lun_mask.mask[16], ++ fcport->lun_mask.mask[17], ++ fcport->lun_mask.mask[18], ++ fcport->lun_mask.mask[19], ++ fcport->lun_mask.mask[20], ++ fcport->lun_mask.mask[21], ++ fcport->lun_mask.mask[22], ++ fcport->lun_mask.mask[23], ++ fcport->lun_mask.mask[24], ++ fcport->lun_mask.mask[25], ++ fcport->lun_mask.mask[26], ++ fcport->lun_mask.mask[27], ++ fcport->lun_mask.mask[28], ++ fcport->lun_mask.mask[29], ++ fcport->lun_mask.mask[30], ++ fcport->lun_mask.mask[31]);) ++ ++ /* Allocate LUNs */ ++ list_for_each(fcll, &fcport->fcluns) { ++ fclun = list_entry(fcll, fc_lun_t, list); ++ ++ l = fclun->lun; /* Must not exceed MAX_LUN */ ++ ++ /* ++ * Always alloc LUN 0 so kernel will scan past LUN 0. ++ */ ++ if (l != 0 && ++ (EXT_IS_LUN_BIT_SET(&(fcport->lun_mask), l))) { ++ ++ /* mask this LUN */ ++ continue; ++ } ++ ++ if ((lq = qla2x00_lun_alloc(ha, t, l)) == NULL) ++ continue; ++ ++ lq->fclun = fclun; ++ } ++ } ++ ++ DEBUG3(printk("%s(%ld): exiting normally.\n", __func__, ha->host_no);) ++} ++ ++/* ++ * qla2x00_fcport_bind ++ * Locates a target number for FC port. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * fcport = FC port structure pointer. ++ * ++ * Returns: ++ * target number ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint16_t ++qla2x00_fcport_bind(scsi_qla_host_t *ha, fc_port_t *fcport) ++{ ++ int rval; ++ uint16_t t; ++ os_tgt_t *tq; ++ ++ ENTER(__func__); ++ ++ /* Check for tgt already allocated for persistent binding. */ ++ for (t = 0; t < MAX_TARGETS; t++) { ++ if ((tq = TGT_Q(ha, t)) == NULL) ++ continue; ++ ++ rval = 0; ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ rval = memcmp(fcport->port_name, ++ tq->port_name, WWN_SIZE); ++ break; ++ ++ case BIND_BY_PORT_ID: ++ rval = (fcport->d_id.b24 != tq->d_id.b24); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ rval = memcmp(fcport->node_name, ++ tq->node_name, WWN_SIZE); ++ break; ++ } ++ /* Found a persistently bound match */ ++ if (rval == 0) ++ break; ++ } ++ ++ if (fcport->loop_id == FC_NO_LOOP_ID) { ++ DEBUG(tq = TGT_Q(ha, t);) ++ DEBUG(printk("scsi%ld: Missing target ID %02x @ %p to " ++ "loop id: %04x, port state=0x%x, " ++ "port down retry=%d\n", ++ ha->host_no, ++ t, ++ tq, ++ fcport->loop_id, ++ atomic_read(&fcport->state), ++ atomic_read(&fcport->port_down_timer));) ++ return (MAX_TARGETS); ++ } ++ ++ if (t != MAX_TARGETS) { ++ tq = TGT_Q(ha, t); ++ tq->vis_port = fcport; ++ ++ DEBUG(printk("scsi%ld: Assigning target ID %02x @ %p to " ++ "loop id: %04x, port state=0x%x, " ++ "port down retry=%d\n", ++ ha->host_no, ++ t, ++ tq, ++ fcport->loop_id, ++ atomic_read(&fcport->state), ++ atomic_read(&fcport->port_down_timer));) ++ return (t); ++ } ++ ++ /* Check for persistent binding not yet configured. */ ++ for (t = 0; t < MAX_TARGETS; t++) { ++ rval = 0; ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ rval = memcmp(fcport->port_name, ++ ha->fc_db[t].wwn, WWN_SIZE); ++ break; ++ ++ case BIND_BY_PORT_ID: ++ rval = (fcport->d_id.b24 != ++ ha->fc_db[t].d_id.b24); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ rval = memcmp(fcport->node_name, ++ ha->fc_db[t].name, WWN_SIZE); ++ break; ++ } ++ /* Found not-yet-allocated target at t */ ++ if (rval == 0) ++ break; ++ } ++ ++ if (t == MAX_TARGETS) { ++ /* Check if slot at loop ID is available. */ ++ t = fcport->loop_id; ++ if (TGT_Q(ha, t) != NULL) { ++ /* Locate first free target id in db for device. */ ++ for (t = 0; t < MAX_TARGETS; t++) { ++ if (TGT_Q(ha, t) == NULL) ++ break; ++ } ++ } ++ } ++ ++ if (t != MAX_TARGETS) { ++ tq = qla2x00_tgt_alloc(ha, t); ++ if (tq != NULL) { ++ memcpy(tq->port_name, fcport->port_name, WWN_SIZE); ++ tq->d_id.b24 = fcport->d_id.b24; ++ memcpy(tq->node_name, fcport->node_name, WWN_SIZE); ++ } ++ else ++ t = MAX_TARGETS; ++ } ++ ++ if (t == MAX_TARGETS) { ++ DEBUG2(printk("%s(): **** FAILED ****", __func__);) ++ printk(KERN_WARNING ++ "%s(): **** FAILED ****", __func__); ++ } else { ++ if (!ha->flags.failover_enabled) { ++ /* fcport IS the visible port in non-failover mode */ ++ tq = TGT_Q(ha, t); ++ tq->vis_port = fcport; ++ } ++ ++ DEBUG(tq = TGT_Q(ha, t);) ++ DEBUG(printk("scsi%ld: Assigning target ID %02x @ %p to " ++ "loop id: %04x, port state=0x%x, " ++ "port down retry=%d\n", ++ ha->host_no, ++ t, ++ tq, ++ fcport->loop_id, ++ atomic_read(&fcport->state), ++ atomic_read(&fcport->port_down_timer));) ++ } ++ ++ LEAVE(__func__); ++ ++ return (t); ++} ++ ++/* ++ * qla2x00_update_fcport ++ * Updates device on list. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * fcport = port structure pointer. ++ * ++ * Return: ++ * 0 - Success ++ * BIT_0 - error ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_update_fcport(scsi_qla_host_t *ha, fc_port_t *fcport, int index) ++{ ++ DEBUG4(printk("%s(): entered, loop_id = %d\n", ++ __func__, ++ fcport->loop_id);) ++ ++ fcport->port_login_retry_count = ++ ha->port_down_retry_count * PORT_RETRY_TIME; ++ atomic_set(&fcport->state, FC_ONLINE); ++ fcport->login_retry = 0; ++ fcport->ha = ha; ++ atomic_set(&fcport->port_down_timer, ++ ha->port_down_retry_count * PORT_RETRY_TIME); ++ ++ /* Do LUN discovery. */ ++ return (qla2x00_lun_discovery(ha, fcport, index)); ++} ++ ++/* ++ * qla2x00_lun_discovery ++ * Issue SCSI inquiry command for LUN discovery. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * fcport = FC port structure pointer. ++ * ++ * Return: ++ * 0 - Success ++ * BIT_0 - error ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport, int index) ++{ ++ inq_cmd_rsp_t *pkt; ++ int rval; ++ uint16_t lun; ++ struct list_head *fcll; ++ fc_lun_t *fclun; ++ int found; ++ dma_addr_t phys_address = 0; ++ int disconnected; ++ int retry; ++ fcdev_t dev; ++ int rlc_succeeded; ++ uint16_t comp_status; ++ uint16_t scsi_status; ++ ++ ENTER(__func__); ++ ++ /* ++ * Immediately issue a RLC to the fcport ++ */ ++ rlc_succeeded = 0; ++ if (qla2x00_rpt_lun_discovery(ha, fcport) == QLA2X00_SUCCESS) { ++ /* ++ * We always need at least LUN 0 to be present in our fclun ++ * list if RLC succeeds. ++ */ ++ qla2x00_cfg_lun(fcport, 0); ++ /* ++ * At least do an inquiry on LUN 0 to determine peripheral ++ * qualifier type. ++ */ ++ rlc_succeeded = 1; ++ } ++ ++ /* ++ * RLC failed for some reason, try basic inquiries ++ */ ++ pkt = pci_alloc_consistent(ha->pdev, ++ sizeof(inq_cmd_rsp_t), &phys_address); ++ if (pkt == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - INQ\n", ++ ha->host_no); ++ ++ ha->mem_err++; ++ return BIT_0; ++ } ++ ++ for (lun = 0; lun < ha->max_probe_luns; lun++) { ++ retry = 2; ++ do { ++ memset(pkt, 0, sizeof(inq_cmd_rsp_t)); ++ pkt->p.cmd.entry_type = COMMAND_A64_TYPE; ++ pkt->p.cmd.entry_count = 1; ++ pkt->p.cmd.lun = cpu_to_le16(lun); ++#if defined(EXTENDED_IDS) ++ pkt->p.cmd.target = cpu_to_le16(fcport->loop_id & 0xFF); ++#else ++ pkt->p.cmd.target = (uint8_t)fcport->loop_id; ++#endif ++ pkt->p.cmd.control_flags = ++ __constant_cpu_to_le16(CF_READ | CF_SIMPLE_TAG); ++ pkt->p.cmd.scsi_cdb[0] = INQ_SCSI_OPCODE; ++ pkt->p.cmd.scsi_cdb[4] = INQ_DATA_SIZE; ++ pkt->p.cmd.dseg_count = __constant_cpu_to_le16(1); ++ pkt->p.cmd.timeout = __constant_cpu_to_le16(10); ++ pkt->p.cmd.byte_count = ++ __constant_cpu_to_le32(INQ_DATA_SIZE); ++ pkt->p.cmd.dseg_0_address[0] = cpu_to_le32( ++ LSD(phys_address + sizeof(sts_entry_t))); ++ pkt->p.cmd.dseg_0_address[1] = cpu_to_le32( ++ MSD(phys_address + sizeof(sts_entry_t))); ++ pkt->p.cmd.dseg_0_length = ++ __constant_cpu_to_le32(INQ_DATA_SIZE); ++ ++ DEBUG5(printk("scsi(%ld): Lun Inquiry - fcport=%p," ++ " lun (%d)\n", ++ ha->host_no, fcport, lun)); ++ ++ rval = qla2x00_issue_iocb(ha, ++ pkt, phys_address, sizeof(inq_cmd_rsp_t)); ++ ++ comp_status = le16_to_cpu(pkt->p.rsp.comp_status); ++ scsi_status = le16_to_cpu(pkt->p.rsp.scsi_status); ++ ++ DEBUG5(printk("scsi(%ld): lun (%d) inquiry - " ++ "inq[0]= 0x%x, comp status 0x%x, scsi status 0x%x, " ++ "rval=%d\n", ++ ha->host_no, ++ lun, pkt->inq[0], ++ comp_status, scsi_status, rval)); ++ ++ /* if port not logged in then try and login */ ++ if (lun == 0 && comp_status == CS_PORT_LOGGED_OUT) { ++ memset(&dev, 0, sizeof (dev)); ++ dev.d_id.b24 = ha->fc_db[index].d_id.b24; ++ ++ /* login and update database */ ++ if (qla2x00_fabric_login(ha, &dev) == 0) ++ ha->fc_db[index].loop_id = dev.loop_id; ++ } ++ } while ((rval != QLA2X00_SUCCESS || ++ comp_status != CS_COMPLETE) && retry--); ++ ++ if (rval != QLA2X00_SUCCESS || ++ comp_status != CS_COMPLETE || ++ (scsi_status & SS_CHECK_CONDITION)) { ++ ++ DEBUG(printk("scsi(%ld): Failed lun inquiry - " ++ "inq[0]= 0x%x, comp status 0x%x, scsi status 0x%x. " ++ "loop_id=%d\n", ++ ha->host_no, ++ pkt->inq[0], ++ comp_status, scsi_status, ++ fcport->loop_id)); ++ ++ break; ++ } ++ ++ disconnected = 0; ++ ++ /* ++ * We only need to issue an inquiry on LUN 0 to determine the ++ * port's peripheral qualifier type ++ */ ++ if (rlc_succeeded == 1) { ++ if (pkt->inq[0] == 0 || pkt->inq[0] == 0xc) { ++ fcport->flags &= ~(FC_TAPE_DEVICE); ++ ha->fc_db[index].flag &= ~DEV_TAPE_DEVICE; ++ } else if (pkt->inq[0] == 1 || pkt->inq[0] == 8) { ++ fcport->flags |= FC_TAPE_DEVICE; ++ ha->fc_db[index].flag |= DEV_TAPE_DEVICE; ++ } ++ ++ /* Stop the scan */ ++ break; ++ } ++ ++ /* inq[0] ==: ++ * 0x0- Hard Disk. ++ * 0xc- is a processor device. ++ * 0x1- is a Tape Device. ++ * 0x8- is a medium changer device ++ * which is basically a Tape device. ++ */ ++ if (pkt->inq[0] == 0 || pkt->inq[0] == 0xc) { ++ fcport->flags &= ~(FC_TAPE_DEVICE); ++ ha->fc_db[index].flag &= ~DEV_TAPE_DEVICE; ++ } else if (pkt->inq[0] == 1 || pkt->inq[0] == 8) { ++ fcport->flags |= FC_TAPE_DEVICE; ++ ha->fc_db[index].flag |= DEV_TAPE_DEVICE; ++ } else if (pkt->inq[0] == 0x20 || pkt->inq[0] == 0x7f) { ++ disconnected++; ++ } else { ++ continue; ++ } ++ ++ /* Allocate LUN if not already allocated. */ ++ found = 0; ++ list_for_each(fcll, &fcport->fcluns) { ++ fclun = list_entry(fcll, fc_lun_t, list); ++ ++ if (fclun->lun == lun) { ++ found++; ++ break; ++ } ++ } ++ if (found) ++ continue; ++ ++ /* Add this lun to our list */ ++ fclun = kmalloc(sizeof(fc_lun_t), GFP_ATOMIC); ++ if (fclun != NULL) { ++ fcport->lun_cnt++; ++ /* Setup LUN structure. */ ++ memset(fclun, 0, sizeof(fc_lun_t)); ++ ++ fclun->fcport = fcport; ++ fclun->lun = lun; ++ ++ if (disconnected) ++ fclun->flags |= FC_DISCON_LUN; ++ ++ list_add_tail(&fclun->list, &fcport->fcluns); ++ ++ DEBUG5(printk("scsi(%ld): Allocated fclun %p, lun=%d" ++ "disconnected=%d\n", ++ ha->host_no, ++ fclun, ++ fclun->lun, ++ disconnected)); ++ } else { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - fclun\n", ++ ha->host_no); ++ ++ ha->mem_err++; ++ pci_free_consistent(ha->pdev, ++ sizeof(inq_cmd_rsp_t), pkt, phys_address); ++ ++ return BIT_0; ++ } ++ ++ } ++ ++ DEBUG(printk("scsi(%ld): fcport lun count=%d, fcport= %p\n", ++ ha->host_no, fcport->lun_cnt, fcport)); ++ ++ pci_free_consistent(ha->pdev, sizeof(inq_cmd_rsp_t), pkt, phys_address); ++ ++ LEAVE(__func__); ++ ++ return 0; ++} ++ ++/* ++ * qla2x00_rpt_lun_discovery ++ * Issue SCSI report LUN command for LUN discovery. ++ * ++ * Input: ++ * ha: adapter state pointer. ++ * fcport: FC port structure pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_rpt_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport) ++{ ++ rpt_lun_cmd_rsp_t *pkt; ++ dma_addr_t phys_address = 0; ++ int rval; ++ uint32_t len, cnt; ++ uint8_t retries; ++ uint16_t lun; ++ uint16_t comp_status; ++ uint16_t scsi_status; ++ ++ ENTER(__func__); ++ ++ /* Assume a failed status */ ++ rval = QLA2X00_FAILED; ++ ++ /* No point in continuing if the device doesn't support RLC */ ++ if (!(fcport->flags & FC_SUPPORT_RPT_LUNS)) ++ return (rval); ++ ++ pkt = pci_alloc_consistent(ha->pdev, ++ sizeof(rpt_lun_cmd_rsp_t), &phys_address); ++ if (pkt == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - RLC", ++ ha->host_no); ++ ++ ha->mem_err++; ++ return BIT_0; ++ } ++ ++ for (retries = 4; retries; retries--) { ++ memset(pkt, 0, sizeof(rpt_lun_cmd_rsp_t)); ++ pkt->p.cmd.entry_type = COMMAND_A64_TYPE; ++ pkt->p.cmd.entry_count = 1; ++#if defined(EXTENDED_IDS) ++ pkt->p.cmd.target = cpu_to_le16(fcport->loop_id & 0xFF); ++#else ++ pkt->p.cmd.target = (uint8_t)fcport->loop_id; ++#endif ++ pkt->p.cmd.control_flags = ++ __constant_cpu_to_le16(CF_READ | CF_SIMPLE_TAG); ++ pkt->p.cmd.scsi_cdb[0] = RPT_LUN_SCSI_OPCODE; ++ pkt->p.cmd.scsi_cdb[8] = MSB(sizeof(rpt_lun_lst_t)); ++ pkt->p.cmd.scsi_cdb[9] = LSB(sizeof(rpt_lun_lst_t)); ++ pkt->p.cmd.dseg_count = __constant_cpu_to_le16(1); ++ pkt->p.cmd.timeout = __constant_cpu_to_le16(10); ++ pkt->p.cmd.byte_count = ++ __constant_cpu_to_le32(sizeof(rpt_lun_lst_t)); ++ pkt->p.cmd.dseg_0_address[0] = cpu_to_le32( ++ LSD(phys_address + sizeof(sts_entry_t))); ++ pkt->p.cmd.dseg_0_address[1] = cpu_to_le32( ++ MSD(phys_address + sizeof(sts_entry_t))); ++ pkt->p.cmd.dseg_0_length = ++ __constant_cpu_to_le32(sizeof(rpt_lun_lst_t)); ++ ++ rval = qla2x00_issue_iocb(ha, ++ pkt, phys_address, sizeof(rpt_lun_cmd_rsp_t)); ++ ++ comp_status = le16_to_cpu(pkt->p.rsp.comp_status); ++ scsi_status = le16_to_cpu(pkt->p.rsp.scsi_status); ++ ++ if (rval != QLA2X00_SUCCESS || ++ comp_status != CS_COMPLETE || ++ scsi_status & SS_CHECK_CONDITION) { ++ ++ /* Device underrun, treat as OK. */ ++ if (comp_status == CS_DATA_UNDERRUN && ++ scsi_status & SS_RESIDUAL_UNDER) { ++ ++ rval = QLA2X00_SUCCESS; ++ break; ++ } ++ ++ DEBUG(printk("scsi(%ld): RLC failed to issue iocb! " ++ "fcport = %p rval = %x cs = %x ss = %x\n", ++ ha->host_no, ++ fcport, ++ rval, comp_status, scsi_status)); ++ ++ rval = QLA2X00_FAILED; ++ if (scsi_status & SS_CHECK_CONDITION) { ++ DEBUG2(printk("scsi(%ld): RLC " ++ "SS_CHECK_CONDITION Sense Data " ++ "%02x %02x %02x %02x %02x %02x %02x %02x\n", ++ ha->host_no, ++ pkt->p.rsp.req_sense_data[0], ++ pkt->p.rsp.req_sense_data[1], ++ pkt->p.rsp.req_sense_data[2], ++ pkt->p.rsp.req_sense_data[3], ++ pkt->p.rsp.req_sense_data[4], ++ pkt->p.rsp.req_sense_data[5], ++ pkt->p.rsp.req_sense_data[6], ++ pkt->p.rsp.req_sense_data[7])); ++ /* No point in retrying if ILLEGAL REQUEST */ ++ if (pkt->p.rsp.req_sense_data[2] == ++ ILLEGAL_REQUEST) { ++ /* Clear RLC support flag */ ++ fcport->flags &= ~(FC_SUPPORT_RPT_LUNS); ++ break; ++ } ++ } ++ } else { ++ break; ++ } ++ } ++ ++ /* Test for report LUN failure. */ ++ if (rval == QLA2X00_SUCCESS) { ++ /* Configure LUN list. */ ++ len = be32_to_cpu(pkt->list.hdr.len); ++ len /= 8; ++ if (len == 0) { ++ rval = QLA2X00_FAILED; ++ } else { ++ for (cnt = 0; cnt < len; cnt++) { ++ lun = CHAR_TO_SHORT(pkt->list.lst[cnt].lsb, ++ pkt->list.lst[cnt].msb.b); ++ ++ DEBUG3(printk("scsi(%ld): RLC lun = (%d)\n", ++ ha->host_no, lun)); ++ ++ /* We only support 0 through MAX_LUNS-1 range */ ++ if (lun < MAX_LUNS) { ++ qla2x00_cfg_lun(fcport, lun); ++ } ++ } ++ rval = QLA2X00_SUCCESS; ++ } ++ } else { ++ rval = QLA2X00_FAILED; ++ } ++ ++ pci_free_consistent(ha->pdev, ++ sizeof(rpt_lun_cmd_rsp_t), pkt, phys_address); ++ ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_cfg_lun ++ * Configures LUN into fcport LUN list. ++ * ++ * Input: ++ * fcport: FC port structure pointer. ++ * lun: LUN number. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_cfg_lun(fc_port_t *fcport, uint16_t lun) ++{ ++ int found; ++ struct list_head *fcll; ++ fc_lun_t *fclun; ++ ++ /* Allocate LUN if not already allocated. */ ++ found = 0; ++ list_for_each(fcll, &fcport->fcluns) { ++ fclun = list_entry(fcll, fc_lun_t, list); ++ ++ if (fclun->lun == lun) { ++ found++; ++ break; ++ } ++ } ++ if (!found) { ++ fclun = kmalloc(sizeof(fc_lun_t), GFP_ATOMIC); ++ if (fclun != NULL) { ++ fcport->lun_cnt++; ++ /* Setup LUN structure. */ ++ memset(fclun, 0, sizeof(fc_lun_t)); ++ fclun->fcport = fcport; ++ fclun->lun = lun; ++ /* How dow we assign the following */ ++ /* fclun->state = FCS_ONLINE; */ ++ ++ list_add_tail(&fclun->list, &fcport->fcluns); ++ } else { ++ printk(KERN_WARNING ++ "%s(): Memory Allocation failed - FCLUN\n", ++ __func__); ++ } ++ } ++} ++ ++/* ++ * qla2x00_tgt_alloc ++ * Allocate and pre-initialize target queue. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * t = SCSI target number. ++ * ++ * Returns: ++ * NULL = failure ++ * ++ * Context: ++ * Kernel context. ++ */ ++os_tgt_t * ++qla2x00_tgt_alloc(scsi_qla_host_t *ha, uint16_t t) ++{ ++ os_tgt_t *tq; ++ ++ ENTER(__func__); ++ ++ /* ++ * If SCSI addressing OK, allocate TGT queue and lock. ++ */ ++ if (t >= MAX_TARGETS) { ++ DEBUG2(printk("%s(%ld): *** Invalid target number, exiting ***", ++ __func__, ++ ha->host_no);) ++ return (NULL); ++ } ++ ++ tq = TGT_Q(ha, t); ++ if (tq == NULL) { ++ tq = kmalloc(sizeof(os_tgt_t), GFP_ATOMIC); ++ if (tq != NULL) { ++ DEBUG(printk("Alloc Target %d @ %p\n", t, tq);) ++ ++ memset(tq, 0, sizeof(os_tgt_t)); ++ tq->flags = TGT_TAGGED_QUEUE; ++ tq->ha = ha; ++ ++ TGT_Q(ha, t) = tq; ++ } ++ } ++ if (tq != NULL) { ++ tq->port_down_retry_count = ha->port_down_retry_count; ++ } else { ++ printk(KERN_WARNING ++ "%s(%ld): Failed to allocate target\n", ++ __func__, ++ ha->host_no); ++ ha->mem_err++; ++ } ++ ++ LEAVE(__func__); ++ ++ return (tq); ++} ++ ++/* ++ * qla2x00_tgt_free ++ * Frees target and LUN queues. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * t = SCSI target number. ++ * ++ * Context: ++ * Kernel context. ++ */ ++void ++qla2x00_tgt_free(scsi_qla_host_t *ha, uint16_t t) ++{ ++ os_tgt_t *tq; ++ uint16_t l; ++ ++ ENTER(__func__); ++ ++ /* ++ * If SCSI addressing OK, allocate TGT queue and lock. ++ */ ++ if (t >= MAX_TARGETS) { ++ DEBUG2(printk("%s(): **** FAILED exiting ****", __func__);) ++ ++ return; ++ } ++ ++ tq = TGT_Q(ha, t); ++ if (tq != NULL) { ++ TGT_Q(ha, t) = NULL; ++ DEBUG(printk("Dealloc target @ %p -- deleted\n", tq);) ++ ++ /* Free LUN structures. */ ++ for (l = 0; l < MAX_LUNS; l++) ++ qla2x00_lun_free(ha, t, l); ++ ++ kfree(tq); ++ } ++ ++ LEAVE(__func__); ++ ++ return; ++} ++ ++/* ++ * qla2x00_lun_alloc ++ * Allocate and initialize LUN queue. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * t = SCSI target number. ++ * l = LUN number. ++ * ++ * Returns: ++ * NULL = failure ++ * ++ * Context: ++ * Kernel context. ++ */ ++os_lun_t * ++qla2x00_lun_alloc(scsi_qla_host_t *ha, uint16_t t, uint16_t l) ++{ ++ os_lun_t *lq; ++ ++ ENTER(__func__); ++ ++ /* ++ * If SCSI addressing OK, allocate LUN queue. ++ */ ++ if (t >= MAX_TARGETS || ++ l >= MAX_LUNS || ++ TGT_Q(ha, t) == NULL) { ++ ++ DEBUG2(printk("%s(): tgt=%d, tgt_q= %p, lun=%d, " ++ "instance=%ld **** FAILED exiting ****\n", ++ __func__, ++ t, ++ TGT_Q(ha,t), ++ l, ++ ha->instance);) ++ ++ return (NULL); ++ } ++ ++ lq = LUN_Q(ha, t, l); ++ if (lq == NULL) { ++ lq = kmalloc(sizeof(os_lun_t), GFP_ATOMIC); ++ if (lq != NULL) { ++ ++ DEBUG5(printk("Alloc Lun %d @ %p \n",l,lq);) ++ ++ memset(lq, 0, sizeof (os_lun_t)); ++ LUN_Q(ha, t, l) = lq; ++ /* ++ * The following lun queue initialization code ++ * must be duplicated in alloc_ioctl_mem function ++ * for ioctl_lq. ++ */ ++ lq->q_state = LUN_STATE_READY; ++ spin_lock_init(&lq->q_lock); ++ } else { ++ /*EMPTY*/ ++ DEBUG2(printk("%s(): Failed to allocate lun %d ***\n", ++ __func__, ++ l);) ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - FCLUN\n", ++ ha->host_no); ++ ha->mem_err++; ++ } ++ } ++ ++ if (lq == NULL) { ++ DEBUG2(printk("%s(): **** FAILED exiting ****\n", __func__);) ++ } else { ++ LEAVE(__func__); ++ } ++ ++ return (lq); ++} ++ ++/* ++ * qla2x00_lun_free ++ * Frees LUN queue. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * t = SCSI target number. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_lun_free(scsi_qla_host_t *ha, uint16_t t, uint16_t l) ++{ ++ os_lun_t *lq; ++ ++ ENTER(__func__); ++ ++ /* ++ * If SCSI addressing OK, allocate TGT queue and lock. ++ */ ++ if (t >= MAX_TARGETS || l >= MAX_LUNS) { ++ DEBUG2(printk("%s(): **** FAILED exiting ****", __func__);) ++ ++ return; ++ } ++ ++ if (TGT_Q(ha, t) != NULL && ++ (lq = LUN_Q(ha, t, l)) != NULL) { ++ ++ LUN_Q(ha, t, l) = NULL; ++ kfree(lq); ++ ++ DEBUG3(printk("Dealloc lun @ %p -- deleted\n", lq);) ++ } ++ ++ LEAVE(__func__); ++ ++ return; ++} ++ ++ ++/* ++ * qla2x00_get_lun_mask_from_config ++ * Get lun mask from the configuration parameters. ++ * Bit order is little endian. ++ * ++ * Input: ++ * ha -- Host adapter ++ * tgt -- target/device number ++ * port -- pointer to port ++ */ ++static void ++qla2x00_get_lun_mask_from_config(scsi_qla_host_t *ha, ++ fc_port_t *port, uint16_t tgt, uint16_t dev_no) ++{ ++ char propbuf[60]; /* size of search string */ ++ int rval, lun, l; ++ lun_bit_mask_t lun_mask, *mask_ptr = &lun_mask; ++ ++ /* Get "target-N-device-N-lun-mask" as a 256 bit lun_mask*/ ++ sprintf(propbuf, "scsi-qla%ld-tgt-%d-di-%d-lun-disabled", ++ ha->instance, tgt, dev_no); ++ ++ rval = qla2x00_get_prop_xstr(ha, propbuf, (uint8_t *)&lun_mask, ++ sizeof(lun_bit_mask_t)); ++ if (rval != -1 && ++ (rval == sizeof(lun_bit_mask_t))) { ++ ++ DEBUG3(printk("%s(%ld): lun mask for port %p from file:\n", ++ __func__, ++ ha->host_no, ++ port);) ++ DEBUG3(qla2x00_dump_buffer((uint8_t *)&port->lun_mask, ++ sizeof(lun_bit_mask_t));) ++ ++ for (lun = 8 * sizeof(lun_bit_mask_t) - 1, l = 0; ++ lun >= 0; ++ lun--, l++) { ++ ++ if (EXT_IS_LUN_BIT_SET(mask_ptr, lun)) ++ EXT_SET_LUN_BIT((&port->lun_mask),l); ++ else ++ EXT_CLR_LUN_BIT((&port->lun_mask),l); ++ } ++ ++ DEBUG3(printk("%s(%ld): returning lun mask for port " ++ "%02x%02x%02x%02x%02x%02x%02x%02x:\n", ++ __func__, ++ ha->host_no, ++ port->port_name[0], port->port_name[1], ++ port->port_name[2], port->port_name[3], ++ port->port_name[4], port->port_name[5], ++ port->port_name[6], port->port_name[7]);) ++ DEBUG3(qla2x00_dump_buffer((uint8_t *)&port->lun_mask, ++ sizeof(lun_bit_mask_t));) ++ } ++} ++ ++/* ++ * qla2x00_bstr_to_hex ++ * Convert hex byte string to number. ++ * ++ * Input: ++ * s = byte string pointer. ++ * bp = byte pointer for number. ++ * size = number of bytes. ++ * ++ * Context: ++ * Kernel/Interrupt context. ++ */ ++static int ++qla2x00_bstr_to_hex(char *s, uint8_t *bp, int size) ++{ ++ int cnt; ++ uint8_t n; ++ ++ ENTER(__func__); ++ ++ for (cnt = 0; *s != '\0' && cnt / 2 < size; cnt++) { ++ if (*s >= 'A' && *s <= 'F') { ++ n = (*s++ - 'A') + 10; ++ } else if (*s >= 'a' && *s <= 'f') { ++ n = (*s++ - 'a') + 10; ++ } else if (*s >= '0' && *s <= '9') { ++ n = *s++ - '0'; ++ } else { ++ cnt = 0; ++ break; ++ } ++ ++ if (cnt & BIT_0) ++ *bp++ |= n; ++ else ++ *bp = n << 4; ++ } ++ /* fixme(dg) Need to swap data little endian */ ++ ++ LEAVE(__func__); ++ ++ return (cnt / 2); ++} ++ ++/* ++ * qla2x00_get_prop_xstr ++ * Get a string property value for the specified property name and ++ * convert from the property string found in the configuration file, ++ * which are ASCII characters representing nibbles, 2 characters represent ++ * the hexdecimal value for a byte in the byte array. ++ * The byte array is initialized to zero. ++ * The resulting converted value is in big endian format (MSB at byte0). ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * propname = property name pointer. ++ * propval = pointer where to store converted property val. ++ * size = max or expected size of 'propval' array. ++ * ++ * Returns: ++ * 0 = empty value string or invalid character in string ++ * >0 = count of characters converted ++ * -1 = property not found ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_prop_xstr(scsi_qla_host_t *ha, ++ char *propname, uint8_t *propval, int size) ++{ ++ char *propstr; ++ int rval = -1; ++ static char buf[LINESIZE]; ++ ++ ENTER(__func__); ++ ++ /* Get the requested property string */ ++ rval = qla2x00_find_propname(ha, propname, buf, ha->cmdline, size*2); ++ DEBUG3(printk("%s(): Ret rval from find propname = %d\n", ++ __func__, ++ rval);) ++ ++ propstr = &buf[0]; ++ if (*propstr == '=') ++ propstr++; /* ignore equal sign */ ++ ++ if (rval == 0) { /* not found */ ++ LEAVE(__func__); ++ return (-1); ++ } ++ ++ rval = qla2x00_bstr_to_hex(propstr, (uint8_t *)propval, size); ++ if (rval == 0) { ++ /* Invalid character in value string */ ++ printk(KERN_INFO ++ "%s(): %s Invalid hex string for property\n", ++ __func__, ++ propname); ++ printk(KERN_INFO ++ " Invalid string - %s\n", ++ propstr); ++ } ++ ++ LEAVE(__func__); ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_find_propname ++ * Get property in database. ++ * ++ * Input: ++ * ha = adapter structure pointer. ++ * db = pointer to database ++ * propstr = pointer to dest array for string ++ * propname = name of property to search for. ++ * siz = size of property ++ * ++ * Returns: ++ * 0 = no property ++ * size = index of property ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint8_t ++qla2x00_find_propname(scsi_qla_host_t *ha, ++ char *propname, char *propstr, ++ char *db, int siz) ++{ ++ char *cp; ++ ++ /* find the specified string */ ++ if (db) { ++ /* find the property name */ ++ if ((cp = strstr(db,propname)) != NULL) { ++ while ((*cp) && *cp != '=') ++ cp++; ++ if (*cp) { ++ strncpy(propstr, cp, siz+1); ++ propstr[siz+1] = '\0'; ++ DEBUG(printk("qla2x00_find_propname: found " ++ "property = {%s}\n", ++ propstr);) ++ return (siz); /* match */ ++ } ++ } ++ } ++ ++ return (0); ++} ++ ++ ++/* ++ * qla2x00_get_prop_16chars ++ * Get an 8-byte property value for the specified property name by ++ * converting from the property string found in the configuration file. ++ * The resulting converted value is in big endian format (MSB at byte0). ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * propname = property name pointer. ++ * propval = pointer to location for the converted property val. ++ * db = pointer to database ++ * ++ * Returns: ++ * 0 = value returned successfully. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_prop_16chars(scsi_qla_host_t *ha, ++ char *propname, char *propval, char *db) ++{ ++ char *propstr; ++ int i, k; ++ int rval; ++ uint8_t nval; ++ uint8_t *pchar; ++ uint8_t *ret_byte; ++ uint8_t *tmp_byte; ++ uint8_t *retval = (uint8_t*)propval; ++ uint8_t tmpval[8] = {0, 0, 0, 0, 0, 0, 0, 0}; ++ uint16_t max_byte_cnt = 8; /* 16 chars = 8 bytes */ ++ uint16_t max_strlen = 16; ++ static char buf[LINESIZE]; ++ ++ rval = qla2x00_find_propname(ha, propname, buf, db, max_strlen); ++ ++ propstr = &buf[0]; ++ if (*propstr == '=') ++ propstr++; /* ignore equal sign */ ++ ++ if (rval == 0) { ++ return (1); ++ } ++ ++ /* Convert string to numbers. */ ++ pchar = (uint8_t *)propstr; ++ tmp_byte = (uint8_t *)tmpval; ++ ++ rval = 0; ++ for (i = 0; i < max_strlen; i++) { ++ /* ++ * Check for invalid character, two at a time, ++ * then convert them starting with first byte. ++ */ ++ ++ if ((pchar[i] >= '0') && (pchar[i] <= '9')) { ++ nval = pchar[i] - '0'; ++ } else if ((pchar[i] >= 'A') && (pchar[i] <= 'F')) { ++ nval = pchar[i] - 'A' + 10; ++ } else if ((pchar[i] >= 'a') && (pchar[i] <= 'f')) { ++ nval = pchar[i] - 'a' + 10; ++ } else { ++ /* invalid character */ ++ rval = 1; ++ break; ++ } ++ ++ if (i & BIT_0) { ++ *tmp_byte = *tmp_byte | nval; ++ tmp_byte++; ++ } else { ++ *tmp_byte = *tmp_byte | nval << 4; ++ } ++ } ++ ++ if (rval != 0) { ++ /* Encountered invalid character. */ ++ return (rval); ++ } ++ ++ /* Copy over the converted value. */ ++ ret_byte = retval; ++ tmp_byte = tmpval; ++ ++ i = max_byte_cnt; ++ k = 0; ++ while (i--) { ++ *ret_byte++ = *tmp_byte++; ++ } ++ ++ /* big endian retval[0]; */ ++ return (0); ++} ++ ++/* ++* qla2x00_get_properties ++* Find all properties for the specified adapeter in ++* command line. ++* ++* Input: ++* ha = adapter block pointer. ++* cmdline = pointer to command line string ++* ++* Context: ++* Kernel context. ++*/ ++static void ++qla2x00_get_properties(scsi_qla_host_t *ha, char *cmdline) ++{ ++ static char propbuf[LINESIZE]; ++ uint8_t tmp_name[8]; ++ ++ /* Adapter FC node names. */ ++ sprintf(propbuf, "scsi-qla%d-adapter-node", (int) ha->instance); ++ qla2x00_get_prop_16chars (ha, ++ propbuf, ++ (uint8_t *)(&ha->init_cb->node_name), ++ cmdline); ++ ++ sprintf(propbuf, "scsi-qla%d-adapter-port", (int) ha->instance); ++ ++ /* DG 04/07 check portname of adapter */ ++ qla2x00_get_prop_16chars (ha, ++ propbuf, ++ tmp_name, ++ cmdline); ++ if (memcmp(ha->init_cb->port_name, tmp_name, 8) != 0) { ++ /* ++ * Adapter port name is WWN, and cannot be changed. ++ * Inform users of the mismatch, then just continue driver ++ * loading using the original adapter port name in NVRAM. ++ */ ++ printk(KERN_WARNING ++ "qla2x00: qla%ld found mismatch in " ++ "adapter port names.\n", ++ ha->instance); ++ printk(KERN_INFO ++ " qla%ld port name found in NVRAM " ++ "-> %02x%02x%02x%02x%02x%02x%02x%02x\n", ++ ha->instance, ++ ha->init_cb->port_name[0], ++ ha->init_cb->port_name[1], ++ ha->init_cb->port_name[2], ++ ha->init_cb->port_name[3], ++ ha->init_cb->port_name[4], ++ ha->init_cb->port_name[5], ++ ha->init_cb->port_name[6], ++ ha->init_cb->port_name[7]); ++ printk(KERN_INFO ++ " qla%ld port name found on command line " ++ "-> %02x%02x%02x%02x%02x%02x%02x%02x\n", ++ ha->instance, ++ tmp_name[0], ++ tmp_name[1], ++ tmp_name[2], ++ tmp_name[3], ++ tmp_name[4], ++ tmp_name[5], ++ tmp_name[6], ++ tmp_name[7]); ++ printk(KERN_INFO ++ " Using port name from NVRAM.\n"); ++ } ++ ++ qla2x00_cfg_persistent_binding(ha); ++} ++ ++/* ++ * qla2x00_cfg_persistent_binding ++ * Get driver configuration file target persistent binding entries. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_cfg_persistent_binding(scsi_qla_host_t *ha) ++{ ++ int rval; ++ static char propbuf[LINESIZE]; ++ uint16_t tgt; ++ uint16_t dev_no = 0; /* not used */ ++ char *cmdline = ha->cmdline; ++ port_id_t d_id, *pd_id; ++ uint8_t portid[3]; ++ uint8_t node_name[8], *pnn; ++ uint8_t port_name[8], *ppn; ++ os_tgt_t *tq; ++ ++ ENTER(__func__); ++ ++ /* FC name for devices */ ++ for (tgt = 0; tgt < MAX_FIBRE_DEVICES; tgt++) { ++ ++ /* ++ * Retrive as much information as possible (PN/PID/NN). ++ * ++ * Based on binding type, skip incomplete entries. ++ */ ++ ppn = port_name; ++ sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-port", ++ (int)ha->instance, tgt, dev_no); ++ rval = qla2x00_get_prop_16chars(ha, propbuf, ppn, cmdline); ++ if (rval != 0) ++ ppn = NULL; ++ if (ha->binding_type == BIND_BY_PORT_NAME && rval != 0) ++ continue; ++ ++ pd_id = &d_id; ++ sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-pid", ++ (int)ha->instance, tgt, dev_no); ++ rval = qla2x00_get_prop_xstr(ha, ++ propbuf, portid, sizeof(portid)); ++ if (rval == -1 || rval != sizeof(portid)) ++ pd_id = NULL; ++ if (ha->binding_type == BIND_BY_PORT_ID && ++ (rval == -1 || rval != sizeof(portid))) ++ continue; ++ ++ pnn = node_name; ++ sprintf(propbuf, "scsi-qla%d-tgt-%d-di-%d-node", ++ (int)ha->instance, tgt, dev_no); ++ rval = qla2x00_get_prop_16chars(ha, propbuf, pnn, cmdline); ++ if (rval != 0) ++ pnn = NULL; ++ if (ha->binding_type == BIND_BY_NODE_NAME && rval != 0) ++ continue; ++ ++ tq = qla2x00_tgt_alloc(ha, tgt); ++ if (tq == NULL) { ++ printk(KERN_WARNING ++ "%s(): Unable to allocate memory for target\n", ++ __func__); ++ continue; ++ } ++ ++ ha->fc_db[tgt].loop_id = PORT_AVAILABLE; ++ ha->fc_db[tgt].flag = 0; /* v2.19.05b3 */ ++ ha->fc_db[tgt].flag |= DEV_CONFIGURED; ++ ++ if (ppn != NULL) { ++ memcpy(tq->port_name, ppn, WWN_SIZE); ++ memcpy(ha->fc_db[tgt].wwn, ppn, WWN_SIZE); ++ } ++ if (pd_id != NULL) { ++ /* ++ * The portid is read in big-endian format, convert ++ * before updating information ++ */ ++ pd_id->r.d_id[0] = portid[2]; ++ pd_id->r.d_id[1] = portid[1]; ++ pd_id->r.d_id[2] = portid[0]; ++ tq->d_id.b24 = pd_id->b24; ++ ha->fc_db[tgt].d_id.b24 = pd_id->b24; ++ } ++ if (pnn != NULL) { ++ memcpy(tq->node_name, pnn, WWN_SIZE); ++ memcpy(ha->fc_db[tgt].name, pnn, WWN_SIZE); ++ } ++ ++ DEBUG(printk("Target %03d - configured by user: ",tgt);) ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ DEBUG(printk("tgt-%03d=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ tgt, ++ ppn[0], ppn[1], ppn[2], ppn[3], ++ ppn[4], ppn[5], ppn[6], ppn[7]);) ++ break; ++ ++ case BIND_BY_PORT_ID: ++ DEBUG(printk("tgt-%03d=%02x%02x%02x\n", ++ tgt, ++ pd_id->b.domain, ++ pd_id->b.area, ++ pd_id->b.al_pa)); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ DEBUG(printk("tgt-%03d=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x\n", ++ tgt, ++ pnn[0], pnn[1], pnn[2], pnn[3], ++ pnn[4], pnn[5], pnn[6], pnn[7]);) ++ break; ++ } ++ /* look for VSA */ ++#if VSA ++ qla2x00_get_vsa_opt_from_config(ha, tgt, dev_no); ++#endif ++ ++ } ++ ++ LEAVE(__func__); ++} ++ ++/* ++* qla2x00_abort_isp ++* Resets ISP and aborts all outstanding commands. ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Returns: ++* 0 = success ++*/ ++uint8_t ++qla2x00_abort_isp(scsi_qla_host_t *ha, uint8_t flag) ++{ ++ unsigned long flags = 0; ++ uint16_t cnt; ++ srb_t *sp; ++ uint8_t status = 0; ++ ++ ENTER("qla2x00_abort_isp"); ++ ++ if (ha->flags.online) { ++ ha->flags.online = FALSE; ++ clear_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags); ++ clear_bit(COMMAND_WAIT_ACTIVE, &ha->dpc_flags); ++ clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ qla2x00_stats.ispAbort++; ++ ha->total_isp_aborts++; /* used by ioctl */ ++ ha->sns_retry_cnt = 0; ++ ++ printk(KERN_INFO ++ "scsi(%ld): Performing ISP error recovery - ha= %p.\n", ++ ha->host_no, ha); ++ qla2x00_reset_chip(ha); ++ ++ if (ha->loop_state != LOOP_DOWN) { ++ ha->loop_state = LOOP_DOWN; ++ atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); ++ qla2x00_mark_all_devices_lost(ha); ++ } ++ ++#if defined(FC_IP_SUPPORT) ++ /* Return all IP send packets */ ++ for (cnt = 0; cnt < MAX_SEND_PACKETS; cnt++) { ++ if (ha->active_scb_q[cnt] != NULL) { ++ /* Via IP callback */ ++ (*ha->send_completion_routine) ++ (ha->active_scb_q[cnt]); ++ ++ ha->active_scb_q[cnt] = NULL; ++ } ++ } ++#endif ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ /* Requeue all commands in outstanding command list. */ ++ for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { ++ sp = ha->outstanding_cmds[cnt]; ++ if (sp) { ++ ha->outstanding_cmds[cnt] = 0; ++ if( ha->actthreads ) ++ ha->actthreads--; ++ sp->lun_queue->out_cnt--; ++#if defined(IOCB_THROLLE_USAGE) ++ ha->iocb_cnt -= sp->iocb_cnt; ++#endif ++ ++ sp->flags = 0; ++ ++ /* ++ * We need to send the command back to OS now ++ * if returning RESET status for kernel's ++ * error handling. ++ */ ++ if (flag == 0) { ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ } else { ++ CMD_RESULT(sp->cmd) = DID_RESET << 16; ++ } ++ CMD_HANDLE(sp->cmd) = (unsigned char *) NULL; ++ add_to_done_queue(ha, sp); ++ } ++ } ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++#if defined(ISP2100) ++ qla2100_nvram_config(ha); ++#else ++ qla2x00_nvram_config(ha); ++#endif ++ ++ if (!qla2x00_restart_isp(ha)) { ++ clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ ++ if (!atomic_read(&ha->loop_down_timer)) { ++ /* ++ * Issue marker command only when we are going ++ * to start the I/O . ++ */ ++ ha->marker_needed = 1; ++ } ++ ++ ha->flags.online = TRUE; ++ ++#if defined(FC_IP_SUPPORT) ++ /* Reenable IP support */ ++ if (ha->flags.enable_ip) { ++ set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); ++ qla2x00_ip_initialize(ha); ++ } ++#endif ++ /* Enable ISP interrupts. */ ++ qla2x00_enable_intrs(ha); ++ ++ /* v2.19.5b6 Return all commands */ ++ qla2x00_abort_queues(ha, TRUE); ++ ++ /* Restart queues that may have been stopped. */ ++ qla2x00_restart_queues(ha,TRUE); ++ ha->isp_abort_cnt = 0; ++ clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags); ++ } else { /* failed the ISP abort */ ++ ha->flags.online = TRUE; ++ if( test_bit(ISP_ABORT_RETRY, &ha->dpc_flags) ){ ++ if( ha->isp_abort_cnt == 0 ){ ++ printk(KERN_WARNING ++ "qla2x00(%ld): ISP error recovery failed - " ++ "board disabled\n",ha->host_no); ++ /* ++ * The next call disables the board ++ * completely. ++ */ ++ qla2x00_reset_adapter(ha); ++ qla2x00_abort_queues(ha, FALSE); ++ ha->flags.online = TRUE; ++ clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags); ++ status = 0; ++ } else { /* schedule another ISP abort */ ++ ha->isp_abort_cnt--; ++ DEBUG(printk("qla%ld: ISP abort - retry remainning %d\n", ++ ha->host_no, ++ ha->isp_abort_cnt);) ++ status = 1; ++ } ++ } else { ++ ha->isp_abort_cnt = MAX_RETRIES_OF_ISP_ABORT; ++ DEBUG(printk( "qla2x00(%ld): ISP error recovery - " ++ "retrying (%d) more times\n",ha->host_no, ++ ha->isp_abort_cnt);) ++ set_bit(ISP_ABORT_RETRY, &ha->dpc_flags); ++ status = 1; ++ } ++ } ++ ++ } ++ ++ if (status) { ++ printk(KERN_INFO ++ "qla2x00_abort_isp(%ld): **** FAILED ****\n", ++ ha->host_no); ++ } else { ++ DEBUG(printk(KERN_INFO ++ "qla2x00_abort_isp(%ld): exiting.\n", ++ ha->host_no);) ++ } ++ ++ return(status); ++} ++ ++/* ++* qla2x00_restart_isp ++* restarts the ISP after a reset ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Returns: ++* 0 = success ++*/ ++static int ++qla2x00_restart_isp(scsi_qla_host_t *ha) ++{ ++ uint8_t status = 0; ++#if defined(ISP2300) ++ device_reg_t *reg; ++ unsigned long flags = 0; ++#endif ++ ++ /* If firmware needs to be loaded */ ++ if (qla2x00_isp_firmware(ha)) { ++ ha->flags.online = FALSE; ++ if (!(status = qla2x00_chip_diag(ha))) { ++#if defined(ISP2300) ++ reg = ha->iobase; ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ /* Disable SRAM, Instruction RAM and GP RAM parity. */ ++ WRT_REG_WORD(®->hccr, (HCCR_ENABLE_PARITY + 0x0)); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++#endif ++ status = qla2x00_setup_chip(ha); ++#if defined(ISP2300) ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Enable proper parity */ ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) ++ /* SRAM, Instruction RAM and GP RAM parity */ ++ WRT_REG_WORD(®->hccr, ++ (HCCR_ENABLE_PARITY + 0x7)); ++ else ++ /* SRAM parity */ ++ WRT_REG_WORD(®->hccr, ++ (HCCR_ENABLE_PARITY + 0x1)); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++#endif ++ } ++ } ++ if (!status && !(status = qla2x00_init_rings(ha))) { ++ clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ clear_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags); ++ if (!(status = qla2x00_fw_ready(ha))) { ++ DEBUG(printk("%s(): Start configure loop, " ++ "status = %d\n", ++ __func__, ++ status);) ++ ha->flags.online = TRUE; ++ do { ++ clear_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ qla2x00_configure_loop(ha); ++ } while (!atomic_read(&ha->loop_down_timer) && ++ !(test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) && ++ (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))); ++ } ++ ++ /* if no cable then assume it's good */ ++ if ((ha->device_flags & DFLG_NO_CABLE)) ++ status = 0; ++ ++ DEBUG(printk("%s(): Configure loop done, status = 0x%x\n", ++ __func__, ++ status);) ++ } ++ return (status); ++} ++ ++/* ++* qla2x00_reset_adapter ++* Reset adapter. ++* ++* Input: ++* ha = adapter block pointer. ++*/ ++static void ++qla2x00_reset_adapter(scsi_qla_host_t *ha) ++{ ++ unsigned long flags = 0; ++ device_reg_t *reg = ha->iobase; ++ ++ ENTER(__func__); ++ ++ ha->flags.online = FALSE; ++ qla2x00_disable_intrs(ha); ++ /* Reset RISC processor. */ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ WRT_REG_WORD(®->hccr, HCCR_RESET_RISC); ++ WRT_REG_WORD(®->hccr, HCCR_RELEASE_RISC); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ LEAVE(__func__); ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_inline.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,375 @@ ++/* ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ */ ++ ++ ++static __inline__ uint16_t qla2x00_debounce_register(volatile uint16_t *); ++/* ++ * qla2x00_debounce_register ++ * Debounce register. ++ * ++ * Input: ++ * port = register address. ++ * ++ * Returns: ++ * register value. ++ */ ++static __inline__ uint16_t ++qla2x00_debounce_register(volatile uint16_t *addr) ++{ ++ volatile uint16_t first; ++ volatile uint16_t second; ++ ++ do { ++ first = RD_REG_WORD(addr); ++ barrier(); ++ second = RD_REG_WORD(addr); ++ } while (first != second); ++ ++ return (first); ++} ++ ++static __inline__ void qla2x00_config_dma_addressing(scsi_qla_host_t *ha); ++ ++/** ++ * qla2x00_config_dma_addressing() - Configure OS DMA addressing method. ++ * @ha: HA context ++ * ++ * At exit, the @ha's flags.enable_64bit_addressing set to indicated ++ * supported addressing method. ++ */ ++static __inline__ void ++qla2x00_config_dma_addressing(scsi_qla_host_t *ha) ++{ ++ /* ++ * Given the two variants pci_set_dma_mask(), allow the compiler to ++ * assist in setting the proper dma mask. ++ */ ++ if (sizeof(dma_addr_t) > 4) { ++ ha->flags.enable_64bit_addressing = 1; ++ /* Update our PCI device dma_mask for full 64 bits */ ++ if (pci_set_dma_mask(ha->pdev, 0xffffffffffffffffULL)) { ++ printk("scsi(%ld): Failed to set 64 bit PCI DMA mask, " ++ "using 32 bits\n", ++ ha->host_no); ++ ha->flags.enable_64bit_addressing = 0; ++ pci_set_dma_mask(ha->pdev, 0xffffffff); ++ } ++ } ++ else { ++ ha->flags.enable_64bit_addressing = 0; ++ pci_set_dma_mask(ha->pdev, 0xffffffff); ++ } ++ printk(KERN_INFO ++ "scsi(%ld): %d Bit DMA Addressing Enabled.\n", ++ ha->host_no, ++ (ha->flags.enable_64bit_addressing ? 64 : 32)); ++} ++ ++ ++static __inline__ int qla2x00_normalize_dma_addr( ++ dma_addr_t *e_addr, uint32_t *e_len, ++ dma_addr_t *ne_addr, uint32_t *ne_len); ++ ++/** ++ * qla2x00_normalize_dma_addr() - Normalize an DMA address. ++ * @e_addr: Raw DMA address ++ * @e_len: Raw DMA length ++ * @ne_addr: Normalized second DMA address ++ * @ne_len: Normalized second DMA length ++ * ++ * If the address does not span a 4GB page boundary, the contents of @ne_addr ++ * and @ne_len are undefined. @e_len is updated to reflect a normalization. ++ * ++ * Example: ++ * ++ * ffffabc0ffffeeee (e_addr) start of DMA address ++ * 0000000020000000 (e_len) length of DMA transfer ++ * ffffabc11fffeeed end of DMA transfer ++ * ++ * Is the 4GB boundary crossed? ++ * ++ * ffffabc0ffffeeee (e_addr) ++ * ffffabc11fffeeed (e_addr + e_len - 1) ++ * 00000001e0000003 ((e_addr ^ (e_addr + e_len - 1)) ++ * 0000000100000000 ((e_addr ^ (e_addr + e_len - 1)) & ~(0xffffffff) ++ * ++ * Compute start of second DMA segment: ++ * ++ * ffffabc0ffffeeee (e_addr) ++ * ffffabc1ffffeeee (0x100000000 + e_addr) ++ * ffffabc100000000 (0x100000000 + e_addr) & ~(0xffffffff) ++ * ffffabc100000000 (ne_addr) ++ * ++ * Compute length of second DMA segment: ++ * ++ * 00000000ffffeeee (e_addr & 0xffffffff) ++ * 0000000000001112 (0x100000000 - (e_addr & 0xffffffff)) ++ * 000000001fffeeee (e_len - (0x100000000 - (e_addr & 0xffffffff)) ++ * 000000001fffeeee (ne_len) ++ * ++ * Adjust length of first DMA segment ++ * ++ * 0000000020000000 (e_len) ++ * 0000000000001112 (e_len - ne_len) ++ * 0000000000001112 (e_len) ++ * ++ * Returns non-zero if the specified address was normalized, else zero. ++ */ ++static __inline__ int ++qla2x00_normalize_dma_addr( ++ dma_addr_t *e_addr, uint32_t *e_len, ++ dma_addr_t *ne_addr, uint32_t *ne_len) ++{ ++ int normalized; ++ ++ normalized = 0; ++ if ((*e_addr ^ (*e_addr + *e_len - 1)) & ~(0xFFFFFFFFULL)) { ++ /* Compute normalized crossed address and len */ ++ *ne_addr = (0x100000000ULL + *e_addr) & ~(0xFFFFFFFFULL); ++ *ne_len = *e_len - (0x100000000ULL - (*e_addr & 0xFFFFFFFFULL)); ++ *e_len -= *ne_len; ++ ++ normalized++; ++ } ++ return (normalized); ++} ++ ++static __inline__ void qla2x00_poll(scsi_qla_host_t *); ++static inline void ++qla2x00_poll(scsi_qla_host_t *ha) ++{ ++ qla2x00_intr_handler(0, ha, NULL); ++} ++ ++ ++static __inline__ void qla2x00_enable_intrs(scsi_qla_host_t *); ++static __inline__ void qla2x00_disable_intrs(scsi_qla_host_t *); ++ ++static inline void ++qla2x00_enable_intrs(scsi_qla_host_t *ha) ++{ ++ unsigned long flags = 0; ++ device_reg_t *reg; ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ reg = ha->iobase; ++ ha->interrupts_on = 1; ++ /* enable risc and host interrupts */ ++ WRT_REG_WORD(®->ictrl, ICR_EN_INT | ICR_EN_RISC); ++ CACHE_FLUSH(®->ictrl); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++} ++ ++static inline void ++qla2x00_disable_intrs(scsi_qla_host_t *ha) ++{ ++ unsigned long flags = 0; ++ device_reg_t *reg; ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ reg = ha->iobase; ++ ha->interrupts_on = 0; ++ /* disable risc and host interrupts */ ++ WRT_REG_WORD(®->ictrl, 0); ++ CACHE_FLUSH(®->ictrl); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++} ++ ++ ++static __inline__ int qla2x00_is_wwn_zero(uint8_t *); ++ ++/* ++ * qla2x00_is_wwn_zero - Check for zero node name ++ * ++ * Input: ++ * wwn = Pointer to WW name to check ++ * ++ * Returns: ++ * TRUE if name is 0 else FALSE ++ * ++ * Context: ++ * Kernel context. ++ */ ++static __inline__ int ++qla2x00_is_wwn_zero(uint8_t *wwn) ++{ ++ int cnt; ++ ++ for (cnt = 0; cnt < WWN_SIZE ; cnt++, wwn++) { ++ if (*wwn != 0) ++ break; ++ } ++ /* if zero return TRUE */ ++ if (cnt == WWN_SIZE) ++ return (1); ++ else ++ return (0); ++} ++ ++static __inline__ uint8_t ++qla2x00_suspend_lun(scsi_qla_host_t *, os_lun_t *, int, int); ++static __inline__ uint8_t ++qla2x00_delay_lun(scsi_qla_host_t *, os_lun_t *, int); ++ ++static __inline__ uint8_t ++qla2x00_suspend_lun(scsi_qla_host_t *ha, os_lun_t *lq, int time, int count) ++{ ++ return (__qla2x00_suspend_lun(ha, lq, time, count, 0)); ++} ++ ++static __inline__ uint8_t ++qla2x00_delay_lun(scsi_qla_host_t *ha, os_lun_t *lq, int time) ++{ ++ return (__qla2x00_suspend_lun(ha, lq, time, 1, 1)); ++} ++ ++ ++ ++static __inline__ void qla2x00_chg_endian(uint8_t *, size_t); ++/* ++ * qla2x00_chg_endian ++ * Change endianess of byte array. ++ * ++ * Input: ++ * buf = array pointer. ++ * size = size of array in bytes. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static __inline__ void ++qla2x00_chg_endian(uint8_t *buf, size_t size) ++{ ++ uint8_t byte; ++ size_t cnt1; ++ size_t cnt; ++ ++ cnt1 = size - 1; ++ for (cnt = 0; cnt < size / 2; cnt++) { ++ byte = buf[cnt1]; ++ buf[cnt1] = buf[cnt]; ++ buf[cnt] = byte; ++ cnt1--; ++ } ++} ++ ++static __inline__ void qla2x00_check_fabric_devices(scsi_qla_host_t *); ++/* ++ * This routine will wait for fabric devices for ++ * the reset delay. ++ */ ++static __inline__ void qla2x00_check_fabric_devices(scsi_qla_host_t *ha) ++{ ++ uint16_t fw_state; ++ ++ qla2x00_get_firmware_state(ha, &fw_state); ++} ++ ++static inline void qla2x00_filter_command(scsi_qla_host_t *ha, srb_t *sp); ++static inline void ++qla2x00_filter_command(scsi_qla_host_t *ha, srb_t *sp) ++{ ++ Scsi_Cmnd *cp = sp->cmd; ++ uint8_t *strp; ++ ++ /* ++ * Special case considertaion on an Inquiry command (0x12) for Lun 0, ++ * device responds with no devices (0x7F), then Linux will not scan ++ * further Luns. While reporting that some device exists on Lun 0 Linux ++ * will scan all devices on this target. ++ */ ++ if (qla2xenbinq && (cp->cmnd[0] == INQUIRY) && (SCSI_LUN_32(cp) == 0)) { ++ strp = (uint8_t *)cp->request_buffer; ++ if (*strp == 0x7f) { ++ /* Make lun unassigned and processor type */ ++ *strp = 0x23; ++ } ++ } ++} ++ ++static __inline__ void * qla2x00_kmem_zalloc(int, int, int); ++/* ++ * qla2x00_kmem_zalloc ++ * Allocate and zero out the block of memory ++ */ ++static __inline__ void * ++qla2x00_kmem_zalloc(int siz, int code, int id) ++{ ++ uint8_t *bp; ++ ++ if ((bp = kmalloc(siz, code)) != NULL) { ++ memset(bp, 0, siz); ++ } ++#if QL_TRACE_MEMORY ++ if (mem_trace_ptr == 1000) ++ mem_trace_ptr = 0; ++ mem_trace[mem_trace_ptr] = (u_long ) bp; ++ mem_id[mem_trace_ptr++] = (u_long ) id; ++#endif ++ ++ return ((void *)bp); ++} ++ ++ ++static __inline__ ms_iocb_entry_t * ++qla2x00_prep_ms_iocb(scsi_qla_host_t *, uint32_t, uint32_t); ++/** ++ * qla2x00_prep_ms_iocb() - Prepare common MS IOCB fields for SNS CT query. ++ * @ha: HA context ++ * @req_size: request size in bytes ++ * @rsp_size: response size in bytes ++ * ++ * Returns a pointer to the @ha's ms_iocb. ++ */ ++static __inline__ ms_iocb_entry_t * ++qla2x00_prep_ms_iocb(scsi_qla_host_t *ha, uint32_t req_size, uint32_t rsp_size) ++{ ++ ms_iocb_entry_t *ms_pkt; ++ ++ ms_pkt = ha->ms_iocb; ++ memset(ms_pkt, 0, sizeof(ms_iocb_entry_t)); ++ ++ ms_pkt->entry_type = MS_IOCB_TYPE; ++ ms_pkt->entry_count = 1; ++#if defined(EXTENDED_IDS) ++ ms_pkt->loop_id = __constant_cpu_to_le16(SIMPLE_NAME_SERVER); ++#else ++ ms_pkt->loop_id = SIMPLE_NAME_SERVER; ++#endif ++ ms_pkt->control_flags = ++ __constant_cpu_to_le16(CF_READ | CF_HEAD_TAG); ++ ms_pkt->timeout = __constant_cpu_to_le16(25); ++ ms_pkt->cmd_dsd_count = __constant_cpu_to_le16(1); ++ ms_pkt->total_dsd_count = __constant_cpu_to_le16(2); ++ ms_pkt->rsp_bytecount = cpu_to_le32(rsp_size); ++ ms_pkt->req_bytecount = cpu_to_le32(req_size); ++ ++ ms_pkt->dseg_req_address[0] = cpu_to_le32(LSD(ha->ct_sns_dma)); ++ ms_pkt->dseg_req_address[1] = cpu_to_le32(MSD(ha->ct_sns_dma)); ++ ms_pkt->dseg_req_length = ms_pkt->req_bytecount; ++ ++ ms_pkt->dseg_rsp_address[0] = cpu_to_le32(LSD(ha->ct_sns_dma)); ++ ms_pkt->dseg_rsp_address[1] = cpu_to_le32(MSD(ha->ct_sns_dma)); ++ ms_pkt->dseg_rsp_length = ms_pkt->rsp_bytecount; ++ ++ return (ms_pkt); ++} ++ ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_iocb.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,1276 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++static inline uint16_t qla2x00_get_cmd_direction(Scsi_Cmnd *cmd); ++ ++static inline int qla2x00_cmd_build_iocb(scsi_qla_host_t *ha, ++ srb_t *sp, cmd_entry_t *cmd_pkt, uint16_t *req_q_cnt, ++ uint16_t *req_ring_index, request_t **request_ring_ptr, ++ uint16_t *tot_iocbs, uint16_t *tot_dsds); ++ ++static inline int qla2x00_cmd_build_64bit_iocbs(scsi_qla_host_t *ha, ++ srb_t *sp, cmd_entry_t *cmd_pkt, uint16_t *req_q_cnt, ++ uint16_t *req_ring_index, request_t **request_ring_ptr, ++ uint16_t *tot_iocbs, uint16_t *tot_dsds); ++ ++static inline int qla2x00_cmd_build_32bit_iocbs(scsi_qla_host_t *ha, ++ srb_t *sp, cmd_entry_t *cmd_pkt, uint16_t *req_q_cnt, ++ uint16_t *req_ring_index, request_t **request_ring_ptr, ++ uint16_t *tot_iocbs, uint16_t *tot_dsds); ++ ++static inline int qla2x00_check_request_ring(scsi_qla_host_t *ha, ++ uint16_t tot_iocbs, uint16_t req_ring_index, uint16_t *req_q_cnt); ++ ++static inline cont_a64_entry_t *qla2x00_prep_a64_cont_packet( ++ scsi_qla_host_t *ha, ++ uint16_t *req_ring_index, request_t **request_ring_ptr); ++ ++static inline cont_entry_t *qla2x00_prep_cont_packet(scsi_qla_host_t *ha, ++ uint16_t *req_ring_index, request_t **request_ring_ptr); ++ ++ ++/* Command queuing function */ ++ ++/** ++ * qla2x00_get_cmd_direction() - Determine control_flag data direction. ++ * @cmd: SCSI command ++ * ++ * This is ridiculous, the mid-layer applications should perform this step for ++ * all commands sent down through the SCSI layers. The following is a terrible ++ * hack. ++ * ++ * Returns the proper CF_* direction based on CDB. ++ */ ++static inline uint16_t ++qla2x00_get_cmd_direction(Scsi_Cmnd *cmd) ++{ ++ uint16_t cflags; ++ ++ cflags = 0; ++ ++#if defined(SANE_USAGE_OF_CMD_DIRECTION) ++ /* Set transfer direction */ ++ if (cmd->sc_data_direction == SCSI_DATA_WRITE) ++ cflags = CF_WRITE; ++ else if (cmd->sc_data_direction == SCSI_DATA_READ) ++ cflags = CF_READ; ++ else { ++ switch (cmd->data_cmnd[0]) { ++ case WRITE_6: ++ case WRITE_10: ++ case WRITE_12: ++ case WRITE_BUFFER: ++ case WRITE_LONG: ++ case WRITE_SAME: ++ case WRITE_VERIFY: ++ case WRITE_VERIFY_12: ++ case FORMAT_UNIT: ++ case SEND_VOLUME_TAG: ++ case MODE_SELECT: ++ case SEND_DIAGNOSTIC: ++ case MODE_SELECT_10: ++ cflags = CF_WRITE; ++ break; ++ default: ++ cflags = CF_READ; ++ break; ++ } ++ } ++#else ++ switch (cmd->data_cmnd[0]) { ++ case WRITE_6: ++ case WRITE_10: ++ case WRITE_12: ++ case WRITE_BUFFER: ++ case WRITE_LONG: ++ case WRITE_SAME: ++ case WRITE_VERIFY: ++ case WRITE_VERIFY_12: ++ case FORMAT_UNIT: ++ case SEND_VOLUME_TAG: ++ case MODE_SELECT: ++ case SEND_DIAGNOSTIC: ++ case MODE_SELECT_10: ++ cflags = CF_WRITE; ++ break; ++ default: ++ if (cmd->sc_data_direction == SCSI_DATA_WRITE) ++ cflags = CF_WRITE; ++ else ++ cflags = CF_READ; ++ break; ++ } ++#endif ++ ++ return (cflags); ++} ++ ++/** ++ * qla2x00_check_request_ring() - Checks request ring for additional IOCB space. ++ * @ha: HA context ++ * @tot_iocbs: Number of IOCBs required ++ * @req_ring_index: Current index to request ring ++ * @req_q_cnt: Number of free request entries ++ * ++ * Returns non-zero if no additional room available on request ring, else zero. ++ */ ++static inline int ++qla2x00_check_request_ring(scsi_qla_host_t *ha, ++ uint16_t tot_iocbs, uint16_t req_ring_index, uint16_t *req_q_cnt) ++{ ++ uint16_t ret; ++ uint16_t cnt; ++ device_reg_t *reg; ++ ++ reg = ha->iobase; ++ ++ /* If room for request in request ring for at least N IOCB */ ++ ret = 0; ++ if ((tot_iocbs + 2) >= *req_q_cnt) { ++ /* ++ * Calculate number of free request entries. ++ */ ++ cnt = RD_REG_WORD(ISP_REQ_Q_OUT(reg)); ++ if (req_ring_index < cnt) ++ *req_q_cnt = cnt - req_ring_index; ++ else ++ *req_q_cnt = REQUEST_ENTRY_CNT - (req_ring_index - cnt); ++ } ++ if ((tot_iocbs + 2) >= *req_q_cnt) { ++ DEBUG5(printk("scsi(%ld): in-ptr=%x req_q_cnt=%x " ++ "tot_iocbs=%x.\n", ++ ha->host_no, req_ring_index, *req_q_cnt, tot_iocbs)); ++ ++ ret++; ++ } ++#if defined(IOCB_THROLLE_USAGE) ++ if ((ha->iocb_cnt + tot_iocbs) >= ha->iocb_hiwat) { ++ DEBUG5(printk("%s(): Not Enough IOCBS for request. " ++ "iocb_cnt=%x, tot_iocbs=%x, hiwat=%x.\n", ++ __func__, ha->iocb_cnt, tot_iocbs, ha->iocb_hiwat)); ++#if defined(IOCB_HIT_RATE) ++ ha->iocb_overflow_cnt++; ++#endif ++ ret++; ++ } ++#endif ++ ++ return (ret); ++} ++ ++/** ++ * qla2x00_prep_a64_cont_packet() - Initialize an A64 continuation packet. ++ * @ha: HA context ++ * @req_ring_index: Current index to request ring ++ * @req_ring_ptr: Current pointer to request ring ++ * ++ * Returns a pointer to the continuation packet. ++ */ ++static inline cont_a64_entry_t * ++qla2x00_prep_a64_cont_packet(scsi_qla_host_t *ha, ++ uint16_t *req_ring_index, request_t **request_ring_ptr) ++{ ++ cont_a64_entry_t *cont_pkt; ++ ++ /* Adjust ring index. */ ++ *req_ring_index += 1; ++ if (*req_ring_index == REQUEST_ENTRY_CNT) { ++ *req_ring_index = 0; ++ *request_ring_ptr = ha->request_ring; ++ } else ++ *request_ring_ptr += 1; ++ ++ cont_pkt = (cont_a64_entry_t *)(*request_ring_ptr); ++ ++ /* Load packet defaults. */ ++ *((uint32_t *)(&cont_pkt->entry_type)) = ++ __constant_cpu_to_le32(CONTINUE_A64_TYPE); ++ //cont_pkt->entry_type = CONTINUE_A64_TYPE; ++ //cont_pkt->entry_count = 0; ++ //cont_pkt->sys_define = (uint8_t)req_ring_index; ++ ++ return (cont_pkt); ++} ++ ++/** ++ * qla2x00_prep_cont_packet() - Initialize a continuation packet. ++ * @ha: HA context ++ * @req_ring_index: Current index to request ring ++ * @req_ring_ptr: Current pointer to request ring ++ * ++ * Returns a pointer to the continuation packet. ++ */ ++static inline cont_entry_t * ++qla2x00_prep_cont_packet(scsi_qla_host_t *ha, ++ uint16_t *req_ring_index, request_t **request_ring_ptr) ++{ ++ cont_entry_t *cont_pkt; ++ ++ /* Adjust ring index. */ ++ *req_ring_index += 1; ++ if (*req_ring_index == REQUEST_ENTRY_CNT) { ++ *req_ring_index = 0; ++ *request_ring_ptr = ha->request_ring; ++ } else ++ *request_ring_ptr += 1; ++ ++ cont_pkt = (cont_entry_t *)(*request_ring_ptr); ++ ++ /* Load packet defaults. */ ++ *((uint32_t *)(&cont_pkt->entry_type)) = ++ __constant_cpu_to_le32(CONTINUE_TYPE); ++ //cont_pkt->entry_type = CONTINUE_TYPE; ++ //cont_pkt->entry_count = 0; ++ //cont_pkt->sys_define = (uint8_t)req_ring_index; ++ ++ return (cont_pkt); ++} ++ ++static inline int ++qla2x00_cmd_build_64bit_iocbs(scsi_qla_host_t *ha, ++ srb_t *sp, ++ cmd_entry_t *cmd_pkt, ++ uint16_t *req_q_cnt, ++ uint16_t *req_ring_index, request_t **request_ring_ptr, ++ uint16_t *tot_iocbs, uint16_t *tot_dsds) ++{ ++ uint16_t avail_dsds; ++ uint32_t *cur_dsd; ++ Scsi_Cmnd *cmd; ++ ++ cmd = sp->cmd; ++ ++ /* No data transfer */ ++ if (cmd->request_bufflen == 0 || ++ cmd->sc_data_direction == SCSI_DATA_NONE) { ++ cmd_pkt->byte_count = __constant_cpu_to_le32(0); ++ return (QL_STATUS_SUCCESS); ++ } ++ ++ cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(cmd)); ++ sp->dir = cmd_pkt->control_flags & ++ __constant_cpu_to_le16(CF_READ | CF_WRITE); ++ ++ /* Two DSDs are available in the command 64 IOCB */ ++ avail_dsds = 2; ++ cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address; ++ ++ /* Load data segments */ ++ if (cmd->use_sg != 0) { ++ struct scatterlist *cur_seg; ++ struct scatterlist *end_seg; ++ int nseg; ++ ++ cur_seg = (struct scatterlist *)cmd->request_buffer; ++ nseg = pci_map_sg(ha->pdev, cur_seg, cmd->use_sg, ++ scsi_to_pci_dma_dir(cmd->sc_data_direction)); ++ end_seg = cur_seg + nseg; ++ while (cur_seg < end_seg) { ++ int failed; ++ dma_addr_t sle_dma; ++ uint32_t sle_len; ++ dma_addr_t nml_dma; ++ uint32_t nml_len; ++ uint32_t normalized; ++ cont_a64_entry_t *cont_pkt; ++ ++ /* Allocate additional continuation packets? */ ++ if (avail_dsds == 0) { ++ *tot_iocbs += 1; ++ failed = qla2x00_check_request_ring(ha, ++ *tot_iocbs, ++ *req_ring_index, ++ req_q_cnt); ++ if (failed) { ++ goto mapped_queuing_error_64; ++ } ++ ++ cont_pkt = qla2x00_prep_a64_cont_packet(ha, ++ req_ring_index, ++ request_ring_ptr); ++ ++ cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address; ++ avail_dsds = 5; ++ } ++ ++ sle_dma = sg_dma_address(cur_seg); ++ sle_len = sg_dma_len(cur_seg); ++ ++ normalized = qla2x00_normalize_dma_addr( ++ &sle_dma, &sle_len, ++ &nml_dma, &nml_len); ++ ++ /* One entry always consumed */ ++ *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); ++ *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); ++ *cur_dsd++ = cpu_to_le32(sle_len); ++ *tot_dsds += 1; ++ avail_dsds--; ++ ++ cur_seg++; ++ if (!normalized) ++ continue; ++ ++ /* ++ * Allocate additional continuation packets? ++ */ ++ if (avail_dsds == 0) { ++ *tot_iocbs += 1; ++ failed = qla2x00_check_request_ring(ha, ++ *tot_iocbs, ++ *req_ring_index, ++ req_q_cnt); ++ if (failed) ++ goto mapped_queuing_error_64; ++ ++ cont_pkt = qla2x00_prep_a64_cont_packet(ha, ++ req_ring_index, ++ request_ring_ptr); ++ ++ cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address; ++ avail_dsds = 5; ++ } ++ ++ *cur_dsd++ = cpu_to_le32(LSD(nml_dma)); ++ *cur_dsd++ = cpu_to_le32(MSD(nml_dma)); ++ *cur_dsd++ = cpu_to_le32(nml_len); ++ *tot_dsds += 1; ++ avail_dsds--; ++ } ++ } ++ else { ++ /* ++ * No more than 1 (one) IOCB is needed for this type of ++ * request, even if the DMA address spans the 4GB page ++ * boundary. ++ * ++ * @tot_dsds == 1 if non-spanning, else 2 ++ */ ++ dma_addr_t req_dma; ++ uint32_t req_len; ++ dma_addr_t nml_dma; ++ uint32_t nml_len; ++ uint32_t normalized; ++ struct page *page; ++ unsigned long offset; ++ ++ page = virt_to_page(cmd->request_buffer); ++ offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK); ++ req_dma = pci_map_page(ha->pdev, ++ page, ++ offset, ++ cmd->request_bufflen, ++ scsi_to_pci_dma_dir(cmd->sc_data_direction)); ++ req_len = cmd->request_bufflen; ++ ++ sp->saved_dma_handle = req_dma; ++ ++ normalized = qla2x00_normalize_dma_addr( ++ &req_dma, &req_len, ++ &nml_dma, &nml_len); ++ ++ /* One entry always consumed */ ++ *cur_dsd++ = cpu_to_le32(LSD(req_dma)); ++ *cur_dsd++ = cpu_to_le32(MSD(req_dma)); ++ *cur_dsd++ = cpu_to_le32(req_len); ++ *tot_dsds += 1; ++ ++ if (normalized) { ++ *cur_dsd++ = cpu_to_le32(LSD(nml_dma)); ++ *cur_dsd++ = cpu_to_le32(MSD(nml_dma)); ++ *cur_dsd++ = cpu_to_le32(nml_len); ++ *tot_dsds += 1; ++ } ++ } ++ ++ return (QL_STATUS_SUCCESS); ++ ++mapped_queuing_error_64: ++ pci_unmap_sg(ha->pdev, (struct scatterlist *)cmd->request_buffer, ++ cmd->use_sg, scsi_to_pci_dma_dir(cmd->sc_data_direction)); ++ return (QL_STATUS_ERROR); ++} ++ ++static inline int ++qla2x00_cmd_build_32bit_iocbs(scsi_qla_host_t *ha, ++ srb_t *sp, ++ cmd_entry_t *cmd_pkt, ++ uint16_t *req_q_cnt, ++ uint16_t *req_ring_index, request_t **request_ring_ptr, ++ uint16_t *tot_iocbs, uint16_t *tot_dsds) ++{ ++ uint16_t avail_dsds; ++ uint32_t *cur_dsd; ++ Scsi_Cmnd *cmd; ++ ++ cmd = sp->cmd; ++ ++ /* No data transfer */ ++ if (cmd->request_bufflen == 0 || ++ cmd->sc_data_direction == SCSI_DATA_NONE) { ++ cmd_pkt->byte_count = __constant_cpu_to_le32(0); ++ return (QL_STATUS_SUCCESS); ++ } ++ ++ cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(cmd)); ++ sp->dir = cmd_pkt->control_flags & ++ __constant_cpu_to_le16(CF_READ | CF_WRITE); ++ ++ /* Three DSDs are available in the command IOCB */ ++ avail_dsds = 3; ++ cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address; ++ ++ /* Load data segments */ ++ if (cmd->use_sg != 0) { ++ struct scatterlist *cur_seg; ++ struct scatterlist *end_seg; ++ int nseg; ++ ++ cur_seg = (struct scatterlist *)cmd->request_buffer; ++ nseg = pci_map_sg(ha->pdev, cur_seg, cmd->use_sg, ++ scsi_to_pci_dma_dir(cmd->sc_data_direction)); ++ end_seg = cur_seg + nseg; ++ ++ while (cur_seg < end_seg) { ++ int failed; ++ dma_addr_t sle_dma; ++ uint32_t sle_len; ++ cont_entry_t *cont_pkt; ++ ++ /* Allocate additional continuation packets? */ ++ if (avail_dsds == 0) { ++ *tot_iocbs += 1; ++ failed = qla2x00_check_request_ring(ha, ++ *tot_iocbs, ++ *req_ring_index, ++ req_q_cnt); ++ if (failed) { ++ goto mapped_queuing_error_32; ++ } ++ ++ cont_pkt = qla2x00_prep_cont_packet(ha, ++ req_ring_index, ++ request_ring_ptr); ++ ++ cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address; ++ avail_dsds = 7; ++ } ++ ++ sle_dma = sg_dma_address(cur_seg); ++ sle_len = sg_dma_len(cur_seg); ++ ++ /* One entry always consumed */ ++ *cur_dsd++ = cpu_to_le32(sle_dma); ++ *cur_dsd++ = cpu_to_le32(sle_len); ++ *tot_dsds += 1; ++ avail_dsds--; ++ ++ cur_seg++; ++ } ++ } ++ else { ++ /* ++ * No more than 1 (one) IOCB is needed for this type of request. ++ */ ++ dma_addr_t req_dma; ++ uint32_t req_len; ++ struct page *page; ++ unsigned long offset; ++ ++ page = virt_to_page(cmd->request_buffer); ++ offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK); ++ req_dma = pci_map_page(ha->pdev, ++ page, ++ offset, ++ cmd->request_bufflen, ++ scsi_to_pci_dma_dir(cmd->sc_data_direction)); ++ req_len = cmd->request_bufflen; ++ ++ sp->saved_dma_handle = req_dma; ++ ++ /* One entry always consumed */ ++ *cur_dsd++ = cpu_to_le32(req_dma); ++ *cur_dsd++ = cpu_to_le32(req_len); ++ *tot_dsds += 1; ++ } ++ ++ return (QL_STATUS_SUCCESS); ++ ++mapped_queuing_error_32: ++ pci_unmap_sg(ha->pdev, (struct scatterlist *)cmd->request_buffer, ++ cmd->use_sg, scsi_to_pci_dma_dir(cmd->sc_data_direction)); ++ return (QL_STATUS_ERROR); ++} ++ ++static inline int ++qla2x00_cmd_build_iocb(scsi_qla_host_t *ha, ++ srb_t *sp, ++ cmd_entry_t *cmd_pkt, ++ uint16_t *req_q_cnt, ++ uint16_t *req_ring_index, request_t **request_ring_ptr, ++ uint16_t *tot_iocbs, uint16_t *tot_dsds) ++{ ++ int ret; ++ ++ ret = QL_STATUS_ERROR; ++ ++ if (ha->flags.enable_64bit_addressing) { ++ *((uint32_t *)(&cmd_pkt->entry_type)) = ++ __constant_cpu_to_le32(COMMAND_A64_TYPE); ++ //cmd_pkt->entry_type = COMMAND_A64_TYPE; ++ //cmd_pkt->entry_count = (uint8_t)tot_iocbs; ++ //cmd_pkt->sys_define = (uint8_t)ha->req_ring_index; ++ //cmd_pkt->entry_status = 0; ++ ++ ret = qla2x00_cmd_build_64bit_iocbs(ha, ++ sp, cmd_pkt, req_q_cnt, req_ring_index, request_ring_ptr, ++ tot_iocbs, tot_dsds); ++ ++ } else { ++ *((uint32_t *)(&cmd_pkt->entry_type)) = ++ __constant_cpu_to_le32(COMMAND_TYPE); ++ //cmd_pkt->entry_type = COMMAND_TYPE; ++ //cmd_pkt->entry_count = (uint8_t)tot_iocbs; ++ //cmd_pkt->sys_define = (uint8_t)ha->req_ring_index; ++ //cmd_pkt->entry_status = 0; ++ ++ ret = qla2x00_cmd_build_32bit_iocbs(ha, ++ sp, cmd_pkt, req_q_cnt, req_ring_index, request_ring_ptr, ++ tot_iocbs, tot_dsds); ++ } ++ ++ return (ret); ++} ++ ++/** ++ * qla2x00_start_scsi() - Send a SCSI command to the ISP ++ * @sp: command to send to the ISP ++ * ++ * Returns non-zero if a failure occured, else zero. ++ */ ++int ++qla2x00_start_scsi(srb_t *sp) ++{ ++ int ret; ++ unsigned long flags; ++ uint16_t failed; ++ scsi_qla_host_t *ha; ++ fc_lun_t *fclun; ++ Scsi_Cmnd *cmd; ++ uint16_t req_q_cnt; ++ uint16_t req_ring_index; ++ request_t *request_ring_ptr; ++ uint32_t *clr_ptr; ++ uint32_t found; ++ uint32_t index; ++ uint32_t handle; ++ uint16_t tot_iocbs; ++ uint16_t tot_dsds; ++ cmd_entry_t *cmd_pkt; ++ uint32_t timeout; ++ ++ device_reg_t *reg; ++ uint16_t reg_flushed; ++ ++ ENTER(__func__); ++ ++ /* Setup device pointers. */ ++ ret = 0; ++ fclun = sp->lun_queue->fclun; ++ ha = fclun->fcport->ha; ++ ++ cmd = sp->cmd; ++ reg = ha->iobase; ++ ++ DEBUG3(printk("scsi(%ld): cmd=%p sp=%p CDB=%x\n", ++ ha->host_no, ++ cmd, sp, cmd->cmnd[0])); ++ ++ /* Send marker if required */ ++ if (ha->marker_needed != 0) { ++ if (qla2x00_marker(ha, 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) { ++ return (QL_STATUS_ERROR); ++ } ++ ha->marker_needed = 0; ++ } ++ ++ /* Acquire ring specific lock */ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Save ha fields for post-update */ ++ req_ring_index = ha->req_ring_index; ++ request_ring_ptr = ha->request_ring_ptr; ++ req_q_cnt = ha->req_q_cnt; ++ ++ tot_dsds = 0; ++ tot_iocbs = 1; ++ ++ /* Allocate space for an additional IOCB */ ++ failed = qla2x00_check_request_ring(ha, ++ tot_iocbs, req_ring_index, &req_q_cnt); ++ if (failed) ++ goto queuing_error; ++ ++ /* Check for room in outstanding command list. */ ++ found = 0; ++ handle = ha->current_outstanding_cmd; ++ for (index = 1; index < MAX_OUTSTANDING_COMMANDS; index++) { ++ handle++; ++ if (handle == MAX_OUTSTANDING_COMMANDS) ++ handle = 1; ++ if (ha->outstanding_cmds[handle] == 0) { ++ found = 1; ++ ha->current_outstanding_cmd = handle; ++ break; ++ } ++ } ++ if (!found) { ++ DEBUG5(printk("scsi(%ld): Unable to queue command -- NO ROOM " ++ "IN OUTSTANDING ARRAY (req_q_cnt=%lx).\n", ++ ha->host_no, ++ (u_long)ha->req_q_cnt)); ++ goto queuing_error; ++ } ++ ++ /* ++ * Build command packet. ++ */ ++ cmd_pkt = (cmd_entry_t *)request_ring_ptr; ++ ++ cmd_pkt->handle = handle; ++ ++ /* Zero out remaining portion of packet. */ ++ clr_ptr = (uint32_t *)cmd_pkt + 2; ++ for (index = 2; index < REQUEST_ENTRY_SIZE / 4; index++) ++ *clr_ptr++ = 0; ++ ++ /* Set target ID */ ++#if defined(EXTENDED_IDS) ++ cmd_pkt->target = cpu_to_le16(fclun->fcport->loop_id & 0xFF); ++#else ++ cmd_pkt->target = (uint8_t)fclun->fcport->loop_id; ++#endif ++ ++ /* Set LUN number*/ ++#if VSA ++ if ((cmd->data_cmnd[0] == 0x26) || ++ (cmd->data_cmnd[0] == 0xA0) || ++ (cmd->data_cmnd[0] == 0xCB) ) { ++ cmd_pkt->lun = cpu_to_le16(fclun->lun); ++ } else if ((fclun->fcport->flags & FC_VSA)) ++ cmd_pkt->lun = cpu_to_le16(fclun->lun | 0x4000); ++ else ++ cmd_pkt->lun = cpu_to_le16(fclun->lun); ++#else ++ cmd_pkt->lun = cpu_to_le16(fclun->lun); ++#endif ++ ++ /* Update tagged queuing modifier */ ++ cmd_pkt->control_flags = __constant_cpu_to_le16(CF_SIMPLE_TAG); ++ if (cmd->device->tagged_queue) { ++ switch (cmd->tag) { ++ case HEAD_OF_QUEUE_TAG: ++ cmd_pkt->control_flags = ++ __constant_cpu_to_le16(CF_HEAD_TAG); ++ break; ++ case ORDERED_QUEUE_TAG: ++ cmd_pkt->control_flags = ++ __constant_cpu_to_le16(CF_ORDERED_TAG); ++ break; ++ } ++ } ++ ++ /* ++ * Allocate at least 5 (+ QLA_CMD_TIMER_DELTA) seconds for RISC timeout. ++ */ ++ timeout = (uint32_t) CMD_TIMEOUT(cmd)/HZ; ++ if (timeout > 65535) ++ cmd_pkt->timeout = __constant_cpu_to_le16(0); ++ if (timeout > 25) ++ cmd_pkt->timeout = cpu_to_le16((uint16_t)timeout - ++ (5 + QLA_CMD_TIMER_DELTA)); ++ else ++ cmd_pkt->timeout = cpu_to_le16((uint16_t)timeout); ++ ++ /* Load SCSI command packet. */ ++ memcpy(cmd_pkt->scsi_cdb, cmd->cmnd, cmd->cmd_len); ++ ++ cmd_pkt->byte_count = cpu_to_le32((uint32_t)cmd->request_bufflen); ++ ++ /* Load IOCB segments */ ++ ret = qla2x00_cmd_build_iocb(ha, ++ sp, ++ cmd_pkt, ++ &req_q_cnt, &req_ring_index, &request_ring_ptr, ++ &tot_iocbs, &tot_dsds); ++ if (ret) ++ goto queuing_error; ++ ++ /* Set total data segment count. */ ++ cmd_pkt->dseg_count = cpu_to_le16(tot_dsds); ++ cmd_pkt->entry_count = (uint8_t)tot_iocbs; ++ ++ /* Update ha fields */ ++ ha->req_ring_index = req_ring_index; ++ ha->request_ring_ptr = request_ring_ptr; ++ ha->req_q_cnt = req_q_cnt; ++ ha->req_q_cnt -= tot_iocbs; ++#if defined(IOCB_THROLLE_USAGE) ++ ha->iocb_cnt += tot_iocbs; ++ ++ sp->iocb_cnt = tot_iocbs; ++#endif ++ ++ /* Add command to the active array */ ++ ha->outstanding_cmds[handle] = sp; ++ CMD_HANDLE(sp->cmd) = (unsigned char *)(u_long)handle; ++ ++ /* Adjust ring index. */ ++ ha->req_ring_index++; ++ if (ha->req_ring_index == REQUEST_ENTRY_CNT) { ++ ha->req_ring_index = 0; ++ ha->request_ring_ptr = ha->request_ring; ++ } else ++ ha->request_ring_ptr++; ++ ++ ha->actthreads++; ++ ha->total_ios++; ++ sp->ha = ha; ++ sp->lun_queue->out_cnt++; ++ sp->flags |= SRB_DMA_VALID; ++ sp->state = SRB_ACTIVE_STATE; ++ sp->u_start = jiffies; ++ ++ /* Set chip new ring index. */ ++ reg_flushed = CACHE_FLUSH(ISP_REQ_Q_IN(reg)); ++ WRT_REG_WORD(ISP_REQ_Q_IN(reg), ha->req_ring_index); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ return (QL_STATUS_SUCCESS); ++ ++queuing_error: ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ return (QL_STATUS_ERROR); ++} ++ ++ ++/** ++ * qla2x00_marker() - Send a marker IOCB to the firmware. ++ * @ha: HA context ++ * @loop_id: loop ID ++ * @lun: LUN ++ * @type: marker modifier ++ * ++ * Can be called from both normal and interrupt context. ++ * ++ * Returns non-zero if a failure occured, else zero. ++ */ ++int ++__qla2x00_marker(scsi_qla_host_t *ha, ++ uint16_t loop_id, ++ uint16_t lun, ++ uint8_t type) ++{ ++ mrk_entry_t *pkt; ++ ++ ENTER(__func__); ++ ++ pkt = (mrk_entry_t *)qla2x00_req_pkt(ha); ++ if (pkt == NULL) { ++ DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__)); ++ ++ return (QL_STATUS_ERROR); ++ } ++ ++ pkt->entry_type = MARKER_TYPE; ++ pkt->modifier = type; ++ ++ if (type != MK_SYNC_ALL) { ++ pkt->lun = cpu_to_le16(lun); ++#if defined(EXTENDED_IDS) ++ pkt->target = cpu_to_le16(loop_id & 0xFF); ++#else ++ pkt->target = (uint8_t)loop_id; ++#endif ++ } ++ ++ /* Issue command to ISP */ ++ qla2x00_isp_cmd(ha); ++ ++ LEAVE(__func__); ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++int ++qla2x00_marker(scsi_qla_host_t *ha, ++ uint16_t loop_id, ++ uint16_t lun, ++ uint8_t type) ++{ ++ int ret; ++ unsigned long flags = 0; ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ret = __qla2x00_marker(ha, loop_id, lun, type); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (ret); ++} ++ ++/** ++ * qla2x00_req_pkt() - Retrieve a request packet from the request ring. ++ * @ha: HA context ++ * ++ * Note: The caller must hold the hardware lock before calling this routine. ++ * ++ * Returns NULL if function failed, else, a pointer to the request packet. ++ */ ++request_t * ++qla2x00_req_pkt(scsi_qla_host_t *ha) ++{ ++ device_reg_t *reg = ha->iobase; ++ request_t *pkt = NULL; ++ uint16_t cnt; ++ uint32_t *dword_ptr; ++ uint32_t timer; ++ uint16_t req_cnt = 1; ++ ++ ENTER(__func__); ++ ++ /* Wait 1 second for slot. */ ++ for (timer = HZ; timer; timer--) { ++ if ((req_cnt + 2) >= ha->req_q_cnt) { ++ /* Calculate number of free request entries. */ ++ cnt = qla2x00_debounce_register(ISP_REQ_Q_OUT(reg)); ++ if (ha->req_ring_index < cnt) ++ ha->req_q_cnt = cnt - ha->req_ring_index; ++ else ++ ha->req_q_cnt = REQUEST_ENTRY_CNT - ++ (ha->req_ring_index - cnt); ++ } ++ /* If room for request in request ring. */ ++ if ((req_cnt + 2) < ha->req_q_cnt) { ++ ha->req_q_cnt--; ++ pkt = ha->request_ring_ptr; ++ ++ /* Zero out packet. */ ++ dword_ptr = (uint32_t *)pkt; ++ for (cnt = 0; cnt < REQUEST_ENTRY_SIZE / 4; cnt++) ++ *dword_ptr++ = 0; ++ ++ /* Set system defined field. */ ++ pkt->sys_define = (uint8_t)ha->req_ring_index; ++ ++ /* Set entry count. */ ++ pkt->entry_count = 1; ++ ++ break; ++ } ++ ++ /* Release ring specific lock */ ++ spin_unlock(&ha->hardware_lock); ++ ++ udelay(2); /* 2 us */ ++ ++ /* Check for pending interrupts. */ ++ /* During init we issue marker directly */ ++ if (!ha->marker_needed) ++ qla2x00_poll(ha); ++ ++ spin_lock_irq(&ha->hardware_lock); ++ } ++ if (!pkt) { ++ DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (pkt); ++} ++ ++/** ++ * qla2x00_ms_req_pkt() - Retrieve a Management Server request packet from ++ * the request ring. ++ * @ha: HA context ++ * @sp: pointer to handle post function call ++ * ++ * Note: The caller must hold the hardware lock before calling this routine. ++ * ++ * Returns NULL if function failed, else, a pointer to the request packet. ++ */ ++request_t * ++qla2x00_ms_req_pkt(scsi_qla_host_t *ha, srb_t *sp) ++{ ++ device_reg_t *reg = ha->iobase; ++ request_t *pkt = NULL; ++ uint16_t cnt, i, index; ++ uint32_t *dword_ptr; ++ uint32_t timer; ++ uint8_t found = 0; ++ uint16_t req_cnt = 1; ++ ++ ENTER(__func__); ++ ++ /* Wait 1 second for slot. */ ++ for (timer = HZ; timer; timer--) { ++ if ((req_cnt + 2) >= ha->req_q_cnt) { ++ /* Calculate number of free request entries. */ ++ cnt = qla2x00_debounce_register(ISP_REQ_Q_OUT(reg)); ++ if (ha->req_ring_index < cnt) { ++ ha->req_q_cnt = cnt - ha->req_ring_index; ++ } else { ++ ha->req_q_cnt = REQUEST_ENTRY_CNT - ++ (ha->req_ring_index - cnt); ++ } ++ } ++ ++ /* Check for room in outstanding command list. */ ++ cnt = ha->current_outstanding_cmd; ++ for (index = 1; index < MAX_OUTSTANDING_COMMANDS; index++) { ++ cnt++; ++ if (cnt == MAX_OUTSTANDING_COMMANDS) ++ cnt = 1; ++ ++ if (ha->outstanding_cmds[cnt] == 0) { ++ found = 1; ++ ha->current_outstanding_cmd = cnt; ++ break; ++ } ++ } ++ ++ /* If room for request in request ring. */ ++ if (found && (req_cnt + 2) < ha->req_q_cnt) { ++ pkt = ha->request_ring_ptr; ++ ++ /* Zero out packet. */ ++ dword_ptr = (uint32_t *)pkt; ++ for (i = 0; i < REQUEST_ENTRY_SIZE / 4; i++ ) ++ *dword_ptr++ = 0; ++ ++ DEBUG5(printk("%s(): putting sp=%p in " ++ "outstanding_cmds[%x]\n", ++ __func__, ++ sp, cnt)); ++ ++ ha->outstanding_cmds[cnt] = sp; ++ ++ /* save the handle */ ++ CMD_HANDLE(sp->cmd) = (unsigned char *) (u_long) cnt; ++ CMD_SP(sp->cmd) = (void *)sp; ++ ++ ha->req_q_cnt--; ++ pkt->handle = (uint32_t)cnt; ++ ++ /* Set system defined field. */ ++ pkt->sys_define = (uint8_t)ha->req_ring_index; ++ pkt->entry_status = 0; ++ ++ break; ++ } ++ ++ /* Release ring specific lock */ ++ spin_unlock(&ha->hardware_lock); ++ udelay(20); ++ ++ /* Check for pending interrupts. */ ++ qla2x00_poll(ha); ++ ++ spin_lock_irq(&ha->hardware_lock); ++ } ++ if (!pkt) { ++ DEBUG2_3(printk("%s(): **** FAILED ****\n", __func__)); ++ } ++ ++ LEAVE(__func__); ++ ++ return (pkt); ++} ++ ++/** ++ * qla2x00_isp_cmd() - Modify the request ring pointer. ++ * @ha: HA context ++ * ++ * Note: The caller must hold the hardware lock before calling this routine. ++ */ ++void ++qla2x00_isp_cmd(scsi_qla_host_t *ha) ++{ ++ device_reg_t *reg = ha->iobase; ++ ++ ENTER(__func__); ++ ++ DEBUG5(printk("%s(): IOCB data:\n", __func__)); ++ DEBUG5(qla2x00_dump_buffer( ++ (uint8_t *)ha->request_ring_ptr, REQUEST_ENTRY_SIZE)); ++ ++ /* Adjust ring index. */ ++ ha->req_ring_index++; ++ if (ha->req_ring_index == REQUEST_ENTRY_CNT) { ++ ha->req_ring_index = 0; ++ ha->request_ring_ptr = ha->request_ring; ++ } else ++ ha->request_ring_ptr++; ++ ++ /* Set chip new ring index. */ ++ WRT_REG_WORD(ISP_REQ_Q_IN(reg), ha->req_ring_index); ++ ++ LEAVE(__func__); ++} ++ ++// TODO: Complete implementation. ++// TODO: Add support for EXTENDED_IDS. ++#ifdef COMPLETE_IMPLEMENTATION ++ ++/* MAILBOX IOCB stuff */ ++ ++/** ++ * qla2x00_send_login_port_iocb() - Login to a device. ++ * @ha: SCSI driver HA context ++ * @ipdev: IP device to login to ++ * ++ * This routine will build and send a mailbox IOCB to login to a fabric port. ++ * ++ * The qla2x00_mailbox_iocb_done() routine will be called upon IOCB ++ * completion, where further processing is performed. ++ * ++ * Returns QL_STATUS_SUCCESS if the operation succeeded. ++ */ ++static int ++qla2x00_send_login_port_iocb(scsi_qla_host_t *ha, fcdev_t *device) ++{ ++ unsigned long flags = 0; ++ struct mbx_entry *mbxentry; ++ ++ DEBUG2(printk("%s(): port ID: %x\n", ++ __func__, ++ device->port_id[2]<<16 | ++ device->port_id[1]<<8 | ++ device->port_id[0]);) ++ ++ /* Send marker if required */ ++ if (ha->marker_needed != 0) { ++ if (qla2x00_marker(ha, 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) ++ return (QL_STATUS_ERROR); ++ ha->marker_needed = 0; ++ } ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ mbxentry = (struct mbx_entry *)qla2x00_req_pkt(ha); ++ if (mbxentry == NULL) { ++ DEBUG2(printk("%s(): failed\n", __func__);) ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_ERROR); ++ } ++ ++ /* Build fabric login MBX IOCB */ ++ mbxentry->entry_type = ET_MAILBOX_COMMAND; ++ mbxentry->entry_count = 1; ++ mbxentry->sys_define1 = SOURCE_SCSI; ++ mbxentry->entry_status = 0; ++ mbxentry->handle = cpu_to_le32(device->dev_id | ++ (MBC_LOGIN_FABRIC_PORT << 16)); ++ mbxentry->loop_id = device->loop_id; ++ mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGIN_FABRIC_PORT); ++ mbxentry->mb1 = cpu_to_le16((device->loop_id << 8) | ++ (MBC_NO_PROCESS_LOGIN | ++ MBC_NO_PLOGI_IF_LOGGED_IN)); ++ mbxentry->mb2 = cpu_to_le16(device->port_id[2]); ++ mbxentry->mb3 = cpu_to_le16((device->port_id[1] << 8) | ++ device->port_id[0]); ++ mbxentry->mb6 = __constant_cpu_to_le16(0); ++ mbxentry->mb7 = __constant_cpu_to_le16(0); ++ ++ /* Issue command to ISP */ ++ qla2x00_isp_cmd(ha); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++/** ++ * qla2x00_send_logout_port_iocb() - Logout an FC device. ++ * @ha: SCSI driver HA context ++ * @device: FC device to logout ++ * ++ * This routine will build and send a mailbox IOCB to logout a fabric port. ++ * ++ * The qla2x00_mailbox_iocb_done() routine will be called upon IOCB ++ * completion, where further processing is performed. ++ * ++ * Returns QL_STATUS_SUCCESS if the operation succeeded. ++ */ ++static int ++qla2x00_send_logout_port_iocb(scsi_qla_host_t *ha, fcdev_t *device) ++{ ++ unsigned long flags = 0; ++ struct mbx_entry *mbxentry; ++ ++ DEBUG2(printk("%s(): port ID: %x\n", ++ __func__, ++ device->port_id[2]<<16 | ++ device->port_id[1]<<8 | ++ device->port_id[0]);) ++ ++ /* Send marker if required */ ++ if (ha->marker_needed != 0) { ++ if (qla2x00_marker(ha, 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) ++ return (QL_STATUS_ERROR); ++ ha->marker_needed = 0; ++ } ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ mbxentry = (struct mbx_entry *)qla2x00_req_pkt(ha); ++ if (mbxentry == NULL) { ++ DEBUG3(printk("%s(): failed\n", __func__);) ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_ERROR); ++ } ++ ++ /* Build fabric logout MBX IOCB */ ++ mbxentry->entry_type = ET_MAILBOX_COMMAND; ++ mbxentry->entry_count = 1; ++ mbxentry->sys_define1 = SOURCE_SCSI; ++ mbxentry->entry_status = 0; ++ mbxentry->handle = cpu_to_le32(device->dev_id | ++ (MBC_LOGOUT_FABRIC_PORT << 16)); ++ mbxentry->loop_id = device->loop_id; ++ mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGOUT_FABRIC_PORT); ++ mbxentry->mb1 = cpu_to_le16(device->loop_id << 8); ++ mbxentry->mb2 = __constant_cpu_to_le16(0); ++ mbxentry->mb3 = __constant_cpu_to_le16(0); ++ mbxentry->mb6 = __constant_cpu_to_le16(0); ++ mbxentry->mb7 = __constant_cpu_to_le16(0); ++ ++ /* Issue command to ISP */ ++ qla2x00_isp_cmd(ha); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++/** ++ * qla2x00_mailbox_iocb_done() - Process an mailbox IOCB completion. ++ * @ha: SCSI driver HA context ++ * @mbxentry: completed mailbox IOCB entry ++ * ++ * This routine is currently used for fabric login and logouts only. ++ */ ++static void ++qla2x00_mailbox_iocb_done(scsi_qla_host_t *ha, struct mbx_entry *mbxentry) ++{ ++ int status; ++ uint16_t cmd; ++ uint16_t index; ++ fcdev *device; ++ ++// FIXME: endianess? ++ /* Parse-out originating mailbox command */ ++ cmd = MSW(mbxentry->handle); ++ ++ DEBUG2(printk("%s: cmd %x, status %x, mb0 %x, mb1 %x, mb2 %x\n", ++ __func__, ++ cmd, ++ mbxentry->status, ++ mbxentry->mb0, ++ mbxentry->mb1, ++ mbxentry->mb2);) ++ ++ /* Get device block pointer */ ++ index = LSW(mbxentry->handle); ++ if (index >= QLLAN_MAX_IP_DEVICES) { ++ /* Bad handle from ISP */ ++ DEBUG3(printk("%s: bad handle from isp\n", __func__);) ++ ++ /* TODO: Cleanup??? */ ++ ++ return; ++ } ++// FIXME FROM HERE!!! ++ ipdev = &ha->ipdev_db[index]; ++ ++ if (cmd == MBC_LOGOUT_FABRIC_PORT) { ++ /* Check fabric logout completion status */ ++ if (/*mbxentry->status == CS_COMPLETE && */ ++ mbxentry->mb0 == MBS_COMMAND_COMPLETE) { ++ ++ /* Logout successful -- do nothing */ ++ } ++ else { ++ DEBUG12(printk("%s: fabric logout failed\n", __func__);) ++ } ++ } ++ else { ++ /* Check fabric login completion status */ ++ /* Note: sometimes ISP returns Status=0x30 and MB0=0x4000 */ ++ /* Therefore, only check mb0 for now */ ++ if (/* mbxentry->status == CS_COMPLETE && */ ++ mbxentry->mb0 == MBS_COMMAND_COMPLETE) { ++ ++ /* Login successful */ ++ ipdev->flags |= IP_DEV_FLAG_PRESENT; ++ } ++ else if (mbxentry->mb0 == MBS_PORT_ID_IN_USE) { ++ /* Different loop ID already assigned to port ID */ ++ /* Use the one that is already assigned */ ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ ipdev->loop_id = mbxentry->mb1; ++ ++ /* Do logout first and then relogin */ ++ qla2x00_ip_send_logout_port_iocb(ha, ipdev, 1); ++ qla2x00_ip_send_login_port_iocb(ha, ipdev, 1); ++ } ++ else if (mbxentry->mb0 == MBS_LOOP_ID_IN_USE) { ++ /* Loop ID already used for different port ID */ ++ /* Get a new loop ID and reissue login request */ ++ status = qla2x00_reserve_loopid(ha, &ipdev->loop_id); ++ if (status == QL_STATUS_SUCCESS) { ++ qla2x00_ip_send_login_port_iocb(ha, ipdev, 1); ++ } ++ else { ++ DEBUG12(printk("%s: out of loop IDs\n", ++ __func__);) ++ ++ qla2x00_free_ip_block(ha, ipdev); ++ } ++ } ++ else { ++ /* Login failed, return resources */ ++ DEBUG12(printk("%s: fabric login failed\n", __func__);) ++ ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ qla2x00_free_ip_block(ha, ipdev); ++ } ++ } ++} ++ ++#endif ++ ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_ip.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,1769 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++/**************************************************************************** ++ Please see revision.notes for revision history. ++*****************************************************************************/ ++ ++static __u8 hwbroadcast_addr[ETH_ALEN] = { [0 ... ETH_ALEN-1] = 0xFF }; ++ ++ ++/** ++ * qla2x00_ip_initialize() - Initialize RISC IP support. ++ * @ha: SCSI driver HA context ++ * ++ * Prior to RISC IP initialization, this routine, if necessary, will reset all ++ * buffers in the receive buffer ring. ++ * ++ * Returns TRUE if the RISC IP initialization succeeds. ++ */ ++static int ++qla2x00_ip_initialize(scsi_qla_host_t *ha) ++{ ++ int i; ++ int status; ++ unsigned long flags; ++ device_reg_t *reg; ++ static mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ struct ip_init_cb *ipinit_cb; ++ dma_addr_t ipinit_cb_dma; ++ ++ DEBUG12(printk("%s: enter\n", __func__);) ++ ++ status = FALSE; ++ ++ /* Initialize IP data in ha */ ++ ha->ipdev_db_top = NULL; ++ ha->ipdev_db_bottom = NULL; ++ ha->ipdev_db_next_free = &ha->ipdev_db[0]; ++ for (i = 0; i < QLLAN_MAX_IP_DEVICES; i++) { ++ ha->ipdev_db[i].index = i; ++ ha->ipdev_db[i].next = &ha->ipdev_db[i+1]; ++ } ++ ha->ipdev_db[QLLAN_MAX_IP_DEVICES-1].next = NULL; ++ ++ /* Reset/pack buffers owned by RISC in receive buffer ring */ ++ if (ha->rec_entries_in != ha->rec_entries_out) { ++ struct buffer_cb *bcb; ++ uint16_t rec_out; ++ struct risc_rec_entry *rec_entry; ++ ++ bcb = ha->receive_buffers; ++ rec_out = ha->rec_entries_out; ++ ++ /* ++ * Must locate all RISC owned buffers and pack them in the ++ * buffer ring. ++ */ ++ /* between IpBufferOut and IpBufferIN */ ++ for (i = 0; i < ha->max_receive_buffers; i++, bcb++) { ++ if (test_bit(BCB_RISC_OWNS_BUFFER, &bcb->state)) { ++ /* ++ * Set RISC owned buffer into receive buffer ++ * ring. ++ */ ++ rec_entry = &ha->risc_rec_q[rec_out]; ++ rec_entry->handle = bcb->handle; ++ rec_entry->data_addr_low = ++ LSD(bcb->skb_data_dma); ++ rec_entry->data_addr_high = ++ MSD(bcb->skb_data_dma); ++ if (rec_out < IP_BUFFER_QUEUE_DEPTH - 1) ++ rec_out++; ++ else ++ rec_out = 0; ++ } ++ } ++ ++ /* Verify correct number of RISC owned buffers were found */ ++ if (rec_out != ha->rec_entries_in) { ++ /* Incorrect number of RISC owned buffers?? */ ++ DEBUG12(printk("%s: incorrect number of RISC " ++ "owned buffers, disable IP\n", ++ __func__);) ++ ha->flags.enable_ip = FALSE; ++ return (FALSE); ++ } ++ } ++ ++ /* Init RISC buffer pointer */ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ reg = ha->iobase; ++ WRT_REG_WORD(®->mailbox8, ha->rec_entries_in); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ /* Wait for a ready state from the adapter */ ++ while (!ha->init_done || ha->dpc_active) { ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ); ++ } ++ ++ /* Setup IP initialization control block */ ++ ipinit_cb = pci_alloc_consistent(ha->pdev, ++ sizeof(struct ip_init_cb), ++ &ipinit_cb_dma); ++ if (ipinit_cb) { ++ memset(ipinit_cb, 0, sizeof(struct ip_init_cb)); ++ ipinit_cb->version = IPICB_VERSION; ++ ipinit_cb->firmware_options = ++ __constant_cpu_to_le16( ++ IPICB_OPTION_NO_BROADCAST_FASTPOST | ++ IPICB_OPTION_64BIT_ADDRESSING); ++ ipinit_cb->header_size = cpu_to_le16(ha->header_size); ++ ipinit_cb->mtu = cpu_to_le16((uint16_t)ha->mtu); ++ ipinit_cb->receive_buffer_size = ++ cpu_to_le16((uint16_t)ha->receive_buff_data_size); ++ ipinit_cb->receive_queue_size = ++ __constant_cpu_to_le16(IP_BUFFER_QUEUE_DEPTH); ++ ipinit_cb->low_water_mark = ++ __constant_cpu_to_le16(IPICB_LOW_WATER_MARK); ++ ipinit_cb->receive_queue_addr[0] = ++ cpu_to_le16(LSW(ha->risc_rec_q_dma)); ++ ipinit_cb->receive_queue_addr[1] = ++ cpu_to_le16(MSW(ha->risc_rec_q_dma)); ++ ipinit_cb->receive_queue_addr[2] = ++ cpu_to_le16(LSW(MSD(ha->risc_rec_q_dma))); ++ ipinit_cb->receive_queue_addr[3] = ++ cpu_to_le16(MSW(MSD(ha->risc_rec_q_dma))); ++ ipinit_cb->receive_queue_in = cpu_to_le16(ha->rec_entries_out); ++ ipinit_cb->fast_post_count = ++ __constant_cpu_to_le16(IPICB_FAST_POST_COUNT); ++ ipinit_cb->container_count = ++ __constant_cpu_to_le16(IPICB_BUFFER_CONTAINER_COUNT); ++ ipinit_cb->resource_allocation = ++ __constant_cpu_to_le16(IPICB_IOCB_RESERVE_COUNT); ++ ++ /* Issue mailbox command to initialize IP firmware */ ++ mcp->mb[0] = MBC_INITIALIZE_IP; ++ mcp->mb[2] = MSW(ipinit_cb_dma); ++ mcp->mb[3] = LSW(ipinit_cb_dma); ++ mcp->mb[6] = MSW(MSD(ipinit_cb_dma)); ++ mcp->mb[7] = LSW(MSD(ipinit_cb_dma)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->buf_size = sizeof(struct ip_init_cb); ++ mcp->flags = MBX_DMA_OUT; ++ ++ status = qla2x00_mailbox_command(ha, mcp); ++ if (status == QL_STATUS_SUCCESS) { ++ /* IP initialization successful */ ++ DEBUG12(printk("%s: successful\n", __func__);) ++ ++ ha->flags.enable_ip = TRUE; ++ ++ /* Force database update */ ++ set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); ++ set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); ++ ++ /* qla2x00_loop_resync(ha); */ ++ if (ha->dpc_wait && !ha->dpc_active) { ++ up(ha->dpc_wait); ++ } ++ status = TRUE; ++ } ++ else { ++ DEBUG12(printk("%s: MBC_INITIALIZE_IP " ++ "failed %x MB0 %x\n", ++ __func__, ++ status, ++ mcp->mb[0]);) ++ status = FALSE; ++ } ++ pci_free_consistent(ha->pdev, sizeof(struct ip_init_cb), ++ ipinit_cb, ipinit_cb_dma); ++ ++ } ++ else { ++ DEBUG12(printk("%s: memory allocation error\n", __func__);) ++ } ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_ip_send_complete() - Handle IP send completion. ++ * @ha: SCSI driver HA context ++ * @handle: handle to completed send_cb ++ * @comp_status: Firmware completion status of send_cb ++ * ++ * Upon cleanup of the internal active-scb queue, the IP driver is notified of ++ * the completion. ++ */ ++static void ++qla2x00_ip_send_complete(scsi_qla_host_t *ha, ++ uint32_t handle, uint16_t comp_status) ++{ ++ struct send_cb *scb; ++ ++ /* Set packet pointer from queue entry handle */ ++ if (handle < MAX_SEND_PACKETS) { ++ scb = ha->active_scb_q[handle]; ++ if (scb) { ++ ha->ipreq_cnt--; ++ ha->active_scb_q[handle] = NULL; ++ ++ scb->comp_status = comp_status; ++ pci_unmap_single(ha->pdev, ++ scb->skb_data_dma, ++ scb->skb->len, ++ PCI_DMA_TODEVICE); ++ ++ /* Return send packet to IP driver */ ++ (*ha->send_completion_routine)(scb); ++ return; ++ } ++ } ++ ++ /* Invalid handle from RISC, reset RISC firmware */ ++ printk(KERN_WARNING ++ "%s: Bad IP send handle %x - aborting ISP\n", ++ __func__, handle); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++} ++ ++/** ++ * qla2x00_ip_receive() - Handle IP receive IOCB. ++ * @ha: SCSI driver HA context ++ * @pkt: RISC IP receive packet ++ * ++ * Upon preparation of one or more buffer_cbs, the IP driver is notified of ++ * the received packet. ++ */ ++static void ++qla2x00_ip_receive(scsi_qla_host_t *ha, response_t *pkt) ++{ ++ uint32_t handle; ++ uint32_t packet_size; ++ uint16_t linked_bcb_cnt; ++ uint32_t rec_data_size; ++ uint16_t comp_status; ++ struct buffer_cb *bcb; ++ struct buffer_cb *nbcb; ++ struct ip_rec_entry *iprec_entry; ++ ++ DEBUG12(printk("%s: enter\n", __func__);) ++ ++ iprec_entry = (struct ip_rec_entry *)pkt; ++ comp_status = le16_to_cpu(iprec_entry->comp_status); ++ ++ /* If split buffer, set header size for 1st buffer */ ++ if (comp_status & IPREC_STATUS_SPLIT_BUFFER) ++ rec_data_size = ha->header_size; ++ else ++ rec_data_size = ha->receive_buff_data_size; ++ ++ handle = iprec_entry->buffer_handles[0]; ++ if (handle >= ha->max_receive_buffers) { ++ /* Invalid handle from RISC, reset RISC firmware */ ++ printk(KERN_WARNING ++ "%s: Bad IP buffer handle %x (> buffer_count)...Post " ++ "ISP Abort\n", ++ __func__, ++ handle); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ ++ bcb = &ha->receive_buffers[handle]; ++ ++ if (!test_and_clear_bit(BCB_RISC_OWNS_BUFFER, &bcb->state)) { ++ /* Invalid handle from RISC, reset RISC firmware */ ++ printk(KERN_WARNING ++ "%s: Bad IP buffer handle %x (!RISC_owned)...Post " ++ "ISP Abort\n", ++ __func__, ++ handle); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ ++ packet_size = le16_to_cpu(iprec_entry->sequence_length); ++ bcb->comp_status = comp_status; ++ bcb->packet_size = packet_size; ++ nbcb = bcb; ++ ++ /* Prepare any linked buffers */ ++ for (linked_bcb_cnt = 1; ; linked_bcb_cnt++) { ++ if (packet_size > rec_data_size) { ++ nbcb->rec_data_size = rec_data_size; ++ packet_size -= rec_data_size; ++ ++ /* ++ * If split buffer, only use header size on 1st buffer ++ */ ++ rec_data_size = ha->receive_buff_data_size; ++ ++ handle = iprec_entry->buffer_handles[linked_bcb_cnt]; ++ if (handle >= ha->max_receive_buffers) { ++ /* ++ * Invalid handle from RISC reset RISC firmware ++ */ ++ printk(KERN_WARNING ++ "%s: Bad IP buffer handle %x (> " ++ "buffer_count - PS)...Post ISP Abort\n", ++ __func__, ++ handle); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ nbcb->next_bcb = &ha->receive_buffers[handle]; ++ nbcb = nbcb->next_bcb; ++ ++ if (!test_and_clear_bit(BCB_RISC_OWNS_BUFFER, ++ &nbcb->state)) { ++ /* ++ * Invalid handle from RISC reset RISC firmware ++ */ ++ printk(KERN_WARNING ++ "%s: Bad IP buffer handle %x " ++ "(!RISC_owned - PS)...Post ISP Abort\n", ++ __func__, ++ handle); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ } ++ else { ++ /* Single buffer_cb */ ++ nbcb->rec_data_size = packet_size; ++ nbcb->next_bcb = NULL; ++ break; ++ } ++ } ++ ++ /* Check for incoming ARP packet with matching IP address */ ++ if (le16_to_cpu(iprec_entry->service_class) == 0) { ++ uint8_t port_id[3]; ++ struct ip_device *ipdev; ++ struct packet_header *packethdr; ++ ++ packethdr = (struct packet_header *)bcb->skb_data; ++ ++ /* Scan list of IP devices to see if login needed */ ++ for (ipdev = ha->ipdev_db_top; ipdev; ipdev = ipdev->next) { ++ if (!memcmp(&ipdev->port_name[2], ++ packethdr->networkh.s.na.addr, ETH_ALEN)) { ++ /* Device already in IP list, skip login */ ++ goto skip_device_login; ++ } ++ } ++ ++ /* Device not in list, need to do login */ ++ port_id[2] = iprec_entry->s_idhigh; ++// FIXME: endianess? ++ port_id[1] = MSB(iprec_entry->s_idlow); ++ port_id[0] = LSB(iprec_entry->s_idlow); ++ ++ /* Make sure its not a local device */ ++ if (port_id[2] == ha->d_id.b.domain && ++ port_id[1] == ha->d_id.b.area) { ++ ++ goto skip_device_login; ++ } ++ ++ if (qla2x00_add_new_ip_device(ha, ++ PUBLIC_LOOP_DEVICE, ++ port_id, ++ packethdr->networkh.s.fcaddr, ++ TRUE, ++ 1) == QL_STATUS_FATAL_ERROR) { ++ ++ /* Fatal error, reinitialize */ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ } ++ ++ } ++ ++skip_device_login: ++ ++ /* Pass received packet to IP driver */ ++ bcb->linked_bcb_cnt = linked_bcb_cnt; ++ (*ha->receive_packets_routine)(ha->receive_packets_context, bcb); ++ ++ /* Keep track of RISC buffer pointer (for IP reinit) */ ++ ha->rec_entries_out += linked_bcb_cnt; ++ if (ha->rec_entries_out >= IP_BUFFER_QUEUE_DEPTH) ++ ha->rec_entries_out -= IP_BUFFER_QUEUE_DEPTH; ++} ++ ++/** ++ * qla2x00_ip_receive_fastpost() - Handle IP receive fastpost. ++ * @ha: SCSI driver HA context ++ * @type: RISC fastpost type ++ * ++ * Upon preparation of one or more buffer_cbs, the IP driver is notified of ++ * the received packet. ++ */ ++static void ++qla2x00_ip_receive_fastpost(scsi_qla_host_t *ha, uint16_t type) ++{ ++ uint32_t handle; ++ uint32_t packet_size; ++ uint16_t linked_bcb_cnt; ++ uint32_t rec_data_size; ++ volatile uint16_t *next_mb; ++ device_reg_t *reg = ha->iobase; ++ struct buffer_cb *bcb; ++ struct buffer_cb *nbcb; ++ ++ DEBUG12(printk("%s: enter\n", __func__);) ++ ++ next_mb = ®->mailbox10; ++ ++ /* If split buffer, set header size for 1st buffer */ ++ if (type == MBA_IP_RECEIVE_COMPLETE_SPLIT) ++ rec_data_size = ha->header_size; ++ else ++ rec_data_size = ha->receive_buff_data_size; ++ ++ handle = RD_REG_WORD(next_mb); ++ if (handle >= ha->max_receive_buffers) { ++ goto invalid_handle; ++ } ++ ++ bcb = &ha->receive_buffers[handle]; ++ ++ if (!test_and_clear_bit(BCB_RISC_OWNS_BUFFER, &bcb->state)) { ++ goto invalid_handle; ++ } ++ ++ packet_size = RD_REG_WORD(®->mailbox3); ++ /* Fastpost entries are always successfully transferred */ ++ bcb->comp_status = CS_COMPLETE; ++ bcb->packet_size = packet_size; ++ nbcb = bcb; ++ ++ /* Prepare any linked buffers */ ++ for (linked_bcb_cnt = 1; ; linked_bcb_cnt++) { ++ if (packet_size > rec_data_size) { ++ nbcb->rec_data_size = rec_data_size; ++ packet_size -= rec_data_size; ++ /* ++ * If split buffer, only use header size on 1st buffer ++ */ ++ rec_data_size = ha->receive_buff_data_size; ++ ++ next_mb++; ++ handle = RD_REG_WORD(next_mb); ++ if (handle >= ha->max_receive_buffers) { ++invalid_handle: ++ printk(KERN_WARNING ++ "%s: bad IP receive fast post handle " ++ "%x\n", ++ __func__, ++ handle); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ ++ nbcb->next_bcb = &ha->receive_buffers[handle]; ++ nbcb = nbcb->next_bcb; ++ ++ if (!test_and_clear_bit(BCB_RISC_OWNS_BUFFER, ++ &nbcb->state)) { ++ goto invalid_handle; ++ } ++ } ++ else { ++ /* Single buffer_cb */ ++ nbcb->rec_data_size = packet_size; ++ nbcb->next_bcb = NULL; ++ break; ++ } ++ } ++ ++ /* Pass received packet to IP driver */ ++ bcb->linked_bcb_cnt = linked_bcb_cnt; ++ (*ha->receive_packets_routine)(ha->receive_packets_context, bcb); ++ ++ /* Keep track of RISC buffer pointer (for IP reinit) */ ++ ha->rec_entries_out += linked_bcb_cnt; ++ if (ha->rec_entries_out >= IP_BUFFER_QUEUE_DEPTH) ++ ha->rec_entries_out -= IP_BUFFER_QUEUE_DEPTH; ++} ++ ++/** ++ * qla2x00_convert_to_arp() - Convert an IP send packet to an ARP packet ++ * @ha: SCSI driver HA context ++ * @scb: The send_cb structure to convert ++ * ++ * Returns TRUE if conversion successful. ++ */ ++static int ++qla2x00_convert_to_arp(scsi_qla_host_t *ha, struct send_cb *scb) ++{ ++ struct sk_buff *skb; ++ struct packet_header *packethdr; ++ struct arp_header *arphdr; ++ struct ip_header *iphdr; ++ ++ DEBUG12(printk("%s: convert packet to ARP\n", __func__);) ++ ++ skb = scb->skb; ++ packethdr = scb->header; ++ arphdr = (struct arp_header *)skb->data; ++ iphdr = (struct ip_header *)skb->data; ++ ++ if (packethdr->snaph.ethertype == __constant_htons(ETH_P_IP)) { ++ /* Convert IP packet to ARP packet */ ++ packethdr->networkh.d.na.naa = NAA_IEEE_MAC_TYPE; ++ packethdr->networkh.d.na.unused = 0; ++ memcpy(packethdr->networkh.d.na.addr, ++ hwbroadcast_addr, ETH_ALEN); ++ packethdr->snaph.ethertype = __constant_htons(ETH_P_ARP); ++ ++ arphdr->ar_tip = iphdr->iph.daddr; ++ arphdr->ar_sip = iphdr->iph.saddr; ++ arphdr->arph.ar_hrd = __constant_htons(ARPHRD_IEEE802); ++ arphdr->arph.ar_pro = __constant_htons(ETH_P_IP); ++ arphdr->arph.ar_hln = ETH_ALEN; ++ arphdr->arph.ar_pln = sizeof(iphdr->iph.daddr); /* 4 */ ++ arphdr->arph.ar_op = __constant_htons(ARPOP_REQUEST); ++ memcpy(arphdr->ar_sha, packethdr->networkh.s.na.addr, ETH_ALEN); ++ memset(arphdr->ar_tha, 0, ETH_ALEN); ++ ++ skb->len = sizeof(struct arp_header); ++ ++ return (TRUE); ++ } ++ else { ++ return (FALSE); ++ } ++} ++ ++/** ++ * qla2x00_get_ip_loopid() - Retrieve loop id of an IP device. ++ * @ha: SCSI driver HA context ++ * @packethdr: IP device to remove ++ * @loop_id: loop id of discovered device ++ * ++ * This routine will interrogate the packet header to determine if the sender is ++ * in the list of active IP devices. The first two bytes of the destination ++ * address will be modified to match the port name stored in the active IP ++ * device list. ++ * ++ * Returns TRUE if a valid loop id is returned. ++ */ ++static int ++qla2x00_get_ip_loopid(scsi_qla_host_t *ha, ++ struct packet_header *packethdr, uint8_t *loop_id) ++{ ++ struct ip_device *ipdev; ++ ++ /* Scan list of logged in IP devices for match */ ++ for (ipdev = ha->ipdev_db_top; ipdev; ipdev = ipdev->next) { ++ if (memcmp(&ipdev->port_name[2], ++ &(packethdr->networkh.d.fcaddr[2]), ETH_ALEN)) ++ continue; ++ ++ /* Found match, return loop ID */ ++ *loop_id = (uint8_t)ipdev->loop_id; ++ ++ /* Update first 2 bytes of port name */ ++ packethdr->networkh.d.fcaddr[0] = ipdev->port_name[0]; ++ packethdr->networkh.d.fcaddr[1] = ipdev->port_name[1]; ++ ++ if (ipdev != ha->ipdev_db_top) { ++ /* Device not at top, move it to top of list */ ++ /* Unhook it first */ ++ if (ipdev == ha->ipdev_db_bottom) { ++ ha->ipdev_db_bottom = ipdev->last; ++ ipdev->last->next = NULL; ++ } ++ else { ++ ipdev->last->next = ipdev->next; ++ ipdev->next->last = ipdev->last; ++ } ++ ++ /* Now put it at top of list */ ++ ipdev->next = ha->ipdev_db_top; ++ ipdev->last = NULL; ++ ha->ipdev_db_top->last = ipdev; ++ ha->ipdev_db_top = ipdev; ++ } ++ return (TRUE); ++ } ++ ++ /* Check for broadcast packet */ ++ if (!memcmp(packethdr->networkh.d.na.addr, ++ hwbroadcast_addr, ETH_ALEN)) { ++ /* Broadcast packet, return broadcast loop ID */ ++ *loop_id = BROADCAST; ++ ++ /* Update destination NAA of header */ ++ packethdr->networkh.d.na.naa = NAA_IEEE_MAC_TYPE; ++ packethdr->networkh.d.na.unused = 0; ++ ++ return (TRUE); ++ } ++ ++ /* Check for multicast packet */ ++ if (packethdr->networkh.d.na.addr[0] & 0x01) { ++ /* Use broadcast loop ID for multicast packets */ ++ *loop_id = BROADCAST; ++ ++ /* Update destination NAA of header */ ++ packethdr->networkh.d.na.naa = NAA_IEEE_MAC_TYPE; ++ packethdr->networkh.d.na.unused = 0; ++ ++ return (TRUE); ++ } ++ ++ /* TODO */ ++ /* Try sending FARP IOCB to request login */ ++ ++ DEBUG12(printk("%s: ID not found for " ++ "XX XX %02x %02x %02x %02x %02x %02x\n", ++ __func__, ++ packethdr->networkh.d.na.addr[0], ++ packethdr->networkh.d.na.addr[1], ++ packethdr->networkh.d.na.addr[2], ++ packethdr->networkh.d.na.addr[3], ++ packethdr->networkh.d.na.addr[4], ++ packethdr->networkh.d.na.addr[5]);) ++ ++ return (FALSE); ++} ++ ++/** ++ * qla2x00_reserve_loopid() - Reserve an unused public loop id. ++ * @ha: SCSI driver HA context ++ * @loop_id: loop id reserved ++ * ++ * Returns QL_STATUS_SUCCESS if a valid loop id is returned. ++ */ ++static int ++qla2x00_reserve_loopid(scsi_qla_host_t *ha, uint16_t *loop_id) ++{ ++ int i; ++ ++ /* Look for unused loop ID */ ++ for (i = ha->min_external_loopid; i < ha->max_public_loop_ids; i++) { ++ if (ha->fabricid[i].in_use) ++ continue; ++ ++ /* Found free loop ID */ ++ ha->fabricid[i].in_use = TRUE; ++ *loop_id = i; ++ ++ DEBUG12(printk("%s: assigned loop ID %x\n", ++ __func__, ++ *loop_id);) ++ ++ return (QL_STATUS_SUCCESS); ++ } ++ ++ /* Out of loop IDs */ ++ *loop_id = ha->max_public_loop_ids + 1; /* Set out of range */ ++ ++ DEBUG12(printk("%s: out of loop IDs\n", __func__);) ++ ++ return (QL_STATUS_RESOURCE_ERROR); ++} ++ ++/** ++ * qla2x00_free_loopid() - Free a public loop id. ++ * @ha: SCSI driver HA context ++ * @loop_id: loop id to free ++ */ ++static void ++qla2x00_free_loopid(scsi_qla_host_t *ha, uint16_t loop_id) ++{ ++ if (loop_id < ha->max_public_loop_ids) { ++ ha->fabricid[loop_id].in_use = FALSE; ++ DEBUG12(printk("%s: free loop ID %x\n", ++ __func__, ++ loop_id);) ++ } ++ else { ++ DEBUG12(printk("%s: loop ID %x out of range\n", ++ __func__, ++ loop_id);) ++ } ++} ++ ++ ++/** ++ * qla2x00_add_new_ip_device() - Add a new IP capable device to the list. ++ * @ha: SCSI driver HA context ++ * @loop_id: loop id, if a private loop, of the new device ++ * @port_id: port id of the new device ++ * @port_name: port name of the new device ++ * @force_add: should the function force the addition of the device ++ * @ha_locked: Flag indicating if the function is called with the hardware lock ++ * ++ * Prior to RISC IP initialization, this routine, if necessary, will reset all ++ * buffers in the receive buffer ring. ++ * ++ * Returns QL_STATUS_SUCCESS if there were no errors adding the device. ++ */ ++static int ++qla2x00_add_new_ip_device(scsi_qla_host_t *ha, ++ uint16_t loop_id, ++ uint8_t *port_id, ++ uint8_t *port_name, ++ int force_add, ++ uint32_t ha_locked) ++{ ++ int status; ++ struct ip_device *ipdev; ++ ++ /* Get free IP device block */ ++ status = qla2x00_reserve_ip_block(ha, &ipdev); ++ if (status == QL_STATUS_RESOURCE_ERROR) { ++ if (!force_add) ++ return (status); ++ ++ /* ++ * Out of IP blocks, bump public device at bottom of list ++ */ ++ DEBUG12(printk("%s: bump device from IP list\n", __func__);) ++ ++ for (ipdev = ha->ipdev_db_bottom; ipdev; ipdev = ipdev->last) { ++ if (!(ipdev->flags & IP_DEV_FLAG_PUBLIC_DEVICE)) ++ continue; ++ ++ /* Do fabric logout and free loop ID */ ++ qla2x00_ip_send_logout_port_iocb(ha, ipdev, ha_locked); ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ ++ /* Move device to top of list */ ++ qla2x00_free_ip_block(ha, ipdev); ++ status = qla2x00_reserve_ip_block(ha, &ipdev); ++ break; ++ } ++ if (status != QL_STATUS_SUCCESS) ++ return (status); ++ } ++ ++ /* Save IP port name */ ++ memcpy(ipdev->port_name, port_name, WWN_SIZE); ++ ++ if (loop_id != PUBLIC_LOOP_DEVICE) { ++ /* Private loop device */ ++ ipdev->loop_id = loop_id; ++ ipdev->flags = IP_DEV_FLAG_PRESENT; ++ ++ DEBUG12(printk("%s: WWN:%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "LoopID:%x\n", ++ __func__, ++ ipdev->port_name[0], ++ ipdev->port_name[1], ++ ipdev->port_name[2], ++ ipdev->port_name[3], ++ ipdev->port_name[4], ++ ipdev->port_name[5], ++ ipdev->port_name[6], ++ ipdev->port_name[7], ++ ipdev->loop_id);) ++ } ++ else { ++ /* Public device */ ++ /* Reserve public loop ID, save it in database */ ++ status = qla2x00_reserve_loopid(ha, &ipdev->loop_id); ++ if (status == QL_STATUS_RESOURCE_ERROR) { ++ struct ip_device *ipdev_bump; ++ ++ if (!force_add) { ++ /* Failed to get loop ID */ ++ DEBUG12(printk("%s: failed to get loop ID\n", ++ __func__);) ++ qla2x00_free_ip_block(ha, ipdev); ++ ++ return (status); ++ } ++ ++ /* ++ * Out of loop IDs, bump public device at bottom of ++ * list. ++ */ ++ DEBUG12(printk("%s: bump device from IP list\n", ++ __func__);) ++ ++ for (ipdev_bump = ha->ipdev_db_bottom; ++ ipdev_bump; ++ ipdev_bump = ipdev_bump->last) { ++ ++ if (!(ipdev_bump->flags & ++ IP_DEV_FLAG_PUBLIC_DEVICE)) ++ continue; ++ ++ /* ++ * Do fabric logout, steal loop ID, free bumped ++ * IP block. ++ */ ++ qla2x00_ip_send_logout_port_iocb(ha, ++ ipdev_bump, ha_locked); ++ ipdev->loop_id = ipdev_bump->loop_id; ++ qla2x00_free_ip_block(ha, ipdev_bump); ++ ++ status = QL_STATUS_SUCCESS; ++ break; ++ } ++ ++ if (status != QL_STATUS_SUCCESS) { ++ /* Failed to get loop ID */ ++ DEBUG12(printk("%s: failed to get loop ID\n", ++ __func__);) ++ qla2x00_free_ip_block(ha, ipdev); ++ ++ return (status); ++ } ++ } ++ ++ /* Save device data */ ++ ipdev->port_id[0] = port_id[0]; ++ ipdev->port_id[1] = port_id[1]; ++ ipdev->port_id[2] = port_id[2]; ++ ipdev->flags = IP_DEV_FLAG_PUBLIC_DEVICE; ++ ++ /* Login public device */ ++ status = qla2x00_ip_send_login_port_iocb(ha, ipdev, ha_locked); ++ if (status == QL_STATUS_SUCCESS) { ++ DEBUG12(printk("%s: " ++ "WWN:%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "LoopID:%x, PortID:%x\n", ++ __func__, ++ ipdev->port_name[0], ++ ipdev->port_name[1], ++ ipdev->port_name[2], ++ ipdev->port_name[3], ++ ipdev->port_name[4], ++ ipdev->port_name[5], ++ ipdev->port_name[6], ++ ipdev->port_name[7], ++ ipdev->loop_id, ++ ipdev->port_id[2]<<16 | ++ ipdev->port_id[1]<<8 | ++ ipdev->port_id[0]);) ++ } ++ else { ++ /* Login failed, return resources */ ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ qla2x00_free_ip_block(ha, ipdev); ++ } ++ } ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_free_ip_block() - Remove an IP device from the active IP list. ++ * @ha: SCSI driver HA context ++ * @ipdev: IP device to remove ++ */ ++static void ++qla2x00_free_ip_block(scsi_qla_host_t *ha, struct ip_device *ipdev) ++{ ++ /* Unhook IP device block from active list */ ++ if (ipdev->last == NULL) ++ ha->ipdev_db_top = ipdev->next; ++ else ++ ipdev->last->next = ipdev->next; ++ ++ if (ipdev->next == NULL) ++ ha->ipdev_db_bottom = ipdev->last; ++ else ++ ipdev->next->last = ipdev->last; ++ ++ /* Add IP device block to free list */ ++ ipdev->next = ha->ipdev_db_next_free; ++ ha->ipdev_db_next_free = ipdev; ++} ++ ++/** ++ * qla2x00_reserve_ip_block() - Move an IP device to the IP device list. ++ * @ha: SCSI driver HA context ++ * @ipdevblk: reserved IP device to add ++ * ++ * This routine will move the unused @ipdevblk from the free list to the top of ++ * the active IP device list. ++ * ++ * Returns QL_STATUS_SUCCESS if the operation succeeded. ++ */ ++static int ++qla2x00_reserve_ip_block(scsi_qla_host_t *ha, struct ip_device **ipdevblk) ++{ ++ struct ip_device *ipdev; ++ ++ /* Get free IP device block */ ++ ipdev = ha->ipdev_db_next_free; ++ if (ipdev) { ++ /* Remove IP device block from free list */ ++ ha->ipdev_db_next_free = ipdev->next; ++ ++ /* Add IP device block to top of IP device list */ ++ ipdev->next = ha->ipdev_db_top; ++ ipdev->last = NULL; ++ if (ha->ipdev_db_top == NULL) ++ ha->ipdev_db_bottom = ipdev; ++ else ++ ha->ipdev_db_top->last = ipdev; ++ ha->ipdev_db_top = ipdev; ++ ++ *ipdevblk = ipdev; ++ ++ return (QL_STATUS_SUCCESS); ++ } ++ ++ /* Out of IP blocks */ ++ DEBUG12(printk("%s: out of IP blocks\n", __func__);) ++ ++ return (QL_STATUS_RESOURCE_ERROR); ++} ++ ++/** ++ * qla2x00_update_ip_device_data() - Update IP device list with driver data. ++ * @ha: SCSI driver HA context ++ * @fcdev: SCSI driver FC device list ++ * ++ * This routine searchs for the device port name in the current IP database and ++ * updates the IP device list. ++ * ++ * If device found: ++ * - Handle device movement between public and private loops ++ * - Mark device present ++ * - Log in device if necessary ++ * If device not found and private loop device: ++ * - Insert the new entry in database ++ * If device not found and public IP device: ++ * - Ignore device until packet received from device ++ * ++ * Returns QL_STATUS_SUCCESS if the operation succeeded. ++ */ ++static int ++qla2x00_update_ip_device_data(scsi_qla_host_t *ha, fcdev_t *fcdev) ++{ ++ int status; ++ struct ip_device *ipdev; ++ ++ status = 0; ++ ++ if (!ha->flags.enable_ip) { ++ /* IP not enabled, just return */ ++ return (QL_STATUS_SUCCESS); ++ } ++ ++ /* Scan list of IP devices for match */ ++ for (ipdev = ha->ipdev_db_top; ipdev; ipdev = ipdev->next) { ++ if (memcmp(fcdev->wwn, ipdev->port_name, WWN_SIZE)) ++ continue; ++ ++ /* Found device in IP device list */ ++ DEBUG12(printk("%s: already in IP list, port ID: %x\n", ++ __func__, ++ ipdev->port_id[2] << 16 | ++ ipdev->port_id[1] << 8 | ++ ipdev->port_id[0]);) ++ ++ if (fcdev->flag != DEV_PUBLIC && ++ !(ipdev->flags & IP_DEV_FLAG_PUBLIC_DEVICE)) { ++ /* ++ * Device on private loop now, was on private loop ++ * before. ++ */ ++ DEBUG12(printk("%s: was private loop, now " ++ "private loop\n", ++ __func__);) ++ ++ /* Update private loop ID in database */ ++ ipdev->loop_id = fcdev->loop_id; ++ ipdev->flags |= IP_DEV_FLAG_PRESENT; ++ } ++ else if (fcdev->flag != DEV_PUBLIC && ++ (ipdev->flags & IP_DEV_FLAG_PUBLIC_DEVICE)) { ++ /* ++ * Device on private loop now, was public device before. ++ */ ++ DEBUG12(printk("%s: was public, now private loop\n", ++ __func__);) ++ ++ /* ++ * If loop ID changed, logout device and free loop ID. ++ */ ++ if (fcdev->loop_id != ipdev->loop_id) { ++ qla2x00_ip_send_logout_port_iocb(ha, ipdev, 0); ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ ++ /* ++ * Clear public device flag and save private ++ * loop ID in database. ++ */ ++ ipdev->flags &= ~IP_DEV_FLAG_PUBLIC_DEVICE; ++ ipdev->loop_id = fcdev->loop_id; ++ } ++ ipdev->flags |= IP_DEV_FLAG_PRESENT; ++ } ++ else if (fcdev->flag == DEV_PUBLIC && ++ !(ipdev->flags & IP_DEV_FLAG_PUBLIC_DEVICE)) { ++ /* ++ * Device public now, was on private loop before. ++ */ ++ DEBUG12(printk("%s: was private loop, now public\n", ++ __func__);) ++ ++ /* ++ * Reserve public loop ID, save it in database. ++ */ ++ status = qla2x00_reserve_loopid(ha, &ipdev->loop_id); ++ if (status == QL_STATUS_SUCCESS) { ++ /* ++ * Save port ID and set public device flag. ++ */ ++ ipdev->port_id[0] = fcdev->d_id.r.d_id[0]; ++ ipdev->port_id[1] = fcdev->d_id.r.d_id[1]; ++ ipdev->port_id[2] = fcdev->d_id.r.d_id[2]; ++ ipdev->flags |= IP_DEV_FLAG_PUBLIC_DEVICE; ++ ++ /* Login public device */ ++ status = qla2x00_ip_send_login_port_iocb(ha, ++ ipdev, 0); ++ } ++ if (status == QL_STATUS_RESOURCE_ERROR) { ++ /* Out of loop IDs */ ++ ipdev->flags &= ~IP_DEV_FLAG_PUBLIC_DEVICE; ++ } ++ } ++ else { ++ /* ++ * Device public now, was public device before. ++ */ ++ DEBUG12(printk("%s: was public, now public\n", ++ __func__);) ++ ++ /* Check if port ID changed */ ++ if (ipdev->port_id[0] != fcdev->d_id.r.d_id[0] || ++ ipdev->port_id[1] != fcdev->d_id.r.d_id[1] || ++ ipdev->port_id[2] != fcdev->d_id.r.d_id[2]) { ++ ++ /* Save new port ID */ ++ ipdev->port_id[0] = fcdev->d_id.r.d_id[0]; ++ ipdev->port_id[1] = fcdev->d_id.r.d_id[1]; ++ ipdev->port_id[2] = fcdev->d_id.r.d_id[2]; ++ ++ DEBUG12(printk("%s: Port ID changed\n", ++ __func__);) ++ ++ /* Logout public device */ ++ qla2x00_ip_send_logout_port_iocb(ha, ipdev, 0); ++ } ++ ++ /* Login public device */ ++ status = qla2x00_ip_send_login_port_iocb(ha, ipdev, 0); ++ if (status == QL_STATUS_RESOURCE_ERROR) { ++ /* Out of loop IDs */ ++ ipdev->flags &= ~IP_DEV_FLAG_PUBLIC_DEVICE; ++ } ++ } ++ return (status); ++ } ++ ++ /* Device not found in database */ ++ DEBUG12(printk("%s: device NOT in list\n", __func__);) ++ ++ /* If private loop device, add device to IP list */ ++ /* Public devices will be added as needed when packet received */ ++ if (fcdev->flag != DEV_PUBLIC) { ++ /* Add (force) new private loop device to IP list */ ++ status = qla2x00_add_new_ip_device(ha, ++ fcdev->loop_id, ++ NULL, ++ fcdev->wwn, ++ TRUE, ++ 0); ++ } ++ ++ /* The following code is temporary, until FARP supported */ ++ /* Login all IP public devices for now */ ++ if (fcdev->flag == DEV_PUBLIC) { ++ /* Add (don't force) new public device to IP list */ ++ status = qla2x00_add_new_ip_device(ha, ++ PUBLIC_LOOP_DEVICE, ++ (uint8_t *)&fcdev->d_id, ++ fcdev->wwn, ++ FALSE, ++ 0); ++ } ++ ++ return (status); ++} ++ ++/** ++ * qla2x00_ip_send_login_port_iocb() - Login to an IP device. ++ * @ha: SCSI driver HA context ++ * @ipdev: IP device to login to ++ * @ha_locked: Flag indicating if the function is called with the hardware lock ++ * ++ * This routine will build and send a mailbox IOCB to login to a fabric port. ++ * ++ * The qla2x00_ip_mailbox_iocb_done() routine will be called upon IOCB ++ * completion, where further processing is performed. ++ * ++ * Returns QL_STATUS_SUCCESS if the operation succeeded. ++ */ ++static int ++qla2x00_ip_send_login_port_iocb(scsi_qla_host_t *ha, ++ struct ip_device *ipdev, uint32_t ha_locked) ++{ ++ unsigned long flags = 0; ++ struct mbx_entry *mbxentry; ++ ++ DEBUG12(printk("%s: port ID: %x\n", ++ __func__, ++ ipdev->port_id[2]<<16 | ++ ipdev->port_id[1]<<8 | ++ ipdev->port_id[0]);) ++ ++ /* Send marker if required */ ++ if (ha->marker_needed != 0) { ++ if (ha_locked) { ++ if(__qla2x00_marker(ha, ++ 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) ++ return (QL_STATUS_ERROR); ++ } ++ else { ++ if(qla2x00_marker(ha, ++ 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) ++ return (QL_STATUS_ERROR); ++ } ++ ha->marker_needed = 0; ++ } ++ ++ if (!ha_locked) ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ mbxentry = (struct mbx_entry *)qla2x00_req_pkt(ha); ++ if (mbxentry == NULL) { ++ DEBUG12(printk("%s: failed\n", __func__);) ++ ++ if (!ha_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_ERROR); ++ } ++ ++ /* Build fabric login MBX IOCB */ ++ mbxentry->entry_type = ET_MAILBOX_COMMAND; ++ mbxentry->entry_count = 1; ++ mbxentry->sys_define1 = SOURCE_IP; ++ mbxentry->entry_status = 0; ++ mbxentry->handle = cpu_to_le32(ipdev->index | ++ (MBC_LOGIN_FABRIC_PORT << 16)); ++ mbxentry->loop_id = ipdev->loop_id; ++ mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGIN_FABRIC_PORT); ++ mbxentry->mb1 = cpu_to_le16((ipdev->loop_id << 8) | ++ (MBC_NO_PROCESS_LOGIN | ++ MBC_NO_PLOGI_IF_LOGGED_IN)); ++ mbxentry->mb2 = cpu_to_le16(ipdev->port_id[2]); ++ mbxentry->mb3 = cpu_to_le16((ipdev->port_id[1] << 8) | ++ ipdev->port_id[0]); ++ mbxentry->mb6 = __constant_cpu_to_le16(0); ++ mbxentry->mb7 = __constant_cpu_to_le16(0); ++ ++ /* Issue command to ISP */ ++ qla2x00_isp_cmd(ha); ++ ++ if (!ha_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++/** ++ * qla2x00_ip_send_logout_port_iocb() - Logout an IP device. ++ * @ha: SCSI driver HA context ++ * @ipdev: IP device to logout ++ * @ha_locked: Flag indicating if the function is called with the hardware lock ++ * ++ * This routine will build and send a mailbox IOCB to logout a fabric port. ++ * ++ * The qla2x00_ip_mailbox_iocb_done() routine will be called upon IOCB ++ * completion, where further processing is performed. ++ * ++ * Returns QL_STATUS_SUCCESS if the operation succeeded. ++ */ ++static int ++qla2x00_ip_send_logout_port_iocb(scsi_qla_host_t *ha, ++ struct ip_device *ipdev, uint32_t ha_locked) ++{ ++ unsigned long flags = 0; ++ struct mbx_entry *mbxentry; ++ ++ DEBUG12(printk("%s: port ID: %x\n", ++ __func__, ++ ipdev->port_id[2]<<16 | ++ ipdev->port_id[1]<<8 | ++ ipdev->port_id[0]);) ++ ++ /* Send marker if required */ ++ if (ha->marker_needed != 0) { ++ if (ha_locked) { ++ if(__qla2x00_marker(ha, ++ 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) ++ return (QL_STATUS_ERROR); ++ } ++ else { ++ if(qla2x00_marker(ha, ++ 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) ++ return (QL_STATUS_ERROR); ++ } ++ ha->marker_needed = 0; ++ } ++ ++ if (!ha_locked) ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ mbxentry = (struct mbx_entry *)qla2x00_req_pkt(ha); ++ if (mbxentry == NULL) { ++ DEBUG12(printk("%s: failed\n", __func__);) ++ ++ if (!ha_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_ERROR); ++ } ++ ++ /* Build fabric logout MBX IOCB */ ++ mbxentry->entry_type = ET_MAILBOX_COMMAND; ++ mbxentry->entry_count = 1; ++ mbxentry->sys_define1 = SOURCE_IP; ++ mbxentry->entry_status = 0; ++ mbxentry->handle = cpu_to_le32(ipdev->index | ++ (MBC_LOGOUT_FABRIC_PORT << 16)); ++ mbxentry->loop_id = ipdev->loop_id; ++ mbxentry->mb0 = __constant_cpu_to_le16(MBC_LOGOUT_FABRIC_PORT); ++ mbxentry->mb1 = cpu_to_le16(ipdev->loop_id << 8); ++ mbxentry->mb2 = __constant_cpu_to_le16(0); ++ mbxentry->mb3 = __constant_cpu_to_le16(0); ++ mbxentry->mb6 = __constant_cpu_to_le16(0); ++ mbxentry->mb7 = __constant_cpu_to_le16(0); ++ ++ /* Issue command to ISP */ ++ qla2x00_isp_cmd(ha); ++ ++ if (!ha_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++/** ++ * qla2x00_ip_mailbox_iocb_done() - Process an mailbox IOCB completion. ++ * @ha: SCSI driver HA context ++ * @mbxentry: completed mailbox IOCB entry ++ * ++ * This routine is currently used for fabric login and logouts only. ++ */ ++static void ++qla2x00_ip_mailbox_iocb_done(scsi_qla_host_t *ha, struct mbx_entry *mbxentry) ++{ ++ int status; ++ uint16_t cmd; ++ uint16_t index; ++ struct ip_device *ipdev; ++// FIXME: endianess? ++ /* Parse-out originating mailbox command */ ++ cmd = MSW(mbxentry->handle); ++ ++ DEBUG12(printk("%s: cmd %x, status %x, mb0 %x, mb1 %x, mb2 %x\n", ++ __func__, ++ cmd, ++ mbxentry->status, ++ mbxentry->mb0, ++ mbxentry->mb1, ++ mbxentry->mb2);) ++ ++ /* Get device block pointer */ ++ index = LSW(mbxentry->handle); ++ if (index >= QLLAN_MAX_IP_DEVICES) { ++ /* Bad handle from ISP */ ++ DEBUG12(printk("%s: bad handle from isp\n", __func__);) ++ ++ /* TODO: Cleanup??? */ ++ ++ return; ++ } ++ ++ ipdev = &ha->ipdev_db[index]; ++ ++ if (cmd == MBC_LOGOUT_FABRIC_PORT) { ++ /* Check fabric logout completion status */ ++ if (/*mbxentry->status == CS_COMPLETE && */ ++ mbxentry->mb0 == MBS_COMMAND_COMPLETE) { ++ ++ /* Logout successful -- do nothing */ ++ } ++ else { ++ DEBUG12(printk("%s: fabric logout failed\n", __func__);) ++ } ++ } ++ else { ++ /* Check fabric login completion status */ ++ /* Note: sometimes ISP returns Status=0x30 and MB0=0x4000 */ ++ /* Therefore, only check mb0 for now */ ++ if (/* mbxentry->status == CS_COMPLETE && */ ++ mbxentry->mb0 == MBS_COMMAND_COMPLETE) { ++ ++ /* Login successful */ ++ ipdev->flags |= IP_DEV_FLAG_PRESENT; ++ } ++ else if (mbxentry->mb0 == MBS_PORT_ID_IN_USE) { ++ /* Different loop ID already assigned to port ID */ ++ /* Use the one that is already assigned */ ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ ipdev->loop_id = mbxentry->mb1; ++ ++ /* Do logout first and then relogin */ ++ qla2x00_ip_send_logout_port_iocb(ha, ipdev, 1); ++ qla2x00_ip_send_login_port_iocb(ha, ipdev, 1); ++ } ++ else if (mbxentry->mb0 == MBS_LOOP_ID_IN_USE) { ++ /* Loop ID already used for different port ID */ ++ /* Get a new loop ID and reissue login request */ ++ status = qla2x00_reserve_loopid(ha, &ipdev->loop_id); ++ if (status == QL_STATUS_SUCCESS) { ++ qla2x00_ip_send_login_port_iocb(ha, ipdev, 1); ++ } ++ else { ++ DEBUG12(printk("%s: out of loop IDs\n", ++ __func__);) ++ ++ qla2x00_free_ip_block(ha, ipdev); ++ } ++ } ++ else { ++ /* Login failed, return resources */ ++ DEBUG12(printk("%s: fabric login failed\n", __func__);) ++ ++ qla2x00_free_loopid(ha, ipdev->loop_id); ++ qla2x00_free_ip_block(ha, ipdev); ++ } ++ } ++} ++ ++ ++/** ++ * qla2x00_ip_inquiry() - Discover IP-capable adapters. ++ * @adapter_num: adapter number to check (instance) ++ * @inq_data: return bd_inquiry data of the discovered adapter ++ * ++ * This routine is called by the IP driver to discover adapters that support IP ++ * and to get adapter parameters from the SCSI driver. ++ * ++ * Returns TRUE if the specified adapter supports IP. ++ */ ++#if defined (ISP2200) ++int ++qla2200_ip_inquiry(uint16_t adapter_num, struct bd_inquiry *inq_data) ++#elif defined(ISP2300) ++int ++qla2300_ip_inquiry(uint16_t adapter_num, struct bd_inquiry *inq_data) ++#endif ++{ ++ int found; ++ struct list_head *hal; ++ scsi_qla_host_t *ha; ++ ++ /* Verify structure size and version */ ++ if ((inq_data->length != BDI_LENGTH) || ++ (inq_data->version != BDI_VERSION)) { ++ ++ DEBUG12(printk("%s: incompatable structure\n", __func__);) ++ return (FALSE); ++ } ++ ++ /* Find the specified host adapter */ ++ ha = NULL; ++ found = 0; ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (ha->instance == adapter_num) { ++ found++; ++ break; ++ } ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ if (found) { ++ if (!ha->flags.online) ++ return (FALSE); ++ ++ DEBUG12(printk("%s: found adapter %d\n", ++ __func__, ++ adapter_num);) ++ ++ /* Return inquiry data to backdoor IP driver */ ++ set_bit(BDI_IP_SUPPORT, &inq_data->options); ++ if (ha->flags.enable_64bit_addressing) ++ set_bit(BDI_64BIT_ADDRESSING, &inq_data->options); ++ inq_data->ha = ha; ++ inq_data->risc_rec_q = ha->risc_rec_q; ++ inq_data->risc_rec_q_size = IP_BUFFER_QUEUE_DEPTH; ++ inq_data->link_speed = ha->current_speed; ++ memcpy(inq_data->port_name, ha->ip_port_name, WWN_SIZE); ++ inq_data->pdev = ha->pdev; ++ inq_data->ip_enable_routine = qla2x00_ip_enable; ++ inq_data->ip_disable_routine = qla2x00_ip_disable; ++ inq_data->ip_add_buffers_routine = qla2x00_add_buffers; ++ inq_data->ip_send_packet_routine = qla2x00_send_packet; ++ inq_data->ip_tx_timeout_routine = qla2x00_tx_timeout; ++ return (TRUE); ++ } ++ return (FALSE); ++} ++ ++/** ++ * qla2x00_ip_enable() - Create IP-driver/SCSI-driver IP connection. ++ * @ha: SCSI driver HA context ++ * @enable_data: bd_enable data describing the IP connection ++ * ++ * This routine is called by the IP driver to enable an IP connection to the ++ * SCSI driver and to pass in IP driver parameters. ++ * ++ * The HA context is propagated with the specified @enable_data and the ++ * Firmware is initialized for IP support. ++ * ++ * Returns TRUE if the IP connection was successfully enabled. ++ */ ++static int ++qla2x00_ip_enable(scsi_qla_host_t *ha, struct bd_enable *enable_data) ++{ ++ int status; ++ ++ DEBUG12(printk("%s: enable adapter %d\n", __func__, (int)ha->host_no);) ++ ++ status = FALSE; ++ ++ /* Verify structure size and version and adapter online */ ++ if (!(ha->flags.online) || ++ (enable_data->length != BDE_LENGTH) || ++ (enable_data->version != BDE_VERSION)) { ++ ++ DEBUG12(printk("%s: incompatable structure or offline\n", ++ __func__);) ++ return (status); ++ } ++ ++ /* Save parameters from IP driver */ ++ ha->mtu = enable_data->mtu; ++ ha->header_size = enable_data->header_size; ++ ha->receive_buffers = enable_data->receive_buffers; ++ ha->max_receive_buffers = enable_data->max_receive_buffers; ++ ha->receive_buff_data_size = enable_data->receive_buff_data_size; ++ if (test_bit(BDE_NOTIFY_ROUTINE, &enable_data->options)) { ++ ha->notify_routine = enable_data->notify_routine; ++ ha->notify_context = enable_data->notify_context; ++ } ++ ha->send_completion_routine = enable_data->send_completion_routine; ++ ha->receive_packets_routine = enable_data->receive_packets_routine; ++ ha->receive_packets_context = enable_data->receive_packets_context; ++ ++ /* Enable RISC IP support */ ++ status = qla2x00_ip_initialize(ha); ++ if (!status) { ++ DEBUG12(printk("%s: IP initialization failed", __func__);) ++ ha->notify_routine = NULL; ++ } ++ return (status); ++} ++ ++/** ++ * qla2x00_ip_disable() - Remove IP-driver/SCSI-driver IP connection. ++ * @ha: SCSI driver HA context ++ * ++ * This routine is called by the IP driver to disable a previously created IP ++ * connection. ++ * ++ * A Firmware call to disable IP support is issued. ++ */ ++static void ++qla2x00_ip_disable(scsi_qla_host_t *ha) ++{ ++ int rval; ++ static mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG12(printk("%s: disable adapter %d\n", __func__, (int)ha->host_no);) ++ ++ /* Wait for a ready state from the adapter */ ++ while (!ha->init_done || ha->dpc_active) { ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ); ++ } ++ ++ /* Disable IP support */ ++ ha->flags.enable_ip = FALSE; ++ ++ mcp->mb[0] = MBC_DISABLE_IP; ++ mcp->out_mb = MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = qla2x00_mailbox_command(ha, mcp); ++ if (rval == QL_STATUS_SUCCESS) { ++ /* IP disabled successful */ ++ DEBUG12(printk(KERN_INFO ++ "%s: successful\n", __func__);) ++ } ++ else { ++ DEBUG12(printk(KERN_WARNING ++ "%s: MBC_DISABLE_IP failed\n", __func__);) ++ } ++ ++ /* Reset IP parameters */ ++ ha->rec_entries_in = 0; ++ ha->rec_entries_out = 0; ++ ha->notify_routine = NULL; ++} ++ ++/** ++ * qla2x00_add_buffers() - Adds buffers to the receive buffer queue. ++ * @ha: SCSI driver HA context ++ * @rec_count: The number of receive buffers to add to the queue ++ * @ha_locked: Flag indicating if the function is called with the hardware lock ++ * ++ * This routine is called by the IP driver to pass new buffers to the receive ++ * buffer queue. ++ */ ++static void ++qla2x00_add_buffers(scsi_qla_host_t *ha, uint16_t rec_count, int ha_locked) ++{ ++ int i; ++ uint16_t rec_in; ++ uint16_t handle; ++ unsigned long flags = 0; ++ device_reg_t *reg; ++ struct risc_rec_entry *risc_rec_q; ++ struct buffer_cb *bcbs; ++ ++ flags = 0; ++ risc_rec_q = ha->risc_rec_q; ++ rec_in = ha->rec_entries_in; ++ bcbs = ha->receive_buffers; ++ ++ /* Set RISC owns buffer flag on new entries */ ++ for (i = 0; i < rec_count; i++) { ++ handle = risc_rec_q[rec_in].handle; ++ set_bit(BCB_RISC_OWNS_BUFFER, &(bcbs[handle].state)); ++ if (rec_in < IP_BUFFER_QUEUE_DEPTH - 1) ++ rec_in++; ++ else ++ rec_in = 0; ++ } ++ ++ /* Update RISC buffer pointer */ ++ if (!ha_locked) ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ reg = ha->iobase; ++ WRT_REG_WORD(®->mailbox8, rec_in); ++ ha->rec_entries_in = rec_in; ++ ++ if (!ha_locked) ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++} ++ ++/** ++ * qla2x00_send_packet() - Transmit a send_cb. ++ * @ha: SCSI driver HA context ++ * @scb: The send_cb structure to send ++ * ++ * This routine is called by the IP driver to pass @scb (IP packet) to the ISP ++ * for transmission. ++ * ++ * Returns QL_STATUS_SUCCESS if @scb was sent, QL_STATUS_RESOURCE_ERROR if the ++ * RISC was too busy to send, or QL_STATUS_ERROR. ++ */ ++static int ++qla2x00_send_packet(scsi_qla_host_t *ha, struct send_cb *scb) ++{ ++ int i; ++ uint16_t cnt; ++ uint16_t temp; ++ uint32_t handle; ++ unsigned long flags; ++ struct ip_cmd_entry *ipcmd_entry; ++ struct sk_buff *skb; ++ device_reg_t *reg; ++ ++ DEBUG12(printk("%s: enter\n", __func__);) ++ ++ skb = scb->skb; ++ reg = ha->iobase; ++ ++ /* Check adapter state */ ++ if (!ha->flags.online) { ++ return (QL_STATUS_ERROR); ++ } ++ ++ /* Send marker if required */ ++ if (ha->marker_needed != 0) { ++ if(qla2x00_marker(ha, 0, 0, MK_SYNC_ALL) != QLA2X00_SUCCESS) { ++ printk(KERN_WARNING ++ "%s: Unable to issue marker.\n", ++ __func__); ++ return (QL_STATUS_ERROR); ++ } ++ ha->marker_needed = 0; ++ } ++ ++ /* Acquire ring specific lock */ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ if (ha->req_q_cnt < 4) { ++ /* Update number of free request entries */ ++ cnt = qla2x00_debounce_register(ISP_REQ_Q_OUT(reg)); ++ if (ha->req_ring_index < cnt) ++ ha->req_q_cnt = cnt - ha->req_ring_index; ++ else ++ ha->req_q_cnt = REQUEST_ENTRY_CNT - ++ (ha->req_ring_index - cnt); ++ } ++ ++ if (ha->req_q_cnt >= 4) { ++ /* Get tag handle for command */ ++ handle = ha->current_scb_q_idx; ++ for (i = 0; i < MAX_SEND_PACKETS; i++) { ++ handle++; ++ if (handle == MAX_SEND_PACKETS) ++ handle = 0; ++ if (ha->active_scb_q[handle] == NULL) { ++ ha->current_scb_q_idx = handle; ++ goto found_handle; ++ } ++ } ++ } ++ ++ /* Low on resources, try again later */ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ printk(KERN_WARNING ++ "%s: Low on resources, try again later...\n", ++ __func__); ++ ++ return (QL_STATUS_RESOURCE_ERROR); ++ ++found_handle: ++ ++ /* Build ISP command packet */ ++ ipcmd_entry = (struct ip_cmd_entry *)ha->request_ring_ptr; ++ ++ /* OPTIMIZATION ??? */ ++ /* Throughput increases an additional 10 Mbps with the following code */ ++ *((uint32_t *)(&ipcmd_entry->entry_type)) = ++ __constant_cpu_to_le32(ET_IP_COMMAND_64 | (1 << 8)); ++ //ipcmd_entry->entry_type = ET_IP_COMMAND_64; ++ //ipcmd_entry->entry_count = 1; ++ //ipcmd_entry->sys_define = 0; ++ //ipcmd_entry->entry_status = 0; ++ ++ ipcmd_entry->handle = handle; ++ ipcmd_entry->reserved_1 = 0; ++ ++ /* Get destination loop ID for packet */ ++ if (!qla2x00_get_ip_loopid(ha, scb->header, &ipcmd_entry->loop_id)) { ++ /* Failed to get loop ID, convert packet to ARP */ ++ if (qla2x00_convert_to_arp(ha, scb)) { ++ /* Broadcast ARP */ ++ ipcmd_entry->loop_id = BROADCAST; ++ } ++ else { ++ /* Return packet */ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ printk(KERN_WARNING ++ "%s: Unable to determine loop id for " ++ "destination.\n", ++ __func__); ++ return (QL_STATUS_ERROR); ++ } ++ } ++ ++ /* Default five second firmware timeout */ ++ ipcmd_entry->timeout = __constant_cpu_to_le16(5); ++ ipcmd_entry->control_flags = __constant_cpu_to_le16(CF_WRITE); ++ ipcmd_entry->reserved_2 = 0; ++ ipcmd_entry->service_class = __constant_cpu_to_le16(0); ++ ++ ipcmd_entry->data_seg_count = __constant_cpu_to_le16(2); ++ ipcmd_entry->ds.data_segs64[0].address[0] = ++ cpu_to_le32(LSD(scb->header_dma)); ++ ipcmd_entry->ds.data_segs64[0].address[1] = ++ cpu_to_le32(MSD(scb->header_dma)); ++ ipcmd_entry->ds.data_segs64[0].length = ++ __constant_cpu_to_le32(sizeof(struct packet_header)); ++ scb->skb_data_dma = pci_map_single(ha->pdev, ++ skb->data, skb->len, ++ PCI_DMA_TODEVICE); ++ ipcmd_entry->ds.data_segs64[1].address[0] = ++ cpu_to_le32(LSD(scb->skb_data_dma)); ++ ipcmd_entry->ds.data_segs64[1].address[1] = ++ cpu_to_le32(MSD(scb->skb_data_dma)); ++ ipcmd_entry->ds.data_segs64[1].length = cpu_to_le32(skb->len); ++ ++ ipcmd_entry->byte_count = ++ cpu_to_le32(skb->len + sizeof(struct packet_header)); ++ ++ /* Adjust ring index. */ ++ ha->req_ring_index++; ++ if (ha->req_ring_index == REQUEST_ENTRY_CNT) { ++ ha->req_ring_index = 0; ++ ha->request_ring_ptr = ha->request_ring; ++ } else ++ ha->request_ring_ptr++; ++ ++ ha->ipreq_cnt++; ++ ha->req_q_cnt--; ++ ha->active_scb_q[handle] = scb; ++ ++ /* Set chip new ring index. */ ++ temp = CACHE_FLUSH(ISP_REQ_Q_IN(reg)); ++ WRT_REG_WORD(ISP_REQ_Q_IN(reg), ha->req_ring_index); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++/** ++ * qla2x00_tx_timeout() - Handle transmission timeout. ++ * @ha: SCSI driver HA context ++ * ++ * This routine is called by the IP driver to handle packet transmission ++ * timeouts. ++ * ++ * Returns QL_STATUS_SUCCESS if timeout handling completed successfully. ++ */ ++static int ++qla2x00_tx_timeout(scsi_qla_host_t *ha) ++{ ++ /* TODO: complete interface */ ++ ++ /* Reset RISC firmware for basic recovery */ ++ printk(KERN_WARNING ++ "%s: A transmission timeout occured - aborting ISP\n", ++ __func__); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ ++ return (QL_STATUS_SUCCESS); ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_ip.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,420 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 IP network driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++/**************************************************************************** ++ Please see revision.notes for revision history. ++*****************************************************************************/ ++ ++#if !defined(_QLA_IP_H_) ++#define _QLA_IP_H_ ++ ++#define MAX_SEND_PACKETS 32 /* Maximum # send packets */ ++#define MAX_RECEIVE_BUFFERS 64 /* Maximum # receive buffers */ ++#define MIN_RECEIVE_BUFFERS 8 /* Minimum # receive buffers */ ++#define IP_BUFFER_QUEUE_DEPTH (MAX_RECEIVE_BUFFERS+1) ++ ++/* Async notification types */ ++#define NOTIFY_EVENT_LINK_DOWN 1 /* Link went down */ ++#define NOTIFY_EVENT_LINK_UP 2 /* Link is back up */ ++#define NOTIFY_EVENT_RESET_DETECTED 3 /* Reset detected */ ++ ++/* QLogic subroutine status definitions */ ++#define QL_STATUS_SUCCESS 0 ++#define QL_STATUS_ERROR 1 ++#define QL_STATUS_FATAL_ERROR 2 ++#define QL_STATUS_RESOURCE_ERROR 3 ++#define QL_STATUS_LOOP_ID_IN_USE 4 ++#define QL_STATUS_NO_DATA 5 ++ ++/************************************************************************/ ++/* RFC 2625 -- networking structure definitions */ ++/************************************************************************/ ++ ++/* Network header definitions */ ++struct network_address ++{ ++#if defined(__LITTLE_ENDIAN_BITFIELD) ++ __u16 unused:12, ++ naa:4; ++#elif defined (__BIG_ENDIAN_BITFIELD) ++ __u16 naa:4, ++ unused:12; ++#else ++#error "Please fix " ++#endif ++ ++#define NAA_IEEE_MAC_TYPE 1 /* NAA code - IEEE MAC addr */ ++ ++ __u8 addr[6]; ++}; ++ ++struct network_header ++{ ++ union ++ { ++ struct network_address na; ++ __u8 fcaddr[8]; ++ } d; ++ ++ union ++ { ++ struct network_address na; ++ __u8 fcaddr[8]; ++ } s; ++}; ++ ++/* SNAP header definitions */ ++/* from linux/if_fc.h */ ++struct snap_header ++{ ++ __u8 dsap; /* destination SAP */ ++ __u8 ssap; /* source SAP */ ++#define LLC_SAP_IEEE_802DOT2 0xAA /* LLC SAP code - IEEE 802.2 */ ++ ++ __u8 llc; /* LLC control field */ ++#define LLC_CONTROL 0x03 /* LLC control code */ ++ ++ __u8 protid[3]; /* protocol id */ ++#define SNAP_OUI 0x00 /* SNAP OUI code */ ++ ++ __u16 ethertype; /* ether type field */ ++}; ++ ++/* Packet header definitions */ ++struct packet_header ++{ ++ struct network_header networkh; ++ struct snap_header snaph; ++}; ++ ++/* ARP header definitions */ ++/* from linux/if_arp.h */ ++struct arp_header ++{ ++ struct arphdr arph; ++ __u8 ar_sha[ETH_ALEN]; /* sender hardware address */ ++ __u32 ar_sip; /* sender IP address */ ++ __u8 ar_tha[ETH_ALEN]; /* target hardware address */ ++ __u32 ar_tip; /* target IP address */ ++}; ++ ++/* IP header definitions */ ++struct ip_header ++{ ++ struct iphdr iph; ++ __u32 options; /* IP packet options */ ++}; ++ ++ ++/************************************************************************/ ++/* Support structures. */ ++/************************************************************************/ ++ ++/* Definitions for IP support */ ++#define LOOP_ID_MASK 0x00FF ++#define PLE_NOT_SCSI_DEVICE 0x8000 /* Upper bit of loop ID set */ ++ /* if not SCSI */ ++ ++/* Receive buffer control block definitions */ ++struct buffer_cb ++{ ++ uint16_t handle; /* ISP buffer handle */ ++ uint16_t comp_status; /* completion status from FW */ ++ ++ uint32_t state; /* Buffer CB state */ ++#define BCB_RISC_OWNS_BUFFER 1 ++ ++ struct sk_buff *skb; /* Socket buffer */ ++ uint8_t *skb_data; /* Socket buffer data */ ++ dma_addr_t skb_data_dma; /* SKB data physical address */ ++ uint32_t rec_data_size; /* Size of received data */ ++ uint32_t packet_size; /* Size of packet received */ ++ ++ uint16_t linked_bcb_cnt; /* # of linked CBs for packet */ ++ uint16_t unused2; ++ struct buffer_cb *next_bcb; /* Next buffer CB */ ++}; ++ ++/* Send control block definitions */ ++struct send_cb ++{ ++ uint16_t comp_status; /* completion status from FW */ ++#define SCB_CS_COMPLETE 0x0 ++#define SCB_CS_INCOMPLETE 0x1 ++#define SCB_CS_RESET 0x4 ++#define SCB_CS_ABORTED 0x5 ++#define SCB_CS_TIMEOUT 0x6 ++#define SCB_CS_PORT_UNAVAILABLE 0x28 ++#define SCB_CS_PORT_LOGGED_OUT 0x29 ++#define SCB_CS_PORT_CONFIG_CHG 0x2A ++#define SCB_CS_FW_RESOURCE_UNAVAILABLE 0x2C ++ ++ uint16_t unused1; ++ ++ void *qdev; /* netdev private structure */ ++ ++ struct packet_header *header; /* Network and SNAP headers */ ++ dma_addr_t header_dma; /* Header physical address */ ++ ++ struct sk_buff *skb; /* socket buffer to send */ ++ dma_addr_t skb_data_dma; /* skb data physical address */ ++}; ++ ++/* IP device data structure */ ++#define QLLAN_MAX_IP_DEVICES 64 /* Maximum number of IP devices */ ++ ++struct ip_device ++{ ++ uint16_t index; ++ uint16_t unused1; ++ ++ uint32_t flags; ++#define IP_DEV_FLAG_PRESENT 0x00000001 ++#define IP_DEV_FLAG_PUBLIC_DEVICE 0x00000002 ++ ++ uint16_t loop_id; ++#define PUBLIC_LOOP_DEVICE ((uint16_t)-1) ++ ++ uint16_t unused2; ++ uint8_t port_id[3]; ++ uint8_t unused3; ++ uint8_t port_name[8]; ++ ++ struct ip_device *next; ++ struct ip_device *last; ++}; ++ ++/************************************************************************/ ++/* Definitions for Backdoor Inquiry. */ ++/************************************************************************/ ++ ++struct bd_inquiry ++{ ++ uint16_t length; /* Length of structure */ ++#define BDI_LENGTH sizeof(struct bd_inquiry) ++ ++ uint16_t version; /* Structure version number */ ++/* NOTE: Update this value anytime the structure changes */ ++#define BDI_VERSION 2 ++ ++ /* Exports */ ++ uint32_t options; /* supported options */ ++#define BDI_IP_SUPPORT 1 /* IP supported */ ++#define BDI_64BIT_ADDRESSING 2 /* 64bit address supported */ ++ ++ void *ha; /* Driver ha pointer */ ++ void *risc_rec_q; /* RISC receive queue */ ++ uint16_t risc_rec_q_size; /* size */ ++ ++ uint16_t link_speed; /* Current link speed */ ++#define BDI_1GBIT_PORTSPEED 1 /* operating at 1GBIT */ ++#define BDI_2GBIT_PORTSPEED 2 /* operating at 2GBIT */ ++#define BDI_10GBIT_PORTSPEED 4 /* operating at 10GBIT */ ++ ++ uint8_t port_name[8]; /* Adapter port name */ ++ ++ struct pci_dev *pdev; /* PCI device information */ ++ ++ /* Pointers to SCSI-backdoor callbacks */ ++ void *ip_enable_routine; ++ void *ip_disable_routine; ++ void *ip_add_buffers_routine; ++ void *ip_send_packet_routine; ++ void *ip_tx_timeout_routine; ++ ++ uint32_t unused2[9]; ++}; ++ ++/************************************************************************/ ++/* Definitions for Backdoor Enable. */ ++/************************************************************************/ ++ ++struct bd_enable ++{ ++ uint16_t length; /* Length of structure */ ++#define BDE_LENGTH sizeof(struct bd_enable) ++ ++ uint16_t version; /* Structure version number */ ++/* NOTE: Update this value anytime the structure changes */ ++#define BDE_VERSION 2 ++ ++ /* Imports */ ++ uint32_t options; /* supported options */ ++#define BDE_NOTIFY_ROUTINE 1 /* notify routine imported */ ++ ++ uint32_t mtu; /* maximum transfer size */ ++ uint16_t header_size; /* split header size */ ++ uint16_t unused1; ++ ++ void *receive_buffers; /* receive buffers array */ ++ uint16_t max_receive_buffers; /* max # receive buffers */ ++ uint16_t unused2; ++ uint32_t receive_buff_data_size; /* buffer size */ ++ ++ /* Pointers to IP-backdoor callbacks */ ++ void *notify_routine; ++ void *notify_context; ++ void *send_completion_routine; ++ void *receive_packets_routine; ++ void *receive_packets_context; ++ ++ uint32_t unused3[9]; ++}; ++ ++ ++/************************************************************************/ ++/* RISC interface structures */ ++/************************************************************************/ ++ ++/* IP mailbox commands */ ++#define MBC_INITIALIZE_IP 0x0077 ++#define MBC_DISABLE_IP 0x0079 ++ ++/* IP async events */ ++#define MBA_IP_TRANSMIT_COMPLETE 0x8022 ++#define MBA_IP_RECEIVE_COMPLETE 0x8023 ++#define MBA_IP_BROADCAST_RECEIVED 0x8024 ++#define MBA_IP_RECEIVE_BUFFERS_LOW 0x8025 ++#define MBA_IP_OUT_OF_BUFFERS 0x8026 ++#define MBA_IP_RECEIVE_COMPLETE_SPLIT 0x8027 ++ ++/* IP fast post completions for 2300 */ ++#define RHS_IP_SEND_COMPLETE 0x18 ++#define RHS_IP_RECV_COMPLETE 0x19 ++#define RHS_IP_RECV_DA_COMPLETE 0x1B ++ ++/* RISC IP receive buffer queue entry structure */ ++struct risc_rec_entry ++{ ++ uint32_t data_addr_low; ++ uint32_t data_addr_high; ++ uint16_t handle; ++ uint16_t unused; ++}; ++ ++/* Firmware IP initialization control block definitions */ ++struct ip_init_cb ++{ ++ uint8_t version; ++#define IPICB_VERSION 0x01 ++ ++ uint8_t reserved_1; ++ ++ uint16_t firmware_options; ++#define IPICB_OPTION_64BIT_ADDRESSING 0x0001 ++#define IPICB_OPTION_NO_BROADCAST_FASTPOST 0x0002 ++#define IPICB_OPTION_OUT_OF_BUFFERS_EVENT 0x0004 ++ ++ uint16_t header_size; ++ uint16_t mtu; ++ uint16_t receive_buffer_size; ++ uint16_t reserved_2; ++ uint16_t reserved_3; ++ uint16_t reserved_4; ++ uint16_t reserved_5; ++ ++ uint16_t receive_queue_size; ++ uint16_t low_water_mark; ++#define IPICB_LOW_WATER_MARK 0 ++ ++ uint16_t receive_queue_addr[4]; ++ uint16_t receive_queue_in; ++ uint16_t fast_post_count; ++#define IPICB_FAST_POST_COUNT 4 ++ ++ uint16_t container_count; ++#define IPICB_BUFFER_CONTAINER_COUNT 64 ++ ++ uint16_t resource_allocation; ++#define IPICB_IOCB_RESERVE_COUNT 250 ++}; ++ ++ ++/* IP IOCB types */ ++ ++/* Data segment descriptor structures */ ++struct data_seg ++{ ++ uint32_t address; ++ uint32_t length; ++}; ++ ++struct data_seg_a64 ++{ ++ uint32_t address[2]; ++ uint32_t length; ++}; ++ ++/* IP Command IOCB structure */ ++struct ip_cmd_entry ++{ ++ uint8_t entry_type; ++#define ET_IP_COMMAND_32 0x13 ++#define ET_IP_COMMAND_64 0x1B ++ ++ uint8_t entry_count; ++ uint8_t sys_define; ++ uint8_t entry_status; ++ ++ uint32_t handle; ++ uint8_t reserved_1; ++ uint8_t loop_id; ++ uint16_t comp_status; ++ uint16_t control_flags; ++ uint16_t reserved_2; ++ uint16_t timeout; ++ uint16_t data_seg_count; ++ uint16_t service_class; ++ uint16_t reserved_3[7]; ++ uint32_t byte_count; ++ union ++ { ++ struct data_seg data_segs[3]; ++ struct data_seg_a64 data_segs64[2]; ++ } ds; ++}; ++ ++/* IP Receive IOCB structure */ ++#define ET_IP_RECEIVE_CONTINUATION 0x2B ++ ++struct ip_rec_entry ++{ ++ uint8_t entry_type; ++#define ET_IP_RECEIVE 0x23 ++ ++ uint8_t entry_count; ++ uint8_t segment_count; ++ uint8_t entry_status; ++ ++ uint16_t s_idlow; ++ uint8_t s_idhigh; ++ uint8_t reserved_1; ++ uint8_t reserved_2; ++ uint8_t loop_id; ++ uint16_t comp_status; ++#define IPREC_STATUS_SPLIT_BUFFER 0x0001 ++ ++ uint16_t service_class; ++ uint16_t sequence_length; ++ ++#define IPREC_MAX_HANDLES 24 ++ uint16_t buffer_handles[IPREC_MAX_HANDLES]; ++}; ++ ++#endif /* _QLA_IP_H_ */ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_isr.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,1474 @@ ++/* ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ */ ++ ++#include "qla_os.h" ++ ++#include "qla_def.h" ++ ++static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t); ++static void qla2x00_async_event(scsi_qla_host_t *, uint32_t); ++static void qla2x00_process_completed_request(struct scsi_qla_host *, int); ++static void qla2x00_response_pkt(scsi_qla_host_t *, uint16_t); ++static void qla2x00_status_entry(scsi_qla_host_t *, sts_entry_t *); ++static void qla2x00_status_cont_entry(scsi_qla_host_t *, sts_cont_entry_t *); ++static void qla2x00_error_entry(scsi_qla_host_t *, response_t *); ++static void qla2x00_ms_entry(scsi_qla_host_t *, ms_iocb_entry_t *); ++ ++static int qla2x00_check_sense(Scsi_Cmnd *cp, os_lun_t *); ++ ++/** ++ * qla2x00_intr_handler() - Process interrupts for the ISP. ++ * @irq: ++ * @dev_id: SCSI driver HA context ++ * @regs: ++ * ++ * Called by system whenever the host adapter generates an interrupt. ++ * ++ * Returns handled flag. ++ */ ++irqreturn_t ++qla2x00_intr_handler(int irq, void *dev_id, struct pt_regs *regs) ++{ ++ scsi_qla_host_t *ha; ++ device_reg_t *reg; ++ uint32_t mbx; ++ uint16_t stat; ++ int status = 0; ++ unsigned long flags = 0; ++ unsigned long mbx_flags = 0; ++ unsigned long intr_iter; ++ ++ /* Don't loop forever, interrupt are OFF */ ++ intr_iter = 50; ++ ++ ha = (scsi_qla_host_t *) dev_id; ++ if (!ha) { ++ printk(KERN_INFO ++ "%s(): NULL host pointer\n", __func__); ++ return (IRQ_NONE); ++ } ++ ++ reg = ha->iobase; ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ for (;;) { ++ /* Relax CPU! */ ++ if (!(intr_iter--)) ++ break; ++ ++#if defined(ISP2100) || defined(ISP2200) ++ if ((RD_REG_WORD(®->istatus) & ISR_RISC_INT) == 0) { ++ break; ++ } ++ ++ if (RD_REG_WORD(®->semaphore) & BIT_0) { ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ ++ /* Get mailbox data. */ ++ mbx = RD_REG_WORD(®->mailbox0); ++ if (mbx > 0x3fff && mbx < 0x8000) { ++ qla2x00_mbx_completion(ha, (uint16_t)mbx); ++ status |= MBX_INTERRUPT; ++ } else if (mbx > 0x7fff && mbx < 0xc000) { ++ qla2x00_async_event(ha, mbx); ++ } else { ++ /*EMPTY*/ ++ DEBUG2(printk("scsi(%ld): Unrecognized " ++ "interrupt type (%d)\n", ++ ha->host_no, mbx)); ++ } ++ /* Release mailbox registers. */ ++ WRT_REG_WORD(®->semaphore, 0); ++ } else { ++ stat = RD_REG_WORD(®->mailbox5); ++ qla2x00_response_pkt(ha, stat); ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ } ++ ++#else /* ISP2300 */ ++ if ((ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) && ++ (RD_REG_WORD(®->istatus) & ISR_RISC_INT) == 0) { ++ break; ++ } ++ ++ stat = RD_REG_WORD(®->host_status_lo); ++ if ((stat & HSR_INT) == 0) { ++ break; ++ } ++ if (stat & HSR_RISC_PAUSED) { ++ uint16_t hccr; ++ ++ hccr = RD_REG_WORD(®->hccr); ++ printk(KERN_INFO ++ "scsi(%ld): RISC paused, dumping HCCR (%x)\n", ++ ha->host_no, ++ hccr); ++ ++ /* ++ * Issue a "HARD" reset in order for the RISC interrupt ++ * bit to be cleared. Schedule a big hammmer to get ++ * out of the RISC PAUSED state. ++ */ ++ WRT_REG_WORD(®->hccr, HCCR_RESET_RISC); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ break; ++ } ++ mbx = RD_REG_WORD(®->host_status_hi); ++ switch (stat & 0xff) { ++ case 0x1: ++ case 0x2: ++ case 0x10: ++ case 0x11: ++ qla2x00_mbx_completion(ha, (uint16_t)mbx); ++ status |= MBX_INTERRUPT; ++ ++ /* Release mailbox registers. */ ++ WRT_REG_WORD(®->semaphore, 0); ++ break; ++ case 0x12: ++ qla2x00_async_event(ha, mbx); ++ break; ++ case 0x13: ++ qla2x00_response_pkt(ha, (uint16_t)mbx); ++ break; ++ case 0x16: ++ mbx = mbx << 16 | MBA_SCSI_COMPLETION; ++ qla2x00_async_event(ha, mbx); ++ break; ++#if defined(FC_IP_SUPPORT) ++ case 0x18: ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ qla2x00_ip_send_complete(ha, mbx, CS_COMPLETE); ++ continue; ++ break; ++ case 0x19: ++ qla2x00_ip_receive_fastpost(ha, ++ MBA_IP_RECEIVE_COMPLETE); ++ break; ++ case 0x1b: ++ qla2x00_ip_receive_fastpost(ha, ++ MBA_IP_RECEIVE_COMPLETE_SPLIT); ++ break; ++#endif ++ default: ++ DEBUG2(printk("scsi(%ld): Unrecognized interrupt type " ++ "(%d)\n", ++ ha->host_no, stat & 0xff)); ++ break; ++ } ++ ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++#endif ++ } ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ ha->total_isr_cnt++; ++ ++ if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) && ++ (status & MBX_INTERRUPT) && ha->flags.mbox_int) { ++ ++ /* There was a mailbox completion */ ++ DEBUG3(printk("%s(%ld): Going to get mbx reg lock.\n", ++ __func__, ha->host_no)); ++ ++ QLA_MBX_REG_LOCK(ha); ++ ++ MBOX_TRACE(ha, BIT_5); ++ if (ha->mcp == NULL) { ++ DEBUG3(printk("%s(%ld): Error mbx pointer.\n", ++ __func__, ha->host_no)); ++ } else { ++ DEBUG3(printk("%s(%ld): Going to set mbx intr flags. " ++ "cmd=%x.\n", ++ __func__, ha->host_no, ha->mcp->mb[0])); ++ } ++ set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ DEBUG3(printk("%s(%ld): Going to wake up mbx function for " ++ "completion.\n", ++ __func__, ha->host_no)); ++ ++ MBOX_TRACE(ha,BIT_6); ++ up(&ha->mbx_intr_sem); ++ ++ DEBUG3(printk("%s(%ld): Going to release mbx reg lock.\n", ++ __func__, ha->host_no)); ++ QLA_MBX_REG_UNLOCK(ha); ++ } ++ ++ if (!list_empty(&ha->done_queue)) ++ schedule_work(&ha->run_qla_task); ++ ++ /* Wakeup the DPC routine */ ++ if ((!ha->flags.mbox_busy && ++ (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || ++ test_bit(RESET_MARKER_NEEDED, &ha->dpc_flags) || ++ test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags))) && ++ ha->dpc_wait && !ha->dpc_active) { ++ ++ up(ha->dpc_wait); ++ } ++ ++ return (IRQ_HANDLED); ++} ++ ++/** ++ * qla2x00_mbx_completion() - Process mailbox command completions. ++ * @ha: SCSI driver HA context ++ * @mb0: Mailbox0 register ++ */ ++static void ++qla2x00_mbx_completion(scsi_qla_host_t *ha, uint16_t mb0) ++{ ++ uint16_t cnt; ++ uint16_t *wptr; ++ device_reg_t *reg = ha->iobase; ++ ++ ENTER(__func__); ++ ++ /* Load return mailbox registers. */ ++ ha->flags.mbox_int = TRUE; ++ ha->mailbox_out[0] = mb0; ++ wptr = (uint16_t *)®->mailbox1; ++ ++ for (cnt = 1; cnt < MAILBOX_REGISTER_COUNT; cnt++) { ++#if defined(ISP2200) ++ if (cnt == 8) ++ wptr = (uint16_t *)®->mailbox8; ++#endif ++ if (cnt == 4 || cnt == 5) ++ ha->mailbox_out[cnt] = qla2x00_debounce_register(wptr); ++ else ++ ha->mailbox_out[cnt] = RD_REG_WORD(wptr); ++ ++ wptr++; ++ } ++ ++ if (ha->mcp) { ++ DEBUG3(printk("%s(%ld): Got mailbox completion. cmd=%x.\n", ++ __func__, ha->host_no, ha->mcp->mb[0])); ++ } else { ++ DEBUG2_3(printk("%s(%ld): MBX pointer ERROR!\n", ++ __func__, ha->host_no)); ++ } ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_async_event() - Process aynchronous events. ++ * @ha: SCSI driver HA context ++ * @mb0: Mailbox0 register ++ */ ++static void ++qla2x00_async_event(scsi_qla_host_t *ha, uint32_t mbx) ++{ ++ uint32_t index; ++ uint16_t mb[4]; ++ device_reg_t *reg = ha->iobase; ++ uint8_t rscn_queue_index; ++ ++ ENTER(__func__); ++ ++ /* Setup to process completions */ ++ mb[0] = LSW(mbx); ++ switch(mb[0]) { ++ case MBA_SCSI_COMPLETION: /* Fast Post */ ++#if defined(ISP2100) || defined(ISP2200) ++ mb[1] = RD_REG_WORD(®->mailbox1); ++#else ++ mb[1] = MSW(mbx); ++#endif ++ mb[2] = RD_REG_WORD(®->mailbox2); ++ ++ DEBUG5(printk("%s(): mailbox response completion.\n", ++ __func__)); ++ ++ if (!ha->flags.online) ++ break; ++ ++ /* Get outstanding command index */ ++ index = (uint32_t)(mb[2] << 16 | mb[1]); ++ qla2x00_process_completed_request(ha, index); ++ break; ++ ++#if defined(FC_IP_SUPPORT) ++ case MBA_IP_TRANSMIT_COMPLETE: /* IP Completion */ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ ++ qla2x00_ip_send_complete(ha, mb[1], CS_COMPLETE); ++ break; ++ ++ case MBA_IP__RECEIVE_COMPLETE: ++ case MBA_IP_RECEIVE_COMPLETE_SPLIT: ++ qla2x00_ip_receive_fastpost(ha, mb[0]); ++ break; ++#endif /* FC_IP_SUPPORT */ ++ ++ case MBA_RESET: /* Reset */ ++ DEBUG2(printk("scsi(%ld): Asynchronous RESET.\n", ha->host_no)); ++ ++ set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ break; ++ ++ case MBA_SYSTEM_ERR: /* System Error */ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ mb[2] = RD_REG_WORD(®->mailbox2); ++ mb[3] = RD_REG_WORD(®->mailbox3); ++ ++ printk(KERN_INFO ++ "scsi(%ld): ISP System Error - mbx1=%xh mbx2=%xh " ++ "mbx3=%xh.\n", ++ ha->host_no, mb[1], mb[2], mb[3]); ++ ++ qla2x00_dump_isp(ha, 1); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ break; ++ ++ case MBA_REQ_TRANSFER_ERR: /* Request Transfer Error */ ++ DEBUG2(printk("scsi(%ld): ISP Request Transfer Error.\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): ISP Request Transfer Error.\n", ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ break; ++ ++ case MBA_RSP_TRANSFER_ERR: /* Response Transfer Error */ ++ DEBUG2(printk("scsi(%ld): ISP Response Transfer Error.\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): ISP Response Transfer Error.\n", ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ break; ++ ++ case MBA_WAKEUP_THRES: /* Request Queue Wake-up */ ++ DEBUG2(printk("scsi(%ld): Asynchronous WAKEUP_THRES.\n", ++ ha->host_no)); ++ break; ++ ++ case MBA_LIP_OCCURRED: /* Loop Initialization Procedure */ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ ++ DEBUG2(printk("scsi(%ld): Asynchronous LIP Occured.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): Asynchronous LIP Occured.\n", ha->host_no); ++ ++ /* Save LIP sequence. */ ++ ha->lip_seq = mb[1]; ++ if (ha->loop_state != LOOP_DOWN) { ++ ha->loop_state = LOOP_DOWN; ++ atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); ++ qla2x00_mark_all_devices_lost(ha); ++ } ++ ++ set_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags); ++ set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); ++ ++ ha->flags.management_server_logged_in = 0; ++ ++ /* Update AEN queue. */ ++ if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) { ++ qla2x00_enqueue_aen(ha, MBA_LIP_OCCURRED, NULL); ++ } ++ ++ ha->total_lip_cnt++; ++ break; ++ ++ case MBA_LOOP_UP: /* Loop Up Event */ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ ++ DEBUG2(printk("scsi(%ld): Asynchronous LOOP UP.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): LOOP UP detected.\n", ha->host_no); ++ ++ ha->flags.management_server_logged_in = 0; ++ ++ /* Update AEN queue. */ ++ if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) { ++ qla2x00_enqueue_aen(ha, MBA_LOOP_UP, NULL); ++ } ++ ++ /* Save the current speed for use by ioctl and IP driver */ ++ ha->current_speed = EXT_DEF_PORTSPEED_1GBIT; ++#if defined(ISP2300) ++ if (mb[1] == 1) ++ ha->current_speed = EXT_DEF_PORTSPEED_2GBIT; ++#endif ++ break; ++ ++ case MBA_LOOP_DOWN: /* Loop Down Event */ ++ DEBUG2(printk("scsi(%ld): Asynchronous LOOP DOWN.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): LOOP DOWN detected.\n", ha->host_no); ++ ++ if (ha->loop_state != LOOP_DOWN) { ++ ha->loop_state = LOOP_DOWN; ++ atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); ++ qla2x00_mark_all_devices_lost(ha); ++ } ++ ++ ha->flags.management_server_logged_in = 0; ++ ha->current_speed = 0; /* reset value */ ++ ++ /* Update AEN queue. */ ++ if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) { ++ qla2x00_enqueue_aen(ha, MBA_LOOP_DOWN, NULL); ++ } ++ break; ++ ++ case MBA_LIP_RESET: /* LIP reset occurred */ ++ DEBUG2(printk("scsi(%ld): Asynchronous LIP RESET.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): LIP reset occured.\n", ha->host_no); ++ ++ if (ha->loop_state != LOOP_DOWN) { ++ ha->loop_state = LOOP_DOWN; ++ atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); ++ qla2x00_mark_all_devices_lost(ha); ++ } ++ ++ set_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags); ++ set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ ++ ha->operating_mode = LOOP; ++ ha->flags.management_server_logged_in = 0; ++ ++ /* Update AEN queue. */ ++ if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) { ++ qla2x00_enqueue_aen(ha, MBA_LIP_RESET, NULL); ++ } ++ ++ ha->total_lip_cnt++; ++ break; ++ ++#if !defined(ISP2100) ++ case MBA_LINK_MODE_UP: /* Link mode up. */ ++ DEBUG2(printk("scsi(%ld): Asynchronous LINK MODE UP.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): Link mode is up.\n", ++ ha->host_no); ++ ++ /* ++ * Until there's a transition from loop down to loop up, treat ++ * this as loop down only. ++ */ ++ if (ha->loop_state != LOOP_DOWN) { ++ ha->loop_state = LOOP_DOWN; ++ if (!atomic_read(&ha->loop_down_timer)) ++ atomic_set(&ha->loop_down_timer, ++ LOOP_DOWN_TIME); ++ qla2x00_mark_all_devices_lost(ha); ++ } ++ ++ if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) { ++ set_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags); ++ set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ } ++ set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); ++ break; ++ ++ case MBA_UPDATE_CONFIG: /* Update Configuration. */ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ ++ DEBUG2(printk("scsi(%ld): Asynchronous UPDATE CONFIG.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): Configuration change detected: value=%x.\n", ++ ha->host_no, mb[1]); ++ ++ if (ha->loop_state != LOOP_DOWN) { ++ ha->loop_state = LOOP_DOWN; ++ if (!atomic_read(&ha->loop_down_timer)) ++ atomic_set(&ha->loop_down_timer, ++ LOOP_DOWN_TIME); ++ qla2x00_mark_all_devices_lost(ha); ++ } ++ ++ set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); ++ break; ++#endif /* #if !defined(ISP2100) */ ++ ++ case MBA_PORT_UPDATE: /* Port database update */ ++ /* ++ * If PORT UPDATE is global (recieved LIP_OCCURED/LIP_RESET ++ * event etc. earlier indicating loop is down) then process ++ * it. Otherwise ignore it and Wait for RSCN to come in. ++ */ ++ if (ha->loop_state != LOOP_DOWN) { ++ DEBUG2(printk("scsi(%ld): Asynchronous PORT UPDATE " ++ "ignored.\n", ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): Asynchronous PORT UPDATE ignored.\n", ++ ha->host_no); ++ break; ++ } ++ ++ DEBUG2(printk("scsi(%ld): Asynchronous PORT UPDATE.\n", ++ ha->host_no)); ++ printk(KERN_INFO ++ "scsi(%ld): Port database changed.\n", ha->host_no); ++ ++ /* ++ * Mark all devices as missing so we will login again. ++ */ ++ ha->loop_state = LOOP_UP; ++ ++ atomic_set(&ha->loop_down_timer, 0); ++ qla2x00_mark_all_devices_lost(ha); ++ ++ ha->flags.rscn_queue_overflow = 1; ++ ++ set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); ++ ++ /* Update AEN queue. */ ++ if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) { ++ qla2x00_enqueue_aen(ha, MBA_PORT_UPDATE, NULL); ++ } ++ break; ++ ++ case MBA_SCR_UPDATE: /* State Change Registration */ ++ mb[1] = RD_REG_WORD(®->mailbox1); ++ mb[2] = RD_REG_WORD(®->mailbox2); ++ ++ DEBUG2(printk("scsi(%ld): Asynchronous RSCR UPDATE.\n", ++ ha->host_no)); ++ DEBUG(printk(KERN_INFO ++ "scsi(%ld): RSCN database changed - 0x%x, 0x%x.\n", ++ ha->host_no, mb[1], mb[2])); ++ ++ rscn_queue_index = ha->rscn_in_ptr + 1; ++ if (rscn_queue_index == MAX_RSCN_COUNT) ++ rscn_queue_index = 0; ++ if (rscn_queue_index != ha->rscn_out_ptr) { ++ ha->rscn_queue[ha->rscn_in_ptr].format = ++ MSB(mb[1]); ++ ha->rscn_queue[ha->rscn_in_ptr].d_id.b.domain = ++ LSB(mb[1]); ++ ha->rscn_queue[ha->rscn_in_ptr].d_id.b.area = ++ MSB(mb[2]); ++ ha->rscn_queue[ha->rscn_in_ptr].d_id.b.al_pa = ++ LSB(mb[2]); ++ ha->rscn_in_ptr = rscn_queue_index; ++ } else { ++ ha->flags.rscn_queue_overflow = 1; ++ } ++ ++ ha->loop_state = LOOP_UPDATE; ++ atomic_set(&ha->loop_down_timer, 0); ++ ha->flags.management_server_logged_in = 0; ++ ++ set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ set_bit(RSCN_UPDATE, &ha->dpc_flags); ++ ++ /* Update AEN queue. */ ++ if (ha->ioctl->flags & IOCTL_AEN_TRACKING_ENABLE) { ++ qla2x00_enqueue_aen(ha, MBA_RSCN_UPDATE, &mb[0]); ++ } ++ break; ++ } ++} ++ ++/** ++ * qla2x00_process_completed_request() - Process a Fast Post response. ++ * @ha: SCSI driver HA context ++ * @index: SRB index ++ */ ++static void ++qla2x00_process_completed_request(struct scsi_qla_host *ha, int index) ++{ ++ srb_t *sp; ++ struct scsi_qla_host *vis_ha; ++ ++ ENTER(__func__); ++ ++ /* Validate handle. */ ++ if (index >= MAX_OUTSTANDING_COMMANDS) { ++ DEBUG2(printk("scsi(%ld): Invalid SCSI completion handle %d.\n", ++ ha->host_no, index)); ++ printk(KERN_WARNING ++ "scsi(%ld): Invalid SCSI completion handle %d.\n", ++ ha->host_no, index); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ ++ sp = ha->outstanding_cmds[index]; ++ if (sp) { ++ /* Free outstanding command slot. */ ++ ha->outstanding_cmds[index] = 0; ++#if defined(IOCB_THROLLE_USAGE) ++ ha->iocb_cnt -= sp->iocb_cnt; ++#endif ++ vis_ha = (scsi_qla_host_t *)sp->cmd->device->host->hostdata; ++ if (ha->actthreads) ++ ha->actthreads--; ++ sp->lun_queue->out_cnt--; ++ sp->flags |= SRB_ISP_COMPLETED; ++ CMD_COMPL_STATUS(sp->cmd) = 0L; ++ CMD_SCSI_STATUS(sp->cmd) = 0L; ++ ++ /* Save ISP completion status */ ++ CMD_RESULT(sp->cmd) = DID_OK << 16; ++ sp->fo_retry_cnt = 0; ++ add_to_done_queue(ha, sp); ++ } else { ++ DEBUG2(printk("scsi(%ld): Invalid ISP SCSI completion handle\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): Invalid ISP SCSI completion handle\n", ++ ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ } ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_response_pkt() - Process response queue entries. ++ * @ha: SCSI driver HA context ++ * @index: Response queue out pointer ++ */ ++static void ++qla2x00_response_pkt(scsi_qla_host_t *ha, uint16_t index) ++{ ++ device_reg_t *reg = ha->iobase; ++ response_t *pkt; ++ ++ ENTER(__func__); ++ ++ if (!ha->flags.online) ++ return; ++ ++ if (index >= RESPONSE_ENTRY_CNT) { ++ /* Invalid response pointer value. */ ++ DEBUG(printk("scsi(%ld): Response Pointer Error - index=%x.\n", ++ ha->host_no, index)); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ ++ while (ha->rsp_ring_index != index) { ++ pkt = ha->response_ring_ptr; ++ ++ DEBUG5(printk("%s(%ld): ha->rsp_ring_index=%ld index=%ld.\n", ++ __func__, ha->host_no, ++ (u_long)ha->rsp_ring_index, (u_long)index)); ++ DEBUG5(printk("%s(%ld): response packet data:", ++ __func__, ha->host_no)); ++ DEBUG5(qla2x00_dump_buffer((uint8_t *)pkt, ++ RESPONSE_ENTRY_SIZE)); ++ ++ ha->rsp_ring_index++; ++ if (ha->rsp_ring_index == RESPONSE_ENTRY_CNT) { ++ ha->rsp_ring_index = 0; ++ ha->response_ring_ptr = ha->response_ring; ++ } else { ++ ha->response_ring_ptr++; ++ } ++ ++#if defined(FC_IP_SUPPORT) ++ /* ++ * This code is temporary until FW is fixed. FW is mistakenly ++ * setting bit 6 on Mailbox IOCB response ++ */ ++ pkt->entry_status &= 0x3f; ++#endif ++ ++ if (pkt->entry_status != 0) { ++ DEBUG3(printk(KERN_INFO ++ "scsi(%ld): Process error entry.\n", ha->host_no)); ++ ++ qla2x00_error_entry(ha, pkt); ++ continue; ++ } ++ ++ switch (pkt->entry_type) { ++ case STATUS_TYPE: ++ qla2x00_status_entry(ha, (sts_entry_t *)pkt); ++ break; ++ ++ case STATUS_CONT_TYPE: ++ qla2x00_status_cont_entry(ha, (sts_cont_entry_t *)pkt); ++ break; ++ ++ case MS_IOCB_TYPE: ++ qla2x00_ms_entry(ha, (ms_iocb_entry_t *)pkt); ++ break; ++ ++#if defined(FC_IP_SUPPORT) ++ case ET_IP_COMMAND_64: ++ /* Handle IP send completion */ ++ qla2x00_ip_send_complete(ha, ++ pkt->handle, le16_to_cpu(pkt->comp_status)); ++ break; ++ ++ case ET_IP_RECEIVE: ++ /* Handle IP receive packet */ ++ qla2x00_ip_receive(ha, pkt); ++ break; ++ ++ case ET_MAILBOX_COMMAND: ++ if (pkt->sys_define == SOURCE_IP) { ++ qla2x00_ip_mailbox_iocb_done(ha, ++ (struct mbx_entry *)pkt); ++ break; ++ } ++#endif /* FC_IP_SUPPORT */ ++ ++ default: ++ /* Type Not Supported. */ ++ DEBUG4(printk(KERN_WARNING ++ "scsi(%ld): Received unknown response pkt type %x " ++ "entry status=%x.\n", ++ ha->host_no, pkt->entry_type, pkt->entry_status)); ++ break; ++ } ++ } ++ ++ /* Adjust ring index */ ++ WRT_REG_WORD(ISP_RSP_Q_OUT(reg), ha->rsp_ring_index); ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_status_entry() - Process a Status IOCB entry. ++ * @ha: SCSI driver HA context ++ * @pkt: Entry pointer ++ */ ++static void ++qla2x00_status_entry(scsi_qla_host_t *ha, sts_entry_t *pkt ) ++{ ++ uint32_t b, t, l; ++ scsi_qla_host_t *vis_ha; ++ srb_t *sp; ++ os_lun_t *lq; ++ os_tgt_t *tq; ++ fc_port_t *fcport; ++ Scsi_Cmnd *cp; ++ uint16_t comp_status; ++ uint16_t scsi_status; ++ uint8_t lscsi_status; ++ uint32_t resid; ++ uint8_t sense_sz = 0; ++ ++ ++ ENTER(__func__); ++ ++ /* Validate handle. */ ++ if (pkt->handle < MAX_OUTSTANDING_COMMANDS) { ++ sp = ha->outstanding_cmds[pkt->handle]; ++ /* Free outstanding command slot. */ ++ ha->outstanding_cmds[pkt->handle] = 0; ++ } else ++ sp = NULL; ++ ++ if (sp == NULL) { ++ DEBUG2(printk("scsi(%ld): Status Entry invalid handle.\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): Status Entry invalid handle.\n", ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (ha->dpc_wait && !ha->dpc_active) ++ up(ha->dpc_wait); ++ return; ++ } ++ ++ cp = sp->cmd; ++ if (cp == NULL) { ++ DEBUG2(printk("scsi(%ld): Cmd already returned back to OS " ++ "pkt->handle: %d sp=%p sp->state:%d\n", ++ ha->host_no, pkt->handle, sp, sp->state)); ++ printk(KERN_WARNING ++ "scsi(%ld): Cmd is NULL: already returned to OS (sp=%p)\n", ++ ha->host_no, sp); ++ return; ++ } ++ ++ /* ++ * Set the visible adapter for lun Q access. ++ */ ++ vis_ha = (scsi_qla_host_t *)cp->device->host->hostdata; ++ if (ha->actthreads) ++ ha->actthreads--; ++ ++ if (sp->lun_queue == NULL) { ++ DEBUG2(printk("scsi(%ld): Status Entry invalid lun " ++ "pointer.\n", ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): Status Entry invalid lun pointer.\n", ++ ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (ha->dpc_wait && !ha->dpc_active) ++ up(ha->dpc_wait); ++ return; ++ } ++ ++ sp->lun_queue->out_cnt--; ++#if defined(IOCB_THROLLE_USAGE) ++ ha->iocb_cnt -= sp->iocb_cnt; ++#endif ++ ++ comp_status = le16_to_cpu(pkt->comp_status); ++ /* Mask of reserved bits 12-15. Before we examine the scsi status */ ++ scsi_status = le16_to_cpu(pkt->scsi_status) & SS_MASK; ++ lscsi_status = scsi_status & STATUS_MASK; ++ ++ CMD_ENTRY_STATUS(cp) = pkt->entry_status; ++ CMD_COMPL_STATUS(cp) = comp_status; ++ CMD_SCSI_STATUS(cp) = scsi_status; ++ ++ /* dg 10/11 */ ++ sp->flags |= SRB_ISP_COMPLETED; ++ ++ /* Generate LU queue on cntrl, target, LUN */ ++ b = SCSI_BUS_32(cp); ++ t = SCSI_TCN_32(cp); ++ l = SCSI_LUN_32(cp); ++ ++ tq = sp->tgt_queue; ++ lq = sp->lun_queue; ++ ++ /* ++ * If loop is in transient state Report DID_BUS_BUSY ++ */ ++ if (!(sp->flags & SRB_IOCTL) && ++ (atomic_read(&ha->loop_down_timer) || ++ ha->loop_state != LOOP_READY) && ++ (comp_status != CS_COMPLETE || scsi_status != 0)) { ++ ++ DEBUG2(printk("scsi(%ld:%d:%d:%d): Loop Not Ready - " ++ "pid=%lx.\n", ++ ha->host_no, ++ b, t, l, sp->cmd->serial_number)); ++ ++ qla2x00_extend_timeout(sp->cmd, EXTEND_CMD_TIMEOUT); ++ add_to_retry_queue(ha, sp); ++ return; ++ } ++ ++ /* ++ * Based on Host and scsi status generate status code for Linux ++ */ ++ switch (comp_status) { ++ case CS_COMPLETE: ++ /* ++ * Host complted command OK. Check SCSI Status to determine ++ * the correct Host status. ++ */ ++ if (scsi_status == 0) { ++ CMD_RESULT(cp) = DID_OK << 16; ++ ++ /* Perform any post command processing */ ++ qla2x00_filter_command(ha, sp); ++ } else { /* Check for non zero scsi status */ ++ if (lscsi_status == SS_BUSY_CONDITION) { ++ CMD_RESULT(cp) = ++ DID_BUS_BUSY << 16 | lscsi_status; ++ } else { ++ CMD_RESULT(cp) = ++ DID_OK << 16 | lscsi_status; ++ ++ if (lscsi_status != SS_CHECK_CONDITION) ++ break; ++ ++ /* ++ * Copy Sense Data into sense buffer ++ */ ++ memset(cp->sense_buffer, ++ 0, sizeof(cp->sense_buffer)); ++ ++ if (!(scsi_status & SS_SENSE_LEN_VALID)) ++ break; ++ ++ if (le16_to_cpu(pkt->req_sense_length) < ++ CMD_SNSLEN(cp)) ++ sense_sz = ++ le16_to_cpu(pkt->req_sense_length); ++ else ++ sense_sz = CMD_SNSLEN(cp) - 1; ++ ++ CMD_ACTUAL_SNSLEN(cp) = sense_sz; ++ sp->request_sense_length = sense_sz; ++ sp->request_sense_ptr = ++ (void *)cp->sense_buffer; ++ ++ if (sp->request_sense_length > 32) ++ sense_sz = 32; ++ ++ memcpy(cp->sense_buffer, ++ pkt->req_sense_data, sense_sz); ++ ++ sp->request_sense_ptr += sense_sz; ++ sp->request_sense_length -= sense_sz; ++ if (sp->request_sense_length != 0) ++ ha->status_srb = sp; ++ ++ if (!(sp->flags & SRB_IOCTL) && ++ qla2x00_check_sense(cp, lq) == ++ QL_STATUS_SUCCESS) { ++ /* ++ * Throw away status_cont if any ++ */ ++ ha->status_srb = NULL; ++ add_to_scsi_retry_queue(ha, sp); ++ return; ++ } ++ ++ DEBUG5(printk("%s(): Check condition Sense " ++ "data, scsi(%ld:%d:%d:%d) cmd=%p " ++ "pid=%ld\n", ++ __func__, ++ ha->host_no, ++ b, t, l, ++ cp, cp->serial_number)); ++ if (sense_sz) ++ DEBUG5(qla2x00_dump_buffer( ++ cp->sense_buffer, ++ CMD_ACTUAL_SNSLEN(cp))); ++ } ++ } ++ break; ++ ++ case CS_DATA_UNDERRUN: ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld:%d:%d) UNDERRUN status detected 0x%x-0x%x.\n", ++ ha->host_no, ++ t, l, comp_status, scsi_status)); ++ ++ resid = le32_to_cpu(pkt->residual_length); ++ CMD_RESID_LEN(cp) = resid; ++ ++ /* ++ * Check to see if SCSI Status is non zero. If so report SCSI ++ * Status. ++ */ ++ if (lscsi_status != 0) { ++ if (lscsi_status == SS_BUSY_CONDITION) { ++ CMD_RESULT(cp) = ++ DID_BUS_BUSY << 16 | lscsi_status; ++ } else { ++ CMD_RESULT(cp) = ++ DID_OK << 16 | lscsi_status; ++ ++ if (lscsi_status != SS_CHECK_CONDITION) ++ break; ++ ++ /* ++ * Copy Sense Data into sense buffer ++ */ ++ memset(cp->sense_buffer, ++ 0, sizeof(cp->sense_buffer)); ++ ++ if (!(scsi_status & SS_SENSE_LEN_VALID)) ++ break; ++ ++ if (le16_to_cpu(pkt->req_sense_length) < ++ CMD_SNSLEN(cp)) ++ sense_sz = ++ le16_to_cpu(pkt->req_sense_length); ++ else ++ sense_sz = CMD_SNSLEN(cp) - 1; ++ ++ CMD_ACTUAL_SNSLEN(cp) = sense_sz; ++ sp->request_sense_length = sense_sz; ++ sp->request_sense_ptr = ++ (void *)cp->sense_buffer; ++ ++ if (sp->request_sense_length > 32) ++ sense_sz = 32; ++ ++ memcpy(cp->sense_buffer, ++ pkt->req_sense_data, sense_sz); ++ ++ sp->request_sense_ptr += sense_sz; ++ sp->request_sense_length -= sense_sz; ++ if (sp->request_sense_length != 0) ++ ha->status_srb = sp; ++ ++ if (!(sp->flags & SRB_IOCTL) && ++ (qla2x00_check_sense(cp, lq) == ++ QL_STATUS_SUCCESS)) { ++ ha->status_srb = NULL; ++ add_to_scsi_retry_queue(ha,sp); ++ return; ++ } ++ ++ DEBUG5(printk("%s(): Check condition Sense " ++ "data, scsi(%ld:%d:%d:%d) cmd=%p " ++ "pid=%ld\n", ++ __func__, ++ ha->host_no, ++ b, t, l, ++ cp, cp->serial_number)); ++ if (sense_sz) ++ DEBUG5(qla2x00_dump_buffer( ++ cp->sense_buffer, ++ CMD_ACTUAL_SNSLEN(cp))); ++ } ++ } else { ++ /* ++ * If RISC reports underrun and target does not report ++ * it then we must have a lost frame, so tell upper ++ * layer to retry it by reporting a bus busy. ++ */ ++ if (!(scsi_status & SS_RESIDUAL_UNDER)) { ++ DEBUG2(printk("scsi(%ld:%d:%d:%d) Dropped " ++ "frame(s) detected (%x of %x bytes)..." ++ "retrying command.\n", ++ ha->host_no, ++ b, t, l, resid, CMD_XFRLEN(cp))); ++ ++ CMD_RESULT(cp) = DID_BUS_BUSY << 16; ++ ha->dropped_frame_error_cnt++; ++ break; ++ } ++ ++ /* ++ * Handle mid-layer underflow??? ++ * ++ * For kernels less than 2.4, the driver must return ++ * an error if an underflow is detected. For kernels ++ * equal-to and above 2.4, the mid-layer will ++ * appearantly handle the underflow by detecting the ++ * residual count -- unfortunately, we do not see ++ * where this is actually being done. In the interim, ++ * we will return DID_ERROR. ++ */ ++ cp->resid = resid; ++/* TODO: ++ * ++ * Determine if this is a valid check for 2.5 ++ */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++ if ((unsigned)(CMD_XFRLEN(cp) - resid) < ++ cp->underflow) { ++ printk(KERN_INFO ++ "scsi(%ld): Mid-layer underflow detected " ++ "(%x of %x bytes) wanted %x bytes..." ++ "returning DID_ERROR status!\n", ++ ha->host_no, ++ resid, CMD_XFRLEN(cp), cp->underflow); ++ ++ CMD_RESULT(cp) = DID_ERROR << 16; ++ break; ++ } ++#endif ++ /* Everybody online, looking good... */ ++ CMD_RESULT(cp) = DID_OK << 16; ++ ++ /* Perform any post command processing */ ++ qla2x00_filter_command(ha, sp); ++ } ++ break; ++ ++ case CS_PORT_LOGGED_OUT: ++ case CS_PORT_CONFIG_CHG: ++ case CS_PORT_BUSY: ++ case CS_INCOMPLETE: ++ case CS_PORT_UNAVAILABLE: ++ /* ++ * If the port is in Target Down state, return all IOs for this ++ * Target with DID_NO_CONNECT ELSE Queue the IOs in the ++ * retry_queue. ++ */ ++ fcport = lq->fclun->fcport; ++ DEBUG2(printk("scsi(%ld:%d:%d): status_entry: Port Down " ++ "pid=%ld, compl status=0x%x, port state=0x%x\n", ++ ha->host_no, ++ t, l, ++ sp->cmd->serial_number, ++ comp_status, ++ atomic_read(&fcport->state))); ++ ++ if ((sp->flags & SRB_IOCTL) || ++ (atomic_read(&fcport->state) == FC_DEVICE_DEAD)) { ++ CMD_RESULT(cp) = DID_NO_CONNECT << 16; ++ add_to_done_queue(ha, sp); ++ } else { ++ qla2x00_extend_timeout(cp, EXTEND_CMD_TIMEOUT); ++ add_to_retry_queue(ha, sp); ++ } ++ ++ if (atomic_read(&fcport->state) == FC_ONLINE) { ++ qla2x00_mark_device_lost(ha, fcport); ++ } ++ ++ return; ++ break; ++ ++ case CS_RESET: ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld): RESET status detected 0x%x-0x%x.\n", ++ ha->host_no, comp_status, scsi_status)); ++ ++ if (sp->flags & SRB_IOCTL) { ++ CMD_RESULT(cp) = DID_RESET << 16; ++ } ++ else { ++ qla2x00_extend_timeout(cp, EXTEND_CMD_TIMEOUT); ++ add_to_retry_queue(ha, sp); ++ return; ++ } ++ break; ++ ++ case CS_ABORTED: ++ /* ++ * hv2.19.12 - DID_ABORT does not retry the request if we ++ * aborted this request then abort otherwise it must be a ++ * reset. ++ */ ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld): ABORT status detected 0x%x-0x%x.\n", ++ ha->host_no, comp_status, scsi_status)); ++ ++ CMD_RESULT(cp) = DID_RESET << 16; ++ break; ++ ++ case CS_TIMEOUT: ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld:%d:%d:%d): TIMEOUT status detected 0x%x-0x%x.\n", ++ ha->host_no, ++ b, t, l, ++ comp_status, scsi_status)); ++ ++ CMD_RESULT(cp) = DID_BUS_BUSY << 16; ++ ++ fcport = lq->fclun->fcport; ++// Dump FW ++printk("***TIMEOUT cmd=(%lx) cdb=(%x)\n\n", cp->serial_number, cp->cmnd[0]); ++//qla2x00_dump_isp(ha, 1); ++ ++ /* ++ * Check to see if logout occurred ++ */ ++ t = SCSI_TCN_32(cp); ++ if ((le16_to_cpu(pkt->status_flags) & IOCBSTAT_SF_LOGO)) { ++ DEBUG2(printk("scsi: Timeout occurred with Logo, " ++ "status flag (%x) with public device loop id " ++ "(%x), attempt new recovery\n", ++ le16_to_cpu(pkt->status_flags), ++ ha->fc_db[t].loop_id)); ++ ++ ha->fc_db[t].flag |= DEV_RELOGIN; ++ fcport->login_retry = ha->login_retry_count; ++ set_bit(RELOGIN_NEEDED, &ha->dpc_flags); ++ } ++ break; ++ ++ case CS_QUEUE_FULL: ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld): QUEUE FULL status detected 0x%x-0x%x.\n", ++ ha->host_no, comp_status, scsi_status)); ++ ++ /* ++ * SCSI Mid-Layer handles device queue full. ++ */ ++ CMD_RESULT(cp) = DID_OK << 16 | lscsi_status; ++ ++/* Adjust queue depth */ ++{ ++int ret; ++ ++ret = scsi_track_queue_full(cp->device, sp->lun_queue->out_cnt-1); ++printk("scsi(%ld:%d:%d:%d): QUEUE FULL adjustments -- " ++ "outstanding/adjusted (%ld/%d) -- qd/lqfd/lqfc (%d/%d/%d).\n", ++ ha->host_no, ++ cp->device->channel, cp->device->id, cp->device->lun, ++ sp->lun_queue->out_cnt-1, ret, ++ cp->device->queue_depth, ++ cp->device->last_queue_full_count, ++ cp->device->last_queue_full_depth); ++} ++ ++ ++ break; ++ ++ default: ++ DEBUG3(printk("scsi(%ld): Error detected (unknown status) " ++ "0x%x-0x%x.\n", ++ ha->host_no, comp_status, scsi_status)); ++ printk(KERN_INFO ++ "scsi(%ld): Unknown status detected 0x%x-0x%x.\n", ++ ha->host_no, comp_status, scsi_status); ++ ++ CMD_RESULT(cp) = DID_ERROR << 16; ++ break; ++ } ++ ++ /* Place command on done queue. */ ++ if (ha->status_srb == NULL) ++ add_to_done_queue(ha, sp); ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_status_cont_entry() - Process a Status Continuations entry. ++ * @ha: SCSI driver HA context ++ * @pkt: Entry pointer ++ * ++ * Extended sense data. ++ */ ++static void ++qla2x00_status_cont_entry(scsi_qla_host_t *ha, sts_cont_entry_t *pkt) ++{ ++ uint8_t sense_sz = 0; ++ srb_t *sp = ha->status_srb; ++ Scsi_Cmnd *cp; ++ ++ ENTER(__func__); ++ ++ if (sp != NULL && sp->request_sense_length != 0) { ++ cp = sp->cmd; ++ if (cp == NULL) { ++ DEBUG2(printk("%s(): Cmd already returned back to OS " ++ "sp=%p sp->state:%d\n", ++ __func__, sp, sp->state)); ++ printk(KERN_INFO ++ "%s(): cmd is NULL: already returned to OS " ++ "(sp=%p)\n", ++ __func__, sp); ++ ++ ha->status_srb = NULL; ++ return; ++ } ++ ++ if (sp->request_sense_length > sizeof (pkt->req_sense_data)) { ++ sense_sz = sizeof(pkt->req_sense_data); ++ } else { ++ sense_sz = sp->request_sense_length; ++ } ++ ++ /* Move sense data. */ ++ memcpy(sp->request_sense_ptr, pkt->req_sense_data, sense_sz); ++ DEBUG5(qla2x00_dump_buffer(sp->request_sense_ptr, sense_sz)); ++ ++ sp->request_sense_ptr += sense_sz; ++ sp->request_sense_length -= sense_sz; ++ ++ /* Place command on done queue. */ ++ if (sp->request_sense_length == 0) { ++ add_to_done_queue(ha, sp); ++ ha->status_srb = NULL; ++ } ++ } ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_error_entry() - Process an error entry. ++ * @ha: SCSI driver HA context ++ * @pkt: Entry pointer ++ */ ++static void ++qla2x00_error_entry(scsi_qla_host_t *ha, response_t *pkt) ++{ ++ srb_t *sp; ++ ++ ENTER(__func__); ++ ++#if defined(QL_DEBUG_LEVEL_2) ++ if (pkt->entry_status & RF_INV_E_ORDER) ++ printk("%s(%ld): Invalid Entry Order\n", ++ __func__, ha->host_no); ++ else if (pkt->entry_status & RF_INV_E_COUNT) ++ printk("%s(%ld): Invalid Entry Count\n", ++ __func__, ha->host_no); ++ else if (pkt->entry_status & RF_INV_E_PARAM) ++ printk("%s(%ld): Invalid Entry Parameter\n", ++ __func__, ha->host_no); ++ else if (pkt->entry_status & RF_INV_E_TYPE) ++ printk("%s(%ld): Invalid Entry Type\n", ++ __func__, ha->host_no); ++ else if (pkt->entry_status & RF_BUSY) ++ printk("%s(%ld): Busy\n", ++ __func__, ha->host_no); ++ else ++ printk("%s(%ld): UNKNOWN flag error\n", ++ __func__, ha->host_no); ++#endif ++ ++ /* Validate handle. */ ++ if (pkt->handle < MAX_OUTSTANDING_COMMANDS) ++ sp = ha->outstanding_cmds[pkt->handle]; ++ else ++ sp = NULL; ++ ++ if (sp) { ++ /* Free outstanding command slot. */ ++ ha->outstanding_cmds[pkt->handle] = 0; ++ if (ha->actthreads) ++ ha->actthreads--; ++ sp->lun_queue->out_cnt--; ++#if defined(IOCB_THROLLE_USAGE) ++ ha->iocb_cnt -= sp->iocb_cnt; ++#endif ++ ++ sp->flags |= SRB_ISP_COMPLETED; ++ ++ /* Bad payload or header */ ++ if (pkt->entry_status & ++ (RF_INV_E_ORDER | RF_INV_E_COUNT | ++ RF_INV_E_PARAM | RF_INV_E_TYPE)) { ++ CMD_RESULT(sp->cmd) = DID_ERROR << 16; ++ } else if (pkt->entry_status & RF_BUSY) { ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ } else { ++ CMD_RESULT(sp->cmd) = DID_ERROR << 16; ++ } ++ /* Place command on done queue. */ ++ add_to_done_queue(ha, sp); ++ ++ } else if (pkt->entry_type == COMMAND_A64_TYPE || ++ pkt->entry_type == COMMAND_TYPE) { ++ DEBUG2(printk("scsi(%ld): Error entry - invalid handle\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): Error entry - invalid handle\n", ++ ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (ha->dpc_wait && !ha->dpc_active) ++ up(ha->dpc_wait); ++ } ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_ms_entry() - Process a Management Server entry. ++ * @ha: SCSI driver HA context ++ * @index: Response queue out pointer ++ */ ++static void ++qla2x00_ms_entry(scsi_qla_host_t *ha, ms_iocb_entry_t *pkt) ++{ ++ srb_t *sp; ++ ++ ENTER(__func__); ++ ++ DEBUG3(printk("%s(%ld): pkt=%p pkthandle=%d.\n", ++ __func__, ha->host_no, pkt, pkt->handle1)); ++ ++ /* Validate handle. */ ++ if (pkt->handle1 < MAX_OUTSTANDING_COMMANDS) ++ sp = ha->outstanding_cmds[pkt->handle1]; ++ else ++ sp = NULL; ++ ++ if (sp == NULL) { ++ DEBUG2(printk("scsi(%ld): MS entry - invalid handle\n", ++ ha->host_no)); ++ printk(KERN_WARNING ++ "scsi(%ld): MS entry - invalid handle\n", ++ ha->host_no); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return; ++ } ++ ++ CMD_COMPL_STATUS(sp->cmd) = le16_to_cpu(pkt->status); ++ CMD_ENTRY_STATUS(sp->cmd) = pkt->entry_status; ++ ++ /* Free outstanding command slot. */ ++ ha->outstanding_cmds[pkt->handle1] = 0; ++ sp->flags |= SRB_ISP_COMPLETED; ++ ++ add_to_done_queue(ha, sp); ++ ++ LEAVE(__func__); ++} ++ ++/** ++ * qla2x00_check_sense() - Perform any sense data interrogation. ++ * @cp: SCSI Command ++ * @lq: Lun queue ++ * ++ * Returns QL_STATUS_SUCCESS if the lun queue is suspended, else ++ * QL_STATUS_ERROR (lun queue not suspended). ++ */ ++static int ++qla2x00_check_sense(Scsi_Cmnd *cp, os_lun_t *lq) ++{ ++ scsi_qla_host_t *ha; ++ srb_t *sp; ++ fc_port_t *fcport; ++ ++ ha = (scsi_qla_host_t *) cp->device->host->hostdata; ++ if (((cp->sense_buffer[0] & 0x70) >> 4) != 7) { ++ return (QL_STATUS_ERROR); ++ } ++ ++ sp = (srb_t * )CMD_SP(cp); ++ sp->flags |= SRB_GOT_SENSE; ++ ++ switch (cp->sense_buffer[2] & 0xf) { ++ case RECOVERED_ERROR: ++ CMD_RESULT(cp) = DID_OK << 16; ++ cp->sense_buffer[0] = 0; ++ break; ++ ++ case NOT_READY: ++ fcport = lq->fclun->fcport; ++ ++ /* ++ * Suspend the lun only for hard disk device type. ++ */ ++ if (!(fcport->flags & FC_TAPE_DEVICE) && ++ lq->q_state != LUN_STATE_TIMEOUT) { ++ /* ++ * If target is in process of being ready then suspend ++ * lun for 6 secs and retry all the commands. ++ */ ++ if (cp->sense_buffer[12] == 0x4 && ++ cp->sense_buffer[13] == 0x1) { ++ ++ /* Suspend the lun for 6 secs */ ++ qla2x00_suspend_lun(ha, ++ lq, 6, ql2xsuspendcount); ++ ++ return (QL_STATUS_SUCCESS); ++ } ++ } ++ break; ++ } ++ ++ return (QL_STATUS_ERROR); ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_listops.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,397 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++/* Management functions for various lists */ ++ ++/* ++ * Found in kernel 2.4.9 and higher in include/linux/lists.h ++ * ++ * Iterate over a list safe against removal of list. ++ * ++ */ ++#if !defined(list_for_each_safe) ++#define list_for_each_safe(pos, n, head) \ ++ for( pos= (head)->next, n = pos->next; pos != (head); \ ++ pos = n, n = pos->next ) ++#endif ++ ++/* __add_to_done_queue() ++ * ++ * Place SRB command on done queue. ++ * ++ * Input: ++ * ha = host pointer ++ * sp = srb pointer. ++ * Locking: ++ * this function assumes the ha->list_lock is already taken ++ */ ++static inline void ++__add_to_done_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ /* ++ if (sp->state != SRB_NO_QUEUE_STATE && ++ sp->state != SRB_ACTIVE_STATE) ++ BUG(); ++ */ ++ ++ /* Place block on done queue */ ++ sp->cmd->host_scribble = (unsigned char *) NULL; ++ sp->state = SRB_DONE_STATE; ++ list_add_tail(&sp->list,&ha->done_queue); ++ ha->done_q_cnt++; ++ sp->ha = ha; ++} ++ ++/* __add_to_free_queue() ++ * ++ * Place SRB command on free queue. ++ * ++ * Input: ++ * ha = host pointer ++ * sp = srb pointer. ++ * Locking: ++ * this function assumes the ha->list_lock is already taken ++ */ ++static inline void ++__add_to_free_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ /* ++ if (atomic_read(&sp->ref_count) != 0) ++ BUG(); ++ */ ++ ++ ++ /* Place block on free queue */ ++ sp->state = SRB_FREE_STATE; ++ list_add_tail(&sp->list,&ha->free_queue); ++ ha->srb_cnt++; ++} ++ ++static inline void ++__add_to_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ /* ++ if( sp->state != SRB_NO_QUEUE_STATE && ++ sp->state != SRB_ACTIVE_STATE) ++ BUG(); ++ */ ++ ++ /* Place block on retry queue */ ++ list_add_tail(&sp->list,&ha->retry_queue); ++ ha->retry_q_cnt++; ++ sp->flags |= SRB_WATCHDOG; ++ ha->flags.watchdog_enabled = TRUE; ++ sp->state = SRB_RETRY_STATE; ++ sp->ha = ha; ++} ++ ++static inline void ++__add_to_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ /* ++ if( sp->state != SRB_NO_QUEUE_STATE && ++ sp->state != SRB_ACTIVE_STATE) ++ BUG(); ++ */ ++ ++ /* Place block on retry queue */ ++ list_add_tail(&sp->list,&ha->scsi_retry_queue); ++ ha->scsi_retry_q_cnt++; ++ sp->state = SRB_SCSI_RETRY_STATE; ++ sp->ha = ha; ++} ++ ++static inline void ++add_to_done_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ __add_to_done_queue(ha,sp); ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++static inline void ++add_to_free_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ __add_to_free_queue(ha,sp); ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++static inline void ++add_to_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ __add_to_retry_queue(ha,sp); ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++static inline void ++add_to_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ __add_to_scsi_retry_queue(ha,sp); ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++/* ++ * __del_from_retry_queue ++ * Function used to remove a command block from the ++ * watchdog timer queue. ++ * ++ * Note: Must insure that command is on watchdog ++ * list before calling del_from_retry_queue ++ * if (sp->flags & SRB_WATCHDOG) ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * sp = srb pointer. ++ * Locking: ++ * this function assumes the list_lock is already taken ++ */ ++static inline void ++__del_from_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ list_del_init(&sp->list); ++ ++ if (list_empty(&ha->retry_queue)) ++ ha->flags.watchdog_enabled = FALSE; ++ sp->flags &= ~(SRB_WATCHDOG | SRB_BUSY); ++ sp->state = SRB_NO_QUEUE_STATE; ++ ha->retry_q_cnt--; ++} ++ ++/* ++ * __del_from_scsi_retry_queue ++ * Function used to remove a command block from the ++ * scsi retry queue. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * sp = srb pointer. ++ * Locking: ++ * this function assumes the list_lock is already taken ++ */ ++static inline void ++__del_from_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ list_del_init(&sp->list); ++ ++ ha->scsi_retry_q_cnt--; ++ sp->state = SRB_NO_QUEUE_STATE; ++} ++ ++/* ++ * del_from_retry_queue ++ * Function used to remove a command block from the ++ * watchdog timer queue. ++ * ++ * Note: Must insure that command is on watchdog ++ * list before calling del_from_retry_queue ++ * if (sp->flags & SRB_WATCHDOG) ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * sp = srb pointer. ++ * Locking: ++ * this function takes and releases the list_lock ++ */ ++static inline void ++del_from_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ /* if (unlikely(!(sp->flags & SRB_WATCHDOG))) ++ BUG();*/ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ ++ /* if (unlikely(list_empty(&ha->retry_queue))) ++ BUG();*/ ++ ++ __del_from_retry_queue(ha,sp); ++ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++/* ++ * del_from_scsi_retry_queue ++ * Function used to remove a command block from the ++ * scsi retry queue. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * sp = srb pointer. ++ * Locking: ++ * this function takes and releases the list_lock ++ */ ++static inline void ++del_from_scsi_retry_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ ++ /* if (unlikely(list_empty(&ha->scsi_retry_queue))) ++ BUG();*/ ++ ++ __del_from_scsi_retry_queue(ha,sp); ++ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++static inline void ++__del_from_free_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ ha->srb_cnt--; ++ list_del_init(&sp->list); ++ sp->state = SRB_NO_QUEUE_STATE; ++} ++ ++/* ++ * __add_to_pending_queue ++ * Add the standard SCB job to the bottom of standard SCB commands. ++ * ++ * Input: ++ * COMPLETE!!! ++ * q = SCSI LU pointer. ++ * sp = srb pointer. ++ * SCSI_LU_Q lock must be already obtained. ++ */ ++static inline void ++__add_to_pending_queue(struct scsi_qla_host *ha, srb_t * sp) ++{ ++ /* ++ if( sp->state != SRB_NO_QUEUE_STATE && ++ sp->state != SRB_FREE_STATE && ++ sp->state != SRB_ACTIVE_STATE) ++ BUG(); ++ */ ++ ++ list_add_tail(&sp->list, &ha->pending_queue); ++ ha->qthreads++; ++ sp->state = SRB_PENDING_STATE; ++} ++ ++static inline void ++__add_to_pending_queue_head(struct scsi_qla_host *ha, srb_t * sp) ++{ ++ /* ++ if( sp->state != SRB_NO_QUEUE_STATE && ++ sp->state != SRB_FREE_STATE && ++ sp->state != SRB_ACTIVE_STATE) ++ BUG(); ++ */ ++ ++ list_add(&sp->list, &ha->pending_queue); ++ ha->qthreads++; ++ sp->state = SRB_PENDING_STATE; ++} ++ ++static inline void ++add_to_pending_queue(struct scsi_qla_host *ha, srb_t *sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ __add_to_pending_queue(ha, sp); ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++static inline void ++add_to_pending_queue_head(struct scsi_qla_host *ha, srb_t *sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ __add_to_pending_queue_head(ha, sp); ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++static inline void ++__del_from_pending_queue(struct scsi_qla_host *ha, srb_t *sp) ++{ ++ list_del_init(&sp->list); ++ ha->qthreads--; ++ sp->state = SRB_NO_QUEUE_STATE; ++} ++ ++/* ++ * Failover Stuff. ++ */ ++static inline void ++__add_to_failover_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ /* ++ if( sp->state != SRB_NO_QUEUE_STATE && ++ sp->state != SRB_ACTIVE_STATE) ++ BUG(); ++ */ ++ ++ list_add_tail(&sp->list,&ha->failover_queue); ++ ha->failover_cnt++; ++ sp->state = SRB_FAILOVER_STATE; ++ sp->ha = ha; ++} ++ ++static inline void add_to_failover_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ ++ __add_to_failover_queue(ha,sp); ++ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++static inline void __del_from_failover_queue(struct scsi_qla_host * ha, srb_t * ++ sp) ++{ ++ ha->failover_cnt--; ++ list_del_init(&sp->list); ++ sp->state = SRB_NO_QUEUE_STATE; ++} ++ ++static inline void del_from_failover_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ ++ __del_from_failover_queue(ha,sp); ++ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++static inline void ++del_from_pending_queue(struct scsi_qla_host * ha, srb_t * sp) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ ++ __del_from_pending_queue(ha,sp); ++ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_mbx.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,2884 @@ ++/* ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ */ ++ ++#include "qla_os.h" ++ ++#include "qla_def.h" ++ ++/* ++ * Local Function Prototypes. ++ */ ++static void ++qla2x00_mbx_sem_timeout(unsigned long); ++ ++static uint8_t ++qla2x00_get_mbx_access(scsi_qla_host_t *, uint32_t); ++ ++static uint8_t ++qla2x00_release_mbx_access(scsi_qla_host_t *, uint32_t); ++ ++static uint8_t ++qla2x00_mbx_q_add(scsi_qla_host_t *, mbx_cmdq_t **); ++ ++static void ++qla2x00_mbx_q_get(scsi_qla_host_t *, mbx_cmdq_t **); ++ ++static void ++qla2x00_mbx_q_memb_alloc(scsi_qla_host_t *, mbx_cmdq_t **); ++ ++static void ++qla2x00_mbx_q_memb_free(scsi_qla_host_t *, mbx_cmdq_t *); ++ ++/***************************/ ++/* Function implementation */ ++/***************************/ ++ ++static void ++qla2x00_mbx_sem_timeout(unsigned long data) ++{ ++ struct semaphore *sem_ptr = (struct semaphore *)data; ++ ++ DEBUG11(printk("qla2x00_sem_timeout: entered.\n");) ++ ++ if (sem_ptr != NULL) { ++ up(sem_ptr); ++ } ++ ++ DEBUG11(printk("qla2x00_mbx_sem_timeout: exiting.\n");) ++} ++ ++/* ++ * tov = timeout value in seconds ++ */ ++static uint8_t ++qla2x00_get_mbx_access(scsi_qla_host_t *ha, uint32_t tov) ++{ ++ uint8_t ret; ++ int prev_val = 1; /* assume no access yet */ ++ mbx_cmdq_t *ptmp_mbq; ++ struct timer_list tmp_cmd_timer; ++ unsigned long cpu_flags; ++ ++ ++ DEBUG11(printk("qla2x00_get_mbx_access(%ld): entered.\n", ++ ha->host_no);) ++ ++ while (1) { ++ if (test_bit(MBX_CMD_WANT, &ha->mbx_cmd_flags) == 0) { ++ ++ DEBUG11(printk("qla2x00_get_mbx_access(%ld): going " ++ " to test access flags.\n", ha->host_no);) ++ ++ /* No one else is waiting. Go ahead and try to ++ * get access. ++ */ ++ if ((prev_val = test_and_set_bit(MBX_CMD_ACTIVE, ++ &ha->mbx_cmd_flags)) == 0) { ++ break; ++ } ++ } ++ ++ /* wait for previous command to finish */ ++ DEBUG(printk("qla2x00_get_mbx_access(%ld): access " ++ "flags=%lx. busy. Waiting for access. curr time=0x%lx.\n", ++ ha->host_no, ha->mbx_cmd_flags, jiffies);) ++ ++ DEBUG11(printk("qla2x00_get_mbx_access(%ld): access " ++ "flags=%lx. busy. Waiting for access. curr time=0x%lx.\n", ++ ha->host_no, ha->mbx_cmd_flags, jiffies);) ++ ++ /* ++ * Init timer and get semaphore from mbx q. After we got valid ++ * semaphore pointer the MBX_CMD_WANT flag would also had ++ * been set. ++ */ ++ qla2x00_mbx_q_add(ha, &ptmp_mbq); ++ ++ if (ptmp_mbq == NULL) { ++ /* queue full? problem? can't proceed. */ ++ DEBUG2_3_11(printk("qla2x00_get_mbx_access(%ld): ERROR " ++ "no more mbx_q allowed. exiting.\n", ha->host_no);) ++ ++ break; ++ } ++ ++ /* init timer and semaphore */ ++ init_timer(&tmp_cmd_timer); ++ tmp_cmd_timer.data = (unsigned long)&ptmp_mbq->cmd_sem; ++ tmp_cmd_timer.function = ++ (void (*)(unsigned long))qla2x00_mbx_sem_timeout; ++ tmp_cmd_timer.expires = jiffies + tov * HZ; ++ ++ DEBUG11(printk("get_mbx_access(%ld): adding timer. " ++ "curr time=0x%lx timeoutval=0x%lx.\n", ++ ha->host_no, jiffies, tmp_cmd_timer.expires);) ++ ++ /* wait. */ ++/* add_timer(&tmp_cmd_timer);*/ ++ DEBUG11(printk("get_mbx_access(%ld): going to sleep. " ++ "current time=0x%lx.\n", ha->host_no, jiffies);) ++ ++ down_interruptible(&ptmp_mbq->cmd_sem); ++ ++ DEBUG11(printk("get_mbx_access(%ld): woke up. current " ++ "time=0x%lx.\n", ++ ha->host_no, jiffies);) ++ ++/* del_timer(&tmp_cmd_timer);*/ ++ ++ /* try to get lock again. we'll test later to see ++ * if we actually got the lock. ++ */ ++ prev_val = test_and_set_bit(MBX_CMD_ACTIVE, ++ &ha->mbx_cmd_flags); ++ ++ /* ++ * After we tried to get access then we check to see ++ * if we need to clear the MBX_CMD_WANT flag. Don't clear ++ * this flag before trying to get access or else another ++ * new thread might grab it before we did. ++ */ ++ spin_lock_irqsave(&ha->mbx_q_lock, cpu_flags); ++ if (ha->mbx_q_head == NULL) { ++ /* We're the last thread in queue. */ ++ clear_bit(MBX_CMD_WANT, &ha->mbx_cmd_flags); ++ } ++ qla2x00_mbx_q_memb_free(ha, ptmp_mbq); ++ spin_unlock_irqrestore(&ha->mbx_q_lock, cpu_flags); ++ ++ break; ++ } ++ ++ if (prev_val == 0) { ++ /* We got the lock */ ++ DEBUG11(printk("qla2x00_get_mbx_access(%ld): success.\n", ++ ha->host_no);) ++ ++ ret = QL_STATUS_SUCCESS; ++ } else { ++ /* Timeout or resource error. */ ++ DEBUG2_3_11(printk("qla2x00_get_mbx_access(%ld): timed out.\n", ++ ha->host_no);) ++ ++ ret = QL_STATUS_TIMEOUT; ++ } ++ ++ return ret; ++} ++ ++static uint8_t ++qla2x00_release_mbx_access(scsi_qla_host_t *ha, uint32_t tov) ++{ ++ mbx_cmdq_t *next_thread; ++ ++ DEBUG11(printk("qla2x00_release_mbx_access:(%ld): entered.\n", ++ ha->host_no);) ++ ++ clear_bit(MBX_CMD_ACTIVE, &ha->mbx_cmd_flags); ++ ++ /* Wake up one pending mailbox cmd thread in queue. */ ++ qla2x00_mbx_q_get(ha, &next_thread); ++ if (next_thread) { ++ DEBUG11(printk("qla2x00_release_mbx_access: found pending " ++ "mbx cmd. Waking up sem in %p.\n", &next_thread);) ++ up(&next_thread->cmd_sem); ++ } ++ ++ DEBUG11(printk("qla2x00_release_mbx_access:(%ld): exiting.\n", ++ ha->host_no);) ++ ++ return QL_STATUS_SUCCESS; ++} ++ ++/* Allocates a mbx_cmdq_t struct and add to the mbx_q list. */ ++static uint8_t ++qla2x00_mbx_q_add(scsi_qla_host_t *ha, mbx_cmdq_t **ret_mbq) ++{ ++ uint8_t ret; ++ unsigned long cpu_flags; ++ mbx_cmdq_t *ptmp = NULL; ++ ++ spin_lock_irqsave(&ha->mbx_q_lock, cpu_flags); ++ ++ DEBUG11(printk("qla2x00_mbx_q_add: got mbx_q spinlock. " ++ "Inst=%d.\n", apiHBAInstance);) ++ ++ qla2x00_mbx_q_memb_alloc(ha, &ptmp); ++ if (ptmp == NULL) { ++ /* can't add any more threads */ ++ DEBUG2_3_11(printk("qla2x00_mbx_q_add: ERROR no more " ++ "ioctl threads allowed. Inst=%d.\n", apiHBAInstance);) ++ ++ ret = QL_STATUS_RESOURCE_ERROR; ++ } else { ++ if (ha->mbx_q_tail == NULL) { ++ /* First thread to queue. */ ++ set_bit(IOCTL_WANT, &ha->mbx_cmd_flags); ++ ++ ha->mbx_q_head = ptmp; ++ } else { ++ ha->mbx_q_tail->pnext = ptmp; ++ } ++ ha->mbx_q_tail = ptmp; ++ ++ /* Now init the semaphore */ ++ init_MUTEX_LOCKED(&ptmp->cmd_sem); ++ ret = QL_STATUS_SUCCESS; ++ } ++ ++ *ret_mbq = ptmp; ++ ++ DEBUG11(printk("qla2x00_mbx_q_add: going to release spinlock. " ++ "ret_mbq=%p, ret=%d. Inst=%d.\n", *ret_mbq, ret, apiHBAInstance);) ++ ++ spin_unlock_irqrestore(&ha->mbx_q_lock, cpu_flags); ++ ++ return ret; ++} ++ ++/* Just remove and return first member from mbx_cmdq. Don't free anything. */ ++static void ++qla2x00_mbx_q_get(scsi_qla_host_t *ha, mbx_cmdq_t **ret_mbq) ++{ ++ unsigned long cpu_flags; ++ ++ spin_lock_irqsave(&ha->mbx_q_lock, cpu_flags); ++ ++ DEBUG11(printk("qla2x00_mbx_q_get: got mbx_q spinlock. " ++ "Inst=%d.\n", apiHBAInstance);) ++ ++ /* Remove from head */ ++ *ret_mbq = ha->mbx_q_head; ++ if (ha->mbx_q_head != NULL) { ++ ha->mbx_q_head = ha->mbx_q_head->pnext; ++ if (ha->mbx_q_head == NULL) { ++ /* That's the last one in queue. */ ++ ha->mbx_q_tail = NULL; ++ } ++ (*ret_mbq)->pnext = NULL; ++ } ++ ++ DEBUG11(printk("qla2x00_mbx_q_remove: return ret_mbq=%p. Going to " ++ "release spinlock. Inst=%d.\n", *ret_mbq, apiHBAInstance);) ++ ++ spin_unlock_irqrestore(&ha->mbx_q_lock, cpu_flags); ++} ++ ++/* Find a free mbx_q member from the array. Must already got the ++ * mbx_q_lock spinlock. ++ */ ++static void ++qla2x00_mbx_q_memb_alloc(scsi_qla_host_t *ha, mbx_cmdq_t **ret_mbx_q_memb) ++{ ++ mbx_cmdq_t *ptmp = NULL; ++ ++ DEBUG11(printk("qla2x00_mbx_q_memb_alloc: entered. " ++ "Inst=%d.\n", apiHBAInstance);) ++ ++ ptmp = ha->mbx_sem_pool_head; ++ if (ptmp != NULL) { ++ ha->mbx_sem_pool_head = ptmp->pnext; ++ ptmp->pnext = NULL; ++ if (ha->mbx_sem_pool_head == NULL) { ++ ha->mbx_sem_pool_tail = NULL; ++ } ++ } else { ++ /* We ran out of pre-allocated semaphores. Try to allocate ++ * a new one. ++ */ ++ ptmp = (void *)KMEM_ZALLOC(sizeof(mbx_cmdq_t), 40); ++ } ++ ++ *ret_mbx_q_memb = ptmp; ++ ++ DEBUG11(printk("qla2x00_mbx_q_memb_alloc: return waitq_memb=%p. " ++ "Inst=%d.\n", *ret_mbx_q_memb, apiHBAInstance);) ++} ++ ++/* Add the specified mbx_q member back to the free semaphore pool. Must ++ * already got the mbx_q_lock spinlock. ++ */ ++static void ++qla2x00_mbx_q_memb_free(scsi_qla_host_t *ha, mbx_cmdq_t *pfree_mbx_q_memb) ++{ ++ DEBUG11(printk("qla2x00_mbx_q_memb_free: entered. Inst=%d.\n", ++ apiHBAInstance);) ++ ++ if (pfree_mbx_q_memb != NULL) { ++ if (ha->mbx_sem_pool_tail != NULL) { ++ /* Add to tail */ ++ ha->mbx_sem_pool_tail->pnext = pfree_mbx_q_memb; ++ } else { ++ ha->mbx_sem_pool_head = pfree_mbx_q_memb; ++ } ++ ha->mbx_sem_pool_tail = pfree_mbx_q_memb; ++ } ++ ++ /* put it back to the free pool. */ ++ ++ DEBUG11(printk("qla2x00_mbx_q_memb_free: exiting. " ++ "Inst=%d.\n", apiHBAInstance);) ++} ++ ++/* ++ * qla2x00_mailbox_command ++ * Issue mailbox command and waits for completion. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * mcp = driver internal mbx struct pointer. ++ * ++ * Output: ++ * mb[MAX_MAILBOX_REGISTER_COUNT] = returned mailbox data. ++ * ++ * Returns: ++ * 0 : QL_STATUS_SUCCESS = cmd performed success ++ * 1 : QL_STATUS_ERROR (error encountered) ++ * 6 : QL_STATUS_TIMEOUT (timeout condition encountered) ++ * ++ * Context: ++ * Kernel context. ++ */ ++uint8_t ++qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) ++{ ++ unsigned long flags = 0; ++ device_reg_t *reg = ha->iobase; ++ struct timer_list tmp_intr_timer; ++ uint8_t abort_active = test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); ++ uint8_t io_lock_on = ha->init_done; ++ uint8_t mbx_count; ++ uint8_t status = 0; ++ uint8_t tmp_stat = 0; ++ uint16_t command; ++ uint16_t *iptr, *optr; ++ uint32_t cnt; ++ uint32_t mboxes; ++ unsigned long mbx_flags = 0; ++ unsigned long wait_time; ++ ++ DEBUG11(printk("qla2x00_mailbox_command(%ld): entered.\n", ++ ha->host_no);) ++ /* ++ * Wait for active mailbox commands to finish by waiting at most ++ * tov seconds. This is to serialize actual issuing of mailbox cmds ++ * during non ISP abort time. ++ */ ++ if (!abort_active) { ++ tmp_stat = qla2x00_get_mbx_access(ha, mcp->tov); ++ if (tmp_stat != QL_STATUS_SUCCESS) { ++ /* Timeout occurred. Return error. */ ++ DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): cmd " ++ "access timeout. Exiting.\n", ha->host_no);) ++ return QL_STATUS_TIMEOUT; ++ } ++ } ++ ++ ha->flags.mbox_busy = TRUE; ++ /* Save mailbox command for debug */ ++ ha->mcp = mcp; ++ ++ /* Try to get mailbox register access */ ++ if (!abort_active) ++ QLA_MBX_REG_LOCK(ha); ++ ++ DEBUG11(printk("scsi%d: prepare to issue mbox cmd=0x%x.\n", ++ (int)ha->host_no, mcp->mb[0]);) ++ ++ ha->mbox_trace = 0; ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* Load mailbox registers. */ ++ optr = (uint16_t *)®->mailbox0; ++ mbx_count = MAILBOX_REGISTER_COUNT; ++ ++ iptr = mcp->mb; ++ command = mcp->mb[0]; ++ mboxes = mcp->out_mb; ++ ++ for (cnt = 0; cnt < mbx_count; cnt++) { ++#if defined(ISP2200) ++ if (cnt == 8) { ++ optr = (uint16_t *)®->mailbox8; ++ } ++#endif ++ if (mboxes & BIT_0) { ++ WRT_REG_WORD(optr, *iptr); ++ } ++ ++ mboxes >>= 1; ++ optr++; ++ iptr++; ++ } ++ ++#if defined(QL_DEBUG_LEVEL_1) ++ printk("qla2x00_mailbox_command: Loaded MBX registers " ++ "(displayed in bytes) = \n"); ++ qla2x00_dump_buffer((uint8_t *)mcp->mb, 16); ++ printk("\n"); ++ qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x10), 16); ++ printk("\n"); ++ qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x20), 8); ++ printk("\n"); ++ printk("qla2x00_mailbox_command: I/O address = %lx.\n", ++ (u_long)optr); ++ qla2x00_dump_regs(ha->host); ++#endif ++ ++ /* Issue set host interrupt command to send cmd out. */ ++ ha->flags.mbox_int = FALSE; ++ clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ /* Unlock mbx registers and wait for interrupt */ ++ ++ DEBUG11(printk("qla2x00_mailbox_command: going to unlock irq & " ++ "waiting for interrupt. jiffies=%lx.\n", jiffies);) ++ ++ /* Wait for mbx cmd completion until timeout */ ++ ++ if (!abort_active && io_lock_on) { ++ /* sleep on completion semaphore */ ++ DEBUG11(printk("qla2x00_mailbox_command(%ld): " ++ "INTERRUPT MODE. Initializing timer.\n", ++ ha->host_no);) ++ ++ init_timer(&tmp_intr_timer); ++ tmp_intr_timer.data = (unsigned long)&ha->mbx_intr_sem; ++ tmp_intr_timer.expires = jiffies + mcp->tov * HZ; ++ tmp_intr_timer.function = ++ (void (*)(unsigned long))qla2x00_mbx_sem_timeout; ++ ++ DEBUG11(printk("qla2x00_mailbox_command(%ld): " ++ "Adding timer.\n", ha->host_no);) ++ add_timer(&tmp_intr_timer); ++ ++ DEBUG11(printk("qla2x00_mailbox_command: going to " ++ "unlock & sleep. time=0x%lx.\n", jiffies);) ++ ++ MBOX_TRACE(ha,BIT_0); ++ set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); ++ ++ WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ if (!abort_active) ++ QLA_MBX_REG_UNLOCK(ha); ++ ++ MBOX_TRACE(ha,BIT_1); ++ ++ /* Wait for either the timer to expire ++ * or the mbox completion interrupt ++ */ ++ down_interruptible(&ha->mbx_intr_sem); ++ ++ DEBUG11(printk("qla2x00_mailbox_command:" ++ "waking up." ++ "time=0x%lx\n", jiffies);) ++ clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); ++ ++ /* delete the timer */ ++ del_timer(&tmp_intr_timer); ++#if QLA2100_LIPTEST ++ if (mbxtimeout) { ++ DEBUG(printk("qla2x00_mailbox_command(%ld): " ++ "INTERRUPT MODE - testing timeout handling.\n", ++ ha->host_no);) ++ ha->flags.mbox_int= FALSE; ++ } ++ mbxtimeout= 0; ++#endif ++ ++ } else { ++ ++ DEBUG3_11(printk("qla2x00_mailbox_command(%ld): cmd=%x " ++ "POLLING MODE.\n", ha->host_no, command);) ++ ++ WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ if (!abort_active) ++ QLA_MBX_REG_UNLOCK(ha); ++ ++ ++ wait_time = jiffies + mcp->tov * HZ; /* wait at most tov secs */ ++ while (!ha->flags.mbox_int) { ++ if (time_after(jiffies, wait_time)) ++ break; ++ ++ /* Check for pending interrupts. */ ++ qla2x00_poll(ha); ++ ++ udelay(10); /* v4.27 */ ++ } /* while */ ++ } ++ ++ if (!abort_active) ++ QLA_MBX_REG_LOCK(ha); ++ ++ /* Check whether we timed out */ ++ if (ha->flags.mbox_int) { ++ ++ DEBUG3_11(printk("qla2x00_mailbox_cmd: cmd %x completed.\n", ++ command);) ++ ++ /* Got interrupt. Clear the flag. */ ++ ha->flags.mbox_int = FALSE; ++ clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); ++ ++ if( ha->mailbox_out[0] != MBS_CMD_CMP ) { ++ qla2x00_stats.mboxerr++; ++ status = QL_STATUS_ERROR; ++ } ++ ++ /* Load return mailbox registers. */ ++ optr = mcp->mb; ++ iptr = (uint16_t *)&ha->mailbox_out[0]; ++ mboxes = mcp->in_mb; ++ for (cnt = 0; cnt < mbx_count; cnt++) { ++ ++ if (mboxes & BIT_0) ++ *optr = *iptr; ++ ++ mboxes >>= 1; ++ optr++; ++ iptr++; ++ } ++ } else { ++ ++#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) || \ ++ defined(QL_DEBUG_LEVEL_11) ++ printk("qla2x00_mailbox_command(%ld): **** MB Command Timeout " ++ "for cmd %x ****\n", ha->host_no, command); ++ printk("qla2x00_mailbox_command: icontrol=%x jiffies=%lx\n", ++ RD_REG_WORD(®->ictrl), jiffies); ++ printk("qla2x00_mailbox_command: *** mailbox[0] = 0x%x ***\n", ++ RD_REG_WORD(optr)); ++ qla2x00_dump_regs(ha->host); ++#endif ++ ++ qla2x00_stats.mboxtout++; ++ status = QL_STATUS_TIMEOUT; ++ } ++ ++ if (!abort_active) ++ QLA_MBX_REG_UNLOCK(ha); ++ ++ ha->flags.mbox_busy = FALSE; ++ ++ /* Clean up */ ++ ha->mcp = NULL; ++ ++ if (!abort_active) { ++ DEBUG11(printk("qla2x00_mailbox_cmd: checking for additional " ++ "resp interrupt.\n");) ++ ++ /* polling mode for non isp_abort commands. */ ++ qla2x00_poll(ha); ++ } ++ ++ if (status == QL_STATUS_TIMEOUT ) { ++ if (!io_lock_on || (mcp->flags & IOCTL_CMD)) { ++ /* not in dpc. schedule it for dpc to take over. */ ++ DEBUG(printk("qla2x00_mailbox_command(%ld): timeout " ++ "schedule isp_abort_needed.\n", ++ ha->host_no);) ++ DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): " ++ "timeout schedule isp_abort_needed.\n", ++ ha->host_no);) ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (ha->dpc_wait && !ha->dpc_active) ++ up(ha->dpc_wait); ++ ++ } else if (!abort_active) { ++ ++ /* call abort directly since we are in the DPC thread */ ++ DEBUG(printk("qla2x00_mailbox_command(%ld): timeout " ++ "calling abort_isp\n", ha->host_no);) ++ DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): " ++ "timeout calling abort_isp\n", ha->host_no);) ++ ++ set_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); ++ clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (qla2x00_abort_isp(ha, 0)) { ++ /* failed. retry later. */ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ } ++ clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); ++ ++ DEBUG(printk("qla2x00_mailbox_command: finished " ++ "abort_isp\n");) ++ DEBUG2_3_11(printk("qla2x00_mailbox_command: finished " ++ "abort_isp\n");) ++ } ++ } ++ ++ /* Allow next mbx cmd to come in. */ ++ if (!abort_active) { ++ tmp_stat = qla2x00_release_mbx_access(ha, mcp->tov); ++ ++ if (status == 0) ++ status = tmp_stat; ++ } ++ ++ if (status) { ++ DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): **** FAILED. " ++ "mbx0=%x, mbx1=%x, mbx2=%x, cmd=%x ****\n", ++ ha->host_no, mcp->mb[0], mcp->mb[1], mcp->mb[2], command);) ++ } else { ++ DEBUG11(printk("qla2x00_mailbox_command(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ DEBUG11(printk("qla2x00_mailbox_command(%ld): exiting.\n", ++ ha->host_no);) ++ ++ return status; ++} ++ ++/* ++ * qla2x00_load_ram ++ * Load adapter RAM using DMA. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_load_ram(scsi_qla_host_t *ha, dma_addr_t req_dma, ++ uint16_t risc_addr, uint16_t risc_code_size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ uint32_t req_len; ++ dma_addr_t nml_dma; ++ uint32_t nml_len; ++ uint32_t normalized; ++ ++ DEBUG11(printk("qla2x00_load_ram(%ld): entered.\n", ++ ha->host_no);) ++ ++ req_len = risc_code_size; ++ nml_dma = 0; ++ nml_len = 0; ++ ++ normalized = qla2x00_normalize_dma_addr( ++ &req_dma, &req_len, ++ &nml_dma, &nml_len); ++ ++ /* Load first segment */ ++ mcp->mb[0] = MBC_LOAD_RAM_A64; ++ mcp->mb[1] = risc_addr; ++ mcp->mb[2] = MSW(req_dma); ++ mcp->mb[3] = LSW(req_dma); ++ mcp->mb[4] = (uint16_t)req_len; ++ mcp->mb[6] = MSW(MSD(req_dma)); ++ mcp->mb[7] = LSW(MSD(req_dma)); ++ ++ mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Load second segment - if necessary */ ++ if (normalized && (rval == QL_STATUS_SUCCESS)) { ++ mcp->mb[0] = MBC_LOAD_RAM_A64; ++ mcp->mb[1] = risc_addr + (uint16_t)req_len; ++ mcp->mb[2] = MSW(nml_dma); ++ mcp->mb[3] = LSW(nml_dma); ++ mcp->mb[4] = (uint16_t)nml_len; ++ mcp->mb[6] = MSW(MSD(nml_dma)); ++ mcp->mb[7] = LSW(MSD(nml_dma)); ++ ++ mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ } ++ ++ if (rval == QL_STATUS_SUCCESS) { ++ /* Empty */ ++ DEBUG11(printk("qla2x00_load_ram(%ld): done.\n", ++ ha->host_no);) ++ } else { ++ /* Empty */ ++ DEBUG2_3_11(printk("qla2x00_load_ram(%ld): failed. rval=%x " ++ "mb[0]=%x.\n", ++ ha->host_no, rval, mcp->mb[0]);) ++ } ++ return rval; ++} ++ ++/* ++ * qla2x00_load_ram_ext ++ * Load adapter extended RAM using DMA. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_load_ram_ext(scsi_qla_host_t *ha, ++ dma_addr_t req_dma, uint32_t risc_addr, uint16_t risc_code_size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ uint32_t req_len; ++ dma_addr_t nml_dma; ++ uint32_t nml_len; ++ uint32_t normalized; ++ ++ DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); ++ ++ req_len = risc_code_size; ++ nml_dma = 0; ++ nml_len = 0; ++ ++ normalized = qla2x00_normalize_dma_addr( ++ &req_dma, &req_len, ++ &nml_dma, &nml_len); ++ ++ /* Load first segment */ ++ mcp->mb[0] = MBC_LOAD_RAM_EXTENDED; ++ mcp->mb[1] = LSW(risc_addr); ++ mcp->mb[2] = MSW(req_dma); ++ mcp->mb[3] = LSW(req_dma); ++ mcp->mb[4] = (uint16_t)req_len; ++ mcp->mb[6] = MSW(MSD(req_dma)); ++ mcp->mb[7] = LSW(MSD(req_dma)); ++ mcp->mb[8] = MSW(risc_addr); ++ ++ mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Load second segment - if necessary */ ++ if (normalized && (rval == QL_STATUS_SUCCESS)) { ++ risc_addr += req_len; ++ mcp->mb[0] = MBC_LOAD_RAM_EXTENDED; ++ mcp->mb[1] = LSW(risc_addr); ++ mcp->mb[2] = MSW(nml_dma); ++ mcp->mb[3] = LSW(nml_dma); ++ mcp->mb[4] = (uint16_t)nml_len; ++ mcp->mb[6] = MSW(MSD(nml_dma)); ++ mcp->mb[7] = LSW(MSD(nml_dma)); ++ mcp->mb[8] = MSW(risc_addr); ++ ++ mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ } ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", ++ __func__, ha->host_no, rval, mcp->mb[0])); ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_execute_fw ++ * Start adapter firmware. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_execute_fw(scsi_qla_host_t *ha) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_execute_fw(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_EXECUTE_FIRMWARE; ++ mcp->mb[1] = *ha->brd_info->fwinfo[0].fwstart; ++ mcp->out_mb = MBX_1|MBX_0; ++ if (ha->pdev->device == QLA2322_DEVICE_ID) { ++ mcp->mb[2] = 0; ++ mcp->out_mb |= MBX_2; ++ } ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = qla2x00_mailbox_command(ha, mcp); ++ ++ DEBUG11(printk("qla2x00_execute_fw(%ld): done.\n", ++ ha->host_no);) ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_fw_version ++ * Get firmware version. ++ * ++ * Input: ++ * ha: adapter state pointer. ++ * major: pointer for major number. ++ * minor: pointer for minor number. ++ * subminor: pointer for subminor number. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++void ++qla2x00_get_fw_version(scsi_qla_host_t *ha, uint16_t *major, ++ uint16_t *minor, uint16_t *subminor, uint16_t *attributes) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); ++ ++ mcp->mb[0] = MBC_ABOUT_FIRMWARE; ++ mcp->out_mb = MBX_0; ++ mcp->in_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->flags = 0; ++ mcp->tov = 30; ++ rval = qla2x00_mailbox_command(ha, mcp); ++ ++ /* Return mailbox data. */ ++ *major = mcp->mb[1]; ++ *minor = mcp->mb[2]; ++ *subminor = mcp->mb[3]; ++ *attributes = mcp->mb[6]; ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", ++ __func__, ha->host_no, rval)); ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); ++ } ++} ++ ++/* ++ * qla2x00_get_fw_options ++ * Set firmware options. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * fwopt = pointer for firmware options. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_fw_options(scsi_qla_host_t *ha, ++ uint16_t *fwopts1, uint16_t *fwopts2, uint16_t *fwopts3) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); ++ ++ mcp->mb[0] = MBC_GET_FIRMWARE_OPTIONS; ++ mcp->out_mb = MBX_0; ++ mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", ++ __func__, ha->host_no, rval)); ++ } else { ++ *fwopts1 = mcp->mb[1]; ++ *fwopts2 = mcp->mb[2]; ++ *fwopts3 = mcp->mb[3]; ++ ++ DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); ++ } ++ ++ return rval; ++} ++ ++ ++/* ++ * qla2x00_set_fw_options ++ * Set firmware options. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * fwopt = pointer for firmware options. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_set_fw_options(scsi_qla_host_t *ha, ++ uint16_t fwopts1, uint16_t fwopts2, uint16_t fwopts3, ++ uint16_t fwopts10, uint16_t fwopts11) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); ++ ++ mcp->mb[0] = MBC_SET_FIRMWARE_OPTIONS; ++ mcp->mb[1] = fwopts1; ++ mcp->mb[2] = fwopts2; ++ mcp->mb[3] = fwopts3; ++ mcp->mb[10] = fwopts10; ++ mcp->mb[11] = fwopts11; ++ mcp->mb[12] = 0; /* Undocumented, but used */ ++ mcp->out_mb = MBX_12|MBX_11|MBX_10|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", ++ __func__, ha->host_no, rval)); ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_read_ram_word ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_read_ram_word(scsi_qla_host_t *ha, uint16_t addr, uint16_t *data) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_read_ram_word(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_READ_RAM_WORD; ++ mcp->mb[1] = addr; ++ ++ mcp->out_mb = MBX_1|MBX_0; ++ mcp->in_mb = MBX_0|MBX_2; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_read_ram_word(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ *data = mcp->mb[2]; ++ DEBUG11(printk("qla2x00_read_ram_word(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_write_ram_word ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_write_ram_word(scsi_qla_host_t *ha, uint16_t addr, uint16_t data) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_write_ram_word(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_WRITE_RAM_WORD; ++ mcp->mb[1] = addr; ++ mcp->mb[2] = data; ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_write_ram_word(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_write_ram_word(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_write_ram_word_ext ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_write_ram_word_ext(scsi_qla_host_t *ha, uint32_t addr, uint16_t data) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); ++ ++ mcp->mb[0] = MBC_WRITE_RAM_WORD_EXTENDED; ++ mcp->mb[1] = LSW(addr); ++ mcp->mb[2] = data; ++ mcp->mb[8] = MSW(addr); ++ mcp->out_mb = MBX_8|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", ++ __func__, ha->host_no, rval)); ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_mbx_reg_test ++ * Mailbox register wrap test. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_mbx_reg_test(scsi_qla_host_t *ha) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_mbx_reg_test(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_MAILBOX_REGISTER_TEST; ++ mcp->mb[1] = 0xAAAA; ++ mcp->mb[2] = 0x5555; ++ mcp->mb[3] = 0xAA55; ++ mcp->mb[4] = 0x55AA; ++ mcp->mb[5] = 0xA5A5; ++ mcp->mb[6] = 0x5A5A; ++ mcp->mb[7] = 0x2525; ++ mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval == QL_STATUS_SUCCESS) { ++ if (mcp->mb[1] != 0xAAAA || mcp->mb[2] != 0x5555 || ++ mcp->mb[3] != 0xAA55 || mcp->mb[4] != 0x55AA) ++ rval = QL_STATUS_ERROR; ++ if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A || ++ mcp->mb[7] != 0x2525) ++ rval = QL_STATUS_ERROR; ++ } ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_mbx_reg_test(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_mbx_reg_test(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_verify_checksum ++ * Verify firmware checksum. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_verify_checksum(scsi_qla_host_t *ha) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_verify_checksum(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_VERIFY_CHECKSUM; ++ mcp->mb[1] = *ha->brd_info->fwinfo[0].fwstart; ++ mcp->out_mb = MBX_1|MBX_0; ++ mcp->in_mb = MBX_2|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_verify_checksum(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_verify_checksum(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_issue_iocb ++ * Issue IOCB using mailbox command ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * buffer = buffer pointer. ++ * phys_addr = physical address of buffer. ++ * size = size of buffer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_issue_iocb(scsi_qla_host_t *ha, void* buffer, dma_addr_t phys_addr, ++ size_t size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ ENTER("qla2x00_issue_iocb: started"); ++ ++ mcp->mb[0] = MBC_IOCB_EXECUTE_A64; ++ mcp->mb[1] = 0; ++ mcp->mb[2] = MSW(phys_addr); ++ mcp->mb[3] = LSW(phys_addr); ++ mcp->mb[6] = MSW(MSD(phys_addr)); ++ mcp->mb[7] = LSW(MSD(phys_addr)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_2|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QLA2X00_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x", ++ ha->host_no,rval);) ++ DEBUG2(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x", ++ ha->host_no,rval);) ++ } else { ++ /*EMPTY*/ ++ LEAVE("qla2x00_issue_iocb: exiting normally"); ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_abort_command ++ * Abort command aborts a specified IOCB. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * sp = SB structure pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_abort_command(scsi_qla_host_t *ha, srb_t *sp) ++{ ++ unsigned long flags = 0; ++ scsi_qla_host_t *curr_ha; ++ fc_port_t *fcport; ++ int rval; ++ uint32_t handle; ++ uint16_t t; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ os_lun_t *lq = sp->lun_queue; ++ ++ DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", ++ ha->host_no);) ++ ++ curr_ha = lq->fclun->fcport->ha; ++ t = SCSI_TCN_32(sp->cmd); ++ fcport = lq->fclun->fcport; ++ if (curr_ha->loop_state == LOOP_DOWN || ++ atomic_read(&fcport->state) == FC_DEVICE_LOST) { ++ /* v2.19.8 Ignore abort request if port is down */ ++ return 1; ++ } ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) { ++ if( ha->outstanding_cmds[handle] == sp ) ++ break; ++ } ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ if (handle == MAX_OUTSTANDING_COMMANDS) { ++ /* command not found */ ++ return QL_STATUS_ERROR; ++ } ++ ++ mcp->mb[0] = MBC_ABORT_COMMAND; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = fcport->loop_id & 0xFF; ++#else ++ mcp->mb[1] = fcport->loop_id << 8; ++#endif ++ mcp->mb[2] = (uint16_t)handle; ++ mcp->mb[3] = (uint16_t)(handle >> 16); ++ mcp->mb[6] = (uint16_t)lq->fclun->lun; ++ mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ DEBUG2_3_11(printk("qla2x00_abort_command(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ sp->flags |= SRB_ABORT_PENDING; ++ DEBUG11(printk("qla2x00_abort_command(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_abort_device ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = FC loop ID ++ * lun = SCSI LUN. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_abort_device(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_abort_device(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_ABORT_DEVICE; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = loop_id << 8; ++#endif ++ mcp->mb[2] = lun; ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Issue marker command. */ ++ qla2x00_marker(ha, loop_id, lun, MK_SYNC_ID_LUN); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (ha->dpc_wait && !ha->dpc_active) ++ up(ha->dpc_wait); ++ DEBUG2_3_11(printk("qla2x00_abort_device(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_abort_device(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++#if USE_ABORT_TGT ++/* ++ * qla2x00_abort_target ++ * Issue abort target mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * b = Always 0. ++ * t = SCSI ID. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_abort_target(fc_port_t *fcport) ++{ ++ int rval; ++ uint16_t loop_id; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_abort_target(%ld): entered.\n", ++ fcport->ha->host_no);) ++ ++ if (fcport == NULL) { ++ /* no target to abort */ ++ return 0; ++ } ++ ++ loop_id = fcport->loop_id; ++ ++ mcp->mb[0] = MBC_ABORT_TARGET; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = loop_id << 8; ++#endif ++ mcp->mb[2] = fcport->ha->loop_reset_delay; ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = 0; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(fcport->ha, mcp); ++ ++ /* Issue marker command. */ ++/* qla2x00_marker(fcport->ha, loop_id, 0, MK_SYNC_ID);*/ ++ fcport->ha->marker_needed = 1; ++ ++ if (rval != QL_STATUS_SUCCESS) { ++/* set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ if (ha->dpc_wait && !ha->dpc_active) ++ up(ha->dpc_wait); */ ++ DEBUG2_3_11(printk("qla2x00_abort_target(%ld): failed=%x.\n", ++ fcport->ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_abort_target(%ld): done.\n", ++ fcport->ha->host_no);) ++ } ++ ++ return rval; ++} ++#endif ++ ++/* ++ * qla2x00_target_reset ++ * Issue target reset mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_target_reset(scsi_qla_host_t *ha, uint16_t b, uint16_t t) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ os_tgt_t *tgt; ++ ++ DEBUG11(printk("qla2x00_target_reset(%ld): entered.\n", ha->host_no);) ++ ++ tgt = TGT_Q(ha, t); ++ if (tgt->vis_port == NULL) { ++ /* no target to abort */ ++ return 0; ++ } ++ if (atomic_read(&tgt->vis_port->state) != FC_ONLINE) { ++ /* target not online */ ++ return 0; ++ } ++ ++ mcp->mb[0] = MBC_TARGET_RESET; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = tgt->vis_port->loop_id & 0xFF; ++#else ++ mcp->mb[1] = tgt->vis_port->loop_id << 8; ++#endif ++ mcp->mb[2] = ha->loop_reset_delay; ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_target_reset(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_target_reset(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_adapter_id ++ * Get adapter ID and topology. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * id = pointer for loop ID. ++ * al_pa = pointer for AL_PA. ++ * area = pointer for area. ++ * domain = pointer for domain. ++ * top = pointer for topology. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_adapter_id(scsi_qla_host_t *ha, uint16_t *id, uint8_t *al_pa, ++ uint8_t *area, uint8_t *domain, uint16_t *top) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_get_adapter_id(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_GET_ADAPTER_LOOP_ID; ++ mcp->out_mb = MBX_0; ++ mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Return data. */ ++ *id = mcp->mb[1]; ++ *al_pa = LSB(mcp->mb[2]); ++ *area = MSB(mcp->mb[2]); ++ *domain = LSB(mcp->mb[3]); ++ *top = mcp->mb[6]; ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_get_adapter_id(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_get_adapter_id(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_retry_cnt ++ * Get current firmware login retry count and delay. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * retry_cnt = pointer to login retry count. ++ * tov = pointer to login timeout value. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_retry_cnt(scsi_qla_host_t *ha, uint8_t *retry_cnt, uint8_t *tov) ++{ ++ int rval; ++ uint16_t ratov; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_get_retry_cnt(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_GET_RETRY_COUNT; ++ mcp->out_mb = MBX_0; ++ mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_get_retry_cnt(%ld): failed = %x.\n", ++ ha->host_no, mcp->mb[0]);) ++ } else { ++ /* Convert returned data and check our values. */ ++ ratov = (mcp->mb[3]/2) / 10; /* mb[3] value is in 100ms */ ++ if (mcp->mb[1] * ratov > (*retry_cnt) * (*tov)) { ++ /* Update to the larger values */ ++ *retry_cnt = (uint8_t)mcp->mb[1]; ++ *tov = ratov; ++ } ++ ++ DEBUG11(printk("qla2x00_get_retry_cnt(%ld): done. mb3=%d " ++ "ratov=%d.\n", ha->host_no, mcp->mb[3], ratov);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_loopback_test ++ * Send out a LOOPBACK mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * retry_cnt = pointer to login retry count. ++ * tov = pointer to login timeout value. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_loopback_test(scsi_qla_host_t *ha, INT_LOOPBACK_REQ *req, ++ uint16_t *ret_mb) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ memset(mcp->mb, 0 , sizeof(mcp->mb)); ++ ++ mcp->mb[0] = MBC_DIAGNOSTIC_LOOP_BACK; ++ mcp->mb[1] = req->Options; ++ mcp->mb[10] = LSW(req->TransferCount); ++ mcp->mb[11] = MSW(req->TransferCount); ++ ++ mcp->mb[14] = LSW(ha->ioctl_mem_phys); /* send data address */ ++ mcp->mb[15] = MSW(ha->ioctl_mem_phys); ++ mcp->mb[20] = LSW(MSD(ha->ioctl_mem_phys)); ++ mcp->mb[21] = MSW(MSD(ha->ioctl_mem_phys)); ++ ++ mcp->mb[16] = LSW(ha->ioctl_mem_phys); /* rcv data address */ ++ mcp->mb[17] = MSW(ha->ioctl_mem_phys); ++ mcp->mb[6] = LSW(MSD(ha->ioctl_mem_phys)); ++ mcp->mb[7] = MSW(MSD(ha->ioctl_mem_phys)); ++ ++ mcp->mb[18] = LSW(req->IterationCount); /* iteration count lsb */ ++ mcp->mb[19] = MSW(req->IterationCount); /* iteration count msb */ ++ ++ mcp->out_mb = MBX_21|MBX_20|MBX_19|MBX_18|MBX_17|MBX_16|MBX_15| ++ MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0; ++ mcp->in_mb = MBX_19|MBX_18|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->buf_size = req->TransferCount; ++ mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD; ++ mcp->tov = 30; ++ ++ DEBUG11(printk("qla2x00_send_loopback: req.Options=%x iterations=%x " ++ "MAILBOX_CNT=%d.\n", req->Options, req->IterationCount, ++ MAILBOX_REGISTER_COUNT);) ++ ++ rval = qla2x00_mailbox_command(ha, mcp); ++ ++ /* Always copy back return mailbox values. */ ++ memcpy((void *)ret_mb, (void *)mcp->mb, sizeof(mcp->mb)); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /* Empty. */ ++ DEBUG2_3_11(printk( ++ "qla2x00_loopback_test(%ld): mailbox command FAILED=%x.\n", ++ ha->host_no, mcp->mb[0]);) ++ } else { ++ /* Empty. */ ++ DEBUG11(printk( ++ "qla2x00_loopback_test(%ld): done.\n", ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_init_firmware ++ * Initialize adapter firmware. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * dptr = Initialization control block pointer. ++ * size = size of initialization control block. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_init_firmware(scsi_qla_host_t *ha, uint16_t size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_init_firmware(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_INITIALIZE_FIRMWARE; ++ mcp->mb[2] = MSW(ha->init_cb_dma); ++ mcp->mb[3] = LSW(ha->init_cb_dma); ++ mcp->mb[4] = 0; ++ mcp->mb[5] = 0; ++ mcp->mb[6] = MSW(MSD(ha->init_cb_dma)); ++ mcp->mb[7] = LSW(MSD(ha->init_cb_dma)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; ++ mcp->in_mb = MBX_5|MBX_4|MBX_0; ++ mcp->buf_size = size; ++ mcp->flags = MBX_DMA_OUT; ++ mcp->tov = 30; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_init_firmware(%ld): failed=%x " ++ "mb0=%x.\n", ++ ha->host_no, rval, mcp->mb[0]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_init_firmware(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_port_database ++ * Issue normal/enhanced get port database mailbox command ++ * and copy device name as necessary. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * dev = structure pointer. ++ * opt = enhanced cmd option byte. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_port_database(scsi_qla_host_t *ha, fcdev_t *dev, uint8_t opt) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ port_database_t *pd; ++ dma_addr_t phys_address = 0; ++ ++ DEBUG11(printk("qla2x00_get_port_database(%ld): entered.\n", ++ ha->host_no);) ++ ++ pd = pci_alloc_consistent(ha->pdev, PORT_DATABASE_SIZE, &phys_address); ++ if (pd == NULL) { ++ DEBUG2_3_11(printk("qla2x00_get_port_database(%ld): **** " ++ "Mem Alloc Failed ****", ++ ha->host_no);) ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ memset(pd, 0, PORT_DATABASE_SIZE); ++ ++ if (opt != 0) ++ mcp->mb[0] = MBC_ENHANCED_GET_PORT_DATABASE; ++ else ++ mcp->mb[0] = MBC_GET_PORT_DATABASE; ++ ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = dev->loop_id & 0xFF; ++#else ++ mcp->mb[1] = dev->loop_id << 8 | opt; ++#endif ++ mcp->mb[2] = MSW(phys_address); ++ mcp->mb[3] = LSW(phys_address); ++ mcp->mb[6] = MSW(MSD(phys_address)); ++ mcp->mb[7] = LSW(MSD(phys_address)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = opt; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_0; ++ mcp->buf_size = PORT_DATABASE_SIZE; ++ mcp->flags = MBX_DMA_IN; ++ /*mcp->tov = ha->retry_count * ha->login_timeout * 2;*/ ++ mcp->tov = ha->login_timeout * 2; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval == QL_STATUS_SUCCESS) { ++ /* Save some data */ ++ /* Names are big endian. */ ++ memcpy((void *)&dev->name[0],(void *)&pd->node_name[0], 8); ++ memcpy((void *)&dev->wwn[0], (void *)&pd->port_name[0], 8); ++ ++ /* Get port_id of device. */ ++ dev->d_id.b.al_pa = pd->port_id[2]; ++ dev->d_id.b.area = pd->port_id[3]; ++ dev->d_id.b.domain = pd->port_id[0]; ++ dev->d_id.b.rsvd_1 = 0; ++ ++ /* Get initiator status of device. */ ++ pd->prli_svc_param_word_3[0] & BIT_5 ? ++ (dev->flag = dev->flag | DEV_INITIATOR) : ++ (dev->flag = dev->flag & ~DEV_INITIATOR); ++ ++ /* Check for logged in and whether target device. */ ++ if (pd->master_state != PD_STATE_PORT_LOGGED_IN && ++ pd->slave_state != PD_STATE_PORT_LOGGED_IN) { ++ rval = QL_STATUS_ERROR; ++ } else if (pd->master_state == PD_STATE_PORT_UNAVAILABLE) { ++ rval = QL_STATUS_ERROR; ++ } ++ } ++ ++ pci_free_consistent(ha->pdev, PORT_DATABASE_SIZE, pd, phys_address); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_get_port_database(%ld): " ++ "failed=%x.\n", ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_get_port_database(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_firmware_state ++ * Get adapter firmware state. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * dptr = pointer for firmware state. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_firmware_state(scsi_qla_host_t *ha, uint16_t *dptr) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_get_firmware_state(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_GET_FIRMWARE_STATE; ++ mcp->out_mb = MBX_0; ++ mcp->in_mb = MBX_2|MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Return firmware state. */ ++ *dptr = mcp->mb[1]; ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_get_firmware_state(%ld): " ++ "failed=%x.\n", ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_get_firmware_state(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_port_name ++ * Issue get port name mailbox command. ++ * Returned name is in big endian format. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = loop ID of device. ++ * name = pointer for name. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_port_name(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t *name, ++ uint8_t opt) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_get_port_name(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_GET_PORT_NAME; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = loop_id << 8 | opt; ++#endif ++ mcp->out_mb = MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = opt; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_get_port_name(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ if (name != NULL) { ++ /* This function returns name in big endian. */ ++ name[0] = LSB(mcp->mb[2]); ++ name[1] = MSB(mcp->mb[2]); ++ name[2] = LSB(mcp->mb[3]); ++ name[3] = MSB(mcp->mb[3]); ++ name[4] = LSB(mcp->mb[6]); ++ name[5] = MSB(mcp->mb[6]); ++ name[6] = LSB(mcp->mb[7]); ++ name[7] = MSB(mcp->mb[7]); ++ } ++ ++ DEBUG11(printk("qla2x00_get_port_name(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_link_status ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = device loop ID. ++ * ret_buf = pointer to link status return buffer. ++ * ++ * Returns: ++ * 0 = success. ++ * BIT_0 = mem alloc error. ++ * BIT_1 = mailbox error. ++ */ ++uint8_t ++qla2x00_get_link_status(scsi_qla_host_t *ha, uint8_t loop_id, void *ret_buf, ++ uint16_t *status) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ link_stat_t *stat_buf; ++ dma_addr_t phys_address = 0; ++ ++ ++ DEBUG11(printk("qla2x00_get_link_status(%ld): entered.\n", ++ ha->host_no);) ++ ++ stat_buf = pci_alloc_consistent(ha->pdev, sizeof(link_stat_t), ++ &phys_address); ++ if (stat_buf == NULL) { ++ DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): Failed to " ++ "allocate memory.\n", ha->host_no)); ++ return BIT_0; ++ } ++ ++ memset(stat_buf, 0, sizeof(link_stat_t)); ++ ++ mcp->mb[0] = MBC_GET_LINK_STATUS; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = loop_id << 8; ++#endif ++ mcp->mb[2] = MSW(phys_address); ++ mcp->mb[3] = LSW(phys_address); ++ mcp->mb[6] = MSW(MSD(phys_address)); ++ mcp->mb[7] = LSW(MSD(phys_address)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = 0; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = IOCTL_CMD; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval == QL_STATUS_SUCCESS) { ++ ++ if (mcp->mb[0] != MBS_COMMAND_COMPLETE) { ++ DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): cmd " ++ "failed. mbx0=%x.\n", ha->host_no, mcp->mb[0]);) ++ status[0] = mcp->mb[0]; ++ rval = BIT_1; ++ } else { ++ /* copy over data */ ++ memcpy(ret_buf, stat_buf,sizeof(link_stat_t)); ++ DEBUG(printk("qla2x00_get_link_status(%ld): stat dump: " ++ "fail_cnt=%d loss_sync=%d loss_sig=%d seq_err=%d " ++ "inval_xmt_word=%d inval_crc=%d.\n", ++ ha->host_no, ++ stat_buf->link_fail_cnt, stat_buf->loss_sync_cnt, ++ stat_buf->loss_sig_cnt, stat_buf->prim_seq_err_cnt, ++ stat_buf->inval_xmit_word_cnt, ++ stat_buf->inval_crc_cnt);) ++ DEBUG11(printk("qla2x00_get_link_status(%ld): stat " ++ "dump: fail_cnt=%d loss_sync=%d loss_sig=%d " ++ "seq_err=%d inval_xmt_word=%d inval_crc=%d.\n", ++ ha->host_no, ++ stat_buf->link_fail_cnt, stat_buf->loss_sync_cnt, ++ stat_buf->loss_sig_cnt, stat_buf->prim_seq_err_cnt, ++ stat_buf->inval_xmit_word_cnt, ++ stat_buf->inval_crc_cnt);) ++ } ++ } else { ++ /* Failed. */ ++ DEBUG2_3_11(printk("qla2x00_get_link_status(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ rval = BIT_1; ++ } ++ ++ pci_free_consistent(ha->pdev, sizeof(link_stat_t), ++ stat_buf, phys_address); ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_lip_reset ++ * Issue LIP reset mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_lip_reset(scsi_qla_host_t *ha) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_lip_reset(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_LIP_RESET; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = 0x00ff; ++#else ++ mcp->mb[1] = 0xff00; ++#endif ++ mcp->mb[2] = ha->loop_reset_delay; ++ mcp->mb[3] = 0; ++ mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = 0; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_lip_reset(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_lip_reset(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_send_sns ++ * Send SNS command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * sns = pointer for command. ++ * cmd_size = command size. ++ * buf_size = response/command size. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_send_sns(scsi_qla_host_t *ha, dma_addr_t sns_phys_address, ++ uint16_t cmd_size, size_t buf_size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_send_sns(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_SEND_SNS_COMMAND; ++ mcp->mb[1] = cmd_size; ++ mcp->mb[2] = MSW(sns_phys_address); ++ mcp->mb[3] = LSW(sns_phys_address); ++ mcp->mb[6] = MSW(MSD(sns_phys_address)); ++ mcp->mb[7] = LSW(MSD(sns_phys_address)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0|MBX_1; ++ mcp->buf_size = buf_size; ++ mcp->flags = MBX_DMA_OUT|MBX_DMA_IN; ++ /*mcp->tov = ha->retry_count * ha->login_timeout * 2;*/ ++ mcp->tov = ha->login_timeout * 2; ++ ++ DEBUG11(printk("qla2x00_send_sns: retry cnt=%d ratov=%d total " ++ "tov=%d.\n", ha->retry_count, ha->login_timeout, mcp->tov);) ++ ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x " ++ "mb[1]=%x.\n", ++ ha->host_no, rval, mcp->mb[0], mcp->mb[1]);) ++ DEBUG2_3_11(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x " ++ "mb[1]=%x.\n", ++ ha->host_no, rval, mcp->mb[0], mcp->mb[1]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_send_sns(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_login_fabric ++ * Issue login fabric port mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = device loop ID. ++ * domain = device domain. ++ * area = device area. ++ * al_pa = device AL_PA. ++ * status = pointer for return status. ++ * opt = command options. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain, ++ uint8_t area, uint8_t al_pa, uint16_t *status, uint8_t opt) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_login_fabric(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_LOGIN_FABRIC_PORT; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = (loop_id << 8) | opt; ++#endif ++ mcp->mb[2] = domain; ++ mcp->mb[3] = area << 8 | al_pa; ++ mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = opt; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_2|MBX_1|MBX_0; ++ /*mcp->tov = ha->retry_count * ha->login_timeout * 2;*/ ++ mcp->tov = ha->login_timeout * 2; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Return mailbox statuses. */ ++ if (status != NULL) { ++ *status++ = mcp->mb[0]; ++ *status++ = mcp->mb[1]; ++ *status = mcp->mb[2]; ++ } ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /* RLU tmp code: need to change main mailbox_command function to ++ * return ok even when the mailbox completion value is not ++ * SUCCESS. The caller needs to be responsible to interpret ++ * the return values of this mailbox command if we're not ++ * to change too much of the existing code. ++ */ ++ if (mcp->mb[0] == 0x4001 || mcp->mb[0] == 0x4002 || ++ mcp->mb[0] == 0x4003 || mcp->mb[0] == 0x4005 || ++ mcp->mb[0] == 0x4006) ++ rval = QL_STATUS_SUCCESS; ++ ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_login_fabric(%ld): failed=%x " ++ "mb[1]=%x mb[2]=%x.\n", ++ ha->host_no, rval, mcp->mb[1], mcp->mb[2]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_login_fabric(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_login_local_device ++ * Issue login loop port mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = device loop ID. ++ * opt = command options. ++ * ++ * Returns: ++ * Return status code. ++ * ++ * Context: ++ * Kernel context. ++ * ++ */ ++int ++qla2x00_login_local_device(scsi_qla_host_t *ha, ++ uint16_t loop_id, uint16_t *mb_ret, uint8_t opt) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);) ++ ++ mcp->mb[0] = MBC_LOGIN_LOOP_PORT; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = (loop_id << 8); ++#endif ++ mcp->mb[2] = opt; ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0; ++ mcp->tov = ha->login_timeout * 2; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ /* Return mailbox statuses. */ ++ if (mb_ret != NULL) { ++ mb_ret[0] = mcp->mb[0]; ++ mb_ret[1] = mcp->mb[1]; ++ mb_ret[6] = mcp->mb[6]; ++ mb_ret[7] = mcp->mb[7]; ++ } ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /* AV tmp code: need to change main mailbox_command function to ++ * return ok even when the mailbox completion value is not ++ * SUCCESS. The caller needs to be responsible to interpret ++ * the return values of this mailbox command if we're not ++ * to change too much of the existing code. ++ */ ++ if (mcp->mb[0] == 0x4005 || mcp->mb[0] == 0x4006) ++ rval = QL_STATUS_SUCCESS; ++ ++ DEBUG(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x " ++ "mb[6]=%x mb[7]=%x.\n", ++ __func__, ha->host_no, rval, mcp->mb[0], mcp->mb[1], ++ mcp->mb[6], mcp->mb[7]);) ++ DEBUG2_3(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x " ++ "mb[6]=%x mb[7]=%x.\n", ++ __func__, ha->host_no, rval, mcp->mb[0], mcp->mb[1], ++ mcp->mb[6], mcp->mb[7]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG3(printk("%s(%ld): done.\n", __func__, ha->host_no);) ++ } ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_fabric_logout ++ * Issue logout fabric port mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = device loop ID. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_fabric_logout(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = loop_id << 8; ++#endif ++ mcp->out_mb = MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = 0; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_fabric_logout(%ld): failed=%x " ++ "mbx1=%x.\n", ++ ha->host_no, rval, mcp->mb[1]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_fabric_logout(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_full_login_lip ++ * Issue full login LIP mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_full_login_lip(scsi_qla_host_t *ha) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_LIP_FULL_LOGIN; ++ mcp->mb[1] = 0; ++ mcp->mb[2] = 0; ++ mcp->mb[3] = 0; ++ mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_full_login_lip(%ld): failed=%x.\n", ++ ha->instance, rval);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_full_login_lip(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_port_list ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_port_list(scsi_qla_host_t *ha, port_list_entry_t *gp_list, ++ dma_addr_t gpl_phys_address, uint16_t opt, uint16_t *size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_get_port_list(%ld): entered.\n", ++ ha->host_no);) ++ ++ if( gp_list == NULL ) { ++ return QL_STATUS_ERROR; ++ } ++ ++ mcp->mb[0] = MBC_GET_PORT_LIST; ++ mcp->mb[1] = opt; ++ mcp->mb[2] = MSW(gpl_phys_address); ++ mcp->mb[3] = LSW(gpl_phys_address); ++ mcp->mb[6] = MSW(MSD(gpl_phys_address)); ++ mcp->mb[7] = LSW(MSD(gpl_phys_address)); ++ ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ /*EMPTY*/ ++ DEBUG2_3_11(printk("qla2x00_get_port_list(%ld): failed=%x.\n", ++ ha->host_no, rval);) ++ } else { ++ *size = mcp->mb[1]; ++ DEBUG11(printk("qla2x00_get_port_list(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return rval; ++} ++ ++#if 0 /* not yet needed */ ++int ++qla2x00_dump_ram(scsi_qla_host_t *ha, uint32_t risc_address, ++ dma_addr_t ispdump_dma, uint32_t size) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ mcp->mb[0] = MBC_DUMP_RAM; ++ mcp->mb[1] = risc_address & 0xffff; ++ mcp->mb[2] = MSW(ispdump_dma); ++ mcp->mb[3] = LSW(ispdump_dma); ++ mcp->mb[4] = 0; ++ mcp->mb[6] = MSW(MSD(ispdump_dma)); ++ mcp->mb[7] = LSW(MSD(ispdump_dma)); ++ ++ mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = qla2x00_mailbox_command(ha, mcp); ++ ++ return rval; ++} ++#endif ++ ++/* ++ * qla2x00_lun_reset ++ * Issue lun reset mailbox command. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * loop_id = device loop ID. ++ * lun = lun to be reset. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_lun_reset(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ ENTER("qla2x00_lun_reset"); ++ ++ mcp->mb[0] = MBC_LUN_RESET; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = loop_id << 8; ++#endif ++ mcp->mb[2] = lun; ++ mcp->out_mb = MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_0; ++ mcp->tov = 30; ++ mcp->flags = 0; ++ rval = qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QLA2X00_SUCCESS) { ++ /*EMPTY*/ ++ printk(KERN_WARNING "qla2x00_lun_reset(%d): failed = %d", ++ (int)ha->instance, rval); ++ } else { ++ /*EMPTY*/ ++ LEAVE("qla2x00_lun_reset: exiting normally"); ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_send_rnid_mbx ++ * Issue RNID ELS using mailbox command ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * loop_id = loop ID of the target device. ++ * data_fmt = currently supports only 0xDF. ++ * buffer = buffer pointer. ++ * buf_size = size of buffer. ++ * mb_reg = pointer to return mailbox registers. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_send_rnid_mbx(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t data_fmt, ++ dma_addr_t buf_phys_addr, size_t buf_size, uint16_t *mb_reg) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_send_rnid_mbx(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_SEND_RNID_ELS; ++#if defined(EXTENDED_IDS) ++ mcp->mb[1] = loop_id & 0xFF; ++#else ++ mcp->mb[1] = (loop_id << 8 ) | data_fmt; ++#endif ++ mcp->mb[2] = MSW(buf_phys_addr); ++ mcp->mb[3] = LSW(buf_phys_addr); ++ mcp->mb[6] = MSW(MSD(buf_phys_addr)); ++ mcp->mb[7] = LSW(MSD(buf_phys_addr)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++#if defined(EXTENDED_IDS) ++ mcp->mb[10] = data_fmt; ++ mcp->out_mb |= MBX_10; ++#endif ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->buf_size = buf_size; ++ mcp->flags = MBX_DMA_IN; ++ mcp->tov = 30; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */ ++ ++ DEBUG2_3_11(printk("qla2x00_send_rnid_mbx(%ld): failed=%x " ++ "mb[1]=%x.\n", ++ ha->host_no, mcp->mb[0], mcp->mb[1]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_send_rnid_mbx(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_set_rnid_params_mbx ++ * Set RNID parameters using mailbox command ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * buffer = buffer pointer. ++ * buf_size = size of buffer. ++ * mb_reg = pointer to return mailbox registers. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_set_rnid_params_mbx(scsi_qla_host_t *ha, dma_addr_t buf_phys_addr, ++ size_t buf_size, uint16_t *mb_reg) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_set_rnid_params_mbx(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_SET_RNID_PARAMS; ++ mcp->mb[1] = 0; ++ mcp->mb[2] = MSW(buf_phys_addr); ++ mcp->mb[3] = LSW(buf_phys_addr); ++ mcp->mb[6] = MSW(MSD(buf_phys_addr)); ++ mcp->mb[7] = LSW(MSD(buf_phys_addr)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->buf_size = buf_size; ++ mcp->flags = MBX_DMA_OUT; ++ mcp->tov = 30; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QLA2X00_SUCCESS) { ++ memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */ ++ ++ DEBUG2_3_11(printk("qla2x00_set_rnid_params_mbx(%ld): " ++ "failed=%x mb[1]=%x.\n", ++ ha->host_no, mcp->mb[0], mcp->mb[1]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_set_rnid_params_mbx(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_get_rnid_params_mbx ++ * Get RNID parameters using mailbox command ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * buffer = buffer pointer. ++ * buf_size = size of buffer. ++ * mb_reg = pointer to return mailbox registers. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_rnid_params_mbx(scsi_qla_host_t *ha, dma_addr_t buf_phys_addr, ++ size_t buf_size, uint16_t *mb_reg) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ ++ DEBUG11(printk("qla2x00_get_rnid_params_mbx(%ld): entered.\n", ++ ha->host_no);) ++ ++ mcp->mb[0] = MBC_GET_RNID_PARAMS; ++ mcp->mb[1] = 0; ++ mcp->mb[2] = MSW(buf_phys_addr); ++ mcp->mb[3] = LSW(buf_phys_addr); ++ mcp->mb[6] = MSW(MSD(buf_phys_addr)); ++ mcp->mb[7] = LSW(MSD(buf_phys_addr)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->buf_size = buf_size; ++ mcp->flags = MBX_DMA_IN; ++ mcp->tov = 30; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval != QLA2X00_SUCCESS) { ++ memcpy(mb_reg, mcp->mb, 2 * 2); /* 2 status regs */ ++ ++ DEBUG2_3_11(printk("qla2x00_get_rnid_params_mbx(%ld): " ++ "failed=%x mb[1]=%x.\n", ++ ha->host_no, mcp->mb[0], mcp->mb[1]);) ++ } else { ++ /*EMPTY*/ ++ DEBUG11(printk("qla2x00_get_rnid_params_mbx(%ld): done.\n", ++ ha->host_no);) ++ } ++ ++ return (rval); ++} ++ ++#if defined(QL_DEBUG_LEVEL_3) ++/* ++ * qla2x00_get_fcal_position_map ++ * Get FCAL (LILP) position map using mailbox command ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pos_map = buffer pointer (can be NULL). ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map) ++{ ++ int rval; ++ mbx_cmd_t mc; ++ mbx_cmd_t *mcp = &mc; ++ char *pmap; ++ dma_addr_t pmap_dma; ++ ++ pmap = pci_alloc_consistent(ha->pdev, FCAL_MAP_SIZE, &pmap_dma); ++ if (pmap == NULL) { ++ DEBUG2_3_11(printk("%s(%ld): **** Mem Alloc Failed ****", ++ __func__, ha->host_no)); ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ memset(pmap, 0, FCAL_MAP_SIZE); ++ ++ mcp->mb[0] = MBC_GET_FCAL_MAP; ++ mcp->mb[2] = MSW(pmap_dma); ++ mcp->mb[3] = LSW(pmap_dma); ++ mcp->mb[6] = MSW(MSD(pmap_dma)); ++ mcp->mb[7] = LSW(MSD(pmap_dma)); ++ mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; ++ mcp->in_mb = MBX_1|MBX_0; ++ mcp->buf_size = FCAL_MAP_SIZE; ++ mcp->flags = MBX_DMA_IN; ++ mcp->tov = ha->login_timeout * 2; ++ rval = (int)qla2x00_mailbox_command(ha, mcp); ++ ++ if (rval == QL_STATUS_SUCCESS) { ++ DEBUG11(printk("%s(%ld): (mb0=%x/mb1=%x) FC/AL Position Map " ++ "size (%x)\n", ++ __func__, ha->host_no, ++ mcp->mb[0], mcp->mb[1], (unsigned)pmap[0])); ++ DEBUG11(qla2x00_dump_buffer(pmap, pmap[0] + 1)); ++ ++ if (pos_map) ++ memcpy(pos_map, pmap, FCAL_MAP_SIZE); ++ } ++ pci_free_consistent(ha->pdev, FCAL_MAP_SIZE, pmap, pmap_dma); ++ ++ if (rval != QL_STATUS_SUCCESS) { ++ DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", ++ __func__, ha->host_no, rval)); ++ } else { ++ DEBUG11(printk("%s(%ld): done.\n", ++ __func__, ha->host_no)); ++ } ++ ++ return rval; ++} ++#endif +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_os.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,5879 @@ ++/* ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ */ ++#define QLA_MODVERSION ++#include "qla_os.h" ++ ++#include "qla_def.h" ++ ++/* ++ * Driver version ++ */ ++char qla2x00_version_str[40] = { 0 }; ++ ++/* ++* Command line options. ++*/ ++unsigned long qla2x00_verbose = 1L; ++unsigned long qla2x00_quiet = 0L; ++unsigned long qla2x00_reinit = 1L; ++unsigned long qla2x00_req_dmp = 0L; ++ ++/* ++ * Stats for all adpaters. ++ */ ++struct _qla2x00stats qla2x00_stats; ++ ++/* ++ * Ioctl related information. ++ */ ++int num_hosts = 0; ++int apiHBAInstance = 0; ++ ++/* ++ * Module parameter information and variables ++ */ ++ ++char *ql2xdevconf = NULL; ++#if MPIO_SUPPORT ++int ql2xretrycount = 30; ++#else ++int ql2xretrycount = 20; ++#endif ++int qla2xenbinq = 1; ++int max_srbs = MAX_SRBS; ++#if defined(ISP2200) || defined(ISP2300) ++int ql2xlogintimeout = 20; ++int qlport_down_retry = 0; ++#endif ++int ql2xmaxqdepth = 0; ++int displayConfig = 0; ++ ++/* Enable for failover */ ++#if MPIO_SUPPORT ++int ql2xfailover = 1; ++#else ++int ql2xfailover = 0; ++#endif ++ ++int ConfigRequired = 0; ++int recoveryTime = MAX_RECOVERYTIME; ++int failbackTime = MAX_FAILBACKTIME; ++ ++/* Persistent binding type */ ++int Bind = BIND_BY_PORT_NAME; ++ ++int ql2xsuspendcount = SUSPEND_COUNT; ++ ++int qla2x00_retryq_dmp = 0; ++ ++#if defined(MODULE) ++char *ql2xopts = NULL; ++ ++static char dummy_buffer[60] = ++ "Please don't add commas in your insmod command!!\n"; ++ ++/* insmod qla2100 ql2xopts=verbose" */ ++MODULE_PARM(ql2xopts, "s"); ++MODULE_PARM_DESC(ql2xopts, ++ "Additional driver options."); ++ ++MODULE_PARM(ql2xfailover, "i"); ++MODULE_PARM_DESC(ql2xfailover, ++ "Driver failover support: 0 to disable; 1 to enable. " ++ "Default behaviour based on compile-time option " ++ "MPIO_SUPPORT."); ++ ++MODULE_PARM(ql2xmaxqdepth, "i"); ++MODULE_PARM_DESC(ql2xmaxqdepth, ++ "Maximum queue depth to report for target devices."); ++ ++#if defined(ISP2200) || defined(ISP2300) ++MODULE_PARM(ql2xlogintimeout,"i"); ++MODULE_PARM_DESC(ql2xlogintimeout, ++ "Login timeout value in seconds."); ++ ++MODULE_PARM(qlport_down_retry,"i"); ++MODULE_PARM_DESC(qlport_down_retry, ++ "Maximum number of command retries to a port that returns" ++ "a PORT-DOWN status."); ++#endif ++ ++MODULE_PARM(ql2xretrycount,"i"); ++MODULE_PARM_DESC(ql2xretrycount, ++ "Maximum number of mid-layer retries allowed for a command. " ++ "Default value in non-failover mode is 20, " ++ "in failover mode, 30."); ++ ++MODULE_PARM(max_srbs,"i"); ++MODULE_PARM_DESC(max_srbs, ++ "Maximum number of simultaneous commands allowed for an HBA."); ++ ++MODULE_PARM(displayConfig, "i"); ++MODULE_PARM_DESC(displayConfig, ++ "If 1 then display the configuration used in " ++ "/etc/modules.conf."); ++ ++MODULE_PARM(ConfigRequired, "i"); ++MODULE_PARM_DESC(ConfigRequired, ++ "If 1, then only configured devices passed in through the" ++ "ql2xopts parameter will be presented to the OS"); ++ ++MODULE_PARM(recoveryTime, "i"); ++MODULE_PARM_DESC(recoveryTime, ++ "Recovery time in seconds before a target device is sent I/O " ++ "after a failback is performed."); ++ ++MODULE_PARM(failbackTime, "i"); ++MODULE_PARM_DESC(failbackTime, ++ "Delay in seconds before a failback is performed."); ++ ++MODULE_PARM(Bind, "i"); ++MODULE_PARM_DESC(Bind, ++ "Target persistent binding method: " ++ "0 by Portname (default); 1 by PortID; 2 by Nodename. "); ++ ++MODULE_PARM(ql2xsuspendcount,"i"); ++MODULE_PARM_DESC(ql2xsuspendcount, ++ "Number of 6-second suspend iterations to perform while a " ++ "target returns a status. Default is 10 " ++ "iterations."); ++#endif ++ ++MODULE_AUTHOR("QLogic Corporation"); ++MODULE_DESCRIPTION("QLogic " ISP_NAME " FC-SCSI Host Bus Adapter driver"); ++MODULE_LICENSE("GPL"); ++ ++ ++/* ++ * Proc structures and functions ++ */ ++struct info_str { ++ char *buffer; ++ int length; ++ off_t offset; ++ int pos; ++}; ++ ++static void copy_mem_info(struct info_str *, char *, int); ++static int copy_info(struct info_str *, char *, ...); ++ ++ ++/* ++ * List of host adapters ++ */ ++struct list_head qla_hostlist; ++rwlock_t qla_hostlist_lock; ++ ++ ++/* ++ * PCI driver interface definitions ++ */ ++#define ISP21XX_FW_INDEX 0 ++#define ISP22XX_FW_INDEX 0 ++#define ISP23XX_FW_INDEX 0 ++#define ISP232X_FW_INDEX 2 ++ ++static struct qla_fw_info qla_fw_tbl[] = { ++#if defined(ISP2100) ++ /* Start of 21xx firmware list */ ++ { ++ .addressing = FW_INFO_ADDR_NORMAL, ++ .fwcode = &fw2100tp_code01[0], ++ .fwlen = &fw2100tp_length01, ++ .fwstart = &fw2100tp_addr01, ++ }, ++#endif ++ ++#if defined(ISP2200) ++ /* Start of 22xx firmware list */ ++ { ++ .addressing = FW_INFO_ADDR_NORMAL, ++ .fwcode = &fw2200ip_code01[0], ++ .fwlen = &fw2200ip_length01, ++ .fwstart = &fw2200ip_addr01, ++ }, ++#endif ++ ++#if defined(ISP2300) ++ /* Start of 23xx firmware list */ ++#if defined(TPX) ++ { ++ .addressing = FW_INFO_ADDR_NORMAL, ++ .fwcode = &fw2300tpx_code01[0], ++ .fwlen = &fw2300tpx_length01, ++ .fwstart = &fw2300tpx_addr01, ++ }, ++#else ++ { ++ .addressing = FW_INFO_ADDR_NORMAL, ++ .fwcode = &fw2300ipx_code01[0], ++ .fwlen = &fw2300ipx_length01, ++ .fwstart = &fw2300ipx_addr01, ++ }, ++#endif ++ ++#if defined(ISP2322) ++ /* End of 23xx firmware list */ ++ { FW_INFO_ADDR_NOMORE, }, ++ ++ /* Start of 232x firmware list */ ++#if defined(TPX) ++ { ++ .addressing = FW_INFO_ADDR_NORMAL, ++ .fwcode = &fw2322tpx_code01[0], ++ .fwlen = &fw2322tpx_length01, ++ .fwstart = &fw2322tpx_addr01, ++ }, ++ { ++ .addressing = FW_INFO_ADDR_EXTENDED, ++ .fwcode = &rseqtpx_code01[0], ++ .fwlen = &rseqtpx_code_length01, ++ .lfwstart = &rseqtpx_code_addr01, ++ }, ++ { ++ .addressing = FW_INFO_ADDR_EXTENDED, ++ .fwcode = &xseqtpx_code01[0], ++ .fwlen = &xseqtpx_code_length01, ++ .lfwstart = &xseqtpx_code_addr01, ++ }, ++#else ++ { ++ .addressing = FW_INFO_ADDR_NORMAL, ++ .fwcode = &fw2322ipx_code01[0], ++ .fwlen = &fw2322ipx_length01, ++ .fwstart = &fw2322ipx_addr01, ++ }, ++ { ++ .addressing = FW_INFO_ADDR_EXTENDED, ++ .fwcode = &rseqipx_code01[0], ++ .fwlen = &rseqipx_code_length01, ++ .lfwstart = &rseqipx_code_addr01, ++ }, ++ { ++ .addressing = FW_INFO_ADDR_EXTENDED, ++ .fwcode = &xseqipx_code01[0], ++ .fwlen = &xseqipx_code_length01, ++ .lfwstart = &xseqipx_code_addr01, ++ }, ++#endif ++ ++#endif ++ ++#endif ++ ++ /* End of firmware list */ ++ { FW_INFO_ADDR_NOMORE, }, ++}; ++ ++#define ISP21XX_BRD_INDEX 0 ++#define ISP22XX_BRD_INDEX 0 ++#define ISP23XX_BRD_INDEX 0 ++#define ISP2312_BRD_INDEX 1 ++#define ISP2322_BRD_INDEX 2 ++ ++static struct qla_board_info qla_board_tbl[] = { ++#if defined(ISP2100) ++ { ++ .name = "QLA2100 ", ++ .fwinfo = &qla_fw_tbl[ISP21XX_FW_INDEX], ++ } ++#endif ++ ++#if defined(ISP2200) ++ { ++ .name = "QLA2200 ", ++ .fwinfo = &qla_fw_tbl[ISP22XX_FW_INDEX], ++ } ++#endif ++ ++#if defined(ISP2300) ++ { ++ .name = "QLA2300 ", ++ .fwinfo = &qla_fw_tbl[ISP23XX_FW_INDEX], ++ }, ++ ++ { ++ .name = "QLA2312 ", ++ .fwinfo = &qla_fw_tbl[ISP23XX_FW_INDEX], ++ }, ++ ++#if defined(ISP2322) ++ { ++ .name = "QLA2322 ", ++ .fwinfo = &qla_fw_tbl[ISP232X_FW_INDEX], ++ } ++#endif ++#endif ++}; ++ ++static struct pci_device_id qla_pci_tbl[] __devinitdata = { ++#if defined(ISP2100) ++ { ++ .vendor = QLA2X00_VENDOR_ID, ++ .device = QLA2100_DEVICE_ID, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .driver_data ++ = (unsigned long)&qla_board_tbl[ISP21XX_BRD_INDEX], ++ }, ++#endif ++ ++#if defined(ISP2200) ++ { ++ .vendor = QLA2X00_VENDOR_ID, ++ .device = QLA2200_DEVICE_ID, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .driver_data ++ = (unsigned long)&qla_board_tbl[ISP22XX_BRD_INDEX], ++ }, ++#endif ++ ++#if defined(ISP2300) ++ { ++ .vendor = QLA2X00_VENDOR_ID, ++ .device = QLA2300_DEVICE_ID, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .driver_data ++ = (unsigned long)&qla_board_tbl[ISP23XX_BRD_INDEX], ++ }, ++ ++ { ++ .vendor = QLA2X00_VENDOR_ID, ++ .device = QLA2312_DEVICE_ID, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .driver_data ++ = (unsigned long)&qla_board_tbl[ISP2312_BRD_INDEX], ++ }, ++ ++#if defined(ISP2322) ++ { ++ .vendor = QLA2X00_VENDOR_ID, ++ .device = QLA2322_DEVICE_ID, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .driver_data ++ = (unsigned long)&qla_board_tbl[ISP2322_BRD_INDEX], ++ }, ++#endif ++#endif ++ {0 , 0} ++}; ++MODULE_DEVICE_TABLE(pci, qla_pci_tbl); ++ ++static int __devinit qla_probe_device(struct pci_dev *, ++ const struct pci_device_id *); ++static void __devexit qla_remove_device(struct pci_dev *); ++static void qla2x00_free_device(scsi_qla_host_t *); ++ ++struct pci_driver qla_pci_driver = { ++ .name = DRIVER_NAME, ++ .id_table = qla_pci_tbl, ++ ++ .probe = qla_probe_device, ++ .remove = __devexit_p(qla_remove_device), ++}; ++ ++ ++/* ++ * SCSI host template entry points ++ */ ++static int qla2x00_detect(Scsi_Host_Template *); ++static int qla2x00_release(struct Scsi_Host *); ++static const char *qla2x00_info(struct Scsi_Host *); ++static int qla2xxx_slave_configure(Scsi_Device * device); ++static int qla2x00_biosparam(struct scsi_device *, ++ struct block_device *, sector_t, int[]); ++extern int qla2x00_ioctl(Scsi_Device *, int , void *); ++static int qla2xxx_eh_abort(Scsi_Cmnd *); ++static int qla2xxx_eh_device_reset(Scsi_Cmnd *); ++static int qla2xxx_eh_bus_reset(Scsi_Cmnd *); ++static int qla2xxx_eh_host_reset(Scsi_Cmnd *); ++static uint8_t qla2x00_loop_reset(scsi_qla_host_t *ha); ++static int qla2x00_device_reset(scsi_qla_host_t *, uint16_t, uint16_t); ++ ++static int qla2x00_proc_info(char *, char **, off_t, int, int, int); ++ ++static uint8_t qla2x00_register_with_Linux(scsi_qla_host_t *, uint8_t); ++ ++#if defined (CONFIG_SCSIFCHOTSWAP) || defined(CONFIG_GAMAP) ++int qla2x00_get_scsi_info_from_wwn(int mode, unsigned long long wwn, int *host, int *channel, int *lun, int *id); ++int qla2x00_get_wwn_from_scsi_info(int host, int id, unsigned long long *wwn); ++#endif /* CONFIG_SCSIFCHOTSWAP || CONFIG_GAMAP */ ++ ++#if !defined(MODULE) ++static int __init qla2x00_setup(char *); ++#else ++static void qla2x00_setup(char *); ++#endif ++static char *qla2x00_get_line(char *, char *); ++static int qla2x00_get_tokens(char *, char **, int); ++ ++ ++static Scsi_Host_Template qla2x00_driver_template = { ++ .module = THIS_MODULE, ++ .name = DRIVER_NAME, ++ .proc_name = DRIVER_NAME, ++ .proc_info = qla2x00_proc_info, ++ .detect = qla2x00_detect, ++ .release = qla2x00_release, ++ .info = qla2x00_info, ++ .ioctl = qla2x00_ioctl, ++ .queuecommand = qla2x00_queuecommand, ++ ++ .eh_abort_handler = qla2xxx_eh_abort, ++ .eh_device_reset_handler = qla2xxx_eh_device_reset, ++ .eh_bus_reset_handler = qla2xxx_eh_bus_reset, ++ .eh_host_reset_handler = qla2xxx_eh_host_reset, ++ .bios_param = qla2x00_biosparam, ++ ++ .slave_configure = qla2xxx_slave_configure, ++ ++ .this_id = -1, ++ .can_queue = 255, ++ .cmd_per_lun = 3, ++ .sg_tablesize = SG_ALL, ++ .use_clustering = ENABLE_CLUSTERING, ++ .unchecked_isa_dma = 0, ++ .max_sectors = 8192, ++ .highmem_io = 1, ++}; ++ ++static void qla2x00_display_fc_names(scsi_qla_host_t *); ++ ++/* TODO Convert to inlines ++ * ++ * Timer routines ++ */ ++#define WATCH_INTERVAL 1 /* number of seconds */ ++ ++static void qla2x00_timer(scsi_qla_host_t *); ++ ++static __inline__ void qla2x00_start_timer(scsi_qla_host_t *, ++ void *, unsigned long); ++static __inline__ void qla2x00_restart_timer(scsi_qla_host_t *, unsigned long); ++static __inline__ void qla2x00_stop_timer(scsi_qla_host_t *); ++ ++static inline void ++qla2x00_start_timer(scsi_qla_host_t *ha, void *func, unsigned long interval) ++{ ++ init_timer(&ha->timer); ++ ha->timer.expires = jiffies + interval * HZ; ++ ha->timer.data = (unsigned long)ha; ++ ha->timer.function = (void (*)(unsigned long))func; ++ add_timer(&ha->timer); ++ ha->timer_active = 1; ++} ++ ++static inline void ++qla2x00_restart_timer(scsi_qla_host_t *ha, unsigned long interval) ++{ ++ mod_timer(&ha->timer, jiffies + interval * HZ); ++} ++ ++static __inline__ void ++qla2x00_stop_timer(scsi_qla_host_t *ha) ++{ ++ del_timer_sync(&ha->timer); ++ ha->timer_active = 0; ++} ++ ++ ++static void qla2x00_cmd_timeout(srb_t *sp); ++static __inline__ void qla2x00_add_timer_to_cmd(srb_t *sp, int timeout); ++static __inline__ void qla2x00_delete_timer_from_cmd(srb_t *sp); ++ ++/************************************************************************** ++* qla2x00_add_timer_to_cmd ++* ++* Description: ++* Creates a timer for the specified command. The timeout is usually ++* the command time from kernel minus 2 secs. ++* ++* Input: ++* sp - pointer to validate ++* ++* Returns: ++* None. ++**************************************************************************/ ++static inline void ++qla2x00_add_timer_to_cmd(srb_t *sp, int timeout) ++{ ++ init_timer(&sp->timer); ++ sp->timer.expires = jiffies + timeout * HZ; ++ sp->timer.data = (unsigned long) sp; ++ sp->timer.function = (void (*) (unsigned long))qla2x00_cmd_timeout; ++ add_timer(&sp->timer); ++} ++ ++/************************************************************************** ++* qla2x00_delete_timer_from_cmd ++* ++* Description: ++* Delete the timer for the specified command. ++* ++* Input: ++* sp - pointer to validate ++* ++* Returns: ++* None. ++**************************************************************************/ ++static inline void ++qla2x00_delete_timer_from_cmd(srb_t *sp) ++{ ++ if (sp->timer.function != NULL) { ++ del_timer(&sp->timer); ++ sp->timer.function = NULL; ++ sp->timer.data = (unsigned long) NULL; ++ } ++} ++ ++static __inline__ void qla2x00_callback(scsi_qla_host_t *, Scsi_Cmnd *); ++static __inline__ void sp_put(struct scsi_qla_host * ha, srb_t *sp); ++static __inline__ void sp_get(struct scsi_qla_host * ha, srb_t *sp); ++static __inline__ void __sp_put(struct scsi_qla_host * ha, srb_t *sp); ++static __inline__ void ++qla2x00_delete_from_done_queue(scsi_qla_host_t *, srb_t *); ++ ++/************************************************************************** ++* sp_put ++* ++* Description: ++* Decrement reference count and call the callback if we're the last ++* owner of the specified sp. Will get io_request_lock before calling ++* the callback. ++* ++* Input: ++* ha - pointer to the scsi_qla_host_t where the callback is to occur. ++* sp - pointer to srb_t structure to use. ++* ++* Returns: ++* ++**************************************************************************/ ++static inline void ++sp_put(struct scsi_qla_host * ha, srb_t *sp) ++{ ++ unsigned long flags; ++ ++ if (atomic_read(&sp->ref_count) == 0) { ++ printk(KERN_INFO ++ "%s(): **** SP->ref_count not zero\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return; ++ } ++ ++ if (!atomic_dec_and_test(&sp->ref_count)) ++ { ++ return; ++ } ++ ++ spin_lock_irqsave(ha->host->host_lock, flags); ++ ++ qla2x00_callback(ha, sp->cmd); ++ ++ spin_unlock_irqrestore(ha->host->host_lock, flags); ++} ++ ++/************************************************************************** ++* sp_get ++* ++* Description: ++* Increment reference count of the specified sp. ++* ++* Input: ++* sp - pointer to srb_t structure to use. ++* ++* Returns: ++* ++**************************************************************************/ ++static inline void ++sp_get(struct scsi_qla_host * ha, srb_t *sp) ++{ ++ atomic_inc(&sp->ref_count); ++ ++ if (atomic_read(&sp->ref_count) > 2) { ++ printk(KERN_INFO ++ "%s(): **** SP->ref_count greater than two\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return; ++ } ++} ++ ++/************************************************************************** ++* __sp_put ++* ++* Description: ++* Decrement reference count and call the callback if we're the last ++* owner of the specified sp. Will NOT get io_request_lock before calling ++* the callback. ++* ++* Input: ++* ha - pointer to the scsi_qla_host_t where the callback is to occur. ++* sp - pointer to srb_t structure to use. ++* ++* Returns: ++* ++**************************************************************************/ ++static inline void ++__sp_put(struct scsi_qla_host * ha, srb_t *sp) ++{ ++ if (atomic_read(&sp->ref_count) == 0) { ++ printk(KERN_INFO ++ "%s(): **** SP->ref_count not zero\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return; ++ } ++ ++ if (!atomic_dec_and_test(&sp->ref_count)) ++ { ++ return; ++ } ++ ++ qla2x00_callback(ha, sp->cmd); ++} ++ ++ ++/* ++* qla2x00_callback ++* Returns the completed SCSI command to LINUX. ++* ++* Input: ++* ha -- Host adapter structure ++* cmd -- SCSI mid-level command structure. ++* Returns: ++* None ++* Note:From failover point of view we always get the sp ++* from vis_ha pool in queuecommand.So when we put it ++* back to the pool it has to be the vis_ha. ++* So rely on Scsi_Cmnd to get the vis_ha and not on sp. ++*/ ++static inline void ++qla2x00_callback(scsi_qla_host_t *ha, Scsi_Cmnd *cmd) ++{ ++ srb_t *sp = (srb_t *) CMD_SP(cmd); ++ scsi_qla_host_t *vis_ha; ++ os_lun_t *lq; ++ int got_sense; ++ unsigned long cpu_flags = 0; ++ ++ ENTER(__func__); ++ ++ CMD_HANDLE(cmd) = (unsigned char *) NULL; ++ vis_ha = (scsi_qla_host_t *) cmd->device->host->hostdata; ++ ++ if (sp == NULL) { ++ printk(KERN_INFO ++ "%s(): **** CMD derives a NULL SP\n", ++ __func__); ++ DEBUG2(BUG();) ++ return; ++ } ++ ++ /* ++ * If command status is not DID_BUS_BUSY then go ahead and freed sp. ++ */ ++ /* ++ * Cancel command timeout ++ */ ++ qla2x00_delete_timer_from_cmd(sp); ++ ++ /* ++ * Put SP back in the free queue ++ */ ++ sp->cmd = NULL; ++ CMD_SP(cmd) = NULL; ++ lq = sp->lun_queue; ++ got_sense = (sp->flags & SRB_GOT_SENSE)? 1: 0; ++ add_to_free_queue(vis_ha, sp); ++ ++ if ((CMD_RESULT(cmd)>>16) == DID_OK) { ++ /* device ok */ ++ ha->total_bytes += cmd->bufflen; ++ if (!got_sense) { ++ /* If lun was suspended then clear retry count */ ++ spin_lock_irqsave(&lq->q_lock, cpu_flags); ++ if (!test_bit(LUN_EXEC_DELAYED, &lq->q_flag)) ++ lq->q_state = LUN_STATE_READY; ++ spin_unlock_irqrestore(&lq->q_lock, cpu_flags); ++ } ++ } else if ((CMD_RESULT(cmd)>>16) == DID_ERROR) { ++ /* device error */ ++ ha->total_dev_errs++; ++ } ++ ++ if (cmd->flags & IS_RESETTING) { ++ CMD_RESULT(cmd) = (int)DID_RESET << 16; ++ } ++ ++ /* Call the mid-level driver interrupt handler */ ++ (*(cmd)->scsi_done)(cmd); ++ ++ LEAVE(__func__); ++} ++ ++static inline void ++qla2x00_delete_from_done_queue(scsi_qla_host_t *dest_ha, srb_t *sp) ++{ ++ /* remove command from done list */ ++ list_del_init(&sp->list); ++ dest_ha->done_q_cnt--; ++ sp->state = SRB_NO_QUEUE_STATE; ++ ++ if (sp->flags & SRB_DMA_VALID) { ++ sp->flags &= ~SRB_DMA_VALID; ++ ++ /* Release memory used for this I/O */ ++ if (sp->cmd->use_sg) { ++ pci_unmap_sg(dest_ha->pdev, ++ sp->cmd->request_buffer, ++ sp->cmd->use_sg, ++ scsi_to_pci_dma_dir( ++ sp->cmd->sc_data_direction)); ++ } else if (sp->cmd->request_bufflen) { ++ pci_unmap_page(dest_ha->pdev, ++ sp->saved_dma_handle, ++ sp->cmd->request_bufflen, ++ scsi_to_pci_dma_dir( ++ sp->cmd->sc_data_direction)); ++ } ++ } ++} ++ ++static int qla2x00_do_dpc(void *data); ++static uint8_t qla2x00_check_for_devices_online(scsi_qla_host_t *); ++ ++static void qla2x00_rst_aen(scsi_qla_host_t *); ++static void qla2x00_done_work(void *); ++ ++static void qla2x00_process_failover(scsi_qla_host_t *); ++ ++static uint8_t qla2x00_mem_alloc(scsi_qla_host_t *); ++static void qla2x00_mem_free(scsi_qla_host_t *ha); ++uint8_t qla2x00_allocate_sp_pool( scsi_qla_host_t *ha); ++void qla2x00_free_sp_pool(scsi_qla_host_t *ha); ++ ++ ++static int apidev_init(struct Scsi_Host *); ++static int apidev_cleanup(void); ++static int apidev_open(struct inode *, struct file *); ++static int apidev_close(struct inode *, struct file *); ++static int apidev_ioctl(struct inode *, ++ struct file *, unsigned int, unsigned long arg); ++ ++/************************************************************************* ++* qla2x00_set_info ++* ++* Description: ++* Set parameters for the driver from the /proc filesystem. ++* ++* Returns: ++*************************************************************************/ ++int ++qla2x00_set_info(char *buffer, int length, struct Scsi_Host *shost) ++{ ++ return (-ENOSYS); /* Currently this is a no-op */ ++} ++ ++/************************************************************************** ++* qla2x00_detect ++* ++* Description: ++* This routine will probe for Qlogic FC SCSI host adapters. ++* It returns the number of host adapters of a particular ++* type that were found. It also initialize all data necessary for ++* the driver. It is passed-in the host number, so that it ++* knows where its first entry is in the scsi_hosts[] array. ++* ++* Input: ++* template - pointer to SCSI template ++* ++* Returns: ++* num - number of host adapters found. ++**************************************************************************/ ++int ++qla2x00_detect(Scsi_Host_Template *template) ++{ ++#if defined(MODULE) ++ DEBUG2(printk("DEBUG: qla2x00_set_info() starts at address = %p\n", ++ qla2x00_set_info)); ++ printk(KERN_INFO ++ "qla2x00_set_info() starts at address = %p\n", ++ qla2x00_set_info); ++ ++ /* ++ * If we are called as a module, the qla2100 pointer may not be null ++ * and it would point to our bootup string, just like on the lilo ++ * command line. IF not NULL, then process this config string with ++ * qla2x00_setup ++ * ++ * Boot time Options To add options at boot time add a line to your ++ * lilo.conf file like: ++ * append="qla2100=verbose,tag_info:{{32,32,32,32},{32,32,32,32}}" ++ * which will result in the first four devices on the first two ++ * controllers being set to a tagged queue depth of 32. ++ */ ++ if (ql2xopts) ++ qla2x00_setup(ql2xopts); ++ if (dummy_buffer[0] != 'P') ++ printk(KERN_WARNING ++ "qla2x00: Please read the file " ++ "/usr/src/linux/drivers/scsi/README.qla2x00\n" ++ "qla2x00: to see the proper way to specify options to " ++ "the qla2x00 module\n" ++ "qla2x00: Specifically, don't use any commas when passing " ++ "arguments to\n" ++ "qla2x00: insmod or else it might trash certain memory " ++ "areas.\n"); ++#endif ++ ++ rwlock_init(&qla_hostlist_lock); ++ INIT_LIST_HEAD(&qla_hostlist); ++ ++ pci_module_init(&qla_pci_driver); ++ ++ return (num_hosts); ++} ++ ++/************************************************************************** ++* qla2x00_register_with_Linux ++* ++* Description: ++* Free the passed in Scsi_Host memory structures prior to unloading the ++* module. ++* ++* Input: ++* ha - pointer to host adapter structure ++* maxchannels - MAX number of channels. ++* ++* Returns: ++* 0 - Sucessfully reserved resources. ++* 1 - Failed to reserved a resource. ++**************************************************************************/ ++static uint8_t ++qla2x00_register_with_Linux(scsi_qla_host_t *ha, uint8_t maxchannels) ++{ ++ struct Scsi_Host *host = ha->host; ++ ++ host->can_queue = max_srbs; /* default value:-MAX_SRBS(4096) */ ++ host->cmd_per_lun = 3; ++ host->max_cmd_len = MAX_CMDSZ; ++ ++#if defined (CONFIG_SCSIFCHOTSWAP) || defined(CONFIG_GAMAP) ++ host->hostt->get_scsi_info_from_wwn = qla2x00_get_scsi_info_from_wwn; ++ host->hostt->get_wwn_from_scsi_info = qla2x00_get_wwn_from_scsi_info; ++#endif /* CONFIG_SCSIFCHOTSWAP || CONFIG_GAMAP */ ++ ++ host->n_io_port = 0xFF; ++ ++#if MEMORY_MAPPED_IO ++ host->base = (unsigned long)ha->mmpbase; ++#else ++ host->base = 0; ++#endif ++ ++ host->max_channel = maxchannels; ++ host->max_lun = ha->max_luns; ++ host->unique_id = ha->instance; ++ host->max_id = ha->max_targets; ++ ++ /* set our host ID (need to do something about our two IDs) */ ++ host->this_id = 255; ++ ++#if defined(CONFIG_MD_MULTIHOST_FC) ++ { ++ unsigned long i; ++ unsigned long j; ++ ++ union { ++ __u64 identifier; ++ char wwn[WWN_SIZE]; ++ } foo; ++ ++ for (i = 0, j = WWN_SIZE-1; i < WWN_SIZE; i++, j--) { ++ foo.wwn[i] = ha->init_cb->port_name[j]; ++ } ++ ++ host->fc_wwn = foo.identifier; ++ } ++#endif /* CONFIG_MD_MULTIHOST_FC */ ++ ++ /* Register the I/O space with Linux */ ++ if (request_region(host->io_port, 0xff, DRIVER_NAME) == 0) { ++ printk(KERN_WARNING ++ "scsi(%ld): Failed to reserved i/o base region " ++ "0x%04lx-0x%04lx already in use\n", ++ ha->host_no, ++ host->io_port, host->io_port + 0xff); ++ return 1; ++ } ++ ++ /* Register the IRQ with Linux (sharable) */ ++ if (request_irq(host->irq, qla2x00_intr_handler, ++ SA_INTERRUPT|SA_SHIRQ, DRIVER_NAME, ha)) { ++ printk(KERN_WARNING ++ "scsi(%ld): Failed to reserve interrupt %d already in " ++ "use\n", ++ ha->host_no, host->irq); ++ release_region(host->io_port, 0xff); ++ return 1; ++ } ++ ++ /* Initialized the timer */ ++ qla2x00_start_timer(ha, qla2x00_timer, WATCH_INTERVAL); ++ ++ return 0; ++} ++ ++ ++/************************************************************************** ++* qla2x00_release ++* ++* Description: ++* Free the passed in Scsi_Host memory structures prior to unloading the ++* module. ++* ++* Input: ++* ha - pointer to host adapter structure ++* ++* Returns: ++* 0 - Always returns good status ++**************************************************************************/ ++int ++qla2x00_release(struct Scsi_Host *host) ++{ ++ scsi_qla_host_t *ha; ++ ++ if (host != NULL) { ++ ha = (scsi_qla_host_t *)host->hostdata; ++ list_del(&ha->list); ++ qla2x00_free_device(ha); ++ } ++ ++ if (list_empty(&qla_hostlist)) ++ pci_unregister_driver(&qla_pci_driver); ++ ++ return 0; ++} ++ ++/************************************************************************** ++* qla2x00_info ++* ++* Description: ++* ++* Input: ++* host - pointer to Scsi host adapter structure ++* ++* Returns: ++* Return a text string describing the driver. ++**************************************************************************/ ++const char * ++qla2x00_info(struct Scsi_Host *host) ++{ ++ static char qla2x00_buffer[255]; ++ char *bp; ++ scsi_qla_host_t *ha; ++ ++ /* ++ * We must create the api node here instead of qla2x00_detect since we ++ * want the api node to be subdirectory of /proc/scsi/qla2x00 which ++ * will not have been created when qla2x00_detect exits, but which will ++ * have been created by this point. ++ */ ++ apidev_init(host); ++ ++ bp = &qla2x00_buffer[0]; ++ ha = (scsi_qla_host_t *)host->hostdata; ++ memset(bp, 0, sizeof(qla2x00_buffer)); ++ ++ sprintf(bp, ++ "QLogic %sPCI to Fibre Channel Host Adapter: bus %d device %d " ++ "irq %d\n Firmware version: %2d.%02d.%02d, " ++ "Driver version %s\n", ++ ha->brd_info->name, ++ ha->pdev->bus->number, ++ PCI_SLOT(ha->pdev->devfn), ++ host->irq, ++ ha->fw_major_version, ++ ha->fw_minor_version, ++ ha->fw_subminor_version, ++ qla2x00_version_str); ++ ++ return bp; ++} ++ ++/************************************************************************** ++* qla2x00_queuecommand ++* ++* Description: ++* Queue a command to the controller. ++* ++* Input: ++* cmd - pointer to Scsi cmd structure ++* fn - pointer to Scsi done function ++* ++* Returns: ++* 0 - Always ++* ++* Note: ++* The mid-level driver tries to ensures that queuecommand never gets invoked ++* concurrently with itself or the interrupt handler (although the ++* interrupt handler may call this routine as part of request-completion ++* handling). ++**************************************************************************/ ++int ++qla2x00_queuecommand(Scsi_Cmnd *cmd, void (*fn)(Scsi_Cmnd *)) ++{ ++ fc_port_t *fcport; ++ os_lun_t *lq; ++ os_tgt_t *tq; ++ scsi_qla_host_t *ha, *ha2; ++ srb_t *sp; ++ struct Scsi_Host *host; ++ uint32_t b, t, l; ++#if BITS_PER_LONG <= 32 ++ uint32_t handle; ++#else ++ u_long handle; ++#endif ++ ++ ENTER(__func__); ++ ++ host = cmd->device->host; ++ ha = (scsi_qla_host_t *) host->hostdata; ++ ++ cmd->scsi_done = fn; ++ ++ spin_unlock(ha->host->host_lock); ++ ++ /* ++ * Allocate a command packet from the "sp" pool. If we cant get back ++ * one then let scsi layer come back later. ++ */ ++ if ((sp = qla2x00_get_new_sp(ha)) == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Couldn't allocate memory for sp - retried.\n", ++ ha->host_no); ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ LEAVE(__func__); ++ return (1); ++ } ++ ++ sp->cmd = cmd; ++ CMD_SP(cmd) = (void *)sp; ++ ++ sp->flags = 0; ++ if (CMD_RESID_LEN(cmd) & SRB_IOCTL) { ++ /* Need to set sp->flags */ ++ sp->flags |= SRB_IOCTL; ++ CMD_RESID_LEN(cmd) = 0; /* Clear it since no more use. */ ++ } ++ ++ sp->fo_retry_cnt = 0; ++#if defined(IOCB_THROLLE_USAGE) ++ sp->iocb_cnt = 0; ++#endif ++ ++ if (cmd->allowed < ql2xretrycount) { ++ cmd->allowed = ql2xretrycount; ++ } ++ ++ /* Generate LU queue on bus, target, LUN */ ++ b = SCSI_BUS_32(cmd); ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ ++ /* ++ * Start Command Timer. Typically it will be 2 seconds less than what ++ * is requested by the Host such that we can return the IO before ++ * aborts are called. ++ */ ++ if ((CMD_TIMEOUT(cmd)/HZ) > QLA_CMD_TIMER_DELTA) ++ qla2x00_add_timer_to_cmd(sp, ++ (CMD_TIMEOUT(cmd)/HZ) - QLA_CMD_TIMER_DELTA); ++ else ++ qla2x00_add_timer_to_cmd(sp, (CMD_TIMEOUT(cmd)/HZ)); ++ ++ if (l >= ha->max_luns) { ++ CMD_RESULT(cmd) = DID_NO_CONNECT << 16; ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ __sp_put(ha, sp); ++ LEAVE(__func__); ++ ++ return (0); ++ } ++ ++ if ((tq = (os_tgt_t *) TGT_Q(ha, t)) != NULL && ++ (lq = (os_lun_t *) LUN_Q(ha, t, l)) != NULL ) { ++ ++ fcport = lq->fclun->fcport; ++ ha2 = fcport->ha; ++ } else { ++ lq = NULL; ++ fcport = NULL; ++ ha2 = ha; ++ } ++ ++ /* Set an invalid handle until we issue the command to ISP */ ++ /* then we will set the real handle value. */ ++ handle = INVALID_HANDLE; ++ CMD_HANDLE(cmd) = (unsigned char *)handle; ++ ++ /* Bookkeeping information */ ++ sp->r_start = jiffies; /* time the request was recieved */ ++ sp->u_start = 0; ++ ++ /* Setup device queue pointers. */ ++ sp->tgt_queue = tq; ++ sp->lun_queue = lq; ++ ++ /* ++ * NOTE : q is NULL ++ * ++ * 1. When device is added from persistent binding but has not been ++ * discovered yet.The state of loopid == PORT_AVAIL. ++ * 2. When device is never found on the bus.(loopid == UNUSED) ++ * ++ * IF Device Queue is not created, or device is not in a valid state ++ * and link down error reporting is enabled, reject IO. ++ */ ++ if (fcport == NULL) { ++ DEBUG3(printk("scsi(%ld:%2d:%2d): port unavailable\n", ++ ha->host_no,t,l)); ++ ++ CMD_RESULT(cmd) = DID_NO_CONNECT << 16; ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ __sp_put(ha, sp); ++ ++ return (0); ++ } ++ ++ DEBUG5(printk("scsi(%ld:%2d:%2d): (queuecmd) queue sp = %p, " ++ "flags=0x%x fo retry=%d, pid=%ld, cmd flags= 0x%x\n", ++ ha->host_no, ++ t, l, ++ sp, sp->flags, sp->fo_retry_cnt, ++ cmd->serial_number,cmd->flags)); ++ DEBUG5(qla2x00_print_scsi_cmd(cmd)); ++ ++ sp->flags &= ~SRB_ISP_COMPLETED; ++ ++ sp->fclun = lq->fclun; ++ sp->ha = ha2; ++ ++ sp->cmd_length = CMD_CDBLEN(cmd); ++ ++ if (cmd->sc_data_direction == SCSI_DATA_UNKNOWN && ++ cmd->request_bufflen != 0) { ++ ++ DEBUG2(printk(KERN_WARNING ++ "scsi(%ld): Incorrect data direction - transfer " ++ "length=%d, direction=%d, pid=%ld, opcode=%x\n", ++ ha->host_no, ++ cmd->request_bufflen, ++ cmd->sc_data_direction, ++ cmd->serial_number, ++ cmd->cmnd[0])); ++ } ++ ++ /* Final pre-check */ ++ if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) { ++ /* ++ * Add the command to the done-queue for later failover ++ * processing ++ */ ++ CMD_RESULT(cmd) = DID_NO_CONNECT << 16; ++ add_to_done_queue(ha, sp); ++ schedule_work(&ha->run_qla_task); ++ ++ spin_lock_irq(ha->host->host_lock); ++ return (0); ++ } ++ ++ add_to_pending_queue(ha, sp); ++ ++ /* First start cmds for this lun if possible */ ++ qla2x00_next(ha); ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ LEAVE(__func__); ++ return (0); ++} ++ ++/* ++ * qla2x00_eh_wait_on_command ++ * Waits for the command to be returned by the Firmware for some ++ * max time. ++ * ++ * Input: ++ * ha = actual ha whose done queue will contain the command ++ * returned by firmware. ++ * cmd = Scsi Command to wait on. ++ * flag = Abort/Reset(Bus or Device Reset) ++ * ++ * Return: ++ * Not Found : 0 ++ * Found : 1 ++ */ ++static int ++qla2x00_eh_wait_on_command(scsi_qla_host_t *ha, Scsi_Cmnd *cmd) ++{ ++#define ABORT_WAIT_TIME 10 /* seconds */ ++#define EH_ACTIVE 1 /* Error Handler Active */ ++ ++ int found = 0; ++ int done = 0; ++ srb_t *rp; ++ struct list_head *list, *temp; ++ u_long cpu_flags = 0; ++ u_long max_wait_time = ABORT_WAIT_TIME; ++ ++ ENTER(__func__); ++ ++ do { ++ /* Check on done queue */ ++ if (!found) { ++ spin_lock_irqsave(&ha->list_lock, cpu_flags); ++ list_for_each_safe(list, temp, &ha->done_queue) { ++ rp = list_entry(list, srb_t, list); ++ ++ /* ++ * Found command. Just exit and wait for the ++ * cmd sent to OS. ++ */ ++ if (cmd == rp->cmd) { ++ found++; ++ DEBUG3(printk("%s: found in done " ++ "queue.\n", __func__);) ++ break; ++ } ++ } ++ spin_unlock_irqrestore(&ha->list_lock, cpu_flags); ++ } ++ ++ /* Checking to see if its returned to OS */ ++ rp = (srb_t *) CMD_SP(cmd); ++ if (rp == NULL ) { ++ done++; ++ break; ++ } ++ ++ spin_unlock_irq(ha->host->host_lock); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(2*HZ); ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ } while ((max_wait_time--)); ++ ++ DEBUG2(if (done)) ++ DEBUG2(printk("%s: found cmd=%p.\n", __func__, cmd);) ++ ++ LEAVE(__func__); ++ ++ return(done); ++} ++ ++/************************************************************************** ++* qla2xxx_eh_abort ++* ++* Description: ++* The abort function will abort the specified command. ++* ++* Input: ++* cmd = Linux SCSI command packet to be aborted. ++* ++* Returns: ++* Either SUCCESS or FAILED. ++* ++* Note: ++**************************************************************************/ ++int ++qla2xxx_eh_abort(Scsi_Cmnd *cmd) ++{ ++ int i; ++ int return_status = FAILED; ++ os_lun_t *q; ++ scsi_qla_host_t *ha; ++ scsi_qla_host_t *vis_ha; ++ srb_t *sp; ++ srb_t *rp; ++ struct list_head *list, *temp; ++ struct Scsi_Host *host; ++ uint8_t found = 0; ++ uint32_t b, t, l; ++ unsigned long flags; ++ ++ ++ ENTER("qla2xxx_eh_abort"); ++ ++ /* Get the SCSI request ptr */ ++ sp = (srb_t *) CMD_SP(cmd); ++ ++ /* ++ * If sp is NULL, command is already returned. ++ * sp is NULLed just before we call back scsi_done ++ * ++ */ ++ if ((sp == NULL)) { ++ /* no action - we don't have command */ ++ DEBUG(printk("qla2xxx_eh_abort: cmd already done sp=%p\n",sp);) ++ return(SUCCESS); ++ } ++ if (sp) { ++ DEBUG(printk("qla2xxx_eh_abort: refcount %i \n", ++ atomic_read(&sp->ref_count));) ++ } ++ ++ vis_ha = (scsi_qla_host_t *) cmd->device->host->hostdata; ++ vis_ha->eh_start=0; ++ if (vis_ha->flags.failover_enabled) ++ /* Get Actual HA pointer */ ++ ha = (scsi_qla_host_t *)sp->ha; ++ else ++ ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ ++ host = ha->host; ++ ++ /* Generate LU queue on bus, target, LUN */ ++ b = SCSI_BUS_32(cmd); ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ q = GET_LU_Q(vis_ha, t, l); ++ ++ /* ++ * if no LUN queue then something is very wrong!!! ++ */ ++ if (q == NULL) { ++ printk(KERN_WARNING ++ "qla2x00: (%x:%x:%x) No LUN queue.\n", b, t, l); ++ ++ /* no action - we don't have command */ ++ return(FAILED); ++ } ++ ++ DEBUG2(printk("scsi(%ld): ABORTing cmd=%p sp=%p jiffies = 0x%lx, " ++ "timeout=%x, dpc_flags=%lx, vis_ha->dpc_flags=%lx\n", ++ ha->host_no, ++ cmd, ++ sp, ++ jiffies, ++ CMD_TIMEOUT(cmd)/HZ, ++ ha->dpc_flags, ++ vis_ha->dpc_flags);) ++ DEBUG2(qla2x00_print_scsi_cmd(cmd)); ++ DEBUG2(qla2x00_print_q_info(q);) ++ ++ /* Search done queue */ ++ spin_lock_irqsave(&ha->list_lock,flags); ++ list_for_each_safe(list, temp, &ha->done_queue) { ++ rp = list_entry(list, srb_t, list); ++ ++ if (cmd != rp->cmd) ++ continue; ++ ++ /* ++ * Found command. No need to remove command from done list. ++ * Just proceed to call done. ++ */ ++ return_status = SUCCESS; ++ found++; ++ qla2x00_delete_from_done_queue(ha, sp); ++ ++ break; ++ } /* list_for_each_safe() */ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ ++ /* ++ * Return immediately if the aborted command was already in the done ++ * queue ++ */ ++ if (found) { ++ printk(KERN_INFO "qla2xxx_eh_abort: Returning completed " ++ "command=%p sp=%p\n", cmd, sp); ++ __sp_put(ha, sp); ++ return (return_status); ++ } ++ ++ ++ /* ++ * See if this command is in the retry queue ++ */ ++ if (!found) { ++ DEBUG3(printk("qla2xxx_eh_abort: searching sp %p " ++ "in retry queue.\n", sp);) ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ list_for_each_safe(list, temp, &ha->retry_queue) { ++ rp = list_entry(list, srb_t, list); ++ ++ if (cmd != rp->cmd) ++ continue; ++ ++ ++ DEBUG2(printk("qla2xxx_eh_abort: found " ++ "in retry queue. SP=%p\n", sp);) ++ ++ __del_from_retry_queue(ha, rp); ++ CMD_RESULT(rp->cmd) = DID_ABORT << 16; ++ __add_to_done_queue(ha, rp); ++ ++ return_status = SUCCESS; ++ found++; ++ ++ break; ++ ++ } /* list_for_each_safe() */ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ } ++ ++ /* ++ * Search failover queue ++ */ ++ if (ha->flags.failover_enabled) { ++ if (!found) { ++ DEBUG3(printk("qla2xxx_eh_abort: searching sp %p " ++ "in failover queue.\n", sp);) ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ list_for_each_safe(list, temp, &ha->failover_queue) { ++ rp = list_entry(list, srb_t, list); ++ ++ if (cmd != rp->cmd) ++ continue; ++ ++ DEBUG2(printk(KERN_WARNING ++ "qla2xxx_eh_abort: found " ++ "in failover queue. SP=%p\n", ++ sp);) ++ ++ /* Remove srb from failover queue. */ ++ __del_from_failover_queue(ha, rp); ++ CMD_RESULT(rp->cmd) = DID_ABORT << 16; ++ __add_to_done_queue(ha, rp); ++ ++ return_status = SUCCESS; ++ found++; ++ ++ break; ++ ++ } /* list_for_each_safe() */ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ } /*End of if !found */ ++ } ++ ++ /* ++ * Our SP pointer points at the command we want to remove from the ++ * pending queue providing we haven't already sent it to the adapter. ++ */ ++ if (!found) { ++ DEBUG3(printk("qla2xxx_eh_abort: searching sp %p " ++ "in pending queue.\n", sp);) ++ ++ spin_lock_irqsave(&vis_ha->list_lock, flags); ++ list_for_each_safe(list, temp, &vis_ha->pending_queue) { ++ rp = list_entry(list, srb_t, list); ++ if (rp->cmd != cmd) ++ continue; ++ ++ /* Remove srb from LUN queue. */ ++ rp->flags |= SRB_ABORTED; ++ ++ DEBUG2(printk("qla2xxx_eh_abort: Cmd in pending queue." ++ " serial_number %ld.\n", ++ sp->cmd->serial_number);) ++ ++ __del_from_pending_queue(vis_ha, rp); ++ CMD_RESULT(cmd) = DID_ABORT << 16; ++ ++ __add_to_done_queue(vis_ha, rp); ++ ++ return_status = SUCCESS; ++ ++ found++; ++ break; ++ } /* list_for_each_safe() */ ++ spin_unlock_irqrestore(&vis_ha->list_lock, flags); ++ } /*End of if !found */ ++ ++ if (!found) { /* find the command in our active list */ ++ DEBUG3(printk("qla2xxx_eh_abort: searching sp %p " ++ "in outstanding queue.\n", sp);) ++ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) { ++ sp = ha->outstanding_cmds[i]; ++ ++ if (sp == NULL) ++ continue; ++ ++ if (sp->cmd != cmd) ++ continue; ++ ++ ++ DEBUG2(printk("qla2xxx_eh_abort(%ld): aborting sp %p " ++ "from RISC. pid=%d sp->state=%x\n", ++ ha->host_no, ++ sp, ++ (int)sp->cmd->serial_number, ++ sp->state);) ++ DEBUG(qla2x00_print_scsi_cmd(cmd);) ++ DEBUG(qla2x00_print_q_info(q);) ++ ++ /* Get a reference to the sp and drop the lock.*/ ++ sp_get(ha,sp); ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ spin_unlock(ha->host->host_lock); ++ ++ if (qla2x00_abort_command(ha, sp)) { ++ DEBUG2(printk("qla2xxx_eh_abort: abort_command " ++ "mbx failed.\n");) ++ return_status = FAILED; ++ } else { ++ DEBUG3(printk("qla2xxx_eh_abort: abort_command " ++ " mbx success.\n");) ++ return_status = SUCCESS; ++ } ++ ++ sp_put(ha,sp); ++ ++ spin_lock_irq(ha->host->host_lock); ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ ++ /* ++ * Regardless of mailbox command status, go check on ++ * done queue just in case the sp is already done. ++ */ ++ break; ++ ++ }/*End of for loop */ ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ } /*End of if !found */ ++ ++ /*Waiting for our command in done_queue to be returned to OS.*/ ++ if (qla2x00_eh_wait_on_command(ha, cmd) != 0) { ++ DEBUG2(printk("qla2xxx_eh_abort: cmd returned back to OS.\n");) ++ return_status = SUCCESS; ++ } ++ ++ if (return_status == FAILED) { ++ printk(KERN_INFO "qla2xxx_eh_abort Exiting: status=Failed\n"); ++ return FAILED; ++ } ++ ++ DEBUG(printk("qla2xxx_eh_abort: Exiting. return_status=0x%x.\n", ++ return_status)); ++ ++ LEAVE("qla2xxx_eh_abort"); ++ ++ return(return_status); ++} ++ ++/************************************************************************** ++* qla2x00_eh_wait_for_pending_target_commands ++* ++* Description: ++* Waits for all the commands to come back from the specified target. ++* ++* Input: ++* ha - pointer to scsi_qla_host structure. ++* t - target ++* Returns: ++* Either SUCCESS or FAILED. ++* ++* Note: ++**************************************************************************/ ++int ++qla2x00_eh_wait_for_pending_target_commands(scsi_qla_host_t *ha, int t) ++{ ++ int cnt; ++ int status; ++ unsigned long flags; ++ srb_t *sp; ++ Scsi_Cmnd *cmd; ++ ++ status = 0; ++ ++ /* ++ * Waiting for all commands for the designated target in the active ++ * array ++ */ ++ for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ sp = ha->outstanding_cmds[cnt]; ++ if (sp) { ++ cmd = sp->cmd; ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ if (SCSI_TCN_32(cmd) == t) { ++ qla2x00_eh_wait_on_command(ha, cmd); ++ } ++ } ++ else { ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ } ++ } ++ return (status); ++} ++ ++ ++/************************************************************************** ++* qla2xxx_eh_device_reset ++* ++* Description: ++* The device reset function will reset the target and abort any ++* executing commands. ++* ++* NOTE: The use of SP is undefined within this context. Do *NOT* ++* attempt to use this value, even if you determine it is ++* non-null. ++* ++* Input: ++* cmd = Linux SCSI command packet of the command that cause the ++* bus device reset. ++* ++* Returns: ++* SUCCESS/FAILURE (defined as macro in scsi.h). ++* ++**************************************************************************/ ++int ++qla2xxx_eh_device_reset(Scsi_Cmnd *cmd) ++{ ++ int return_status = SUCCESS; ++ uint32_t b, t, l; ++ scsi_qla_host_t *ha; ++ ++#if defined(LOGOUT_AFTER_DEVICE_RESET) ++ os_lun_t *lq; ++ fc_port_t *fcport; ++#endif ++ ++ ENTER(__func__); ++ ++ if (cmd == NULL) { ++ printk(KERN_INFO ++ "%s(): **** SCSI mid-layer passing in NULL cmd\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ /* Verify the device exists. */ ++ ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ ha->eh_start = 0; ++ b = SCSI_BUS_32(cmd); ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ if (TGT_Q(ha, t) == NULL) { ++ printk(KERN_INFO ++ "%s(): **** CMD derives a NULL TGT_Q\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ ++#if STOP_ON_RESET ++ printk(debug_buff,"Resetting Device= 0x%x\n", (int)cmd); ++/* WE SHOULD NOT call this function, since it dereferences SP */ ++ //qla2x00_print_scsi_cmd(cmd); ++ qla2x00_panic(__func__, ha->host); ++#endif ++ ++ if (qla2x00_verbose) ++ printk(KERN_INFO ++ "scsi(%ld:%d:%d:%d): DEVICE RESET ISSUED.\n", ++ ha->host_no, (int)b, (int)t, (int)l); ++ ++ DEBUG2(printk("scsi(%ld): DEVICE_RESET cmd=%p jiffies = 0x%lx, " ++ "timeout=%x, dpc_flags=%lx, status=%x allowed=%d " ++ "cmd.state=%x\n", ++ ha->host_no, ++ cmd, ++ jiffies, ++ CMD_TIMEOUT(cmd)/HZ, ++ ha->dpc_flags, ++ cmd->result, ++ cmd->allowed, ++ cmd->state);) ++/* WE SHOULD NOT call this function, since it dereferences SP */ ++ //qla2x00_print_scsi_cmd(cmd); ++ ++ if (!((test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ (test_bit(LOOP_RESET_NEEDED, &ha->dpc_flags)) || ++ (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) || ++ (!atomic_read(&ha->loop_down_timer) && ++ ha->loop_state == LOOP_DOWN)|| ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ ha->loop_state != LOOP_READY)) { ++ ++ clear_bit(DEVICE_RESET_NEEDED, &ha->dpc_flags); ++ ++ spin_unlock_irq(ha->host->host_lock); ++ ++ if (qla2x00_device_reset(ha, t, l) != 0) { ++ return_status = FAILED; ++ } ++ ++#if defined(LOGOUT_AFTER_DEVICE_RESET) ++ if (return_status == SUCCESS) { ++ lq = (os_lun_t *)LUN_Q(ha, t, l); ++ fcport = lq->fclun->fcport; ++ ++ if (fcport->flags & FC_FABRIC_DEVICE) { ++ qla2x00_fabric_logout(ha, ++ ha->fc_db[t].loop_id & 0xff); ++ ha->fc_db[t].flag |= DEV_RELOGIN; ++ qla2x00_mark_device_lost(ha, fcport); ++ } ++ } ++#endif ++ ++ spin_lock_irq(ha->host->host_lock); ++ } else { ++ /* ++ * Wait a while for the loop to come back. Return SUCCESS ++ * for the kernel to try again. ++ */ ++ spin_unlock_irq(ha->host->host_lock); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(5 * HZ); ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ return_status = SUCCESS; ++ } ++ ++ if (return_status == FAILED) { ++ DEBUG2(printk("%s() Exiting: Reset Failed\n", __func__);) ++ return (FAILED); ++ } ++ ++ /* Waiting for all commands to complete for the device */ ++ if (qla2x00_eh_wait_for_pending_target_commands(ha, t)) ++ return_status = FAILED; ++ ++ if (return_status == FAILED) { ++ printk(KERN_INFO "%s() Exiting: status = Failed\n", __func__); ++ return (FAILED); ++ } ++ ++ LEAVE(__func__); ++ ++ return (return_status); ++} ++ ++/************************************************************************** ++* qla2x00_eh_wait_for_pending_commands ++* ++* Description: ++* Waits for all the commands to come back from the specified host. ++* ++* Input: ++* ha - pointer to scsi_qla_host structure. ++* ++* Returns: ++* 1 : SUCCESS ++* 0 : FAILED ++* ++* Note: ++**************************************************************************/ ++int ++qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *ha) ++{ ++ int cnt; ++ int status; ++ unsigned long flags; ++ srb_t *sp; ++ Scsi_Cmnd *cmd; ++ ++ status = 1; ++ ++ /* ++ * Waiting for all commands for the designated target in the active ++ * array ++ */ ++ for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ sp = ha->outstanding_cmds[cnt]; ++ if (sp) { ++ cmd = sp->cmd; ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ status = qla2x00_eh_wait_on_command(ha, cmd); ++ } ++ else { ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ } ++ } ++ return (status); ++} ++ ++ ++/************************************************************************** ++* qla2xxx_eh_bus_reset ++* ++* Description: ++* The bus reset function will reset the bus and abort any executing ++* commands. ++* ++* Input: ++* cmd = Linux SCSI command packet of the command that cause the ++* bus reset. ++* ++* Returns: ++* SUCCESS/FAILURE (defined as macro in scsi.h). ++* ++**************************************************************************/ ++int ++qla2xxx_eh_bus_reset(Scsi_Cmnd *cmd) ++{ ++ int return_status = SUCCESS; ++ uint32_t b, t, l; ++ srb_t *sp; ++ int found; ++ struct list_head *hal; ++ scsi_qla_host_t *ha, *search_ha; ++ ++ ++ ENTER("qla2xxx_eh_bus_reset"); ++ ++ if (cmd == NULL) { ++ printk(KERN_INFO ++ "%s(): **** SCSI mid-layer passing in NULL cmd\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ b = SCSI_BUS_32(cmd); ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ ++ ha = (scsi_qla_host_t *) cmd->device->host->hostdata; ++ ha->eh_start=0; ++ sp = (srb_t *) CMD_SP(cmd); ++ ++ if (ha == NULL) { ++ printk(KERN_INFO ++ "%s(): **** CMD derives a NULL HA\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ found = 0; ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ search_ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (search_ha == ha) { ++ found ++; ++ break; ++ } ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ if (!found) { ++ printk(KERN_INFO ++ "%s(): **** CMD derives a NULL search HA\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++#if STOP_ON_RESET ++ printk("Resetting the Bus= 0x%x\n", (int)cmd); ++ qla2x00_print_scsi_cmd(cmd); ++ qla2x00_panic("qla2100_reset", ha->host); ++#endif ++ ++ if (qla2x00_verbose) ++ printk(KERN_INFO ++ "scsi(%ld:%d:%d:%d): LOOP RESET ISSUED.\n", ++ ha->host_no, (int)b, (int)t, (int)l); ++ ++ if (!((test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ (test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) || ++ (!atomic_read(&ha->loop_down_timer) && ++ ha->loop_state == LOOP_DOWN)|| ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ ha->loop_state != LOOP_READY)) { ++ ++ clear_bit(LOOP_RESET_NEEDED, &ha->dpc_flags); ++ spin_unlock_irq(ha->host->host_lock); ++ ++ if (qla2x00_loop_reset(ha) != 0) { ++ return_status = FAILED; ++ } ++ spin_lock_irq(ha->host->host_lock); ++ } else { ++ /* ++ * Wait a while for the loop to come back. Return SUCCESS ++ * for the kernel to try again. ++ */ ++ spin_unlock_irq(ha->host->host_lock); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(5 * HZ); ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ return_status = SUCCESS; ++ } ++ ++ if (return_status == FAILED) { ++ DEBUG2(printk("qla2xxx_eh_bus_reset Exiting: Reset Failed\n");) ++ printk("qla2xxx_eh_bus_reset Exiting: Reset Failed\n"); ++ return FAILED; ++ } ++ ++ /* Blocking Call. It goes to sleep waiting for cmd to get to done q */ ++ /* Waiting for our command in done_queue to be returned to OS.*/ ++ ++ if ( qla2x00_eh_wait_for_pending_commands(ha) == 0) { ++ return_status = FAILED; ++ } ++ ++ if(return_status == FAILED) { ++ printk(KERN_INFO "qla2xxx_eh_bus_reset Exiting: status=Failed\n"); ++ return FAILED; ++ } else ++ printk(KERN_INFO "qla2xxx_eh_bus_reset Exiting: status=SUCCESS\n"); ++ ++ LEAVE("qla2xxx_eh_bus_reset"); ++ ++ return (return_status); ++} ++ ++/************************************************************************** ++* qla2xxx_eh_host_reset ++* ++* Description: ++* The reset function will reset the Adapter. ++* ++* Input: ++* cmd = Linux SCSI command packet of the command that cause the ++* adapter reset. ++* ++* Returns: ++* Either SUCCESS or FAILED. ++* ++* Note: ++**************************************************************************/ ++int ++qla2xxx_eh_host_reset(Scsi_Cmnd *cmd) ++{ ++ int return_status = SUCCESS; ++ srb_t *sp; ++ uint32_t b, t, l; ++ int found; ++ struct list_head *hal; ++ scsi_qla_host_t *ha, *search_ha; ++ ++ ENTER("qla2xxx_eh_host_reset"); ++ ++ if (cmd == NULL) { ++ printk(KERN_INFO ++ "%s(): **** SCSI mid-layer passing in NULL cmd\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ ha->eh_start= 0; ++ /* Find actual ha */ ++ sp = (srb_t *)CMD_SP(cmd); ++ if (ha->flags.failover_enabled && sp != NULL) ++ ha = sp->ha; ++ else ++ ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ ++ if (ha == NULL) { ++ printk(KERN_INFO ++ "%s(): **** CMD derives a NULL HA\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ found = 0; ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ search_ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (search_ha == ha) { ++ found ++; ++ break; ++ } ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ if (!found) { ++ printk(KERN_INFO ++ "%s(): **** CMD derives a NULL search HA\n", ++ __func__); ++ DEBUG2(BUG();) ++ ++ return (FAILED); ++ } ++ ++ /* Display which one we're actually resetting for debug. */ ++ DEBUG(printk("qla2xxx_eh_host_reset: entered for scsi%ld. " ++ "Resetting host_no %ld.\n", ++ ((scsi_qla_host_t *)cmd->device->host->hostdata)->host_no, ++ ha->host_no)); ++ ++#if STOP_ON_RESET ++ printk("Host Reset... Command=\n"); ++ qla2x00_print_scsi_cmd(cmd); ++ qla2x00_panic("qla2xxx_eh_host_reset", ha->host); ++#endif ++ ++ /* ++ * Now issue reset. ++ */ ++ b = SCSI_BUS_32(cmd); ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ ++ if (qla2x00_verbose) { ++ printk(KERN_INFO ++ "scsi(%ld:%d:%d:%d): now issue ADAPTER RESET.\n", ++ ((scsi_qla_host_t *)cmd->device->host->hostdata)->host_no, ++ (int)b, ++ (int)t, ++ (int)l); ++ } ++ ++ DEBUG2(printk(KERN_INFO ++ "scsi(%ld:%d:%d:%d): now issue ADAPTER RESET.\n", ++ ((scsi_qla_host_t *)cmd->device->host->hostdata)->host_no, ++ (int)b, (int)t, (int)l)); ++ ++ if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) { ++ set_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); ++ ++ spin_unlock_irq(ha->host->host_lock); ++ ++ if (qla2x00_abort_isp(ha, 1)) { ++ /* failed. try later */ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ return_status = FAILED; ++ ++ DEBUG2(printk(KERN_WARNING ++ "scsi(%ld:%d:%d:%d): ha %ld ADAPTER RESET " ++ "failed. Scheduled retry later.\n", ++ ((scsi_qla_host_t *)cmd->device->host->hostdata)->host_no, ++ (int)b, (int)t, (int)l, ha->host_no);) ++ } else { ++ return_status = SUCCESS; ++ } ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); ++ } else { ++ /* ++ * Already active. Sleep a while then return SUCCESS for kernel ++ * to retry the IO. ++ */ ++ spin_unlock_irq(ha->host->host_lock); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(5 * HZ); ++ ++ spin_lock_irq(ha->host->host_lock); ++ ++ return_status = SUCCESS; ++ } ++ if ( return_status == FAILED) { ++ DEBUG2(printk("qla2xxx_eh_host_reset Exiting: Reset Failed\n");) ++ return FAILED; ++ } ++ ++ /* Waiting for our command in done_queue to be returned to OS.*/ ++ if ( qla2x00_eh_wait_for_pending_commands(ha) == 0) { ++ return_status = FAILED; ++ } ++ ++ if(return_status == FAILED) { ++ printk(KERN_INFO "qla2xxx_eh_host_reset Exiting: status=Failed\n"); ++ return FAILED; ++ } else ++ printk(KERN_INFO "qla2xxx_eh_host_reset Exiting: status=SUCCESS\n"); ++ ++ LEAVE("qla2xxx_eh_host_reset"); ++ ++ return(return_status); ++} ++ ++ ++/* ++* qla2x00_loop_reset ++* Issue loop reset. ++* ++* Input: ++* ha = adapter block pointer. ++* ++* Returns: ++* 0 = success ++*/ ++static uint8_t ++qla2x00_loop_reset(scsi_qla_host_t *ha) ++{ ++ uint8_t status = QL_STATUS_SUCCESS; ++ uint16_t t; ++ os_tgt_t *tq; ++ ++ ENTER(__func__); ++ ++ if (ha->flags.enable_lip_reset) { ++ status = qla2x00_lip_reset(ha); ++ } ++ ++ if (status == QL_STATUS_SUCCESS && ha->flags.enable_target_reset) { ++ for (t = 0; t < MAX_FIBRE_DEVICES; t++) { ++ if ((tq = TGT_Q(ha, t)) == NULL) ++ continue; ++ ++ if (tq->vis_port == NULL) ++ continue; ++ ++ status = qla2x00_target_reset(ha, 0, t); ++ if (status != QL_STATUS_SUCCESS) { ++ break; ++ } ++ } ++ } ++ ++ if (status == QL_STATUS_SUCCESS && ++ ((!ha->flags.enable_target_reset && ++ !ha->flags.enable_lip_reset) || ++ ha->flags.enable_lip_full_login)) { ++ ++ status = qla2x00_full_login_lip(ha); ++ } ++ ++ /* Issue marker command only when we are going to start the I/O */ ++ ha->marker_needed = 1; ++ ++ if (status) { ++ /* Empty */ ++ DEBUG2_3(printk("%s(%ld): **** FAILED ****\n", ++ __func__, ++ ha->host_no);) ++ } else { ++ /* Empty */ ++ DEBUG3(printk("%s(%ld): exiting normally.\n", ++ __func__, ++ ha->host_no);) ++ } ++ ++ LEAVE(__func__); ++ ++ return(status); ++} ++ ++/* ++ * qla2x00_device_reset ++ * Issue bus device reset message to the target. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * t = SCSI ID. ++ * TARGET_QUEUE_LOCK must be released. ++ * ADAPTER_STATE_LOCK must be released. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_device_reset(scsi_qla_host_t *vis_ha, uint16_t tgt, uint16_t lun) ++{ ++#if !USE_ABORT_TGT ++ uint16_t l; ++ fc_port_t *fcport; ++#endif ++ os_lun_t *lq; ++ uint8_t status = 0; ++ ++ ENTER(__func__); ++ ++#if USE_ABORT_TGT ++ /* Abort Target command will clear Reservation */ ++ lq = GET_LU_Q(vis_ha, tgt, lun); ++ if (lq && lq->fclun) ++ status = qla2x00_abort_target(lq->fclun->fcport); ++#else ++ /* Abort Device command will not clear Reservation */ ++ for (l = 0; l < MAX_LUNS; l++) { ++ lq = GET_LU_Q(vis_ha, tgt, l); ++ if (lq == NULL) ++ continue; ++ ++ fcport = lq->fclun->fcport; ++ if (LOOP_RDY(fcport->ha)) { ++ qla2x00_abort_device(fcport->ha, ++ fcport->loop_id, ++ lq->fclun->lun); ++ } ++ } ++#endif ++ ++ LEAVE(__func__); ++ ++ return( status ); ++} ++ ++/************************************************************************** ++* qla1200_biosparam ++* ++* Description: ++* Return the disk geometry for the given SCSI device. ++**************************************************************************/ ++int ++qla2x00_biosparam(struct scsi_device *sdev, ++ struct block_device *bdev, sector_t capacity, int geom[]) ++{ ++ int heads, sectors, cylinders; ++ ++ heads = 64; ++ sectors = 32; ++ cylinders = (unsigned long)capacity / (heads * sectors); ++ if (cylinders > 1024) { ++ heads = 255; ++ sectors = 63; ++ cylinders = (unsigned long)capacity / (heads * sectors); ++ } ++ ++ geom[0] = heads; ++ geom[1] = sectors; ++ geom[2] = cylinders; ++ ++ return (0); ++} ++ ++/************************************************************************** ++ * qla2x00_slave_configure ++ * Determines the queue depth for a given device. There are two ways ++ * a queue depth can be obtained for a tagged queueing device. One ++ * way is the default queue depth which is determined by whether ++ * If it is defined, then it is used ++ * as the default queue depth. Otherwise, we use either 4 or 8 as the ++ * default queue depth (dependent on the number of hardware SCBs). ++ **************************************************************************/ ++int ++qla2xxx_slave_configure(Scsi_Device * device) ++{ ++ int queue_depth = 64; ++ ++ if (device->tagged_supported) { ++#if defined(MODULE) ++ if (!(ql2xmaxqdepth == 0 || ql2xmaxqdepth > 256)) ++ queue_depth = ql2xmaxqdepth; ++#endif ++ ql2xmaxqdepth = queue_depth; ++ ++ scsi_adjust_queue_depth(device, MSG_ORDERED_TAG, queue_depth); ++ ++ printk(KERN_INFO ++ "scsi(%d:%d:%d:%d): Enabled tagged queuing, queue " ++ "depth %d.\n", ++ device->host->host_no, ++ device->channel, device->id, device->lun, ++ device->queue_depth); ++ } else { ++ scsi_adjust_queue_depth(device, 0 /* TCQ off */, ++ device->host->hostt->cmd_per_lun /* 3 */); ++ } ++ ++ return (0); ++} ++ ++/* ++ * PCI driver interface ++ */ ++static int __devinit ++qla_probe_device(struct pci_dev *pdev, const struct pci_device_id *ent) ++{ ++ device_reg_t *reg; ++ struct Scsi_Host *host; ++ scsi_qla_host_t *ha; ++ unsigned long flags = 0; ++ unsigned long wait_switch = 0; ++ ++ if (pci_enable_device(pdev)) ++ return -1; ++ ++ printk(KERN_INFO ++ "qla2x00: Found VID=%x DID=%x SSVID=%x SSDID=%x\n", ++ pdev->vendor, pdev->device, ++ pdev->subsystem_vendor, pdev->subsystem_device); ++ ++ if (ql2xfailover) { ++ sprintf(qla2x00_version_str, "%s-fo", QLA2100_VERSION); ++ } else { ++ sprintf(qla2x00_version_str, "%s", QLA2100_VERSION); ++ } ++ ++ host = scsi_register(&qla2x00_driver_template, sizeof(scsi_qla_host_t)); ++ if (host == NULL) { ++ printk(KERN_WARNING ++ "qla2x00: Couldn't register with scsi layer!\n"); ++ return -1; ++ } ++ ++ /* Clear our data area */ ++ ha = (scsi_qla_host_t *)host->hostdata; ++ memset(ha, 0, sizeof(scsi_qla_host_t)); ++ ++ ha->host_no = host->host_no; ++ ha->host = host; ++ ++ /* Sanitize the information from PCI BIOS. */ ++ host->irq = pdev->irq; ++ host->io_port = pci_resource_start(pdev, 0); ++ ha->pdev = pdev; ++ scsi_set_device(host, &pdev->dev); ++ ++ ha->brd_info = (struct qla_board_info *)ent->driver_data; ++ ++ if (qla2x00_verbose) { ++ printk(KERN_INFO ++ "scsi(%d): Found a %s @ bus %d, device 0x%x, irq %d, " ++ "iobase 0x%lx\n", ++ host->host_no, ++ ha->brd_info->name, ++ ha->pdev->bus->number, ++ PCI_SLOT(ha->pdev->devfn), ++ host->irq, host->io_port); ++ } ++ ++ ha->iobase = (device_reg_t *) host->io_port; ++ ++ spin_lock_init(&ha->hardware_lock); ++ ++ /* 4.23 Initialize /proc/scsi/qla2x00 counters */ ++ ha->actthreads = 0; ++ ha->qthreads = 0; ++ ha->dump_done = 0; ++ ha->total_isr_cnt = 0; ++ ha->total_isp_aborts = 0; ++ ha->total_lip_cnt = 0; ++ ha->total_dev_errs = 0; ++ ha->total_ios = 0; ++ ha->total_bytes = 0; ++ ++ if (qla2x00_mem_alloc(ha)) { ++ printk(KERN_WARNING ++ "scsi(%d): [ERROR] Failed to allocate memory for adapter\n", ++ host->host_no); ++ ++ qla2x00_mem_free(ha); ++ ++ scsi_unregister(host); ++ ++ return -1; ++ } ++ ++ ha->prev_topology = 0; ++ ha->ports = MAX_BUSES; ++ ++#if defined(ISP2100) ++ ha->max_targets = MAX_TARGETS_2100; ++#else ++ ha->max_targets = MAX_TARGETS_2200; ++#endif ++ ++ /* load the F/W, read paramaters, and init the H/W */ ++ ha->instance = num_hosts; ++ ++ init_MUTEX_LOCKED(&ha->mbx_intr_sem); ++ ++ INIT_LIST_HEAD(&ha->list); ++ INIT_LIST_HEAD(&ha->fcports); ++ INIT_LIST_HEAD(&ha->fcinitiators); ++ INIT_LIST_HEAD(&ha->done_queue); ++ INIT_LIST_HEAD(&ha->retry_queue); ++ INIT_LIST_HEAD(&ha->scsi_retry_queue); ++ INIT_LIST_HEAD(&ha->failover_queue); ++ INIT_LIST_HEAD(&ha->pending_queue); ++ ++ if (ql2xfailover) ++ ha->flags.failover_enabled = 1; ++ else ++ ha->flags.failover_enabled = 0; ++ ++ INIT_WORK(&ha->run_qla_task, qla2x00_done_work, (void *) ha); ++ ++ /* ++ * These locks are used to prevent more than one CPU ++ * from modifying the queue at the same time. The ++ * higher level "io_request_lock" will reduce most ++ * contention for these locks. ++ */ ++ spin_lock_init(&ha->mbx_bits_lock); ++ spin_lock_init(&ha->mbx_reg_lock); ++ spin_lock_init(&ha->mbx_q_lock); ++ spin_lock_init(&ha->list_lock); ++ ++ if (qla2x00_initialize_adapter(ha) && ++ !(ha->device_flags & DFLG_NO_CABLE)) { ++ ++ printk(KERN_WARNING ++ "scsi(%ld): Failed to initialize adapter\n", ha->host_no); ++ ++ DEBUG2(printk("scsi(%ld): Failed to initialize adapter - " ++ "Adapter flags %x.\n", ++ ha->host_no, ha->device_flags)); ++ ++ qla2x00_mem_free(ha); ++ ++ scsi_unregister(host); ++ ++ return -1; ++ } ++ ++ /* ++ * Startup the kernel thread for this host adapter ++ */ ++ init_completion(&ha->dpc_inited); ++ init_completion(&ha->dpc_exited); ++ ++ ha->dpc_should_die = 0; ++ ha->dpc_pid = kernel_thread(qla2x00_do_dpc, ha, 0); ++ if (ha->dpc_pid < 0) { ++ printk(KERN_WARNING ++ "scsi(%ld): Unable to start DPC thread!\n", ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ ++ scsi_unregister(host); ++ ++ return -1; ++ } ++ wait_for_completion(&ha->dpc_inited); ++ ++ /* Mark preallocated Loop IDs in use. */ ++ ha->fabricid[SNS_FL_PORT].in_use = TRUE; ++ ha->fabricid[FABRIC_CONTROLLER].in_use = TRUE; ++ ha->fabricid[SIMPLE_NAME_SERVER].in_use = TRUE; ++ ++ /* Register our resources with Linux */ ++ if (qla2x00_register_with_Linux(ha, ha->ports - 1)) { ++ printk(KERN_WARNING ++ "scsi(%ld): Failed to register resources.\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ ++ scsi_unregister(host); ++ ++ return -1; ++ } ++ ++ DEBUG2(printk("DEBUG: detect hba %ld at address = %p\n", ++ ha->host_no, ha)); ++ ++ reg = ha->iobase; ++ ++ /* Disable ISP interrupts. */ ++ qla2x00_disable_intrs(ha); ++ ++ /* Ensure mailbox registers are free. */ ++ spin_lock_irqsave(&ha->hardware_lock, flags); ++ WRT_REG_WORD(®->semaphore, 0); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); ++ WRT_REG_WORD(®->hccr, HCCR_CLR_HOST_INT); ++ ++ /* Enable proper parity */ ++#if defined(ISP2300) ++ if (ha->pdev->device == QLA2312_DEVICE_ID || ++ ha->pdev->device == QLA2322_DEVICE_ID) ++ /* SRAM, Instruction RAM and GP RAM parity */ ++ WRT_REG_WORD(®->hccr, (HCCR_ENABLE_PARITY + 0x7)); ++ else ++ /* SRAM parity */ ++ WRT_REG_WORD(®->hccr, (HCCR_ENABLE_PARITY + 0x1)); ++#endif ++ spin_unlock_irqrestore(&ha->hardware_lock, flags); ++ ++ /* ++ * if failover is enabled read the user configuration ++ */ ++ if (ha->flags.failover_enabled) { ++ if (ConfigRequired > 0) ++ mp_config_required = 1; ++ else ++ mp_config_required = 0; ++ ++ DEBUG(printk("qla2x00_detect: qla2x00_cfg_init for hba %ld\n", ++ ha->instance)); ++ ++ qla2x00_cfg_init(ha); ++ } ++ ++ /* Enable chip interrupts. */ ++ qla2x00_enable_intrs(ha); ++ ++ /* Insert new entry into the list of adapters */ ++ write_lock(&qla_hostlist_lock); ++ list_add_tail(&ha->list, &qla_hostlist); ++ write_unlock(&qla_hostlist_lock); ++ ++ /* v2.19.5b6 */ ++ /* ++ * Wait around max loop_reset_delay secs for the devices to come ++ * on-line. We don't want Linux scanning before we are ready. ++ * ++ */ ++ for (wait_switch = jiffies + (ha->loop_reset_delay * HZ); ++ time_before(jiffies,wait_switch) && ++ !(ha->device_flags & (DFLG_NO_CABLE | DFLG_FABRIC_DEVICES)) ++ && (ha->device_flags & SWITCH_FOUND) ;) { ++ ++ qla2x00_check_fabric_devices(ha); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(5); ++ } ++ ++ /* List the target we have found */ ++ if (displayConfig && (!ha->flags.failover_enabled)) ++ qla2x00_display_fc_names(ha); ++ ++ pci_set_drvdata(pdev, ha); ++ ha->init_done = 1; ++ num_hosts++; ++ ++ if (displayConfig && ha->flags.failover_enabled) ++ qla2x00_cfg_display_devices(); ++ ++ return 0; ++} ++ ++static void __devexit ++qla_remove_device(struct pci_dev *pdev) ++{ ++ struct list_head *hal, *temp; ++ scsi_qla_host_t *ha, *iter_ha; ++ ++ ha = pci_get_drvdata(pdev); ++ ++ /* Sanity check -- make sure the entry is in our list */ ++ write_lock(&qla_hostlist_lock); ++ list_for_each_safe(hal, temp, &qla_hostlist) { ++ iter_ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (iter_ha == ha) { ++ list_del(&ha->list); ++ qla2x00_free_device(ha); ++ break; ++ } ++ } ++ write_unlock(&qla_hostlist_lock); ++} ++ ++static void ++qla2x00_free_device(scsi_qla_host_t *ha) ++{ ++ int ret; ++ struct Scsi_Host *host; ++ ++ host = ha->host; ++ ++ /* turn-off interrupts on the card */ ++ if (ha->interrupts_on) ++ qla2x00_disable_intrs(ha); ++ ++ /* Detach interrupts */ ++ if (host->irq) ++ free_irq(host->irq, ha); ++ ++ /* release io space registers */ ++ if (host->io_port) ++ release_region(host->io_port, 0xff); ++ ++ /* Disable timer */ ++ if (ha->timer_active) ++ qla2x00_stop_timer(ha); ++ ++ /* Kill the kernel thread for this host */ ++ if (ha->dpc_pid >= 0) { ++ ha->dpc_should_die = 1; ++ wmb(); ++ ret = kill_proc(ha->dpc_pid, SIGTERM, 1); ++ if (ret) { ++ printk(KERN_ERR ++ "scsi(%ld): Unable to signal DPC thread -- (%d)\n", ++ ha->host_no, ret); ++ ++ /* TODO: SOMETHING MORE??? */ ++ } else { ++ wait_for_completion(&ha->dpc_exited); ++ } ++ } ++ ++#if MEMORY_MAPPED_IO ++ if (ha->mmpbase) { ++ iounmap((void *) (((unsigned long) ha->mmpbase) & PAGE_MASK)); ++ } ++#endif ++ ++ apidev_cleanup(); ++ ++ qla2x00_mem_free(ha); ++ ++ if (ha->flags.failover_enabled) ++ qla2x00_cfg_mem_free(ha); ++ ++ ha->flags.online = FALSE; ++ ++ scsi_unregister(host); ++} ++ ++ ++/* ++ * The following support functions are adopted to handle ++ * the re-entrant qla2x00_proc_info correctly. ++ */ ++static void ++copy_mem_info(struct info_str *info, char *data, int len) ++{ ++ if (info->pos + len > info->offset + info->length) ++ len = info->offset + info->length - info->pos; ++ ++ if (info->pos + len < info->offset) { ++ info->pos += len; ++ return; ++ } ++ ++ if (info->pos < info->offset) { ++ off_t partial; ++ ++ partial = info->offset - info->pos; ++ data += partial; ++ info->pos += partial; ++ len -= partial; ++ } ++ ++ if (len > 0) { ++ memcpy(info->buffer, data, len); ++ info->pos += len; ++ info->buffer += len; ++ } ++} ++ ++static int ++copy_info(struct info_str *info, char *fmt, ...) ++{ ++ va_list args; ++ char buf[256]; ++ int len; ++ ++ va_start(args, fmt); ++ len = vsprintf(buf, fmt, args); ++ va_end(args); ++ ++ copy_mem_info(info, buf, len); ++ ++ return (len); ++} ++ ++/************************************************************************* ++* qla2x00_proc_info ++* ++* Description: ++* Return information to handle /proc support for the driver. ++* ++* inout : decides the direction of the dataflow and the meaning of the ++* variables ++* buffer: If inout==FALSE data is being written to it else read from it ++* (ptr to a page buffer) ++* *start: If inout==FALSE start of the valid data in the buffer ++* offset: If inout==FALSE starting offset from the beginning of all ++* possible data to return. ++* length: If inout==FALSE max number of bytes to be written into the buffer ++* else number of bytes in "buffer" ++* Returns: ++* < 0: error. errno value. ++* >= 0: sizeof data returned. ++*************************************************************************/ ++int ++qla2x00_proc_info(char *buffer, ++ char **start, off_t offset, int length, int hostno, int inout) ++{ ++ struct Scsi_Host *host; ++ struct info_str info; ++ int i; ++ int retval = -EINVAL; ++ os_lun_t *up; ++ uint32_t t, l; ++ uint32_t tmp_sn; ++ unsigned long *flags; ++ struct list_head *list, *temp; ++ unsigned long cpu_flags; ++ uint8_t *loop_state; ++#if REQ_TRACE ++ Scsi_Cmnd *cp; ++ srb_t *sp; ++#endif ++ int found; ++ struct list_head *hal; ++ scsi_qla_host_t *ha; ++ ++ DEBUG3(printk(KERN_INFO ++ "Entering proc_info buff_in=%p, offset=0x%lx, length=0x%x, " ++ "hostno=%d\n", buffer, offset, length, hostno);) ++ ++ ha = NULL; ++ host = NULL; ++ ++ /* Find the host that was specified */ ++ found = 0; ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (ha->host->host_no == hostno) { ++ found++; ++ break; ++ } ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ /* if host wasn't found then exit */ ++ if (!found) { ++ DEBUG2_3(printk(KERN_WARNING ++ "%s: Can't find adapter for host number %d\n", ++ __func__, hostno);) ++ ++ return (retval); ++ } ++ ++ host = ha->host; ++ ++ if (inout == TRUE) { ++ /* Has data been written to the file? */ ++ DEBUG3(printk( ++ "%s: has data been written to the file. \n", ++ __func__);) ++ return (qla2x00_set_info(buffer, length, host)); ++ } ++ ++ if (start) { ++ *start = buffer; ++ } ++ ++ info.buffer = buffer; ++ info.length = length; ++ info.offset = offset; ++ info.pos = 0; ++ ++ /* start building the print buffer */ ++ copy_info(&info, ++ "QLogic PCI to Fibre Channel Host Adapter for " ISP_NAME ":\n" ++ " Firmware version: %2d.%02d.%02d ", ++ ha->fw_major_version, ++ ha->fw_minor_version, ++ ha->fw_subminor_version); ++ ++ switch (ha->fw_attributes & 0xFF) { ++ case 0x7: ++ copy_info(&info, "EF"); ++ break; ++ case 0x17: ++ copy_info(&info, "TP"); ++ break; ++ case 0x37: ++ copy_info(&info, "IP"); ++ break; ++ case 0x77: ++ copy_info(&info, "VI"); ++ break; ++ default: ++ copy_info(&info, "(%x)", ha->fw_attributes); ++ break; ++ } ++ if (ha->fw_attributes & 0x100) ++ copy_info(&info, "X"); ++ copy_info(&info, ", "); ++ ++ copy_info(&info, "Driver version %s\n", qla2x00_version_str); ++ ++ copy_info(&info, "Entry address = %p\n", qla2x00_set_info); ++ ++ tmp_sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | ++ ha->serial1; ++ copy_info(&info, "HBA: %s, Serial# %c%05d\n", ++ ha->brd_info->name, ('A' + tmp_sn/100000), (tmp_sn%100000)); ++ ++ copy_info(&info, ++ "Request Queue = 0x%lx, Response Queue = 0x%lx\n", ++ (long unsigned int)ha->request_dma, ++ (long unsigned int)ha->response_dma); ++ ++ copy_info(&info, ++ "Request Queue count= %ld, Response Queue count= %ld\n", ++ (long)REQUEST_ENTRY_CNT, (long)RESPONSE_ENTRY_CNT); ++ ++ copy_info(&info, ++ "Total number of active commands = %ld\n", ++ ha->actthreads); ++ ++ copy_info(&info, ++ "Total number of interrupts = %ld\n", ++ (long)ha->total_isr_cnt); ++ ++#if defined(FC_IP_SUPPORT) ++ copy_info(&info, ++ "Total number of active IP commands = %ld\n", ++ ha->ipreq_cnt); ++#endif ++ ++#if defined(IOCB_THROLLE_USAGE) ++#if defined(IOCB_HIT_RATE) ++ copy_info(&info, ++ "Total number of IOCBs (used/max/#hit) " ++ "= (%d/%d/%d)\n", ++ (int)ha->iocb_cnt, ++ (int)ha->iocb_hiwat, ++ (int)ha->iocb_overflow_cnt); ++#else ++ copy_info(&info, ++ "Total number of IOCBs (used/max) " ++ "= (%d/%d)\n", ++ (int)ha->iocb_cnt, (int)ha->iocb_hiwat); ++#endif ++#endif ++ ++ ++ copy_info(&info, ++ "Total number of queued commands = %d\n", ++ (max_srbs - ha->srb_cnt)); ++ ++ copy_info(&info, ++ " Device queue depth = 0x%x\n", ++ (ql2xmaxqdepth == 0) ? 16 : ql2xmaxqdepth); ++ ++ copy_info(&info, ++ "Number of free request entries = %d\n", ha->req_q_cnt); ++ ++ copy_info(&info, ++ "Number of mailbox timeouts = %ld\n", ++ qla2x00_stats.mboxtout); ++ ++ copy_info(&info, ++ "Number of ISP aborts = %ld\n",qla2x00_stats.ispAbort); ++ ++ copy_info(&info, ++ "Number of loop resyncs = %ld\n", ++ qla2x00_stats.loop_resync); ++ ++ copy_info(&info, ++ "Number of retries for empty slots = %ld\n", ++ qla2x00_stats.outarray_full); ++ ++ copy_info(&info, ++ "Number of reqs in pending_q= %ld, retry_q= %d, " ++ "done_q= %ld, scsi_retry_q= %d\n", ++ ha->qthreads, ha->retry_q_cnt, ++ ha->done_q_cnt, ha->scsi_retry_q_cnt); ++ ++ if (ha->flags.failover_enabled) { ++ copy_info(&info, ++ "Number of reqs in failover_q= %d\n", ++ ha->failover_cnt); ++ } ++ ++ flags = (unsigned long *) &ha->flags; ++ ++ if (ha->loop_state == LOOP_DOWN) { ++ loop_state = "DOWN"; ++ } else if (ha->loop_state ==LOOP_UP) { ++ loop_state = "UP"; ++ } else if (ha->loop_state ==LOOP_READY) { ++ loop_state = "READY"; ++ } else if (ha->loop_state ==LOOP_TIMEOUT) { ++ loop_state = "TIMEOUT"; ++ } else if (ha->loop_state ==LOOP_UPDATE) { ++ loop_state = "UPDATE"; ++ } else { ++ loop_state = "UNKNOWN"; ++ } ++ ++ copy_info(&info, ++ "Host adapter:loop state= <%s>, flags= 0x%lx\n", ++ loop_state , *flags); ++ ++ copy_info(&info, "Dpc flags = 0x%lx\n", ha->dpc_flags); ++ ++ copy_info(&info, "MBX flags = 0x%x\n", ha->mbx_flags); ++ ++ copy_info(&info, "SRB Free Count = %d\n", ha->srb_cnt); ++ ++ copy_info(&info, "Port down retry = %3.3d\n", ++ ha->port_down_retry_count); ++ ++ copy_info(&info, "Login retry count = %3.3d\n", ++ ha->login_retry_count); ++ ++ copy_info(&info, ++ "Commands retried with dropped frame(s) = %d\n", ++ ha->dropped_frame_error_cnt); ++ ++ copy_info(&info, "\n"); ++ ++#if REQ_TRACE ++ if (qla2x00_req_dmp) { ++ copy_info(&info, ++ "Outstanding Commands on controller:\n"); ++ ++ for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) { ++ if ((sp = ha->outstanding_cmds[i]) == NULL) { ++ continue; ++ } ++ ++ if ((cp = sp->cmd) == NULL) { ++ continue; ++ } ++ ++ copy_info(&info, "(%d): Pid=%d, sp flags=0x%lx" ++ ", cmd=0x%p, state=%d\n", ++ i, ++ (int)sp->cmd->serial_number, ++ (long)sp->flags, ++ CMD_SP(sp->cmd), ++ (int)sp->state); ++ ++ if (info.pos >= info.offset + info.length) { ++ /* No need to continue */ ++ goto profile_stop; ++ } ++ } ++ } ++#endif /* REQ_TRACE */ ++ ++ if (qla2x00_retryq_dmp) { ++ if (!list_empty(&ha->retry_queue)) { ++ copy_info(&info, ++ "qla%ld: Retry queue requests:\n", ++ ha->host_no); ++ ++ spin_lock_irqsave(&ha->list_lock, cpu_flags); ++ ++ i = 0; ++ list_for_each_safe(list, temp, &ha->retry_queue) { ++ sp = list_entry(list, srb_t, list); ++ t = SCSI_TCN_32(sp->cmd); ++ l = SCSI_LUN_32(sp->cmd); ++ ++ copy_info(&info, ++ "%d: target=%d, lun=%d, " ++ "pid=%ld sp=%p, sp->flags=0x%x," ++ "sp->state= %d\n", ++ i, t, l, ++ sp->cmd->serial_number, sp, ++ sp->flags, sp->state ); ++ ++ i++; ++ ++ if (info.pos >= info.offset + info.length) { ++ /* No need to continue */ ++ goto profile_stop; ++ } ++ } ++ ++ spin_unlock_irqrestore(&ha->list_lock, cpu_flags); ++ ++ } /* if (!list_empty(&ha->retry_queue))*/ ++ } /* if ( qla2x00_retryq_dmp ) */ ++ ++ /* 2.25 node/port display to proc */ ++ /* Display the node name for adapter */ ++ copy_info(&info, "\nSCSI Device Information:\n"); ++ copy_info(&info, ++ "scsi-qla%d-adapter-node=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ (int)ha->instance, ++ ha->init_cb->node_name[0], ++ ha->init_cb->node_name[1], ++ ha->init_cb->node_name[2], ++ ha->init_cb->node_name[3], ++ ha->init_cb->node_name[4], ++ ha->init_cb->node_name[5], ++ ha->init_cb->node_name[6], ++ ha->init_cb->node_name[7]); ++ ++ /* display the port name for adapter */ ++ copy_info(&info, ++ "scsi-qla%d-adapter-port=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ (int)ha->instance, ++ ha->init_cb->port_name[0], ++ ha->init_cb->port_name[1], ++ ha->init_cb->port_name[2], ++ ha->init_cb->port_name[3], ++ ha->init_cb->port_name[4], ++ ha->init_cb->port_name[5], ++ ha->init_cb->port_name[6], ++ ha->init_cb->port_name[7]); ++ ++ /* Print out device port names */ ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ if (ha->fc_db[i].loop_id == PORT_UNUSED) { ++ continue; ++ } ++ ++ if (ha->flags.failover_enabled) { ++ copy_info(&info, ++ "scsi-qla%d-port-%d=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x:" ++ "%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ (int)ha->instance, i, ++ ha->fc_db[i].name[0], ++ ha->fc_db[i].name[1], ++ ha->fc_db[i].name[2], ++ ha->fc_db[i].name[3], ++ ha->fc_db[i].name[4], ++ ha->fc_db[i].name[5], ++ ha->fc_db[i].name[6], ++ ha->fc_db[i].name[7], ++ ha->fc_db[i].wwn[0], ++ ha->fc_db[i].wwn[1], ++ ha->fc_db[i].wwn[2], ++ ha->fc_db[i].wwn[3], ++ ha->fc_db[i].wwn[4], ++ ha->fc_db[i].wwn[5], ++ ha->fc_db[i].wwn[6], ++ ha->fc_db[i].wwn[7]); ++ } else { ++ copy_info(&info, ++ "scsi-qla%d-target-%d=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x;\n", ++ (int)ha->instance, i, ++ ha->fc_db[i].wwn[0], ++ ha->fc_db[i].wwn[1], ++ ha->fc_db[i].wwn[2], ++ ha->fc_db[i].wwn[3], ++ ha->fc_db[i].wwn[4], ++ ha->fc_db[i].wwn[5], ++ ha->fc_db[i].wwn[6], ++ ha->fc_db[i].wwn[7]); ++ } ++ ++ } /* 2.25 node/port display to proc */ ++ ++ copy_info(&info, "\nSCSI LUN Information:\n"); ++ ++ copy_info(&info, "(Id:Lun)\n"); ++ ++ /* scan for all equipment stats */ ++ for (t = 0; t < MAX_FIBRE_DEVICES; t++) { ++ /* scan all luns */ ++ for (l = 0; l < ha->max_luns; l++) { ++ up = (os_lun_t *) GET_LU_Q(ha, t, l); ++ ++ if (up == NULL) { ++ continue; ++ } ++ if (up->fclun == NULL) { ++ continue; ++ } ++ if (up->fclun->flags & FC_DISCON_LUN) { ++ continue; ++ } ++ ++ copy_info(&info, ++ "(%2d:%2d): Total reqs %ld,", ++ t,l,up->io_cnt); ++ ++ copy_info(&info, ++ " Pending reqs %ld,", ++ up->out_cnt); ++ ++ if (up->io_cnt < 3) { ++ copy_info(&info, ++ " flags 0x%x*,", ++ (int)up->q_flag); ++ } else { ++ copy_info(&info, ++ " flags 0x%x,", ++ (int)up->q_flag); ++ } ++ ++ copy_info(&info, ++ " %ld:%d:%02x,", ++ up->fclun->fcport->ha->instance, ++ up->fclun->fcport->cur_path, ++ up->fclun->fcport->loop_id); ++ ++ copy_info(&info, "\n"); ++ ++ if (info.pos >= info.offset + info.length) { ++ /* No need to continue */ ++ goto profile_stop; ++ } ++ } ++ ++ if (info.pos >= info.offset + info.length) { ++ /* No need to continue */ ++ break; ++ } ++ } ++ ++profile_stop: ++ ++ retval = info.pos > info.offset ? info.pos - info.offset : 0; ++ ++ DEBUG3(printk(KERN_INFO ++ "Exiting proc_info: info.pos=%d, offset=0x%lx, " ++ "length=0x%x\n", info.pos, offset, length);) ++ ++#if QLA2100_LIPTEST ++ qla2x00_lip = 1; ++#endif ++ ++ return (retval); ++} ++ ++#if defined (CONFIG_SCSIFCHOTSWAP) || defined(CONFIG_GAMAP) ++union wwnmap { ++ unsigned long long wwn; ++ unsigned char wwn_u8[8]; ++}; ++ ++int qla2x00_get_scsi_info_from_wwn (int mode, ++ unsigned long long wwn, ++ int *host, ++ int *channel, ++ int *lun, ++ int *id) { ++ ++scsi_qla_host_t *list; ++Scsi_Device *scsi_device; ++union wwnmap wwncompare; ++union wwnmap wwncompare2; ++int i, j, k; ++ ++ /* ++ * Retrieve big endian version of world wide name ++ */ ++ wwncompare2.wwn = wwn; ++ for (j = 0, k=7; j < 8; j++, k--) { ++ wwncompare.wwn_u8[j] = wwncompare2.wwn_u8[k]; ++ } ++ ++ /* ++ * query all hosts searching for WWN ++ */ ++ for (list = qla2x00_hostlist; list; list = list->next) { ++ for (i = 0; i < MAX_FIBRE_DEVICES; i++) { ++ /* ++ * Scan all devices in FibreChannel database ++ * if WWN match found, return SCSI device information ++ */ ++ if (memcmp (wwncompare.wwn_u8, list->fc_db[i].name, 8) == 0) { ++ /* ++ * If inserting, avoid scan for channel and lun information ++ */ ++ if (mode == 0) { ++ *channel = 0; ++ *lun = 0; ++ *host = list->host->host_no; ++ *id = i; ++ return (0); ++ } ++ ++ ++ /* ++ * WWN matches, find channel and lun information from scsi ++ * device ++ */ ++ for (scsi_device = list->host->host_queue; scsi_device; scsi_device = scsi_device->next) { ++ if (scsi_device->id == i) { ++ *channel = scsi_device->channel; ++ *lun = scsi_device->lun; ++ break; ++ } ++ } ++ if (scsi_device == 0) { ++ return (-ENOENT); ++ } ++ /* ++ * Device found, return all data ++ */ ++ *host = list->host->host_no; ++ *id = i; ++ return (0); ++ } /* memcmp */ ++ } /* i < MAXFIBREDEVICES */ ++ } ++ return (-ENOENT); ++} ++ ++int qla2x00_get_wwn_from_scsi_info (int host, int id, unsigned long long *wwn) { ++scsi_qla_host_t *list; ++union wwnmap wwnendian; ++union wwnmap wwnendian2; ++int j, k; ++ ++ /* ++ * Examine all QLogic hosts ++ */ ++ for (list = qla2x00_hostlist; list; list = list->next) { ++ if (host == list->host->host_no) { ++ /* ++ * Get endian corrected 64 bit WWN ++ */ ++ ++ memcpy (&wwnendian2.wwn, list->fc_db[id].name, 8); ++ for (j = 0, k=7; j < 8; j++, k--) { ++ wwnendian.wwn_u8[j] = wwnendian2.wwn_u8[k]; ++ } ++ *wwn = wwnendian.wwn; ++ return (0); ++ } ++ } ++ return (-ENOENT); ++} ++#endif /* CONFIG_SCSIFCHOTSWAP || CONFIG_GAMAP */ ++ ++/************************************************************************** ++* qla2x00_setup ++* ++* Handle Linux boot parameters. This routine allows for assigning a value ++* to a parameter with a ';' between the parameter and the value. ++* ie. qla2x00=arg0;arg1;...;argN; OR ++* via the command line. ++* ie. qla2x00 ql2xopts=arg0;arg1;...;argN; ++**************************************************************************/ ++#if !defined(MODULE) ++static int __init ++qla2x00_setup(char *s) ++#else ++void ++qla2x00_setup(char *s) ++#endif ++{ ++ char *cp, *np; ++ char *slots[MAXARGS]; ++ char **argv = &slots[0]; ++ static char buf[LINESIZE]; ++ int argc, opts; ++ ++#if !defined(MODULE) ++ if (s == NULL || *s == '\0') ++ return 0; ++#endif ++ ++ /* ++ * Determine if we have any properties. ++ */ ++ cp = s; ++ opts = 1; ++ while (*cp && (np = qla2x00_get_line(cp, buf)) != NULL) { ++ if (strncmp("scsi-qla",buf,8) == 0) { ++ DEBUG(printk("qla2100: devconf=%s\n",cp);) ++ ++ ql2xdevconf = cp; ++ (opts > 0)? opts-- : 0; ++ break; ++ } ++ opts++; ++ cp = np; ++ } ++ ++ /* ++ * Parse the args before the properties ++ */ ++ if (opts) { ++ opts = (opts > MAXARGS-1)? MAXARGS-1: opts; ++ argc = qla2x00_get_tokens(s, argv, opts); ++ while (argc > 0) { ++ cp = *argv; ++ DEBUG(printk("scsi: found cmd arg =[%s]\n", cp)); ++ ++ if (strcmp(cp, "verbose") == 0) { ++ DEBUG(printk("qla2100: verbose\n")); ++ qla2x00_verbose++; ++ } else if (strcmp(cp, "quiet") == 0) { ++ qla2x00_quiet = 1; ++ } else if (strcmp(cp, "reinit_on_loopdown") == 0) { ++ qla2x00_reinit++; ++ DEBUG(printk("qla2100: reinit_on_loopdown\n")); ++ } ++ argc--, argv++; ++ } ++ } ++ ++#if !defined(MODULE) ++ if (ql2xdevconf) ++ return 1; ++ else ++ return 0; ++#endif ++} ++ ++#if !defined(MODULE) ++__setup("ql2xopts=", qla2x00_setup); ++#endif ++ ++/********************** qla2x00_get_line ********************* ++* qla2x00_get_line ++* Copy a substring from the specified string. The substring ++* consists of any number of chars seperated by white spaces (i.e. spaces) ++* and ending with a newline '\n' or a semicolon ';'. ++* ++* Enter: ++* str - orig string ++* line - substring ++* ++* Returns: ++* cp - pointer to next string ++* or ++* null - End of string ++*************************************************************/ ++static char * ++qla2x00_get_line(char *str, char *line) ++{ ++ register char *cp = str; ++ register char *sp = line; ++ ++ /* skip preceeding spaces */ ++ while (*cp && *cp == ' ') ++ ++cp; ++ while ((*cp) && *cp != '\n' && *cp != ';') /* end of line */ ++ *sp++ = *cp++; ++ ++ *sp = '\0'; ++ ++ DEBUG5(printk("%s(): %s\n", __func__, line)); ++ ++ if( (*cp) ) { ++ cp++; ++ return (cp); ++ } ++ ++ return (NULL); ++} ++ ++ ++/**************************** get_tokens ********************* ++* Parse command line into argv1, argv2, ... argvX ++* Arguments are seperated by white spaces and colons and end ++* with a NULL. ++*************************************************************/ ++static int ++qla2x00_get_tokens(char *line, char **argv, int maxargs) ++{ ++ register char *cp = line; ++ int count = 0; ++ ++ while (*cp && count < maxargs) { ++ /* skip preceeding spaces */ ++ while ((*cp) && *cp == ' ') ++ ++cp; ++ /* symbol starts here */ ++ argv[count++] = cp; ++ /* skip symbols */ ++ while ((*cp) && !(*cp == ' ' || *cp == ';' || *cp == ':')) ++ cp++; ++ /* replace comma or space with a null */ ++ if((*cp) && (*cp ==' ' ) && argv[count-1] != cp) ++ *cp++ = '\0'; ++ } ++ return (count); ++} ++ ++/* ++* qla2x00_display_fc_names ++* This routine will the node names of the different devices found ++* after port inquiry. ++* ++* Input: ++* cmd = SCSI command structure ++* ++* Returns: ++* None. ++*/ ++static void ++qla2x00_display_fc_names(scsi_qla_host_t *ha) ++{ ++ uint16_t tgt; ++ os_tgt_t *tq; ++ ++ /* Display the node name for adapter */ ++ printk(KERN_INFO ++ "scsi-qla%d-adapter-node=%02x%02x%02x%02x%02x%02x%02x%02x\\;\n", ++ (int)ha->instance, ++ ha->init_cb->node_name[0], ++ ha->init_cb->node_name[1], ++ ha->init_cb->node_name[2], ++ ha->init_cb->node_name[3], ++ ha->init_cb->node_name[4], ++ ha->init_cb->node_name[5], ++ ha->init_cb->node_name[6], ++ ha->init_cb->node_name[7]); ++ ++ /* display the port name for adapter */ ++ printk(KERN_INFO ++ "scsi-qla%d-adapter-port=%02x%02x%02x%02x%02x%02x%02x%02x\\;\n", ++ (int)ha->instance, ++ ha->init_cb->port_name[0], ++ ha->init_cb->port_name[1], ++ ha->init_cb->port_name[2], ++ ha->init_cb->port_name[3], ++ ha->init_cb->port_name[4], ++ ha->init_cb->port_name[5], ++ ha->init_cb->port_name[6], ++ ha->init_cb->port_name[7]); ++ ++ /* Print out device port names */ ++ for (tgt = 0; tgt < MAX_TARGETS; tgt++) { ++ if ((tq = ha->otgt[tgt]) == NULL) ++ continue; ++ ++ if (tq->vis_port == NULL) ++ continue; ++ ++ switch (ha->binding_type) { ++ case BIND_BY_PORT_NAME: ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-0-port=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x\\;\n", ++ (int)ha->instance, ++ tgt, ++ tq->port_name[0], ++ tq->port_name[1], ++ tq->port_name[2], ++ tq->port_name[3], ++ tq->port_name[4], ++ tq->port_name[5], ++ tq->port_name[6], ++ tq->port_name[7]); ++ ++ break; ++ ++ case BIND_BY_PORT_ID: ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-0-pid=" ++ "%02x%02x%02x\\;\n", ++ (int)ha->instance, ++ tgt, ++ tq->d_id.b.domain, ++ tq->d_id.b.area, ++ tq->d_id.b.al_pa); ++ break; ++ ++ case BIND_BY_NODE_NAME: ++ printk(KERN_INFO ++ "scsi-qla%d-tgt-%d-di-0-node=" ++ "%02x%02x%02x%02x%02x%02x%02x%02x\\;\n", ++ (int)ha->instance, ++ tgt, ++ tq->node_name[0], ++ tq->node_name[1], ++ tq->node_name[2], ++ tq->node_name[3], ++ tq->node_name[4], ++ tq->node_name[5], ++ tq->node_name[6], ++ tq->node_name[7]); ++ break; ++ } ++ ++#if VSA ++ printk(KERN_INFO ++ "scsi-qla%d-target-%d-vsa=01;\n", (int)ha->instance, tgt); ++#endif ++ } ++} ++ ++/* ++ * qla2x00_suspend_lun ++ * Suspend lun and start port down timer ++ * ++ * Input: ++ * ha = visable adapter block pointer. ++ * lq = lun queue ++ * cp = Scsi command pointer ++ * time = time in seconds ++ * count = number of times to let time expire ++ * delay_lun = non-zero, if lun should be delayed rather than suspended ++ * ++ * Return: ++ * QL_STATUS_SUCCESS -- suspended lun ++ * QL_STATUS_ERROR -- Didn't suspend lun ++ * ++ * Context: ++ * Interrupt context. ++ */ ++uint8_t ++__qla2x00_suspend_lun(scsi_qla_host_t *ha, ++ os_lun_t *lq, int time, int count, int delay_lun) ++{ ++ srb_t *sp; ++ struct list_head *list, *temp; ++ unsigned long flags; ++ uint8_t status; ++ ++ /* if the lun_q is already suspended then don't do it again */ ++ if (lq->q_state == LUN_STATE_READY ||lq->q_state == LUN_STATE_RUN) { ++ ++ spin_lock_irqsave(&lq->q_lock, flags); ++ if (lq->q_state == LUN_STATE_READY) { ++ lq->q_max = count; ++ lq->q_count = 0; ++ } ++ /* Set the suspend time usually 6 secs */ ++ atomic_set(&lq->q_timer, time); ++ ++ /* now suspend the lun */ ++ lq->q_state = LUN_STATE_WAIT; ++ ++ if (delay_lun) { ++ set_bit(LUN_EXEC_DELAYED, &lq->q_flag); ++ DEBUG(printk(KERN_INFO ++ "scsi(%ld): Delay lun execution for %d secs, " ++ "count=%d, max count=%d, state=%d\n", ++ ha->host_no, ++ time, ++ lq->q_count, lq->q_max, lq->q_state)); ++ } else { ++ DEBUG(printk(KERN_INFO ++ "scsi(%ld): Suspend lun for %d secs, count=%d, " ++ "max count=%d, state=%d\n", ++ ha->host_no, ++ time, ++ lq->q_count, lq->q_max, lq->q_state)); ++ } ++ spin_unlock_irqrestore(&lq->q_lock, flags); ++ ++ /* ++ * Remove all pending commands from request queue and put them ++ * in the scsi_retry queue. ++ */ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ list_for_each_safe(list, temp, &ha->pending_queue) { ++ sp = list_entry(list, srb_t, list); ++ if (sp->lun_queue != lq) ++ continue; ++ ++ __del_from_pending_queue(ha, sp); ++ ++ if (sp->cmd->allowed < count) ++ sp->cmd->allowed = count; ++ __add_to_scsi_retry_queue(ha,sp); ++ ++ } /* list_for_each_safe */ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ status = QL_STATUS_SUCCESS; ++ } else { ++ status = QL_STATUS_ERROR; ++ } ++ ++ return (status); ++ ++} ++ ++/* ++ * qla2x00_mark_device_lost Updates fcport state when device goes offline. ++ * ++ * Input: ha = adapter block pointer. fcport = port structure pointer. ++ * ++ * Return: None. ++ * ++ * Context: ++ */ ++void qla2x00_mark_device_lost(scsi_qla_host_t *ha, fc_port_t *fcport) ++{ ++ /* ++ * We may need to retry the login, so don't change the state of the ++ * port but do the retries. ++ */ ++ if (atomic_read(&fcport->state) != FC_DEVICE_DEAD) ++ atomic_set(&fcport->state, FC_DEVICE_LOST); ++ ++ if (fcport->login_retry == 0) { ++ fcport->login_retry = ha->login_retry_count; ++ set_bit(RELOGIN_NEEDED, &ha->dpc_flags); ++ ++ DEBUG(printk("scsi(%ld): Port login retry: " ++ "%02x%02x%02x%02x%02x%02x%02x%02x, " ++ "id = 0x%04x retry cnt=%d\n", ++ ha->host_no, ++ fcport->port_name[0], ++ fcport->port_name[1], ++ fcport->port_name[2], ++ fcport->port_name[3], ++ fcport->port_name[4], ++ fcport->port_name[5], ++ fcport->port_name[6], ++ fcport->port_name[7], ++ fcport->loop_id, ++ fcport->login_retry)); ++ } ++} ++ ++/* ++ * qla2x00_mark_all_devices_lost ++ * Updates fcport state when device goes offline. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * fcport = port structure pointer. ++ * ++ * Return: ++ * None. ++ * ++ * Context: ++ */ ++void ++qla2x00_mark_all_devices_lost(scsi_qla_host_t *ha) ++{ ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ /* ++ * No point in marking the device as lost, if the device is ++ * already DEAD. ++ */ ++ if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) ++ continue; ++ ++ atomic_set(&fcport->state, FC_DEVICE_LOST); ++ } ++} ++ ++/* ++* qla2x00_mem_alloc ++* Allocates adapter memory. ++* ++* Returns: ++* 0 = success. ++* 1 = failure. ++*/ ++static uint8_t ++qla2x00_mem_alloc(scsi_qla_host_t *ha) ++{ ++ uint8_t status = 1; ++ uint8_t i; ++ int retry= 10; ++ mbx_cmdq_t *ptmp; ++ mbx_cmdq_t *tmp_q_head; ++ mbx_cmdq_t *tmp_q_tail; ++ ++ ENTER(__func__); ++ ++ do { ++ /* ++ * This will loop only once if everything goes well, else some ++ * number of retries will be performed to get around a kernel ++ * bug where available mem is not allocated until after a ++ * little delay and a retry. ++ */ ++ ++#if defined(FC_IP_SUPPORT) ++ ha->risc_rec_q = pci_alloc_consistent(ha->pdev, ++ ((IP_BUFFER_QUEUE_DEPTH) * (sizeof(struct risc_rec_entry))), ++ &ha->risc_rec_q_dma); ++ if (ha->risc_rec_q == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "risc_rec_q\n", ++ ha->host_no); ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++#endif /* #if defined(FC_IP_SUPPORT) */ ++ ++ ha->request_ring = pci_alloc_consistent(ha->pdev, ++ ((REQUEST_ENTRY_CNT + 1) * (sizeof(request_t))), ++ &ha->request_dma); ++ if (ha->request_ring == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "request_ring\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ ++ ha->response_ring = pci_alloc_consistent(ha->pdev, ++ ((RESPONSE_ENTRY_CNT + 1) * (sizeof(response_t))), ++ &ha->response_dma); ++ if (ha->response_ring == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "response_ring\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ ++ /* get consistent memory allocated for init control block */ ++ ha->init_cb = pci_alloc_consistent(ha->pdev, ++ sizeof(init_cb_t), &ha->init_cb_dma); ++ if (ha->init_cb == NULL) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "init_cb\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ memset(ha->init_cb, 0, sizeof(init_cb_t)); ++ ++ /* Allocate ioctl related memory. */ ++ if (qla2x00_alloc_ioctl_mem(ha)) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "ioctl_mem\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ ++ if (qla2x00_allocate_sp_pool(ha)) { ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "qla2x00_allocate_sp_pool()\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ ++ /* ++ * Allocate an initial list of mailbox semaphore queue to be ++ * used for serialization of the mailbox commands. ++ */ ++ tmp_q_head = (void *)KMEM_ZALLOC(sizeof(mbx_cmdq_t), 20); ++ if (tmp_q_head == NULL) { ++ /* error */ ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - " ++ "mbx_cmd_q", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ ha->mbx_sem_pool_head = tmp_q_head; ++ tmp_q_tail = tmp_q_head; ++ ++ /* Now try to allocate more */ ++ for (i = 1; i < MBQ_INIT_LEN; i++) { ++ ptmp = (void *)KMEM_ZALLOC(sizeof(mbx_cmdq_t), 20 + i); ++ if (ptmp == NULL) { ++ /* ++ * Error. Just exit. If more is needed later ++ * they will be allocated at that time. ++ */ ++ break; ++ } ++ tmp_q_tail->pnext = ptmp; ++ tmp_q_tail = ptmp; ++ } ++ ha->mbx_sem_pool_tail = tmp_q_tail; ++ ++ /* Get consistent memory allocated for MS IOCB */ ++ ha->ms_iocb = pci_alloc_consistent(ha->pdev, ++ sizeof(ms_iocb_entry_t), &ha->ms_iocb_dma); ++ if (ha->ms_iocb == NULL) { ++ /* error */ ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - ms_iocb\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ memset(ha->ms_iocb, 0, sizeof(ms_iocb_entry_t)); ++ ++ /* Get consistent memory allocated for CT SNS commands */ ++ ha->ct_sns = pci_alloc_consistent(ha->pdev, ++ sizeof(struct ct_sns_pkt), &ha->ct_sns_dma); ++ if (ha->ct_sns == NULL) { ++ /* error */ ++ printk(KERN_WARNING ++ "scsi(%ld): Memory Allocation failed - ct_sns\n", ++ ha->host_no); ++ ++ qla2x00_mem_free(ha); ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ/10); ++ ++ continue; ++ } ++ memset(ha->ct_sns, 0, sizeof(struct ct_sns_pkt)); ++ ++ /* Done all allocations without any error. */ ++ status = 0; ++ ++ } while (retry-- && status != 0); ++ ++ if (status) { ++ printk(KERN_WARNING ++ "%s(): **** FAILED ****\n", __func__); ++ } ++ ++ LEAVE(__func__); ++ ++ return(status); ++} ++ ++/* ++* qla2x00_mem_free ++* Frees all adapter allocated memory. ++* ++* Input: ++* ha = adapter block pointer. ++*/ ++static void ++qla2x00_mem_free(scsi_qla_host_t *ha) ++{ ++ uint32_t t; ++ struct list_head *fcpl, *fcptemp; ++ fc_port_t *fcport; ++ struct list_head *fcll, *fcltemp; ++ fc_lun_t *fclun; ++ mbx_cmdq_t *ptmp; ++ mbx_cmdq_t *tmp_q_head; ++ unsigned long wtime;/* max wait time if mbx cmd is busy. */ ++ struct list_head *fcil, *fcitemp; ++ fc_initiator_t *fcinitiator; ++ ++ ENTER(__func__); ++ ++ if (ha == NULL) { ++ /* error */ ++ DEBUG2(printk("%s(): ERROR invalid ha pointer.\n", __func__)); ++ return; ++ } ++ ++ /* Free the target queues */ ++ for (t = 0; t < MAX_TARGETS; t++) { ++ qla2x00_tgt_free(ha, t); ++ } ++ ++ /* Make sure all other threads are stopped. */ ++ wtime = 60 * HZ; ++ while ((ha->dpc_wait != NULL || ha->mbx_q_head != NULL) && wtime) { ++ set_current_state(TASK_INTERRUPTIBLE); ++ wtime = schedule_timeout(wtime); ++ } ++ ++ /* Now free the mbx sem pool */ ++ tmp_q_head = ha->mbx_sem_pool_head; ++ while (tmp_q_head != NULL) { ++ ptmp = tmp_q_head->pnext; ++ KMEM_FREE(tmp_q_head, sizeof(mbx_cmdq_t)); ++ tmp_q_head = ptmp; ++ } ++ ha->mbx_sem_pool_head = NULL; ++ ++ /* free ioctl memory */ ++ qla2x00_free_ioctl_mem(ha); ++ ++ /* Free host database. */ ++ list_for_each_safe(fcil, fcitemp, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ list_del(&fcinitiator->list); ++ kfree(fcinitiator); ++ } ++ INIT_LIST_HEAD(&ha->fcinitiators); ++ ++ /* free sp pool */ ++ qla2x00_free_sp_pool(ha); ++ ++ if (ha->ct_sns) { ++ pci_free_consistent(ha->pdev, ++ sizeof(struct ct_sns_pkt), ha->ct_sns, ha->ct_sns_dma); ++ } ++ if (ha->ms_iocb) { ++ pci_free_consistent(ha->pdev, ++ sizeof(ms_iocb_entry_t), ha->ms_iocb, ha->ms_iocb_dma); ++ } ++ ++ if (ha->init_cb) { ++ pci_free_consistent(ha->pdev, ++ sizeof(init_cb_t), ha->init_cb, ha->init_cb_dma); ++ } ++ ++ if (ha->request_ring) { ++ pci_free_consistent(ha->pdev, ++ ((REQUEST_ENTRY_CNT + 1) * (sizeof(request_t))), ++ ha->request_ring, ha->request_dma); ++ } ++ ++ if (ha->response_ring) { ++ pci_free_consistent(ha->pdev, ++ ((RESPONSE_ENTRY_CNT + 1) * (sizeof(response_t))), ++ ha->response_ring, ha->response_dma); ++ } ++ ++#if defined(FC_IP_SUPPORT) ++ if (ha->risc_rec_q) { ++ pci_free_consistent(ha->pdev, ++ ((IP_BUFFER_QUEUE_DEPTH) * (sizeof(struct risc_rec_entry))), ++ ha->risc_rec_q, ha->risc_rec_q_dma); ++ } ++ ha->risc_rec_q = NULL; ++ ha->risc_rec_q_dma = 0; ++#endif ++ ++ ha->ct_sns = NULL; ++ ha->ms_iocb = NULL; ++ ++ ha->init_cb = NULL; ++ ha->request_ring = NULL; ++ ha->request_dma = 0; ++ ha->response_ring = NULL; ++ ha->response_dma = 0; ++ ++ list_for_each_safe(fcpl, fcptemp, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ /* fc luns */ ++ list_for_each_safe(fcll, fcltemp, &fcport->fcluns) { ++ fclun = list_entry(fcll, fc_lun_t, list); ++ ++ list_del_init(&fclun->list); ++ kfree(fclun); ++ } ++ ++ /* fc ports */ ++ list_del_init(&fcport->list); ++ kfree(fcport); ++ } ++ INIT_LIST_HEAD(&ha->fcports); ++ ++ LEAVE(__func__); ++} ++ ++/* ++ * qla2x00_allocate_sp_pool ++ * This routine is called during initialization to allocate ++ * memory for local srb_t. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Kernel context. ++ * ++ * Note: Sets the ref_count for non Null sp to one. ++ */ ++uint8_t ++qla2x00_allocate_sp_pool(scsi_qla_host_t *ha) ++{ ++ srb_t *sp; ++ int i; ++ uint8_t status = QL_STATUS_SUCCESS; ++ ++ ENTER(__func__); ++ ++ INIT_LIST_HEAD(&ha->free_queue); ++ ha->srb_alloc_cnt = 0; ++ ++ ha->srb_pool_order = get_order(max_srbs * sizeof(srb_t)); ++ ha->srb_pool = ++ (srb_t *) __get_free_pages(GFP_KERNEL, ha->srb_pool_order); ++ if (ha->srb_pool != NULL) { ++ for (i = 0, sp = ha->srb_pool; i < max_srbs; i++, sp++) { ++ memset(sp, 0, sizeof(srb_t)); ++ __add_to_free_queue (ha, sp); ++ sp->magic = SRB_MAGIC; ++ sp->ref_num = ha->srb_alloc_cnt; ++ sp->host_no = ha->host_no; ++ atomic_set(&sp->ref_count, 0); ++ ++ ha->srb_alloc_cnt++; ++ } ++ } ++ ++ /* ++ * If we fail to allocte memory return an error ++ */ ++ if (ha->srb_alloc_cnt == 0) ++ status = QL_STATUS_ERROR; ++ ++ printk(KERN_INFO ++ "scsi(%ld): Allocated %d SRB(s).\n", ++ ha->host_no, ha->srb_alloc_cnt); ++ ++ LEAVE(__func__); ++ ++ return (status); ++} ++ ++/* ++ * This routine frees all adapter allocated memory. ++ * ++ */ ++void ++qla2x00_free_sp_pool( scsi_qla_host_t *ha) ++{ ++ int cnt_free_srbs = 0; ++ srb_t *sp; ++ struct list_head *list, *temp; ++ ++ /* ++ * Count the number of entries, remove the entries from the list, then ++ * free the pool. ++ */ ++ list_for_each_safe(list, temp, &ha->free_queue) { ++ sp = list_entry(list, srb_t, list); ++ ++ __del_from_free_queue(ha, sp); ++ cnt_free_srbs++; ++ } ++ free_pages((unsigned long)ha->srb_pool, ha->srb_pool_order); ++ ++ if (cnt_free_srbs != ha->srb_alloc_cnt) { ++ DEBUG(printk("scsi(%ld): Did not free all srbs, Free count = " ++ "%d, Alloc Count = %d\n", ++ ha->host_no, cnt_free_srbs, ha->srb_alloc_cnt)); ++ printk(KERN_INFO ++ "scsi(%ld): Did not free all srbs, Free count = %d, " ++ "Alloc Count = %d\n", ++ ha->host_no, cnt_free_srbs, ha->srb_alloc_cnt); ++ } ++} ++ ++ ++ ++/************************************************************************** ++* qla2x00_do_dpc ++* This kernel thread is a task that is schedule by the interrupt handler ++* to perform the background processing for interrupts. ++* ++* Notes: ++* This task always run in the context of a kernel thread. It ++* is kick-off by the driver's detect code and starts up ++* up one per adapter. It immediately goes to sleep and waits for ++* some fibre event. When either the interrupt handler or ++* the timer routine detects a event it will one of the task ++* bits then wake us up. ++**************************************************************************/ ++static int ++qla2x00_do_dpc(void *data) ++{ ++ DECLARE_MUTEX_LOCKED(sem); ++ scsi_qla_host_t *ha; ++ fcdev_t dev; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ os_lun_t *q; ++ srb_t *sp; ++ uint8_t status; ++ uint32_t t; ++ unsigned long flags = 0; ++ struct list_head *list, *templist; ++ int dead_cnt, online_cnt; ++ ++ ha = (scsi_qla_host_t *)data; ++ ++ lock_kernel(); ++ ++ daemonize("%s_dpc%ld", DRIVER_NAME, ha->host_no); ++ allow_signal(SIGTERM); ++ ++ ha->dpc_wait = &sem; ++ ++ unlock_kernel(); ++ ++ complete(&ha->dpc_inited); ++ ++ while (1) { ++ /* ++ * If we get a signal, it means we are supposed to go ++ * away and die. This typically happens if the user is ++ * trying to unload a module. ++ */ ++ DEBUG3(printk("qla2x00: DPC handler sleeping\n")); ++ ++ down_interruptible(&sem); ++ ++ if (signal_pending(current)) ++ break; /* get out */ ++ ++ if (ha->dpc_should_die) ++ break; ++ ++ if (!list_empty(&ha->done_queue)) ++ schedule_work(&ha->run_qla_task); ++ ++ DEBUG3(printk("qla2x00: DPC handler waking up\n")); ++ ++ /* Initialization not yet finished. Don't do anything yet. */ ++ if (!ha->init_done || ha->dpc_active) ++ continue; ++ ++ DEBUG3(printk("scsi(%ld): DPC handler\n", ha->host_no)); ++ ++ /* spin_lock_irqsave(&io_request_lock, ha->cpu_flags);*/ ++ ha->dpc_active = 1; ++ ++ /* Determine what action is necessary */ ++ ++ /* Process commands in retry queue */ ++ if (test_and_clear_bit(PORT_RESTART_NEEDED, &ha->dpc_flags)) { ++ DEBUG(printk("scsi(%ld): DPC checking retry_q. " ++ "total=%d\n", ++ ha->host_no, ha->retry_q_cnt)); ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ dead_cnt = online_cnt = 0; ++ list_for_each_safe(list, templist, &ha->retry_queue) { ++ sp = list_entry(list, srb_t, list); ++ q = sp->lun_queue; ++ DEBUG3(printk("scsi(%ld): pid=%ld sp=%p, " ++ "spflags=0x%x, q_flag= 0x%lx\n", ++ ha->host_no, ++ sp->cmd->serial_number, ++ sp, sp->flags, q->q_flag)); ++ ++ if (q == NULL) ++ continue; ++ fcport = q->fclun->fcport; ++ ++ if (atomic_read(&fcport->state) == ++ FC_DEVICE_DEAD) { ++ ++ __del_from_retry_queue(ha, sp); ++ CMD_RESULT(sp->cmd) = ++ DID_NO_CONNECT << 16; ++ CMD_HANDLE(sp->cmd) = ++ (unsigned char *) NULL; ++ __add_to_done_queue(ha, sp); ++ dead_cnt++; ++ } else if (atomic_read(&fcport->state) != ++ FC_DEVICE_LOST) { ++ ++ __del_from_retry_queue(ha, sp); ++ CMD_RESULT(sp->cmd) = ++ DID_BUS_BUSY << 16; ++ CMD_HANDLE(sp->cmd) = ++ (unsigned char *) NULL; ++ __add_to_done_queue(ha, sp); ++ online_cnt++; ++ } ++ } /* list_for_each_safe() */ ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ ++ DEBUG(printk("scsi(%ld): done processing retry queue " ++ "- dead=%d, online=%d\n ", ++ ha->host_no, dead_cnt, online_cnt)); ++ } ++ ++ /* Process commands in scsi retry queue */ ++ if (test_and_clear_bit(SCSI_RESTART_NEEDED, &ha->dpc_flags)) { ++ /* ++ * Any requests we want to delay for some period is put ++ * in the scsi retry queue with a delay added. The ++ * timer will schedule a "scsi_restart_needed" every ++ * second as long as there are requests in the scsi ++ * queue. ++ */ ++ DEBUG(printk("scsi(%ld): DPC checking scsi " ++ "retry_q.total=%d\n", ++ ha->host_no, ha->scsi_retry_q_cnt)); ++ ++ online_cnt = 0; ++ spin_lock_irqsave(&ha->list_lock, flags); ++ list_for_each_safe(list, ++ templist, ++ &ha->scsi_retry_queue) { ++ ++ sp = list_entry(list, srb_t, list); ++ q = sp->lun_queue; ++ ++ DEBUG3(printk("scsi(%ld): scsi_retry_q: " ++ "pid=%ld sp=%p, spflags=0x%x, " ++ "q_flag= 0x%lx,q_state=%d\n", ++ ha->host_no, ++ sp->cmd->serial_number, ++ sp, sp->flags, q->q_flag, q->q_state)); ++ ++ /* Was this lun suspended */ ++ if (q->q_state != LUN_STATE_WAIT) { ++ online_cnt++; ++ __del_from_scsi_retry_queue(ha, sp); ++ __add_to_retry_queue(ha,sp); ++ } ++ ++ /* Was this command suspended for N secs */ ++ if (sp->delay != 0) { ++ sp->delay--; ++ if (sp->delay == 0) { ++ online_cnt++; ++ __del_from_scsi_retry_queue( ++ ha, sp); ++ __add_to_retry_queue(ha,sp); ++ } ++ } ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ ++ DEBUG(if (online_cnt > 0)) ++ DEBUG(printk("scsi(%ld): dpc() found scsi reqs to " ++ "restart= %d\n", ++ ha->host_no, online_cnt)); ++ } ++ ++ if (ha->flags.mbox_busy) { ++ if (!list_empty(&ha->done_queue)) ++ schedule_work(&ha->run_qla_task); ++ ++ ha->dpc_active = 0; ++ continue; ++ } ++ ++ if (test_and_clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) { ++ ++ DEBUG(printk("scsi(%ld): dpc: sched " ++ "qla2x00_abort_isp ha = %p\n", ++ ha->host_no, ha)); ++ if (!(test_and_set_bit(ABORT_ISP_ACTIVE, ++ &ha->dpc_flags))) { ++ ++ if (qla2x00_abort_isp(ha, 0)) { ++ /* failed. retry later */ ++ set_bit(ISP_ABORT_NEEDED, ++ &ha->dpc_flags); ++ } ++ clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); ++ } ++ DEBUG(printk("scsi(%ld): dpc: qla2x00_abort_isp end\n", ++ ha->host_no)); ++ } ++ ++ if (test_and_clear_bit(LOOP_RESET_NEEDED, &ha->dpc_flags)) { ++ ++ DEBUG(printk("scsi(%ld): Loop Reset Needed -- " ++ "calling qla2x00_loop_reset().\n", ++ ha->host_no)); ++ ++ qla2x00_loop_reset(ha); ++ } ++ ++ if (test_and_clear_bit(DEVICE_ABORT_NEEDED, &ha->dpc_flags)) { ++ ++ DEBUG(printk("scsi(%ld): Device Abort Needed -- " ++ "calling qla2x00_abort_device().\n", ++ ha->host_no)); ++ ++ t = ha->reset_tgt_id; ++ if (ha->otgt[t] && ha->otgt[t]->vis_port) ++ qla2x00_abort_device(ha, ++ ha->otgt[t]->vis_port->loop_id, ++ ha->reset_lun); ++ } ++ ++ if (test_and_clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags) && ++ (!(test_and_set_bit(RESET_ACTIVE, &ha->dpc_flags)))) { ++ ++ DEBUG(printk("scsi(%ld): qla2x00_reset_marker()\n", ++ ha->host_no)); ++ ++ qla2x00_rst_aen(ha); ++ clear_bit(RESET_ACTIVE, &ha->dpc_flags); ++ } ++ ++ /* Retry each device up to login retry count */ ++ if ((test_and_clear_bit(RELOGIN_NEEDED, &ha->dpc_flags)) && ++ !test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) && ++ ha->loop_state != LOOP_DOWN) { ++ ++ DEBUG(printk("scsi(%ld): qla2x00_port_login()\n", ++ ha->host_no)); ++ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ /* ++ * If the port is not ONLINE then try to login ++ * to it if we haven't run out of retries. ++ */ ++ if (atomic_read(&fcport->state) != FC_ONLINE && ++ fcport->login_retry) { ++ ++ fcport->login_retry--; ++ memset(&dev, 0, sizeof(fcdev_t)); ++ dev.loop_id = fcport->old_loop_id; ++ dev.d_id.b24 = fcport->d_id.b24; ++ if (ha->fc_db[fcport->dev_id].flag & ++ DEV_PUBLIC) ++ status = qla2x00_fabric_login( ++ ha, &dev); ++ else ++ status = ++ qla2x00_local_device_login( ++ ha, ++ (dev.loop_id & 0xff)); ++ ++ if (status == QL_STATUS_SUCCESS) { ++ ha->fc_db[fcport->dev_id].loop_id = dev.loop_id; ++ fcport->loop_id = dev.loop_id; ++ fcport->old_loop_id = dev.loop_id; ++ ++ DEBUG(printk("scsi(%ld): port login OK: logged in ID 0x%x\n", ++ ha->host_no, fcport->loop_id)); ++ ++ fcport->port_login_retry_count = ++ ha->port_down_retry_count * PORT_RETRY_TIME; ++ atomic_set(&fcport->state, FC_ONLINE); ++ atomic_set(&fcport->port_down_timer, ++ ha->port_down_retry_count * PORT_RETRY_TIME); ++ ++ fcport->login_retry = 0; ++ } else if (status == 1) { ++ if (dev.loop_id != fcport->old_loop_id) { ++ fcport->old_loop_id = dev.loop_id; ++ ha->fc_db[fcport->dev_id].loop_id = dev.loop_id; ++ } ++ ++ set_bit(RELOGIN_NEEDED, &ha->dpc_flags); ++ /* retry the login again */ ++ DEBUG(printk("scsi(%ld): Retrying %d login again loop_id 0x%x\n", ++ ha->host_no, ++ fcport->login_retry, fcport->loop_id)); ++ } else { ++ fcport->login_retry = 0; ++ } ++ } ++ if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) ++ break; ++ } ++ DEBUG(printk("scsi(%ld): qla2x00_port_login - end\n", ++ ha->host_no)); ++ } ++ ++ if ((test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags)) && ++ ha->loop_state != LOOP_DOWN ) { ++ ++ clear_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags); ++ DEBUG(printk("scsi(%ld): qla2x00_login_retry()\n", ++ ha->host_no)); ++ ++ set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); ++ ++ DEBUG(printk("scsi(%ld): qla2x00_login_retry - end\n", ++ ha->host_no)); ++ } ++ ++ if (test_and_clear_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) { ++ ++ DEBUG(printk("scsi(%ld): qla2x00_loop_resync()\n", ++ ha->host_no)); ++ ++ if (!(test_and_set_bit(LOOP_RESYNC_ACTIVE, ++ &ha->dpc_flags))) { ++ ++ qla2x00_loop_resync(ha); ++ ++ clear_bit(LOOP_RESYNC_ACTIVE, &ha->dpc_flags); ++ } ++ ++ DEBUG(printk("scsi(%ld): qla2x00_loop_resync - end\n", ++ ha->host_no)); ++ } ++ ++ if (ha->flags.failover_enabled) { ++ /* ++ * If we are not processing a ioctl or one of ++ * the ports are still MISSING or need a resync ++ * then process the failover event. ++ */ ++ if (!test_bit(CFG_ACTIVE, &ha->cfg_flags)) { ++ if (qla2x00_check_for_devices_online(ha)) { ++ if (test_and_clear_bit(FAILOVER_EVENT, &ha->dpc_flags)) { ++ ++ DEBUG(printk("scsi(%ld): qla2x00_cfg_event_notify()\n", ++ ha->host_no)); ++ ++ if (ha->flags.online) { ++ qla2x00_cfg_event_notify(ha, ha->failover_type); ++ } ++ ++ DEBUG(printk("scsi(%ld): qla2x00_cfg_event_notify - end\n", ++ ha->host_no)); ++ } ++ } ++ ++ if (test_and_clear_bit(FAILOVER_NEEDED, &ha->dpc_flags)) { ++ /* ++ * Get any requests from failover queue ++ */ ++ DEBUG(printk("scsi(%ld): qla2x00_process_failover()\n", ++ ha->host_no)); ++ ++ qla2x00_process_failover(ha); ++ ++ DEBUG(printk("scsi(%ld): qla2x00_process_failover - end\n", ++ ha->host_no)); ++ } ++ } ++ } ++ ++ if (test_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags)) { ++ DEBUG(printk("scsi(%ld): qla2x00_restart_queues()\n", ++ ha->host_no)); ++ ++ qla2x00_restart_queues(ha,FALSE); ++ ++ DEBUG(printk("scsi(%ld): qla2x00_restart_queues - end\n", ++ ha->host_no)); ++ } ++ ++ if (test_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags)) { ++ ++ DEBUG(printk("scsi(%ld): qla2x00_abort_queues()\n", ++ ha->host_no)); ++ ++ qla2x00_abort_queues(ha, FALSE); ++ ++ DEBUG(printk("scsi(%ld): qla2x00_abort_queues - end\n", ++ ha->host_no)); ++ } ++ ++ if (!ha->interrupts_on) ++ qla2x00_enable_intrs(ha); ++ ++ if (!list_empty(&ha->done_queue)) ++ schedule_work(&ha->run_qla_task); ++ ++ ha->dpc_active = 0; ++ } /* End of while(1) */ ++ ++ DEBUG(printk("scsi(%ld): DPC handler exiting\n", ha->host_no)); ++ ++ /* ++ * Make sure that nobody tries to wake us up again. ++ */ ++ ha->dpc_wait = NULL; ++ ha->dpc_active = 0; ++ ++ complete_and_exit(&ha->dpc_exited, 0); ++} ++ ++/* ++ * qla2x00_abort_queues ++ * Abort all commands on queues on device ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Interrupt context. ++ */ ++void ++qla2x00_abort_queues(scsi_qla_host_t *ha, uint8_t doneqflg) ++{ ++ ++ srb_t *sp; ++ struct list_head *list, *temp; ++ unsigned long flags; ++ ++ ENTER(__func__); ++ ++ clear_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags); ++ ++ /* Return all commands device queues. */ ++ spin_lock_irqsave(&ha->list_lock,flags); ++ list_for_each_safe(list, temp, &ha->pending_queue) { ++ sp = list_entry(list, srb_t, list); ++ ++ if (sp->flags & SRB_ABORTED) ++ continue; ++ ++ /* Remove srb from LUN queue. */ ++ __del_from_pending_queue(ha, sp); ++ ++ /* Set ending status. */ ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ ++ __add_to_done_queue(ha, sp); ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ ++ LEAVE(__func__); ++} ++ ++/* ++ * qla2x00_check_for_devices_online ++ * ++ * Check fcport state of all devices to make sure online. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Return: ++ * None. ++ * ++ * Context: ++ */ ++static uint8_t ++qla2x00_check_for_devices_online(scsi_qla_host_t *ha) ++{ ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ int found, cnt; ++ ++ found = 0; ++ cnt = 0; ++ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if ((atomic_read(&fcport->state) == FC_ONLINE) || ++ (atomic_read(&fcport->state) == FC_DEVICE_DEAD)) ++ found++; ++ ++ cnt++; ++ } ++ if (cnt == found) { ++ DEBUG5(printk("%s(%ld): all online\n", ++ __func__, ++ ha->host_no);) ++ return 1; ++ } else ++ return 0; ++} ++ ++/* ++* qla2x00_rst_aen ++* Processes asynchronous reset. ++* ++* Input: ++* ha = adapter block pointer. ++*/ ++static void ++qla2x00_rst_aen(scsi_qla_host_t *ha) ++{ ++ ENTER(__func__); ++ ++ if (ha->flags.online && !ha->flags.reset_active && ++ !atomic_read(&ha->loop_down_timer) && ++ !(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) { ++ ++ /* 10/15 ha->flags.reset_active = TRUE; */ ++ do { ++ clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ++ ++ /* ++ * Issue marker command only when we are going to start ++ * the I/O. ++ */ ++ ha->marker_needed = 1; ++ } while (!atomic_read(&ha->loop_down_timer) && ++ (test_bit(RESET_MARKER_NEEDED, &ha->dpc_flags))); ++ ++ /* 10/15 ha->flags.reset_active = FALSE; */ ++ } ++ ++ LEAVE(__func__); ++} ++ ++ ++/* ++ * This routine will alloacte SP from the free queue ++ * input: ++ * scsi_qla_host_t * ++ * output: ++ * srb_t * or NULL ++ */ ++srb_t * ++qla2x00_get_new_sp(scsi_qla_host_t *ha) ++{ ++ srb_t * sp = NULL; ++ ulong flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ if (!list_empty(&ha->free_queue)) { ++ sp = list_entry(ha->free_queue.next, srb_t, list); ++ __del_from_free_queue(ha, sp); ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++ ++ if (sp) { ++#if defined(QL_DEBUG_LEVEL_4) ++ if ((int)atomic_read(&sp->ref_count) != 0) { ++ printk(KERN_WARNING ++ "scsi(%ld): WARNING ref_count not zero!\n", ++ ha->host_no); ++ } ++#endif ++ ++ sp_get(ha, sp); ++ } ++ ++ return (sp); ++} ++ ++/************************************************************************** ++* qla2x00_timer ++* ++* Description: ++* One second timer ++* ++* Context: Interrupt ++***************************************************************************/ ++static void ++qla2x00_timer(scsi_qla_host_t *ha) ++{ ++ int t,l; ++ unsigned long cpu_flags = 0; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ os_lun_t *lq; ++ os_tgt_t *tq; ++ int start_dpc = 0; ++ ++ /* ++ * We try and restart any request in the retry queue every second. ++ */ ++ if (!list_empty(&ha->retry_queue)) { ++ set_bit(PORT_RESTART_NEEDED, &ha->dpc_flags); ++ start_dpc++; ++ } ++ ++ /* ++ * We try and restart any request in the scsi_retry queue every second. ++ */ ++ if (!list_empty(&ha->scsi_retry_queue)) { ++ set_bit(SCSI_RESTART_NEEDED, &ha->dpc_flags); ++ start_dpc++; ++ } ++ ++ /* ++ * We try and failover any request in the failover queue every second. ++ */ ++ if (!list_empty(&ha->failover_queue)) { ++ set_bit(FAILOVER_NEEDED, &ha->dpc_flags); ++ start_dpc++; ++ } ++ ++ /* ++ * Ports - Port down timer. ++ * ++ * Whenever, a port is in the LOST state we start decrementing its port ++ * down timer every second until it reaches zero. Once it reaches zero ++ * the port it marked DEAD. ++ */ ++ t = 0; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (atomic_read(&fcport->state) == FC_DEVICE_LOST) { ++ ++ if (atomic_read(&fcport->port_down_timer) == 0) ++ continue; ++ ++ if (atomic_dec_and_test(&fcport->port_down_timer) != 0) ++ atomic_set(&fcport->state, FC_DEVICE_DEAD); ++ ++ DEBUG(printk("scsi(%ld): fcport-%d - port retry count: " ++ "%d remainning\n", ++ ha->host_no, ++ t, atomic_read(&fcport->port_down_timer))); ++ } ++ t++; ++ } /* End of for fcport */ ++ ++ /* ++ * LUNS - lun suspend timer. ++ * ++ * Whenever, a lun is suspended the timer starts decrementing its ++ * suspend timer every second until it reaches zero. Once it reaches ++ * zero the lun retry count is decremented. ++ */ ++ ++ /* ++ * FIXME(dg) - Need to convert this linear search of luns into a search ++ * of a list of suspended luns. ++ */ ++ for (t = 0; t < ha->max_targets; t++) { ++ if ((tq = ha->otgt[t]) == NULL) ++ continue; ++ ++ for (l = 0; l < ha->max_luns; l++) { ++ if ((lq = (os_lun_t *) tq->olun[l]) == NULL) ++ continue; ++ ++ spin_lock_irqsave(&lq->q_lock, cpu_flags); ++ if (lq->q_state == LUN_STATE_WAIT && ++ atomic_read(&lq->q_timer) != 0) { ++ ++ if (atomic_dec_and_test(&lq->q_timer) != 0) { ++ /* ++ * A delay should immediately ++ * transition to a READY state ++ */ ++ if (test_and_clear_bit(LUN_EXEC_DELAYED, ++ &lq->q_flag)) { ++ lq->q_state = LUN_STATE_READY; ++ } ++ else { ++ lq->q_count++; ++ if (lq->q_count == lq->q_max) ++ lq->q_state = ++ LUN_STATE_TIMEOUT; ++ else ++ lq->q_state = ++ LUN_STATE_RUN; ++ } ++ } ++ DEBUG3(printk("scsi(%ld): lun%d - timer %d, " ++ "count=%d, max=%d, state=%d\n", ++ ha->host_no, ++ l, ++ atomic_read(&lq->q_timer), ++ lq->q_count, lq->q_max, lq->q_state)); ++ } ++ spin_unlock_irqrestore(&lq->q_lock, cpu_flags); ++ } /* End of for luns */ ++ } /* End of for targets */ ++ ++ /* Loop down handler. */ ++ if (atomic_read(&ha->loop_down_timer) > 0 && ++ !(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) && ha->flags.online) { ++ ++ /* dg 10/30 if (atomic_read(&ha->loop_down_timer) == LOOP_DOWN_TIME) { */ ++ if (atomic_read(&ha->loop_down_timer) == ++ ha->loop_down_abort_time ) { ++ ++ DEBUG(printk("scsi(%ld): Loop Down - aborting the " ++ "queues before time expire\n", ++ ha->host_no)); ++ ++ set_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags); ++ start_dpc++; ++ } ++ ++ /* if the loop has been down for 4 minutes, reinit adapter */ ++ if (atomic_dec_and_test(&ha->loop_down_timer) != 0) { ++ DEBUG(printk("scsi(%ld): Loop down exceed 4 mins - " ++ "restarting queues.\n", ++ ha->host_no)); ++ ++ set_bit(RESTART_QUEUES_NEEDED, &ha->dpc_flags); ++ start_dpc++; ++ if (!(ha->device_flags & DFLG_NO_CABLE) && ++ qla2x00_reinit && !ha->flags.failover_enabled) { ++ ++ DEBUG(printk("scsi(%ld): Loop down - " ++ "aborting ISP.\n", ++ ha->host_no)); ++ ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ } ++ } ++ DEBUG3(printk("scsi(%ld): Loop Down - seconds remainning %d\n", ++ ha->host_no, ++ atomic_read(&ha->loop_down_timer))); ++ } ++ ++ /* ++ * Done Q Handler -- dgFIXME This handler will kick off doneq if we ++ * haven't process it in 2 seconds. ++ */ ++ if (!list_empty(&ha->done_queue)) ++ schedule_work(&ha->run_qla_task); ++ ++#if QLA2100_LIPTEST ++ /* ++ * This block is used to periodically schedule isp abort after ++ * qla2x00_lip flag is set. ++ */ ++ ++ /* ++ if (qla2x00_lip && (ha->forceLip++) == (60*2)) { ++ printk("timer: schedule isp abort.\n"); ++ set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); ++ ha->forceLip = 0; ++ } ++ */ ++ ++ /* ++ * This block is used to periodically schedule mailbox cmd timeout ++ * simulation ++ */ ++ if (qla2x00_lip && (ha->forceLip++) == (60*6)) { ++ printk("qla2x00_timer: Going to force mbx timeout\n"); ++ ++ ha->forceLip = 0; ++ mbxtimeout = 1; ++ } ++#endif ++ ++ if (test_bit(FAILOVER_EVENT_NEEDED, &ha->dpc_flags)) { ++ if (ha->failback_delay) { ++ ha->failback_delay--; ++ if (ha->failback_delay == 0) { ++ set_bit(FAILOVER_EVENT, &ha->dpc_flags); ++ clear_bit(FAILOVER_EVENT_NEEDED, ++ &ha->dpc_flags); ++ } ++ } else { ++ set_bit(FAILOVER_EVENT, &ha->dpc_flags); ++ clear_bit(FAILOVER_EVENT_NEEDED, &ha->dpc_flags); ++ } ++ } ++ ++ /* Schedule the DPC routine if needed */ ++ if ((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) || ++ test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) || ++ start_dpc || ++ test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags) || ++ test_bit(FAILOVER_EVENT, &ha->dpc_flags) || ++ test_bit(FAILOVER_NEEDED, &ha->dpc_flags) || ++ test_bit(MAILBOX_CMD_NEEDED, &ha->dpc_flags)) && ++ ha->dpc_wait && !ha->dpc_active ) { ++ ++ up(ha->dpc_wait); ++ } ++ ++ qla2x00_restart_timer(ha, WATCH_INTERVAL); ++} ++ ++/* ++ * qla2x00_extend_timeout ++ * This routine will extend the timeout to the specified value. ++ * ++ * Input: ++ * cmd = SCSI command structure ++ * ++ * Returns: ++ * None. ++ */ ++void ++qla2x00_extend_timeout(Scsi_Cmnd *cmd, int timeout) ++{ ++ srb_t *sp = (srb_t *) CMD_SP(cmd); ++ u_long our_jiffies = (timeout * HZ) + jiffies; ++ ++ sp->ext_history= 0; ++ sp->e_start = jiffies; ++ if (cmd->eh_timeout.function) { ++ mod_timer(&cmd->eh_timeout,our_jiffies); ++ sp->ext_history |= 1; ++ } ++ if (sp->timer.function != NULL) { ++ /* ++ * Our internal timer should timeout before the midlayer has a ++ * chance begin the abort process ++ */ ++ mod_timer(&sp->timer,our_jiffies - (QLA_CMD_TIMER_DELTA * HZ)); ++ ++ sp->ext_history |= 2; ++ } ++} ++ ++/************************************************************************** ++* qla2x00_cmd_timeout ++* ++* Description: ++* Handles the command if it times out in any state. ++* ++* Input: ++* sp - pointer to validate ++* ++* Returns: ++* None. ++* Note:Need to add the support for if( sp->state == SRB_FAILOVER_STATE). ++**************************************************************************/ ++static void ++qla2x00_cmd_timeout(srb_t *sp) ++{ ++ int t, l; ++ int processed; ++ scsi_qla_host_t *vis_ha, *dest_ha; ++ Scsi_Cmnd *cmd; ++ ulong flags; ++#if defined(QL_DEBUG_LEVEL_3) ++ ulong cpu_flags; ++#endif ++ fc_port_t *fcport; ++ ++ cmd = sp->cmd; ++ vis_ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ ++ DEBUG3(printk("cmd_timeout: Entering sp->state = %x\n", sp->state)); ++ ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ fcport = sp->fclun->fcport; ++ dest_ha = sp->ha; ++ ++ /* ++ * If IO is found either in retry Queue ++ * OR in Lun Queue ++ * Return this IO back to host ++ */ ++ spin_lock_irqsave(&vis_ha->list_lock, flags); ++ processed = 0; ++ if (sp->state == SRB_PENDING_STATE) { ++ __del_from_pending_queue(vis_ha, sp); ++ DEBUG2(printk("scsi(%ld): Found in Pending queue pid %ld, " ++ "State = %x., fcport state=%d jiffies=%lx\n", ++ vis_ha->host_no, ++ sp->cmd->serial_number, sp->state, ++ atomic_read(&fcport->state), jiffies)); ++ ++ /* ++ * If FC_DEVICE is marked as dead return the cmd with ++ * DID_NO_CONNECT status. Otherwise set the host_byte to ++ * DID_BUS_BUSY to let the OS retry this cmd. ++ */ ++ if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) { ++ cmd->result = DID_NO_CONNECT << 16; ++ } else { ++ cmd->result = DID_BUS_BUSY << 16; ++ } ++ __add_to_done_queue(vis_ha, sp); ++ processed++; ++ } ++ spin_unlock_irqrestore(&vis_ha->list_lock, flags); ++ ++ if (processed) { ++ schedule_work(&vis_ha->run_qla_task); ++ ++ return; ++ } ++ ++ spin_lock_irqsave(&dest_ha->list_lock, flags); ++ if ((sp->state == SRB_RETRY_STATE) || ++ (sp->state == SRB_SCSI_RETRY_STATE) || ++ (sp->state == SRB_FAILOVER_STATE)) { ++ ++ DEBUG2(printk("scsi(%ld): Found in (Scsi) Retry queue or " ++ "failover Q pid %ld, State = %x., fcport state=%d " ++ "jiffies=%lx retried=%d\n", ++ dest_ha->host_no, ++ sp->cmd->serial_number, sp->state, ++ atomic_read(&fcport->state), ++ jiffies, sp->cmd->retries)); ++ ++ if ((sp->state == SRB_RETRY_STATE)) { ++ __del_from_retry_queue(dest_ha, sp); ++ } else if ((sp->state == SRB_SCSI_RETRY_STATE)) { ++ __del_from_scsi_retry_queue(dest_ha, sp); ++ } else if ((sp->state == SRB_FAILOVER_STATE)) { ++ __del_from_failover_queue(dest_ha, sp); ++ } ++ ++ /* ++ * If FC_DEVICE is marked as dead return the cmd with ++ * DID_NO_CONNECT status. Otherwise set the host_byte to ++ * DID_BUS_BUSY to let the OS retry this cmd. ++ */ ++ if (dest_ha->flags.failover_enabled) { ++ cmd->result = DID_BUS_BUSY << 16; ++ } else { ++ if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) { ++ cmd->result = DID_NO_CONNECT << 16; ++ qla2x00_extend_timeout(cmd, EXTEND_CMD_TIMEOUT); ++ } else { ++ cmd->result = DID_BUS_BUSY << 16; ++ } ++ } ++ ++ __add_to_done_queue(dest_ha, sp); ++ processed++; ++ } ++ spin_unlock_irqrestore(&dest_ha->list_lock, flags); ++ ++ if (processed) { ++ schedule_work(&dest_ha->run_qla_task); ++ ++ return; ++ } ++/* TODO: Remove this code!!! */ ++#if defined(QL_DEBUG_LEVEL_3) ++ spin_lock_irqsave(&dest_ha->list_lock, cpu_flags); ++ if (sp->state == SRB_DONE_STATE) { ++ /* IO in done_q -- leave it */ ++ DEBUG(printk("scsi(%ld): Found in Done queue pid %ld sp=%p.\n", ++ dest_ha->host_no, sp->cmd->serial_number, sp)); ++ } else if (sp->state == SRB_SUSPENDED_STATE) { ++ DEBUG(printk("scsi(%ld): Found SP %p in suspended state " ++ "- pid %d:\n", ++ dest_ha->host_no,sp, ++ (int)sp->cmd->serial_number)); ++ DEBUG(qla2x00_dump_buffer((uint8_t *)sp, sizeof(srb_t));) ++ } else if (sp->state == SRB_ACTIVE_STATE) { ++ /* ++ * IO is with ISP find the command in our active list. ++ */ ++ spin_unlock_irqrestore(&dest_ha->list_lock, cpu_flags); ++ spin_lock_irqsave(&dest_ha->hardware_lock, flags); ++ if (sp == ++ dest_ha->outstanding_cmds[(u_long)CMD_HANDLE(sp->cmd)]) { ++ ++ DEBUG(printk("cmd_timeout: Found in ISP \n");) ++ ++ sp->state = SRB_ACTIVE_TIMEOUT_STATE; ++ spin_unlock_irqrestore(&dest_ha->hardware_lock, flags); ++ } else { ++ spin_unlock_irqrestore(&dest_ha->hardware_lock, flags); ++ printk(KERN_INFO ++ "qla_cmd_timeout: State indicates it is with " ++ "ISP, But not in active array\n"); ++ } ++ spin_lock_irqsave(&dest_ha->list_lock, cpu_flags); /* 01/03 */ ++ } else if (sp->state == SRB_ACTIVE_TIMEOUT_STATE) { ++ DEBUG(printk("qla2100%ld: Found in Active timeout state" ++ "pid %ld, State = %x., \n", ++ dest_ha->host_no, ++ sp->cmd->serial_number, sp->state);) ++ } else { ++ /* EMPTY */ ++ DEBUG2(printk("cmd_timeout%ld: LOST command state = " ++ "0x%x, sp=%p\n", ++ vis_ha->host_no, sp->state,sp);) ++ ++ printk(KERN_INFO ++ "cmd_timeout: LOST command state = 0x%x\n", sp->state); ++ } ++ spin_unlock_irqrestore(&dest_ha->list_lock, cpu_flags); ++#endif ++ ++ DEBUG3(printk("cmd_timeout: Leaving\n");) ++} ++ ++/* ++ * qla2x00_done_work ++ * ++ * This is a task to process completion only similar to a ++ * bottom half handler. ++ * ++ * Input: ++ * p -- pointer to hba struct ++ * ++ */ ++void ++qla2x00_done_work(void *p) ++{ ++ scsi_qla_host_t *ha = (scsi_qla_host_t *) p; ++ ++ ENTER(__func__); ++ ++ set_bit(TASKLET_SCHED, &ha->dpc_flags); ++ ++ if (!list_empty(&ha->done_queue)) ++ qla2x00_done(ha); ++ ++ clear_bit(TASKLET_SCHED, &ha->dpc_flags); ++ ++ LEAVE(__func__); ++} ++ ++ ++/************************************************************************** ++* qla2x00_done ++* Process completed commands. ++* ++* Input: ++* old_ha = adapter block pointer. ++* ++* Returns: ++* int ++**************************************************************************/ ++int ++qla2x00_done(scsi_qla_host_t *old_ha) ++{ ++ os_lun_t *lq; ++ Scsi_Cmnd *cmd; ++ unsigned long flags = 0; ++ scsi_qla_host_t *ha; ++ scsi_qla_host_t *vis_ha; ++ int cnt; ++ int send_marker_once = 0; ++ struct list_head *spl, *sptemp; ++ srb_t *sp; ++ struct list_head local_sp_list; ++ ++ ENTER(__func__); ++ ++ if (test_bit(DONE_RUNNING, &old_ha->dpc_flags)) ++ return (0); ++ ++ set_bit(DONE_RUNNING, &old_ha->dpc_flags); ++ cnt = 0; ++ ++ INIT_LIST_HEAD(&local_sp_list); ++ ++ /* ++ * Get into local queue such that we do not wind up calling done queue ++ * takslet for the same IOs from DPC or any other place. ++ */ ++ spin_lock_irqsave(&old_ha->list_lock,flags); ++ list_for_each_safe(spl, sptemp, &old_ha->done_queue) { ++ sp = list_entry(spl, srb_t, list); ++ ++ /* remove command from done list */ ++ list_del_init(&sp->list); ++ ++ old_ha->done_q_cnt--; ++ sp->state = SRB_NO_QUEUE_STATE; ++ ++ /* add to local queue */ ++ list_add_tail(&sp->list, &local_sp_list); ++ } ++ spin_unlock_irqrestore(&old_ha->list_lock, flags); ++ ++ /* ++ * All done commands are in the local queue, now do the call back. ++ */ ++ list_for_each_safe(spl, sptemp, &local_sp_list) { ++ sp = list_entry(spl, srb_t, list); ++ ++ /* remove command from local list */ ++ list_del_init(&sp->list); ++ ++ cnt++; ++ ++ cmd = sp->cmd; ++ if (cmd == NULL) ++ continue; ++ ++ vis_ha = (scsi_qla_host_t *)cmd->device->host->hostdata; ++ lq = sp->lun_queue; ++ ha = lq->fclun->fcport->ha; ++ ++ if (sp->flags & SRB_DMA_VALID) { ++ sp->flags &= ~SRB_DMA_VALID; ++ ++ /* 4.10 64 and 32 bit */ ++ /* Release memory used for this I/O */ ++ if (cmd->use_sg) { ++ pci_unmap_sg(ha->pdev, ++ cmd->request_buffer, ++ cmd->use_sg, ++ scsi_to_pci_dma_dir( ++ cmd->sc_data_direction)); ++ } else if (cmd->request_bufflen) { ++ pci_unmap_page(ha->pdev, ++ sp->saved_dma_handle, ++ cmd->request_bufflen, ++ scsi_to_pci_dma_dir( ++ cmd->sc_data_direction)); ++ } ++ } ++ ++ if (!(sp->flags & SRB_IOCTL) && ha->flags.failover_enabled) { ++ /* ++ * This routine checks for DID_NO_CONNECT to decide ++ * whether to failover to another path or not. We only ++ * failover on that status. ++ */ ++ if (qla2x00_fo_check(ha,sp)) { ++ if ((sp->state != SRB_FAILOVER_STATE)) { ++ /* ++ * Retry the command on this path ++ * several times before selecting a new ++ * path. ++ */ ++ add_to_pending_queue_head(vis_ha, sp); ++ qla2x00_next(vis_ha); ++ } ++ else { ++ /* we failover this path */ ++ qla2x00_extend_timeout(sp->cmd, ++ EXTEND_CMD_TIMEOUT); ++ } ++ continue; ++ } ++ ++ } ++ ++ switch ((CMD_RESULT(cmd)>>16)) { ++ case DID_OK: ++ case DID_ERROR: ++ break; ++ ++ case DID_RESET: ++ /* ++ * Set marker needed, so we don't have to ++ * send multiple markers ++ */ ++ if (!send_marker_once) { ++ ha->marker_needed = 1; ++ send_marker_once++; ++ } ++ ++ /* ++ * WORKAROUND ++ * ++ * A backdoor device-reset requires different ++ * error handling. This code differentiates ++ * between normal error handling and the ++ * backdoor method. ++ * ++ */ ++ if (ha->host->eh_active != EH_ACTIVE) ++ CMD_RESULT(sp->cmd) = ++ DID_BUS_BUSY << 16; ++ break; ++ ++ ++ case DID_ABORT: ++ sp->flags &= ~SRB_ABORT_PENDING; ++ sp->flags |= SRB_ABORTED; ++ ++ if (sp->flags & SRB_TIMEOUT) ++ CMD_RESULT(cmd)= DID_TIME_OUT << 16; ++ ++ break; ++ ++ default: ++ DEBUG2(printk("scsi(%ld:%d:%d) %s: did_error " ++ "= %d, comp-scsi= 0x%x-0x%x.\n", ++ vis_ha->host_no, ++ SCSI_TCN_32(cmd), ++ SCSI_LUN_32(cmd), ++ __func__, ++ (CMD_RESULT(cmd)>>16), ++ CMD_COMPL_STATUS(cmd), ++ CMD_SCSI_STATUS(cmd))); ++ break; ++ } ++ ++ /* ++ * Call the mid-level driver interrupt handler -- via sp_put() ++ */ ++ sp_put(ha, sp); ++ ++ qla2x00_next(vis_ha); ++ ++ } /* end of while */ ++ clear_bit(DONE_RUNNING, &old_ha->dpc_flags); ++ ++ LEAVE(__func__); ++ ++ return (cnt); ++} ++ ++/* ++ * qla2x00_next ++ * Retrieve and process next job in the LUN queue. ++ * ++ * Input: ++ * tq = SCSI target queue pointer. ++ * lq = SCSI LUN queue pointer. ++ * TGT_LOCK must be already obtained. ++ * ++ * Output: ++ * Releases TGT_LOCK upon exit. ++ * ++ * Context: ++ * Kernel/Interrupt context. ++ * ++ * Note: This routine will always try to start I/O from visible HBA. ++ */ ++void ++qla2x00_next(scsi_qla_host_t *vis_ha) ++{ ++ scsi_qla_host_t *dest_ha; ++ fc_port_t *fcport; ++ srb_t *sp; ++ int rval; ++ unsigned long flags; ++ ++ ENTER(__func__); ++ ++ spin_lock_irqsave(&vis_ha->list_lock, flags); ++ while (!list_empty(&vis_ha->pending_queue)) { ++ sp = list_entry(vis_ha->pending_queue.next, srb_t, list); ++ ++ fcport = sp->fclun->fcport; ++ dest_ha = fcport->ha; ++ ++ /* Check if command can be started, exit if not. */ ++ if (LOOP_TRANSITION(dest_ha)) { ++ break; ++ } ++ ++ __del_from_pending_queue(vis_ha, sp); ++ ++ /* If device is dead then send request back to OS */ ++ if ((dest_ha->flags.link_down_error_enable && ++ atomic_read(&fcport->state) == FC_DEVICE_DEAD)) { ++ ++ CMD_RESULT(sp->cmd) = DID_NO_CONNECT << 16; ++ ++ if (!atomic_read(&dest_ha->loop_down_timer) && ++ dest_ha->loop_state == LOOP_DOWN) { ++ sp->err_id = 2; ++ } else { ++ sp->err_id = 1; ++ } ++ DEBUG3(printk("scsi(%ld): loop/port is down - " ++ "pid=%ld, sp=%p loopid=0x%x queued to dest HBA " ++ "scsi%ld.\n", ++ dest_ha->host_no, ++ sp->cmd->serial_number, sp, ++ fcport->loop_id, dest_ha->host_no)); ++ /* ++ * Initiate a failover - done routine will initiate. ++ */ ++ __add_to_done_queue(vis_ha, sp); ++ ++ continue; ++ } ++ ++ /* ++ * SCSI Kluge: Whenever, we need to wait for an event such as ++ * loop down (i.e. loop_down_timer ) or port down (i.e. LUN ++ * request qeueue is suspended) then we will recycle new ++ * commands back to the SCSI layer. We do this because this is ++ * normally a temporary condition and we don't want the ++ * mid-level scsi.c driver to get upset and start aborting ++ * commands. The timeout value is extracted from the command ++ * minus 1-second and put on a retry queue (watchdog). Once the ++ * command timeout it is returned to the mid-level with a BUSY ++ * status, so the mid-level will retry it. This process ++ * continues until the LOOP DOWN time expires or the condition ++ * goes away. ++ */ ++ if (!(sp->flags & SRB_IOCTL) && ++ (atomic_read(&fcport->state) != FC_ONLINE || ++ test_bit(ABORT_ISP_ACTIVE, &dest_ha->dpc_flags) || ++ (dest_ha->loop_state != LOOP_READY) || ++ (sp->flags & SRB_FAILOVER))) { ++ ++ DEBUG3(printk("scsi(%ld): port=(0x%x) retry_q(%d) " ++ "loop state = %d, loop counter = 0x%x dpc flags " ++ "= 0x%lx\n", ++ dest_ha->host_no, ++ fcport->loop_id, ++ atomic_read(&fcport->state), ++ dest_ha->loop_state, ++ atomic_read(&dest_ha->loop_down_timer), ++ dest_ha->dpc_flags)); ++ ++ qla2x00_extend_timeout(sp->cmd, EXTEND_CMD_TIMEOUT); ++ __add_to_retry_queue(vis_ha, sp); ++ ++ continue; ++ } ++ ++ /* ++ * If this request's lun is suspended then put the request on ++ * the scsi_retry queue. ++ */ ++ if (!(sp->flags & SRB_IOCTL) && ++ sp->lun_queue->q_state == LUN_STATE_WAIT) { ++ DEBUG3(printk("scsi(%ld): lun wait state - pid=%ld, " ++ "opcode=%d, allowed=%d, retries=%d\n", ++ dest_ha->host_no, ++ sp->cmd->serial_number, ++ sp->cmd->cmnd[0], ++ sp->cmd->allowed, ++ sp->cmd->retries)); ++ ++ __add_to_scsi_retry_queue(vis_ha, sp); ++ ++ continue; ++ } ++ ++ sp->lun_queue->io_cnt++; ++ ++ /* Release target queue lock */ ++ spin_unlock_irqrestore(&vis_ha->list_lock, flags); ++ ++ rval = qla2x00_start_scsi(sp); ++ ++ spin_lock_irqsave(&vis_ha->list_lock, flags); ++ ++ if (rval != QLA2X00_SUCCESS) { ++ /* Place request back on top of device queue */ ++ /* add to the top of queue */ ++ __add_to_pending_queue_head(vis_ha, sp); ++ ++ sp->lun_queue->io_cnt--; ++ break; ++ } ++ } ++ spin_unlock_irqrestore(&vis_ha->list_lock, flags); ++ ++ LEAVE(__func__); ++} ++ ++/* ++ * qla2x00_flush_failover_queue ++ * Return cmds of a "specific" LUN from the failover queue with ++ * DID_BUS_BUSY status. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * q = lun queue. ++ * ++ * Context: ++ * Interrupt context. ++ */ ++void ++qla2x00_flush_failover_q(scsi_qla_host_t *ha, os_lun_t *q) ++{ ++ srb_t *sp; ++ struct list_head *list, *temp; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ list_for_each_safe(list, temp, &ha->failover_queue) { ++ sp = list_entry(list, srb_t, list); ++ /* ++ * If request originated from the same lun_q then delete it ++ * from the failover queue ++ */ ++ if (q == sp->lun_queue) { ++ /* Remove srb from failover queue. */ ++ __del_from_failover_queue(ha,sp); ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ CMD_HANDLE(sp->cmd) = (unsigned char *) NULL; ++ __add_to_done_queue(ha, sp); ++ } ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++ ++/* ++ * qla2x00_reset_lun_fo_counts ++ * Reset failover retry counts ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Interrupt context. ++ */ ++void ++qla2x00_reset_lun_fo_counts(scsi_qla_host_t *ha, os_lun_t *lq) ++{ ++ srb_t *tsp; ++ os_lun_t *orig_lq; ++ struct list_head *list; ++ unsigned long flags ; ++ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ /* ++ * the pending queue. ++ */ ++ list_for_each(list,&ha->pending_queue) { ++ tsp = list_entry(list, srb_t, list); ++ orig_lq = tsp->lun_queue; ++ if (orig_lq == lq) ++ tsp->fo_retry_cnt = 0; ++ } ++ /* ++ * the retry queue. ++ */ ++ list_for_each(list,&ha->retry_queue) { ++ tsp = list_entry(list, srb_t, list); ++ orig_lq = tsp->lun_queue; ++ if (orig_lq == lq) ++ tsp->fo_retry_cnt = 0; ++ } ++ ++ /* ++ * the done queue. ++ */ ++ list_for_each(list, &ha->done_queue) { ++ tsp = list_entry(list, srb_t, list); ++ orig_lq = tsp->lun_queue; ++ if (orig_lq == lq) ++ tsp->fo_retry_cnt = 0; ++ } ++ spin_unlock_irqrestore(&ha->list_lock, flags); ++} ++ ++/* ++ * qla2x00_failover_cleanup ++ * Cleanup queues after a failover. ++ * ++ * Input: ++ * sp = command pointer ++ * ++ * Context: ++ * Interrupt context. ++ */ ++static void ++qla2x00_failover_cleanup(srb_t *sp) ++{ ++ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; ++ CMD_HANDLE(sp->cmd) = (unsigned char *) NULL; ++ ++ /* turn-off all failover flags */ ++ sp->flags = sp->flags & ~(SRB_RETRY|SRB_FAILOVER|SRB_FO_CANCEL); ++} ++ ++ ++/* ++ * qla2x00_process_failover ++ * Process any command on the failover queue. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ++ * Context: ++ * Interrupt context. ++ */ ++static void ++qla2x00_process_failover(scsi_qla_host_t *ha) ++{ ++ ++ os_tgt_t *tq; ++ os_lun_t *lq; ++ srb_t *sp; ++ fc_port_t *fcport; ++ struct list_head *list, *temp; ++ unsigned long flags; ++ uint32_t t, l; ++ scsi_qla_host_t *vis_ha = NULL; ++ ++ DEBUG(printk("scsi(%ld): Processing failover for hba.\n", ha->host_no)); ++ ++ /* ++ * Process all the commands in the failover queue. Attempt to failover ++ * then either complete the command as is or requeue for retry. ++ */ ++ ++ /* Prevent or allow acceptance of new I/O requests. */ ++ spin_lock_irqsave(&ha->list_lock, flags); ++ ++ /* ++ * Get first entry to find our visible adapter. We could never get ++ * here if the list is empty ++ */ ++ list = ha->failover_queue.next; ++ sp = list_entry(list, srb_t, list); ++ vis_ha = (scsi_qla_host_t *) sp->cmd->device->host->hostdata; ++ list_for_each_safe(list, temp, &ha->failover_queue) { ++ sp = list_entry(list, srb_t, list); ++ ++ tq = sp->tgt_queue; ++ lq = sp->lun_queue; ++ fcport = lq->fclun->fcport; ++ ++ /* Remove srb from failover queue. */ ++ __del_from_failover_queue(ha, sp); ++ ++ DEBUG2(printk("%s(): pid %ld retrycnt=%d\n", ++ __func__, sp->cmd->serial_number, sp->cmd->retries)); ++ ++ /*** Select an alternate path ***/ ++ /* ++ * If the path has already been change by a previous request ++ * sp->fclun != lq->fclun ++ */ ++ if (sp->fclun != lq->fclun || ++ atomic_read(&fcport->state) != FC_DEVICE_DEAD) { ++ ++ qla2x00_failover_cleanup(sp); ++ ++ } else if (qla2x00_cfg_failover(ha, ++ lq->fclun, tq, sp) == NULL) { ++ ++ /* ++ * We ran out of paths, so just post the status which ++ * is already set in the cmd. ++ */ ++ printk(KERN_INFO ++ "scsi(%ld): Ran out of paths - pid %ld\n", ++ ha->host_no, sp->cmd->serial_number); ++ } else { ++ qla2x00_failover_cleanup(sp); ++ ++ } ++ __add_to_done_queue(ha, sp); ++ } /* list_for_each_safe */ ++ spin_unlock_irqrestore(&ha->list_lock,flags); ++ ++ for (t = 0; t < vis_ha->max_targets; t++) { ++ if ((tq = vis_ha->otgt[t]) == NULL) ++ continue; ++ for (l = 0; l < vis_ha->max_luns; l++) { ++ if ((lq = (os_lun_t *) tq->olun[l]) == NULL) ++ continue; ++ ++ if( test_and_clear_bit(LUN_MPIO_BUSY, &lq->q_flag) ) { ++ /* EMPTY */ ++ DEBUG(printk("scsi(%ld): remove suspend for " ++ "lun %d\n", ha->host_no, lq->fclun->lun)); ++ } ++ } ++ } ++ ++ //qla2x00_restart_queues(ha,TRUE); ++ qla2x00_restart_queues(ha, FALSE); ++ ++ DEBUG(printk("%s() - done", __func__)); ++} ++ ++/************************************************************************** ++* qla2x00_check_tgt_status ++* ++* Description: ++* Checks to see if the target or loop is down. ++* ++* Input: ++* cmd - pointer to Scsi cmd structure ++* ++* Returns: ++* 1 - if target is present ++* 0 - if target is not present ++* ++**************************************************************************/ ++uint8_t ++qla2x00_check_tgt_status(scsi_qla_host_t *ha, Scsi_Cmnd *cmd) ++{ ++ os_lun_t *lq; ++ uint32_t b, t, l; ++ fc_port_t *fcport; ++ ++ /* Generate LU queue on bus, target, LUN */ ++ b = SCSI_BUS_32(cmd); ++ t = SCSI_TCN_32(cmd); ++ l = SCSI_LUN_32(cmd); ++ ++ if ((lq = GET_LU_Q(ha,t,l)) == NULL) { ++ return(QL_STATUS_ERROR); ++ } ++ ++ fcport = lq->fclun->fcport; ++ ++ if (TGT_Q(ha, t) == NULL || ++ l >= ha->max_luns || ++ (atomic_read(&fcport->state) == FC_DEVICE_DEAD) || ++ (!atomic_read(&ha->loop_down_timer) && ++ ha->loop_state == LOOP_DOWN) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE || ++ ha->loop_state != LOOP_READY) { ++ ++ DEBUG(printk(KERN_INFO ++ "scsi(%ld:%2d:%2d:%2d): %s connection is down\n", ++ ha->host_no, ++ b, t, l, ++ __func__)); ++ ++ CMD_RESULT(cmd) = DID_NO_CONNECT << 16; ++ return(QL_STATUS_ERROR); ++ } ++ return (QL_STATUS_SUCCESS); ++} ++ ++/************************************************************************** ++* qla2x00_check_port_status ++* ++* Description: ++* Checks to see if the port or loop is down. ++* ++* Input: ++* fcport - pointer to fc_port_t structure. ++* ++* Returns: ++* 1 - if port is present ++* 0 - if port is not present ++* ++**************************************************************************/ ++uint8_t ++qla2x00_check_port_status(scsi_qla_host_t *ha, fc_port_t *fcport) ++{ ++ uint32_t port_state; ++ ++ if (fcport == NULL) { ++ return(QL_STATUS_ERROR); ++ } ++ ++ port_state = (uint32_t)atomic_read(&fcport->state); ++ if ((port_state != FC_ONLINE) || ++ (port_state == FC_DEVICE_DEAD) || ++ (!atomic_read(&ha->loop_down_timer) && ++ ha->loop_state == LOOP_DOWN) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ ABORTS_ACTIVE || ha->loop_state != LOOP_READY) { ++ ++ DEBUG(printk(KERN_INFO ++ "scsi(%ld): Connection is down. fcport=%p.\n", ++ ha->host_no, fcport)); ++ ++ return (QL_STATUS_ERROR); ++ } ++ ++ return (QL_STATUS_SUCCESS); ++} ++ ++/****************************************************************************/ ++/* Create character driver "HbaApiDev" w dynamically allocated major number */ ++/* and create "/proc/scsi/qla2x00/HbaApiNode" as the device node associated */ ++/* with the major number. */ ++/****************************************************************************/ ++ ++#define APIDEV_NODE "HbaApiNode" ++#define APIDEV_NAME "HbaApiDev" ++ ++static int apidev_major = 0; ++static struct Scsi_Host *apidev_host = 0; ++ ++static struct file_operations apidev_fops = { ++ .ioctl = apidev_ioctl, ++ .open = apidev_open, ++ .release = apidev_close, ++}; ++ ++static int ++apidev_init(struct Scsi_Host *host) ++{ ++ if (apidev_host) ++ return (0); ++ ++ apidev_major = register_chrdev(0, APIDEV_NAME, &apidev_fops); ++ if (0 > apidev_major) { ++ DEBUG(printk("%s(): register_chrdev rc=%d\n", ++ __func__, apidev_major)); ++ ++ return (apidev_major); ++ } ++ ++ apidev_host = host; ++ ++ DEBUG(printk("%s(): Creating (%s) %s/%s major=%d\n", ++ __func__, ++ host->hostt->proc_name, host->hostt->proc_dir->name, ++ APIDEV_NODE, apidev_major)); ++ ++ proc_mknod(APIDEV_NODE, 0777+S_IFCHR, host->hostt->proc_dir, ++ (kdev_t)mk_kdev(apidev_major, 0)); ++ ++ return 0; ++} ++ ++static int apidev_cleanup() ++{ ++ if (!apidev_host) ++ return (0); ++ ++ unregister_chrdev(apidev_major,APIDEV_NAME); ++ remove_proc_entry(APIDEV_NODE,apidev_host->hostt->proc_dir); ++ apidev_host = 0; ++ ++ return (0); ++} ++ ++static int ++apidev_open(struct inode *inode, struct file *file) ++{ ++ DEBUG9(printk(KERN_INFO ++ "%s(): open MAJOR number = %d, MINOR number = %d\n", ++ __func__, major(inode->i_rdev), minor(inode->i_rdev))); ++ ++ return 0; ++} ++ ++static int ++apidev_close(struct inode *inode, struct file *file) ++{ ++ DEBUG9(printk(KERN_INFO ++ "%s(): closed\n", __func__)); ++ ++ return 0; ++} ++ ++static int ++apidev_ioctl(struct inode *inode, ++ struct file *fp, unsigned int cmd, unsigned long arg) ++{ ++ /* ++ * Since this var is not really used, use static type to conserve ++ * stack space. ++ */ ++ static Scsi_Device dummy_scsi_device; ++ ++ dummy_scsi_device.host = apidev_host; ++ ++ return (qla2x00_ioctl(&dummy_scsi_device, (int)cmd, (void*)arg)); ++} ++ ++#define driver_template qla2x00_driver_template ++#include "scsi_module.c" +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_os.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,156 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * Portions (C) Arjan van de Ven for Red Hat, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++#ifndef __QLA_OS_H ++#define __QLA_OS_H ++ ++/* ++ * Driver debug definitions. ++ */ ++/* #define QL_DEBUG_LEVEL_1 */ /* Output register accesses to COM1 */ ++/* #define QL_DEBUG_LEVEL_2 */ /* Output error msgs to COM1 */ ++/* #define QL_DEBUG_LEVEL_3 */ /* Output function trace msgs to COM1 */ ++/* #define QL_DEBUG_LEVEL_4 */ /* Output NVRAM trace msgs to COM1 */ ++/* #define QL_DEBUG_LEVEL_5 */ /* Output ring trace msgs to COM1 */ ++/* #define QL_DEBUG_LEVEL_6 */ /* Output WATCHDOG timer trace to COM1 */ ++/* #define QL_DEBUG_LEVEL_7 */ /* Output RISC load trace msgs to COM1 */ ++/* #define QL_DEBUG_LEVEL_8 */ /* Output ring saturation msgs to COM1 */ ++/* #define QL_DEBUG_LEVEL_9 */ /* Output IOCTL trace msgs */ ++/* #define QL_DEBUG_LEVEL_10 */ /* Output IOCTL error msgs */ ++/* #define QL_DEBUG_LEVEL_11 */ /* Output Mbx Cmd trace msgs */ ++/* #define QL_DEBUG_LEVEL_12 */ /* Output IP trace msgs */ ++/* ++ * Local Macro Definitions. ++ */ ++#if defined(QL_DEBUG_LEVEL_1) || defined(QL_DEBUG_LEVEL_2) || \ ++ defined(QL_DEBUG_LEVEL_3) || defined(QL_DEBUG_LEVEL_4) || \ ++ defined(QL_DEBUG_LEVEL_5) || defined(QL_DEBUG_LEVEL_6) || \ ++ defined(QL_DEBUG_LEVEL_7) || defined(QL_DEBUG_LEVEL_8) || \ ++ defined(QL_DEBUG_LEVEL_9) || defined(QL_DEBUG_LEVEL_10) || \ ++ defined(QL_DEBUG_LEVEL_11) || defined(QL_DEBUG_LEVEL_12) ++ #define QL_DEBUG_ROUTINES ++#endif ++ ++#include ++#ifndef QLA_MODVERSION ++#define __NO_VERSION__ ++#endif ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#define __KERNEL_SYSCALLS__ ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include "scsi.h" ++#include "hosts.h" ++ ++#if defined(FC_IP_SUPPORT) ++#include ++#include ++#include ++#endif ++ ++#include ++#include ++#include ++ ++//TODO Fix this!!! ++/* ++* String arrays ++*/ ++#define LINESIZE 256 ++#define MAXARGS 26 ++ ++/* PCI interface definitions */ ++struct qla_fw_info { ++ unsigned short addressing; /* addressing method used to load fw */ ++#define FW_INFO_ADDR_NORMAL 0 ++#define FW_INFO_ADDR_EXTENDED 1 ++#define FW_INFO_ADDR_NOMORE 0xffff ++ unsigned short *fwcode; /* pointer to FW array */ ++ unsigned short *fwlen; /* number of words in array */ ++ unsigned short *fwstart; /* start address for F/W */ ++ unsigned long *lfwstart; /* start address (long) for F/W */ ++}; ++struct qla_board_info { ++ char name[9]; /* Board ID String */ ++ struct qla_fw_info *fwinfo; ++}; ++ ++/*********************************************************************** ++* We use the Scsi_Pointer structure that's included with each command ++* SCSI_Cmnd as a scratchpad. ++* ++* SCp is defined as follows: ++* - SCp.ptr -- > pointer to the SRB ++* - SCp.this_residual -- > HBA completion status for ioctl code. ++* ++* Cmnd->host_scribble --> Used to hold the hba actived handle (1..255). ++***********************************************************************/ ++#define CMD_SP(Cmnd) ((Cmnd)->SCp.ptr) ++#define CMD_COMPL_STATUS(Cmnd) ((Cmnd)->SCp.this_residual) ++#define CMD_HANDLE(Cmnd) ((Cmnd)->host_scribble) ++/* Additional fields used by ioctl passthru */ ++#define CMD_RESID_LEN(Cmnd) ((Cmnd)->SCp.buffers_residual) ++#define CMD_SCSI_STATUS(Cmnd) ((Cmnd)->SCp.Status) ++#define CMD_ACTUAL_SNSLEN(Cmnd) ((Cmnd)->SCp.Message) ++#define CMD_ENTRY_STATUS(Cmnd) ((Cmnd)->SCp.have_data_in) ++ ++/* ++ * Other SCS__Cmnd members we only reference ++ */ ++#define CMD_XFRLEN(Cmnd) (Cmnd)->request_bufflen ++#define CMD_CDBLEN(Cmnd) (Cmnd)->cmd_len ++#define CMD_CDBP(Cmnd) (Cmnd)->cmnd ++#define CMD_SNSP(Cmnd) (Cmnd)->sense_buffer ++#define CMD_SNSLEN(Cmnd) (sizeof (Cmnd)->sense_buffer) ++#define CMD_RESULT(Cmnd) ((Cmnd)->result) ++#define CMD_TIMEOUT(Cmnd) ((Cmnd)->timeout_per_command) ++ ++#define SCSI_BUS_32(scp) ((scp)->device->channel) ++#define SCSI_TCN_32(scp) ((scp)->device->id) ++#define SCSI_LUN_32(scp) ((scp)->device->lun) ++ ++#endif +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_settings.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,80 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++/* ++ * Compile time Options: ++ * 0 - Disable and 1 - Enable ++ */ ++#define MEMORY_MAPPED_IO 0 ++#define STOP_ON_ERROR 0 /* Stop on aborts and resets */ ++#define STOP_ON_RESET 0 ++#define STOP_ON_ABORT 0 ++#define QLA_SCSI_VENDOR_DIR 0 /* Decode vendor specific opcodes for direction */ ++#define QLA2100_LIPTEST 0 ++#define REQ_TRACE 1 ++#define USE_ABORT_TGT 1 /* Use Abort Target mbx cmd */ ++ ++#define DEBUG_QLA2100 0 /* For Debug of qla2x00 */ ++ ++#define MPIO_SUPPORT 0 ++#define VSA 0 /* Volume Set Addressing */ ++ ++/* ++ * When a lun is suspended for the "Not Ready" condition ++ * then it will suspend the lun for increments of 6 sec delays. ++ * SUSPEND_COUNT is that count. ++ */ ++#define SUSPEND_COUNT 10 /* 6 secs * 10 retries = 60 secs */ ++ ++/* Failover options */ ++#define MAX_RECOVERYTIME 10 /* Max suspend time for a lun recovery time */ ++#define MAX_FAILBACKTIME 5 /* (60) Max suspend time before failing back */ ++ ++#define QLA_CMD_TIMER_DELTA 3 ++ ++#define MAX_RETRIES_OF_ISP_ABORT 5 /* */ ++ ++/* ++ * Defines the time in seconds that ++ * the driver extends the command timeout ++ * to get around the problem where the ++ * mid-layer only allows 5 retries for commands ++ * that return BUS_BUSY ++ */ ++#define EXTEND_CMD_TIMEOUT 60 ++ ++/* ++ * We need to hardcode this value since the firmware ++ * does not allow us to retrieve the maximum number of ++ * IOCBs available during initializtion. ++ * ++ * Factors that affect this value include the amount of ++ * memory on-board (HBA) and firmware IP support. ++ * ++ */ ++#undef IOCB_THROTTLE_USAGE ++#undef IOCB_HIT_RATE ++#define MAX_IOCBS_AVAILBALE 3000 ++ ++/* ++ * Some vendor subsystems do not recover properly after a device reset. Define ++ * the following to force a logout after a successful device reset. ++ */ ++#undef LOGOUT_AFTER_DEVICE_RESET ++ ++#include "qla_version.h" +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_sup.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,560 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++static uint16_t qla2x00_nvram_request(scsi_qla_host_t *, uint32_t); ++ ++static void qla2x00_flash_enable(scsi_qla_host_t *); ++static void qla2x00_flash_disable(scsi_qla_host_t *); ++ ++uint8_t qla2x00_read_flash_byte(scsi_qla_host_t *, uint32_t); ++static void qla2x00_write_flash_byte(scsi_qla_host_t *, uint32_t, uint8_t); ++static uint8_t qla2x00_poll_flash(scsi_qla_host_t *ha, ++ uint32_t addr, uint8_t poll_data, uint8_t mid); ++static uint8_t qla2x00_program_flash_address(scsi_qla_host_t *ha, ++ uint32_t addr, uint8_t data, uint8_t mid); ++static uint8_t qla2x00_erase_flash_sector(scsi_qla_host_t *ha, ++ uint32_t addr, uint32_t sec_mask, uint8_t mid); ++ ++uint8_t qla2x00_get_flash_manufacturer(scsi_qla_host_t *ha); ++uint16_t qla2x00_get_flash_version(scsi_qla_host_t *); ++uint16_t qla2x00_get_flash_image(scsi_qla_host_t *ha, uint8_t *image); ++uint16_t qla2x00_set_flash_image(scsi_qla_host_t *ha, uint8_t *image); ++ ++ ++/* ++ * NVRAM support routines ++ */ ++ ++/** ++ * qla2x00_get_nvram_word() - Calculates word position in NVRAM and calls the ++ * request routine to get the word from NVRAM. ++ * @ha: HA context ++ * @addr: Address in NVRAM to read ++ * ++ * Returns the word read from nvram @addr. ++ */ ++uint16_t ++qla2x00_get_nvram_word(scsi_qla_host_t *ha, uint32_t addr) ++{ ++ uint16_t data; ++ uint32_t nv_cmd; ++ ++ ENTER(__func__); ++ ++ nv_cmd = addr << 16; ++ nv_cmd |= NV_READ_OP; ++ data = qla2x00_nvram_request(ha, nv_cmd); ++ ++ DEBUG4(printk("%s(%ld): NVRAM[%lx]=%lx.\n", ++ __func__, ha->host_no, (u_long)addr, (u_long)data)); ++ ++ LEAVE(__func__); ++ ++ return (data); ++} ++ ++/** ++ * qla2x00_nvram_request() - Sends read command to NVRAM and gets data from ++ * NVRAM. ++ * @ha: HA context ++ * @nv_cmd: NVRAM command ++ * ++ * Bit definitions for NVRAM command: ++ * ++ * Bit 26 = start bit ++ * Bit 25, 24 = opcode ++ * Bit 23-16 = address ++ * Bit 15-0 = write data ++ * ++ * Returns the word read from nvram @addr. ++ */ ++static uint16_t ++qla2x00_nvram_request(scsi_qla_host_t *ha, uint32_t nv_cmd) ++{ ++ uint8_t cnt; ++ device_reg_t *reg = ha->iobase; ++ uint16_t data = 0; ++ uint16_t reg_data; ++ ++ /* Send command to NVRAM. */ ++ nv_cmd <<= 5; ++ for (cnt = 0; cnt < 11; cnt++) { ++ if (nv_cmd & BIT_31) ++ qla2x00_nv_write(ha, NVR_DATA_OUT); ++ else ++ qla2x00_nv_write(ha, 0); ++ nv_cmd <<= 1; ++ } ++ ++ /* Read data from NVRAM. */ ++ for (cnt = 0; cnt < 16; cnt++) { ++ WRT_REG_WORD(®->nvram, NVR_SELECT | NVR_CLOCK); ++ NVRAM_DELAY(); ++ data <<= 1; ++ reg_data = RD_REG_WORD(®->nvram); ++ if (reg_data & NVR_DATA_IN) ++ data |= BIT_0; ++ WRT_REG_WORD(®->nvram, NVR_SELECT); ++ NVRAM_DELAY(); ++ } ++ ++ /* Deselect chip. */ ++ WRT_REG_WORD(®->nvram, NVR_DESELECT); ++ NVRAM_DELAY(); ++ ++ return (data); ++} ++ ++/** ++ * qla2x00_nv_write() - Clean NVRAM operations. ++ * @ha: HA context ++ */ ++void ++qla2x00_nv_deselect(scsi_qla_host_t *ha) ++{ ++ device_reg_t *reg = ha->iobase; ++ ++ WRT_REG_WORD(®->nvram, NVR_DESELECT); ++ NVRAM_DELAY(); ++} ++ ++/** ++ * qla2x00_nv_write() - Prepare for NVRAM read/write operation. ++ * @ha: HA context ++ * @data: Serial interface selector ++ */ ++void ++qla2x00_nv_write(scsi_qla_host_t *ha, uint16_t data) ++{ ++ device_reg_t *reg = ha->iobase; ++ ++ WRT_REG_WORD(®->nvram, data | NVR_SELECT); ++ NVRAM_DELAY(); ++ WRT_REG_WORD(®->nvram, data | NVR_SELECT | NVR_CLOCK); ++ NVRAM_DELAY(); ++ WRT_REG_WORD(®->nvram, data | NVR_SELECT); ++ NVRAM_DELAY(); ++} ++ ++/* ++ * Flash support routines ++ */ ++ ++/** ++ * qla2x00_flash_enable() - Setup flash for reading and writing. ++ * @ha: HA context ++ */ ++static void ++qla2x00_flash_enable(scsi_qla_host_t *ha) ++{ ++ uint16_t data; ++ device_reg_t *reg = ha->iobase; ++ ++ data = RD_REG_WORD(®->ctrl_status); ++ data |= CSR_FLASH_ENABLE; ++ WRT_REG_WORD(®->ctrl_status, data); ++} ++ ++/** ++ * qla2x00_flash_disable() - Disable flash and allow RISC to run. ++ * @ha: HA context ++ */ ++static void ++qla2x00_flash_disable(scsi_qla_host_t *ha) ++{ ++ uint16_t data; ++ device_reg_t *reg = ha->iobase; ++ ++ data = RD_REG_WORD(®->ctrl_status); ++ data &= ~(CSR_FLASH_ENABLE); ++ WRT_REG_WORD(®->ctrl_status, data); ++} ++ ++/** ++ * qla2x00_read_flash_byte() - Reads a byte from flash ++ * @ha: HA context ++ * @addr: Address in flash to read ++ * ++ * A word is read from the chip, but, only the lower byte is valid. ++ * ++ * Returns the byte read from flash @addr. ++ */ ++uint8_t ++qla2x00_read_flash_byte(scsi_qla_host_t *ha, uint32_t addr) ++{ ++ uint16_t data; ++ uint16_t bank_select; ++ device_reg_t *reg = ha->iobase; ++ ++ /* Setup bit 16 of flash address. */ ++ bank_select = RD_REG_WORD(®->ctrl_status); ++ if ((addr & BIT_16) && ((bank_select & CSR_FLASH_64K_BANK) == 0)) { ++ bank_select |= CSR_FLASH_64K_BANK; ++ WRT_REG_WORD(®->ctrl_status, bank_select); ++ } else if (((addr & BIT_16) == 0) && ++ (bank_select & CSR_FLASH_64K_BANK)) { ++ bank_select &= ~(CSR_FLASH_64K_BANK); ++ WRT_REG_WORD(®->ctrl_status, bank_select); ++ } ++ WRT_REG_WORD(®->flash_address, (uint16_t)addr); ++ data = qla2x00_debounce_register(®->flash_data); ++ ++ return ((uint8_t)data); ++} ++ ++/** ++ * qla2x00_write_flash_byte() - Write a byte to flash ++ * @ha: HA context ++ * @addr: Address in flash to write ++ * @data: Data to write ++ */ ++static void ++qla2x00_write_flash_byte(scsi_qla_host_t *ha, uint32_t addr, uint8_t data) ++{ ++ uint16_t bank_select; ++ device_reg_t *reg = ha->iobase; ++ ++ /* Setup bit 16 of flash address. */ ++ bank_select = RD_REG_WORD(®->ctrl_status); ++ if ((addr & BIT_16) && ((bank_select & CSR_FLASH_64K_BANK) == 0)) { ++ bank_select |= CSR_FLASH_64K_BANK; ++ WRT_REG_WORD(®->ctrl_status, bank_select); ++ } else if (((addr & BIT_16) == 0) && ++ (bank_select & CSR_FLASH_64K_BANK)) { ++ bank_select &= ~(CSR_FLASH_64K_BANK); ++ WRT_REG_WORD(®->ctrl_status, bank_select); ++ } ++ WRT_REG_WORD(®->flash_address, (uint16_t)addr); ++ WRT_REG_WORD(®->flash_data, (uint16_t)data); ++} ++ ++/** ++ * qla2x00_poll_flash() - Polls flash for completion. ++ * @ha: HA context ++ * @addr: Address in flash to poll ++ * @poll_data: Data to be polled ++ * @mid: Flash manufacturer ID ++ * ++ * This function polls the device until bit 7 of what is read matches data ++ * bit 7 or until data bit 5 becomes a 1. If that hapens, the flash ROM timed ++ * out (a fatal error). The flash book recommeds reading bit 7 again after ++ * reading bit 5 as a 1. ++ * ++ * Returns 0 on success, else non-zero. ++ */ ++static uint8_t ++qla2x00_poll_flash(scsi_qla_host_t *ha, ++ uint32_t addr, uint8_t poll_data, uint8_t mid) ++{ ++ uint8_t status; ++ uint8_t flash_data; ++ uint32_t cnt; ++ int failed_pass; ++ ++ status = 1; ++ failed_pass = 1; ++ ++ /* Wait for 30 seconds for command to finish. */ ++ poll_data &= BIT_7; ++ for (cnt = 3000000; cnt; cnt--) { ++ flash_data = qla2x00_read_flash_byte(ha, addr); ++ if ((flash_data & BIT_7) == poll_data) { ++ status = 0; ++ break; ++ } ++ ++ if (mid != 0x40 && mid != 0xda) { ++ if (flash_data & BIT_5) ++ failed_pass--; ++ if (failed_pass < 0) ++ break; ++ } ++ udelay(10); ++ barrier(); ++ } ++ return (status); ++} ++ ++/** ++ * qla2x00_program_flash_address() - Programs a flash address ++ * @ha: HA context ++ * @addr: Address in flash to program ++ * @data: Data to be written in flash ++ * @mid: Flash manufacturer ID ++ * ++ * Returns 0 on success, else non-zero. ++ */ ++static uint8_t ++qla2x00_program_flash_address(scsi_qla_host_t *ha, ++ uint32_t addr, uint8_t data, uint8_t mid) ++{ ++ /* Write Program Command Sequence */ ++ qla2x00_write_flash_byte(ha, 0x5555, 0xaa); ++ qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); ++ qla2x00_write_flash_byte(ha, 0x5555, 0xa0); ++ qla2x00_write_flash_byte(ha, addr, data); ++ ++ /* Wait for write to complete. */ ++ return (qla2x00_poll_flash(ha, addr, data, mid)); ++} ++ ++/** ++ * qla2x00_erase_flash_sector() - Erase a flash sector. ++ * @ha: HA context ++ * @addr: Flash sector to erase ++ * @sec_mask: Sector address mask ++ * @mid: Flash manufacturer ID ++ * ++ * Returns 0 on success, else non-zero. ++ */ ++static uint8_t ++qla2x00_erase_flash_sector(scsi_qla_host_t *ha, ++ uint32_t addr, uint32_t sec_mask, uint8_t mid) ++{ ++ /* Individual Sector Erase Command Sequence */ ++ qla2x00_write_flash_byte(ha, 0x5555, 0xaa); ++ qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); ++ qla2x00_write_flash_byte(ha, 0x5555, 0x80); ++ qla2x00_write_flash_byte(ha, 0x5555, 0xaa); ++ qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); ++ ++ if (mid == 0xda) ++ qla2x00_write_flash_byte(ha, addr & sec_mask, 0x10); ++ else ++ qla2x00_write_flash_byte(ha, addr & sec_mask, 0x30); ++ ++ udelay(150); ++ ++ /* Wait for erase to complete. */ ++ return (qla2x00_poll_flash(ha, addr, 0x80, mid)); ++} ++ ++/** ++ * qla2x00_get_flash_manufacturer() - Read manufacturer ID from flash chip. ++ * @ha: HA context ++ * ++ * Returns the manufacturer's ID read from the flash chip. ++ */ ++uint8_t ++qla2x00_get_flash_manufacturer(scsi_qla_host_t *ha) ++{ ++ uint8_t manuf_id; ++ ++ qla2x00_write_flash_byte(ha, 0x5555, 0xaa); ++ qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); ++ qla2x00_write_flash_byte(ha, 0x5555, 0x90); ++ manuf_id = qla2x00_read_flash_byte(ha, 0x0001); ++ ++ return (manuf_id); ++} ++ ++/** ++ * qla2x00_get_flash_version() - Read version information from flash. ++ * @ha: HA context ++ * ++ * Returns QL_STATUS_SUCCESS on successful retrieval of flash version. ++ */ ++uint16_t ++qla2x00_get_flash_version(scsi_qla_host_t *ha) ++{ ++ uint16_t ret = QL_STATUS_SUCCESS; ++ uint32_t loop_cnt = 1; /* this is for error exit only */ ++ uint32_t pcir_adr; ++ ++ ENTER(__func__); ++ ++ qla2x00_flash_enable(ha); ++ do { /* Loop once to provide quick error exit */ ++ /* Match signature */ ++ if (!(qla2x00_read_flash_byte(ha, 0) == 0x55 && ++ qla2x00_read_flash_byte(ha, 1) == 0xaa)) { ++ /* No signature */ ++ DEBUG2(printk("scsi(%ld): No matching FLASH " ++ "signature.\n", ha->host_no)); ++ ret = QL_STATUS_ERROR; ++ break; ++ } ++ ++ pcir_adr = qla2x00_read_flash_byte(ha, 0x18) & 0xff; ++ ++ /* validate signature of PCI data structure */ ++ if ((qla2x00_read_flash_byte(ha, pcir_adr)) == 'P' && ++ (qla2x00_read_flash_byte(ha, pcir_adr + 1)) == 'C' && ++ (qla2x00_read_flash_byte(ha, pcir_adr + 2)) == 'I' && ++ (qla2x00_read_flash_byte(ha, pcir_adr + 3)) == 'R') { ++ ++ /* Read version */ ++ ha->optrom_minor = ++ qla2x00_read_flash_byte(ha, pcir_adr + 0x12); ++ ha->optrom_major = ++ qla2x00_read_flash_byte(ha, pcir_adr + 0x13); ++ DEBUG3(printk("%s(): got %d.%d.\n", ++ __func__, ha->optrom_major, ha->optrom_minor)); ++ } else { ++ /* error */ ++ DEBUG2(printk("%s(): PCI data struct not found. " ++ "pcir_adr=%x.\n", ++ __func__, pcir_adr)); ++ ret = QL_STATUS_ERROR; ++ break; ++ } ++ ++ } while (--loop_cnt); ++ qla2x00_flash_disable(ha); ++ ++ LEAVE(__func__); ++ ++ return (ret); ++} ++ ++/** ++ * qla2x00_get_flash_image() - Read image from flash chip. ++ * @ha: HA context ++ * @image: Buffer to receive flash image ++ * ++ * Returns 0 on success, else non-zero. ++ */ ++uint16_t ++qla2x00_get_flash_image(scsi_qla_host_t *ha, uint8_t *image) ++{ ++ uint32_t addr; ++ uint32_t midpoint; ++ uint8_t *data; ++ device_reg_t *reg = ha->iobase; ++ ++ midpoint = FLASH_IMAGE_SIZE / 2; ++ ++ qla2x00_flash_enable(ha); ++ WRT_REG_WORD(®->nvram, 0); ++ for (addr = 0, data = image; addr < FLASH_IMAGE_SIZE; addr++, data++) { ++ if (addr == midpoint) ++ WRT_REG_WORD(®->nvram, NVR_SELECT); ++ ++ *data = qla2x00_read_flash_byte(ha, addr); ++ } ++ qla2x00_flash_disable(ha); ++ ++ return (0); ++} ++ ++/** ++ * qla2x00_set_flash_image() - Write image to flash chip. ++ * @ha: HA context ++ * @image: Source image to write to flash ++ * ++ * Returns 0 on success, else non-zero. ++ */ ++uint16_t ++qla2x00_set_flash_image(scsi_qla_host_t *ha, uint8_t *image) ++{ ++ uint16_t status; ++ uint32_t addr; ++ uint32_t midpoint; ++ uint32_t sec_mask; ++ uint32_t rest_addr; ++ uint8_t mid; ++ uint8_t sec_number; ++ uint8_t data; ++ device_reg_t *reg = ha->iobase; ++ ++ status = 0; ++ sec_number = 0; ++ ++ /* Reset ISP chip. */ ++ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); ++ ++ qla2x00_flash_enable(ha); ++ do { /* Loop once to provide quick error exit */ ++ /* Structure of flash memory based on manufacturer */ ++ mid = qla2x00_get_flash_manufacturer(ha); ++ if (mid == 0x6d) { ++ // Am29LV001 part ++ rest_addr = 0x1fff; ++ sec_mask = 0x1e000; ++ } ++ else if (mid == 0x40) { ++ // Mostel v29c51001 part ++ rest_addr = 0x1ff; ++ sec_mask = 0x1fe00; ++ } ++ else if (mid == 0xbf) { ++ // SST39sf10 part ++ rest_addr = 0xfff; ++ sec_mask = 0x1f000; ++ } ++ else if (mid == 0xda) { ++ // Winbond W29EE011 part ++ rest_addr = 0x7f; ++ sec_mask = 0x1ff80; ++ addr = 0; ++ if (qla2x00_erase_flash_sector(ha, ++ addr, sec_mask, mid)) { ++ status = 1; ++ break; ++ } ++ } ++ else { ++ // Am29F010 part ++ rest_addr = 0x3fff; ++ sec_mask = 0x1c000; ++ } ++ ++ midpoint = FLASH_IMAGE_SIZE / 2; ++ for (addr = 0; addr < FLASH_IMAGE_SIZE; addr++) { ++ data = *image++; ++ /* Are we at the beginning of a sector? */ ++ if (!(addr & rest_addr)) { ++ if (addr == midpoint) ++ WRT_REG_WORD(®->nvram, NVR_SELECT); ++ ++ /* Then erase it */ ++ if (qla2x00_erase_flash_sector(ha, ++ addr, sec_mask, mid)) { ++ status = 1; ++ break; ++ } ++ ++ sec_number++; ++ } ++ if (mid == 0x6d) { ++ if (sec_number == 1 && ++ (addr == (rest_addr - 1))) { ++ rest_addr = 0x0fff; ++ sec_mask = 0x1f000; ++ } ++ else if (sec_number == 3 && (addr & 0x7ffe)) { ++ rest_addr = 0x3fff; ++ sec_mask = 0x1c000; ++ } ++ } ++ ++ if (qla2x00_program_flash_address(ha, ++ addr, data, mid)) { ++ status = 1; ++ break; ++ } ++ } ++ } while (0); ++ qla2x00_flash_disable(ha); ++ ++ return (status); ++} +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_vendor.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,193 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++/* ++ * vendor specific op codes. ++*/ ++#define UCSCSI_DCMD 0x20 /* vendor specific command */ ++#define DAC_CDB_LEN 12 ++#define DAC_SENSE_LEN 64 ++ ++#define DACMD_WRITE_CONF_ONDISK 0x4B ++#define DACMD_WRITE_CONFIG 0x06 ++#define DACMD_WRITE_CONF2 0x3C ++#define DACMD_WRITE_CONFLABEL 0x49 /* Write configuration label */ ++#define DACMD_WRITE_CONFIG_V3x 0x4F ++#define DACMD_ADD_CONFIG_V2x 0x18 ++#define DACMD_ADD_CONFIG_V3x 0x4C ++#define DACMD_STORE_IMAGE 0x21 ++#define DACMD_ADD_CAPACITY 0x2A /* add physical drives to existing array */ ++#define DACMD_WRITE_IOPORT 0x3A /* write port B */ ++#define DACMD_S2S_WRITEFULLCONF 0x60 /* write full configuration */ ++#define DACMD_S2S_ADDFULLCONF 0x62 /* add full configuration */ ++#define DACMD_S2S_WRITELUNMAP_OLD 0x58 /* write LUN map information */ ++#define DACMD_S2S_WRITELUNMAP 0xD2 /* Write LUN MAP Information */ ++#define DACMD_S2S_WRITE_IOPORT 0x66 /* write expanded IO port */ ++#define DACMD_WRITE_V3x 0x34 /* write data from plain memory */ ++#define DACMD_S2S_WRITESIG 0x4D /* write signature information */ ++ ++#if !defined(s08bits) ++#define s08bits char ++#define s16bits short ++#define s32bits int ++#define u08bits unsigned s08bits ++#define u16bits unsigned s16bits ++#define u32bits unsigned s32bits ++#endif ++ ++typedef struct dac_command ++{ ++ u08bits mb_Command; /* Mail Box register 0 */ ++ u08bits mb_CmdID; /* Mail Box register 1 */ ++ u08bits mb_ChannelNo; /* Mail Box register 2 */ ++ u08bits mb_TargetID; /* Mail Box register 3 */ ++ u08bits mb_DevState; /* Mail Box register 4 */ ++ u08bits mb_MailBox5; /* Mail Box register 5 */ ++ u08bits mb_MailBox6; /* Mail Box register 6 */ ++ u08bits mb_SysDevNo; /* Mail Box register 7 */ ++ u32bits mb_Datap; /* Mail Box register 8-B */ ++ u08bits mb_MailBoxC; /* Mail Box register C */ ++ u08bits mb_StatusID; /* Mail box register D */ ++ u16bits mb_Status; /* Mail Box Register E,F */ ++} ++dac_command_t; ++ ++typedef struct dac_scdb ++{ ++ u08bits db_ChannelTarget; /* ChannelNo 7..4 & Target 3..0 */ ++ u08bits db_DATRET; /* different bits, see below */ ++ u16bits db_TransferSize; /* Request/done size in bytes */ ++ u32bits db_PhysDatap; /* Physical addr in host memory */ ++ u08bits db_CdbLen; /* 6, 10 or 12 */ ++ u08bits db_SenseLen; /* If returned from DAC (<= 64) */ ++ u08bits db_Cdb[DAC_CDB_LEN]; /* The CDB itself */ ++ u08bits db_SenseData[DAC_SENSE_LEN];/* Result of request sense */ ++ u08bits db_StatusIn; /* SCSI status returned */ ++ u08bits db_Reserved1; ++} ++dac_scdb_t; ++ ++typedef struct dga_scdb ++{ ++ u08bits dsc_osreq[1024]; /* OS related buffer:sizeof(mdac_req_t) */ ++ ++ u08bits dsc_familyctlno; /* Controller number within family */ ++ u08bits dsc_ctlno; /* Controller number */ ++ u08bits dsc_chno; /* Channel number */ ++ u08bits dsc_tgt; /* target ID */ ++ ++ u08bits dsc_lun; /* Lun ID */ ++ u08bits dsc_rebuildflag; /* current rebuild flag */ ++ u16bits dsc_status; /* completion status */ ++ ++ u08bits dsc_scsiversion; /* SCSI protocol version */ ++ u08bits dsc_hostctlno; /* host system controller number */ ++ u16bits dsc_reqsenseseqno; /* request sense sequence number */ ++ ++ u32bits dsc_events; /* # events at start */ ++ ++ u32bits dsc_pollwaitchan; /* sleep/wakeup channel */ ++ u32bits dsc_poll; /* polling value, if =0 op complete */ ++ ++ struct dga_ctldev *dsc_ctp; /* pointer back to controller */ ++ void *dsc_pdp; /* pointer back to physical device */ ++ void *dsc_ldp; /* pointer back to logical device */ ++ void (*dsc_intr)(void); /* completion call back function */ ++ ++ /* all save functions are used in S2S */ ++ u08bits dsc_savedcdb[DAC_CDB_LEN];/* 12 bytes saved CDB from SCSI CDB */ ++ u32bits (*dsc_statsintr)(struct dga_scdb *); /* statistics completion function */ ++ ++ void (*dsc_savedintr)(void); /* completion call back function */ ++ void *dsc_savedctp; /* pointer back to controller */ ++ u08bits dsc_savedfamilyctlno; /* Controller number within family */ ++ u08bits dsc_savedctlno; /* Controller number */ ++ u08bits dsc_savedchno; /* Channel number */ ++ u08bits dsc_savedtgt; /* target ID */ ++ ++ u08bits dsc_savedlun; /* Lun ID */ ++ u08bits dsc_savedcdblen; /* saved CDB len for SCDB */ ++ u08bits dsc_scanmode; ++ u08bits dsc_pageno; /* pageno for data > 4K */ ++ u32bits dsc_residue; ++ u32bits dsc_Reserved4; ++ ++ dac_command_t dsc_dcmd; /* DCMD space, 16 bytes */ ++ dac_scdb_t dsc_scdb; /* SCDB space */ ++ u32bits dsc_EventSeqNo; ++ u32bits dsc_ReqSenseNo; ++ ++ u32bits dsc_Reserved64[16]; /* leave this for OLD SCO driver bug */ ++ ++ u08bits dsc_data[256]; /* Rest is data */ ++} ++dga_scdb_t; ++ ++/* ++* qla2100_set_scsi_direction ++* This routine will set the proper direction for vendor specific ++* commands. ++* ++* Note: Vendors should modify this routine to set the proper ++* direction of the transfer if they used vendor specific commands. ++* ++* Input: ++* ha = adapter block pointer. ++* sp = SCSI Request Block structure pointer. ++* ++* Returns: ++* 0 = success, was able to issue command. ++*/ ++void ++qla2x00_set_vend_direction(scsi_qla_host_t *ha, ++ Scsi_Cmnd *cmd, cmd_entry_t *pkt) ++{ ++ dga_scdb_t *dsp = (dga_scdb_t *) cmd; ++ ++ if (cmd->data_cmnd[0] == UCSCSI_DCMD) { ++ switch( dsp->dsc_dcmd.mb_Command ) { ++ case DACMD_WRITE_CONF_ONDISK: ++ case DACMD_WRITE_CONFIG: ++ case DACMD_WRITE_CONF2: ++ case DACMD_WRITE_CONFLABEL: ++ case DACMD_WRITE_CONFIG_V3x: ++ case DACMD_ADD_CONFIG_V2x: ++ case DACMD_ADD_CONFIG_V3x: ++ case DACMD_STORE_IMAGE: ++ case DACMD_ADD_CAPACITY: ++ case DACMD_WRITE_IOPORT: ++ case DACMD_S2S_WRITEFULLCONF: ++ case DACMD_S2S_ADDFULLCONF: ++ case DACMD_S2S_WRITELUNMAP_OLD: ++ case DACMD_S2S_WRITELUNMAP: ++ case DACMD_S2S_WRITE_IOPORT: ++ case DACMD_WRITE_V3x: ++ case DACMD_S2S_WRITESIG: ++ pkt->control_flags |= BIT_6; ++ break; ++ default: ++ pkt->control_flags |= BIT_5; ++ } ++ } else ++ pkt->control_flags |= BIT_5; ++} ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_version.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,31 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++/* ++ * Driver version ++ */ ++#if DEBUG_QLA2100 ++#define QLA2100_VERSION "8.00.00b1-debug" ++#else ++#define QLA2100_VERSION "8.00.00b1" ++#endif ++ ++#define QLA_DRIVER_MAJOR_VER 8 ++#define QLA_DRIVER_MINOR_VER 0 ++#define QLA_DRIVER_PATCH_VER 0 ++#define QLA_DRIVER_BETA_VER 1 +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qla_xioct.c Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,6589 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++ ++#include "qla_os.h" ++#include "qla_def.h" ++ ++#include "inioct.h" ++ ++ ++#define QLA_PT_CMD_TOV (60) /* firmware timeout */ ++#define QLA_PT_CMD_DRV_TOV (QLA_PT_CMD_TOV + 1) /* drvr timeout */ ++#define QLA_IOCTL_ACCESS_WAIT_TIME (QLA_PT_CMD_DRV_TOV + 2) /* wait_q tov */ ++#define QLA_INITIAL_IOCTLMEM_SIZE (2 * PAGE_SIZE) ++#define QLA_IOCTL_SCRAP_SIZE 2048 /* scrap memory for local use. */ ++ ++/* ELS related defines */ ++#define FC_HEADER_LEN 24 ++#define ELS_RJT_LENGTH 0x08 /* 8 */ ++#define ELS_RPS_ACC_LENGTH 0x40 /* 64 */ ++#define ELS_RLS_ACC_LENGTH 0x1C /* 28 */ ++ ++/* ELS cmd Reply Codes */ ++#define ELS_STAT_LS_RJT 0x01 ++#define ELS_STAT_LS_ACC 0x02 ++ ++#define IOCTL_INVALID_STATUS 0xffff ++ ++ ++int qla2x00_alloc_ioctl_mem(scsi_qla_host_t *); ++void qla2x00_free_ioctl_mem(scsi_qla_host_t *); ++ ++int qla2x00_get_ioctl_scrap_mem(scsi_qla_host_t *, void **, uint32_t); ++void qla2x00_free_ioctl_scrap_mem(scsi_qla_host_t *); ++ ++/* ++ * Local prototypes ++ */ ++static int qla2x00_get_new_ioctl_dma_mem(scsi_qla_host_t *, uint32_t); ++ ++#if defined(ISP2300) ++static uint8_t qla2x00_get_next_free_pub_id(scsi_qla_host_t *, uint16_t *); ++static uint8_t qla2x00_host_relogin(scsi_qla_host_t *, fcdev_t *); ++#endif ++ ++static int qla2x00_find_curr_ha(uint16_t, scsi_qla_host_t **); ++ ++static int qla2x00_get_driver_specifics(EXT_IOCTL *); ++ ++static int qla2x00_aen_reg(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_aen_get(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++static int qla2x00_query(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_hba_node(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_hba_port(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_disc_port(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_disc_tgt(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_chip(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++static int qla2x00_get_data(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_get_statistics(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_get_fc_statistics(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_get_port_summary(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_driver(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_query_fw(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++#if defined(ISP2300) ++static int qla2x00_send_els_passthru(scsi_qla_host_t *, EXT_IOCTL *, int); ++#endif ++static int qla2x00_send_fcct(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_start_ms_cmd(scsi_qla_host_t *, EXT_IOCTL *, srb_t *, ++ EXT_ELS_PT_REQ *); ++ ++static int qla2x00_wwpn_to_scsiaddr(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_scsi_passthru(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_sc_scsi_passthru(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_sc_fc_scsi_passthru(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_sc_scsi3_passthru(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++static int qla2x00_send_els_rnid(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_get_rnid_params(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_set_host_data(scsi_qla_host_t *, EXT_IOCTL *, int); ++static int qla2x00_set_rnid_params(scsi_qla_host_t *, EXT_IOCTL *, int); ++ ++static void qla2x00_waitq_sem_timeout(unsigned long); ++static uint8_t qla2x00_get_ioctl_access(scsi_qla_host_t *, uint32_t); ++static uint8_t qla2x00_release_ioctl_access(scsi_qla_host_t *); ++ ++static void qla2x00_wait_q_memb_alloc(scsi_qla_host_t *, wait_q_t **); ++static void qla2x00_wait_q_memb_free(scsi_qla_host_t *, wait_q_t *); ++static uint8_t qla2x00_wait_q_add(scsi_qla_host_t *, wait_q_t **); ++static void qla2x00_wait_q_get_next(scsi_qla_host_t *, wait_q_t **); ++static void qla2x00_wait_q_remove(scsi_qla_host_t *, wait_q_t *); ++ ++ ++/* ++ * qla2x00_ioctl_sleep_done ++ * ++ * Description: ++ * This is the callback function to wakeup ioctl completion semaphore ++ * for the ioctl request that is waiting. ++ * ++ * Input: ++ * sem - pointer to the ioctl completion semaphore. ++ * ++ * Returns: ++ */ ++static void ++qla2x00_ioctl_sleep_done(struct semaphore * sem) ++{ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ if (sem != NULL){ ++ DEBUG9(printk("ioctl_sleep: wake up sem.\n");) ++ up(sem); ++ } ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++} ++ ++/* ++ * qla2x00_ioctl_sem_init ++ * ++ * Description: ++ * Initialize the ioctl timer and semaphore used to wait for passthru ++ * completion. ++ * ++ * Input: ++ * ha - pointer to scsi_qla_host_t structure used for initialization. ++ * ++ * Returns: ++ * None. ++ */ ++static void ++qla2x00_ioctl_sem_init(scsi_qla_host_t *ha) ++{ ++ init_MUTEX_LOCKED(&ha->ioctl->cmpl_sem); ++ init_timer(&(ha->ioctl->cmpl_timer)); ++ ha->ioctl->cmpl_timer.data = (unsigned long)&ha->ioctl->cmpl_sem; ++ ha->ioctl->cmpl_timer.function = ++ (void (*)(unsigned long))qla2x00_ioctl_sleep_done; ++} ++ ++/* ++ * qla2x00_scsi_pt_done ++ * ++ * Description: ++ * Resets ioctl progress flag and wakes up the ioctl completion semaphore. ++ * ++ * Input: ++ * pscsi_cmd - pointer to the passthru Scsi cmd structure which has completed. ++ * ++ * Returns: ++ */ ++static void ++qla2x00_scsi_pt_done(Scsi_Cmnd *pscsi_cmd) ++{ ++ struct Scsi_Host *host; ++ scsi_qla_host_t *ha; ++ ++ host = pscsi_cmd->device->host; ++ ha = (scsi_qla_host_t *) host->hostdata; ++ ++ DEBUG9(printk("%s post function called OK\n", __func__);) ++ ++ /* save detail status for IOCTL reporting */ ++ ha->ioctl->SCSIPT_InProgress = 0; ++ ha->ioctl->ioctl_tov = 0; ++ ++ up(&ha->ioctl->cmpl_sem); ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return; ++} ++ ++/* ++ * qla2x00_msiocb_done ++ * ++ * Description: ++ * Resets MSIOCB ioctl progress flag and wakes up the ioctl completion ++ * semaphore. ++ * ++ * Input: ++ * cmd - pointer to the passthru Scsi cmd structure which has completed. ++ * ++ * Returns: ++ */ ++static void ++qla2x00_msiocb_done(Scsi_Cmnd *pscsi_cmd) ++{ ++ struct Scsi_Host *host; ++ scsi_qla_host_t *ha; ++ ++ host = pscsi_cmd->device->host; ++ ha = (scsi_qla_host_t *) host->hostdata; ++ ++ DEBUG9(printk("%s post function called OK\n", __func__);) ++ ++ ha->ioctl->MSIOCB_InProgress = 0; ++ ha->ioctl->ioctl_tov = 0; ++ ++ up(&ha->ioctl->cmpl_sem); ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++ return; ++} ++ ++/************************************************************************* ++ * qla2x00_ioctl ++ * ++ * Description: ++ * Performs additional ioctl requests not satisfied by the upper levels. ++ * ++ * Returns: ++ * ret = 0 Success ++ * ret != 0 Failed; detailed status copied to EXT_IOCTL structure ++ * if possible ++ *************************************************************************/ ++int ++qla2x00_ioctl(Scsi_Device *dev, int cmd, void *arg) ++{ ++ int mode = 0; ++ int tmp_rval = 0; ++ int ret = -EINVAL; ++ ++ uint8_t *temp; ++ uint8_t tempbuf[8]; ++ uint32_t i; ++ uint32_t status; ++ ++ EXT_IOCTL *pext; ++ ++ scsi_qla_host_t *ha; ++ ++ ++ DEBUG9(printk("%s: entry to command (%x), arg (%p)\n", ++ __func__, cmd, arg);) ++ ++ /* Catch any non-exioct ioctls */ ++ if (_IOC_TYPE(cmd) != QLMULTIPATH_MAGIC) { ++ return (ret); ++ } ++ ++ ret = verify_area(VERIFY_READ, (void *)arg, sizeof(EXT_IOCTL)); ++ if (ret) { ++ DEBUG9_10(printk("%s: ERROR VERIFY_READ EXT_IOCTL " ++ "sturct. cmd=%d arg=%p.\n", __func__, cmd, arg);) ++ return (ret); ++ } ++ ++ /* Allocate ioctl structure buffer to support multiple concurrent ++ * entries. ++ */ ++ pext = KMEM_ZALLOC(sizeof(EXT_IOCTL), 16); ++ if (pext == NULL) { ++ /* error */ ++ printk(KERN_WARNING ++ "qla2x00: ERROR in main ioctl buffer allocation.\n"); ++ return (-ENOMEM); ++ } ++ ++ /* copy in application layer EXT_IOCTL */ ++ ret = copy_from_user(pext, arg, sizeof(EXT_IOCTL)); ++ if (ret) { ++ DEBUG9_10(printk("%s: ERROR COPY_FROM_USER " ++ "EXT_IOCTL sturct. cmd=%d arg=%p.\n", ++ __func__, cmd, arg);) ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (ret); ++ } ++ ++ /* Verify before update status fields in EXT_IOCTL struct. */ ++ ret = verify_area(VERIFY_WRITE, (void *)arg, sizeof(EXT_IOCTL)); ++ if (ret) { ++ DEBUG9_10(printk("%s: ERROR VERIFY_WRITE EXT_IOCTL " ++ "sturct. cmd=%d arg=%p.\n", __func__, cmd, arg);) ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (ret); ++ } ++ ++ /* check signature of this ioctl */ ++ temp = (uint8_t *) &pext->Signature; ++ ++ for (i = 0; i < 4; i++, temp++) ++ tempbuf[i] = *temp; ++ ++ if ((tempbuf[0] == 'Q') && (tempbuf[1] == 'L') && ++ (tempbuf[2] == 'O') && (tempbuf[3] == 'G')) ++ status = 0; ++ else ++ status = 1; ++ ++ if (status != 0) { ++ DEBUG9_10(printk("%s: signature did not match. " ++ "cmd=%d arg=%p.\n", __func__, cmd, arg);) ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ copy_to_user((void *)arg, (void *)pext, sizeof(EXT_IOCTL)); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (-EINVAL); ++ } ++ ++ /* check version of this ioctl */ ++ if (pext->Version > EXT_VERSION) { ++ printk(KERN_WARNING ++ "qla2x00: ioctl interface version not supported = %d.\n", ++ pext->Version); ++ pext->Status = EXT_STATUS_UNSUPPORTED_VERSION; ++ copy_to_user((void *)arg, (void *)pext, sizeof(EXT_IOCTL)); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (-EINVAL); ++ } ++ ++ /* check for special cmds used during application's setup time. */ ++ switch (cmd) { ++ case EXT_CC_STARTIOCTL: ++ DEBUG9(printk("%s: got startioctl command.\n", __func__);) ++ ++ pext->Instance = num_hosts; ++ pext->Status = EXT_STATUS_OK; ++ ret = copy_to_user((void *)arg, (void *)pext, ++ sizeof(EXT_IOCTL)); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (ret); ++ ++ case EXT_CC_SETINSTANCE: ++ /* This call is used to return the HBA's host number to ++ * ioctl caller. All subsequent ioctl commands will put ++ * the host number in HbaSelect field to tell us which ++ * HBA is the destination. ++ */ ++ if (pext->Instance < num_hosts) { ++ if (!((uint32_t)pext->VendorSpecificData & ++ EXT_DEF_USE_HBASELECT)) { ++ /* Backward compatible code. */ ++ apiHBAInstance = pext->Instance; ++ } ++ ++ /* ++ * Return host number via pext->HbaSelect for ++ * specified API instance number. ++ */ ++ if (qla2x00_find_curr_ha(pext->Instance, &ha) != 0) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ ret = copy_to_user(arg, pext, sizeof(EXT_IOCTL)); ++ DEBUG9_10(printk("%s: SETINSTANCE invalid inst " ++ "%d. num_hosts=%d ha=%p ret=%d.\n", ++ __func__, pext->Instance, num_hosts, ha, ++ ret);) ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (ret); /* ioctl completed ok */ ++ } ++ ++ pext->HbaSelect = ha->host_no; ++ pext->Status = EXT_STATUS_OK; ++ ++ DEBUG9(printk("%s: Matching instance %d to hba " ++ "%ld.\n", __func__, pext->Instance, ha->host_no);) ++ } else { ++ DEBUG9_10(printk("%s: ERROR EXT_SETINSTANCE." ++ " Instance=%d num_hosts=%d ha=%p.\n", ++ __func__, pext->Instance, num_hosts, ha);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ } ++ ret = copy_to_user(arg, pext, sizeof(EXT_IOCTL)); ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ ++ DEBUG9(printk("%s: SETINSTANCE exiting. ret=%d.\n", ++ __func__, ret);) ++ ++ return (ret); ++ ++ case EXT_CC_DRIVER_SPECIFIC: ++ ret = qla2x00_get_driver_specifics(pext); ++ tmp_rval = copy_to_user(arg, (void *)pext, sizeof(EXT_IOCTL)); ++ ++ if (ret == 0) ++ ret = tmp_rval; ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (ret); ++ ++ default: ++ break; ++ } ++ ++ if (!((uint32_t)pext->VendorSpecificData & EXT_DEF_USE_HBASELECT)) { ++ /* Backward compatible code. */ ++ /* Will phase out soon. */ ++ ++ /* Check for valid apiHBAInstance (set previously by ++ * EXT_SETINSTANCE or default 0) and set ha context ++ * for this IOCTL. ++ */ ++ if (qla2x00_find_curr_ha(apiHBAInstance, &ha) != 0) { ++ ++ DEBUG9_10(printk("%s: ERROR matching apiHBAInstance " ++ "%d to an HBA Instance.\n", ++ __func__, pext->HbaSelect);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ copy_to_user(arg, pext, sizeof(EXT_IOCTL)); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (-EINVAL); ++ } ++ ++ DEBUG9(printk("%s: active apiHBAInstance=%d host_no=%ld " ++ "CC=%x SC=%x.\n", ++ __func__, apiHBAInstance, ha->host_no, cmd, pext->SubCode);) ++ ++ } else { ++ /* Use HbaSelect value to get a matching ha instance ++ * for this ioctl command. ++ */ ++ if (qla2x00_find_curr_ha(pext->HbaSelect, &ha) != 0) { ++ ++ DEBUG9_10(printk("%s: ERROR matching pext->HbaSelect " ++ "%d to an HBA Instance.\n", ++ __func__, pext->HbaSelect);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ copy_to_user(arg, pext, sizeof(EXT_IOCTL)); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (-EINVAL); ++ } ++ ++ DEBUG9(printk("%s: active host_inst=%ld CC=%x SC=%x.\n", ++ __func__, ha->instance, cmd, pext->SubCode);) ++ } ++ ++ /* ++ * Get permission to process ioctl command. Only one will proceed ++ * at a time. ++ */ ++ if (qla2x00_get_ioctl_access(ha, QLA_IOCTL_ACCESS_WAIT_TIME) != 0) { ++ /* error timed out */ ++ DEBUG9_10(printk("%s: ERROR timeout getting ioctl " ++ "access. host no=%d.\n", __func__, pext->HbaSelect);) ++ ++ pext->Status = EXT_STATUS_BUSY; ++ copy_to_user(arg, pext, sizeof(EXT_IOCTL)); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (-EBUSY); ++ } ++ ++ ++ while (test_bit(CFG_ACTIVE, &ha->cfg_flags) || ha->dpc_active) { ++ if( signal_pending(current) ) ++ break; /* get out */ ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(HZ); ++ } ++ ++ switch (cmd) { /* switch on EXT IOCTL COMMAND CODE */ ++ ++ case EXT_CC_QUERY: ++ DEBUG9(printk("%s: got query command.\n", __func__);) ++ ++ ret = qla2x00_query(ha, pext, 0); ++ ++ break; ++ ++ case EXT_CC_GET_DATA: ++ DEBUG9(printk("%s: got get_data command.\n", __func__);) ++ ++ ret = qla2x00_get_data(ha, pext, 0); ++ ++ break; ++ ++ case EXT_CC_SEND_FCCT_PASSTHRU: ++ DEBUG9(printk("%s: got CT passthru cmd.\n", __func__)); ++ ++ ret = qla2x00_send_fcct(ha, pext, 0); ++ ++ break; ++ ++ case EXT_CC_SEND_SCSI_PASSTHRU: ++ DEBUG9(printk("%s: got SCSI passthru cmd.\n", __func__)); ++ ++ ret = qla2x00_scsi_passthru(ha, pext, mode); ++ ++ break; ++ ++ case EXT_CC_REG_AEN: ++ ret = qla2x00_aen_reg(ha, pext, mode); ++ ++ break; ++ ++ case EXT_CC_GET_AEN: ++ ret = qla2x00_aen_get(ha, pext, mode); ++ ++ break; ++ ++ case EXT_CC_WWPN_TO_SCSIADDR: ++ ret = qla2x00_wwpn_to_scsiaddr(ha, pext, 0); ++ break; ++ ++ case EXT_CC_SEND_ELS_RNID: ++ ret = qla2x00_send_els_rnid(ha, pext, mode); ++ break; ++ ++ case EXT_CC_SET_DATA: ++ ret = qla2x00_set_host_data(ha, pext, mode); ++ break; ++ ++ case INT_CC_READ_NVRAM: ++ ret = qla2x00_read_nvram(ha, pext, mode); ++ ++ break; ++ ++ case INT_CC_UPDATE_NVRAM: ++ ret = qla2x00_update_nvram(ha, pext, mode); ++ ++ break; ++ ++ case INT_CC_LOOPBACK: ++ ret = qla2x00_send_loopback(ha, pext, mode); ++ ++ break; ++ ++ case INT_CC_READ_OPTION_ROM: ++ ret = qla2x00_read_option_rom(ha, pext, mode); ++ ++ break; ++ ++ case INT_CC_UPDATE_OPTION_ROM: ++ ret = qla2x00_update_option_rom(ha, pext, mode); ++ ++ break; ++ ++#if defined(ISP2300) ++ case EXT_CC_SEND_ELS_PASSTHRU: ++ DEBUG9(printk("%s: got ELS passthru cmd.\n", __func__)); ++ ++ ret = qla2x00_send_els_passthru(ha, pext, 0); ++ ++ break; ++#endif ++ ++ /* all others go here */ ++ /* ++ case EXT_CC_PLATFORM_REG: ++ break; ++ */ ++ ++ /* Failover IOCTLs */ ++ case FO_CC_GET_PARAMS: ++ case FO_CC_SET_PARAMS: ++ case FO_CC_GET_PATHS: ++ case FO_CC_SET_CURRENT_PATH: ++ case FO_CC_RESET_HBA_STAT: ++ case FO_CC_GET_HBA_STAT: ++ case FO_CC_GET_LUN_DATA: ++ case FO_CC_SET_LUN_DATA: ++ case FO_CC_GET_TARGET_DATA: ++ case FO_CC_SET_TARGET_DATA: ++ DEBUG9(printk("%s: failover arg (%p):\n", __func__, arg);) ++ ++ qla2x00_fo_ioctl(ha, cmd, pext, mode); ++ ++ break; ++ ++ default: ++ pext->Status = EXT_STATUS_INVALID_REQUEST; ++ break; ++ ++ } /* end of CC decode switch */ ++ ++ /* Always try to copy values back regardless what happened before. */ ++ tmp_rval = copy_to_user(arg, (void *)pext, sizeof(EXT_IOCTL)); ++ ++ if (ret == 0) ++ ret = tmp_rval; ++ ++ DEBUG9(printk("%s: exiting. tmp_rval(%d) ret(%d)\n", ++ __func__, tmp_rval, ret);) ++ ++ qla2x00_release_ioctl_access(ha); ++ ++ KMEM_FREE(pext, sizeof(EXT_IOCTL)); ++ return (ret); ++} ++ ++/* ++ * qla2x00_alloc_ioctl_mem ++ * Allocates memory needed by IOCTL code. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_alloc_ioctl_mem(scsi_qla_host_t *ha) ++{ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_new_ioctl_dma_mem(ha, QLA_INITIAL_IOCTLMEM_SIZE) != ++ QL_STATUS_SUCCESS) { ++ printk(KERN_WARNING ++ "qla2x00: ERROR in ioctl physical memory allocation\n"); ++ ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ /* Allocate context memory buffer */ ++ ha->ioctl = KMEM_ZALLOC(sizeof(hba_ioctl_context), 11); ++ if (ha->ioctl == NULL) { ++ /* error */ ++ printk(KERN_WARNING ++ "qla2x00: ERROR in ioctl context allocation.\n"); ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ /* Allocate AEN tracking buffer */ ++ ha->ioctl->aen_tracking_queue = ++ KMEM_ZALLOC(EXT_DEF_MAX_AEN_QUEUE * sizeof(EXT_ASYNC_EVENT), 12); ++ if (ha->ioctl->aen_tracking_queue == NULL) { ++ printk(KERN_WARNING ++ "qla2x00: ERROR in ioctl aen_queue allocation.\n"); ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ ha->ioctl->ioctl_tq = KMEM_ZALLOC(sizeof(os_tgt_t), 13); ++ if (ha->ioctl->ioctl_tq == NULL) { ++ printk(KERN_WARNING ++ "qla2x00: ERROR in ioctl tgt queue allocation.\n"); ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ ha->ioctl->ioctl_lq = KMEM_ZALLOC(sizeof(os_lun_t), 14); ++ if (ha->ioctl->ioctl_lq == NULL) { ++ printk(KERN_WARNING ++ "qla2x00: ERROR in ioctl lun queue allocation.\n"); ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ /*INIT_LIST_HEAD(&(ha->ioctl->ioctl_lq->cmd));*/ ++ ++ /* Pick the largest size we'll need per ha of all ioctl cmds. ++ * Use this size when freeing. ++ */ ++ ha->ioctl->scrap_mem = KMEM_ZALLOC(QLA_IOCTL_SCRAP_SIZE, 15); ++ if (ha->ioctl->scrap_mem == NULL) { ++ printk(KERN_WARNING ++ "qla2x00: ERROR in ioctl scrap_mem allocation.\n"); ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ha->ioctl->scrap_mem_size = QLA_IOCTL_SCRAP_SIZE; ++ ha->ioctl->scrap_mem_used = 0; ++ DEBUG9(printk("%s(%ld): scrap_mem_size=%d.\n", ++ __func__, ha->host_no, ha->ioctl->scrap_mem_size);) ++ ++ ha->ioctl->ioctl_lq->q_state = LUN_STATE_READY; ++ ha->ioctl->ioctl_lq->q_lock = SPIN_LOCK_UNLOCKED; ++ ++ /* Init wait_q fields */ ++ ha->ioctl->wait_q_lock = SPIN_LOCK_UNLOCKED; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return QL_STATUS_SUCCESS; ++} ++ ++/* ++ * qla2x00_get_new_ioctl_dma_mem ++ * Allocates dma memory of the specified size. ++ * This is done to replace any previously allocated ioctl dma buffer. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_new_ioctl_dma_mem(scsi_qla_host_t *ha, uint32_t size) ++{ ++ DEBUG9(printk("%s entered.\n", __func__);) ++ ++ if (ha->ioctl_mem) { ++ DEBUG9(printk("%s: ioctl_mem was previously allocated. " ++ "Dealloc old buffer.\n", __func__);) ++ ++ /* free the memory first */ ++ pci_free_consistent(ha->pdev, ha->ioctl_mem_size, ha->ioctl_mem, ++ ha->ioctl_mem_phys); ++ } ++ ++ /* Get consistent memory allocated for ioctl I/O operations. */ ++ ha->ioctl_mem = pci_alloc_consistent(ha->pdev, ++ size, &ha->ioctl_mem_phys); ++ ++ if (ha->ioctl_mem == NULL) { ++ printk(KERN_WARNING ++ "%s: ERROR in ioctl physical memory allocation. " ++ "Requested length=%x.\n", __func__, size); ++ ++ ha->ioctl_mem_size = 0; ++ return QL_STATUS_RESOURCE_ERROR; ++ } ++ ha->ioctl_mem_size = size; ++ ++ DEBUG9(printk("%s exiting.\n", __func__);) ++ ++ return QL_STATUS_SUCCESS; ++} ++ ++/* ++ * qla2x00_free_ioctl_mem ++ * Frees memory used by IOCTL code for the specified ha. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Context: ++ * Kernel context. ++ */ ++void ++qla2x00_free_ioctl_mem(scsi_qla_host_t *ha) ++{ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (ha->ioctl != NULL) { ++ ++ if (ha->ioctl->scrap_mem != NULL) { ++ /* The size here must match up to what we ++ * allocated before. ++ */ ++ KMEM_FREE(ha->ioctl->scrap_mem, ++ ha->ioctl->scrap_mem_size); ++ ha->ioctl->scrap_mem = NULL; ++ ha->ioctl->scrap_mem_size = 0; ++ } ++ ++ if (ha->ioctl->ioctl_tq != NULL) { ++ KMEM_FREE(ha->ioctl->ioctl_tq, sizeof(os_tgt_t)); ++ ha->ioctl->ioctl_tq = NULL; ++ } ++ ++ if (ha->ioctl->ioctl_lq != NULL) { ++ KMEM_FREE(ha->ioctl->ioctl_lq, sizeof(os_lun_t)); ++ ha->ioctl->ioctl_lq = NULL; ++ } ++ ++ if (ha->ioctl->aen_tracking_queue != NULL) { ++ KMEM_FREE(ha->ioctl->aen_tracking_queue, ++ EXT_DEF_MAX_AEN_QUEUE * sizeof(EXT_ASYNC_EVENT)); ++ ha->ioctl->aen_tracking_queue = NULL; ++ } ++ ++ KMEM_FREE(ha->ioctl, sizeof(hba_ioctl_context)); ++ ha->ioctl = NULL; ++ } ++ ++ /* free memory allocated for ioctl operations */ ++ pci_free_consistent(ha->pdev, ha->ioctl_mem_size, ha->ioctl_mem, ++ ha->ioctl_mem_phys); ++ ha->ioctl_mem = NULL; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++} ++ ++/* ++ * qla2x00_get_ioctl_scrap_mem ++ * Returns pointer to memory of the specified size from the scrap buffer. ++ * This can be called multiple times before the free call as long ++ * as the memory is to be used by the same ioctl command and ++ * there's still memory left in the scrap buffer. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ppmem = pointer to return a buffer pointer. ++ * size = size of buffer to return. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++int ++qla2x00_get_ioctl_scrap_mem(scsi_qla_host_t *ha, void **ppmem, uint32_t size) ++{ ++ int ret = QL_STATUS_SUCCESS; ++ uint32_t free_mem; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered. size=%d.\n", ++ __func__, ha->host_no, ha->instance, size);) ++ ++ free_mem = ha->ioctl->scrap_mem_size - ha->ioctl->scrap_mem_used; ++ if (free_mem >= size) { ++ *ppmem = ha->ioctl->scrap_mem + ha->ioctl->scrap_mem_used; ++ ha->ioctl->scrap_mem_used += size; ++ } else { ++ DEBUG10(printk("%s(%ld): no more scrap memory.\n", ++ __func__, ha->host_no);) ++ ++ ret = QL_STATUS_ERROR; ++ } ++ ++ DEBUG9(printk("%s(%ld): exiting. ret=%d.\n", ++ __func__, ha->host_no, ret);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_free_ioctl_scrap_mem ++ * Makes the entire scrap buffer free for use. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ */ ++void ++qla2x00_free_ioctl_scrap_mem(scsi_qla_host_t *ha) ++{ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ memset(ha->ioctl->scrap_mem, 0, ha->ioctl->scrap_mem_size); ++ ha->ioctl->scrap_mem_used = 0; ++ ++ DEBUG9(printk("%s(%ld): exiting.\n", ++ __func__, ha->host_no);) ++} ++ ++#if defined(ISP2300) ++/* ++ * qla2x00_get_next_free_pub_id ++ * Find the next free public loop ID to use, starting from the old ++ * loop ID passed in. If the old loop ID is invalid, this function ++ * will start the search from beginning. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * ploop_id = pointer to a 16bit var containing the old loop ++ * ID which is also to be used to get the new loop ID. ++ * ++ * Returns: ++ * QL_STATUS_SUCCESS - Found an usable loop ID ++ * QL_STATUS_RESOURCE_ERROR - No more free loop ID ++ */ ++static uint8_t ++qla2x00_get_next_free_pub_id(scsi_qla_host_t *ha, uint16_t *ploop_id) ++{ ++ uint8_t retval = QL_STATUS_SUCCESS; ++ uint16_t index; ++ uint16_t old_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ old_id = *ploop_id; ++ if (old_id >= LAST_SNS_LOOP_ID) { ++ /* set a starting point */ ++ old_id = ha->min_external_loopid; ++ } ++ ++ for (index = old_id; index < LAST_SNS_LOOP_ID; index++) { ++ if (!ha->fabricid[index].in_use) { ++ ha->fabricid[index].in_use = TRUE; ++ *ploop_id = index; ++ DEBUG9(printk("%s(%ld): found Lid %02x.\n", ++ __func__, ha->host_no, index);) ++ break; ++ } ++ } ++ if (index >= LAST_SNS_LOOP_ID) { ++ /* no more free ID */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR no more free LID " ++ "available.\n", __func__, ha->host_no, ha->instance);) ++ ++ retval = QL_STATUS_RESOURCE_ERROR; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting. retval=%d.\n", ++ __func__, ha->host_no, ha->instance, retval);) ++ ++ return retval; ++} ++ ++/* ++ * qla2x00_host_relogin ++ * Issue fabric login command to a host in the host_db which ++ * had somehow been lost before. All updates are passed back ++ * via pdevice. No update will be done to any of ha's database. ++ * ++ * Input: ++ * ha = adapter block pointer. ++ * pdevice = pointer to FC device type structure. ++ * ++ * Returns: ++ * QL_STATUS_SUCCESS - Login successfully ++ * QL_STATUS_ERROR - Login failed ++ * QL_STATUS_FATAL_ERROR - Fatal error ++ */ ++static uint8_t ++qla2x00_host_relogin(scsi_qla_host_t *ha, fcdev_t *pdevice) ++{ ++ uint8_t retval = QL_STATUS_SUCCESS; ++ uint16_t status[3]; ++ uint16_t tmp_loop_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* pdevice->loop_id is assumed to be straight from the current ++ * database content. ++ */ ++ tmp_loop_id = pdevice->loop_id & 0xff; ++ if (tmp_loop_id >= LAST_SNS_LOOP_ID) { ++ /* Invalid value. We need to find a valid ID to use. */ ++ if (qla2x00_get_next_free_pub_id(ha, &tmp_loop_id) != 0) { ++ /* no more free IDs to use */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld no free loop_id " ++ " available for login.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return QL_STATUS_ERROR; ++ } ++ } ++ ++ for (;;) { ++ DEBUG9(printk("%s(%ld): Login w/loop id 0x%02x for port " ++ "%02x%02x%02x\n", ++ __func__, ha->host_no, pdevice->loop_id, ++ pdevice->d_id.b.domain, ++ pdevice->d_id.b.area, ++ pdevice->d_id.b.al_pa)); ++ ++ /* Login device on switch. */ ++ qla2x00_login_fabric(ha, ++ tmp_loop_id, pdevice->d_id.b.domain, ++ pdevice->d_id.b.area, pdevice->d_id.b.al_pa, ++ &status[0], 0); ++ ++ if (status[0] != MBS_CMD_CMP && ++ status[0] != MBS_PORT_ID_IN_USE && ++ status[0] != MBS_LOOP_ID_IN_USE) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld " ++ "ERROR login status[0]=%x status[1]=%x.\n", ++ __func__, ha->host_no, ha->instance, status[0], ++ status[1]);) ++ ++ retval = QL_STATUS_FATAL_ERROR; ++ break; ++ } ++ ++ if (status[0] == MBS_CMD_CMP) { ++ DEBUG9(printk("%s(%ld): inst=%ld " ++ " host login success; loop_id=%x.\n", ++ __func__, ha->host_no, ha->instance, tmp_loop_id);) ++ ++ pdevice->loop_id = tmp_loop_id; ++ retval = QL_STATUS_SUCCESS; ++ break; ++ ++ } else if (status[0] == MBS_PORT_ID_IN_USE) { ++ ha->fabricid[tmp_loop_id].in_use = FALSE; ++ tmp_loop_id = status[1]; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld " ++ "port %02x%02x%02x already using loop id=0x%02x in " ++ "f/w database. Retrying.\n", ++ __func__, ha->host_no, ha->instance, ++ pdevice->d_id.b.domain, ++ pdevice->d_id.b.area, ++ pdevice->d_id.b.al_pa, ++ tmp_loop_id);) ++ ++ if (tmp_loop_id <= LAST_SNS_LOOP_ID) { ++ ha->fabricid[tmp_loop_id].in_use = TRUE; ++ } else { ++ /* Error */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld " ++ "PORT_ID_IN_USE - invalid loop id %02x " ++ "returned.\n", ++ __func__, ha->host_no, ha->instance, ++ pdevice->loop_id);) ++ retval = QL_STATUS_ERROR; ++ break; ++ } ++ ++ } else if (status[0] == MBS_LOOP_ID_IN_USE) { ++ /* loop id already used by others; try another one */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld " ++ "loop id %02x already used.\n", ++ __func__, ha->host_no, ha->instance, ++ pdevice->loop_id);) ++ ++ /* Search for another usable loop_id */ ++ if (qla2x00_get_next_free_pub_id(ha, ++ &tmp_loop_id) == 0) { ++ ++ DEBUG9(printk("%s(%ld): previous loop " ++ "id in use. Retry with 0x%02x.\n", ++ __func__, ha->host_no, tmp_loop_id);) ++ ++ ha->fabricid[tmp_loop_id].in_use = TRUE; ++ } else { ++ /* Error */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld loop id " ++ "in use; no more free loop id.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ retval = QL_STATUS_ERROR; ++ break; ++ } ++ } ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting. retval=%d.\n", ++ __func__, ha->host_no, ha->instance, retval);) ++ ++ return (retval); ++} ++#endif ++ ++/* ++ * qla2x00_find_curr_ha ++ * Searches and returns the pointer to the adapter host_no specified. ++ * ++ * Input: ++ * host_inst = driver internal adapter instance number to search. ++ * ha = adapter state pointer of the instance requested. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_find_curr_ha(uint16_t host_inst, scsi_qla_host_t **ret_ha) ++{ ++ int rval = QL_STATUS_SUCCESS; ++ int found; ++ struct list_head *hal; ++ scsi_qla_host_t *search_ha = NULL; ++ ++ /* ++ * Set ha context for this IOCTL by matching host_no. ++ */ ++ found = 0; ++ read_lock(&qla_hostlist_lock); ++ list_for_each(hal, &qla_hostlist) { ++ search_ha = list_entry(hal, scsi_qla_host_t, list); ++ ++ if (search_ha->instance == host_inst) { ++ found++; ++ break; ++ } ++ } ++ read_unlock(&qla_hostlist_lock); ++ ++ if (!found) { ++ DEBUG10(printk("%s: ERROR matching host_inst " ++ "%d to an HBA Instance.\n", __func__, host_inst);) ++ rval = QL_STATUS_ERROR; ++ } else { ++ DEBUG9(printk("%s: found matching host_inst " ++ "%d to an HBA Instance.\n", __func__, host_inst);) ++ *ret_ha = search_ha; ++ } ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_get_driver_specifics ++ * Returns driver specific data in the response buffer. ++ * ++ * Input: ++ * pext = pointer to EXT_IOCTL structure containing values from user. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_driver_specifics(EXT_IOCTL *pext) ++{ ++ int ret = 0; ++ EXT_LN_DRIVER_DATA data; ++ ++ DEBUG9(printk("%s: entered.\n", ++ __func__);) ++ ++ if (pext->ResponseLen < sizeof(EXT_LN_DRIVER_DATA)) { ++ pext->Status = EXT_STATUS_BUFFER_TOO_SMALL; ++ DEBUG9_10(printk("%s: ERROR ResponseLen too small.\n", ++ __func__);) ++ ++ return (ret); ++ } ++ ++ data.DrvVer.Major = QLA_DRIVER_MAJOR_VER; ++ data.DrvVer.Minor = QLA_DRIVER_MINOR_VER; ++ data.DrvVer.Patch = QLA_DRIVER_PATCH_VER; ++ data.DrvVer.Beta = QLA_DRIVER_BETA_VER; ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ sizeof(EXT_LN_DRIVER_DATA)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s: ERROR verify write resp buf\n", ++ __func__);) ++ ++ return (ret); ++ } ++ ++ ret = copy_to_user(pext->ResponseAdr, &data, sizeof(EXT_LN_DRIVER_DATA)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s: ERROR copy resp buf\n", ++ __func__);) ++ } ++ ++ DEBUG9(printk("%s: exiting. ret=%d.\n", ++ __func__, ret);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_aen_reg ++ * IOCTL management server Asynchronous Event Tracking Enable/Disable. ++ * ++ * Input: ++ * ha = pointer to the adapter struct of the adapter to register. ++ * cmd = pointer to EXT_IOCTL structure containing values from user. ++ * mode = flags. not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_aen_reg(scsi_qla_host_t *ha, EXT_IOCTL *cmd, int mode) ++{ ++ int rval = 0; ++ EXT_REG_AEN reg_struct; ++ ++ DEBUG9(printk("%s(%ld): inst %ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ rval = verify_area(VERIFY_READ, (void *)cmd->RequestAdr, ++ sizeof(EXT_REG_AEN)); ++ if (rval) { ++ cmd->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst %ld ERROR verify read req buf\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (rval); ++ } ++ ++ rval = copy_from_user(®_struct, cmd->RequestAdr, sizeof(EXT_REG_AEN)); ++ if (rval == 0) { ++ cmd->Status = EXT_STATUS_OK; ++ if (reg_struct.Enable) { ++ ha->ioctl->flags |= IOCTL_AEN_TRACKING_ENABLE; ++ } else { ++ ha->ioctl->flags &= ~IOCTL_AEN_TRACKING_ENABLE; ++ } ++ } else { ++ cmd->Status = EXT_STATUS_COPY_ERR; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst %ld reg_struct.Enable(%d) " ++ "ha->ioctl_flag(%x) cmd->Status(%d).", ++ __func__, ha->host_no, ha->instance, reg_struct.Enable, ++ ha->ioctl->flags, cmd->Status);) ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_aen_get ++ * Asynchronous Event Record Transfer to user. ++ * The entire queue will be emptied and transferred back. ++ * ++ * Input: ++ * ha = pointer to the adapter struct of the specified adapter. ++ * pext = pointer to EXT_IOCTL structure containing values from user. ++ * mode = flags. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ * ++ * NOTE: Need to use hardware lock to protect the queues from updates ++ * via isr/enqueue_aen after we get rid of io_request_lock. ++ */ ++static int ++qla2x00_aen_get(scsi_qla_host_t *ha, EXT_IOCTL *cmd, int mode) ++{ ++ int rval = 0; ++ EXT_ASYNC_EVENT *tmp_q; ++ EXT_ASYNC_EVENT *paen; ++ uint8_t i; ++ uint8_t queue_cnt; ++ uint8_t request_cnt; ++ uint32_t stat = EXT_STATUS_OK; ++ uint32_t ret_len = 0; ++ unsigned long cpu_flags = 0; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ request_cnt = (uint8_t)(cmd->ResponseLen / sizeof(EXT_ASYNC_EVENT)); ++ ++ if (request_cnt < EXT_DEF_MAX_AEN_QUEUE) { ++ /* We require caller to alloc for the maximum request count */ ++ cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL; ++ DEBUG9_10(printk("%s(%ld): inst=%ld Buffer too small. " ++ "Exiting normally.", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (rval); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&paen, ++ sizeof(EXT_ASYNC_EVENT) * EXT_DEF_MAX_AEN_QUEUE)) { ++ /* not enough memory */ ++ cmd->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_ASYNC_EVENT)*EXT_DEF_MAX_AEN_QUEUE);) ++ return (rval); ++ } ++ ++ /* 1st: Make a local copy of the entire queue content. */ ++ tmp_q = (EXT_ASYNC_EVENT *)ha->ioctl->aen_tracking_queue; ++ queue_cnt = 0; ++ ++ spin_lock_irqsave(&ha->hardware_lock, cpu_flags); ++ i = ha->ioctl->aen_q_head; ++ ++ for (; queue_cnt < EXT_DEF_MAX_AEN_QUEUE;) { ++ if (tmp_q[i].AsyncEventCode != 0) { ++ memcpy(&paen[queue_cnt], &tmp_q[i], ++ sizeof(EXT_ASYNC_EVENT)); ++ queue_cnt++; ++ tmp_q[i].AsyncEventCode = 0; /* empty out the slot */ ++ } ++ ++ if (i == ha->ioctl->aen_q_tail) { ++ /* done. */ ++ break; ++ } ++ ++ i++; ++ ++ if (i == EXT_DEF_MAX_AEN_QUEUE) { ++ i = 0; ++ } ++ } ++ ++ /* Empty the queue. */ ++ ha->ioctl->aen_q_head = 0; ++ ha->ioctl->aen_q_tail = 0; ++ ++ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); ++ ++ /* 2nd: Now transfer the queue content to user buffer */ ++ /* Copy the entire queue to user's buffer. */ ++ ret_len = (uint32_t)(queue_cnt * sizeof(EXT_ASYNC_EVENT)); ++ if (queue_cnt != 0) { ++ rval = verify_area(VERIFY_WRITE, (void *)cmd->ResponseAdr, ++ ret_len); ++ if (rval != 0) { ++ cmd->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR verify write resp buf.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (rval); ++ } ++ ++ rval = copy_to_user(cmd->ResponseAdr, paen, ret_len); ++ } ++ cmd->ResponseLen = ret_len; ++ ++ if (rval != 0) { ++ stat = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld FAILED. error = %d\n", ++ __func__, ha->host_no, ha->instance, stat);) ++ } else { ++ stat = EXT_STATUS_OK; ++ } ++ ++ cmd->Status = stat; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting. rval=%d.\n", ++ __func__, ha->host_no, ha->instance, rval);) ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_enqueue_aen ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * event_code = async event code of the event to add to queue. ++ * payload = event payload for the queue. ++ * ++ * Context: ++ * Interrupt context. ++ * NOTE: Need to hold the hardware lock to protect the queues from ++ * aen_get after we get rid of the io_request_lock. ++ */ ++void ++qla2x00_enqueue_aen(scsi_qla_host_t *ha, uint16_t event_code, void *payload) ++{ ++ uint8_t new_entry; /* index to current entry */ ++ uint16_t *mbx; ++ EXT_ASYNC_EVENT *aen_queue; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ aen_queue = (EXT_ASYNC_EVENT *)ha->ioctl->aen_tracking_queue; ++ if (aen_queue[ha->ioctl->aen_q_tail].AsyncEventCode != 0) { ++ /* Need to change queue pointers to make room. */ ++ ++ /* Increment tail for adding new entry. */ ++ ha->ioctl->aen_q_tail++; ++ if (ha->ioctl->aen_q_tail == EXT_DEF_MAX_AEN_QUEUE) { ++ ha->ioctl->aen_q_tail = 0; ++ } ++ ++ if (ha->ioctl->aen_q_head == ha->ioctl->aen_q_tail) { ++ /* ++ * We're overwriting the oldest entry, so need to ++ * update the head pointer. ++ */ ++ ha->ioctl->aen_q_head++; ++ if (ha->ioctl->aen_q_head == EXT_DEF_MAX_AEN_QUEUE) { ++ ha->ioctl->aen_q_head = 0; ++ } ++ } ++ } ++ ++ DEBUG(printk("%s(%ld): inst=%ld Adding code 0x%x to aen_q %p @ %d\n", ++ __func__, ha->host_no, ha->instance, event_code, aen_queue, ++ ha->ioctl->aen_q_tail);) ++ ++ new_entry = ha->ioctl->aen_q_tail; ++ aen_queue[new_entry].AsyncEventCode = event_code; ++ ++ /* Update payload */ ++ switch (event_code) { ++ case MBA_LIP_OCCURRED: ++ case MBA_LOOP_UP: ++ case MBA_LOOP_DOWN: ++ case MBA_LIP_RESET: ++ case MBA_PORT_UPDATE: ++ /* empty */ ++ break; ++ ++ case MBA_SCR_UPDATE: ++ mbx = (uint16_t *)payload; ++ /* al_pa */ ++ aen_queue[new_entry].Payload.RSCN.RSCNInfo[0] = LSB(mbx[2]); ++ /* area */ ++ aen_queue[new_entry].Payload.RSCN.RSCNInfo[1] = MSB(mbx[2]); ++ /* domain */ ++ aen_queue[new_entry].Payload.RSCN.RSCNInfo[2] = LSB(mbx[1]); ++ /* save in big endian */ ++ BIG_ENDIAN_24(aen_queue[new_entry].Payload.RSCN.RSCNInfo[0]); ++ ++ aen_queue[new_entry].Payload.RSCN.AddrFormat = MSB(mbx[1]); ++ ++ break; ++ ++ default: ++ /* Not supported */ ++ aen_queue[new_entry].AsyncEventCode = 0; ++ break; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++} ++ ++/* ++ * qla2x00_query ++ * Handles all subcommands of the EXT_CC_QUERY command. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int rval = 0; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* All Query type ioctls are done here */ ++ switch(pext->SubCode) { ++ ++ case EXT_SC_QUERY_HBA_NODE: ++ /* fill in HBA NODE Information */ ++ rval = qla2x00_query_hba_node(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_HBA_PORT: ++ /* return HBA PORT related info */ ++ rval = qla2x00_query_hba_port(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_DISC_PORT: ++ /* return discovered port information */ ++ rval = qla2x00_query_disc_port(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_DISC_TGT: ++ /* return discovered target information */ ++ rval = qla2x00_query_disc_tgt(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_CHIP: ++ rval = qla2x00_query_chip(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_DISC_LUN: ++ pext->Status = EXT_STATUS_UNSUPPORTED_SUBCODE; ++ break; ++ ++ default: ++ DEBUG9_10(printk("%s(%ld): inst=%ld unknown SubCode %d.\n", ++ __func__, ha->host_no, ha->instance, pext->SubCode);) ++ pext->Status = EXT_STATUS_UNSUPPORTED_SUBCODE; ++ break; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ return rval; ++} ++ ++/* ++ * qla2x00_query_hba_node ++ * Handles EXT_SC_QUERY_HBA_NODE subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_hba_node(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint32_t i, transfer_size; ++ EXT_HBA_NODE *ptmp_hba_node; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_hba_node, ++ sizeof(EXT_HBA_NODE))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_HBA_NODE));) ++ return (ret); ++ } ++ ++ /* fill all available HBA NODE Information */ ++ for (i = 0; i < 8 ; i++) ++ ptmp_hba_node->WWNN[i] = ha->node_name[i]; ++ ++ sprintf((char *)(ptmp_hba_node->Manufacturer),"Qlogic Corp."); ++ sprintf((char *)(ptmp_hba_node->Model), ha->brd_info->name); ++ ++ ptmp_hba_node->SerialNum[0] = ha->serial0; ++ ptmp_hba_node->SerialNum[1] = ha->serial1; ++ ptmp_hba_node->SerialNum[2] = ha->serial2; ++ sprintf((char *)(ptmp_hba_node->DriverVersion), qla2x00_version_str); ++ sprintf((char *)(ptmp_hba_node->FWVersion),"%2d.%02d.%02d", ++ ha->fw_major_version, ++ ha->fw_minor_version, ++ ha->fw_subminor_version); ++ ++ sprintf((char *)(ptmp_hba_node->OptRomVersion),"%d.%d", ++ ha->optrom_major, ha->optrom_minor); ++ ++ ptmp_hba_node->InterfaceType = EXT_DEF_FC_INTF_TYPE; ++ ptmp_hba_node->PortCount = 1; ++ ++ ++ ptmp_hba_node->DriverAttr = (ha->flags.failover_enabled) ? ++ DRVR_FO_ENABLED : 0; ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ sizeof(EXT_HBA_NODE)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* now copy up the HBA_NODE to user */ ++ if (pext->ResponseLen < sizeof(EXT_HBA_NODE)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_HBA_NODE); ++ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, ++ (uint8_t *)ptmp_hba_node, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++} ++ ++/* ++ * qla2x00_query_hba_port ++ * Handles EXT_SC_QUERY_HBA_PORT subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_hba_port(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint32_t tgt_cnt, tgt, transfer_size; ++ uint32_t port_cnt; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ EXT_HBA_PORT *ptmp_hba_port; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_hba_port, ++ sizeof(EXT_HBA_PORT))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_HBA_PORT));) ++ return (ret); ++ } ++ ++ /* reflect all HBA PORT related info */ ++ ptmp_hba_port->WWPN[7] = ha->init_cb->port_name[7]; ++ ptmp_hba_port->WWPN[6] = ha->init_cb->port_name[6]; ++ ptmp_hba_port->WWPN[5] = ha->init_cb->port_name[5]; ++ ptmp_hba_port->WWPN[4] = ha->init_cb->port_name[4]; ++ ptmp_hba_port->WWPN[3] = ha->init_cb->port_name[3]; ++ ptmp_hba_port->WWPN[2] = ha->init_cb->port_name[2]; ++ ptmp_hba_port->WWPN[1] = ha->init_cb->port_name[1]; ++ ptmp_hba_port->WWPN[0] = ha->init_cb->port_name[0]; ++ ptmp_hba_port->Id[0] = 0; ++ ptmp_hba_port->Id[1] = ha->d_id.r.d_id[2]; ++ ptmp_hba_port->Id[2] = ha->d_id.r.d_id[1]; ++ ptmp_hba_port->Id[3] = ha->d_id.r.d_id[0]; ++ ptmp_hba_port->Type = EXT_DEF_INITIATOR_DEV; ++ ++ switch (ha->current_topology) { ++ case ISP_CFG_NL: ++ case ISP_CFG_FL: ++ ptmp_hba_port->Mode = EXT_DEF_LOOP_MODE; ++ break; ++ ++ case ISP_CFG_N: ++ case ISP_CFG_F: ++ ptmp_hba_port->Mode = EXT_DEF_P2P_MODE; ++ break; ++ ++ default: ++ ptmp_hba_port->Mode = EXT_DEF_UNKNOWN_MODE; ++ break; ++ } ++ ++ port_cnt = 0; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ /* if removed or missing */ ++ if (atomic_read(&fcport->state) != FC_ONLINE) { ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld port %02x%02x%02x not online\n", ++ __func__, ha->host_no, ha->instance, ++ fcport->d_id.b.domain, ++ fcport->d_id.b.area, ++ fcport->d_id.b.al_pa)); ++ continue; ++ } ++ port_cnt++; ++ } ++ ++ tgt_cnt = 0; ++ for (tgt = 0; tgt < MAX_TARGETS; tgt++) { ++ if (ha->otgt[tgt] == NULL) { ++ continue; ++ } ++ tgt_cnt++; ++ } ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld disc_port cnt=%d, tgt cnt=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ port_cnt, tgt_cnt);) ++ ptmp_hba_port->DiscPortCount = port_cnt; ++ ptmp_hba_port->DiscTargetCount = tgt_cnt; ++ ++ if (ha->loop_state == LOOP_DOWN) { ++ ++ ptmp_hba_port->State = EXT_DEF_HBA_LOOP_DOWN; ++ ++ } else if (ha->loop_state != LOOP_READY || ++ test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ABORTS_ACTIVE) { ++ ++ ptmp_hba_port->State = EXT_DEF_HBA_SUSPENDED; ++ ++ } else { ++ ++ ptmp_hba_port->State = EXT_DEF_HBA_OK; ++ ++ } ++ ++ ptmp_hba_port->DiscPortNameType = EXT_DEF_USE_PORT_NAME; ++ ++ /* Return supported FC4 type depending on driver support. */ ++ ptmp_hba_port->PortSupportedFC4Types = EXT_DEF_FC4_TYPE_SCSI; ++#if defined(FC_IP_SUPPORT) ++ ++ ptmp_hba_port->PortSupportedFC4Types |= EXT_DEF_FC4_TYPE_IP; ++#endif ++#if defined(FC_SCTP_SUPPORT) ++ ++ ptmp_hba_port->PortSupportedFC4Types |= EXT_DEF_FC4_TYPE_SCTP; ++#endif ++ ++ ptmp_hba_port->PortActiveFC4Types = ha->active_fc4_types; ++ ++ /* Return supported speed depending on adapter type */ ++#if defined(ISP2100) ++ ++ ptmp_hba_port->PortSupportedSpeed = EXT_DEF_PORTSPEED_1GBIT; ++#elif defined(ISP2200) ++ ++ ptmp_hba_port->PortSupportedSpeed = EXT_DEF_PORTSPEED_1GBIT; ++#elif defined(ISP2300) ++ ++ ptmp_hba_port->PortSupportedSpeed = EXT_DEF_PORTSPEED_2GBIT; ++#else ++ /* invalid */ ++ ptmp_hba_port->PortSupportedSpeed = 0; ++#endif ++ ++ ptmp_hba_port->PortSpeed = ha->current_speed; ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr , ++ sizeof(EXT_HBA_PORT)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* now copy up the HBA_PORT to user */ ++ if (pext->ResponseLen < sizeof(EXT_HBA_PORT)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_HBA_PORT); ++ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, ++ (uint8_t *)ptmp_hba_port, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return ret; ++} ++ ++/* ++ * qla2x00_query_disc_port ++ * Handles EXT_SC_QUERY_DISC_PORT subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_disc_port(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ int found; ++ uint32_t tgt, transfer_size, inst; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ os_tgt_t *tq; ++ EXT_DISC_PORT *ptmp_disc_port; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered. Port inst=%02d.\n", ++ __func__, ha->host_no, ha->instance, pext->Instance);) ++ ++ inst = 0; ++ found = 0; ++ fcport = NULL; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (atomic_read(&fcport->state) != FC_ONLINE) { ++ /* port does not exist anymore */ ++ DEBUG9(printk("%s(%ld): fcport marked lost. " ++ "d_id=%02x%02x%02x loop_id=%02x not online.\n", ++ __func__, ha->host_no, ++ fcport->d_id.b.domain, ++ fcport->d_id.b.area, ++ fcport->d_id.b.al_pa, ++ fcport->loop_id);) ++ ++ continue; ++ } ++ ++ if (inst != pext->Instance) { ++ DEBUG9(printk("%s(%ld): found fcport %02d " ++ "d_id=%02x%02x%02x. Skipping.\n", ++ __func__, ha->host_no, inst, ++ fcport->d_id.b.domain, ++ fcport->d_id.b.area, ++ fcport->d_id.b.al_pa)); ++ ++ inst++; ++ continue; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld found matching fcport %02d " ++ "online. d_id=%02x%02x%02x loop_id=%02x online.\n", ++ __func__, ha->host_no, ha->instance, inst, ++ fcport->d_id.b.domain, ++ fcport->d_id.b.area, ++ fcport->d_id.b.al_pa, ++ fcport->loop_id);) ++ ++ /* Found the matching port still connected. */ ++ found++; ++ break; ++ } ++ ++ if (!found) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld dev not found.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_disc_port, ++ sizeof(EXT_DISC_PORT))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_DISC_PORT));) ++ return (ret); ++ } ++ ++ memcpy(ptmp_disc_port->WWNN, fcport->node_name, WWN_SIZE); ++ memcpy(ptmp_disc_port->WWPN, fcport->port_name, WWN_SIZE); ++ ++ ptmp_disc_port->Id[0] = 0; ++ ptmp_disc_port->Id[1] = fcport->d_id.r.d_id[2]; ++ ptmp_disc_port->Id[2] = fcport->d_id.r.d_id[1]; ++ ptmp_disc_port->Id[3] = fcport->d_id.r.d_id[0]; ++ ++ /* Currently all devices on fcport list are target capable devices */ ++ /* This default value may need to be changed after we add non target ++ * devices also to this list. ++ */ ++ ptmp_disc_port->Type = EXT_DEF_TARGET_DEV; ++ ++ if (fcport->flags & FC_FABRIC_DEVICE) { ++ ptmp_disc_port->Type |= EXT_DEF_FABRIC_DEV; ++ } ++ if (fcport->flags & FC_TAPE_DEVICE) { ++ ptmp_disc_port->Type |= EXT_DEF_TAPE_DEV; ++ } ++ if (fcport->flags & FC_INITIATOR_DEVICE) { ++ ptmp_disc_port->Type |= EXT_DEF_INITIATOR_DEV; ++ } ++ ++ ptmp_disc_port->LoopID = fcport->loop_id; ++ ptmp_disc_port->Status = 0; ++ ptmp_disc_port->Bus = 0; ++ ++ for (tgt = 0; tgt < MAX_TARGETS; tgt++) { ++ if ((tq = ha->otgt[tgt]) == NULL) { ++ continue; ++ } ++ ++ if (tq->vis_port == NULL) /* dg 08/14/01 */ ++ continue; ++ ++ if (memcmp(fcport->port_name, tq->vis_port->port_name, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ ptmp_disc_port->TargetId = tgt; ++ break; ++ } ++ } ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr , ++ sizeof(EXT_DISC_PORT)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* now copy up the DISC_PORT to user */ ++ if (pext->ResponseLen < sizeof(EXT_DISC_PORT)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_DISC_PORT); ++ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, ++ (uint8_t *)ptmp_disc_port, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_query_disc_tgt ++ * Handles EXT_SC_QUERY_DISC_TGT subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_disc_tgt(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint32_t tgt, transfer_size, inst; ++ uint32_t cnt, i; ++ fc_port_t *tgt_fcport; ++ os_tgt_t *tq; ++ EXT_DISC_TARGET *ptmp_disc_target; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ tq = NULL; ++ for (tgt = 0, inst = 0; tgt < MAX_TARGETS; tgt++) { ++ if (ha->otgt[tgt] == NULL) { ++ continue; ++ } ++ /* if wrong target id then skip to next entry */ ++ if (inst != pext->Instance) { ++ inst++; ++ continue; ++ } ++ tq = ha->otgt[tgt]; ++ break; ++ } ++ ++ if (tq == NULL || tgt == MAX_TARGETS) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld target dev not found. " ++ "tq=%p, tgt=%d.\n", ++ __func__, ha->host_no, ha->instance, tq, tgt);) ++ return (ret); ++ } ++ ++ if (tq->vis_port == NULL) { /* dg 08/14/01 */ ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld target dev not found. " ++ "tq=%p.\n", ++ __func__, ha->host_no, ha->instance, tq);) ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_disc_target, ++ sizeof(EXT_DISC_TARGET))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_DISC_TARGET));) ++ return (ret); ++ } ++ ++ tgt_fcport = tq->vis_port; ++ memcpy(ptmp_disc_target->WWNN, tgt_fcport->node_name, WWN_SIZE); ++ memcpy(ptmp_disc_target->WWPN, tgt_fcport->port_name, WWN_SIZE); ++ ++ ptmp_disc_target->Id[0] = 0; ++ ptmp_disc_target->Id[1] = tgt_fcport->d_id.r.d_id[2]; ++ ptmp_disc_target->Id[2] = tgt_fcport->d_id.r.d_id[1]; ++ ptmp_disc_target->Id[3] = tgt_fcport->d_id.r.d_id[0]; ++ ++ /* All devices on ha->otgt list are target capable devices. */ ++ ptmp_disc_target->Type = EXT_DEF_TARGET_DEV; ++ ++ if (tgt_fcport->flags & FC_FABRIC_DEVICE) { ++ ptmp_disc_target->Type |= EXT_DEF_FABRIC_DEV; ++ } ++ if (tgt_fcport->flags & FC_TAPE_DEVICE) { ++ ptmp_disc_target->Type |= EXT_DEF_TAPE_DEV; ++ } ++ if (tgt_fcport->flags & FC_INITIATOR_DEVICE) { ++ ptmp_disc_target->Type |= EXT_DEF_INITIATOR_DEV; ++ } ++ ++ ptmp_disc_target->LoopID = tgt_fcport->loop_id; ++ ptmp_disc_target->Status = 0; ++ ptmp_disc_target->Bus = 0; ++ ptmp_disc_target->TargetId = tgt; ++ ++ cnt = 0; ++ /* enumerate available LUNs under this TGT (if any) */ ++ if (ha->otgt[tgt] != NULL) { ++ for (i = 0; i < MAX_LUNS ; i++) { ++ if ((ha->otgt[tgt])->olun[i] !=0) ++ cnt++; ++ } ++ } ++ ++ ptmp_disc_target->LunCount = cnt; ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ sizeof(EXT_DISC_TARGET)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* now copy up the DISC_PORT to user */ ++ if (pext->ResponseLen < sizeof(EXT_DISC_PORT)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_DISC_TARGET); ++ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, ++ (uint8_t *)ptmp_disc_target, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_query_chip ++ * Handles EXT_SC_QUERY_CHIP subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_chip(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint32_t transfer_size, i; ++ EXT_CHIP *ptmp_isp; ++ struct Scsi_Host *host; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_isp, ++ sizeof(EXT_CHIP))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_CHIP));) ++ return (ret); ++ } ++ ++ host = ha->host; ++ ptmp_isp->VendorId = ha->pdev->vendor; ++ ptmp_isp->DeviceId = ha->pdev->device; ++ ptmp_isp->SubVendorId = ha->pdev->subsystem_vendor; ++ ptmp_isp->SubSystemId = ha->pdev->subsystem_device; ++ ptmp_isp->PciBusNumber = ha->pdev->bus->number; ++ ptmp_isp->PciDevFunc = ha->pdev->devfn; ++ ptmp_isp->PciSlotNumber = PCI_SLOT(ha->pdev->devfn); ++ ptmp_isp->IoAddr = host->io_port; ++ ptmp_isp->IoAddrLen = 512; ++ ptmp_isp->MemAddr = 0; /* ? */ ++ ptmp_isp->MemAddrLen = 0; /* ? */ ++ ptmp_isp->ChipType = 0; /* ? */ ++ ptmp_isp->InterruptLevel = host->irq; ++ ++ for (i = 0; i < 8; i++) ++ ptmp_isp->OutMbx[i] = 0; ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ sizeof(EXT_CHIP)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* now copy up the ISP to user */ ++ if (pext->ResponseLen < sizeof(EXT_CHIP)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_CHIP); ++ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, (uint8_t *)ptmp_isp, ++ transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_get_data ++ * Handles all subcommands of the EXT_CC_GET_DATA command. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_data(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int tmp_rval = 0; ++ ++ switch(pext->SubCode) { ++ case EXT_SC_GET_STATISTICS: ++ tmp_rval = qla2x00_get_statistics(ha, pext, mode); ++ break; ++ ++ case EXT_SC_GET_FC_STATISTICS: ++ tmp_rval = qla2x00_get_fc_statistics(ha, pext, mode); ++ break; ++ ++ case EXT_SC_GET_PORT_SUMMARY: ++ tmp_rval = qla2x00_get_port_summary(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_DRIVER: ++ tmp_rval = qla2x00_query_driver(ha, pext, mode); ++ break; ++ ++ case EXT_SC_QUERY_FW: ++ tmp_rval = qla2x00_query_fw(ha, pext, mode); ++ break; ++ ++ case EXT_SC_GET_RNID: ++ tmp_rval = qla2x00_get_rnid_params(ha, pext, mode); ++ break; ++ ++ default: ++ DEBUG10(printk("%s(%ld): inst=%ld unknown SubCode %d.\n", ++ __func__, ha->host_no, ha->instance, pext->SubCode);) ++ pext->Status = EXT_STATUS_UNSUPPORTED_SUBCODE; ++ break; ++ } ++ ++ return (tmp_rval); ++} ++ ++/* ++ * qla2x00_get_statistics ++ * Issues get_link_status mbx cmd and returns statistics ++ * relavent to the specified adapter. ++ * ++ * Input: ++ * ha = pointer to adapter struct of the specified adapter. ++ * pext = pointer to EXT_IOCTL structure containing values from user. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_statistics(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ EXT_HBA_PORT_STAT *ptmp_stat; ++ int ret = 0; ++ link_stat_t stat_buf; ++ uint8_t rval; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint16_t mb_stat[1]; ++ uint32_t transfer_size; ++ ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ sizeof(EXT_HBA_PORT_STAT)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR VERIFY_WRITE " ++ "EXT_HBA_PORT_STAT.\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ /* check on loop down */ ++ if (ha->loop_state != LOOP_READY || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE || ha->dpc_active) { ++ ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld loop not ready.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++ } ++ ++ /* Send mailbox cmd to get more. */ ++ if ((rval = qla2x00_get_link_status(ha, ha->loop_id, &stat_buf, ++ mb_stat)) != QL_STATUS_SUCCESS) { ++ ++ if (rval == BIT_0) { ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ } else if (rval == BIT_1) { ++ pext->Status = EXT_STATUS_MAILBOX; ++ pext->DetailStatus = EXT_DSTATUS_NOADNL_INFO; ++ } else { ++ pext->Status = EXT_STATUS_ERR; ++ } ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR mailbox failed. " ++ "mb[0]=%x.\n", ++ __func__, ha->host_no, ha->instance, mb_stat[0]);) ++ printk(KERN_WARNING ++ "%s(%ld): inst=%ld ERROR mailbox failed. mb[0]=%x.\n", ++ __func__, ha->host_no, ha->instance, mb_stat[0]); ++ ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_stat, ++ sizeof(EXT_HBA_PORT_STAT))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_HBA_PORT_STAT));) ++ return (ret); ++ } ++ ++ ptmp_stat->ControllerErrorCount = ha->total_isp_aborts; ++ ptmp_stat->DeviceErrorCount = ha->total_dev_errs; ++ ptmp_stat->TotalIoCount = ha->total_ios; ++ ptmp_stat->TotalMBytes = ha->total_bytes >> 20; ++ ptmp_stat->TotalLipResets = ha->total_lip_cnt; ++ /* ++ ptmp_stat->TotalInterrupts = ha->total_isr_cnt; ++ */ ++ ++ ptmp_stat->TotalLinkFailures = stat_buf.link_fail_cnt; ++ ptmp_stat->TotalLossOfSync = stat_buf.loss_sync_cnt; ++ ptmp_stat->TotalLossOfSignals = stat_buf.loss_sig_cnt; ++ ptmp_stat->PrimitiveSeqProtocolErrorCount = stat_buf.prim_seq_err_cnt; ++ ptmp_stat->InvalidTransmissionWordCount = stat_buf.inval_xmit_word_cnt; ++ ptmp_stat->InvalidCRCCount = stat_buf.inval_crc_cnt; ++ ++ /* now copy up the STATISTICS to user */ ++ if (pext->ResponseLen < sizeof(EXT_HBA_PORT_STAT)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_HBA_PORT_STAT); ++ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)ptmp_stat; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_get_fc_statistics ++ * Issues get_link_status mbx cmd to the target device with ++ * the specified WWN and returns statistics relavent to the ++ * device. ++ * ++ * Input: ++ * ha = pointer to adapter struct of the specified device. ++ * pext = pointer to EXT_IOCTL structure containing values from user. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_fc_statistics(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ EXT_HBA_PORT_STAT *ptmp_stat; ++ EXT_DEST_ADDR addr_struct; ++ int ret = 0; ++ link_stat_t stat_buf; ++ uint8_t rval, tgt; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint8_t *req_name; ++ uint16_t mb_stat[1]; ++ uint32_t transfer_size; ++ ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ sizeof(EXT_HBA_PORT_STAT)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR VERIFY_WRITE.\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ ret = copy_from_user(&addr_struct, pext->RequestAdr, pext->RequestLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy req buf.\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ /* find the device's loop_id */ ++ switch (addr_struct.DestType) { ++ case EXT_DEF_DESTTYPE_WWPN: ++ req_name = addr_struct.DestAddr.WWPN; ++ for (tgt = 0; tgt < MAX_FIBRE_DEVICES; tgt++) { ++ if (memcmp(ha->fc_db[tgt].wwn, req_name, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ break; ++ } ++ } ++ break; ++ ++ case EXT_DEF_DESTTYPE_WWNN: ++ case EXT_DEF_DESTTYPE_PORTID: ++ case EXT_DEF_DESTTYPE_FABRIC: ++ case EXT_DEF_DESTTYPE_SCSI: ++ default: ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ pext->DetailStatus = EXT_DSTATUS_NOADNL_INFO; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR Unsupported subcode " ++ "address type.\n", __func__, ha->host_no, ha->instance);) ++ return (ret); ++ ++ break; ++ } ++ ++ if (tgt == MAX_FIBRE_DEVICES) { ++ /* not found */ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ pext->DetailStatus = EXT_DSTATUS_TARGET; ++ return (ret); ++ } ++ ++ /* check for suspended/lost device */ ++ /* ++ if (ha->fcport is suspended/lost) { ++ pext->Status = EXT_STATUS_SUSPENDED; ++ pext->DetailStatus = EXT_DSTATUS_TARGET; ++ return pext->Status; ++ } ++ */ ++ ++ /* check on loop down */ ++ if (ha->loop_state != LOOP_READY || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE || ha->dpc_active) { ++ ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld loop not ready.\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ /* Send mailbox cmd to get more. */ ++ if ((rval = qla2x00_get_link_status(ha, ha->fc_db[tgt].loop_id, ++ &stat_buf, mb_stat)) != QL_STATUS_SUCCESS) { ++ if (rval == BIT_0) { ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ } else if (rval == BIT_1) { ++ pext->Status = EXT_STATUS_MAILBOX; ++ pext->DetailStatus = EXT_DSTATUS_NOADNL_INFO; ++ } else { ++ pext->Status = EXT_STATUS_ERR; ++ } ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR mailbox failed. " ++ "mb[0]=%x.\n", ++ __func__, ha->host_no, ha->instance, mb_stat[0]);) ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptmp_stat, ++ sizeof(EXT_HBA_PORT_STAT))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_HBA_PORT_STAT));) ++ return (ret); ++ } ++ ++ ptmp_stat->ControllerErrorCount = ha->total_isp_aborts; ++ ptmp_stat->DeviceErrorCount = ha->total_dev_errs; ++ ptmp_stat->TotalIoCount = ha->total_ios; ++ ptmp_stat->TotalMBytes = ha->total_bytes >> 20; ++ ptmp_stat->TotalLipResets = ha->total_lip_cnt; ++ /* ++ ptmp_stat->TotalInterrupts = ha->total_isr_cnt; ++ */ ++ ++ ptmp_stat->TotalLinkFailures = stat_buf.link_fail_cnt; ++ ptmp_stat->TotalLossOfSync = stat_buf.loss_sync_cnt; ++ ptmp_stat->TotalLossOfSignals = stat_buf.loss_sig_cnt; ++ ptmp_stat->PrimitiveSeqProtocolErrorCount = stat_buf.prim_seq_err_cnt; ++ ptmp_stat->InvalidTransmissionWordCount = stat_buf.inval_xmit_word_cnt; ++ ptmp_stat->InvalidCRCCount = stat_buf.inval_crc_cnt; ++ ++ /* now copy up the STATISTICS to user */ ++ if (pext->ResponseLen < sizeof(EXT_HBA_PORT_STAT)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_HBA_PORT_STAT); ++ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)ptmp_stat; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_get_port_summary ++ * Handles EXT_SC_GET_PORT_SUMMARY subcommand. ++ * Returns values of devicedata and dd_entry list. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_port_summary(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint32_t b; ++ uint32_t i, port_cnt, entry; ++ uint32_t number_of_entries = 0; ++ uint32_t tgt_cnt, transfer_size; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ uint32_t current_offset; ++ void *start_of_entry_list; ++ ++ EXT_DEVICEDATA *pdevicedata; ++ EXT_DEVICEDATAENTRY *pdd_entry; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ port_cnt = 0; ++ tgt_cnt = 0; ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pdevicedata, ++ sizeof(EXT_DEVICEDATA))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "pdevicedata requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_DEVICEDATA));) ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pdd_entry, ++ sizeof(EXT_DEVICEDATAENTRY))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "pdd_entry requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_DEVICEDATAENTRY));) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ port_cnt++; ++ } ++ pdevicedata->TotalDevices = port_cnt; ++ ++ number_of_entries = pext->ResponseLen / sizeof(EXT_DEVICEDATAENTRY); ++ ++ /* we want the lesser of port_cnt and number_of_entries */ ++ if (number_of_entries > port_cnt) ++ number_of_entries = port_cnt; ++ pdevicedata->ReturnListEntryCount = number_of_entries; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld EXT_SC_GET_PORT_SUMMARY port_cnt=%x, " ++ "return entry cnt=%x.\n", ++ __func__, ha->host_no, ha->instance, port_cnt, ++ number_of_entries);) ++ ++ transfer_size = sizeof(pdevicedata->ReturnListEntryCount) + ++ sizeof(pdevicedata->TotalDevices); ++ ++ /* copy top of devicedata here */ ++ ret = verify_area(VERIFY_WRITE, (void *)(pext->ResponseAdr), ++ transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)pdevicedata; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp " ++ "devicedata buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ start_of_entry_list = (void *)(pext->ResponseAdr) + transfer_size; ++ ++ entry = 0; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (entry >= number_of_entries) ++ break; ++ ++ /* copy from fc_db of this target (port) to dd_entry */ ++ ++ memcpy(pdd_entry->NodeWWN, fcport->node_name, WWN_SIZE); ++ memcpy(pdd_entry->PortWWN, fcport->port_name, WWN_SIZE); ++ ++ for (b = 0; b < 3 ; b++) ++ pdd_entry->PortID[b] = fcport->d_id.r.d_id[2-b]; ++ ++ if (fcport->flags & FC_FABRIC_DEVICE) { ++ pdd_entry->ControlFlags = EXT_DEF_GET_FABRIC_DEVICE; ++ } else { ++ pdd_entry->ControlFlags = 0; ++ } ++ ++ pdd_entry->TargetAddress.Bus = 0; ++ /* Retrieve 'Target' number for port via fc_db */ ++ for (i = 0; i < MAX_TARGETS; i++) { ++ if (ha->fc_db[i].loop_id == PORT_UNUSED) ++ continue; ++ ++ if (memcmp(fcport->port_name, ha->fc_db[i].wwn, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ pdd_entry->TargetAddress.Target = i; ++ break; ++ } ++ } ++ pdd_entry->TargetAddress.Lun = 0; ++ pdd_entry->DeviceFlags = 0; ++ pdd_entry->LoopID = fcport->loop_id; ++ pdd_entry->BaseLunNumber = 0; ++ ++ current_offset = entry * sizeof(EXT_DEVICEDATAENTRY); ++ ++ transfer_size = sizeof(EXT_DEVICEDATAENTRY); ++ ret = verify_area(VERIFY_WRITE, ++ (void *)(start_of_entry_list + current_offset), ++ transfer_size); ++ ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG10(printk("%s(%ld): inst=%ld ERROR verify WRITE " ++ "rsp bufaddr=%p\n", ++ __func__, ha->host_no, ha->instance, ++ (void *)(start_of_entry_list + current_offset));) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return pext->Status; ++ } ++ ++ /* now copy up this dd_entry to user */ ++ usr_temp = (uint8_t *)((u_long) start_of_entry_list + ++ current_offset); ++ kernel_tmp = (uint8_t *)pdd_entry; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp " ++ "entry list buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ entry++; ++ } /* for number_of_entries */ ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_query_driver ++ * Handles EXT_SC_QUERY_DRIVER subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_driver(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint32_t transfer_size; ++ EXT_DRIVER *pdriver_prop; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pdriver_prop, ++ sizeof(EXT_DRIVER))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_DRIVER));) ++ return (ret); ++ } ++ ++ sprintf(pdriver_prop->Version, qla2x00_version_str); ++ pdriver_prop->NumOfBus = MAX_BUSES; ++ pdriver_prop->TargetsPerBus = MAX_FIBRE_DEVICES; ++ pdriver_prop->LunsPerTarget = MAX_LUNS; ++ pdriver_prop->MaxTransferLen = 0xffffffff; ++ pdriver_prop->MaxDataSegments = 0xffffffff; ++ ++ if (ha->flags.enable_64bit_addressing == 1) ++ pdriver_prop->DmaBitAddresses = 64; ++ else ++ pdriver_prop->DmaBitAddresses = 32; ++ ++ if (pext->ResponseLen < sizeof(EXT_DRIVER)) ++ transfer_size = pext->ResponseLen; ++ else ++ transfer_size = sizeof(EXT_DRIVER); ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr , ++ transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* now copy up the ISP to user */ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)pdriver_prop; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_query_fw ++ * Handles EXT_SC_QUERY_FW subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_query_fw(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint32_t transfer_size; ++ EXT_FW *pfw_prop; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pfw_prop, ++ sizeof(EXT_FW))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_FW));) ++ return (ret); ++ } ++ ++ pfw_prop->Version[0] = ha->fw_major_version; ++ pfw_prop->Version[1] = ha->fw_minor_version; ++ pfw_prop->Version[2] = ha->fw_subminor_version; ++ ++ transfer_size = sizeof(EXT_FW); ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr , ++ transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp buf.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)pfw_prop; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_size); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ pext->Status = EXT_STATUS_OK; ++ pext->DetailStatus = EXT_STATUS_OK; ++ qla2x00_free_ioctl_scrap_mem(ha); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++#if defined(ISP2300) ++/* ++ * qla2x00_send_els_passthru ++ * Passes the ELS command down to firmware as MSIOCB and ++ * copies the response back when it completes. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_send_els_passthru(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ int tmp_rval = 0; ++ ++ uint8_t index; ++ uint8_t invalid_wwn = FALSE; ++ uint8_t port_found; ++ uint8_t *ptmp_stat; ++ uint8_t *pusr_req_buf; ++ uint8_t *presp_payload; ++ uint32_t payload_len; ++ uint32_t usr_req_len; ++ ++ fcdev_t tmpdev; ++ ++ fc_lun_t *ptemp_fclun; /* buf from scrap mem */ ++ fc_port_t *ptemp_fcport; /* buf from scrap mem */ ++ ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ ++ os_lun_t *plq; ++ os_tgt_t *ptq; ++ ++ Scsi_Cmnd *pscsi_cmd; ++ ++ srb_t *sp = NULL; ++ EXT_ELS_PT_REQ *pels_pt_req; ++ ++ struct list_head *fcil; ++ fc_initiator_t *fcinitiator; ++ ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* check on current topology */ ++ if ((ha->current_topology != ISP_CFG_F) && ++ (ha->current_topology != ISP_CFG_FL)) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR not in F or FL mode\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ if (ha->ioctl_mem_size <= 0) { ++ if (qla2x00_get_new_ioctl_dma_mem(ha, ++ QLA_INITIAL_IOCTLMEM_SIZE) != QL_STATUS_SUCCESS) { ++ ++ DEBUG9_10(printk("%s: ERROR cannot alloc DMA " ++ "buffer size=%lx.\n", ++ __func__, QLA_INITIAL_IOCTLMEM_SIZE);) ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (ret); ++ } ++ } ++ ++ if (pext->ResponseLen > ha->ioctl_mem_size) { ++ if (qla2x00_get_new_ioctl_dma_mem(ha, pext->ResponseLen) != ++ QL_STATUS_SUCCESS) { ++ ++ DEBUG9_10(printk("%s: ERROR cannot alloc requested" ++ "DMA buffer size %x.\n", ++ __func__, pext->ResponseLen);) ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld rsp buf length larger than " ++ "existing size. Additional mem alloc successful.\n", ++ __func__, ha->host_no, ha->instance);) ++ } ++ ++ usr_req_len = pext->RequestLen - sizeof(EXT_ELS_PT_REQ); ++ if (usr_req_len > ha->ioctl_mem_size) { ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR ReqLen too big=%x.\n", ++ __func__, ha->host_no, ha->instance, pext->RequestLen);) ++ ++ return (ret); ++ } ++ ++ /* Verify entire EXT IOCTL request buffer */ ++ ++ ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ pext->RequestLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR verify read req buf\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld req buf verified.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_cmd, ++ sizeof(Scsi_Cmnd))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(Scsi_Cmnd));) ++ return (ret); ++ } ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pels_pt_req, ++ sizeof(EXT_ELS_PT_REQ))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "els_pt_req size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_ELS_PT_REQ));) ++ goto els_passthru_done; ++ } ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptemp_fclun, ++ sizeof(fc_lun_t))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "fclun size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(fc_lun_t));) ++ goto els_passthru_done; ++ } ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptemp_fcport, ++ sizeof(fc_port_t))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "fcport size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(fc_port_t));) ++ goto els_passthru_done; ++ } ++ ++ /* initialize */ ++ ++ memset(ha->ioctl_mem, 0, ha->ioctl_mem_size); ++ ++ /* copy request buffer */ ++ ++ ret = copy_from_user(pels_pt_req, pext->RequestAdr, ++ sizeof(EXT_ELS_PT_REQ)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR" ++ "copy_from_user() of struct failed (%d).\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ ++ goto els_passthru_done; ++ } ++ ++ pusr_req_buf = (uint8_t *)pext->RequestAdr + sizeof(EXT_ELS_PT_REQ); ++ ++ ret = copy_from_user(ha->ioctl_mem, pusr_req_buf, usr_req_len); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR" ++ "copy_from_user() of request buf failed (%d).\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ ++ goto els_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld after copy request.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* check on loop down (1) */ ++ if (ha->loop_state != LOOP_READY || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ABORTS_ACTIVE) { ++ ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld before dest port validation- loop not " ++ "ready; cannot proceed.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_BUSY; ++ ++ goto els_passthru_done; ++ } ++ ++ /*********************************/ ++ /* Validate the destination port */ ++ /*********************************/ ++ ++ /* first: WWN cannot be zero if no PID is specified */ ++ invalid_wwn = qla2x00_is_wwn_zero(pels_pt_req->WWPN); ++ if (invalid_wwn && !(pels_pt_req->ValidMask & EXT_DEF_PID_VALID)) { ++ /* error: both are not set. */ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR no valid WWPN/PID\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ goto els_passthru_done; ++ } ++ ++ /* second: it cannot be the local/current HBA itself */ ++ if (!invalid_wwn) { ++ if (memcmp(ha->init_cb->port_name, pels_pt_req->WWPN, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ ++ /* local HBA specified. */ ++ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR local HBA's " ++ "WWPN found.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ goto els_passthru_done; ++ } ++ } else { /* using PID */ ++ if (pels_pt_req->Id[1] == ha->d_id.r.d_id[2] ++ && pels_pt_req->Id[2] == ha->d_id.r.d_id[1] ++ && pels_pt_req->Id[3] == ha->d_id.r.d_id[0]) { ++ ++ /* local HBA specified. */ ++ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR local HBA's " ++ "PID found.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ goto els_passthru_done; ++ } ++ } ++ ++ /************************/ ++ /* Now find the loop ID */ ++ /************************/ ++ ++ /* 1st: scan thru our HBA database */ ++ index = 0; ++ port_found = FALSE; ++ fcinitiator = NULL; ++ if (!invalid_wwn) { ++ /* search with WWPN */ ++ list_for_each(fcil, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ if (memcmp(pels_pt_req->WWPN, fcinitiator->port_name, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ ++ port_found = TRUE; ++ pels_pt_req->Lid = fcinitiator->loop_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld found host " ++ "w/ WWN. loop_id = %02x.\n", ++ __func__, ha->host_no, ha->instance, ++ pels_pt_req->Lid);) ++ ++ break; ++ } ++ } ++ } else { ++ /* search with PID */ ++ list_for_each(fcil, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ if (pels_pt_req->Id[1] == fcinitiator->d_id.r.d_id[2] ++ && pels_pt_req->Id[2] == fcinitiator->d_id.r.d_id[1] ++ && pels_pt_req->Id[3] == ++ fcinitiator->d_id.r.d_id[0]) { ++ ++ port_found = TRUE; ++ pels_pt_req->Lid = fcinitiator->loop_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld found host " ++ "w/ WWN. loop_id = %02x.\n", ++ __func__, ha->host_no, ha->instance, ++ pels_pt_req->Lid);) ++ ++ break; ++ } ++ } ++ } ++ ++ /* If this is for a host device, check if we need to perform login */ ++ if (port_found && (fcinitiator->loop_id >= LAST_SNS_LOOP_ID)) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld need to relogin to " ++ "dest host.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (fcinitiator->d_id.b24 == 0) { ++ /* Either RSCN hasn't been processed yet or ++ * this host is no longer connected to us. ++ */ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR dest host " ++ "port lost.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ goto els_passthru_done; ++ } ++ ++ /* login and update database */ ++ tmpdev.d_id.b24 = fcinitiator->d_id.b24; ++ tmpdev.loop_id = fcinitiator->loop_id; ++ ++ if (qla2x00_host_relogin(ha, &tmpdev) != 0) { ++ /* login failed. */ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR login to " ++ "host port failed. loop_id=%02x pid=%02x%02x%02x " ++ "ret=%d.\n", ++ __func__, ha->host_no, ha->instance, tmpdev.loop_id, ++ tmpdev.d_id.b.domain, ++ tmpdev.d_id.b.area, ++ tmpdev.d_id.b.al_pa, ++ ret);) ++ ++ goto els_passthru_done; ++ } else { ++ fcinitiator->loop_id = tmpdev.loop_id; ++ pels_pt_req->Lid = tmpdev.loop_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld success login to " ++ "remote host; Lid=%02x.\n", ++ __func__, ha->host_no, ha->instance, ++ fcinitiator->loop_id);) ++ } ++ } ++ ++ /* 2nd: scan thru our fcport database */ ++ if (!invalid_wwn && !port_found) { ++ /* search with WWPN */ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (memcmp(fcport->port_name, pels_pt_req->WWPN, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ ++ port_found = TRUE; ++ pels_pt_req->Lid = fcport->loop_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld found fcport " ++ "w/ WWN. loop_id = %02x.\n", ++ __func__, ha->host_no, ha->instance, ++ pels_pt_req->Lid);) ++ break; ++ } ++ } ++ } else if (!port_found) { ++ /* search with PID */ ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (pels_pt_req->Id[1] == fcport->d_id.r.d_id[2] ++ && pels_pt_req->Id[2] == fcport->d_id.r.d_id[1] ++ && pels_pt_req->Id[3] == fcport->d_id.r.d_id[0]) { ++ ++ port_found = TRUE; ++ pels_pt_req->Lid = fcport->loop_id; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld found fcport " ++ "w/ PID. loop_id = %02x.\n", ++ __func__, ha->host_no, ha->instance, ++ pels_pt_req->Lid);) ++ ++ break; ++ } ++ } ++ } ++ ++ if (!port_found) { ++ /* invalid WWN or PID specified */ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR WWPN/PID invalid.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ goto els_passthru_done; ++ } ++ ++ /* alloc sp */ ++ if ((sp = qla2x00_get_new_sp(ha)) == NULL) { ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s: ERROR cannot alloc sp %p.\n", ++ __func__, sp);) ++ ++ goto els_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld after alloc sp.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* setup sp for this command */ ++ ptq = ha->ioctl->ioctl_tq; ++ plq = ha->ioctl->ioctl_lq; ++ sp->cmd = pscsi_cmd; ++ sp->flags = SRB_IOCTL; ++ sp->lun_queue = plq; ++ sp->tgt_queue = ptq; ++ ptemp_fclun->fcport = ptemp_fcport; ++ ptemp_fclun->lun = 0; ++ ptemp_fclun->flags = 0; ++ plq->fclun = ptemp_fclun; ++ plq->fclun->fcport->ha = ha; ++ ++ /* init scsi_cmd */ ++ pscsi_cmd->device->host = ha->host; ++ pscsi_cmd->scsi_done = qla2x00_msiocb_done; ++ ++ /* check on loop down (2)- check again just before sending cmd out. */ ++ if (ha->loop_state != LOOP_READY || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld before issue cmd- loop " ++ "not ready.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_BUSY; ++ ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto els_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld going to issue command.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ tmp_rval = qla2x00_start_ms_cmd(ha, pext, sp, pels_pt_req); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld after issue command.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (tmp_rval != 0) { ++ /* We waited and post function did not get called */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld command timed out.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_MS_NO_RESPONSE; ++ ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto els_passthru_done; ++ } ++ ++ /* check on data returned */ ++ ptmp_stat = (uint8_t *)ha->ioctl_mem + FC_HEADER_LEN; ++ ++ if (*ptmp_stat == ELS_STAT_LS_RJT) { ++ payload_len = FC_HEADER_LEN + ELS_RJT_LENGTH; ++ ++ } else if (*ptmp_stat == ELS_STAT_LS_ACC) { ++ payload_len = pext->ResponseLen - sizeof(EXT_ELS_PT_REQ); ++ ++ } else { ++ /* invalid. just copy the status word. */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld invalid stat " ++ "returned =0x%x.\n", ++ __func__, ha->host_no, ha->instance, *ptmp_stat);) ++ ++ payload_len = FC_HEADER_LEN + 4; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld data dump-\n", ++ __func__, ha->host_no, ha->instance);) ++ DEBUG9(qla2x00_dump_buffer((uint8_t *)ptmp_stat, ++ pext->ResponseLen - sizeof(EXT_ELS_PT_REQ) - FC_HEADER_LEN);) ++ ++ /* Verify response buffer to be written */ ++ /* The data returned include FC frame header */ ++ presp_payload = (uint8_t *)pext->ResponseAdr + sizeof(EXT_ELS_PT_REQ); ++ ++ ret = verify_area(VERIFY_WRITE, (void *)presp_payload, payload_len); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp " ++ "buffer. ha=%p.\n", ++ __func__, ha->host_no, ha->instance, ha);) ++ ++ goto els_passthru_done; ++ } ++ ++ /* copy back data returned to response buffer */ ++ ret = copy_to_user(presp_payload, (uint8_t *)ha->ioctl_mem, ++ payload_len); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto els_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting normally.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++els_passthru_done: ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++} ++#endif ++ ++/* ++ * qla2x00_send_fcct ++ * Passes the FC CT command down to firmware as MSIOCB and ++ * copies the response back when it completes. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_send_fcct(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ int tmp_rval = 0; ++ uint16_t mb[MAILBOX_REGISTER_COUNT]; ++ ++ fc_lun_t *ptemp_fclun; ++ fc_port_t *ptemp_fcport; ++ ++ os_lun_t *lq; ++ os_tgt_t *tq; ++ ++ Scsi_Cmnd *pscsi_cmd; ++ srb_t *sp = NULL; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* check on current topology */ ++ if ((ha->current_topology != ISP_CFG_F) && ++ (ha->current_topology != ISP_CFG_FL)) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR not in F or FL mode\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ if (ha->ioctl_mem_size <= 0) { ++ if (qla2x00_get_new_ioctl_dma_mem(ha, ++ QLA_INITIAL_IOCTLMEM_SIZE) != QL_STATUS_SUCCESS) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc " ++ "DMA buffer size=%lx.\n", ++ __func__, ha->host_no, ha->instance, ++ QLA_INITIAL_IOCTLMEM_SIZE);) ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (ret); ++ } ++ } ++ ++ if (pext->ResponseLen > ha->ioctl_mem_size) { ++ if (qla2x00_get_new_ioctl_dma_mem(ha, pext->ResponseLen) != ++ QL_STATUS_SUCCESS) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc " ++ "requested DMA buffer size %x.\n", ++ __func__, ha->host_no, ha->instance, ++ pext->ResponseLen);) ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld rsp buf len larger than " ++ "existing size. Additional mem alloc successful.\n", ++ __func__, ha->host_no, ha->instance);) ++ } ++ ++ if (pext->RequestLen > ha->ioctl_mem_size) { ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR ReqLen too big=%x.\n", ++ __func__, ha->host_no, ha->instance, pext->RequestLen);) ++ ++ return (ret); ++ } ++ ++ ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ pext->RequestLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR verify read req buf\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld req buf verified.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_cmd, ++ sizeof(Scsi_Cmnd))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(Scsi_Cmnd));) ++ return (ret); ++ } ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptemp_fclun, ++ sizeof(fc_lun_t))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "fclun size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(fc_lun_t));) ++ goto fcct_passthru_done; ++ } ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&ptemp_fcport, ++ sizeof(fc_port_t))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "fcport size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(fc_port_t));) ++ goto fcct_passthru_done; ++ } ++ ++ /* initialize */ ++ memset(ha->ioctl_mem, 0, ha->ioctl_mem_size); ++ ++ /* copy request buffer */ ++ ret = copy_from_user(ha->ioctl_mem, pext->RequestAdr, pext->RequestLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR copy req buf. ret=%d\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ ++ ++ goto fcct_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld after copy request.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* alloc sp */ ++ if ((sp = qla2x00_get_new_sp(ha)) == NULL) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc " ++ "sp %p.\n", ++ __func__, ha->host_no, ha->instance, sp);) ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ goto fcct_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld after alloc sp.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* setup sp for this command */ ++ tq = ha->ioctl->ioctl_tq; ++ lq = ha->ioctl->ioctl_lq; ++ sp->cmd = pscsi_cmd; ++ sp->flags = SRB_IOCTL; ++ sp->lun_queue = lq; ++ sp->tgt_queue = tq; ++ ptemp_fclun->fcport = ptemp_fcport; ++ ptemp_fclun->lun = 0; ++ ptemp_fclun->flags = 0; ++ lq->fclun = ptemp_fclun; ++ lq->fclun->fcport->ha = ha; ++ ++ /* init scsi_cmd */ ++ pscsi_cmd->device->host = ha->host; ++ pscsi_cmd->scsi_done = qla2x00_msiocb_done; ++ ++ /* check on management server login status */ ++ if (ha->flags.management_server_logged_in == 0) { ++ /* login to management server device */ ++ ++ tmp_rval = qla2x00_login_fabric(ha, MANAGEMENT_SERVER, ++ 0xff, 0xff, 0xfa, &mb[0], BIT_1); ++ ++ if (tmp_rval != 0 || mb[0] != 0x4000) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ ++ DEBUG10(printk("%s(%ld): inst=%ld ERROR login to MS.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto fcct_passthru_done; ++ } ++ ++ ha->flags.management_server_logged_in = 1; ++ } ++ ++ DEBUG9(printk("%s(%ld): success login to MS.\n", ++ __func__, ha->host_no);) ++ ++ /* check on loop down */ ++ if (ha->loop_state != LOOP_READY || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE) { ++ ++ DEBUG10(printk("%s(%ld): inst=%ld loop not ready.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_BUSY; ++ ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto fcct_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld going to issue command.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ tmp_rval = qla2x00_start_ms_cmd(ha, pext, sp, NULL); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld after issue command.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (tmp_rval != 0) { ++ /* We waited and post function did not get called */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld command timed out.\n", ++ __func__, ha->host_no, ha->instance);) ++ pext->Status = EXT_STATUS_MS_NO_RESPONSE; ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto fcct_passthru_done; ++ } ++ ++ if (CMD_COMPL_STATUS(pscsi_cmd) != 0 || ++ CMD_ENTRY_STATUS(pscsi_cmd) != 0) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld cmd returned error=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pscsi_cmd));) ++ pext->Status = EXT_STATUS_ERR; ++ goto fcct_passthru_done; ++ } ++ ++ /* getting device data and putting in pext->ResponseAdr */ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr , ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify wrt rsp " ++ "buffer. ha=%p.\n", ++ __func__, ha->host_no, ha->instance, ha);) ++ goto fcct_passthru_done; ++ } ++ ++ /* sending back data returned from Management Server */ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, ++ (uint8_t *)ha->ioctl_mem, pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto fcct_passthru_done; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++fcct_passthru_done: ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++} ++ ++/* ++ * qla2x00_start_ms_cmd ++ * Allocates an MSIOCB request pkt and sends out the passthru cmd. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_start_ms_cmd(scsi_qla_host_t *ha, EXT_IOCTL *pext, srb_t *sp, ++ EXT_ELS_PT_REQ *pels_pt_req) ++{ ++#define ELS_REQUEST_RCTL 0x22 ++#define ELS_REPLY_RCTL 0x23 ++ ++ uint32_t usr_req_len; ++ uint32_t usr_resp_len; ++ uint64_t usr_reqbuf_addr; ++ ++ ms_iocb_entry_t *pkt; ++ unsigned long cpu_flags = 0; ++ ++ ++ /* get spin lock for this operation */ ++ spin_lock_irqsave(&ha->hardware_lock, cpu_flags); ++ ++ /* Get MS request packet. */ ++ pkt = (ms_iocb_entry_t *)qla2x00_ms_req_pkt(ha, sp); ++ if (pkt == NULL) { ++ /* release spin lock and return error. */ ++ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG10(printk("%s(%ld): inst=%ld MSIOCB PT - could not get " ++ "Request Packet.\n", __func__, ha->host_no, ha->instance);) ++ return (QL_STATUS_RESOURCE_ERROR); ++ } ++ ++ pkt->entry_type = MS_IOCB_TYPE; ++ pkt->entry_count = 1; ++ ++ if (pels_pt_req != NULL) { ++ /* process ELS passthru command */ ++ usr_reqbuf_addr = (uint64_t)ha->ioctl_mem_phys + ++ sizeof(EXT_ELS_PT_REQ); ++ usr_req_len = pext->RequestLen - sizeof(EXT_ELS_PT_REQ); ++ usr_resp_len = pext->ResponseLen - sizeof(EXT_ELS_PT_REQ); ++ ++ pkt->control_flags = BIT_15; /* ELS passthru enabled */ ++ pkt->loop_id = pels_pt_req->Lid; ++ pkt->type = 1; /* ELS frame */ ++ ++ if (pext->ResponseLen != 0) { ++ pkt->r_ctl = ELS_REQUEST_RCTL; ++ pkt->rx_id = 0; ++ } else { ++ pkt->r_ctl = ELS_REPLY_RCTL; ++ pkt->rx_id = pels_pt_req->Rxid; ++ } ++ } else { ++ usr_reqbuf_addr = (uint64_t)ha->ioctl_mem_phys; ++ usr_req_len = pext->RequestLen; ++ usr_resp_len = pext->ResponseLen; ++ pkt->loop_id = MANAGEMENT_SERVER; ++ } ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld using loop_id=%02x req_len=%d, " ++ "resp_len=%d.\n", __func__, ha->host_no, ha->instance, ++ pkt->loop_id, usr_req_len, usr_resp_len);) ++ ++ pkt->timeout = QLA_PT_CMD_TOV; ++ pkt->cmd_dsd_count = 1; ++ pkt->total_dsd_count = 2; /* no continuation */ ++ pkt->rsp_bytecount = usr_resp_len; ++ pkt->req_bytecount = usr_req_len; ++ ++ /* loading command payload address */ ++ pkt->dseg_req_address[0] = LSD(usr_reqbuf_addr); ++ pkt->dseg_req_address[1] = MSD(usr_reqbuf_addr); ++ pkt->dseg_req_length = usr_req_len; ++ ++ /* loading response payload address */ ++ pkt->dseg_rsp_address[0] = LSD(ha->ioctl_mem_phys); ++ pkt->dseg_rsp_address[1] = MSD(ha->ioctl_mem_phys); ++ pkt->dseg_rsp_length = usr_resp_len; ++ ++ /* set flag to indicate IOCTL MSIOCB cmd in progress */ ++ ha->ioctl->MSIOCB_InProgress = 1; ++ ha->ioctl->ioctl_tov = pkt->timeout + 1; /* 1 second more */ ++ ++ /* prepare for receiving completion. */ ++ qla2x00_ioctl_sem_init(ha); ++ ++ /* Issue command to ISP */ ++ qla2x00_isp_cmd(ha); ++ ++ ha->ioctl->cmpl_timer.expires = jiffies + ha->ioctl->ioctl_tov * HZ; ++ add_timer(&ha->ioctl->cmpl_timer); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld releasing hardware_lock.\n", ++ __func__, ha->host_no, ha->instance);) ++ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld sleep for completion.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ down(&ha->ioctl->cmpl_sem); ++ ++ del_timer(&ha->ioctl->cmpl_timer); ++ ++ if (ha->ioctl->MSIOCB_InProgress == 1) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld timed out. exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ return QL_STATUS_ERROR; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return QL_STATUS_SUCCESS; ++} ++ ++/* ++ * qla2x00_wwpn_to_scsiaddr ++ * Handles the EXT_CC_WWPN_TO_SCSIADDR command. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_wwpn_to_scsiaddr(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ fc_port_t *tgt_fcport; ++ os_tgt_t *tq; ++ uint8_t tmp_wwpn[EXT_DEF_WWN_NAME_SIZE]; ++ uint32_t b, tgt, l; ++ EXT_SCSI_ADDR tmp_addr; ++ ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (pext->RequestLen != EXT_DEF_WWN_NAME_SIZE || ++ pext->ResponseLen < sizeof(EXT_SCSI_ADDR)) { ++ /* error */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld invalid WWN buffer size %d " ++ "received.\n", ++ __func__, ha->host_no, ha->instance, pext->ResponseLen);) ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ ++ return (ret); ++ } ++ ++ ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ pext->RequestLen); ++ if (ret) { ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR VERIFY_READ req buf\n", ++ __func__, ha->host_no, ha->instance);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ return (ret); ++ } ++ ++ ret = copy_from_user(tmp_wwpn, pext->RequestAdr, pext->RequestLen); ++ if (ret) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy_from_user " ++ "failed(%d) on request buf.\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ pext->Status = EXT_STATUS_COPY_ERR; ++ return (ret); ++ } ++ ++ tq = NULL; ++ for (tgt = 0; tgt < MAX_TARGETS; tgt++) { ++ if (ha->otgt[tgt] == NULL) { ++ continue; ++ } ++ ++ tq = ha->otgt[tgt]; ++ if (tq->vis_port == NULL) { ++ break; ++ } ++ ++ tgt_fcport = tq->vis_port; ++ if (memcmp(tmp_wwpn, tgt_fcport->port_name, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ break; ++ } ++ } ++ ++ if (tq == NULL || tgt >= MAX_TARGETS) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld target dev not found. " ++ "tq=%p, tgt=%x.\n", __func__, ha->host_no, ha->instance, ++ tq, tgt);) ++ return (ret); ++ } ++ ++ if (tq->vis_port == NULL) { /* dg 08/14/01 */ ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld target port not found. " ++ "tq=%p, tgt=%x.\n", ++ __func__, ha->host_no, ha->instance, tq, tgt);) ++ return (ret); ++ } ++ ++ /* Currently we only have bus 0 and no translation on LUN */ ++ b = 0; ++ l = 0; ++ ++ /* ++ * Return SCSI address. Currently no translation is done for ++ * LUN. ++ */ ++ tmp_addr.Bus = b; ++ tmp_addr.Target = tgt; ++ tmp_addr.Lun = l; ++ if (pext->ResponseLen > sizeof(EXT_SCSI_ADDR)) ++ pext->ResponseLen = sizeof(EXT_SCSI_ADDR); ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR VERIFY wrt rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, &tmp_addr, ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ DEBUG9(printk(KERN_INFO ++ "%s(%ld): Found t%d l%d for %02x%02x%02x%02x%02x%02x%02x%02x.\n", ++ __func__, ha->host_no, ++ tmp_addr.Target, tmp_addr.Lun, ++ tmp_wwpn[0], tmp_wwpn[1], tmp_wwpn[2], tmp_wwpn[3], ++ tmp_wwpn[4], tmp_wwpn[5], tmp_wwpn[6], tmp_wwpn[7]);) ++ ++ pext->Status = EXT_STATUS_OK; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_scsi_passthru ++ * Handles all subcommands of the EXT_CC_SEND_SCSI_PASSTHRU command. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_scsi_passthru(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int tmp_rval = 0; ++ ++ switch(pext->SubCode) { ++ case EXT_SC_SEND_SCSI_PASSTHRU: ++ tmp_rval = qla2x00_sc_scsi_passthru(ha, pext, mode); ++ break; ++ case EXT_SC_SEND_FC_SCSI_PASSTHRU: ++ tmp_rval = qla2x00_sc_fc_scsi_passthru(ha, pext, mode); ++ break; ++ case EXT_SC_SCSI3_PASSTHRU: ++ tmp_rval = qla2x00_sc_scsi3_passthru(ha, pext, mode); ++ break; ++ default: ++ break; ++ } ++ ++ return tmp_rval; ++} ++ ++/* ++ * qla2x00_sc_scsi_passthru ++ * Handles EXT_SC_SEND_SCSI_PASSTHRU subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_sc_scsi_passthru(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint8_t scsi_direction; ++ uint32_t i; ++ ++#if defined(QL_DEBUG_LEVEL_9) ++ uint32_t b, t, l; ++#endif ++ uint32_t transfer_len; ++ ++ EXT_SCSI_PASSTHRU *pscsi_pass; ++ ++ Scsi_Cmnd *pscsi_cmd; ++ Scsi_Device *pscsi_device; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ sizeof(EXT_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify READ " ++ "req buf.\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ if (pext->ResponseLen > ha->ioctl_mem_size) { ++ if (qla2x00_get_new_ioctl_dma_mem(ha, pext->ResponseLen) != ++ QL_STATUS_SUCCESS) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc " ++ "requested DMA buffer size %x.\n", ++ __func__, ha->host_no, ha->instance, ++ pext->ResponseLen);) ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (ret); ++ } ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_pass, ++ sizeof(EXT_SCSI_PASSTHRU))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_SCSI_PASSTHRU));) ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_cmd, ++ sizeof(Scsi_Cmnd))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "pscsi_cmd requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(Scsi_Cmnd));) ++ goto scsi_passthru_done; ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi_device, ++ sizeof(Scsi_Device))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "pscsi_device requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(Scsi_Device));) ++ goto scsi_passthru_done; ++ } ++ ++ /* clear ioctl_mem to be used */ ++ memset(ha->ioctl_mem, 0, ha->ioctl_mem_size); ++ ++ /* Copy request buffer */ ++ usr_temp = (uint8_t *)pext->RequestAdr; ++ kernel_tmp = (uint8_t *)pscsi_pass; ++ ret = copy_from_user(kernel_tmp, usr_temp, sizeof(EXT_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR copy req buf ret=%d\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ goto scsi_passthru_done; ++ } ++ ++ /* set target coordinates */ ++ pscsi_cmd->device->id = pscsi_pass->TargetAddr.Target; ++ pscsi_cmd->device->lun = pscsi_pass->TargetAddr.Lun; ++ ++ /* Verify target exists */ ++ if (TGT_Q(ha, pscsi_cmd->device->id) == NULL) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR tgt %d not found.\n", ++ __func__, ++ ha->host_no, ha->instance, pscsi_cmd->device->id)); ++ goto scsi_passthru_done; ++ } ++ ++ /* Copy over cdb */ ++ ++ if (pscsi_pass->CdbLength == 6) { ++ pscsi_cmd->cmd_len = 6; ++ ++ } else if (pscsi_pass->CdbLength == 10) { ++ pscsi_cmd->cmd_len = 0x0A; ++ ++ } else if (pscsi_pass->CdbLength == 12) { ++ pscsi_cmd->cmd_len = 0x0C; ++ ++ } else { ++ printk(KERN_WARNING ++ "%s: Unsupported Cdb Length=%x.\n", ++ __func__, pscsi_pass->CdbLength); ++ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ goto scsi_passthru_done; ++ } ++ ++ memcpy(pscsi_cmd->data_cmnd, pscsi_pass->Cdb, pscsi_cmd->cmd_len); ++ memcpy(pscsi_cmd->cmnd, pscsi_pass->Cdb, pscsi_cmd->cmd_len); ++ ++ DEBUG9(printk("%s Dump of cdb buffer:\n", __func__);) ++ DEBUG9(qla2x00_dump_buffer((uint8_t *)&pscsi_cmd->data_cmnd[0], ++ pscsi_cmd->cmd_len);) ++ ++ pscsi_cmd->device->host = ha->host; ++ ++ /* mark this as a special delivery and collection command */ ++ pscsi_cmd->flags = 0; ++ pscsi_cmd->scsi_done = qla2x00_scsi_pt_done; ++ ++ pscsi_cmd->device = pscsi_device; ++ pscsi_cmd->device->tagged_queue = 0; ++ pscsi_cmd->use_sg = 0; /* no ScatterGather */ ++ pscsi_cmd->request_bufflen = pext->ResponseLen; ++ pscsi_cmd->request_buffer = ha->ioctl_mem; ++ pscsi_cmd->timeout_per_command = QLA_PT_CMD_TOV * HZ; ++ CMD_RESID_LEN(pscsi_cmd) = SRB_IOCTL; /* Used to set sp->flags later */ ++ ++ if (pscsi_pass->Direction == EXT_DEF_SCSI_PASSTHRU_DATA_OUT) { ++ /* sending user data from pext->ResponseAdr to device */ ++ ret = verify_area(VERIFY_READ, (void *)pext->ResponseAdr, ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify READ " ++ "rsp buf.\n", __func__, ha->host_no, ha->instance);) ++ goto scsi_passthru_done; ++ } ++ ++ pscsi_cmd->sc_data_direction = SCSI_DATA_WRITE; ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)ha->ioctl_mem; ++ ret = copy_from_user(kernel_tmp, usr_temp, pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buf " ++ "failed(%d).\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ goto scsi_passthru_done; ++ } ++ } else { ++ pscsi_cmd->sc_data_direction = SCSI_DATA_READ; ++ } ++ ++ DEBUG9({ ++ b = SCSI_BUS_32(pscsi_cmd); ++ t = SCSI_TCN_32(pscsi_cmd); ++ l = SCSI_LUN_32(pscsi_cmd); ++ }) ++ DEBUG9(printk("%s(%ld): CDB=%02x %02x %02x %02x; b=%x t=%x l=%x.\n", ++ __func__, ha->host_no, pscsi_cmd->cmnd[0], pscsi_cmd->cmnd[1], ++ pscsi_cmd->cmnd[2], pscsi_cmd->cmnd[3], b, t, l);) ++ ++ /* ++ * Check the status of the port ++ */ ++ if (qla2x00_check_tgt_status(ha, pscsi_cmd) != QL_STATUS_SUCCESS) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld check_tgt_status " ++ "failed.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto scsi_passthru_done; ++ } ++ ++ /* set flag to indicate IOCTL SCSI PassThru in progress */ ++ ha->ioctl->SCSIPT_InProgress = 1; ++ ha->ioctl->ioctl_tov = (int)QLA_PT_CMD_DRV_TOV; ++ ++ /* prepare for receiving completion. */ ++ qla2x00_ioctl_sem_init(ha); ++ CMD_COMPL_STATUS(pscsi_cmd) = (int) IOCTL_INVALID_STATUS; ++ ++ /* send command to adapter */ ++ DEBUG9(printk("%s(%ld): inst=%ld sending command.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* get spin lock for this operation */ ++ spin_lock_irqsave(ha->host->host_lock, ha->cpu_flags); ++ ++ qla2x00_queuecommand(pscsi_cmd, (void *) qla2x00_scsi_pt_done); ++ ++ ha->ioctl->cmpl_timer.expires = jiffies + ha->ioctl->ioctl_tov * HZ; ++ add_timer(&ha->ioctl->cmpl_timer); ++ ++ spin_unlock_irqrestore(ha->host->host_lock, ha->cpu_flags); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld waiting for completion.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ down(&ha->ioctl->cmpl_sem); ++ ++ del_timer(&ha->ioctl->cmpl_timer); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld completed.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (ha->ioctl->SCSIPT_InProgress == 1) { ++ ++ printk(KERN_WARNING ++ "qla2x00: scsi%ld ERROR passthru command timeout.\n", ++ ha->host_no); ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ goto scsi_passthru_done; ++ } ++ ++ if (CMD_COMPL_STATUS(pscsi_cmd) == (int)IOCTL_INVALID_STATUS) { ++ ++ DEBUG9(printk("%s(%ld): inst=%ld ERROR - cmd not completed.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_ERR; ++ goto scsi_passthru_done; ++ } ++ ++ switch (CMD_COMPL_STATUS(pscsi_cmd)) { ++ case CS_INCOMPLETE: ++ case CS_ABORTED: ++ case CS_PORT_UNAVAILABLE: ++ case CS_PORT_LOGGED_OUT: ++ case CS_PORT_CONFIG_CHG: ++ case CS_PORT_BUSY: ++ DEBUG9_10(printk("%s(%ld): inst=%ld cs err = %x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pscsi_cmd));) ++ pext->Status = EXT_STATUS_BUSY; ++ ++ goto scsi_passthru_done; ++ } ++ ++ if ((CMD_COMPL_STATUS(pscsi_cmd) == CS_DATA_UNDERRUN) || ++ (CMD_SCSI_STATUS(pscsi_cmd) != 0)) { ++ ++ /* have done the post function */ ++ pext->Status = EXT_STATUS_SCSI_STATUS; ++ pext->DetailStatus = CMD_SCSI_STATUS(pscsi_cmd) & 0xff; ++ DEBUG9_10(printk("%s(%ld): inst=%ld data underrun or scsi err. " ++ "host status =0x%x, scsi status = 0x%x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pscsi_cmd), CMD_SCSI_STATUS(pscsi_cmd));) ++ ++ } else if (CMD_COMPL_STATUS(pscsi_cmd) != 0) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld cs err=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pscsi_cmd));) ++ pext->Status = EXT_STATUS_ERR; ++ goto scsi_passthru_done; ++ } ++ ++ /* copy up structure to make sense data available to user */ ++ pscsi_pass->SenseLength = CMD_ACTUAL_SNSLEN(pscsi_cmd); ++ if (CMD_ACTUAL_SNSLEN(pscsi_cmd)) { ++ for (i = 0; i < CMD_ACTUAL_SNSLEN(pscsi_cmd); i++) ++ pscsi_pass->SenseData[i] = pscsi_cmd->sense_buffer[i]; ++ ++ DEBUG10(printk("%s Dump of sense buffer:\n", __func__);) ++ DEBUG10(qla2x00_dump_buffer( ++ (uint8_t *)&pscsi_pass->SenseData[0], ++ CMD_ACTUAL_SNSLEN(pscsi_cmd));) ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->RequestAdr, ++ sizeof(EXT_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify WRITE " ++ "req buf.\n", __func__, ha->host_no, ha->instance);) ++ goto scsi_passthru_done; ++ } ++ ++ usr_temp = (uint8_t *)pext->RequestAdr; ++ kernel_tmp = (uint8_t *)pscsi_pass; ++ ret = copy_to_user(usr_temp, kernel_tmp, ++ sizeof(EXT_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy sense " ++ "buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto scsi_passthru_done; ++ } ++ } ++ ++ scsi_direction = pscsi_pass->Direction; ++ ++ if (scsi_direction == EXT_DEF_SCSI_PASSTHRU_DATA_IN) { ++ DEBUG9(printk("%s(%ld): inst=%ld copying data.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* getting device data and putting in pext->ResponseAdr */ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr , ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify write " ++ "ResponseAdr.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto scsi_passthru_done; ++ } ++ ++ /* now copy up the READ data to user */ ++ if ((CMD_COMPL_STATUS(pscsi_cmd) == CS_DATA_UNDERRUN) && ++ (CMD_RESID_LEN(pscsi_cmd))) { ++ ++ transfer_len = pext->ResponseLen - ++ CMD_RESID_LEN(pscsi_cmd); ++ ++ pext->ResponseLen = transfer_len; ++ } else { ++ transfer_len = pext->ResponseLen; ++ } ++ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)ha->ioctl_mem; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_len); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR copy rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ goto scsi_passthru_done; ++ } ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++scsi_passthru_done: ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++} ++ ++/* ++ * qla2x00_sc_fc_scsi_passthru ++ * Handles EXT_SC_SEND_FC_SCSI_PASSTHRU subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_sc_fc_scsi_passthru(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ int port_found, lun_found; ++ fc_lun_t temp_fclun; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ struct list_head *fcll; ++ fc_lun_t *fclun = NULL; ++ os_lun_t *lq; ++ os_tgt_t *tq; ++ srb_t *sp = NULL; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint32_t i; ++ ++#if defined(QL_DEBUG_LEVEL_9) ++ uint32_t b, t, l; ++#endif ++ uint32_t transfer_len; ++ uint8_t scsi_direction; ++ ++ EXT_FC_SCSI_PASSTHRU *pfc_scsi_pass; ++ ++ Scsi_Cmnd *pfc_scsi_cmd; ++ Scsi_Device *pfc_scsi_device; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if ((sp = qla2x00_get_new_sp(ha)) == NULL) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc sp.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pfc_scsi_pass, ++ sizeof(EXT_FC_SCSI_PASSTHRU))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_FC_SCSI_PASSTHRU));) ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pfc_scsi_cmd, ++ sizeof(Scsi_Cmnd))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(Scsi_Cmnd));) ++ goto fc_scsi_passthru_done; ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pfc_scsi_device, ++ sizeof(Scsi_Device))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(Scsi_Device));) ++ goto fc_scsi_passthru_done; ++ } ++ ++ /* clear ioctl_mem to be used */ ++ memset(ha->ioctl_mem, 0, ha->ioctl_mem_size); ++ ++ ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ sizeof(EXT_FC_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR verify READ req buf.\n", ++ __func__, ha->host_no, ha->instance);) ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto fc_scsi_passthru_done; ++ } ++ ++ if (pext->ResponseLen > ha->ioctl_mem_size) { ++ if (qla2x00_get_new_ioctl_dma_mem(ha, pext->ResponseLen) != ++ QL_STATUS_SUCCESS) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc " ++ "requested DMA buffer size %x.\n", ++ __func__, ha->host_no, ha->instance, ++ pext->ResponseLen);) ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto fc_scsi_passthru_done; ++ } ++ } ++ ++ /* Copy request buffer */ ++ usr_temp = (uint8_t *)pext->RequestAdr; ++ kernel_tmp = (uint8_t *)pfc_scsi_pass; ++ ret = copy_from_user(kernel_tmp, usr_temp, ++ sizeof(EXT_FC_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR copy req buf ret=%d\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto fc_scsi_passthru_done; ++ } ++ ++ if (pfc_scsi_pass->FCScsiAddr.DestType != EXT_DEF_DESTTYPE_WWPN) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR -wrong Dest type. \n", ++ __func__, ha->host_no, ha->instance);) ++ ret = EXT_STATUS_ERR; ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto fc_scsi_passthru_done; ++ } ++ ++ fcport = NULL; ++ fclun = NULL; ++ port_found = lun_found = 0; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (memcmp(fcport->port_name, ++ pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN, 8) != 0) { ++ continue; ++ ++ } ++ port_found++; ++ ++ list_for_each(fcll, &fcport->fcluns) { ++ fclun = list_entry(fcll, fc_lun_t, list); ++ ++ if (fclun->lun == pfc_scsi_pass->FCScsiAddr.Lun) { ++ /* Found the right LUN */ ++ lun_found++; ++ break; ++ } ++ } ++ break; ++ } ++ ++ if (!port_found) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld FC AddrFormat - DID NOT " ++ "FIND Port matching WWPN.\n", ++ __func__, ha->host_no, ha->instance);) ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto fc_scsi_passthru_done; ++ } ++ ++ /* v5.21b9 - use a temporary fclun */ ++ if (!lun_found) { ++ fclun = &temp_fclun; ++ fclun->fcport = fcport; ++ fclun->lun = pfc_scsi_pass->FCScsiAddr.Lun; ++ fclun->flags = 0; ++ } ++ ++ /* set target coordinates */ ++ pfc_scsi_cmd->device->id = 0xff; /* not used. just put something there. */ ++ pfc_scsi_cmd->device->lun = pfc_scsi_pass->FCScsiAddr.Lun; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld cmd for loopid=%04x L=%04x " ++ "WWPN=%02x%02x%02x%02x%02x%02x%02x%02x.\n", ++ __func__, ha->host_no, ha->instance, fclun->fcport->loop_id, ++ pfc_scsi_cmd->device->lun, ++ pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[0], ++ pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[1], ++ pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[2], ++ pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[3], ++ pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[4], ++ pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[5], ++ pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[6], ++ pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN[7]);) ++ ++ if (pfc_scsi_pass->CdbLength == 6) { ++ sp->cmd_length = 6; ++ pfc_scsi_cmd->cmd_len = 6; ++ ++ } else if (pfc_scsi_pass->CdbLength == 0x0A) { ++ sp->cmd_length = 0x0A; ++ pfc_scsi_cmd->cmd_len = 0x0A; ++ ++ } else if (pfc_scsi_pass->CdbLength == 0x0C) { ++ sp->cmd_length = 0x0C; ++ pfc_scsi_cmd->cmd_len = 0x0C; ++ ++ } else if (pfc_scsi_pass->CdbLength == 0x10) { ++ sp->cmd_length = 0x10; ++ pfc_scsi_cmd->cmd_len = 0x10; ++ } else { ++ printk(KERN_WARNING ++ "qla2x00_ioctl: FC_SCSI_PASSTHRU Unknown Cdb Length=%x.\n", ++ pfc_scsi_pass->CdbLength); ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto fc_scsi_passthru_done; ++ } ++ ++ memcpy(pfc_scsi_cmd->data_cmnd, pfc_scsi_pass->Cdb, ++ pfc_scsi_cmd->cmd_len); ++ memcpy(pfc_scsi_cmd->cmnd, pfc_scsi_pass->Cdb, ++ pfc_scsi_cmd->cmd_len); ++ ++ DEBUG9(printk("%s Dump of cdb buffer:\n", __func__);) ++ DEBUG9(qla2x00_dump_buffer((uint8_t *)&pfc_scsi_cmd->data_cmnd[0], 16);) ++ ++ pfc_scsi_cmd->device->host = ha->host; ++ sp->ha = ha; ++ sp->cmd = pfc_scsi_cmd; ++ sp->flags = SRB_IOCTL; ++ ++ /* set local fc_scsi_cmd's sp pointer to sp */ ++ CMD_SP(pfc_scsi_cmd) = (void *) sp; ++ ++ /* mark this as a special delivery and collection command */ ++ pfc_scsi_cmd->flags = 0; ++ pfc_scsi_cmd->scsi_done = qla2x00_scsi_pt_done; ++ ++ pfc_scsi_cmd->device = pfc_scsi_device; ++ pfc_scsi_cmd->device->tagged_queue = 0; ++ pfc_scsi_cmd->use_sg = 0; /* no ScatterGather */ ++ pfc_scsi_cmd->request_bufflen = pext->ResponseLen; ++ pfc_scsi_cmd->request_buffer = ha->ioctl_mem; ++ pfc_scsi_cmd->timeout_per_command = QLA_PT_CMD_TOV * HZ; ++ ++ if (pfc_scsi_pass->Direction == EXT_DEF_SCSI_PASSTHRU_DATA_OUT) { ++ /* sending user data from pext->ResponseAdr to device */ ++ ret = verify_area(VERIFY_READ, (void *)pext->ResponseAdr, ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify read " ++ "ResponseAdr.\n", ++ __func__, ha->host_no, ha->instance);) ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto fc_scsi_passthru_done; ++ } ++ ++ pfc_scsi_cmd->sc_data_direction = SCSI_DATA_WRITE; ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)ha->ioctl_mem; ++ ret = copy_from_user(kernel_tmp, usr_temp, pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy " ++ "failed(%d) on rsp buf.\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto fc_scsi_passthru_done; ++ } ++ } else { ++ pfc_scsi_cmd->sc_data_direction = SCSI_DATA_READ; ++ } ++ ++ tq = ha->ioctl->ioctl_tq; ++ lq = ha->ioctl->ioctl_lq; ++ ++ if (fclun && tq && lq ) { ++ tq->olun[fclun->lun] = lq; ++ tq->ha = ha; ++ ++ lq->fclun = fclun; ++ fcport = fclun->fcport; ++ ++ sp->lun_queue = lq; ++ sp->tgt_queue = tq; ++ sp->fclun = fclun; ++ } ++ ++ DEBUG9({ ++ b = SCSI_BUS_32(pfc_scsi_cmd); ++ t = SCSI_TCN_32(pfc_scsi_cmd); ++ l = SCSI_LUN_32(pfc_scsi_cmd); ++ }) ++ DEBUG9(printk("%s(%ld): ha instance=%ld tq=%p lq=%p " ++ "fclun=%p.\n", ++ __func__, ha->host_no, ha->instance, tq, lq, fclun);) ++ DEBUG9(printk("\tCDB=%02x %02x %02x %02x; b=%x t=%x l=%x.\n", ++ pfc_scsi_cmd->cmnd[0], pfc_scsi_cmd->cmnd[1], pfc_scsi_cmd->cmnd[2], ++ pfc_scsi_cmd->cmnd[3], b, t, l);) ++ ++ /* ++ * Check the status of the port ++ */ ++ if (qla2x00_check_port_status(ha, fcport) != QL_STATUS_SUCCESS) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto fc_scsi_passthru_done; ++ } ++ ++ /* set flag to indicate IOCTL SCSI PassThru in progress */ ++ ha->ioctl->SCSIPT_InProgress = 1; ++ ha->ioctl->ioctl_tov = (int)QLA_PT_CMD_DRV_TOV; ++ ++ /* prepare for receiving completion. */ ++ qla2x00_ioctl_sem_init(ha); ++ CMD_COMPL_STATUS(pfc_scsi_cmd) = (int) IOCTL_INVALID_STATUS; ++ ++ /* send command to adapter */ ++ DEBUG9(printk("%s(%ld): inst=%ld sending command.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ add_to_pending_queue(ha, sp); ++ ++ qla2x00_next(ha); ++ ++ ha->ioctl->cmpl_timer.expires = jiffies + ha->ioctl->ioctl_tov * HZ; ++ add_timer(&ha->ioctl->cmpl_timer); ++ ++ down(&ha->ioctl->cmpl_sem); ++ ++ del_timer(&ha->ioctl->cmpl_timer); ++ ++ if (ha->ioctl->SCSIPT_InProgress == 1) { ++ ++ printk(KERN_WARNING ++ "qla2x00: scsi%ld ERROR passthru command timeout.\n", ++ ha->host_no); ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto fc_scsi_passthru_done; ++ } ++ ++ if (CMD_COMPL_STATUS(pfc_scsi_cmd) == (int)IOCTL_INVALID_STATUS) { ++ ++ DEBUG9(printk("%s(%ld): inst=%ld ERROR. cmd not completed.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_ERR; ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto fc_scsi_passthru_done; ++ } ++ ++ switch (CMD_COMPL_STATUS(pfc_scsi_cmd)) { ++ case CS_INCOMPLETE: ++ case CS_ABORTED: ++ case CS_PORT_UNAVAILABLE: ++ case CS_PORT_LOGGED_OUT: ++ case CS_PORT_CONFIG_CHG: ++ case CS_PORT_BUSY: ++ DEBUG10(printk("%s(%ld): inst=%ld cs err = %x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pfc_scsi_cmd));) ++ pext->Status = EXT_STATUS_BUSY; ++ break; ++ } ++ ++ if ((CMD_COMPL_STATUS(pfc_scsi_cmd) == CS_DATA_UNDERRUN) || ++ (CMD_SCSI_STATUS(pfc_scsi_cmd) != 0)) { ++ ++ /* have done the post function */ ++ pext->Status = EXT_STATUS_SCSI_STATUS; ++ /* The SDMAPI is only concerned with the low-order byte */ ++ pext->DetailStatus = CMD_SCSI_STATUS(pfc_scsi_cmd) & 0xff; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld data underrun or scsi err. " ++ "host status =0x%x, scsi status = 0x%x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pfc_scsi_cmd), ++ CMD_SCSI_STATUS(pfc_scsi_cmd));) ++ ++ } else if (CMD_COMPL_STATUS(pfc_scsi_cmd) != 0) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld cs err=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pfc_scsi_cmd));) ++ pext->Status = EXT_STATUS_ERR; ++ ++ goto fc_scsi_passthru_done; ++ } ++ ++ /* Process completed command */ ++ DEBUG9(printk("%s(%ld): inst=%ld done. host status=0x%x, " ++ "scsi status=0x%x.\n", ++ __func__, ha->host_no, ha->instance, CMD_COMPL_STATUS(pfc_scsi_cmd), ++ CMD_SCSI_STATUS(pfc_scsi_cmd));) ++ ++ /* copy up structure to make sense data available to user */ ++ pfc_scsi_pass->SenseLength = CMD_ACTUAL_SNSLEN(pfc_scsi_cmd); ++ if (CMD_ACTUAL_SNSLEN(pfc_scsi_cmd)) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld sense[0]=%x sense[2]=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ pfc_scsi_cmd->sense_buffer[0], ++ pfc_scsi_cmd->sense_buffer[2]);) ++ ++ for (i = 0; i < CMD_ACTUAL_SNSLEN(pfc_scsi_cmd); i++) { ++ pfc_scsi_pass->SenseData[i] = ++ pfc_scsi_cmd->sense_buffer[i]; ++ } ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->RequestAdr, ++ sizeof(EXT_FC_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify WRITE " ++ "RequestAdr.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto fc_scsi_passthru_done; ++ } ++ ++ usr_temp = (uint8_t *)pext->RequestAdr; ++ kernel_tmp = (uint8_t *)pfc_scsi_pass; ++ ret = copy_to_user(usr_temp, kernel_tmp, ++ sizeof(EXT_FC_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy sense " ++ "buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto fc_scsi_passthru_done; ++ } ++ } ++ ++ scsi_direction = pfc_scsi_pass->Direction; ++ ++ if (scsi_direction == EXT_DEF_SCSI_PASSTHRU_DATA_IN) { ++ ++ DEBUG9(printk("%s(%ld): inst=%ld copying data.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* getting device data and putting in pext->ResponseAdr */ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify write " ++ "ResponseAdr.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ goto fc_scsi_passthru_done; ++ } ++ ++ /* now copy up the READ data to user */ ++ if ((CMD_COMPL_STATUS(pfc_scsi_cmd) == CS_DATA_UNDERRUN) && ++ (CMD_RESID_LEN(pfc_scsi_cmd))) { ++ ++ transfer_len = pext->ResponseLen - ++ CMD_RESID_LEN(pfc_scsi_cmd); ++ ++ pext->ResponseLen = transfer_len; ++ } else { ++ transfer_len = pext->ResponseLen; ++ } ++ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)ha->ioctl_mem; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_len); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR copy rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ goto fc_scsi_passthru_done; ++ } ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++fc_scsi_passthru_done: ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++} ++ ++/* ++ * qla2x00_sc_scsi3_passthru ++ * Handles EXT_SC_SCSI3_PASSTHRU subcommand. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = EXT_IOCTL structure pointer. ++ * mode = not used. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_sc_scsi3_passthru(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++#define MAX_SCSI3_CDB_LEN 16 ++ ++ int ret = 0; ++ int found; ++ fc_lun_t temp_fclun; ++ fc_lun_t *fclun = NULL; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ os_lun_t *lq; ++ os_tgt_t *tq; ++ srb_t *sp = NULL; ++ uint8_t *usr_temp, *kernel_tmp; ++ uint32_t transfer_len; ++ uint32_t i, b, t; ++ uint32_t scsi_direction; ++ ++ EXT_FC_SCSI_PASSTHRU *pfc_scsi3_pass; ++ ++ Scsi_Cmnd *pscsi3_cmd; ++ Scsi_Device *pscsi3_device; ++ ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if ((sp = qla2x00_get_new_sp(ha)) == NULL) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc sp.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pfc_scsi3_pass, ++ sizeof(EXT_FC_SCSI_PASSTHRU))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_FC_SCSI_PASSTHRU));) ++ return (ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi3_cmd, ++ sizeof(Scsi_Cmnd))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(Scsi_Cmnd));) ++ goto scsi3_passthru_done; ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi3_device, ++ sizeof(Scsi_Device))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(Scsi_Device));) ++ goto scsi3_passthru_done; ++ } ++ ++ /* clear ioctl_mem to be used */ ++ memset(ha->ioctl_mem, 0, ha->ioctl_mem_size); ++ ++ ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ sizeof(EXT_FC_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify READ " ++ "req buf.\n", __func__, ha->host_no, ha->instance);) ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto scsi3_passthru_done; ++ } ++ ++ if (pext->ResponseLen > ha->ioctl_mem_size) { ++ if (qla2x00_get_new_ioctl_dma_mem(ha, pext->ResponseLen) != ++ QL_STATUS_SUCCESS) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot " ++ "alloc requested DMA buffer size=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ pext->ResponseLen);) ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto scsi3_passthru_done; ++ } ++ } ++ ++ /* Copy request buffer */ ++ usr_temp = (uint8_t *)pext->RequestAdr; ++ kernel_tmp = (uint8_t *)pfc_scsi3_pass; ++ ret = copy_from_user(kernel_tmp, usr_temp, ++ sizeof(EXT_FC_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR copy req buf ret=%d\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto scsi3_passthru_done; ++ } ++ ++ if (pfc_scsi3_pass->FCScsiAddr.DestType != EXT_DEF_DESTTYPE_WWPN) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR - wrong Dest type.\n", ++ __func__, ha->host_no, ha->instance);) ++ ret = EXT_STATUS_ERR; ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto scsi3_passthru_done; ++ } ++ ++ /* ++ * For this ioctl command we always assume all 16 bytes are ++ * initialized. ++ */ ++ if (pfc_scsi3_pass->CdbLength != MAX_SCSI3_CDB_LEN) { ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR -wrong Cdb Len %d.\n", ++ __func__, ha->host_no, ha->instance, ++ pfc_scsi3_pass->CdbLength);) ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto scsi3_passthru_done; ++ } ++ ++ fcport = NULL; ++ found = 0; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ if (memcmp(fcport->port_name, ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN, 8) == 0) { ++ found++; ++ break; ++ } ++ } ++ if (!found) { ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld DID NOT FIND Port for WWPN " ++ "%02x%02x%02x%02x%02x%02x%02x%02x.\n", ++ __func__, ha->host_no, ha->instance, ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[0], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[1], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[2], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[3], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[4], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[5], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[6], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[7]);) ++ ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ ++ goto scsi3_passthru_done; ++ } ++ ++ /* Use a temporary fclun to send out the command. */ ++ fclun = &temp_fclun; ++ fclun->fcport = fcport; ++ fclun->lun = pfc_scsi3_pass->FCScsiAddr.Lun; ++ fclun->flags = 0; ++ ++ /* set target coordinates */ ++ pscsi3_cmd->device->id = 0xff; /* not used. just put something there. */ ++ pscsi3_cmd->device->lun = pfc_scsi3_pass->FCScsiAddr.Lun; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld cmd for loopid=%04x L=%04x " ++ "WWPN=%02x%02x%02x%02x%02x%02x%02x%02x.\n", ++ __func__, ha->host_no, ha->instance, ++ fclun->fcport->loop_id, pscsi3_cmd->device->lun, ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[0], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[1], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[2], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[3], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[4], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[5], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[6], ++ pfc_scsi3_pass->FCScsiAddr.DestAddr.WWPN[7]);) ++ ++ sp->cmd_length = MAX_SCSI3_CDB_LEN; ++ pscsi3_cmd->cmd_len = MAX_SCSI3_CDB_LEN; ++ ++ memcpy(pscsi3_cmd->data_cmnd, pfc_scsi3_pass->Cdb, pscsi3_cmd->cmd_len); ++ memcpy(pscsi3_cmd->cmnd, pfc_scsi3_pass->Cdb, pscsi3_cmd->cmd_len); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld cdb buffer dump:\n", ++ __func__, ha->host_no, ha->instance);) ++ DEBUG9(qla2x00_dump_buffer((uint8_t *)&pscsi3_cmd->data_cmnd[0], 16);) ++ ++ pscsi3_cmd->device->host = ha->host; ++ sp->ha = ha; ++ sp->cmd = pscsi3_cmd; ++ sp->flags = SRB_IOCTL; ++ ++ /* set local scsi3_cmd's sp pointer to sp */ ++ CMD_SP(pscsi3_cmd) = (void *) sp; ++ ++ /* mark this as a special delivery and collection command */ ++ pscsi3_cmd->flags = 0; ++ pscsi3_cmd->scsi_done = qla2x00_scsi_pt_done; ++ ++ pscsi3_cmd->device = pscsi3_device; ++ pscsi3_cmd->device->tagged_queue = 0; ++ pscsi3_cmd->use_sg = 0; /* no ScatterGather */ ++ pscsi3_cmd->request_bufflen = pext->ResponseLen; ++ pscsi3_cmd->request_buffer = ha->ioctl_mem; ++ pscsi3_cmd->timeout_per_command = QLA_PT_CMD_TOV * HZ; ++ ++ if (pfc_scsi3_pass->Direction == EXT_DEF_SCSI_PASSTHRU_DATA_OUT) { ++ /* sending user data from pext->ResponseAdr to device */ ++ ret = verify_area(VERIFY_READ, (void *)pext->ResponseAdr, ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify read " ++ "ResponseAdr.\n", ++ __func__, ha->host_no, ha->instance);) ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto scsi3_passthru_done; ++ } ++ ++ pscsi3_cmd->sc_data_direction = SCSI_DATA_WRITE; ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)ha->ioctl_mem; ++ ret = copy_from_user(kernel_tmp, usr_temp, pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buf " ++ "ret=%d.\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto scsi3_passthru_done; ++ } ++ ++ } else { ++ pscsi3_cmd->sc_data_direction = SCSI_DATA_READ; ++ } ++ ++ /* Use temporary LU and TGT queue */ ++ tq = ha->ioctl->ioctl_tq; ++ lq = ha->ioctl->ioctl_lq; ++ ++ b = SCSI_BUS_32(pscsi3_cmd); ++ t = SCSI_TCN_32(pscsi3_cmd); ++ ++ DEBUG9(printk("%s(%ld): ha instance=%ld tq=%p lq=%p fclun=%p.\n", ++ __func__, ha->host_no, ha->instance,tq,lq,fclun); ) ++ DEBUG9(printk("%s(%ld): CDB=%02x %02x %02x %02x; b=%x t=%x fclun=%x\n", ++ __func__, ha->host_no, pscsi3_cmd->cmnd[0], pscsi3_cmd->cmnd[1], ++ pscsi3_cmd->cmnd[2], pscsi3_cmd->cmnd[3], b, t, ++ SCSI_LUN_32(pscsi3_cmd));) ++ ++ if (tq && lq) { ++ /* ++ * For now just save lq using the lower LUN byte value, ++ * even though this may not be the actual LUN number. ++ * Since we're only sending out passthru cmd one at a time, ++ * and only passthru is using FCP LUN format now, no need ++ * to change rest of driver just to decode the LUN. ++ */ ++ tq->olun[fclun->lun & 0xff] = lq; ++ ++ tq->ha = ha; ++ lq->fclun = fclun; ++ fcport = fclun->fcport; ++ ++ sp->lun_queue = lq; ++ sp->tgt_queue = tq; ++ sp->fclun = fclun; ++ } else { ++ lq = NULL; ++ fcport = NULL; ++ } ++ ++ /* ++ * Check the status of the port ++ */ ++ if (qla2x00_check_port_status(ha, fcport) != QL_STATUS_SUCCESS) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld port missing or loop down. " ++ "fcport=%p timer=%d state=%d dpc=%lx.\n", ++ __func__, ha->host_no, ha->instance, fcport, ++ atomic_read(&ha->loop_down_timer), ha->loop_state, ++ ha->dpc_flags);) ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto scsi3_passthru_done; ++ } ++ ++ /* set flag to indicate IOCTL SCSI PassThru in progress */ ++ ha->ioctl->SCSIPT_InProgress = 1; ++ ha->ioctl->ioctl_tov = (int)QLA_PT_CMD_DRV_TOV; ++ ++ /* prepare for receiving completion. */ ++ qla2x00_ioctl_sem_init(ha); ++ CMD_COMPL_STATUS(pscsi3_cmd) = (int) IOCTL_INVALID_STATUS; ++ ++ /* send command to adapter */ ++ ++ /*add_to_cmd_queue(ha, lq, sp);*/ ++ add_to_pending_queue(ha, sp); ++ ++ /*qla2x00_next(ha, tq, lq);*/ ++ qla2x00_next(ha); ++ ++ ha->ioctl->cmpl_timer.expires = jiffies + ha->ioctl->ioctl_tov * HZ; ++ add_timer(&ha->ioctl->cmpl_timer); ++ ++ down(&ha->ioctl->cmpl_sem); ++ ++ del_timer(&ha->ioctl->cmpl_timer); ++ ++ if (ha->ioctl->SCSIPT_InProgress == 1) { ++ ++ printk(KERN_WARNING ++ "qla2x00: inst=%ld scsi%ld ERROR PT command timeout.\n", ++ ha->host_no, ha->instance); ++ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto scsi3_passthru_done; ++ ++ } ++ if (CMD_COMPL_STATUS(pscsi3_cmd) == (int)IOCTL_INVALID_STATUS) { ++ ++ DEBUG9(printk("%s(%ld): inst=%ld ERROR - cmd not completed.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ pext->Status = EXT_STATUS_ERR; ++ atomic_set(&sp->ref_count, 0); ++ add_to_free_queue (ha, sp); ++ goto scsi3_passthru_done; ++ } ++ ++ switch (CMD_COMPL_STATUS(pscsi3_cmd)) { ++ case CS_INCOMPLETE: ++ case CS_ABORTED: ++ case CS_PORT_UNAVAILABLE: ++ case CS_PORT_LOGGED_OUT: ++ case CS_PORT_CONFIG_CHG: ++ case CS_PORT_BUSY: ++ DEBUG10(printk("%s(%ld): inst=%ld cs err = %x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pscsi3_cmd));) ++ pext->Status = EXT_STATUS_BUSY; ++ break; ++ } ++ ++ if ((CMD_COMPL_STATUS(pscsi3_cmd) == CS_DATA_UNDERRUN) || ++ (CMD_SCSI_STATUS(pscsi3_cmd) != 0)) { ++ ++ /* have done the post function */ ++ pext->Status = EXT_STATUS_SCSI_STATUS; ++ pext->DetailStatus = CMD_SCSI_STATUS(pscsi3_cmd) & 0xff; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld data underrun or scsi err. " ++ "host status =0x%x, scsi status = 0x%x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pscsi3_cmd), CMD_SCSI_STATUS(pscsi3_cmd));) ++ ++ } else if (CMD_COMPL_STATUS(pscsi3_cmd) != 0) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld cs err = %x.\n", ++ __func__, ha->host_no, ha->instance, ++ CMD_COMPL_STATUS(pscsi3_cmd));) ++ pext->Status = EXT_STATUS_ERR; ++ goto scsi3_passthru_done; ++ } ++ ++ /* Process completed command */ ++ DEBUG9(printk("%s(%ld): inst=%ld done. host status=0x%x, " ++ "scsi status=0x%x.\n", ++ __func__, ha->host_no, ha->instance, CMD_COMPL_STATUS(pscsi3_cmd), ++ CMD_SCSI_STATUS(pscsi3_cmd));) ++ ++ /* copy up structure to make sense data available to user */ ++ pfc_scsi3_pass->SenseLength = CMD_ACTUAL_SNSLEN(pscsi3_cmd); ++ if (CMD_ACTUAL_SNSLEN(pscsi3_cmd)) { ++ DEBUG9_10(printk("%s(%ld): inst=%ld sense[0]=%x sense[2]=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ pscsi3_cmd->sense_buffer[0], ++ pscsi3_cmd->sense_buffer[2]);) ++ ++ for (i = 0; i < CMD_ACTUAL_SNSLEN(pscsi3_cmd); i++) { ++ pfc_scsi3_pass->SenseData[i] = ++ pscsi3_cmd->sense_buffer[i]; ++ } ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->RequestAdr, ++ sizeof(EXT_FC_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify WRITE " ++ "RequestAdr.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto scsi3_passthru_done; ++ } ++ ++ usr_temp = (uint8_t *)pext->RequestAdr; ++ kernel_tmp = (uint8_t *)pfc_scsi3_pass; ++ ret = copy_to_user(usr_temp, kernel_tmp, ++ sizeof(EXT_FC_SCSI_PASSTHRU)); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy sense " ++ "buffer.\n", ++ __func__, ha->host_no, ha->instance);) ++ goto scsi3_passthru_done; ++ } ++ } ++ ++ scsi_direction = pfc_scsi3_pass->Direction; ++ ++ if (scsi_direction == EXT_DEF_SCSI_PASSTHRU_DATA_IN) { ++ ++ DEBUG9(printk("%s(%ld): inst=%ld copying data.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* getting device data and putting in pext->ResponseAdr */ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ pext->ResponseLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify write " ++ "ResponseAdr.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ goto scsi3_passthru_done; ++ } ++ ++ /* now copy up the READ data to user */ ++ if ((CMD_COMPL_STATUS(pscsi3_cmd) == CS_DATA_UNDERRUN) && ++ (CMD_RESID_LEN(pscsi3_cmd))) { ++ ++ transfer_len = pext->ResponseLen - ++ CMD_RESID_LEN(pscsi3_cmd); ++ ++ pext->ResponseLen = transfer_len; ++ } else { ++ transfer_len = pext->ResponseLen; ++ } ++ ++ usr_temp = (uint8_t *)pext->ResponseAdr; ++ kernel_tmp = (uint8_t *)ha->ioctl_mem; ++ ret = copy_to_user(usr_temp, kernel_tmp, transfer_len); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR copy rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ goto scsi3_passthru_done; ++ } ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++scsi3_passthru_done: ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++} ++ ++/* ++ * qla2x00_send_els_rnid ++ * IOCTL to send extended link service RNID command to a target. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = User space CT arguments pointer. ++ * mode = flags. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_send_els_rnid(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++#define TGT_DEV 1 ++#define HOST_DEV 2 ++ ++ EXT_RNID_REQ *tmp_rnid; ++ int ret = 0; ++ uint8_t dev_found = 0; ++ uint16_t dev_loop_id = 0; ++ uint16_t mb[MAILBOX_REGISTER_COUNT]; ++ uint32_t copy_len; ++ struct list_head *fcpl; ++ fc_port_t *fcport; ++ int found; ++ struct list_head *fcil; ++ fc_initiator_t *fcinitiator; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (ha->ioctl_mem_size < SEND_RNID_RSP_SIZE) { ++ if (qla2x00_get_new_ioctl_dma_mem(ha, ++ SEND_RNID_RSP_SIZE) != QL_STATUS_SUCCESS) { ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR cannot alloc " ++ "DMA buffer. size=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ SEND_RNID_RSP_SIZE);) ++ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ return (ret); ++ } ++ } ++ ++ if (pext->RequestLen != sizeof(EXT_RNID_REQ)) { ++ /* parameter error */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld invalid req length %d.\n", ++ __func__, ha->host_no, ha->instance, pext->RequestLen);) ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ return (ret); ++ } ++ ++ ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ pext->RequestLen); ++ ++ if (ret != 0) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld req buf verify READ FAILED\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld req buf verified. Copying req data.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&tmp_rnid, ++ sizeof(EXT_RNID_REQ))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_RNID_REQ));) ++ return (ret); ++ } ++ ++ ret = copy_from_user(tmp_rnid, pext->RequestAdr, pext->RequestLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR copy req buf ret=%d\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* Find loop ID of the device */ ++ fcinitiator = NULL; ++ switch (tmp_rnid->Addr.Type) { ++ case EXT_DEF_TYPE_WWNN: ++ ++ DEBUG9(printk("%s(%ld): inst=%ld got node name.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ fcport = NULL; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ /* if removed or missing */ ++ if (atomic_read(&fcport->state) == FC_ONLINE && ++ memcmp((void *)tmp_rnid->Addr.FcAddr.WWNN, ++ (void *)fcport->node_name, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ break; ++ } ++ } ++ if (fcport != NULL) { ++ DEBUG9(printk("%s(%ld): inst=%ld found tgt dev; " ++ "loop_id=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ fcport->loop_id);) ++ ++ dev_found = TGT_DEV; ++ dev_loop_id = fcport->loop_id; ++ break; ++ } ++ ++ found = 0; ++ fcinitiator = NULL; ++ list_for_each(fcil, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ if (memcmp(tmp_rnid->Addr.FcAddr.WWNN, ++ fcinitiator->node_name, ++ EXT_DEF_WWN_NAME_SIZE) == 0 && ++ fcinitiator->d_id.b24 != 0) { ++ ++ found++; ++ break; ++ } ++ } ++ if (found) { ++ DEBUG9(printk("%s(%ld): inst=%ld found host device; " ++ "loop_id=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ fcinitiator->loop_id);) ++ ++ dev_found = HOST_DEV; ++ dev_loop_id = fcinitiator->loop_id; ++ break; ++ } ++ ++ break; ++ ++ case EXT_DEF_TYPE_WWPN: ++ DEBUG9(printk("%s(%ld): inst=%ld got port name.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ fcport = NULL; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ /* if removed or missing */ ++ if (atomic_read(&fcport->state) == FC_ONLINE && ++ memcmp((void *)tmp_rnid->Addr.FcAddr.WWPN, ++ (void *)fcport->port_name, ++ EXT_DEF_WWN_NAME_SIZE) == 0) { ++ break; ++ } ++ } ++ if (fcport != NULL) { ++ DEBUG9(printk("%s(%ld): inst=%ld found tgt dev; " ++ "loop_id=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ fcport->loop_id);) ++ ++ dev_found = TGT_DEV; /* target device */ ++ dev_loop_id = fcport->loop_id; ++ break; ++ } ++ ++ found = 0; ++ fcinitiator = NULL; ++ list_for_each(fcil, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ if (memcmp(tmp_rnid->Addr.FcAddr.WWPN, ++ fcinitiator->port_name, ++ EXT_DEF_WWN_NAME_SIZE) == 0 && ++ fcinitiator->d_id.b24 != 0) { ++ ++ found++; ++ break; ++ } ++ } ++ if (found) { ++ DEBUG9(printk("%s(%ld): inst=%ld found host device; " ++ "loop_id=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ fcinitiator->loop_id);) ++ ++ dev_found = HOST_DEV; ++ dev_loop_id = fcinitiator->loop_id; ++ break; ++ } ++ ++ break; ++ ++ case EXT_DEF_TYPE_PORTID: ++ DEBUG9(printk("%s(%ld): inst=%ld got port ID.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* PORTID bytes entered must already be big endian */ ++ fcport = NULL; ++ list_for_each(fcpl, &ha->fcports) { ++ fcport = list_entry(fcpl, fc_port_t, list); ++ ++ /* if removed or missing */ ++ if (atomic_read(&fcport->state) == FC_ONLINE && ++ memcmp((void *)&tmp_rnid->Addr.FcAddr.Id[1], ++ (void *)(fcport->d_id.r.d_id), ++ EXT_DEF_PORTID_SIZE_ACTUAL) == 0) { ++ break; ++ } ++ } ++ if (fcport != NULL) { ++ DEBUG9(printk("%s(%ld): inst=%ld found tgt dev; " ++ "loop_id=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ fcport->loop_id);) ++ ++ dev_found = TGT_DEV; /* target device */ ++ dev_loop_id = fcport->loop_id; ++ break; ++ } ++ ++ found = 0; ++ fcinitiator = NULL; ++ list_for_each(fcil, &ha->fcinitiators) { ++ fcinitiator = list_entry(fcil, fc_initiator_t, list); ++ ++ if (memcmp(&tmp_rnid->Addr.FcAddr.Id[1], ++ &fcinitiator->d_id, ++ EXT_DEF_PORTID_SIZE_ACTUAL) == 0) { ++ ++ found++; ++ break; ++ } ++ } ++ if (found) { ++ DEBUG9(printk("%s(%ld): inst=%ld found host device; " ++ "loop_id=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ fcinitiator->loop_id);) ++ ++ dev_found = HOST_DEV; ++ dev_loop_id = fcinitiator->loop_id; ++ break; ++ } ++ ++ break; ++ default: ++ /* parameter error */ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk("%s(%ld): inst=%ld invalid addressing type.\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ if (!dev_found || ++ (dev_found == TGT_DEV && dev_loop_id > LAST_SNS_LOOP_ID)) { ++ /* No matching device or the target device is not ++ * configured; just return error. ++ */ ++ pext->Status = EXT_STATUS_DEV_NOT_FOUND; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld device not found. dev_found=%d " ++ "dev_loop_id=%x.\n", ++ __func__, ha->host_no, ha->instance, dev_found, ++ dev_loop_id);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* check on loop down */ ++ if (ha->loop_state != LOOP_READY || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE || ha->dpc_active) { ++ ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld loop not ready.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ /* Check whether we need to login first. */ ++ if (dev_found == HOST_DEV && dev_loop_id > LAST_SNS_LOOP_ID) { ++ /* ++ * Search for a usable loop ID before try to login to it. ++ */ ++ if ((dev_loop_id &= ~PORT_LOST_ID) > LAST_SNS_LOOP_ID) { ++ /* Just start searching from first possible ID. */ ++ dev_loop_id = ha->min_external_loopid; ++ } ++ for (;;) { ++ if (ha->fabricid[dev_loop_id].in_use == TRUE) { ++ dev_loop_id++; ++ } else { ++ ha->fabricid[dev_loop_id].in_use = TRUE; ++ break; ++ } ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld try relogin to host dev; " ++ "dev_loop_id=%x.\n", ++ __func__, ha->host_no, ha->instance, dev_loop_id);) ++ ++ for (;;) { ++ if (dev_loop_id > LAST_SNS_LOOP_ID) { ++ /* error */ ++ DEBUG10(printk("%s(%ld): inst=%ld " ++ "no valid loop_id for login.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ break; ++ } ++ ++ qla2x00_login_fabric(ha, ++ dev_loop_id, ++ fcinitiator->d_id.b.domain, ++ fcinitiator->d_id.b.area, ++ fcinitiator->d_id.b.al_pa, ++ &mb[0], 0); ++ ++ if (mb[0] != MBS_CMD_CMP && ++ mb[0] != MBS_PORT_ID_IN_USE && ++ mb[0] != MBS_LOOP_ID_IN_USE) { ++ ++ DEBUG10(printk("%s(%ld): inst=%ld " ++ "ERROR login mb[0]=%x mb[1]=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ mb[0], mb[1]);) ++ break; ++ } ++ ++ if (mb[0] == MBS_CMD_CMP) { ++ DEBUG9(printk("%s(%ld): inst=%ld host login " ++ "success; loop_id=%x.\n", ++ __func__, ha->host_no, ha->instance, ++ dev_loop_id);) ++ ++ fcinitiator->loop_id = dev_loop_id; ++ break; ++ } else if (mb[0] == MBS_PORT_ID_IN_USE) { ++ ha->fabricid[dev_loop_id].in_use = FALSE; ++ dev_loop_id = mb[1]; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld " ++ "port %02x%02x%02x using loop id=0x%04x.\n", ++ __func__, ha->host_no, ha->instance, ++ fcinitiator->d_id.b.domain, ++ fcinitiator->d_id.b.area, ++ fcinitiator->d_id.b.al_pa, ++ dev_loop_id);) ++ ++ if (dev_loop_id <= LAST_SNS_LOOP_ID) ++ ha->fabricid[dev_loop_id].in_use = TRUE; ++ else ++ /* Error */ ++ break; ++ ++ } else if (mb[0] == MBS_LOOP_ID_IN_USE) { ++ /* Search for another usable loop_id */ ++ dev_loop_id++; ++ while (ha->fabricid[dev_loop_id].in_use) { ++ if (dev_loop_id++ > LAST_SNS_LOOP_ID) { ++ /* Error */ ++ break; ++ } ++ } ++ ++ if (dev_loop_id <= LAST_SNS_LOOP_ID) { ++ DEBUG9(printk( ++ "%s(%ld): inst=%ld previous loop " ++ "id in use. Retry with 0x%04x.\n", ++ __func__, ha->host_no, ha->instance, ++ dev_loop_id);) ++ ++ ha->fabricid[dev_loop_id].in_use = TRUE; ++ } else { ++ /* Error */ ++ break; ++ } ++ } ++ } ++ ++ if (mb[0] != MBS_CMD_CMP) { ++ pext->Status = EXT_STATUS_ERR; ++ DEBUG9_10(printk( "%s(%ld): inst=%ld login failed.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ } ++ ++ /* Send command */ ++ DEBUG9(printk("%s(%ld): inst=%ld sending rnid cmd.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ ret = qla2x00_send_rnid_mbx(ha, dev_loop_id, ++ (uint8_t)tmp_rnid->DataFormat, ha->ioctl_mem_phys, ++ SEND_RNID_RSP_SIZE, &mb[0]); ++ ++ if (ret != QLA2X00_SUCCESS) { ++ /* error */ ++ pext->Status = EXT_STATUS_ERR; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld FAILED. rval = %x.\n", ++ __func__, ha->host_no, ha->instance, mb[0]);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld rnid cmd sent ok.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* Copy the response */ ++ copy_len = (pext->ResponseLen > SEND_RNID_RSP_SIZE) ? ++ SEND_RNID_RSP_SIZE : pext->ResponseLen; ++ ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ copy_len); ++ ++ if (ret != 0) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld rsp buf verify WRITE error\n", ++ __func__, ha->host_no, ha->instance);) ++ } else { ++ ret = copy_to_user((uint8_t *)pext->ResponseAdr, ++ (uint8_t *)ha->ioctl_mem, copy_len); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR copy rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ if (SEND_RNID_RSP_SIZE > pext->ResponseLen) { ++ pext->Status = EXT_STATUS_DATA_OVERRUN; ++ DEBUG9(printk("%s(%ld): inst=%ld data overrun. " ++ "exiting normally.\n", ++ __func__, ha->host_no, ha->instance);) ++ } else { ++ pext->Status = EXT_STATUS_OK; ++ DEBUG9(printk("%s(%ld): inst=%ld exiting normally.\n", ++ __func__, ha->host_no, ha->instance);) ++ } ++ pext->ResponseLen = copy_len; ++ } ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++} ++ ++/* ++ * qla2x00_get_rnid_params ++ * IOCTL to get RNID parameters of the adapter. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = User space CT arguments pointer. ++ * mode = flags. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_get_rnid_params(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ int tmp_rval = 0; ++ uint32_t copy_len; ++ uint16_t mb[MAILBOX_REGISTER_COUNT]; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* check on loop down */ ++ if (ha->loop_state != LOOP_READY || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE || ha->dpc_active) { ++ ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld loop not ready.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++ } ++ ++ /* Send command */ ++ tmp_rval = qla2x00_get_rnid_params_mbx(ha, ha->ioctl_mem_phys, ++ sizeof(EXT_RNID_DATA), &mb[0]); ++ ++ if (tmp_rval != QLA2X00_SUCCESS) { ++ /* error */ ++ pext->Status = EXT_STATUS_ERR; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld cmd FAILED=%x.\n", ++ __func__, ha->host_no, ha->instance, mb[0]);) ++ return (ret); ++ } ++ ++ /* Copy the response */ ++ copy_len = (pext->ResponseLen > sizeof(EXT_RNID_DATA)) ? ++ (uint32_t)sizeof(EXT_RNID_DATA) : pext->ResponseLen; ++ ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, ++ copy_len); ++ ++ if (ret != 0) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld verify WRITE rsp buf error\n", ++ __func__, ha->host_no, ha->instance);) ++ } else { ++ ret = copy_to_user((void *)pext->ResponseAdr, ++ (void *)ha->ioctl_mem, copy_len); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buf\n", ++ __func__, ha->host_no, ha->instance);) ++ return (ret); ++ } ++ ++ pext->ResponseLen = copy_len; ++ if (copy_len < sizeof(EXT_RNID_DATA)) { ++ pext->Status = EXT_STATUS_DATA_OVERRUN; ++ DEBUG9_10(printk("%s(%ld): inst=%ld data overrun. " ++ "exiting normally.\n", ++ __func__, ha->host_no, ha->instance);) ++ } else if (pext->ResponseLen > sizeof(EXT_RNID_DATA)) { ++ pext->Status = EXT_STATUS_DATA_UNDERRUN; ++ DEBUG9_10(printk("%s(%ld): inst=%ld data underrun. " ++ "exiting normally.\n", ++ __func__, ha->host_no, ha->instance);) ++ } else { ++ pext->Status = EXT_STATUS_OK; ++ DEBUG9(printk("%s(%ld): inst=%ld exiting normally.\n", ++ __func__, ha->host_no, ha->instance);) ++ } ++ } ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_set_host_data ++ * IOCTL command to set host/adapter related data. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = User space CT arguments pointer. ++ * mode = flags. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_set_host_data(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ int ret = 0; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* check on loop down */ ++ if (ha->loop_state != LOOP_READY || ++ test_bit(CFG_ACTIVE, &ha->cfg_flags) || ++ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ++ ABORTS_ACTIVE || ha->dpc_active) { ++ ++ pext->Status = EXT_STATUS_BUSY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld loop not ready.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++ } ++ ++ /* switch on command subcode */ ++ switch (pext->SubCode) { ++ case EXT_SC_SET_RNID: ++ ret = qla2x00_set_rnid_params(ha, pext, mode); ++ break; ++ default: ++ /* function not supported. */ ++ pext->Status = EXT_STATUS_UNSUPPORTED_SUBCODE; ++ break; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return (ret); ++} ++ ++/* ++ * qla2x00_set_rnid_params ++ * IOCTL to set RNID parameters of the adapter. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * pext = User space CT arguments pointer. ++ * mode = flags. ++ * ++ * Returns: ++ * 0 = success ++ * others = errno value ++ * ++ * Context: ++ * Kernel context. ++ */ ++static int ++qla2x00_set_rnid_params(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) ++{ ++ EXT_SET_RNID_REQ *tmp_set; ++ EXT_RNID_DATA *tmp_buf; ++ int ret = 0; ++ int tmp_rval = 0; ++ uint16_t mb[MAILBOX_REGISTER_COUNT]; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (pext->RequestLen != sizeof(EXT_SET_RNID_REQ)) { ++ /* parameter error */ ++ pext->Status = EXT_STATUS_INVALID_PARAM; ++ DEBUG9_10(printk("%s(%ld): inst=%ld invalid request length.\n", ++ __func__, ha->host_no, ha->instance);) ++ return(ret); ++ } ++ ++ ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, ++ pext->RequestLen); ++ ++ if (ret != 0) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk("%s(%ld): inst=%ld verify READ request buf.\n", ++ __func__, ha->host_no, ha->instance);) ++ return(ret); ++ } ++ ++ if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&tmp_set, ++ sizeof(EXT_SET_RNID_REQ))) { ++ /* not enough memory */ ++ pext->Status = EXT_STATUS_NO_MEMORY; ++ DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " ++ "size requested=%d.\n", ++ __func__, ha->host_no, ha->instance, ++ sizeof(EXT_SET_RNID_REQ));) ++ return (ret); ++ } ++ ++ ret = copy_from_user(tmp_set, pext->RequestAdr, pext->RequestLen); ++ if (ret) { ++ pext->Status = EXT_STATUS_COPY_ERR; ++ DEBUG9_10(printk( ++ "%s(%ld): inst=%ld ERROR copy req buf ret=%d\n", ++ __func__, ha->host_no, ha->instance, ret);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return(ret); ++ } ++ ++ tmp_rval = qla2x00_get_rnid_params_mbx(ha, ha->ioctl_mem_phys, ++ sizeof(EXT_RNID_DATA), &mb[0]); ++ if (tmp_rval != QLA2X00_SUCCESS) { ++ /* error */ ++ pext->Status = EXT_STATUS_ERR; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld read cmd FAILED=%x.\n", ++ __func__, ha->host_no, ha->instance, mb[0]);) ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++ } ++ ++ tmp_buf = (EXT_RNID_DATA *)ha->ioctl_mem; ++ /* Now set the params. */ ++ memcpy(tmp_buf->IPVersion, tmp_set->IPVersion, 2); ++ memcpy(tmp_buf->UDPPortNumber, tmp_set->UDPPortNumber, 2); ++ memcpy(tmp_buf->IPAddress, tmp_set->IPAddress, 16); ++ tmp_rval = qla2x00_set_rnid_params_mbx(ha, ha->ioctl_mem_phys, ++ sizeof(EXT_RNID_DATA), &mb[0]); ++ ++ if (tmp_rval != QLA2X00_SUCCESS) { ++ /* error */ ++ pext->Status = EXT_STATUS_ERR; ++ ++ DEBUG9_10(printk("%s(%ld): inst=%ld set cmd FAILED=%x.\n", ++ __func__, ha->host_no, ha->instance, mb[0]);) ++ } else { ++ pext->Status = EXT_STATUS_OK; ++ DEBUG9(printk("%s(%ld): inst=%ld exiting normally.\n", ++ __func__, ha->host_no, ha->instance);) ++ } ++ ++ qla2x00_free_ioctl_scrap_mem(ha); ++ return (ret); ++} ++ ++/* ++ * qla2x00_waitq_sem_timeout ++ * Timeout function to be called when a thread on the wait_q ++ * queue timed out. ++ * ++ * Input: ++ * data = data pointer for timeout function. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_waitq_sem_timeout(unsigned long data) ++{ ++ wait_q_t *tmp_ptr = (wait_q_t *)data; ++ ++ DEBUG9(printk("%s: entered.\n", __func__);) ++ ++ if (tmp_ptr != NULL) { ++ DEBUG9(printk("%s: wait_q thread=%p.\n", __func__, tmp_ptr);) ++ up(&tmp_ptr->wait_q_sem); ++ } ++ ++ DEBUG9(printk("%s: exiting.\n", __func__);) ++ ++} ++ ++/* ++ * qla2x00_get_ioctl_access ++ * Serialization routine for the ioctl commands. ++ * When succeeded the exiting thread gains "access" and ++ * proceeds, otherwise it gives up and returns error. ++ * Each thread would wait tov seconds before giving up. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * tov = timeout value in seconds ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint8_t ++qla2x00_get_ioctl_access(scsi_qla_host_t *ha, uint32_t tov) ++{ ++ int prev_val = 1; ++ uint8_t rval = QL_STATUS_SUCCESS; ++ unsigned long cpu_flags; ++ struct timer_list tmp_access_timer; ++ wait_q_t *ptmp_wq = NULL; ++ ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ while (1) { ++ if (test_bit(IOCTL_WANT, (void *)&(ha->ioctl->access_bits)) == ++ 0) { ++ ++ DEBUG9(printk("%s(%ld): going to test access_bits.\n", ++ __func__, ha->host_no);) ++ ++ /* No one else is waiting. Go ahead and try to ++ * get access. ++ */ ++ if ((prev_val = test_and_set_bit(IOCTL_ACTIVE, ++ (void *)&ha->ioctl->access_bits)) == 0) { ++ break; ++ } ++ } ++ ++ /* wait for previous command to finish */ ++ DEBUG9(printk("%s(%ld): inst=%ld access_bits=%x. busy. " ++ "Waiting for access. curr time=0x%lx.\n", ++ __func__, ha->host_no, ha->instance, ++ ha->ioctl->access_bits, jiffies);) ++ ++ /* ++ * Init timer and get semaphore from wait_q. if we got valid ++ * semaphore pointer the IOCTL_WANT flag would also had ++ * been set. ++ */ ++ qla2x00_wait_q_add(ha, &ptmp_wq); ++ ++ if (ptmp_wq == NULL) { ++ /* queue full? problem? can't proceed. */ ++ DEBUG9_10(printk("%s(%ld): ERROR no more wait_q " ++ "allowed. exiting.\n", __func__, ha->host_no);) ++ ++ break; ++ } ++ ++ init_timer(&tmp_access_timer); ++ ++ tmp_access_timer.data = (unsigned long)ptmp_wq; ++ tmp_access_timer.function = ++ (void (*)(unsigned long))qla2x00_waitq_sem_timeout; ++ tmp_access_timer.expires = jiffies + tov * HZ; ++ ++ DEBUG9(printk("%s(%ld): adding timer. " ++ "curr time=0x%lx timeoutval=0x%lx.\n", ++ __func__, ha->host_no, jiffies, tmp_access_timer.expires);) ++ ++ /* wait. */ ++ add_timer(&tmp_access_timer); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld wait_q %p going to sleep. " ++ "current time=0x%lx.\n", ++ __func__, ha->host_no, ha->instance, ptmp_wq, jiffies);) ++ ++ down_interruptible(&ptmp_wq->wait_q_sem); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld wait_q %p woke up. current " ++ "time=0x%lx.\n", ++ __func__, ha->host_no, ha->instance, ptmp_wq, jiffies);) ++ ++ del_timer(&tmp_access_timer); ++ ++ /* try to get lock again. we'll test later to see ++ * if we actually got the lock. ++ */ ++ prev_val = test_and_set_bit(IOCTL_ACTIVE, ++ (void *)&(ha->ioctl->access_bits)); ++ ++ /* ++ * After we tried to get access then we check to see ++ * if we need to clear the IOCTL_WANT flag. Don't clear ++ * this flag before trying to get access or another ++ * new thread might grab it before we did. ++ */ ++ spin_lock_irqsave(&ha->ioctl->wait_q_lock, cpu_flags); ++ if (prev_val != 0) { ++ /* We'll return with error. ++ * Make sure we remove ourselves from wait_q. ++ */ ++ qla2x00_wait_q_remove(ha, ptmp_wq); ++ } ++ if (ha->ioctl->wait_q_head == NULL) { ++ /* We're the last thread in wait_q queue. */ ++ clear_bit(IOCTL_WANT, (void *)&ha->ioctl->access_bits); ++ } ++ qla2x00_wait_q_memb_free(ha, ptmp_wq); ++ spin_unlock_irqrestore(&ha->ioctl->wait_q_lock, cpu_flags); ++ ++ break; ++ } ++ ++ if (prev_val == 0) { ++ /* We got the lock */ ++ ++ DEBUG9(printk("%s(%ld): inst=%ld got access.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ } else { ++ /* Timeout or resource error. */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld timed out " ++ "or wait_q error.\n", __func__, ha->host_no, ha->instance);) ++ ++ rval = QL_STATUS_TIMEOUT; ++ } ++ ++ return (rval); ++} ++ ++/* ++ * qla2x00_release_ioctl_access ++ * Serialization routine for the ioctl commands. ++ * This releases "access" and checks on wai_q queue. If there's ++ * another thread waiting then wakes it up. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * tov = timeout value in seconds ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint8_t ++qla2x00_release_ioctl_access(scsi_qla_host_t *ha) ++{ ++ wait_q_t *next_thread = NULL; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ clear_bit(IOCTL_ACTIVE, (void *)&(ha->ioctl->access_bits)); ++ ++ /* Wake up one pending ioctl thread in wait_q */ ++ qla2x00_wait_q_get_next(ha, &next_thread); ++ if (next_thread) { ++ DEBUG9(printk( ++ "%s(%ld): inst=%ld found wait_q. Wake up waitq %p\n", ++ __func__, ha->host_no, ha->instance, &next_thread);) ++ up(&next_thread->wait_q_sem); ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ return QL_STATUS_SUCCESS; ++} ++ ++/* ++ * qla2x00_wait_q_memb_alloc ++ * Finds a free wait_q member from the array. Must already got the ++ * wait_q_lock spinlock. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_wait_q_memb_alloc(scsi_qla_host_t *ha, wait_q_t **ret_wait_q_memb) ++{ ++ uint8_t i; ++ wait_q_t *ptmp = NULL; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ for (i = 0; i < MAX_IOCTL_WAIT_THREADS; i++) { ++ if (!(ha->ioctl->wait_q_arr[i].flags & WQ_IN_USE)) { ++ ha->ioctl->wait_q_arr[i].flags |= WQ_IN_USE; ++ ptmp = &ha->ioctl->wait_q_arr[i]; ++ break; ++ } ++ } ++ ++ *ret_wait_q_memb = ptmp; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld return waitq_memb=%p.\n", ++ __func__, ha->host_no, ha->instance, *ret_wait_q_memb);) ++} ++ ++/* ++ * qla2x00_wait_q_memb_free ++ * Frees the specified wait_q member. Must already got the wait_q_lock ++ * spinlock. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_wait_q_memb_free(scsi_qla_host_t *ha, wait_q_t *pfree_wait_q_memb) ++{ ++ DEBUG9(printk("%s(%ld): inst=%ld entered.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (pfree_wait_q_memb != NULL) { ++ DEBUG9(printk("%s(%ld): freeing %p.\n", ++ __func__, ha->host_no, pfree_wait_q_memb);) ++ pfree_wait_q_memb->flags &= ~WQ_IN_USE; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++} ++ ++/* ++ * qla2x00_wait_q_add ++ * Allocates a wait_q_t struct and add to the wait_q list. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static uint8_t ++qla2x00_wait_q_add(scsi_qla_host_t *ha, wait_q_t **ret_wq) ++{ ++ uint8_t rval = QL_STATUS_SUCCESS; ++ unsigned long cpu_flags; ++ wait_q_t *ptmp = NULL; ++ ++ spin_lock_irqsave(&ha->ioctl->wait_q_lock, cpu_flags); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld got wait_q spinlock.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ qla2x00_wait_q_memb_alloc(ha, &ptmp); ++ if (ptmp == NULL) { ++ /* can't add any more threads */ ++ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR no more ioctl " ++ "threads allowed.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ rval = QL_STATUS_RESOURCE_ERROR; ++ } else { ++ if (ha->ioctl->wait_q_tail == NULL) { ++ /* First thread to queue. */ ++ set_bit(IOCTL_WANT, (void *)&ha->ioctl->access_bits); ++ ++ ha->ioctl->wait_q_head = ptmp; ++ } else { ++ ha->ioctl->wait_q_tail->pnext = ptmp; ++ } ++ ha->ioctl->wait_q_tail = ptmp; ++ ++ *ret_wq = ptmp; ++ ++ /* Now init the semaphore */ ++ ++ init_MUTEX_LOCKED(&ptmp->wait_q_sem); ++ ++ rval = QL_STATUS_SUCCESS; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld going to release spinlock. " ++ "ret_wq=%p, rval=%d.\n", ++ __func__, ha->host_no, ha->instance, *ret_wq, rval);) ++ ++ spin_unlock_irqrestore(&ha->ioctl->wait_q_lock, cpu_flags); ++ ++ return rval; ++} ++ ++/* ++ * qla2x00_wait_q_get_next ++ * This just removes one member from head of wait_q. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_wait_q_get_next(scsi_qla_host_t *ha, wait_q_t **ret_wq) ++{ ++ unsigned long cpu_flags; ++ ++ if (test_bit(IOCTL_ACTIVE, (void *)&(ha->ioctl->access_bits)) != 0) { ++ /* Another thread just became active. Exit. */ ++ *ret_wq = NULL; ++ return; ++ } ++ ++ /* Find the next thread to wake up */ ++ spin_lock_irqsave(&ha->ioctl->wait_q_lock, cpu_flags); ++ ++ DEBUG9(printk("%s(%ld): inst=%ld got wait_q spinlock.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ /* Remove from head */ ++ *ret_wq = ha->ioctl->wait_q_head; ++ if (ha->ioctl->wait_q_head != NULL) { ++ ++ ha->ioctl->wait_q_head = ha->ioctl->wait_q_head->pnext; ++ ++ if (ha->ioctl->wait_q_head == NULL) { ++ /* That's the last one in queue. */ ++ ha->ioctl->wait_q_tail = NULL; ++ } ++ ++ (*ret_wq)->pnext = NULL; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld return ret_wq=%p. Going to release " ++ "spinlock.\n", ++ __func__, ha->host_no, ha->instance, *ret_wq);) ++ spin_unlock_irqrestore(&ha->ioctl->wait_q_lock, cpu_flags); ++} ++ ++/* ++ * qla2x00_wait_q_remove ++ * Removes the specified member from wait_q. ++ * Must already got the wait_q_lock spin lock. ++ * ++ * Input: ++ * ha = adapter state pointer. ++ * ++ * Returns: ++ * qla2x00 local function return status code. ++ * ++ * Context: ++ * Kernel context. ++ */ ++static void ++qla2x00_wait_q_remove(scsi_qla_host_t *ha, wait_q_t *rem_wq) ++{ ++ wait_q_t *ptmp_wq; ++ wait_q_t *ptmp_prev; ++ ++ DEBUG9(printk("%s(%ld): inst=%ld rem_wq=%p.\n", ++ __func__, ha->host_no, ha->instance, rem_wq);) ++ ++ /* Search then remove */ ++ ptmp_prev = NULL; ++ for (ptmp_wq = ha->ioctl->wait_q_head; ptmp_wq != NULL; ++ ptmp_wq = ptmp_wq->pnext) { ++ ++ if (ptmp_wq == rem_wq) { ++ /* Found it in wait_q. Remove. */ ++ ++ DEBUG9(printk("%s(%ld): inst=%ld removing.\n", ++ __func__, ha->host_no, ha->instance);) ++ ++ if (ha->ioctl->wait_q_head == ptmp_wq) { ++ ha->ioctl->wait_q_head = ptmp_wq->pnext; ++ } else { ++ ptmp_prev->pnext = ptmp_wq->pnext; ++ } ++ ++ if (ha->ioctl->wait_q_tail == ptmp_wq) { ++ ha->ioctl->wait_q_tail = ptmp_prev; ++ } ++ ++ ptmp_wq->pnext = NULL; ++ ++ break; ++ } ++ ptmp_prev = ptmp_wq; ++ } ++ ++ DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", ++ __func__, ha->host_no, ha->instance);) ++} ++ ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qlfo.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,413 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++/* ++ * San/Device Management Failover Ioctl Header ++ * File is created to adhere to Solaris requirement using 8-space tabs. ++ * ++ * !!!!! PLEASE DO NOT REMOVE THE TABS !!!!! ++ * !!!!! PLEASE NO SINGLE LINE COMMENTS: // !!!!! ++ * !!!!! PLEASE NO MORE THAN 80 CHARS PER LINE !!!!! ++ * ++ * Revision History: ++ * ++ * Rev. 0.00 August 8, 2000 ++ * WTR - Created. ++ * ++ * Rev. 0.01 August 8, 2000 ++ * WTR - Made size of HbaInstance fields consistant as UINT8. ++ * Made command codes as 300 upward to be consistant with definitions ++ * in ExIoct.h. ++ * Rev. 0.01 October 3, 2000 ++ * TLE - Exclusion of ExIoct.h ++ * ++ * Rev. 0.01 October 6, 2000 ++ * TLE - Made size of HbaInstance fields UINT8 ++ * ++ * Rev. 0.01 October 10, 2000 ++ * TLE - Add _FO_DRIVER_VERSION data structure ++ */ ++ ++ ++ ++#ifndef _FO_H ++#define _FO_H ++ ++/* ++ * *********************************************************************** ++ * X OS type definitions ++ * *********************************************************************** ++ */ ++#ifdef _MSC_VER /* NT */ ++ ++#pragma pack(1) ++#include "qlfont.h" ++ ++#elif defined(linux) /* Linux */ ++ ++#include "qlfoln.h" ++ ++#elif defined(sun) || defined(__sun) /* Solaris */ ++ ++#include "qlfoso.h" ++ ++#endif ++ ++#define SDM_DEF_MAX_DEVICES 16 ++#define SDM_DEF_MAX_PATHS_PER_TARGET 4 ++#define SDM_DEF_MAX_TARGETS_PER_DEVICE 4 ++#define SDM_DEF_MAX_PATHS_PER_DEVICE (SDM_DEF_MAX_PATHS_PER_TARGET * SDM_DEF_MAX_TARGETS_PER_DEVICE) ++ ++#define FO_MAX_LUNS_PER_DEVICE MAX_LUNS_OS ++#define FO_MAX_PATHS (SDM_DEF_MAX_PATHS_PER_DEVICE * SDM_DEF_MAX_DEVICES) ++#define FO_MAX_ADAPTERS 32 ++#define FO_ADAPTER_ALL 0xFF ++#define FO_DEF_WWN_SIZE 8 ++#define FO_MAX_GEN_INFO_STRING_LEN 32 ++ ++ ++#define FO_NOTIFY_TYPE_NONE 0 ++#define FO_NOTIFY_TYPE_LUN_RESET 1 ++#define FO_NOTIFY_TYPE_CDB 2 ++#define FO_NOTIFY_TYPE_LOGOUT_OR_LUN_RESET 3 ++#define FO_NOTIFY_TYPE_LOGOUT_OR_CDB 4 ++ ++#define FO_NOTIFY_TYPE_MIN FO_NOTIFY_TYPE_NONE ++#define FO_NOTIFY_TYPE_MAX FO_NOTIFY_TYPE_LOGOUT_OR_CDB ++#define FO_NOTIFY_TYPE_DEF FO_NOTIFY_TYPE_NONE ++ ++#define FO_NOTIFY_CDB_LENGTH_MIN 6 ++#define FO_NOTIFY_CDB_LENGTH_MAX 16 ++ ++/* ++ * IOCTL Commands ++ */ ++ ++#define FO_CC_GET_PARAMS FO_CC_GET_PARAMS_OS ++#define FO_CC_SET_PARAMS FO_CC_SET_PARAMS_OS ++#define FO_CC_GET_PATHS FO_CC_GET_PATHS_OS ++#define FO_CC_SET_CURRENT_PATH FO_CC_SET_CURRENT_PATH_OS ++#define FO_CC_GET_HBA_STAT FO_CC_GET_HBA_STAT_OS ++#define FO_CC_RESET_HBA_STAT FO_CC_RESET_HBA_STAT_OS ++#define FO_CC_GET_LUN_DATA FO_CC_GET_LUN_DATA_OS ++#define FO_CC_SET_LUN_DATA FO_CC_SET_LUN_DATA_OS ++#define FO_CC_GET_TARGET_DATA FO_CC_GET_TARGET_DATA_OS ++#define FO_CC_SET_TARGET_DATA FO_CC_SET_TARGET_DATA_OS ++#define FO_CC_GET_FO_DRIVER_VERSION FO_CC_GET_FO_DRIVER_VERSION_OS ++ ++ ++/* Systemwide failover parameters. */ ++ ++typedef struct _FO_PARAMS ++{ ++ UINT32 InspectionInterval; /* Timer interval to check for failover.*/ ++ UINT8 MaxPathsPerDevice; /* Max paths to any single device. */ ++ UINT8 MaxRetriesPerPath; /* Max retries on a path before */ ++ ++ /* Failover. */ ++ UINT8 MaxRetriesPerIo; /* Max retries per i/o request. */ ++ UINT8 Reserved1; ++ UINT32 Flags; /* Control flags. */ ++ UINT8 DeviceErrorThreshold; /* Max device errors. */ ++ UINT8 DeviceTimeoutThreshold; /* Max device timeouts.*/ ++ UINT8 FrameErrorThreshold; /* Max frame errors.*/ ++ UINT8 LinkErrorThreshold; /* Max link errors.*/ ++ UINT32 Reserved2[4]; /* Spares.*/ ++ ++ /* Load balancing parameters.*/ ++ ++ UINT8 RollingAverageIntervals;/* Intervals to sum for rolling average.*/ ++ UINT8 MaxDevicesToMigrate; /* Max devices to migrate in any interval.*/ ++ UINT8 BalanceMethod; /* Method to use for load balancing.*/ ++ UINT8 Reserved3; /* Memory alignment.*/ ++ ++ UINT16 LoadShareMinPercentage; /* Load balancing parameter.*/ ++ UINT16 LoadShareMaxPercentage; /* Load balancing parameter.*/ ++ ++ /* Failover notify parameters. */ ++ ++ UINT8 FailoverNotifyType; /* Type of notification. */ ++ UINT8 FailoverNotifyCdbLength;/* Length of notification CDB. */ ++ UINT16 Reserved4; ++ UINT8 FailoverNotifyCdb[16]; /* CDB if notification by CDB. */ ++ UINT32 Reserved5; ++ ++} ++FO_PARAMS, *PFO_PARAMS, SysFoParams_t, *SysFoParams_p; ++ ++extern SysFoParams_t qla_fo_params; ++ ++typedef struct _FO_GET_PATHS ++{ ++ UINT8 HbaInstance; ++ EXT_DEST_ADDR HbaAddr; /* Lun field is ignored */ ++ UINT32 Reserved[5]; ++ ++} ++FO_GET_PATHS, *PFO_GET_PATHS; ++ ++ ++typedef struct _FO_PATH_ENTRY ++{ ++ UINT8 Reserved1; ++ UINT8 Visible; /* Path is visible path. */ ++ UINT8 Priority; ++ UINT8 Reserved2; ++ UINT8 HbaInstance; ++ UINT8 PortName[EXT_DEF_WWN_NAME_SIZE]; ++ UINT16 Reserved3; ++ UINT32 Reserved[3]; ++ ++} ++FO_PATH_ENTRY, *PFO_PATH_ENTRY; ++ ++ ++typedef struct _FO_PATHS_INFO ++{ ++ /* These first fields in the output buffer are specifically the ++ * same as the fields in the input buffer. This is because the ++ * same system buffer holds both, and this allows us to reference ++ * the input buffer parameters while filling the output buffer. */ ++ ++ UINT8 HbaInstance; ++ EXT_DEST_ADDR HbaAddr; ++ UINT32 Reserved[5]; ++ UINT8 PathCount; /* Number of Paths in PathEntry array */ ++ UINT8 Reserved3; ++ UINT8 VisiblePathIndex; /* Which index has BOOLEAN "visible" flag set */ ++ UINT8 Reserved4; ++ ++ UINT8 CurrentPathIndex[FO_MAX_LUNS_PER_DEVICE]; /* Current Path Index for each Lun */ ++ ++ FO_PATH_ENTRY PathEntry[FO_MAX_PATHS]; ++ ++ UINT32 Reserved5[4]; ++ ++} ++FO_PATHS_INFO, *PFO_PATHS_INFO; ++ ++typedef struct _FO_SET_CURRENT_PATH ++{ ++ UINT8 HbaInstance; ++ EXT_DEST_ADDR HbaAddr; ++ UINT8 NewCurrentPathIndex; /* Path index to make current path. */ ++ UINT8 FailoverType; /* Reason for failover. */ ++ UINT32 Reserved[3]; ++ ++} ++FO_SET_CURRENT_PATH, *PFO_SET_CURRENT_PATH; ++ ++typedef union _FO_PATHS { ++ FO_GET_PATHS input; ++ FO_SET_CURRENT_PATH set ++ ; ++ FO_PATHS_INFO info; ++} FO_PATHS; ++ ++ ++typedef struct _FO_HBA_STAT_INPUT ++{ ++ /* The first field in the input buffer is specifically the ++ * same as the field in the output buffer. This is because the ++ * same system buffer holds both, and this allows us to reference ++ * the input buffer parameters while filling the output buffer. */ ++ ++ UINT8 HbaInstance; /* Port number or ADAPTER_ALL. */ ++ UINT8 Reserved1[3]; ++ UINT32 Reserved2[7]; ++ ++} ++FO_HBA_STAT_INPUT, *PFO_HBA_STAT_INPUT; ++ ++ ++typedef struct _FO_HBA_STAT_ENTRY ++{ ++ UINT8 HbaInstance; ++ UINT8 Reserved1[3]; ++ UINT32 Reserved2; ++ UINT64 IosRequested; /* IOs requested on this adapter. */ ++ UINT64 BytesRequested; /* Bytes requested on this adapter. */ ++ UINT64 IosExecuted; /* IOs executed on this adapter. */ ++ UINT64 BytesExecuted; /* Bytes executed on this adapter. */ ++ UINT32 Reserved3[22]; ++ ++} ++FO_HBA_STAT_ENTRY, *PFO_HBA_STAT_ENTRY; ++ ++ ++typedef struct _FO_HBA_STAT_INFO ++{ ++ /* The first fields in the output buffer is specifically the ++ * same as the field in the input buffer. This is because the ++ * same system buffer holds both, and this allows us to reference ++ * the input buffer parameters while filling the output buffer. */ ++ ++ UINT8 HbaInstance; /* Port number or ADAPTER_ALL. */ ++ UINT8 HbaCount; /* Count of adapters returned. */ ++ UINT8 Reserved1[2]; ++ UINT32 Reserved2[7]; ++ ++ FO_HBA_STAT_ENTRY StatEntry[FO_MAX_ADAPTERS]; ++ ++} ++FO_HBA_STAT_INFO, *PFO_HBA_STAT_INFO; ++ ++ ++ ++/* The "external" LUN data refers to the LUNs as represented in our ++ configuration utility, where one physical target can support up to ++ 2048 LUNs, which are mapped around internally. This is in comparison ++ to an "internal" LUN data, which is 256 LUNs, after being mapped ++ inside the driver to multiple target slots. */ ++ ++#define EXTERNAL_LUN_COUNT 2048 ++ ++/* Structure as used in the IOCTL.*/ ++ ++typedef struct _FO_EXTERNAL_LUN_DATA_ENTRY ++{ ++ UINT8 NodeName[EXT_DEF_WWN_NAME_SIZE]; ++ UINT8 PortName[EXT_DEF_WWP_NAME_SIZE]; //sri ++ ++ UINT16 LunCount; /* Entries in Lun Data array. */ ++ UINT8 TargetId; ++ UINT8 Dev_No; ++ UINT32 Reserved3; ++ UINT32 Reserved4; ++ UINT32 Reserved5; /* Pad to 32-byte header.*/ ++ ++ UINT8 Data[EXTERNAL_LUN_COUNT]; ++} ++FO_EXTERNAL_LUN_DATA_ENTRY, *PFO_EXTERNAL_LUN_DATA_ENTRY; ++ ++// Structure as it is stored in the NT registry. ++ ++typedef struct _FO_LUN_DATA_LIST ++{ ++ UINT16 Version; /* Should be LUN_DATA_REGISTRY_VERSION.*/ ++ UINT16 EntryCount; /* Count of variable entries following.*/ ++ UINT32 Reserved1; ++ UINT32 Reserved2; ++ UINT32 Reserved3; ++ UINT32 Reserved4; ++ UINT32 Reserved5; ++ UINT32 Reserved6; ++ UINT32 Reserved7; /* Pad to 32-byte header.*/ ++ ++ FO_EXTERNAL_LUN_DATA_ENTRY DataEntry[1]; /* Variable-length data.*/ ++ ++} ++FO_LUN_DATA_LIST, *PFO_LUN_DATA_LIST; ++ ++typedef struct _FO_LUN_DATA_INPUT ++{ ++ /* The first field in the input buffer is specifically the ++ * same as the field in the output buffer. This is because the ++ * same system buffer holds both, and this allows us to reference ++ * the input buffer parameters while filling the output buffer. */ ++ ++ UINT8 HbaInstance; /* Port number */ ++ UINT8 Reserved1[3]; ++ UINT32 Reserved2[7]; ++ ++} ++FO_LUN_DATA_INPUT, *PFO_LUN_DATA_INPUT; ++ ++typedef struct _FO_REQUEST_ADDR ++{ ++ UINT8 HbaInstance; ++ EXT_DEST_ADDR TargetAddr; ++ UINT32 Reserved[5]; ++ ++} ++FO_REQUEST_ADDR, *PFO_REQUEST_ADDR; ++ ++typedef struct _FO_TARGET_DATA_INPUT ++{ ++ UINT8 HbaInstance; /* Port number */ ++ UINT8 Reserved1[3]; ++ UINT32 Reserved2[7]; ++ ++} ++FO_TARGET_DATA_INPUT, *PFO_TARGET_DATA_INPUT; ++ ++#define FO_INTERNAL_LUN_COUNT 256 ++#define FO_INTERNAL_LUN_BITMASK_BYTES (FO_INTERNAL_LUN_COUNT / 8) ++ ++typedef struct _FO_INTERNAL_LUN_BITMASK ++{ ++ UINT8 Bitmask[FO_INTERNAL_LUN_BITMASK_BYTES]; ++} ++FO_INTERNAL_LUN_BITMASK, *PFO_INTERNAL_LUN_BITMASK; ++ ++typedef struct _FO_DEVICE_DATA ++{ ++ UINT32 DeviceFlags; /* Device flags */ ++ UINT16 LoopId; /* Current loop ID */ ++ UINT16 BaseLunNumber; /* Base LUN number */ ++ UINT8 WorldWideName[8]; /* World Wide Name for device */ ++ UINT8 PortId[3]; /* Port ID */ ++ UINT8 MultipathControl; /* Multipath control byte. */ ++ UINT16 DeviceState; /* Device state */ ++ UINT16 LoginRetryCount; /* Number of login retries */ ++ UINT8 PortName[8]; /* Port name for device */ ++ UINT16 TimeoutCount; /* Command timeout count */ ++ UINT8 TargetId; ++ UINT8 Dev_No; ++ FO_INTERNAL_LUN_BITMASK LunBitmask; /* LUN bitmask */ ++} ++FO_DEVICE_DATA, *PFO_DEVICE_DATA; ++ ++typedef struct _FO_DEVICE_DATABASE ++{ ++ FO_DEVICE_DATA DeviceData[256]; ++} ++FO_DEVICE_DATABASE, *PFO_DEVICE_DATABASE; ++ ++typedef struct _FO_DRIVER_VERSION ++{ ++ // Numeric version. ++ UINT8 Version; // Major version number. ++ UINT8 Revision; // Minor version number. ++ UINT8 Subrevision; // Subminor version number. ++ UINT8 Reserved1; // Memory alignment. ++ ++ // String version. ++ UINT8 VersionStr[FO_MAX_GEN_INFO_STRING_LEN]; ++ ++ // Reserved fields. ++ UINT32 Reserved2[16]; ++ ++} ++FO_DRIVER_VERSION, *PFO_DRIVER_VERSION; ++ ++ ++#define FO_LUN_DATA_LIST_MIN_ENTRIES 1 ++#define FO_LUN_DATA_LIST_MAX_ENTRIES 256 ++#ifdef _WIN64 ++#define FO_LUN_DATA_LIST_HEADER_SIZE 32 ++#else ++#define FO_LUN_DATA_LIST_HEADER_SIZE offsetof(FO_LUN_DATA_LIST, DataEntry) ++#endif ++ ++#define FO_LUN_DATA_LIST_MIN_SIZE (FO_LUN_DATA_LIST_HEADER_SIZE + (sizeof(FO_EXTERNAL_LUN_DATA_ENTRY) * FO_LUN_DATA_LIST_MIN_ENTRIES)) ++#define FO_LUN_DATA_LIST_MAX_SIZE (FO_LUN_DATA_LIST_HEADER_SIZE + (sizeof(FO_EXTERNAL_LUN_DATA_ENTRY) * FO_LUN_DATA_LIST_MAX_ENTRIES)) ++ ++ ++#endif /* ifndef _FO_H */ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qlfolimits.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,92 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++/* ++ * Minimums, maximums, defaults, and other definitions for MC_PARAMS. ++ */ ++ ++#define FO_INSPECTION_INTERVAL_MIN 0 ++#define FO_INSPECTION_INTERVAL_MAX 1000000 ++#define FO_INSPECTION_INTERVAL_DEF 600 ++ ++#define FO_MAX_PATHS_PER_DEVICE_MIN 1 ++#define FO_MAX_PATHS_PER_DEVICE_MAX 8 ++#define FO_MAX_PATHS_PER_DEVICE_DEF 8 ++ ++#define FO_MAX_RETRIES_PER_PATH_MIN 1 ++#define FO_MAX_RETRIES_PER_PATH_MAX 8 ++#define FO_MAX_RETRIES_PER_PATH_DEF 3 ++ ++#define FO_MAX_RETRIES_PER_IO_MIN ((FO_MAX_PATHS_PER_DEVICE_MIN * FO_MAX_RETRIES_PER_PATH_MIN) + 1) ++#define FO_MAX_RETRIES_PER_IO_MAX ((FO_MAX_PATHS_PER_DEVICE_MAX * FO_MAX_RETRIES_PER_PATH_MAX) + 1) ++#define FO_MAX_RETRIES_PER_IO_DEF ((FO_MAX_PATHS_PER_DEVICE_DEF * FO_MAX_RETRIES_PER_PATH_DEF) + 1) ++ ++#define FO_DEVICE_ERROR_THRESHOLD_MIN 1 ++#define FO_DEVICE_ERROR_THRESHOLD_MAX 255 ++#define FO_DEVICE_ERROR_THRESHOLD_DEF 4 ++ ++#define FO_DEVICE_TIMEOUT_THRESHOLD_MIN 1 ++#define FO_DEVICE_TIMEOUT_THRESHOLD_MAX 255 ++#define FO_DEVICE_TIMEOUT_THRESHOLD_DEF 4 ++ ++#define FO_FRAME_ERROR_THRESHOLD_MIN 1 ++#define FO_FRAME_ERROR_THRESHOLD_MAX 255 ++#define FO_FRAME_ERROR_THRESHOLD_DEF 4 ++ ++#define FO_LINK_ERROR_THRESHOLD_MIN 1 ++#define FO_LINK_ERROR_THRESHOLD_MAX 255 ++#define FO_LINK_ERROR_THRESHOLD_DEF 4 ++ ++#define FO_ROLLING_AVERAGE_INTERVALS_MIN 1 ++#define FO_ROLLING_AVERAGE_INTERVALS_MAX 10 ++#define FO_ROLLING_AVERAGE_INTERVALS_DEF 1 ++ ++#define FO_MAX_DEVICES_TO_MIGRATE_MIN 0 ++#define FO_MAX_DEVICES_TO_MIGRATE_MAX 255 ++#define FO_MAX_DEVICES_TO_MIGRATE_DEF 4 ++ ++#define FO_BALANCE_METHOD_NONE 0 ++#define FO_BALANCE_METHOD_IOS 1 ++#define FO_BALANCE_METHOD_MBS 2 ++ ++#define FO_BALANCE_METHOD_MIN FO_BALANCE_METHOD_NONE ++#define FO_BALANCE_METHOD_MAX FO_BALANCE_METHOD_MBS ++#define FO_BALANCE_METHOD_DEF FO_BALANCE_METHOD_IOS ++ ++#define FO_LOAD_SHARE_MIN_PERCENTAGE_MIN 25 ++#define FO_LOAD_SHARE_MIN_PERCENTAGE_MAX 99 ++#define FO_LOAD_SHARE_MIN_PERCENTAGE_DEF 75 ++ ++#define FO_LOAD_SHARE_MAX_PERCENTAGE_MIN 101 ++#define FO_LOAD_SHARE_MAX_PERCENTAGE_MAX 500 ++#define FO_LOAD_SHARE_MAX_PERCENTAGE_DEF 150 ++ ++#define FO_NOTIFY_TYPE_NONE 0 ++#define FO_NOTIFY_TYPE_LUN_RESET 1 ++#define FO_NOTIFY_TYPE_CDB 2 ++#define FO_NOTIFY_TYPE_LOGOUT_OR_LUN_RESET 3 ++#define FO_NOTIFY_TYPE_LOGOUT_OR_CDB 4 ++ ++#define FO_NOTIFY_TYPE_MIN FO_NOTIFY_TYPE_NONE ++#define FO_NOTIFY_TYPE_MAX FO_NOTIFY_TYPE_LOGOUT_OR_CDB ++#define FO_NOTIFY_TYPE_DEF FO_NOTIFY_TYPE_NONE ++ ++#define FO_NOTIFY_CDB_LENGTH_MIN 6 ++#define FO_NOTIFY_CDB_LENGTH_MAX 16 ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/qlfoln.h Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,76 @@ ++/****************************************************************************** ++ * QLOGIC LINUX SOFTWARE ++ * ++ * QLogic ISP2x00 device driver for Linux 2.5.x ++ * Copyright (C) 2003 Qlogic Corporation ++ * (www.qlogic.com) ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2, or (at your option) any ++ * later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ ******************************************************************************/ ++ ++ ++#define QLMULTIPATH_MAGIC 'y' ++/********************************************************/ ++/* Failover ioctl command codes range from 0xc0 to 0xdf */ ++/********************************************************/ ++ ++ ++#define FO_CC_GET_PARAMS_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 200, sizeof(EXT_IOCTL)) /* 0xc8 */ ++#define FO_CC_SET_PARAMS_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 201, sizeof(EXT_IOCTL)) /* 0xc9 */ ++#define FO_CC_GET_PATHS_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 202, sizeof(EXT_IOCTL)) /* 0xca */ ++#define FO_CC_SET_CURRENT_PATH_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 203, sizeof(EXT_IOCTL)) /* 0xcb */ ++#define FO_CC_GET_HBA_STAT_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 204, sizeof(EXT_IOCTL)) /* 0xcc */ ++#define FO_CC_RESET_HBA_STAT_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 205, sizeof(EXT_IOCTL)) /* 0xcd */ ++#define FO_CC_GET_LUN_DATA_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 206, sizeof(EXT_IOCTL)) /* 0xce */ ++#define FO_CC_SET_LUN_DATA_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 207, sizeof(EXT_IOCTL)) /* 0xcf */ ++#define FO_CC_GET_TARGET_DATA_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 208, sizeof(EXT_IOCTL)) /* 0xd0 */ ++#define FO_CC_SET_TARGET_DATA_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 209, sizeof(EXT_IOCTL)) /* 0xd1 */ ++#define FO_CC_GET_FO_DRIVER_VERSION_OS \ ++ _IOWR(QLMULTIPATH_MAGIC, 210, sizeof(EXT_IOCTL)) /* 0xd2 */ ++ ++ ++#define BOOLEAN uint8_t ++#define MAX_LUNS_OS 256 ++ ++/* Driver attributes bits */ ++#define DRVR_FO_ENABLED 0x1 /* bit 0 */ ++ ++ ++/* ++ * Overrides for Emacs so that we almost follow Linus's tabbing style. ++ * Emacs will notice this stuff at the end of the file and automatically ++ * adjust the settings for this buffer only. This must remain at the end ++ * of the file. ++ * --------------------------------------------------------------------------- ++ * Local variables: ++ * c-indent-level: 2 ++ * c-brace-imaginary-offset: 0 ++ * c-brace-offset: -2 ++ * c-argdecl-indent: 2 ++ * c-label-offset: -2 ++ * c-continued-statement-offset: 2 ++ * c-continued-brace-offset: 0 ++ * indent-tabs-mode: nil ++ * tab-width: 8 ++ * End: ++ */ ++ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/release.txt Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,28 @@ ++ ++ QLogic QLA2200 and QLA2300 Linux Driver ++ ++ Release Notes ++ ============= ++ ++Version 8.00.00b1 March 05, 2003 ++ +++**********************************************+ ++* Features supported by this version of driver * +++**********************************************+ ++o FCAL - direct attach ++o Point-to-point ++o Fabric support ++o Initiator mode only ++o Fault recovery on down loops ++o Persistent binding - HBA node name valid ++o Linux 2.5.x Kernel Support *ONLY* ++o IPFC support ++ +++********************************+ ++* Changes From Previous Releases * +++********************************+ ++o Please view revision.notes file ++ +++**************+ ++* Known Issues * +++**************+ +--- /dev/null Thu Apr 11 07:25:15 2002 ++++ linux-2.5.73-n9560/drivers/scsi/qla2xxx/revision.notes Thu Jul 3 15:34:42 2003 +@@ -0,0 +1,167 @@ ++/* ++ * QLogic ISP2200 and ISP2300 Linux Driver Revision List File. ++ * ++ ******************************************************************** ++ * ++ * Revision History ++ * ++ * Rev 8.00.00 May 05, 2003 AV ++ * - Resync with Linux Kernel 2.5.69. ++ * - Firmware versions: 2100 TP (1.19.24), 2200 TP (2.02.05), ++ * 2300 TPX (3.02.10). ++ * ++ * Rev 8.00.00b1-pre45 April ??, 2003 AV ++ * - Resync with Linux Kernel 2.5.68-bk11: ++ * - Fix improper return-code assignment during fabric ++ * discovery. ++ * - Remove additional extraneous #defines from ++ * qla_settings.h. ++ * - USE_PORTNAME -- FO will always use portname. ++ * - Default queue depth size set to 64. ++ * ++ * Rev 8.00.00b1-pre42 April ??, 2003 AV ++ * - Convert bottom-half tasklet to a work_queue. ++ * - Initial basic coding of dynamic queue depth handling ++ * during QUEUE FULL statuses. ++ * - Fix mailbox interface problem with ++ * qla2x00_get_retry_cnt(). ++ * ++ * Rev 8.00.00b1-pre41 April ??, 2003 AV ++ * - Convert build defines qla2[1|2|3]00 macros to ++ * qla2[1|2|3]xx due to module name stringification clashes. ++ * - Add additional ISP2322 checks during board configuration. ++ * ++ * Rev 8.00.00b1-pre40 April ??, 2003 AV ++ * - Resync with Linux Kernel 2.5.68-bk8: ++ * - Updated IRQ handler interface. ++ * - Add ISP dump code (stub) in case of SYSTEM_ERROR on ++ * ISP2100. ++ * - Add new 2200 IP firmware (2.02.05). ++ * ++ * Rev 8.00.00b1-pre39 April ??, 2003 AV ++ * - Resync with Linux Kernel 2.5.68. ++ * - Add simple build.sh script to aid in external compilation. ++ * - Clean-break with Kernel 2.4 compatibility. ++ * - Rework DPC routine -- completion routines for signaling. ++ * - Re-add HBAAPI character device node for IOCTL support. ++ * - Remove residual QLA2X_PERFORMANCE defines. ++ * - Allocate SP pool via __get_free_pages() rather than ++ * individual kmalloc()'s. ++ * - Inform SCSI mid-layer of 16-byte CDB support ++ * (host->max_cmd_len): ++ * - Remove unecessary 'more_cdb' handling code from ++ * qla_iocb.c and qla_xioct.c. ++ * - Reduce duplicate code in fabric scanning logic (MS IOCB ++ * preparation). ++ * - Add ISP dump code in case of SYSTEM_ERROR. ++ * - Remove 2300 VIX firmware from distribution: ++ * - Add initial code for IPX support. ++ * - Add new 2300 TPX firmware (3.02.10). ++ * ++ * Rev 8.00.00b1-pre34 April ??, 2003 AV ++ * - Resync with Linux Kernel 2.5.67. ++ * - Use domain/area/al_pa fields when displaying PortID ++ * values -- addresses endianess issues. ++ * - Rework large case statement to check 'common' CDB commands ++ * early in qla2x00_get_cmd_direction(). ++ * ++ * Rev 8.00.00b1-pre31 April ??, 2003 AV ++ * - Update makefile to support PPC64 build. ++ * - Retool NVRAM configuration routine and structures: ++ * - Consoldate ISP21xx/ISP22xx/ISP23xx configuration ++ * (struct nvram_t). ++ * - Remove big/little endian support structures in favor of ++ * simplified bit-operations within byte fields. ++ * - Fix long-standing 'static' buffer sharing problem in ++ * qla2x00_configure_fabric(). ++ * ++ * Rev 8.00.00b1-pre30 April ??, 2003 AV ++ * - Complete implementation of GID_PT scan. ++ * - Use consistent MS IOCB invocation method to query SNS: ++ * - Add RNN_ID and RSNN_NN registrations in a fabric. ++ * - Remove unused Mailbox Command 6Eh (Send SNS) support ++ * structures. ++ * - Use 64bit safe IOCBs while issuing INQUIRY and RLC during ++ * topology scan. ++ * - Until reimplementation of fcdev_t/fcport list ++ * consolidation, valid loop_id ranges are still limited from ++ * 0x00 through 0xFF -- enforce this within the code. ++ * ++ * Rev 8.00.00b1-pre27 March ??, 2003 AV ++ * - Resync with 6.05.00b9. ++ * - Retool HBA PCI configuration -- qla2x00_pci_config(). ++ * - Remove inconsistent use of delay routines (UDELAY/SYS*). ++ * - Continue to teardown/clean/add comments and debug ++ * routines. ++ * - Properly swap bytes of the device's nodename in ++ * qla2x00_configure_local_loop(). ++ * ++ * Rev 8.00.00b1-pre25 March ??, 2003 AV ++ * - Resync with 6.05.00b8. ++ * ++ * Rev 8.00.00b1-pre23 March ??, 2003 AV ++ * - Remove (#define) IOCB usage throttling. ++ * - Abstract interrupt polling with qla2x00_poll(). ++ * - Modify lun scanning logic: ++ * - If the device does not support the SCSI Report Luns ++ * command, the driver will now only scan from 0 to the ++ * max#-luns as defined in the NVRAM (BIOS), rather than ++ * blindly scanning from 0 to 255 -- which could result in ++ * an increase in startup time when running against slow ++ * (JBOD) devices. ++ * - Rework reset logic in qla2x00_reset_chip() (spec). ++ * ++ * Rev 8.00.00b1-pre22 March ??, 2003 AV ++ * - Resync with 6.05.00b7. ++ * - Cleanup (rewrite) ISR handler. ++ * - Rename kmem_zalloc --> qla2x00_kmem_zalloc(): ++ * - This function will eventually be removed. ++ * - Add new 2300 VIX firmware (3.02.09): ++ * - Support for Tape, Fabric, 2K logins, IP, and VI. ++ * ++ * Rev 8.00.00b1-pre18 March ??, 2003 AV ++ * - Support 232x type ISPs. ++ * - Support single firmware for each ISP type: ++ * - Restructure brd_info/fw_info methods. ++ * - Streamline firmware load process. ++ * - Properly query firmware for version information. ++ * - Remove extraneous scsi_qla_host members: ++ * - device_id ==> pdev->device ++ * - Fix fc4 features (RFF_ID) registration. ++ * - Convert kmem_zalloc --> qla2x00_kmem_zalloc(). ++ * - Remove unused/extraneous #defines (USE_PORTNAME). ++ * ++ * Rev 8.00.00b1-pre14 March ??, 2003 AV ++ * - Resync with 6.05.00b6. ++ * - Initial source-code restructuring effort. ++ * - Build procedure. ++ * - Source file layout -- intuitive component layout. ++ * - Remove unused #defines (*PERFORMANCE, WORD_FW_LOAD, etc). ++ * - Add support for 2K logins (TPX -- firmware). ++ * - Add module parameter ql2xsuspendcount. ++ * - Add new 2200 IP/TP firmware (2.02.04). ++ * ++ * Rev 8.00.00b1-pre9 March ??, 2003 RL/DG/RA/AV ++ * - Use kernel struct list_head for fcport and fclun lists. ++ * - Remove extraneous (L|M)S_64BITS() and QL21_64*() defines. ++ * ++ * Rev 8.00.00b1-pre8 February 28, 2003 RL/DG/RA/AV ++ * - Resync with 6.05.00b3. ++ * ++ * Rev 8.00.00b1-pre7 February 23, 2003 RL/DG/RA/AV ++ * - Add alternate fabric scanning logic (GID_PT/GNN_ID/GPN_ID). ++ * - Remove use of deprecated function check_region(). ++ * - Add new 2300 IP/TP firmware (3.02.08). ++ * ++ * Rev 8.00.00b1-pre5 January 28, 2003 RL/DG/RA/AV ++ * - Resync with 6.05.00b3. ++ * - Consolidate device_reg structure definitions for ISP types. ++ * - Add support for new queue-depth selection. ++ * - Add new 2300 IP/TP firmware (3.02.07). ++ * ++ * Rev 8.00.00b1-pre1 January 17, 2003 AV ++ * - Initial branch from 6.04.00b8 driver. ++ * - Remove VMWARE specific code. ++ * - Add support for pci_driver interface. ++ * ++ ********************************************************************/ _ diff --git a/lustre/kernel_patches/pc/qla2xxx-v8.00.00b1-2.5.73.pc b/lustre/kernel_patches/pc/qla2xxx-v8.00.00b1-2.5.73.pc index ac5af09..06952b0 100644 --- a/lustre/kernel_patches/pc/qla2xxx-v8.00.00b1-2.5.73.pc +++ b/lustre/kernel_patches/pc/qla2xxx-v8.00.00b1-2.5.73.pc @@ -1,42 +1,42 @@ drivers/scsi/Makefile drivers/scsi/Kconfig -scsi/qla2xxx/Kconfig -scsi/qla2xxx/Makefile -scsi/qla2xxx/README.qla2x00 -scsi/qla2xxx/exioct.h -scsi/qla2xxx/exioctln.h -scsi/qla2xxx/inioct.h -scsi/qla2xxx/ql2100tp_fw.c -scsi/qla2xxx/ql2200ip_fw.c -scsi/qla2xxx/ql2300tpx_fw.c -scsi/qla2xxx/qla_cfg.c -scsi/qla2xxx/qla_cfg.h -scsi/qla2xxx/qla_cfgln.c -scsi/qla2xxx/qla_dbg.c -scsi/qla2xxx/qla_dbg.h -scsi/qla2xxx/qla_def.h -scsi/qla2xxx/qla_fo.c -scsi/qla2xxx/qla_fo.cfg -scsi/qla2xxx/qla_fo.h -scsi/qla2xxx/qla_gbl.h -scsi/qla2xxx/qla_inioct.c -scsi/qla2xxx/qla_init.c -scsi/qla2xxx/qla_inline.h -scsi/qla2xxx/qla_iocb.c -scsi/qla2xxx/qla_ip.c -scsi/qla2xxx/qla_ip.h -scsi/qla2xxx/qla_isr.c -scsi/qla2xxx/qla_listops.h -scsi/qla2xxx/qla_mbx.c -scsi/qla2xxx/qla_os.c -scsi/qla2xxx/qla_os.h -scsi/qla2xxx/qla_settings.h -scsi/qla2xxx/qla_sup.c -scsi/qla2xxx/qla_vendor.c -scsi/qla2xxx/qla_version.h -scsi/qla2xxx/qla_xioct.c -scsi/qla2xxx/qlfo.h -scsi/qla2xxx/qlfolimits.h -scsi/qla2xxx/qlfoln.h -scsi/qla2xxx/release.txt -scsi/qla2xxx/revision.notes +drivers/scsi/qla2xxx/Kconfig +drivers/scsi/qla2xxx/Makefile +drivers/scsi/qla2xxx/README.qla2x00 +drivers/scsi/qla2xxx/exioct.h +drivers/scsi/qla2xxx/exioctln.h +drivers/scsi/qla2xxx/inioct.h +drivers/scsi/qla2xxx/ql2100tp_fw.c +drivers/scsi/qla2xxx/ql2200ip_fw.c +drivers/scsi/qla2xxx/ql2300tpx_fw.c +drivers/scsi/qla2xxx/qla_cfg.c +drivers/scsi/qla2xxx/qla_cfg.h +drivers/scsi/qla2xxx/qla_cfgln.c +drivers/scsi/qla2xxx/qla_dbg.c +drivers/scsi/qla2xxx/qla_dbg.h +drivers/scsi/qla2xxx/qla_def.h +drivers/scsi/qla2xxx/qla_fo.c +drivers/scsi/qla2xxx/qla_fo.cfg +drivers/scsi/qla2xxx/qla_fo.h +drivers/scsi/qla2xxx/qla_gbl.h +drivers/scsi/qla2xxx/qla_inioct.c +drivers/scsi/qla2xxx/qla_init.c +drivers/scsi/qla2xxx/qla_inline.h +drivers/scsi/qla2xxx/qla_iocb.c +drivers/scsi/qla2xxx/qla_ip.c +drivers/scsi/qla2xxx/qla_ip.h +drivers/scsi/qla2xxx/qla_isr.c +drivers/scsi/qla2xxx/qla_listops.h +drivers/scsi/qla2xxx/qla_mbx.c +drivers/scsi/qla2xxx/qla_os.c +drivers/scsi/qla2xxx/qla_os.h +drivers/scsi/qla2xxx/qla_settings.h +drivers/scsi/qla2xxx/qla_sup.c +drivers/scsi/qla2xxx/qla_vendor.c +drivers/scsi/qla2xxx/qla_version.h +drivers/scsi/qla2xxx/qla_xioct.c +drivers/scsi/qla2xxx/qlfo.h +drivers/scsi/qla2xxx/qlfolimits.h +drivers/scsi/qla2xxx/qlfoln.h +drivers/scsi/qla2xxx/release.txt +drivers/scsi/qla2xxx/revision.notes -- 1.8.3.1