# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet v2.5.44 -> 1.835 # drivers/acpi/include/acglobal.h 1.12 -> 1.13 # drivers/acpi/namespace/nsxfobj.c 1.10 -> 1.11 # scripts/Makefile.clean 1.2 -> 1.7 # drivers/net/znet.c 1.5 -> 1.6 # drivers/scsi/inia100.h 1.6 -> 1.7 # include/linux/acpi.h 1.15 -> 1.17 # drivers/scsi/in2000.h 1.6 -> 1.7 # drivers/usb/storage/shuttle_usbat.c 1.15 -> 1.16 # include/asm-sparc64/system.h 1.18 -> 1.19 # include/asm-ia64/topology.h 1.1 -> 1.3 # include/linux/mempool.h 1.3 -> 1.4 # kernel/rcupdate.c 1.1 -> 1.2 # drivers/md/Makefile 1.7 -> 1.8 # drivers/base/hotplug.c 1.4 -> 1.5 # drivers/media/video/cpia_pp.c 1.7 -> 1.8 # drivers/media/video/cpia_usb.c 1.12 -> 1.13 # drivers/acpi/include/acutils.h 1.15 -> 1.16 # drivers/char/vme_scc.c 1.7 -> 1.8 # drivers/isdn/isdnloop/Makefile 1.3 -> 1.4 # drivers/scsi/pas16.c 1.5 -> 1.6 # Documentation/BK-usage/bk-kernel-howto.txt 1.4 -> 1.5 # drivers/cdrom/gscd.c 1.26 -> 1.27 # drivers/acpi/blacklist.c 1.4 -> 1.5 # drivers/char/i810-tco.c 1.10 -> 1.11 # drivers/scsi/g_NCR5380.h 1.3 -> 1.4 # drivers/acpi/dispatcher/dsobject.c 1.15 -> 1.16 # arch/ia64/ia32/ia32_signal.c 1.4 -> 1.8 # include/linux/elevator.h 1.16 -> 1.17 # net/ax25/Makefile 1.3 -> 1.4 # fs/xfs/pagebuf/page_buf.c 1.15 -> 1.16 # drivers/atm/Makefile 1.13 -> 1.14 # drivers/scsi/53c7,8xx.c 1.12 -> 1.13 # arch/ia64/Makefile 1.24 -> 1.27 # arch/ia64/kernel/efi.c 1.15 -> 1.16 # drivers/net/hamradio/soundmodem/Makefile 1.8 -> 1.10 # drivers/acpi/executer/exconvrt.c 1.11 -> 1.12 # drivers/isdn/tpam/Makefile 1.4 -> 1.5 # arch/ia64/kernel/fw-emu.c 1.5 -> 1.6 # drivers/scsi/hosts.c 1.16 -> 1.17 # net/sunrpc/Makefile 1.5 -> 1.6 # drivers/usb/input/wacom.c 1.21 -> 1.22 # arch/i386/kernel/apm.c 1.38 -> 1.39 # drivers/usb/serial/io_edgeport.c 1.31 -> 1.32 # drivers/scsi/atp870u.h 1.4 -> 1.5 # drivers/net/wan/hdlc_ppp.c 1.3 -> 1.4 # drivers/acpi/dispatcher/dswload.c 1.14 -> 1.15 # drivers/char/dz.c 1.11 -> 1.12 # drivers/acpi/utilities/utmisc.c 1.12 -> 1.13 # arch/ia64/defconfig 1.13.1.2 -> 1.17 # drivers/usb/host/ohci-hcd.c 1.28 -> 1.29 # drivers/acpi/hardware/hwsleep.c 1.9 -> 1.10 # drivers/acpi/executer/exdump.c 1.11 -> 1.12 # include/asm-i386/ide.h 1.9 -> 1.10 # drivers/acpi/include/acstruct.h 1.6 -> 1.7 # drivers/block/ll_rw_blk.c 1.123 -> 1.131 # drivers/scsi/ibmmca.c 1.8 -> 1.9 # drivers/net/Space.c 1.11 -> 1.12 # Makefile 1.326 -> 1.333 # drivers/acpi/dispatcher/dsfield.c 1.10 -> 1.11 # drivers/acpi/include/acnamesp.h 1.10 -> 1.11 # drivers/net/wan/hdlc_generic.c 1.4 -> 1.5 # drivers/acpi/utilities/utglobal.c 1.15 -> 1.16 # drivers/acpi/executer/exstoren.c 1.10 -> 1.11 # drivers/acpi/include/acobject.h 1.10 -> 1.11 # drivers/scsi/dtc.h 1.3 -> 1.4 # include/asm-ia64/page.h 1.10 -> 1.11 # drivers/ieee1394/sbp2.c 1.14 -> 1.15 # drivers/atm/firestream.c 1.14 -> 1.15 # drivers/ide/Config.in 1.6 -> 1.7 # drivers/net/lasi_82596.c 1.11 -> 1.12 # arch/ia64/kernel/setup.c 1.24.1.1 -> 1.29 # drivers/scsi/sym53c416.c 1.7 -> 1.8 # net/x25/Makefile 1.4 -> 1.5 # drivers/net/3c515.c 1.13 -> 1.14 # arch/ia64/kernel/ivt.S 1.10 -> 1.11 # drivers/acpi/parser/psopcode.c 1.11 -> 1.12 # drivers/acpi/events/evxfregn.c 1.7 -> 1.8 # drivers/scsi/fd_mcs.h 1.2 -> 1.3 # drivers/scsi/eata.h 1.10 -> 1.11 # drivers/scsi/g_NCR5380.c 1.8 -> 1.9 # drivers/acpi/executer/exprep.c 1.10 -> 1.11 # drivers/acpi/executer/exutils.c 1.11 -> 1.12 # drivers/acpi/include/acconfig.h 1.18 -> 1.19 # drivers/usb/class/bluetty.c 1.30 -> 1.31 # drivers/net/wan/c101.c 1.7 -> 1.8 # drivers/acpi/tables/tbgetall.c 1.2 -> 1.3 # drivers/char/stallion.c 1.11 -> 1.12 # drivers/scsi/sym53c416.h 1.3 -> 1.4 # net/unix/Makefile 1.3 -> 1.4 # drivers/atm/iphase.h 1.2 -> 1.3 # drivers/acorn/block/mfmhd.c 1.43 -> 1.44 # arch/ia64/kernel/time.c 1.9 -> 1.11 # drivers/net/ibmlana.c 1.4 -> 1.5 # drivers/net/wan/n2.c 1.7 -> 1.8 # include/linux/blkdev.h 1.76 -> 1.81 # drivers/atm/zatm.c 1.8 -> 1.9 # drivers/acpi/executer/exresnte.c 1.13 -> 1.14 # drivers/acpi/tables/tbinstal.c 1.10 -> 1.11 # net/decnet/Makefile 1.3 -> 1.4 # drivers/scsi/3w-xxxx.h 1.12 -> 1.13 # drivers/usb/core/message.c 1.12 -> 1.14 # fs/mpage.c 1.25 -> 1.27 # drivers/media/video/w9966.c 1.5 -> 1.6 # drivers/scsi/NCR5380.c 1.7 -> 1.8 # drivers/message/i2o/i2o_scsi.c 1.12 -> 1.13 # arch/ia64/kernel/smpboot.c 1.18 -> 1.20 # drivers/scsi/sr.c 1.56 -> 1.57 # drivers/net/wan/dscc4.c 1.30 -> 1.31 # drivers/scsi/aha1740.c 1.7 -> 1.8 # drivers/usb/storage/usb.c 1.42 -> 1.43 # drivers/atm/lanai.c 1.5 -> 1.6 # drivers/scsi/t128.h 1.3 -> 1.4 # drivers/isdn/sc/Makefile 1.4 -> 1.5 # drivers/usb/image/scanner.c 1.26 -> 1.27 # drivers/net/wan/hdlc_fr.c 1.3 -> 1.4 # drivers/net/pcnet32.c 1.26 -> 1.27 # drivers/usb/serial/visor.h 1.12 -> 1.13 # drivers/block/xd.h 1.4 -> 1.5 # drivers/ide/ide.c 1.33 -> 1.34 # drivers/scsi/NCR53c406a.h 1.2 -> 1.3 # drivers/scsi/advansys.c 1.18 -> 1.19 # drivers/scsi/ncr53c8xx.c 1.12 -> 1.13 # arch/ia64/mm/Makefile 1.3 -> 1.5 # drivers/usb/media/se401.c 1.26 -> 1.28 # drivers/usb/serial/visor.c 1.44 -> 1.45 # drivers/scsi/u14-34f.c 1.12 -> 1.13 # drivers/acpi/executer/exnames.c 1.6 -> 1.7 # drivers/scsi/pcmcia/nsp_message.c 1.3 -> 1.4 # drivers/isdn/i4l/Makefile 1.8 -> 1.9 # drivers/acpi/executer/exfldio.c 1.13 -> 1.14 # drivers/message/fusion/mptlan.h 1.5 -> 1.6 # drivers/isdn/hardware/eicon/capifunc.c 1.1 -> 1.2 # drivers/isdn/eicon/Makefile 1.5 -> 1.6 # drivers/net/wan/hdlc_cisco.c 1.3 -> 1.4 # drivers/usb/media/vicam.c 1.18 -> 1.20 # arch/ia64/Config.help 1.9 -> 1.10 # drivers/acpi/acpi_ksyms.c 1.17 -> 1.18 # drivers/scsi/qlogicfas.h 1.3 -> 1.4 # drivers/md/Config.help 1.1 -> 1.2 # drivers/usb/serial/whiteheat.c 1.27 -> 1.28 # drivers/acpi/resources/rscreate.c 1.9 -> 1.10 # drivers/isdn/icn/Makefile 1.4 -> 1.5 # arch/i386/Makefile 1.24 -> 1.25 # fs/nls/Config.in 1.8 -> 1.9 # include/asm-ia64/processor.h 1.24 -> 1.25 # drivers/ide/pci/siimage.c 1.5 -> 1.7 # drivers/acpi/dispatcher/dsmthdat.c 1.10 -> 1.11 # drivers/base/base.h 1.15 -> 1.16 # drivers/scsi/fd_mcs.c 1.4 -> 1.5 # Rules.make 1.87 -> 1.90 # arch/x86_64/boot/Makefile 1.7 -> 1.8 # drivers/scsi/nsp32.c 1.1 -> 1.2 # drivers/net/mii.c 1.12 -> 1.13 # drivers/usb/storage/transport.c 1.43 -> 1.46 # drivers/acpi/executer/exresolv.c 1.12 -> 1.13 # drivers/acpi/namespace/nsobject.c 1.9 -> 1.10 # arch/i386/boot/Makefile 1.20 -> 1.21 # drivers/usb/storage/transport.h 1.12 -> 1.13 # drivers/isdn/hardware/Makefile 1.5 -> 1.6 # drivers/isdn/hisax/Makefile 1.19 -> 1.20 # drivers/scsi/pcmcia/nsp_cs.h 1.3 -> 1.4 # init/Makefile 1.12 -> 1.15 # drivers/message/fusion/mptscsih.c 1.10 -> 1.11 # drivers/usb/misc/auerswald.c 1.18 -> 1.19 # drivers/acpi/tables/tbconvrt.c 1.11 -> 1.12 # drivers/scsi/pcmcia/nsp_debug.c 1.4 -> 1.5 # drivers/ide/ide-disk.c 1.27 -> 1.29 # drivers/net/dl2k.c 1.18 -> 1.19 # drivers/usb/input/usbkbd.c 1.20 -> 1.21 # drivers/md/linear.c 1.20 -> 1.21 # include/asm-ia64/tlb.h 1.10 -> 1.11 # drivers/scsi/aic7xxx/aic7xxx_linux.c 1.22 -> 1.23 # drivers/acpi/utilities/utcopy.c 1.12 -> 1.13 # arch/ia64/mm/init.c 1.25 -> 1.28 # drivers/usb/input/hiddev.c 1.22 -> 1.23 # drivers/scsi/Config.in 1.16 -> 1.17 # drivers/acpi/executer/exstore.c 1.16 -> 1.17 # include/linux/usb.h 1.53 -> 1.55 # drivers/usb/serial/io_ti.c 1.4 -> 1.5 # drivers/usb/serial/whiteheat_fw.h 1.3 -> 1.4 # drivers/net/ewrk3.c 1.15 -> 1.19 # drivers/scsi/seagate.c 1.10 -> 1.11 # drivers/net/wan/pc300_tty.c 1.4 -> 1.5 # drivers/net/tokenring/lanstreamer.c 1.12 -> 1.13 # drivers/ide/ide-cd.c 1.27 -> 1.28 # drivers/message/i2o/i2o_scsi.h 1.5 -> (deleted) # include/linux/hdreg.h 1.23 -> 1.24 # arch/ia64/pci/pci.c 1.19 -> 1.20 # arch/ia64/hp/sim/simscsi.c 1.4 -> 1.5 # drivers/acpi/pci_irq.c 1.8 -> 1.11 # include/linux/if.h 1.4 -> 1.5 # drivers/media/Config.in 1.1 -> 1.2 # drivers/isdn/hardware/avm/Makefile 1.3 -> 1.4 # drivers/usb/serial/pl2303.c 1.27 -> 1.28 # drivers/usb/core/hub.c 1.41 -> 1.42 # drivers/usb/net/catc.c 1.16 -> 1.17 # drivers/acpi/dispatcher/dsutils.c 1.11 -> 1.12 # arch/ia64/kernel/mca.c 1.14 -> 1.15 # arch/ia64/kernel/iosapic.c 1.15 -> 1.16 # drivers/isdn/capi/Makefile 1.9 -> 1.10 # arch/ia64/kernel/process.c 1.16 -> 1.18 # drivers/bluetooth/bluecard_cs.c 1.4 -> 1.5 # drivers/scsi/NCR53c406a.c 1.9 -> 1.10 # drivers/acpi/Config.help 1.5 -> 1.6 # drivers/acpi/utilities/utdelete.c 1.9 -> 1.10 # drivers/net/wan/cycx_main.c 1.6 -> 1.7 # arch/ia64/hp/sim/simserial.c 1.8 -> 1.9 # arch/ia64/kernel/acpi.c 1.19 -> 1.24 # drivers/char/tpqic02.c 1.14 -> 1.15 # drivers/net/tokenring/smctr.c 1.13 -> 1.14 # drivers/ide/ide-floppy.c 1.19 -> 1.20 # drivers/ide/pci/sis5513.c 1.7 -> 1.8 # drivers/scsi/scsi_lib.c 1.35 -> 1.37 # drivers/acpi/namespace/nsutils.c 1.12 -> 1.13 # drivers/usb/input/xpad.c 1.7 -> 1.8 # drivers/net/appletalk/cops.c 1.8 -> 1.9 # drivers/scsi/pcmcia/nsp_io.h 1.3 -> 1.4 # drivers/scsi/dmx3191d.h 1.3 -> 1.4 # drivers/ide/arm/icside.c 1.3 -> 1.4 # drivers/usb/core/usb.c 1.97 -> 1.98 # drivers/acpi/executer/exoparg2.c 1.12 -> 1.13 # drivers/usb/misc/brlvger.c 1.7 -> 1.8 # drivers/acpi/namespace/nsalloc.c 1.8 -> 1.9 # drivers/net/depca.c 1.12 -> 1.13 # net/netrom/Makefile 1.3 -> 1.4 # drivers/net/de620.c 1.11 -> 1.12 # arch/ia64/tools/Makefile 1.6 -> 1.10 # drivers/acpi/power.c 1.8 -> 1.9 # drivers/scsi/NCR5380.h 1.4 -> 1.5 # drivers/acpi/resources/rscalc.c 1.8 -> 1.9 # drivers/usb/net/usbnet.c 1.34 -> 1.37 # fs/pipe.c 1.18 -> 1.19 # fs/proc/kcore.c 1.5 -> 1.6 # drivers/md/raid0.c 1.18 -> 1.19 # drivers/scsi/Config.help 1.3 -> 1.4 # drivers/acpi/ec.c 1.12 -> 1.13 # drivers/scsi/eata_generic.h 1.2 -> 1.3 # include/asm-ia64/iosapic.h 1.4 -> 1.5 # include/asm-ia64/perfmon.h 1.8 -> 1.9 # drivers/ide/pci/hpt366.c 1.8 -> 1.10 # arch/ia64/kernel/sys_ia64.c 1.12 -> 1.13 # fs/Makefile 1.42 -> 1.43 # fs/direct-io.c 1.14 -> 1.15 # arch/ia64/kernel/signal.c 1.14 -> 1.16 # drivers/net/tokenring/smctr.h 1.2 -> 1.3 # drivers/ide/ide-probe.c 1.22 -> 1.23 # drivers/usb/core/hcd.c 1.35 -> 1.36 # drivers/usb/input/hid-core.c 1.40 -> 1.41 # drivers/acpi/events/evxface.c 1.10 -> 1.11 # arch/ia64/boot/Makefile 1.4 -> 1.6 # drivers/scsi/dmx3191d.c 1.6 -> 1.7 # include/asm-ia64/sn/bte_copy.h 1.1 -> 1.2 # drivers/acpi/include/actypes.h 1.12 -> 1.13 # drivers/usb/serial/belkin_sa.c 1.27 -> 1.28 # drivers/scsi/ppa.c 1.13 -> 1.14 # drivers/usb/input/powermate.c 1.7 -> 1.8 # drivers/net/tulip/tulip_core.c 1.35 -> 1.37 # drivers/acpi/executer/exconfig.c 1.10 -> 1.11 # fs/bio.c 1.31 -> 1.34 # drivers/usb/core/urb.c 1.8 -> 1.9 # drivers/usb/net/rtl8150.c 1.13 -> 1.14 # drivers/net/wan/hdlc_raw.c 1.4 -> 1.5 # arch/ia64/hp/Makefile 1.6 -> (deleted) # arch/ia64/ia32/sys_ia32.c 1.23 -> 1.24 # mm/mempool.c 1.13 -> 1.14 # drivers/acpi/include/aclocal.h 1.15 -> 1.16 # drivers/char/istallion.c 1.11 -> 1.12 # drivers/net/Config.in 1.51 -> 1.52 # drivers/acpi/tables/tbrsdt.c 1.3 -> 1.4 # mm/highmem.c 1.36 -> 1.37 # drivers/isdn/hisax/st5481_usb.c 1.10 -> 1.11 # scripts/ver_linux 1.5 -> 1.6 # drivers/usb/class/cdc-acm.c 1.23 -> 1.24 # drivers/usb/storage/usb.h 1.20 -> 1.21 # drivers/acpi/tables/tbget.c 1.11 -> 1.12 # drivers/scsi/eata_pio.c 1.6 -> 1.7 # drivers/scsi/sr_ioctl.c 1.21 -> 1.22 # drivers/net/eepro100.c 1.49 -> 1.52 # net/appletalk/Makefile 1.4 -> 1.5 # drivers/usb/host/ehci-hcd.c 1.31 -> 1.32 # drivers/usb/serial/keyspan_pda.c 1.24 -> 1.25 # drivers/acpi/utilities/utobject.c 1.9 -> 1.10 # drivers/scsi/mesh.c 1.5 -> 1.6 # fs/Config.in 1.39 -> 1.40 # drivers/usb/serial/mct_u232.c 1.30 -> 1.31 # drivers/acpi/processor.c 1.14 -> 1.16 # drivers/scsi/pas16.h 1.3 -> 1.4 # drivers/isdn/act2000/Makefile 1.4 -> 1.5 # drivers/net/wan/farsync.c 1.11 -> 1.12 # drivers/media/video/cpia.c 1.16 -> 1.17 # drivers/message/i2o/i2o_block.c 1.46 -> 1.47 # drivers/isdn/divert/Makefile 1.4 -> 1.5 # drivers/usb/net/kaweth.c 1.28 -> 1.29 # drivers/scsi/dtc.c 1.5 -> 1.6 # drivers/scsi/in2000.c 1.8 -> 1.9 # arch/ia64/kernel/perfmon_mckinley.h 1.1 -> 1.2 # drivers/ieee1394/ieee1394_types.h 1.11 -> 1.12 # net/ipx/Makefile 1.7 -> 1.8 # arch/ia64/ia32/ia32_ioctl.c 1.4 -> 1.5 # drivers/scsi/53c7,8xx.h 1.2 -> 1.3 # drivers/scsi/sd.c 1.73 -> 1.74 # net/bluetooth/rfcomm/Makefile 1.3 -> 1.4 # arch/i386/kernel/mca.c 1.8 -> 1.9 # drivers/usb/input/aiptek.c 1.9 -> 1.10 # drivers/net/smc9194.c 1.12 -> 1.13 # fs/Config.help 1.21 -> 1.22 # include/linux/bio.h 1.22 -> 1.25 # drivers/block/elevator.c 1.29 -> 1.32 # drivers/net/tulip/xircom_cb.c 1.8 -> 1.9 # drivers/scsi/seagate.h 1.3 -> 1.4 # drivers/acpi/executer/exmutex.c 1.4 -> 1.5 # drivers/media/video/planb.c 1.10 -> 1.11 # drivers/block/deadline-iosched.c 1.7 -> 1.8 # drivers/ide/arm/rapide.c 1.2 -> 1.3 # drivers/acpi/include/acdisasm.h 1.2 -> 1.3 # drivers/scsi/Makefile 1.28 -> 1.29 # drivers/usb/host/ehci-q.c 1.28 -> 1.30 # drivers/acpi/dispatcher/dsopcode.c 1.12 -> 1.13 # drivers/isdn/hardware/eicon/Makefile 1.1 -> 1.2 # drivers/acpi/events/evevent.c 1.12 -> 1.14 # drivers/acpi/executer/exmisc.c 1.11 -> 1.12 # drivers/input/joystick/iforce/iforce-usb.c 1.4 -> 1.5 # include/linux/blk.h 1.27 -> 1.30 # arch/ia64/vmlinux.lds.S 1.14 -> 1.16 # drivers/net/ibmlana.h 1.2 -> 1.3 # drivers/md/Config.in 1.3 -> 1.4 # drivers/scsi/eata.c 1.16 -> 1.17 # net/llc/Makefile 1.4 -> 1.5 # drivers/acpi/Config.in 1.11 -> 1.12 # drivers/acpi/dispatcher/dswstate.c 1.10 -> 1.11 # net/rose/Makefile 1.3 -> 1.4 # include/asm-ia64/acpi.h 1.4 -> 1.5 # drivers/char/specialix.c 1.7 -> 1.8 # drivers/usb/host/uhci-hcd.c 1.22 -> 1.23 # drivers/acpi/executer/exresop.c 1.13 -> 1.14 # net/irda/Makefile 1.5 -> 1.6 # drivers/isdn/pcbit/Makefile 1.4 -> 1.5 # drivers/acpi/include/acinterp.h 1.12 -> 1.13 # drivers/media/video/cpia.h 1.7 -> 1.8 # drivers/scsi/t128.c 1.5 -> 1.6 # drivers/scsi/u14-34f.h 1.8 -> 1.9 # include/linux/device.h 1.49 -> 1.50 # drivers/acpi/namespace/nsdump.c 1.10 -> 1.11 # drivers/acpi/executer/exoparg1.c 1.13 -> 1.14 # include/asm-ia64/siginfo.h 1.10 -> 1.11 # drivers/media/Makefile 1.4 -> 1.5 # drivers/media/video/adv7175.c 1.5 -> 1.6 # drivers/scsi/scsi_merge.c 1.24 -> 1.25 # drivers/bluetooth/hci_usb.c 1.15 -> 1.16 # drivers/usb/host/ohci-q.c 1.24 -> 1.25 # arch/ia64/kernel/perfmon.c 1.27 -> 1.29 # drivers/usb/input/usbmouse.c 1.17 -> 1.18 # drivers/acpi/executer/excreate.c 1.10 -> 1.11 # drivers/net/wan/pc300_drv.c 1.5 -> 1.7 # drivers/net/pcmcia/3c589_cs.c 1.9 -> 1.10 # drivers/char/Makefile 1.41 -> 1.42 # drivers/acpi/executer/exstorob.c 1.10 -> 1.11 # arch/ia64/lib/Makefile 1.12 -> 1.14 # drivers/usb/misc/usbtest.c 1.3 -> 1.4 # drivers/atm/iphase.c 1.10 -> 1.11 # arch/ia64/kernel/traps.c 1.18 -> 1.20 # drivers/acpi/namespace/nsaccess.c 1.10 -> 1.11 # drivers/acpi/namespace/nssearch.c 1.11 -> 1.12 # drivers/isdn/Makefile 1.11 -> 1.12 # drivers/usb/class/audio.c 1.26 -> 1.27 # drivers/scsi/pcmcia/nsp_cs.c 1.8 -> 1.9 # drivers/scsi/aic7xxx/Makefile 1.13 -> 1.14 # drivers/usb/net/pegasus.c 1.32 -> 1.33 # drivers/net/tokenring/3c359.c 1.3 -> 1.5 # drivers/acpi/namespace/nsxfeval.c 1.2 -> 1.3 # include/asm-ia64/ia32.h 1.7 -> 1.8 # drivers/base/class.c 1.7 -> 1.8 # drivers/bluetooth/bt3c_cs.c 1.3 -> 1.4 # drivers/scsi/imm.c 1.12 -> 1.13 # drivers/acpi/dispatcher/dswscope.c 1.7 -> 1.8 # drivers/usb/image/hpusbscsi.c 1.18 -> 1.19 # include/asm-i386/io.h 1.22 -> 1.23 # drivers/char/ip2/i2lib.c 1.5 -> 1.6 # drivers/block/umem.c 1.25 -> 1.28 # drivers/scsi/qla1280.h 1.7 -> 1.8 # drivers/block/scsi_ioctl.c 1.12 -> 1.13 # drivers/net/hamradio/baycom_epp.c 1.10 -> 1.11 # net/sctp/Makefile 1.3 -> 1.4 # drivers/net/wan/hdlc_x25.c 1.3 -> 1.4 # drivers/message/fusion/mptscsih.h 1.7 -> 1.8 # include/linux/hdlc.h 1.6 -> 1.7 # drivers/scsi/qlogicfas.c 1.12 -> 1.13 # drivers/macintosh/adb.c 1.11 -> 1.12 # drivers/isdn/hysdn/Makefile 1.4 -> 1.5 # drivers/net/wan/sdla.c 1.6 -> 1.7 # include/asm-ia64/thread_info.h 1.3 -> 1.4 # arch/ia64/kernel/perfmon_itanium.h 1.1 -> 1.2 # drivers/usb/image/microtek.c 1.20 -> 1.21 # drivers/char/ip2main.c 1.14 -> 1.15 # arch/ia64/config.in 1.33.1.1 -> 1.36 # (new) -> 1.1 drivers/media/dvb/av7110/av7110.c # (new) -> 1.1 drivers/media/dvb/dvb-core/Config.help # (new) -> 1.1 include/linux/dm-ioctl.h # (new) -> 1.1 drivers/media/dvb/frontends/Makefile # (new) -> 1.1 drivers/md/dm-linear.c # (new) -> 1.4 scripts/Makefile.modinst # (new) -> 1.1 fs/befs/btree.c # (new) -> 1.1 drivers/media/dvb/frontends/Config.in # (new) -> 1.1 drivers/media/dvb/dvb-core/dvb_net.h # (new) -> 1.1 include/linux/dvb/net.h # (new) -> 1.1 drivers/media/dvb/dvb-core/Config.in # (new) -> 1.1 arch/i386/mach-voyager/Makefile # (new) -> 1.1 drivers/media/dvb/frontends/alps_bsrv2.c # (new) -> 1.1 fs/befs/ChangeLog # (new) -> 1.1 include/linux/dvb/video.h # (new) -> 1.1 drivers/media/dvb/frontends/Config.help # (new) -> 1.1 drivers/media/dvb/frontends/grundig_29504-401.c # (new) -> 1.1 drivers/media/dvb/av7110/saa7146.c # (new) -> 1.1 include/linux/dvb/osd.h # (new) -> 1.1 drivers/media/dvb/dvb-core/dvb_demux.c # (new) -> 1.1 fs/befs/super.h # (new) -> 1.1 drivers/media/dvb/dvb-core/dvb_net.c # (new) -> 1.1 Documentation/BK-usage/00-INDEX # (new) -> 1.1 drivers/media/dvb/dvb-core/dvbdev.c # (new) -> 1.1 drivers/media/dvb/av7110/saa7146_core.c # (new) -> 1.1 drivers/media/dvb/dvb-core/dvb_i2c.h # (new) -> 1.1 drivers/media/dvb/dvb-core/dvb_filter.h # (new) -> 1.1 include/linux/dvb/audio.h # (new) -> 1.1 arch/i386/mach-voyager/irq_vectors.h # (new) -> 1.1 drivers/media/dvb/dvb-core/dvb_frontend.c # (new) -> 1.1 arch/i386/mach-voyager/voyager_basic.c # (new) -> 1.1 drivers/md/dm-ioctl.c # (new) -> 1.1 fs/befs/inode.c # (new) -> 1.1 arch/ia64/mm/numa.c # (new) -> 1.1 fs/befs/TODO # (new) -> 1.1 fs/befs/io.h # (new) -> 1.1 drivers/media/dvb/dvb-core/dvbdev.h # (new) -> 1.1 drivers/media/dvb/dvb-core/demux.h # (new) -> 1.3 include/asm-ia64/numa.h # (new) -> 1.1 drivers/media/dvb/dvb-core/dvb_demux.h # (new) -> 1.1 arch/i386/mach-voyager/setup_arch_post.h # (new) -> 1.1 arch/i386/mach-voyager/voyager_smp.c # (new) -> 1.1 arch/ia64/kernel/perfmon_generic.h # (new) -> 1.1 drivers/media/dvb/av7110/av7110_firm.h # (new) -> 1.4 scripts/Makefile.modver # (new) -> 1.1 fs/befs/attribute.c # (new) -> 1.1 arch/i386/mach-voyager/setup_arch_pre.h # (new) -> 1.1 fs/befs/linuxvfs.c # (new) -> 1.1 Documentation/filesystems/befs.txt # (new) -> 1.1 fs/befs/inode.h # (new) -> 1.1 drivers/media/dvb/dvb-core/dvb_ksyms.c # (new) -> 1.1 drivers/md/dm-table.c # (new) -> 1.1 include/linux/usb_ch9.h # (new) -> 1.1 drivers/md/dm.h # (new) -> 1.1 drivers/media/dvb/Config.in # (new) -> 1.1 include/linux/dvb/frontend.h # (new) -> 1.1 drivers/md/dm-stripe.c # (new) -> 1.1 scripts/Makefile.lib # (new) -> 1.1 fs/befs/debug.c # (new) -> 1.1 include/asm-ia64/numnodes.h # (new) -> 1.1 drivers/media/dvb/frontends/ves1820.c # (new) -> 1.1 drivers/media/dvb/av7110/Config.in # (new) -> 1.1 drivers/media/dvb/Makefile # (new) -> 1.1 fs/befs/super.c # (new) -> 1.1 drivers/media/dvb/Config.help # (new) -> 1.1 fs/befs/btree.h # (new) -> 1.1 Documentation/voyager.txt # (new) -> 1.1 drivers/media/dvb/av7110/saa7146_defs.h # (new) -> 1.1 arch/i386/mach-voyager/voyager_thread.c # (new) -> 1.1 include/linux/device-mapper.h # (new) -> 1.1 drivers/media/dvb/av7110/saa7146_core.h # (new) -> 1.1 drivers/media/dvb/dvb-core/compat.h # (new) -> 1.1 drivers/scsi/g_NCR5380_mmio.c # (new) -> 1.2 include/asm-ia64/nodedata.h # (new) -> 1.1 drivers/media/dvb/dvb-core/dvb_i2c.c # (new) -> 1.1 drivers/media/dvb/dvb-core/dmxdev.c # (new) -> 1.1 arch/i386/mach-voyager/do_timer.h # (new) -> 1.1 arch/i386/mach-voyager/setup.c # (new) -> 1.1 drivers/media/dvb/av7110/saa7146_v4l.h # (new) -> 1.1 fs/befs/endian.h # (new) -> 1.1 drivers/md/dm.c # (new) -> 1.1 arch/i386/mach-voyager/entry_arch.h # (new) -> 1.1 drivers/media/dvb/av7110/Config.help # (new) -> 1.1 arch/i386/mach-voyager/voyager_cat.c # (new) -> 1.1 fs/befs/befs_fs_types.h # (new) -> 1.5 scripts/Makefile.build # (new) -> 1.1 drivers/media/dvb/frontends/grundig_29504-491.c # (new) -> 1.1 drivers/media/dvb/av7110/Makefile # (new) -> 1.1 drivers/media/dvb/av7110/av7110.h # (new) -> 1.1 fs/befs/befs.h # (new) -> 1.1 arch/ia64/mm/discontig.c # (new) -> 1.1 include/linux/dvb/dmx.h # (new) -> 1.1 include/asm-i386/voyager.h # (new) -> 1.1 fs/befs/datastream.h # (new) -> 1.1 fs/befs/datastream.c # (new) -> 1.1 fs/befs/io.c # (new) -> 1.1 drivers/media/dvb/av7110/av7110_ir.c # (new) -> 1.1 drivers/media/dvb/dvb-core/dvb_frontend.h # (new) -> 1.1 include/linux/dvb/ca.h # (new) -> 1.1 drivers/md/dm-target.c # (new) -> 1.1 drivers/media/dvb/dvb-core/Makefile # (new) -> 1.1 drivers/media/dvb/av7110/saa7146_v4l.c # (new) -> 1.1 drivers/media/dvb/dvb-core/dmxdev.h # (new) -> 1.1 fs/befs/Makefile # (new) -> 1.1 drivers/media/dvb/dvb-core/dvb_filter.c # (new) -> 1.1 drivers/media/dvb/frontends/alps_bsru6.c # (new) -> 1.1 include/asm-ia64/mmzone.h # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 02/10/18 torvalds@home.transmeta.com 1.808 # Linux v2.5.44 # -------------------------------------------- # 02/10/21 t-kouchi@mvf.biglobe.ne.jp 1.573.53.22 # [PATCH] ia64: fix fpswa version printing # # I found the meaning of fpswa version major and minor is opposite. # -------------------------------------------- # 02/10/21 akropel1@rochester.rr.com 1.809 # The following patch adds support for ethtool to the ewrk3 driver. It is against # 2.5-BK but should apply to any recent 2.5 and 2.4 as well. In addition to adding # ethtool support, it also removes the cli/sti fixup attribution from the # changelog since that didn't actually go in yet and fixes a small style issue I # introduced in the multi-card support patch. # # Note that for ewrk3 still needs VDA's cli/sti removal patch, which I will # send along in a separate mail along with some other cleanups. # # This has been tested on an SMP x86 box containing 3 DE205 NICs. # -------------------------------------------- # 02/10/21 thockin@freakshow.cobalt.com 1.808.1.1 # drivers/net/eepro100.c: cleanup messages since netif_msg_xxx() change # -------------------------------------------- # 02/10/21 jgarzik@redhat.com 1.810 # Remove cli/sti from ewrk3 net driver. # Also, comment out ETHTOOL_PHYS_ID until its sleeping is fixed. # # Originally by Denis Vlasenko, then via Adam Kropelin, and # finally cleaned up by me. # -------------------------------------------- # 02/10/21 akropel1@rochester.rr.com 1.811 # This patch adds some locking fixups to the ewrk3 ioctl routine. None of these # are critical since the ioctls AFAIK are used only by the EEPROM config utility. # -------------------------------------------- # 02/10/21 akropel1@rochester.rr.com 1.812 # Last ewrk3 update for now. Updates the changelog to cover previous patches, bumps the # revision number, and replaces the horrific EthwrkSignature function with # something (slightly) less horrific. # -------------------------------------------- # 02/10/21 jgarzik@redhat.com 1.813 # Merge http://suncobalt.bkbits.net/net-drivers-2.5 # into redhat.com:/home/jgarzik/repo/net-drivers-2.5 # -------------------------------------------- # 02/10/21 key@austin.ibm.com 1.814 # update lanstreamer tokenring driver: # Patch gets rid of virt_to_bus calls using the newer pci_map/unmap calls, # as well as fixing 1 bug in the init code. # -------------------------------------------- # 02/10/21 venkatesh.pallipadi@intel.com 1.573.53.23 # [PATCH] ia64: Save/Restore of IA32 fpstate in sigcontext # # The IA32 fpstate information is not getting saved/restored during IA32 # exception handling. The issue was first observed due to an IA32 binary # (which runs fine on IA32 system), failing on Itanium based system. The # binary was trying to access the fpstate information during an FPE and got a # SEGV, as the fpstate was not getting saved and the sigcontext->fpstate # pointer was NULL. # -------------------------------------------- # 02/10/21 venkatesh.pallipadi@intel.com 1.573.53.24 # [PATCH] ia64: Clearing of exception status before calling IA32 user signal handler # # One more bug fix for IA32 exception handler. IA32 exception handler is # not clearing the exception status, before calling the user signal handler # routine. # -------------------------------------------- # 02/10/21 davidm@tiger.hpl.hp.com 1.573.53.25 # ia64: Some formatting cleanups. # -------------------------------------------- # 02/10/21 ahaas@neosoft.com 1.573.53.26 # [PATCH] ia64: C99 designated initializer for include/asm-ia64/thread_info.h # # Here's a small C99 designated initializer patch for the subject file. # The patch is against 2.5.43. # -------------------------------------------- # 02/10/21 jung-ik.lee@intel.com 1.573.53.27 # [PATCH] ia64: PCI hotplug changes for 2.5.39 or later # # The following patch fixes ia64 kernel dump on Hot-Add of PCI bridge cards. # # pcibios_fixup_bus(); # pci_do_scan_bus(); # on Hot-Add of bridge adapter; # -------------------------------------------- # 02/10/21 key@austin.ibm.com 1.815 # Check link status in pcnet32 net driver # -------------------------------------------- # 02/10/21 peter@chubb.wattle.id.au 1.573.53.28 # [PATCH] ia64: Fix RAW dependency introduced by HUGETLB patch # # If CONFIG_HUGETLB is not defined, you get a RAW dependency clash in # ivt.S. (2.5.39) # -------------------------------------------- # 02/10/21 greg@kroah.com 1.808.2.1 # [PATCH] USB: added support for Clie NX60 device. # # Thanks to Hiroyuki ARAKI for the information. # -------------------------------------------- # 02/10/21 dbrownell@users.sourceforge.net 1.808.2.2 # [PATCH] ohci-hcd, longer bios handshake timeout # # This should resolve the problems Nicolas Mailhot reported, # where an old BIOS seemed reluctant to release the controller # and the dbg() message delayed things enough to work. At # worst, it'll eliminate dbg() messages as a factor. # -------------------------------------------- # 02/10/21 dbrownell@users.sourceforge.net 1.808.2.3 # [PATCH] usbnet, preliminary zaurus support # # This is Pavel's patch, with some cleanups and re-sorting of # the various SA-1100 cases. According to Pavel this works # as well as his earlier version ... which is to say, maybe # not yet, he saw a uhci "very bad" error (on 2.5.43). # # I'm sending it along since it's clearly the right way to # support the Zaurus, and it can't be that far off given the # code I've seen. # -------------------------------------------- # 02/10/21 dbrownell@users.sourceforge.net 1.808.2.4 # [PATCH] usb: problem clearing halts # # This is a slightly cleaned up version of that earlier patch: # # - Makes both copies of the clear_halt() logic know that # usb_pipein() returns boolean (zero/not) not integer (0/1). # This resolves a problem folk have had with usb-storage. # (I looked at kernel uses of usb_pipein and it really was # only the clear_halt logic that cares.) # # - Removes some code from the "standard" version; no point # in Linux expecting devices to do something neither Microsoft # nor Apple will test for. # -------------------------------------------- # 02/10/21 oliver@oenone.homelinux.org 1.808.2.5 # [PATCH] USB: microtek driver - remove dead code # -------------------------------------------- # 02/10/21 stuartm@connecttech.com 1.808.2.6 # [PATCH] More wh patches # # Inlined are a few more patches to 2.5.43 that fix problems that # were discovered during QA. # # 1-firm4.07 :: I've moved to the bottom since it's huge # # Updates the firmware to 4.07. Fixes a bug introduced in 4.05 where # RTS is high after boot. Also fixes a bug where the whiteheat would # allow data reception after boot when no ports were open. # # 2-fix-dtr-rts # # I didn't know this, but the firmware open command also handles # raising the signals for me. This code is superflous. # # 3-fix-read-urb # # Read polling was started right away in whiteheat_open(). Coupled # with the firmware bug fixed above where data could be received # by a port that wasn't open, this caused the whiteheat_read_callback # to fire before open() was finished, and in some cases this caused # harm to the tty layer. I didn't track down the exact mechanism # because either moving the read polling to the last operation of open() # or using the fixed firmware caused the crash to stop happening. I # have stack traces if you'd like to have a look; it looks like something # scribbles on the stack, but I couldn't figure out what eactly, as the # scribbled data didn't match anything in the whiteheat driver or the # test applications. # # 4-fix-ixoff # # RELEVANT_IFLAG masks off the software flow control bits, so that # a change that is restricted to the soft flow bits will be ignored. This # is the email I sent earlier; I've decided to just not use the macro for # now, but I'd still like to know if the macro should be fixed,. # # ..Stu # -------------------------------------------- # 02/10/21 jtyner@cs.ucr.edu 1.808.2.7 # [PATCH] drivers/usb/media/vicam.c: simplify vicam_read # # The following patch removes the old framebuf_size and framebuf_read_start # values from the cam structure and simplifes the read function. It also # moves the needs dummy read check into the read_frame function. cp and dd # should both still work. # -------------------------------------------- # 02/10/21 jtyner@cs.ucr.edu 1.808.2.8 # [PATCH] drivers/usb/media/vicam.c: simplify vicam_read # # > The following patch removes the old framebuf_size and framebuf_read_start # > values from the cam structure and simplifes the read function. It also # > moves the needs dummy read check into the read_frame function. cp and dd # > should both still work. # # This is in addition to the previous patch. It should allow any programs # that read entire frames to receive a new frame with each successive read. # Programs that read less than the entire frame will read until they reach # the end of the frame. They will then read 0 bytes (signifying EOF). The # next read will start the next frame. # -------------------------------------------- # 02/10/22 oliver@oenone.homelinux.org 1.808.2.9 # [PATCH] USB: hpusbscsi - kill wrong error case # # -------------------------------------------- # 02/10/22 davidm@tiger.hpl.hp.com 1.808.3.1 # Merge tiger.hpl.hp.com:/data1/bk/vanilla/linux-2.5 # into tiger.hpl.hp.com:/data1/bk/lia64/to-linus-2.5 # -------------------------------------------- # 02/10/22 efocht@ess.nec.de 1.808.3.2 # [PATCH] ia64: topology for ia64 # # please find attached a first attempt to implement the topology.h # macros/routines for IA64. We need this for the NUMA scheduler setup. # -------------------------------------------- # 02/10/22 davidm@tiger.hpl.hp.com 1.808.3.3 # ia64: Fix formatting a bit and issue #error when attempting to # use CONFIG_NUMA without CONFIG_ACPI_NUMA. # -------------------------------------------- # 02/10/22 k-suganuma@mvj.biglobe.ne.jp 1.808.3.4 # [PATCH] ia64: ACPI NUMA bugfix # # -------------------------------------------- # 02/10/22 k-suganuma@mvj.biglobe.ne.jp 1.808.3.5 # [PATCH] ia64: discontigmem patch for 2.5 ia64 # # Here is the latest discontigmem patch for ia64 against # 2.5.39 + ia64 patch + Erich's acpi_numa patch. # -------------------------------------------- # 02/10/22 agrover@groveronline.com 1.808.4.1 # ACPI: Update to interpreter 20021022 # - Remove old code # - Change some defines # - Change Scope behavior # -------------------------------------------- # 02/10/22 davidm@tiger.hpl.hp.com 1.808.3.6 # ia64: Fix up/clean NUMA discontigmem patch. # -------------------------------------------- # 02/10/22 agrover@groveronline.com 1.808.4.2 # ACPI: EC update # - Move call to acpi_ec_query out of the interrupt handler. This will # ensure that we do not try to acquire the Global Lock at interrupt # level. # - Get the handle for the ECDT. # -------------------------------------------- # 02/10/22 agrover@groveronline.com 1.808.4.3 # ACPI: Enable compilation using Intel compiler # -------------------------------------------- # 02/10/22 agrover@groveronline.com 1.808.4.4 # ACPI: Add needed exports for ACPI-based PCI Hot Plug (J.I. Lee) # -------------------------------------------- # 02/10/22 agrover@groveronline.com 1.808.4.5 # ACPI: Restore ARB_DIS bit on resume from S1 (Eric Brunet) # -------------------------------------------- # 02/10/22 agrover@groveronline.com 1.808.4.6 # ACPI: Rename acpi_power_off to acpi_power_off_device (Pavel Machek) # -------------------------------------------- # 02/10/23 agrover@groveronline.com 1.808.4.7 # ACPI: Remove too-broad blacklist entries # -------------------------------------------- # 02/10/23 arnaud.quette@mgeups.com 1.808.2.10 # [PATCH] drivers/usb/input/hiddev.c: fix hiddev_connect issue when # # The following one line patch (against 2.5.44) fixes an index problem when # connecting a new hiddev # device, when kernel isn't compiled with CONFIG_USB_DYNAMIC_MINORS. Previous # attempt to open # hiddev device terminated with an ENODEV error. Note that this fix works with # either dynamic minors # flag enabled or not. # -------------------------------------------- # 02/10/23 david-b@pacbell.net 1.808.2.11 # [PATCH] ehci enumerating full speed devices # # The EHCI driver was never adjusting the full speed maximum packet size up # (when enumerating through a transaction translating hub). This broke the # enumeration of some devices (maxpacket != 8) pretty early. # # This patch updates EHCI to fix the bug, and does minor cleanup to usbcore # logic that figures out ep0 maxpacket. I left the partial read in for all # speeds, even though only full speed needs it. # -------------------------------------------- # 02/10/23 agrover@groveronline.com 1.808.4.8 # ACPI: Use dev->devfn instead of bridge->devfn to determine the pin when # trying to derive a device's irq from its parent (Ville Syrjala) # -------------------------------------------- # 02/10/23 thockin@freakshow.cobalt.com 1.808.1.2 # drivers/net/eepro100.c: set the PHY ID correctly # -------------------------------------------- # 02/10/23 agrover@groveronline.com 1.808.4.9 # ACPI: Add support for GPE1 block defined with no GPE0 block # -------------------------------------------- # 02/10/23 agrover@groveronline.com 1.808.4.10 # ACPI: eliminate duplicate lines of code # -------------------------------------------- # 02/10/23 thockin@freakshow.cobalt.com 1.808.1.3 # drivers/net/mii.c: fix flipped logic # -------------------------------------------- # 02/10/23 thockin@freakshow.cobalt.com 1.808.1.4 # drivers/net/eepro100.c: set phy_id_mask and reg_num_mask in mii_if # -------------------------------------------- # 02/10/23 kai@tp1.ruhr-uni-bochum.de 1.808.5.1 # kbuild: Split Rules.make # # Rules.make is used in 4 phases, # o generate modversions # o build # o install modules # o clean # # split out the code specific to the phase and move it into # scripts/Makefile. # -------------------------------------------- # 02/10/23 kai@tp1.ruhr-uni-bochum.de 1.808.5.2 # kbuild: Remove some compatibility code, $(echo_target) # # Including Rules.make after make -C stopped working with the # fixdep changes, so the other code trying to salvage backward # compatibility should go as well. # -------------------------------------------- # 02/10/23 jgarzik@redhat.com 1.816 # Merge http://suncobalt.bkbits.net/net-drivers-2.5 # into redhat.com:/home/jgarzik/repo/net-drivers-2.5 # -------------------------------------------- # 02/10/23 kai@tp1.ruhr-uni-bochum.de 1.808.5.3 # kbuild: Shut up "make clean" in non-verbose mode # # $(call ...) has a measurable performance impact, so use the new # variable $(Q), which evaluates to @ when quiet to supress # the echoing of commands if not wanted. # # IIRC, Keith Owens' kbuild-2.5 came up with that idea, so credit goes # there. # -------------------------------------------- # 02/10/23 kai@tp1.ruhr-uni-bochum.de 1.808.5.4 # kbuild: Switch "make modules_install" to fast mode ;) # # Use the same way we came up with for "make clean" for # "make modules_install", gaining a nice speed-up. # # Also, some cosmetics for scripts/Makefile.clean # -------------------------------------------- # 02/10/23 kai@tp1.ruhr-uni-bochum.de 1.808.5.5 # kbuild: Convert build and modversion phases # # Alright, so now actually all four phases are converted to new-style, # i.e. we call make -f scripts/Makefile. which includes the # actual subdir Makefile. # # The obvious drawback is some code duplication between the four # scripts/Makefile., which could easily be overcome including # shared parts, but since I'm going for maximum performance, I did not # for now. # # Rules.make is empty now ;) (Well, not quite, since if it was 0 bytes, # make mrproper would remove it...) # -------------------------------------------- # 02/10/23 kai@tp1.ruhr-uni-bochum.de 1.808.5.6 # kbuild: Convert drivers/isdn to be "Rules.make-less" # -------------------------------------------- # 02/10/23 kai@tp1.ruhr-uni-bochum.de 1.808.5.7 # kbuild: Allow for -y as well as -objs for multipart objects. # # Traditionally, the individual components of a multipart module are # listed in -objs. Allow for using -y as well, as that turns # out to simplify declaring optional parts of multi-part modules, see # the converted examples in net/*/Makefile. # # This change is backwards-compatible, i.e. not converted Makefiles # still work just fine. # -------------------------------------------- # 02/10/24 sam@mars.ravnborg.org 1.808.5.8 # kbuild: Removed unused definitions # o Deleted subdir-n and subdir- handling in Makefile.build # o Deleted all host-progs related stuff in Makfile.modver # o In Makefile.modver also deleted everything related to composite objects # o Fixed an error when deleting a .ver file + .hdepend and then do make # - filter-out in Makefile.modver was faulty # -------------------------------------------- # 02/10/24 agrover@groveronline.com 1.808.4.11 # ACPI: implement support for cpufreq interface (Dominik Brodowski) # -------------------------------------------- # 02/10/24 agrover@groveronline.com 1.808.4.12 # ACPI: Try #2 at fixing the PCI IRQ bridge swizzle (Kai Germaschewski) # -------------------------------------------- # 02/10/24 greg@kroah.com 1.808.2.12 # driver core: add support for calling /sbin/hotplug when classes are found and removed from the system. # -------------------------------------------- # 02/10/24 davidm@tiger.hpl.hp.com 1.808.3.7 # ia64: Sync with 2.5.44. # -------------------------------------------- # 02/10/24 davidm@tiger.hpl.hp.com 1.808.3.8 # ia64: Clean up ia64 version of topology.h. # -------------------------------------------- # 02/10/25 david-b@pacbell.net 1.808.2.13 # [PATCH] rm "automagic resubmit" for usb interrupt transfers # # Here's that promised patch to remove the problematic "automagic # resubmit" mode from the API for interrupt transfers. It covers # the core (including main HCDs) and a few essential drivers. # # All urbs now obey a simple rule: submit them once, then wait for # some completion callback. Or unlink the urb if you're impatient, # canceling the i/o request (which may have been partially completed). # Bulk and interrupt transfers now behave the same at the API level, # except that only interrupt transfers have bandwidth failure modes. # # # Previously, interrupt transfers were different from bulk transfers # in several ways that made limited sense. The only thing that's # supposed to be special is achieving service latency guarantees by # using the reserved periodic bandwidth. # # But there were a lot of other restrictions, plus HCD-dependent # behaviors/bugs. Doing something like sending a 97 byte message # to a device portably was a thing of pain, since the low-level # "one packet per interval" rule was pushed up to drivers instead # of being handled inside HCDs like it is for bulk, and sending a # final "short" packet meant an urb unlink/relink. (Fixing this # required UHCI to use a queue of TDs, like EHCI and OHCI; fixed # by 2.5.44, and a small change in this patch. I'm not sure the # unlink/relink issues have ever been really addressed.) Neither # 1-msec transfer intervals nor USB 2.0 "high bandwidth" mode can # reliably be serviced without a multi-buffered queue of interrupt # transfers. (Comes almost for free with TD queueing; as of 2.5.44 # all HCDs should do this.) # # And then there's "automagic resubmission", which made HCDs # keep urbs during their complete() callbacks in a rather curious # state ... half-owned by HCD, half-owned by device driver, not # exactly linked but maybe not unlinked either. Bug-prone, and # hard to test. # # # So that's all gone now! This particular patch # # - updates the main hcds to use normal urb-completion logic # for interrupt transfers, nothing special. (*) # # - makes usbcore (hub and root hub drivers) expect that, and # removes an old kernel 2.3 "urb state confusion" workaround. # (urb->dev is no longer nulled to distinguish unlinked urbs, # since there's no longer a "half-in/half-out" state.) also # the relevent kerneldoc is updated. # # - enables the 'usbtest' support for interrupt transfers, in # both queued and non-queued modes. (but I haven't made time # to test this ... the hcds "should" be fine since they use the # same code now for bulk and interrupt, and bulk checked out.) # # - teaches hid-core, usbkbd, and usbmouse how to resubmit # interrupt transfers explicitly. usb keyboards/mice work, # but some less-common HID devices won't. # # - updated usb/net drivers (catc, kaweth, pegasus, rtl8150) # # But it doesn't update all device drivers that use interrupt # transfers. The failure mode for un-converted drivers will # be that interrupts after the first one get lost, and the # fix for those drivers will be simple (see what the drivers # here do). # # # (*) It doesn't touch non-{E,O,U}HCI HCDs, like the SL-811HS, # since those changes will require hardware as well as # some quality time with 'usbtest'. # -------------------------------------------- # 02/10/25 jgarzik@redhat.com 1.817 # Fix tulip net driver multi-port board irq assignment # -------------------------------------------- # 02/10/25 willy@debian.org 1.818 # Update lasi_82596 net driver to replace cli/sti with spinlock # -------------------------------------------- # 02/10/26 jgarzik@redhat.com 1.808.6.1 # Add description of files in Documentation/BK-usage directory. # (suggested by Peter Chubb) # -------------------------------------------- # 02/10/26 jgarzik@redhat.com 1.808.6.2 # Small clarification in BK kernel howto # -------------------------------------------- # 02/10/26 bunk@fs.tum.de 1.808.7.1 # kbuild: Fix soundmodem/Makefile # # gentbl is a program that generates some header files. The recent kbuild # changes have the "interesting" effect that this now outputs the header # files to the root directory of the kernel tree instead of # drivers/net/hamradio/soundmodem ... # # The following patch fixes this breakage: # -------------------------------------------- # 02/10/26 kai@tp1.ruhr-uni-bochum.de 1.808.5.9 # Merge # -------------------------------------------- # 02/10/26 komujun@nifty.com 1.819 # Add PCI id to tulip net driver # -------------------------------------------- # 02/10/27 adam@yggdrasil.com 1.808.6.3 # Use pci_[gs]et_drvdata instead of directly referenced ->driver_data # in struct pci_dev. # -------------------------------------------- # 02/10/27 tony.luck@intel.com 1.808.3.9 # [PATCH] ia64: make kcore work # # /proc/kcore is what you need, but it is broken on ia64 (and # has been since the dawn of time for access to region 5) because # it assumes that all kernel virtual addresses are above PAGE+AF8-OFFSET. # This isn't true on ia64, VMALLOC+AF8-START is smaller than PAGE+AF8-OFFSET. # # Attached is a patch (applies to 2.4.19 and to 2.5.39) that fixes the # assumption. After applying you'll be able to use: # # +ACM- gdb vmlinux /proc/kcore # # and happily ask gdb to examine addresses in region 5. # -------------------------------------------- # 02/10/27 k-suganuma@mvj.biglobe.ne.jp 1.808.3.10 # [PATCH] ia64: allocate all per-CPU pages at BSP-initialization time # # I found that functions in timer.c and rcupdate.c are calling # > tasklet_init() for all CPUs before APs start running. For this to work, # the per-CPU pages must be allocated at BSP-initialization time. The patch # below does that. # -------------------------------------------- # 02/10/27 davidm@tiger.hpl.hp.com 1.808.3.11 # ia64: Make kernel profiling work again (patch by Peter Chubb). # -------------------------------------------- # 02/10/27 sam@mars.ravnborg.org 1.808.8.1 # kbuild: scrits/Makefile.lib # Moved generic definitions to Makefile.lib, # This allows us to share all generic definitions between the different Makefiles. # Performance impact has been measured to less than 1% # -------------------------------------------- # 02/10/27 sam@mars.ravnborg.org 1.808.8.2 # kbuild: Use Makefile.lib for modversion and modules_install # Most definitions required were present in Makefile.lib, so delete the # definitions and include Makefile.lib. # -------------------------------------------- # 02/10/27 sam@mars.ravnborg.org 1.808.8.3 # kbuild: Got rid of $(call descend ...) in top-level Makefile # Replaced by the more readable $(Q)$(MAKE) construct # -------------------------------------------- # 02/10/27 sam@mars.ravnborg.org 1.808.8.4 # kbuild: Added Descend to top-level Makefile again # It is used by arch specific Makefiles # -------------------------------------------- # 02/10/27 davidm@tiger.hpl.hp.com 1.808.3.12 # ia64: Minor Makefile cleanup. Mention CONFIG_NUMA option in defconfig. # -------------------------------------------- # 02/10/27 davidm@tiger.hpl.hp.com 1.808.3.13 # ia64: Create dummy offsets.h if it doesn't exist yet. Patch by Keith Owens. # -------------------------------------------- # 02/10/27 davidm@tiger.hpl.hp.com 1.808.3.14 # ia64: Fix Keith's Makefile fix so it actually works. # -------------------------------------------- # 02/10/28 manfred@colorfullife.com 1.808.9.1 # [PATCH] use correct wakeups in fs/pipe.c # # wake_up_interruptible() and _sync() calls are reversed in pipe_read(). # # The attached patches only calls _sync if a schedule() call follows. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.808.9.2 # [PATCH] make deadline_merge prefetch next entry # # Make deadline_merge() prefetch the next entry on the list. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.808.9.3 # [PATCH] end_io bouncing # # o Split blk_queue_bounce() into a slow and fast path. The fast path is # inlined, only if we actually need to check the bio for possible # bounces (and bounce) do we enter __blk_queue_bounce() slow path. # # o Fix a nasty bug that could cause corruption for file systems not # using PAGE_CACHE_SIZE blok size! We were not correctly setting the # 'to' bv_offset correctly. # # o Add BIO_BOUNCE flag. Later patches will use this for debug checking. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.808.9.4 # [PATCH] sr_ioctl must return -EIO, not -EINVAL # # We must return -EIO if the command fails (the 5/20/00 sense check is # just helping return more sane info), not -EINVAL. Getting -EINVAL return # on an ioctl if a command fails is less than helpful for applications... # -------------------------------------------- # 02/10/28 axboe@suse.de 1.808.9.5 # [PATCH] elv_add_request cleanups # # Request insertion in the current tree is a mess. We have all sorts of # variants of *elv_add_request*, and it's not at all clear who does what # and with what locks (or not). This patch cleans it up to be: # # o __elv_add_request(queue, request, at_end, plug) # Core function, requires queue lock to be held # # o elv_add_request(queue, request, at_end, plug) # Like __elv_add_request(), but grabs queue lock # # o __elv_add_request_pos(queue, request, position) # Insert request at a given location, lock must be held # -------------------------------------------- # 02/10/28 axboe@suse.de 1.808.9.6 # [PATCH] make blk_dump_rq_flags a bit more useful # # Add some missing bits, and make it generally a bit more useful outside # of REQ_PC requests. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.808.9.7 # [PATCH] make queue prep_rq_fn() a bit more powerful # # Extend q->prep_rq_fn() to return one of three values: # # o BLKPREP_OK: request is good, return it # o BLKPREP_KILL: request is bad, end it completely # o BLKPREP_DEFER: request is good, but we can't take it now # # We maintain compatability with old prep functions (if any, outside of # ide-cd). This change is needed or SCSI to use prep function for command # init, if sg table allocation fails we can just defer the request. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.808.9.8 # [PATCH] queue dma alignment # # Make it possible for a device to specify the dma alignment restrictions # it has. This will be used by future infrastructure when mapping in user # pages, and allows us to dma to on ATAPI even though user address and # length is not sector size aligned. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.808.9.9 # [PATCH] queue last_merge hint cleanup # # Cleanup the last_merge logic. There are two reasons for clearing # last_merge when we are dealing with integrity, and these are: # # o Clear when handing the request to the driver, so we don't merge on # a started request. # # o Clear when a request is taken off the list. This cannot be done from # the driver (above case would already have been hit), but it can # happen # when we merge two requests. # # This makes it a lot nicer, it was always peculiar how we cleared in # put_request. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.808.9.10 # [PATCH] request references and list deletion/insertion checking # # o Always use list_del_init() on request queuelist, this allows us to # sanity check the integrity of the request on insertion and removal. # So we can complain loudly instead of silently corrupting memory. # # o Add references to requests. This is cheap, since we dont have to use # an atomic variable for it (all puts are inside queue lock). We've had # a bug in IDE for years where we want to inspect request state after # io completion, but this is not possible to do race free right now. # REQ_BLOCK_PC and sgio will need this too, for checking io residual # etc. This is not just a theoretical race, I've seen it happen. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.808.9.11 # [PATCH] add end_request helpers that deal in bytes, not sectors # # This adds an end_that_request_chunk() helper, that puts the core # functionality in __end_that_request_first(). This one deals in bytes. # end_that_request_first() does the 512 multiply, and then # end_that_request_chunk() can just use it directly. # # This enables ide-cd to do proper dma in sizes that are not sector # aligned. Some of the most important CD functions (ripping audio dma, # burning audio cds, burning raw cds) _require_ this or we will be in pio. # That stinks. We simply cannot use pio for these, not on writers much # that are fast! # -------------------------------------------- # 02/10/28 axboe@suse.de 1.808.9.12 # [PATCH] various ide fixes and cleanups # # o Remove some ide compile warnings, old suspend stuff is not used at # all, for instance. # # o If elv_next_request() returns NULL, remember to clear hwgroup->busy # if we don't have pending commands. This is important. If a queue # prep function kills a request, we would before quit with hwgroup busy. # This essentially froze the hwgroup. # # o Don't do own list manipulation in ide_do_drive_cmd(). Use the new and # great elv_add_request() functions # # o Fix race on inspection of request after io completion by bumping the # request reference count prior to ioscheduler insertion. # # o Make ide-floppy understand a REQ_BLOCK_PC eject. More may follow, it's # ATAPI after all. # # o Clear hw before passing to ide_init_hwif_ports(). Fixes oops on # non-pci controllers. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.808.9.13 # [PATCH] queue merge_bvec_fn() changes # # Make merge_bvec_fn() return number of bytes we can accept at a given # offset, instead of a bool. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.808.9.14 # [PATCH] make bio->bi_end_io() optional # # Sometimes we don't even need a bio->bi_end_io, so make it optional. This # also encourages users to _use_ bio_endio()! I like that, since it means # they don't have to remember to decrement bi_size themselves. # # Also clear bi_private in bio_init(), and switch to subsys_initcall(). # -------------------------------------------- # 02/10/28 torvalds@home.transmeta.com 1.808.6.4 # Merge http://gkernel.bkbits.net/misc-2.5 # into home.transmeta.com:/home/torvalds/v2.5/linux # -------------------------------------------- # 02/10/28 torvalds@home.transmeta.com 1.820 # Merge http://gkernel.bkbits.net/net-drivers-2.5 # into home.transmeta.com:/home/torvalds/v2.5/linux # -------------------------------------------- # 02/10/28 axboe@suse.de 1.821 # [PATCH] bio_map_user() infrastructure # # This adds bio_map_user and bio_unmap_user to aid drivers in mapping user # space memory into a bio suitable for block io. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.822 # [PATCH] misc scsi bits # # Various small bits that make SCSI work well with REQ_BLOCK_PC. # # o Use ->errors as the scsi status byte for REQ_BLOCK_PC # # o Always call end_io completion, even if 0 sectors, as long as the # status is good. Otherwise we risk hanging this device if a # REQ_BLOCK_PC user command didn't specify a transfer size for a command # that did. # # o Remove bouncing checks in scsi_merge for REQ_BLOCK_PC, bio_map_user() # correctly bounces pages now. # # o Decrement req->data_len, it's our residual data count. # # o sr/sd: set right transfer and underflow size. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.823 # [PATCH] small block bits # # o Add sense_len to request, so scsi_ioctl knows how much sense data # was transferred. # # o Add sg_timeout and sg_reserved to queue, we can't have these global... # # o And finally kill QUEUE_NR_REQUESTS, it hasn't been used in a while. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.824 # [PATCH] finally, sgio updates # # Lots of stuff here... Basically we are using all that flashy # infrastructure I sent you to allow DMA for ATAPI at a 4-byte # granularity. So we can burns audio cds with zero-copy dma, and all that # cool stuff. # # o Use bio_map_user(), fallback to kmalloc approach if it fails # # o Use per-queue timeouts # # o Check for right sg version, we can add old type support too later. # # o Support SCSI_IOCTL_SEND_COMMAND old crap # # o Check for size of command # # o Make cdrom eject work # # Etc... # -------------------------------------------- # 02/10/28 axboe@suse.de 1.825 # [PATCH] ide-cd updates # # Updates to ide-cd to be able to dma to any address (almost). The new # work-horse is cdrom_newpc_intr(). IMHO, it's much cleaner than the old # interrupt handlers, we can basically kill all three of them in the # future and just use this one. You had a lot of bugs in there :-) # # If you want in-depth let me know, but I'm pretty beat right now and too # lazy to do the write up. Lots of cleanups, lots of fixes. pre-transform # is a prep function now. # -------------------------------------------- # 02/10/28 axboe@suse.de 1.826 # [PATCH] missed elv_add_request() update # # I missed one update of elv_add_request() in blk_insert_request(), # probably because of one too many hand edits... # -------------------------------------------- # 02/10/28 torvalds@penguin.transmeta.com 1.827 # Merge http://lia64.bkbits.net/to-linus-2.5 # into penguin.transmeta.com:/home/penguin/torvalds/repositories/kernel/linux # -------------------------------------------- # 02/10/28 kai@tp1.ruhr-uni-bochum.de 1.808.5.10 # kbuild: Allow UTS_MACHINE to be different from $(ARCH) # # parisc builds parisc / parisc64 from arch/parisc, but wants different # strings for uname -m, which it can now provide by overwriting # UTS_MACHINE in arch/parisc/Makefile. # # (Matthew Wilcox) # -------------------------------------------- # 02/10/28 kai@tp1.ruhr-uni-bochum.de 1.808.5.11 # Merge # -------------------------------------------- # 02/10/28 kai@tp1.ruhr-uni-bochum.de 1.808.5.12 # Merge # -------------------------------------------- # 02/10/28 kai@tp1.ruhr-uni-bochum.de 1.808.5.13 # kbuild: Fix a "make -j" warning # -------------------------------------------- # 02/10/28 kai@tp1.ruhr-uni-bochum.de 1.823.1.1 # Merge tp1.ruhr-uni-bochum.de:/home/kai/src/kernel/v2.5/linux-2.5 # into tp1.ruhr-uni-bochum.de:/home/kai/src/kernel/v2.5/linux-2.5.make # -------------------------------------------- # 02/10/28 jgarzik@redhat.com 1.823.2.1 # Fix IO API breakage: Make inl() return unsigned int on x86 again. # -------------------------------------------- # 02/10/28 agrover@groveronline.com 1.823.3.1 # Merge groveronline.com:/root/bk/linux-2.5 # into groveronline.com:/root/bk/linux-acpi # -------------------------------------------- # 02/10/28 greg@kroah.com 1.808.2.14 # USB: fix the usb serial drivers due to interrupt urb no automatic resubmission change to the usb core. # -------------------------------------------- # 02/10/28 greg@kroah.com 1.808.2.15 # USB: fix the usb input drivers due to interrupt urb no automatic resubmission change to the usb core. # -------------------------------------------- # 02/10/28 greg@kroah.com 1.808.2.16 # USB: fix the usb class drivers due to interrupt urb no automatic resubmission change to the usb core # -------------------------------------------- # 02/10/28 greg@kroah.com 1.808.2.17 # fix the usb image drivers due to interrupt urb no automatic resubmission change to the usb core. # -------------------------------------------- # 02/10/28 greg@kroah.com 1.808.2.18 # USB: fix the usb media drivers due to interrupt urb no automatic resubmission change to the usb core. # -------------------------------------------- # 02/10/28 greg@kroah.com 1.808.2.19 # USB: fix the usb misc drivers due to interrupt urb no automatic resubmission change to the usb core. # -------------------------------------------- # 02/10/28 greg@kroah.com 1.808.2.20 # USB: fix the usb net drivers due to interrupt urb no automatic resubmission change to the usb core. # -------------------------------------------- # 02/10/28 greg@kroah.com 1.808.2.21 # fix the usb storage drivers due to interrupt urb no automatic resubmission change to the usb core. # -------------------------------------------- # 02/10/28 greg@kroah.com 1.808.2.22 # USB: fix the usb drivers outside the drivers/usb tree due to interrupt urb no automatic resubmission change to the usb core. # -------------------------------------------- # 02/10/28 greg@kroah.com 1.808.2.23 # [PATCH] USB: fix GFP flags for usb audio driver. # -------------------------------------------- # 02/10/28 mdharm-usb@one-eyed-alien.net 1.808.2.24 # [PATCH] USB storage: fix error code # # This patch fixes a return code that was mangled during a hand-merging of # some code changes. # -------------------------------------------- # 02/10/28 mdharm-usb@one-eyed-alien.net 1.808.2.25 # [PATCH] USB storage: use scatter-gather core primitives # # This patch switches the usb-storage driver to using the new USB core # scatter-gather primitives. This _should_ create a significant performance # gain. # -------------------------------------------- # 02/10/28 david-b@pacbell.net 1.808.2.26 # [PATCH] Zaurus support for usbnet # # > This is a patch against 2.4.20-pre11, because i can't use the 2.5.44 (kernel # > freeze a boot time). The second patch is a incremental patch for the latest # > 2.5 kernel. # # Cool! Greg, 2.5 version (attached) looks fine to me. If it # applies against your BK repository, please merge it. # # The 2.4.20 version looks to be using an older version of the # usbnet driver, so please don't merge that one. I'll resync in # a while. # # By the way, I found out that it's not "the www.handhelds.org" # kernel but the standard ARM kernels (like 2.4.29-rmk2) that # have the "usb-eth" driver for the SA-1100. They're going to # need similar changes (switch endpoints for pxa250 versions). # # Time to actually look at the endpoint descriptors, maybe ... :) # -------------------------------------------- # 02/10/28 david-b@pacbell.net 1.808.2.27 # [PATCH] create # # This patch addresses some of the minor problems with programming # USB with "usbfs", or coming up with any kind of usb slave/target # device driver API (including eventually USB-OTG). # # It does so by creating a new file that defines # common constants and descriptor structures that are now found in # but which are (a) not exported to userspace, making # programming with "usbfs" awkward, and (b) needlessly mixed up with # the usb master/host-only side APIs, which a slave/target-only side # API will not want to require. These definitions are just moved out # of , so they can be accessed safely. # # # If folk agree that this should be done, instead of different headers # and declarations for master/host, slave/target, and dual-mode OTG # (which was the road the Lineo APIs, rejected by Linus, started down), # I think this should be merged (compiles but untested) as a start. # # Then configuration, interface, and device descriptors could get split # out too. That'd involve some code changes, since those descriptor # structures have been augmented (or maybe "sullied"?) with data that's # specific to the Linux host-side driver implementation. So they're # currently unsuitable to be used by user-space or slave/target drivers. # -------------------------------------------- # 02/10/28 greg@kroah.com 1.823.4.1 # Merge kroah.com:/home/greg/linux/BK/bleeding_edge-2.5 # into kroah.com:/home/greg/linux/BK/gregkh-2.5 # -------------------------------------------- # 02/10/28 torvalds@penguin.transmeta.com 1.828 # Merge http://gkernel.bkbits.net/misc-2.5 # into penguin.transmeta.com:/home/penguin/torvalds/repositories/kernel/linux # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.1 # [PATCH] MCA bus basic cleanups # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.2 # [PATCH] small scsi compile fixes # # This is stuff like next: pointers that are not present rather than # anything bigger # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.3 # [PATCH] move 53c7,8xx to pci_ not pcibios # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.4 # [PATCH] ressurect the aha1740 driver # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.5 # [PATCH] move advansys from pcibios to pci_ # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.6 # [PATCH] fix aic7xxx on gcc 3.2 warning spew # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.7 # [PATCH] initial eata driver updates # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.8 # [PATCH] fix all the IRQ breakage on the in2000 # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.9 # [PATCH] inia100 just has to lose a next: NULL # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.10 # [PATCH] ncr53c8xxx needs updating for scsi_hn_get # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.11 # [PATCH] resurrect the NCR53c406a # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.12 # [PATCH] nsp32 needs updating for scsi_hn_get # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.13 # [PATCH] fix scsi irq errors on seagate # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.14 # [PATCH] nsp_cs update from maintainer # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.15 # [PATCH] finish updating sym53c416 # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.16 # [PATCH] u14-34f update from maintainer # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.17 # [PATCH] next NCR5380 updates # # Fix more locking, do a major rethink on the bh handling (now workqueue) # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.18 # [PATCH] SCSI configure help # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.19 # [PATCH] correct notes on scsi generic release # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.20 # [PATCH] update qlogicfas driver # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.21 # [PATCH] get the right thing out of se401 on gcc 3.2 # -------------------------------------------- # 02/10/28 torvalds@penguin.transmeta.com 1.829 # Merge bk://linuxusb.bkbits.net/linus-2.5 # into penguin.transmeta.com:/home/penguin/torvalds/repositories/kernel/linux # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.22 # [PATCH] merge befs file system from 2.4 (no core changes) # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.23 # [PATCH] fix umem driver to use pci_get/set.. # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.24 # [PATCH] xd_open is gone # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.25 # [PATCH] make gscd compile again # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.26 # [PATCH] kill tqueue in dz # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.27 # [PATCH] make bluetooth compile again # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.28 # [PATCH] update i810 tco to C99 # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.29 # [PATCH] move ip2 to workqueues # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.30 # [PATCH] kill tqueue in specialix # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.31 # [PATCH] stallion workqueue # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.32 # [PATCH] move stallion to workqueue # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.33 # [PATCH] update the qic02 tape driver to 2.5.44 # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.34 # [PATCH] remove tqueue.h from vme_sc # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.35 # [PATCH] move hpt366 to pci_get # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.36 # [PATCH] move siimage to pci_get/set # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.37 # [PATCH] fix IDE compile with SIS5513 # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.38 # [PATCH] IDE floppy must be marked removable # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.39 # [PATCH] ARM ide driver updates # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.40 # [PATCH] remove dead ide suspend code # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.41 # [PATCH] make the firewire layer build again # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.42 # [PATCH] fix gcc warnings in eicon # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.43 # [PATCH] kill tqueue in macintosh adb # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.44 # [PATCH] update adv7175 to new i2c bus code # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.45 # [PATCH] cpia driver update from maintainer # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.46 # [PATCH] other minor video updates # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.47 # [PATCH] mpt fusion updates for scsi changes # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.48 # [PATCH] bring i2o_block/i2o_scsi back to life # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.49 # [PATCH] ressurrect the 3c515 driver # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.50 # [PATCH] bring the cops appletalk driver back # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.51 # [PATCH] de620 resurrection # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.52 # [PATCH] depca fix from maintainer # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.53 # [PATCH] dl2k warning fix # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.54 # [PATCH] fix hamradio netdriver builds # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.55 # [PATCH] resurrect the 3c589_cs pcmcia # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.56 # [PATCH] fix up the smc9194 - the extra locks arent needed # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.57 # [PATCH] znet can go from space.c now # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.58 # [PATCH] znet ethernet, back from the dead # # This last actually worked in 2.2, but Marc has a laptop with one and # wanted it working again... # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.59 # [PATCH] update APM to match 2.4 features # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.60 # [PATCH] core voyager arch/i386/machine support # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.61 # [PATCH] Documentation for befs # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.62 # [PATCH] remove acorn mfm tqueue.h # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.63 # [PATCH] documentation for voyager # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.64 # [PATCH] fix atm firestream warnings with new gcc # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.65 # [PATCH] drag ATM into the 21st century , part 1 # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.66 # [PATCH] Device Mapper, with updates # # This is the device mapper with Joe's updates applied and in -ac for a bit # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.67 # [PATCH] Digital TV framework # # DVB is very different in its need to analogue video. This merges the # cleaned up version of the DVB framework from Convergence, which has been # around for a couple of years. # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.68 # [PATCH] update wan drivers to new saner ioctls # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.69 # [PATCH] IDE - Andre can't count 8) # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.70 # [PATCH] mempool helpers used by device mapper # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.71 # [PATCH] updated ver_linux # -------------------------------------------- # 02/10/28 alan@lxorguk.ukuu.org.uk 1.808.10.72 # [PATCH] DVB drivers AV7110 (Fujitsu, Nova etc) # -------------------------------------------- # 02/10/28 torvalds@penguin.transmeta.com 1.830 # Merge penguin.transmeta.com:/home/penguin/torvalds/repositories/kernel/alan # into penguin.transmeta.com:/home/penguin/torvalds/repositories/kernel/linux # -------------------------------------------- # 02/10/28 torvalds@penguin.transmeta.com 1.831 # Merge http://linux-acpi.bkbits.net/linux-acpi # into penguin.transmeta.com:/home/penguin/torvalds/repositories/kernel/linux # -------------------------------------------- # 02/10/28 torvalds@penguin.transmeta.com 1.832 # Merge http://linux-isdn.bkbits.net/linux-2.5.make # into penguin.transmeta.com:/home/penguin/torvalds/repositories/kernel/linux # -------------------------------------------- # 02/10/28 akpm@digeo.com 1.833 # [PATCH] fix failure to write ext2 indirects under load # # This patch fixes a filesystem corrupting bug, present in 2.5.41 through # 2.5.44. It can cause ext2 indirect blocks to not be written out. A # fsck will fix it up. # # Under heavy memory pressure a PF_MEMALLOC task attemtps to write out a # blockdev page whose buffers are already under writeback and which were # dirtied while under writeback. # # The writepage call returns -EAGAIN but because the caller is # PF_MEMALLOC, the page was not being marked dirty again. # # The page sits on mapping->clean_pages for ever and it not written out. # # The fix is to mark that page dirty again for all callers, regardless of # PF_MEMALLOC state. # -------------------------------------------- # 02/10/28 akpm@digeo.com 1.834 # [PATCH] RCU idle detection fix # # Patch from Dipankar Sarma # # There is a check in RCU for idle CPUs which signifies quiescent state # (and hence no reference to RCU protected data) which was broken when # interrupt counters were changed to use thread_info->preempt_count. # # Martin's 32 CPU machine with many idle CPUs was not completing any RCU # grace period because RCU was forever waiting for idle CPUs to context # switch. Had the idle check worked, this would not have happened. With # no RCU happening, the dentries were getting "freed" (dentry stats # showing that) but not getting returned to slab. This would not show up # in systems that are generally busy as context switches then would # happen in all CPUs and the per-CPU quiescent state counter would get # incremented during context switch. # -------------------------------------------- # 02/10/28 akpm@digeo.com 1.835 # [PATCH] sparc64 read_barrier_depends fix # # From Dipankar # # I missed sparc64 when I broke up read_barrier_depends in -mm and sent # to Linus. Please apply this to your tree until Linus is back and I can # fix it. # -------------------------------------------- # diff -Nru a/Documentation/BK-usage/00-INDEX b/Documentation/BK-usage/00-INDEX --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/Documentation/BK-usage/00-INDEX Mon Oct 28 16:32:38 2002 @@ -0,0 +1,38 @@ +bk-kernel-howto.txt: Description of kernel workflow under BitKeeper + +bk-make-sum: Create summary of changesets in one repository and not +another, typically in preparation to be sent to an upstream maintainer. +Typical usage: + cd my-updated-repo + bk-make-sum ~/repo/original-repo + mv /tmp/linus.txt ../original-repo.txt + +bksend: Create readable text output containing summary of changes, GNU +patch of the changes, and BK metadata of changes (as needed for proper +importing into BitKeeper by an upstream maintainer). This output is +suitable for emailing BitKeeper changes. The recipient of this output +may pipe it directly to 'bk receive'. + +bz64wrap: helper script. Uncompressed input is piped to this script, +which compresses its input, and then outputs the uu-/base64-encoded +version of the compressed input. + +csets-to-patches: Produces a delta of two BK repositories, in the form +of individual files, each containing a single cset as a GNU patch. +Output is several files, each with the filename "/tmp/rev-$REV.patch" +Typical usage: + cd my-updated-repo + bk changes -L ~/repo/original-repo 2>&1 | \ + perl csets-to-patches + +cset-to-linus: Produces a delta of two BK repositories, in the form of +changeset descriptions, with 'diffstat' output created for each +individual changset. +Typical usage: + cd my-updated-repo + bk changes -L ~/repo/original-repo 2>&1 | \ + perl cset-to-linus > summary.txt + +unbz64wrap: Reverse an encoded, compressed data stream created by +bz64wrap into an uncompressed, typically text/plain output. + diff -Nru a/Documentation/BK-usage/bk-kernel-howto.txt b/Documentation/BK-usage/bk-kernel-howto.txt --- a/Documentation/BK-usage/bk-kernel-howto.txt Mon Oct 28 16:32:35 2002 +++ b/Documentation/BK-usage/bk-kernel-howto.txt Mon Oct 28 16:32:35 2002 @@ -32,7 +32,7 @@ Let's start with this progression: Each BitKeeper source tree on disk is a repository unto itself. -Each repository has a parent. +Each repository has a parent (except the root/original, of course). Each repository contains a set of a changesets ("csets"). Each cset is one or more changed files, bundled together. diff -Nru a/Documentation/filesystems/befs.txt b/Documentation/filesystems/befs.txt --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/Documentation/filesystems/befs.txt Mon Oct 28 16:32:38 2002 @@ -0,0 +1,111 @@ +BeOS filesystem for Linux + +Document last updated: Dec 6, 2001 + +WARNING +======= +Make sure you understand that this is alpha software. This means that the +implementation is neither complete nor well-tested. + +I DISCLAIM ALL RESPONSIBILTY FOR ANY POSSIBLE BAD EFFECTS OF THIS CODE! + +LICENSE +===== +This software is covered by the GNU General Public License. +See the file COPYING for the complete text of the license. +Or the GNU website: + +AUTHOR +===== +Current maintainer: Will Dyson +Has been working on the code since Aug 13, 2001. See the changelog for details. + +Original Author: Makoto Kato +His orriginal code can still be found at: +Does anyone know of a more current email address for Makoto? He doesn't respond +to the address given above... + +WHAT IS THIS DRIVER? +================== +This module implements the native filesystem of BeOS +for the linux 2.4.1 and later kernels. Currently it is a read-only implementation. + +Which is it, BFS or BEFS? +================ +Be, Inc said, "BeOS Filesystem is officially called BFS, not BeFS". +But Unixware Boot Filesystem is called bfs, too. And they are already in the +kernel. +Because of this nameing conflict, on Linux the BeOS filesystem is called befs. + +HOW TO INSTALL +============== +step 1. Install the BeFS patch into the source code tree of linux. + +Apply the patchfile to your kernel source tree. +Assuming that your kernel source is in /foo/bar/linux and the patchfile is called +patch-befs-xxx, you would do the following: + + cd /foo/bar/linux + patch -p1 < /path/to/patch-befs-xxx + +if the patching step fails (i.e. there are rejected hunks), you can try to +figure it out yourself (it shouldn't be hard), or mail the maintainer +(Will Dyson ) for help. + +step 2. Configuretion & make kernel + +The linux kernel has many compile-time options. Most of them are beyond the +scope of this document. I suggest the Kernel-HOWTO document as a good general +reference on this topic. + +However, to use the BeFS module, you must enable it at configure time. + + cd /foo/bar/linux + make menuconfig (or xconfig) + +The BeFS module is not a standard part of the linux kernel, so you must first +enable support for experimental code under the "Code maturity level" menu. + +Then, under the "Filesystems" menu will be an option called "BeFS filesystem (experimental)", +or something like that. Enable that option (it is fine to make it a module). + +Save your kernel configuration and then build your kernel. + +step 3. Install + +See the kernel howto for +instructions on this critical step. + +USING BFS +========= +To use the BeOS filesystem, use filesystem type 'befs'. + +ex) + mount -t befs /dev/fd0 /beos + +MOUNT OPTIONS +============= +uid=nnn All files in the partition will be owned by user id nnn. +gid=nnn All files in the partition will be in group nnn. +iocharset=xxx Use xxx as the name of the NLS translation table. +debug The driver will output debugging information to the syslog. + +HOW TO GET LASTEST VERSION +========================== + +The latest version is currently available at: + + +ANY KNOWN BUGS? +=========== +As of Jan 20, 2002: + + None + +SPECIAL THANKS +============== +Dominic Giampalo ... Writing "Practical file system design with Be filesystem" +Hiroyuki Yamada ... Testing LinuxPPC. + + + diff -Nru a/Documentation/voyager.txt b/Documentation/voyager.txt --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/Documentation/voyager.txt Mon Oct 28 16:32:38 2002 @@ -0,0 +1,95 @@ +Running Linux on the Voyager Architecture +========================================= + +For full details and current project status, see + +http://www.hansenpartnership.com/voyager + +The voyager architecture was designed by NCR in the mid 80s to be a +fully SMP capable RAS computing architecture built around intel's 486 +chip set. The voyager came in three levels of architectural +sophistication: 3,4 and 5 --- 1 and 2 never made it out of prototype. +The linux patches support only the Level 5 voyager architecture (any +machine class 3435 and above). + +The Voyager Architecture +------------------------ + +Voyager machines consist of a Baseboard with a 386 diagnostic +processor, a Power Supply Interface (PSI) a Primary and possibly +Secondary Microchannel bus and between 2 and 20 voyager slots. The +voyager slots can be populated with memory and cpu cards (up to 4GB +memory and from 1 486 to 32 Pentium Pro processors). Internally, the +voyager has a dual arbitrated system bus and a configuration and test +bus (CAT). The voyager bus speed is 40MHz. Therefore (since all +voyager cards are dual ported for each system bus) the maximum +transfer rate is 320Mb/s but only if you have your slot configuration +tuned (only memory cards can communicate with both busses at once, CPU +cards utilise them one at a time). + +Voyager SMP +----------- + +Since voyager was the first intel based SMP system, it is slightly +more primitive than the Intel IO-APIC approach to SMP. Voyager allows +arbitrary interrupt routing (including processor affinity routing) of +all 16 PC type interrupts. However it does this by using a modified +5259 master/slave chip set instead of an APIC bus. Additionally, +voyager supports Cross Processor Interrupts (CPI) equivalent to the +APIC IPIs. There are two routed voyager interrupt lines provided to +each slot. + +Processor Cards +--------------- + +These come in single, dyadic and quad configurations (the quads are +problematic--see later). The maximum configuration is 8 quad cards +for 32 way SMP. + +Quad Processors +--------------- + +Because voyager only supplies two interrupt lines to each Processor +card, the Quad processors have to be configured (and Bootstrapped) in +as a pair of Master/Slave processors. + +In fact, most Quad cards only accept one VIC interrupt line, so they +have one interrupt handling processor (called the VIC extended +processor) and three non-interrupt handling processors. + +Current Status +-------------- + +The System will boot on Mono, Dyad and Quad cards. There was +originally a Quad boot problem which has been fixed by proper gdt +alignment in the initial boot loader. If you still cannot get your +voyager system to boot, email me at: + + + + +The Quad cards now support using the separate Quad CPI vectors instead +of going through the VIC mailbox system. + +The Level 4 architecture (3430 and 3360 Machines) should also work +fine. + +Dump Switch +----------- + +The voyager dump switch sends out a broadcast NMI which the voyager +code intercepts and does a task dump. + +Power Switch +------------ + +The front panel power switch is intercepted by the kernel and should +cause a system shutdown and power off. + +A Note About Mixed CPU Systems +------------------------------ + +Linux isn't designed to handle mixed CPU systems very well. In order +to get everything going you *must* make sure that your lowest +capability CPU is used for booting. Also, mixing CPU classes +(e.g. 486 and 586) is really not going to work very well at all. diff -Nru a/Makefile b/Makefile --- a/Makefile Mon Oct 28 16:32:35 2002 +++ b/Makefile Mon Oct 28 16:32:35 2002 @@ -38,6 +38,8 @@ KERNELPATH=kernel-$(shell echo $(KERNELRELEASE) | sed -e "s/-//g") +UTS_MACHINE := $(ARCH) + CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ else if [ -x /bin/bash ]; then echo /bin/bash; \ else echo sh; fi ; fi) @@ -106,11 +108,20 @@ MAKEFLAGS += --no-print-directory +# For maximum performance (+ possibly random breakage, uncomment +# the following) + +#MAKEFLAGS += -rR + # If the user wants quiet mode, echo short versions of the commands # only -ifneq ($(KBUILD_VERBOSE),1) +ifeq ($(KBUILD_VERBOSE),1) + quiet = + Q = +else quiet=quiet_ + Q = @ endif # If the user is running make -s (silent mode), suppress echoing of @@ -120,7 +131,7 @@ quiet=silent_ endif -export quiet KBUILD_VERBOSE +export quiet Q KBUILD_VERBOSE # Paths to obj / src tree @@ -142,7 +153,6 @@ STRIP = $(CROSS_COMPILE)strip OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS_COMPILE)objdump -MAKEFILES = .config GENKSYMS = /sbin/genksyms DEPMOD = /sbin/depmod KALLSYMS = /sbin/kallsyms @@ -161,7 +171,7 @@ export VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH \ CONFIG_SHELL TOPDIR HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \ - CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS PERL + CPP AR NM STRIP OBJCOPY OBJDUMP MAKE GENKSYMS PERL UTS_MACHINE export CPPFLAGS NOSTDINC_FLAGS OBJCOPYFLAGS LDFLAGS export CFLAGS CFLAGS_KERNEL CFLAGS_MODULE @@ -187,7 +197,7 @@ .PHONY: scripts scripts: - +@$(call descend,scripts,) + +@$(Q)$(MAKE) -f scripts/Makefile.build obj=scripts # Objects we will link into vmlinux / subdirs we need to visit # --------------------------------------------------------------------------- @@ -306,7 +316,7 @@ echo ' Generating build number' . scripts/mkversion > .tmp_version mv -f .tmp_version .version - +$(call descend,init,) + $(Q)$(MAKE) -f scripts/Makefile.build obj=init ) $(call cmd,vmlinux__) echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd @@ -365,7 +375,7 @@ .PHONY: $(SUBDIRS) $(SUBDIRS): .hdepend prepare - +@$(call descend,$@,) + $(Q)$(MAKE) -f scripts/Makefile.build obj=$@ # Things we need done before we descend to build or make # module versions are listed in "prepare" @@ -388,17 +398,17 @@ # --------------------------------------------------------------------------- %.s: %.c scripts FORCE - +@$(call descend,$(@D),$@) + $(Q)$(MAKE) -f scripts/Makefile.build obj=$(@D) $@ %.i: %.c scripts FORCE - +@$(call descend,$(@D),$@) + $(Q)$(MAKE) -f scripts/Makefile.build obj=$(@D) $@ %.o: %.c scripts FORCE - +@$(call descend,$(@D),$@) + $(Q)$(MAKE) -f scripts/Makefile.build obj=$(@D) $@ %.lst: %.c scripts FORCE - +@$(call descend,$(@D),$@) + $(Q)$(MAKE) -f scripts/Makefile.build obj=$(@D) $@ %.s: %.S scripts FORCE - +@$(call descend,$(@D),$@) + $(Q)$(MAKE) -f scripts/Makefile.build obj=$(@D) $@ %.o: %.S scripts FORCE - +@$(call descend,$(@D),$@) + $(Q)$(MAKE) -f scripts/Makefile.build obj=$(@D) $@ # FIXME: The asm symlink changes when $(ARCH) changes. That's # hard to detect, but I suppose "make mrproper" is a good idea @@ -472,9 +482,11 @@ # Update modversions.h, but only if it would change. -include/linux/modversions.h: FORCE +.PHONY: __rm_tmp_export-objs +__rm_tmp_export-objs: @rm -rf .tmp_export-objs - @$(MAKE) $(patsubst %,_sfdep_%,$(SUBDIRS)) + +include/linux/modversions.h: $(patsubst %,_modver_%,$(SUBDIRS)) @echo -n ' Generating $@' @( echo "#ifndef _LINUX_MODVERSIONS_H";\ echo "#define _LINUX_MODVERSIONS_H"; \ @@ -487,8 +499,9 @@ ) > $@.tmp; \ $(update-if-changed) -$(patsubst %,_sfdep_%,$(SUBDIRS)): FORCE - +@$(call descend,$(patsubst _sfdep_%,%,$@),fastdep) +.PHONY: $(patsubst %, _modver_%, $(SUBDIRS)) +$(patsubst %, _modver_%, $(SUBDIRS)): __rm_tmp_export-objs + $(Q)$(MAKE) -f scripts/Makefile.modver obj=$(patsubst _modver_%,%,$@) else # !CONFIG_MODVERSIONS @@ -540,8 +553,7 @@ .PHONY: $(patsubst %, _modinst_%, $(SUBDIRS)) $(patsubst %, _modinst_%, $(SUBDIRS)) : - +@$(call descend,$(patsubst _modinst_%,%,$@),modules_install) - + $(Q)$(MAKE) -f scripts/Makefile.modinst obj=$(patsubst _modinst_%,%,$@) else # CONFIG_MODULES # Modules not configured @@ -638,11 +650,11 @@ make_with_config xconfig: - +@$(call descend,scripts,scripts/kconfig.tk) + $(Q)$(MAKE) -f scripts/Makefile.build obj=scripts scripts/kconfig.tk wish -f scripts/kconfig.tk menuconfig: - +@$(call descend,scripts,lxdialog) + $(Q)$(MAKE) -f scripts/Makefile.build obj=scripts lxdialog $(CONFIG_SHELL) $(src)/scripts/Menuconfig arch/$(ARCH)/config.in config: @@ -698,7 +710,7 @@ clean-dirs += $(ALL_SUBDIRS) Documentation/DocBook scripts $(addprefix _clean_,$(clean-dirs)): - $(MAKE) MAKEFILES= -rR -f scripts/Makefile.clean obj=$(patsubst _clean_%,%,$@) + $(Q)$(MAKE) -f scripts/Makefile.clean obj=$(patsubst _clean_%,%,$@) quiet_cmd_rmclean = RM $$(CLEAN_FILES) cmd_rmclean = rm -f $(CLEAN_FILES) @@ -798,7 +810,7 @@ # Documentation targets # --------------------------------------------------------------------------- sgmldocs psdocs pdfdocs htmldocs: scripts - +@$(call descend,Documentation/DocBook,$@) + $(Q)$(MAKE) -f Documentation/DocBook/Makefile $@ # Scripts to check various things for consistency # --------------------------------------------------------------------------- @@ -833,12 +845,10 @@ # FIXME Should go into a make.lib or something # =========================================================================== -echo_target = $@ - a_flags = -Wp,-MD,$(depfile) $(AFLAGS) $(NOSTDINC_FLAGS) \ $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(*F).o) -quiet_cmd_as_s_S = CPP $(echo_target) +quiet_cmd_as_s_S = CPP $@ cmd_as_s_S = $(CPP) $(a_flags) -o $@ $< # read all saved command lines @@ -885,13 +895,9 @@ mv -f $@.tmp $@; \ fi endef - # $(call descend,,) -# Recursively call a sub-make in with target +# Recursively call a sub-make in with target -ifeq ($(KBUILD_VERBOSE),1) -descend = echo '$(MAKE) -f $(1)/Makefile $(2)'; -endif -descend += $(MAKE) -f $(1)/Makefile obj=$(1) $(2) +descend = $(Q)$(MAKE) -f scripts/Makefile.build obj=$(1) $(2) FORCE: diff -Nru a/Rules.make b/Rules.make --- a/Rules.make Mon Oct 28 16:32:36 2002 +++ b/Rules.make Mon Oct 28 16:32:36 2002 @@ -1,625 +1 @@ -ifndef no-rules.make - -# -# This file contains rules which are shared between multiple Makefiles. -# - -# Some standard vars - -comma := , -empty := -space := $(empty) $(empty) - -# Some bug traps -# --------------------------------------------------------------------------- - -ifdef O_TARGET -$(error kbuild: $(obj)/Makefile - Usage of O_TARGET := $(O_TARGET) is obsolete in 2.5. Please fix!) -endif - -ifdef L_TARGET -ifneq ($(L_TARGET),lib.a) -$(warning kbuild: $(obj)/Makefile - L_TARGET := $(L_TARGET) target shall be renamed to lib.a. Please fix!) -endif -endif - -ifdef list-multi -$(warning kbuild: $(obj)/Makefile - list-multi := $(list-multi) is obsolete in 2.5. Please fix!) -endif - -# Some paths for the Makefiles to use -# --------------------------------------------------------------------------- - -# FIXME. For now, we leave it possible to use make -C or make -f -# to do work in subdirs. - -ifndef obj -obj = . -CFLAGS := $(patsubst -I%,-I$(TOPDIR)/%,$(patsubst -I$(TOPDIR)/%,-I%,$(CFLAGS))) -AFLAGS := $(patsubst -I%,-I$(TOPDIR)/%,$(patsubst -I$(TOPDIR)/%,-I%,$(AFLAGS))) -endif - -# For use in the quiet output -echo_target = $@ - -# Usage: -# -# $(obj)/target.o : target.o in the build dir -# $(src)/target.c : target.c in the source dir -# $(objtree)/include/linux/version.h : Some file relative to the build -# dir root -# $(srctree)/include/linux/module.h : Some file relative to the source -# dir root -# -# $(obj) and $(src) can only be used in the section after -# include $(TOPDIR)/Rules.make, i.e for generated files and the like. -# Intentionally. -# -# We don't support separate source / object yet, so these are just -# placeholders for now - -src := $(obj) - -# Figure out what we need to build from the various variables -# =========================================================================== - -# When an object is listed to be built compiled-in and modular, -# only build the compiled-in version - -obj-m := $(filter-out $(obj-y),$(obj-m)) - -# Handle objects in subdirs -# --------------------------------------------------------------------------- -# o if we encounter foo/ in $(obj-y), replace it by foo/built-in.o -# and add the directory to the list of dirs to descend into: $(subdir-y) -# o if we encounter foo/ in $(obj-m), remove it from $(obj-m) -# and add the directory to the list of dirs to descend into: $(subdir-m) - -__subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y))) -subdir-y += $(__subdir-y) -__subdir-m := $(patsubst %/,%,$(filter %/, $(obj-m))) -subdir-m += $(__subdir-m) -__subdir-n := $(patsubst %/,%,$(filter %/, $(obj-n))) -subdir-n += $(__subdir-n) -__subdir- := $(patsubst %/,%,$(filter %/, $(obj-))) -subdir- += $(__subdir-) -obj-y := $(patsubst %/, %/built-in.o, $(obj-y)) -obj-m := $(filter-out %/, $(obj-m)) - -# Subdirectories we need to descend into - -subdir-ym := $(sort $(subdir-y) $(subdir-m)) -subdir-ymn := $(sort $(subdir-ym) $(subdir-n) $(subdir-)) - -# export.o is never a composite object, since $(export-objs) has a -# fixed meaning (== objects which EXPORT_SYMBOL()) -__obj-y = $(filter-out export.o,$(obj-y)) -__obj-m = $(filter-out export.o,$(obj-m)) - -# if $(foo-objs) exists, foo.o is a composite object -multi-used-y := $(sort $(foreach m,$(__obj-y), $(if $($(m:.o=-objs)), $(m)))) -multi-used-m := $(sort $(foreach m,$(__obj-m), $(if $($(m:.o=-objs)), $(m)))) - -# Build list of the parts of our composite objects, our composite -# objects depend on those (obviously) -multi-objs-y := $(foreach m, $(multi-used-y), $($(m:.o=-objs))) -multi-objs-m := $(foreach m, $(multi-used-m), $($(m:.o=-objs))) - -# $(subdir-obj-y) is the list of objects in $(obj-y) which do not live -# in the local directory -subdir-obj-y := $(foreach o,$(obj-y),$(if $(filter-out $(o),$(notdir $(o))),$(o))) - -# Replace multi-part objects by their individual parts, look at local dir only -real-objs-y := $(foreach m, $(filter-out $(subdir-obj-y), $(obj-y)), $(if $($(m:.o=-objs)),$($(m:.o=-objs)),$(m))) $(EXTRA_TARGETS) -real-objs-m := $(foreach m, $(obj-m), $(if $($(m:.o=-objs)),$($(m:.o=-objs)),$(m))) - -# Only build module versions for files which are selected to be built -export-objs := $(filter $(export-objs),$(real-objs-y) $(real-objs-m)) - -host-progs-single := $(foreach m,$(host-progs),$(if $($(m)-objs),,$(m))) -host-progs-multi := $(foreach m,$(host-progs),$(if $($(m)-objs),$(m))) -host-progs-multi-objs := $(foreach m,$(host-progs-multi),$($(m)-objs)) - -# Add subdir path - -EXTRA_TARGETS := $(addprefix $(obj)/,$(EXTRA_TARGETS)) -obj-y := $(addprefix $(obj)/,$(obj-y)) -obj-m := $(addprefix $(obj)/,$(obj-m)) -export-objs := $(addprefix $(obj)/,$(export-objs)) -subdir-obj-y := $(addprefix $(obj)/,$(subdir-obj-y)) -real-objs-y := $(addprefix $(obj)/,$(real-objs-y)) -real-objs-m := $(addprefix $(obj)/,$(real-objs-m)) -multi-used-y := $(addprefix $(obj)/,$(multi-used-y)) -multi-used-m := $(addprefix $(obj)/,$(multi-used-m)) -multi-objs-y := $(addprefix $(obj)/,$(multi-objs-y)) -multi-objs-m := $(addprefix $(obj)/,$(multi-objs-m)) -subdir-ym := $(addprefix $(obj)/,$(subdir-ym)) -subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn)) -clean-files := $(addprefix $(obj)/,$(clean-files)) -host-progs := $(addprefix $(obj)/,$(host-progs)) -host-progs-single := $(addprefix $(obj)/,$(host-progs-single)) -host-progs-multi := $(addprefix $(obj)/,$(host-progs-multi)) -host-progs-multi-objs := $(addprefix $(obj)/,$(host-progs-multi-objs)) - -# The temporary file to save gcc -MD generated dependencies must not -# contain a comma -depfile = $(subst $(comma),_,$(@D)/.$(@F).d) - -# We're called for one of four purposes: -# o subdirclean: Delete intermidiate files in the current directory -# o fastdep: build module version files (.ver) for $(export-objs) in -# the current directory -# o modules_install: install the modules in the current directory -# o build: When no target is given, first_rule is the default and -# will build the built-in and modular objects in this dir -# (or a subset thereof, depending on $(KBUILD_MODULES),$(KBUILD_BUILTIN) -# When targets are given directly (like foo.o), we just build these -# targets (That happens when someone does make some/dir/foo.[ois]) - -ifeq ($(MAKECMDGOALS),subdirclean) - -__clean-files := $(wildcard $(EXTRA_TARGETS) $(host-progs) $(clean-files)) - -subdirclean: $(subdir-ymn) -ifneq ($(strip $(__clean-files) $(clean-rule)),) - rm -f $(__clean-files) - $(clean-rule) -else - @: -endif - -else -ifeq ($(MAKECMDGOALS),fastdep) - -# =========================================================================== -# Module versions -# =========================================================================== - -ifeq ($(strip $(export-objs)),) - -# If we don't export any symbols in this dir, just descend -# --------------------------------------------------------------------------- - -fastdep: $(subdir-ym) - @: - -else - -# This sets version suffixes on exported symbols -# --------------------------------------------------------------------------- - -MODVERDIR := include/linux/modules - -# -# Added the SMP separator to stop module accidents between uniprocessor -# and SMP Intel boxes - AC - from bits by Michael Chastain -# - -ifdef CONFIG_SMP - genksyms_smp_prefix := -p smp_ -else - genksyms_smp_prefix := -endif - -# Don't include modversions.h, we're just about to generate it here. - -CFLAGS_MODULE := $(filter-out -include linux/modversions.h,$(CFLAGS_MODULE)) - -$(addprefix $(MODVERDIR)/,$(real-objs-y:.o=.ver)): modkern_cflags := $(CFLAGS_KERNEL) -$(addprefix $(MODVERDIR)/,$(real-objs-m:.o=.ver)): modkern_cflags := $(CFLAGS_MODULE) -$(addprefix $(MODVERDIR)/,$(export-objs:.o=.ver)): export_flags := -D__GENKSYMS__ - -c_flags = -Wp,-MD,$(depfile) $(CFLAGS) $(NOSTDINC_FLAGS) \ - $(modkern_cflags) $(EXTRA_CFLAGS) $(CFLAGS_$(*F).o) \ - -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) \ - $(export_flags) - -# Our objects only depend on modversions.h, not on the individual .ver -# files (fix-dep filters them), so touch modversions.h if any of the .ver -# files changes - -quiet_cmd_cc_ver_c = MKVER include/linux/modules/$*.ver -cmd_cc_ver_c = $(CPP) $(c_flags) $< | $(GENKSYMS) $(genksyms_smp_prefix) \ - -k $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) > $@.tmp - -# Okay, let's explain what's happening in rule_make_cc_ver_c: -# o echo the command -# o execute the command -# o If the $(CPP) fails, we won't notice because it's output is piped -# to $(GENKSYMS) which does not fail. We recognize this case by -# looking if the generated $(depfile) exists, though. -# o If the .ver file changed, touch modversions.h, which is our maker -# of any changed .ver files. -# o Move command line and deps into their normal .*.cmd place. - -define rule_cc_ver_c - $(if $($(quiet)cmd_cc_ver_c),echo ' $($(quiet)cmd_cc_ver_c)';) \ - $(cmd_cc_ver_c); \ - if [ ! -r $(depfile) ]; then exit 1; fi; \ - scripts/fixdep $(depfile) $@ '$(cmd_cc_ver_c)' > $(@D)/.$(@F).tmp; \ - rm -f $(depfile); \ - if [ ! -r $@ ] || cmp -s $@ $@.tmp; then \ - touch include/linux/modversions.h; \ - fi; \ - mv -f $@.tmp $@ - mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd -endef - -$(MODVERDIR)/%.ver: %.c FORCE - @$(call if_changed_rule,cc_ver_c) - -targets := $(addprefix $(MODVERDIR)/,$(export-objs:.o=.ver)) - -fastdep: $(targets) $(subdir-ym) - @mkdir -p $(dir $(addprefix .tmp_export-objs/modules/,$(export-objs:.o=.ver))) - @touch $(addprefix .tmp_export-objs/modules/,$(export-objs:.o=.ver)) - -endif # export-objs - -else # ! fastdep -ifeq ($(MAKECMDGOALS),modules_install) - -# ========================================================================== -# Installing modules -# ========================================================================== - -quiet_cmd_modules_install = INSTALL $(obj-m) -cmd_modules_install = mkdir -p $(MODLIB)/kernel/$(obj); \ - cp $(obj-m) $(MODLIB)/kernel/$(obj) - -.PHONY: modules_install - -modules_install: $(subdir-ym) -ifneq ($(obj-m),) - $(call cmd,modules_install) -else - @: -endif - -else # ! modules_install - -# ========================================================================== -# Building -# ========================================================================== - -# If a Makefile does not define a L_TARGET, link an object called "built-in.o" - -ifdef L_TARGET -L_TARGET := $(obj)/$(L_TARGET) -else -O_TARGET := $(obj)/built-in.o -endif - -first_rule: $(if $(KBUILD_BUILTIN),$(O_TARGET) $(L_TARGET) $(EXTRA_TARGETS)) \ - $(if $(KBUILD_MODULES),$(obj-m)) \ - $(subdir-ym) - @: - -# Compile C sources (.c) -# --------------------------------------------------------------------------- - -# Default is built-in, unless we know otherwise -modkern_cflags := $(CFLAGS_KERNEL) - -$(real-objs-m) : modkern_cflags := $(CFLAGS_MODULE) -$(real-objs-m:.o=.i) : modkern_cflags := $(CFLAGS_MODULE) -$(real-objs-m:.o=.lst): modkern_cflags := $(CFLAGS_MODULE) - -$(export-objs) : export_flags := $(EXPORT_FLAGS) -$(export-objs:.o=.i) : export_flags := $(EXPORT_FLAGS) -$(export-objs:.o=.s) : export_flags := $(EXPORT_FLAGS) -$(export-objs:.o=.lst): export_flags := $(EXPORT_FLAGS) - -c_flags = -Wp,-MD,$(depfile) $(CFLAGS) $(NOSTDINC_FLAGS) \ - $(modkern_cflags) $(EXTRA_CFLAGS) $(CFLAGS_$(*F).o) \ - -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) \ - $(export_flags) - -quiet_cmd_cc_s_c = CC $(echo_target) -cmd_cc_s_c = $(CC) $(c_flags) -S -o $@ $< - -%.s: %.c FORCE - $(call if_changed_dep,cc_s_c) - -quiet_cmd_cc_i_c = CPP $(echo_target) -cmd_cc_i_c = $(CPP) $(c_flags) -o $@ $< - -%.i: %.c FORCE - $(call if_changed_dep,cc_i_c) - -quiet_cmd_cc_o_c = CC $(echo_target) -cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< - -%.o: %.c FORCE - $(call if_changed_dep,cc_o_c) - -quiet_cmd_cc_lst_c = MKLST $(echo_target) -cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && sh scripts/makelst $*.o System.map $(OBJDUMP) > $@ - -%.lst: %.c FORCE - $(call if_changed_dep,cc_lst_c) - -# Compile assembler sources (.S) -# --------------------------------------------------------------------------- - -modkern_aflags := $(AFLAGS_KERNEL) - -$(real-objs-m) : modkern_aflags := $(AFLAGS_MODULE) -$(real-objs-m:.o=.s): modkern_aflags := $(AFLAGS_MODULE) - -a_flags = -Wp,-MD,$(depfile) $(AFLAGS) $(NOSTDINC_FLAGS) \ - $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(*F).o) - -quiet_cmd_as_s_S = CPP $(echo_target) -cmd_as_s_S = $(CPP) $(a_flags) -o $@ $< - -%.s: %.S FORCE - $(call if_changed_dep,as_s_S) - -quiet_cmd_as_o_S = AS $(echo_target) -cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< - -%.o: %.S FORCE - $(call if_changed_dep,as_o_S) - -targets += $(real-objs-y) $(real-objs-m) $(EXTRA_TARGETS) $(MAKECMDGOALS) - -# Build the compiled-in targets -# --------------------------------------------------------------------------- - -# To build objects in subdirs, we need to descend into the directories -$(sort $(subdir-obj-y)): $(subdir-ym) ; - -# -# Rule to compile a set of .o files into one .o file -# -ifdef O_TARGET -quiet_cmd_link_o_target = LD $(echo_target) -# If the list of objects to link is empty, just create an empty O_TARGET -cmd_link_o_target = $(if $(strip $(obj-y)),\ - $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) -r -o $@ $(filter $(obj-y), $^),\ - rm -f $@; $(AR) rcs $@) - -$(O_TARGET): $(obj-y) FORCE - $(call if_changed,link_o_target) - -targets += $(O_TARGET) -endif # O_TARGET - -# -# Rule to compile a set of .o files into one .a file -# -ifdef L_TARGET -quiet_cmd_link_l_target = AR $(echo_target) -cmd_link_l_target = rm -f $@; $(AR) $(EXTRA_ARFLAGS) rcs $@ $(obj-y) - -$(L_TARGET): $(obj-y) FORCE - $(call if_changed,link_l_target) - -targets += $(L_TARGET) -endif - -# -# Rule to link composite objects -# - -quiet_cmd_link_multi = LD $(echo_target) -cmd_link_multi = $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) -r -o $@ $(filter $(addprefix $(obj)/,$($(subst $(obj)/,,$(@:.o=-objs)))),$^) - -# We would rather have a list of rules like -# foo.o: $(foo-objs) -# but that's not so easy, so we rather make all composite objects depend -# on the set of all their parts -$(multi-used-y) : %.o: $(multi-objs-y) FORCE - $(call if_changed,link_multi) - -$(multi-used-m) : %.o: $(multi-objs-m) FORCE - $(call if_changed,link_multi) - -targets += $(multi-used-y) $(multi-used-m) - -# Compile programs on the host -# =========================================================================== - -quiet_cmd_host_cc__c = HOSTCC $(echo_target) -cmd_host_cc__c = $(HOSTCC) -Wp,-MD,$(depfile) \ - $(HOSTCFLAGS) $(HOST_EXTRACFLAGS) \ - $(HOST_LOADLIBES) -o $@ $< - -$(host-progs-single): %: %.c FORCE - $(call if_changed_dep,host_cc__c) - -quiet_cmd_host_cc_o_c = HOSTCC $(echo_target) -cmd_host_cc_o_c = $(HOSTCC) -Wp,-MD,$(depfile) \ - $(HOSTCFLAGS) $(HOST_EXTRACFLAGS) -c -o $@ $< - -$(host-progs-multi-objs): %.o: %.c FORCE - $(call if_changed_dep,host_cc_o_c) - -quiet_cmd_host_cc__o = HOSTLD $(echo_target) -cmd_host_cc__o = $(HOSTCC) $(HOSTLDFLAGS) -o $@ $(addprefix $(obj)/,$($(subst $(obj)/,,$@)-objs)) \ - $(HOST_LOADLIBES) - -$(host-progs-multi): %: $(host-progs-multi-objs) FORCE - $(call if_changed,host_cc__o) - -targets += $(host-progs-single) $(host-progs-multi-objs) $(host-progs-multi) - -endif # ! subdirclean -endif # ! modules_install -endif # ! fastdep - -# Shipped files -# =========================================================================== - -quiet_cmd_shipped = SHIPPED $(echo_target) -cmd_shipped = cat $< > $@ - -%:: %_shipped - $(call cmd,shipped) - -# Commands useful for building a boot image -# =========================================================================== -# -# Use as following: -# -# target: source(s) FORCE -# $(if_changed,ld/objcopy/gzip) -# -# and add target to EXTRA_TARGETS so that we know we have to -# read in the saved command line - -# Linking -# --------------------------------------------------------------------------- - -quiet_cmd_ld = LD $(echo_target) -cmd_ld = $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) $(LDFLAGS_$(@F)) \ - $(filter-out FORCE,$^) -o $@ - -# Objcopy -# --------------------------------------------------------------------------- - -quiet_cmd_objcopy = OBJCOPY $(echo_target) -cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ - -# Gzip -# --------------------------------------------------------------------------- - -quiet_cmd_gzip = GZIP $(echo_target) -cmd_gzip = gzip -f -9 < $< > $@ - -# =========================================================================== -# Generic stuff -# =========================================================================== - -# Descending -# --------------------------------------------------------------------------- - -.PHONY: $(subdir-ymn) - -$(subdir-ymn): - +@$(call descend,$@,$(MAKECMDGOALS)) - -# Add FORCE to the prequisites of a target to force it to be always rebuilt. -# --------------------------------------------------------------------------- - -.PHONY: FORCE - -FORCE: - -# -# This sets version suffixes on exported symbols -# Separate the object into "normal" objects and "exporting" objects -# Exporting objects are: all objects that define symbol tables -# - -# --------------------------------------------------------------------------- -# Check if command line has changed - -# Usage: -# normally one uses rules like -# -# %.o: %.c -# -# -# However, these only rebuild the target when the source has changed, -# but not when e.g. the command or the flags on the command line changed. -# -# This extension allows to do the following: -# -# command = -# -# %.o: %.c dummy -# $(call if_changed,command) -# -# which will make sure to rebuild the target when either its prerequisites -# change or the command line changes -# -# The magic works as follows: -# The addition of dummy to the dependencies causes the rule for rebuilding -# to be always executed. However, the if_changed function will generate -# an empty command when -# o none of the prequesites changed (i.e $? is empty) -# o the command line did not change (we compare the old command line, -# which is saved in ..o, to the current command line using -# the two filter-out commands) - -# Read all saved command lines and dependencies for the $(targets) we -# may be building above, using $(if_changed{,_dep}). As an -# optimization, we don't need to read them if the target does not -# exist, we will rebuild anyway in that case. - -targets := $(wildcard $(sort $(targets))) -cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) - -ifneq ($(cmd_files),) - include $(cmd_files) -endif - -# function to only execute the passed command if necessary - -if_changed = $(if $(strip $? \ - $(filter-out $(cmd_$(1)),$(cmd_$@))\ - $(filter-out $(cmd_$@),$(cmd_$(1)))),\ - @set -e; \ - $(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))';) \ - $(cmd_$(1)); \ - echo 'cmd_$@ := $(cmd_$(1))' > $(@D)/.$(@F).cmd) - - -# execute the command and also postprocess generated .d dependencies -# file - -if_changed_dep = $(if $(strip $? $(filter-out FORCE $(wildcard $^),$^)\ - $(filter-out $(cmd_$(1)),$(cmd_$@))\ - $(filter-out $(cmd_$@),$(cmd_$(1)))),\ - @set -e; \ - $(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))';) \ - $(cmd_$(1)); \ - scripts/fixdep $(depfile) $@ '$(cmd_$(1))' > $(@D)/.$(@F).tmp; \ - rm -f $(depfile); \ - mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd) - -# Usage: $(call if_changed_rule,foo) -# will check if $(cmd_foo) changed, or any of the prequisites changed, -# and if so will execute $(rule_foo) - -if_changed_rule = $(if $(strip $? \ - $(filter-out $(cmd_$(1)),$(cmd_$@))\ - $(filter-out $(cmd_$@),$(cmd_$(1)))),\ - @set -e; \ - mkdir -p $(dir $@); \ - $(rule_$(1))) - -# If quiet is set, only print short version of command - -cmd = @$(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))' &&) $(cmd_$(1)) - -# do_cmd is a shorthand used to support both compressed, verbose -# and silent output in a single line. -# Compared to cmd described avobe, do_cmd does no rely on any variables -# previously assigned a value. -# -# Usage $(call do_cmd,CMD $@,cmd_to_execute bla bla) -# Example: -# $(call do_cmd,CP $@,cp -b $< $@) -# make -s => nothing will be printed -# make KBUILD_VERBOSE=1 => cp -b path/to/src.file path/to/dest.file -# make KBUILD_VERBOSE=0 => CP path/to/dest.file -define do_cmd - @$(if $(filter quiet_,$(quiet)), echo ' $(1)' &&, - $(if $(filter silent_,$(quiet)),, - echo "$(2)" &&)) \ - $(2) -endef - -# $(call descend,,) -# Recursively call a sub-make in with target - -ifeq ($(KBUILD_VERBOSE),1) -descend = echo '$(MAKE) -f $(1)/Makefile $(2)'; -endif -descend += $(MAKE) -f $(1)/Makefile obj=$(1) $(2) - -endif diff -Nru a/arch/i386/Makefile b/arch/i386/Makefile --- a/arch/i386/Makefile Mon Oct 28 16:32:36 2002 +++ b/arch/i386/Makefile Mon Oct 28 16:32:36 2002 @@ -88,6 +88,6 @@ +@$(call makeboot,BOOTIMAGE=$(BOOTIMAGE) install) archclean: - $(MAKE) -rR -f scripts/Makefile.clean obj=arch/i386/boot + @$(MAKE) -f scripts/Makefile.clean obj=arch/i386/boot archmrproper: diff -Nru a/arch/i386/boot/Makefile b/arch/i386/boot/Makefile --- a/arch/i386/boot/Makefile Mon Oct 28 16:32:36 2002 +++ b/arch/i386/boot/Makefile Mon Oct 28 16:32:36 2002 @@ -46,7 +46,7 @@ $(obj)/bzImage: EXTRA_AFLAGS := -traditional $(SVGA_MODE) $(RAMDISK) -D__BIG_KERNEL__ $(obj)/bzImage: BUILDFLAGS := -b -quiet_cmd_image = BUILD $(echo_target) +quiet_cmd_image = BUILD $@ cmd_image = $(obj)/tools/build $(BUILDFLAGS) $(obj)/bootsect $(obj)/setup \ $(obj)/vmlinux.bin $(ROOT_DEV) > $@ diff -Nru a/arch/i386/kernel/apm.c b/arch/i386/kernel/apm.c --- a/arch/i386/kernel/apm.c Mon Oct 28 16:32:35 2002 +++ b/arch/i386/kernel/apm.c Mon Oct 28 16:32:35 2002 @@ -40,6 +40,7 @@ * Nov 2000, Version 1.14 * Oct 2001, Version 1.15 * Jan 2002, Version 1.16 + * Oct 2002, Version 1.16ac * * History: * 0.6b: first version in official kernel, Linux 1.3.46 @@ -177,6 +178,9 @@ * CONFIG_APM_CPU_IDLE now just affects the default value of * idle_threshold (sfr). * Change name of kernel apm daemon (as it no longer idles) (sfr). + * 1.16ac: Fix up SMP support somewhat. You can now force SMP on and we + * make _all_ APM calls on the CPU#0. Fix unsafe sign bug. + * TODO: determine if its "boot CPU" or "CPU0" we want to lock to. * * APM 1.1 Reference: * @@ -250,6 +254,7 @@ * powering off * [no-]debug log some debugging messages * [no-]power[-_]off power off on shutdown + * [no-]smp Use apm even on an SMP box * bounce[-_]interval= number of ticks to ignore suspend * bounces * idle[-_]threshold= System idle percentage above which to @@ -396,6 +401,7 @@ static int got_clock_diff; #endif static int debug; +static int smp; static int apm_disabled = -1; #ifdef CONFIG_SMP static int power_off; @@ -422,7 +428,7 @@ static spinlock_t user_list_lock = SPIN_LOCK_UNLOCKED; static struct desc_struct bad_bios_desc = { 0, 0x00409200 }; -static char driver_version[] = "1.16"; /* no spaces */ +static char driver_version[] = "1.16ac"; /* no spaces */ /* * APM event names taken from the APM 1.2 specification. These are @@ -499,6 +505,38 @@ } /* + * Lock APM functionality to physical CPU 0 + */ + +#ifdef CONFIG_SMP + +static unsigned long apm_save_cpus(void) +{ + unsigned long x = current->cpus_allowed; + /* Some bioses don't like being called from CPU != 0 */ + set_cpus_allowed(current, 1 << 0); + if (unlikely(smp_processor_id() != 0)) + BUG(); + return x; +} + +static inline void apm_restore_cpus(unsigned long mask) +{ + set_cpus_allowed(current, mask); +} + +#else + +/* + * No CPU lockdown needed on a uniprocessor + */ + +#define apm_save_cpus() 0 +#define apm_restore_cpus(x) (void)(x) + +#endif + +/* * These are the actual BIOS calls. Depending on APM_ZERO_SEGS and * apm_info.allow_ints, we are being really paranoid here! Not only * are interrupts disabled, but all the segment registers (except SS) @@ -571,9 +609,12 @@ { APM_DECL_SEGS unsigned long flags; + unsigned long cpus; int cpu; struct desc_struct save_desc_40; + cpus = apm_save_cpus(); + cpu = get_cpu(); save_desc_40 = cpu_gdt_table[cpu][0x40 / 8]; cpu_gdt_table[cpu][0x40 / 8] = bad_bios_desc; @@ -601,6 +642,8 @@ local_irq_restore(flags); cpu_gdt_table[cpu][0x40 / 8] = save_desc_40; put_cpu(); + apm_restore_cpus(cpus); + return *eax & 0xff; } @@ -623,9 +666,13 @@ u8 error; APM_DECL_SEGS unsigned long flags; + unsigned long cpus; int cpu; struct desc_struct save_desc_40; + + cpus = apm_save_cpus(); + cpu = get_cpu(); save_desc_40 = cpu_gdt_table[cpu][0x40 / 8]; cpu_gdt_table[cpu][0x40 / 8] = bad_bios_desc; @@ -657,6 +704,7 @@ local_irq_restore(flags); cpu_gdt_table[smp_processor_id()][0x40 / 8] = save_desc_40; put_cpu(); + apm_restore_cpus(cpus); return error; } @@ -772,7 +820,11 @@ if (apm_bios_call_simple(APM_FUNC_IDLE, 0, 0, &eax)) { static unsigned long t; - if (time_after(jiffies, t + 10 * HZ)) { + /* This always fails on some SMP boards running UP kernels. + * Only report the failure the first 5 times. + */ + if (++t < 5) + { printk(KERN_DEBUG "apm_do_idle failed (%d)\n", (eax >> 8) & 0xff); t = jiffies; @@ -912,14 +964,16 @@ #ifdef CONFIG_SMP /* Some bioses don't like being called from CPU != 0 */ if (smp_processor_id() != 0) { - current->cpus_allowed = 1; - schedule(); + set_cpus_allowed(current, 1 << 0); if (unlikely(smp_processor_id() != 0)) BUG(); } #endif if (apm_info.realmode_power_off) + { + (void)apm_save_cpus(); machine_real_restart(po_bios_call, sizeof(po_bios_call)); + } else (void) set_system_power_state(APM_STATE_OFF); } @@ -1096,6 +1150,19 @@ } if ((error == APM_SUCCESS) || (error == APM_NO_ERROR)) return 1; + if (error == APM_NOT_ENGAGED) { + static int tried; + int eng_error; + if (tried++ == 0) { + eng_error = apm_engage_power_management(APM_DEVICE_ALL, 1); + if (eng_error) { + apm_error("set display", error); + apm_error("engage interface", eng_error); + return 0; + } else + return apm_console_blank(blank); + } + } apm_error("set display", error); return 0; } @@ -1424,7 +1491,7 @@ as = fp->private_data; if (check_apm_user(as, "read")) return -EIO; - if (count < sizeof(apm_event_t)) + if ((int)count < sizeof(apm_event_t)) return -EINVAL; if ((queue_empty(as)) && (fp->f_flags & O_NONBLOCK)) return -EAGAIN; @@ -1693,8 +1760,7 @@ * Method suggested by Ingo Molnar. */ if (smp_processor_id() != 0) { - current->cpus_allowed = 1; - schedule(); + set_cpus_allowed(current, 1 << 0); if (unlikely(smp_processor_id() != 0)) BUG(); } @@ -1746,7 +1812,7 @@ } } - if (debug) { + if (debug && (num_online_cpus() == 1 || smp )) { error = apm_get_power_status(&bx, &cx, &dx); if (error) printk(KERN_INFO "apm: power status not available\n"); @@ -1790,7 +1856,7 @@ pm_power_off = apm_power_off; register_sysrq_key('o', &sysrq_poweroff_op); - if (num_online_cpus() == 1) { + if (num_online_cpus() == 1 || smp) { #if defined(CONFIG_APM_DISPLAY_BLANK) && defined(CONFIG_VT) console_blank_hook = apm_console_blank; #endif @@ -1832,6 +1898,11 @@ if ((strncmp(str, "power-off", 9) == 0) || (strncmp(str, "power_off", 9) == 0)) power_off = !invert; + if (strncmp(str, "smp", 3) == 0) + { + smp = !invert; + idle_threshold = 100; + } if ((strncmp(str, "allow-ints", 10) == 0) || (strncmp(str, "allow_ints", 10) == 0)) apm_info.allow_ints = !invert; @@ -1934,7 +2005,7 @@ printk(KERN_NOTICE "apm: disabled on user request.\n"); return -ENODEV; } - if ((num_online_cpus() > 1) && !power_off) { + if ((num_online_cpus() > 1) && !power_off && !smp) { printk(KERN_NOTICE "apm: disabled - APM is not SMP safe.\n"); return -ENODEV; } @@ -1980,6 +2051,14 @@ (apm_info.bios.cseg_16_len - 1) & 0xffff); _set_limit((char *)&cpu_gdt_table[i][APM_DS >> 3], (apm_info.bios.dseg_len - 1) & 0xffff); + /* workaround for broken BIOSes */ + if (apm_info.bios.cseg_len <= apm_info.bios.offset) + _set_limit((char *)&cpu_gdt_table[i][APM_CS >> 3], 64 * 1024 -1); + if (apm_info.bios.dseg_len <= 0x40) { /* 0x40 * 4kB == 64kB */ + /* for the BIOS that assumes granularity = 1 */ + cpu_gdt_table[i][APM_DS >> 3].b |= 0x800000; + printk(KERN_NOTICE "apm: we set the granularity of dseg.\n"); + } } #endif } @@ -1990,7 +2069,7 @@ kernel_thread(apm, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD); - if (num_online_cpus() > 1) { + if (num_online_cpus() > 1 && !smp ) { printk(KERN_NOTICE "apm: disabled - APM is not SMP safe (power off active).\n"); return 0; @@ -2058,3 +2137,7 @@ MODULE_PARM(idle_period, "i"); MODULE_PARM_DESC(idle_period, "Period (in sec/100) over which to caculate the idle percentage"); +MODULE_PARM(smp, "i"); +MODULE_PARM_DESC(smp, + "Set this to enable APM use on an SMP platform. Use with caution on older systems"); + diff -Nru a/arch/i386/kernel/mca.c b/arch/i386/kernel/mca.c --- a/arch/i386/kernel/mca.c Mon Oct 28 16:32:37 2002 +++ b/arch/i386/kernel/mca.c Mon Oct 28 16:32:37 2002 @@ -194,10 +194,9 @@ #define MCA_STANDARD_RESOURCES (sizeof(mca_standard_resources)/sizeof(struct resource)) -void __init mca_init(void) +int __init mca_init(void) { unsigned int i, j; - unsigned long flags; /* WARNING: Be careful when making changes here. Putting an adapter * and the motherboard simultaneously into setup mode may result in @@ -209,16 +208,16 @@ /* Make sure the MCA bus is present */ if(!MCA_bus) - return; - printk("Micro Channel bus detected.\n"); + return -ENODEV; + printk(KERN_INFO "Micro Channel bus detected.\n"); /* Allocate MCA_info structure (at address divisible by 8) */ mca_info = (struct MCA_info *)kmalloc(sizeof(struct MCA_info), GFP_KERNEL); if(mca_info == NULL) { - printk("Failed to allocate memory for mca_info!"); - return; + printk(KERN_ERR "Failed to allocate memory for mca_info!"); + return -ENOMEM; } memset(mca_info, 0, sizeof(struct MCA_info)); @@ -320,6 +319,8 @@ #ifdef CONFIG_PROC_FS mca_do_proc_init(); #endif + + return 0; } subsys_initcall(mca_init); @@ -329,16 +330,16 @@ static void mca_handle_nmi_slot(int slot, int check_flag) { if(slot < MCA_MAX_SLOT_NR) { - printk("NMI: caused by MCA adapter in slot %d (%s)\n", slot+1, + printk(KERN_CRIT "NMI: caused by MCA adapter in slot %d (%s)\n", slot+1, mca_info->slot[slot].name); } else if(slot == MCA_INTEGSCSI) { - printk("NMI: caused by MCA integrated SCSI adapter (%s)\n", + printk(KERN_CRIT "NMI: caused by MCA integrated SCSI adapter (%s)\n", mca_info->slot[slot].name); } else if(slot == MCA_INTEGVIDEO) { - printk("NMI: caused by MCA integrated video adapter (%s)\n", + printk(KERN_CRIT "NMI: caused by MCA integrated video adapter (%s)\n", mca_info->slot[slot].name); } else if(slot == MCA_MOTHERBOARD) { - printk("NMI: caused by motherboard (%s)\n", + printk(KERN_CRIT "NMI: caused by motherboard (%s)\n", mca_info->slot[slot].name); } @@ -350,7 +351,7 @@ pos6 = mca_read_pos(slot, 6); pos7 = mca_read_pos(slot, 7); - printk("NMI: POS 6 = 0x%x, POS 7 = 0x%x\n", pos6, pos7); + printk(KERN_CRIT "NMI: POS 6 = 0x%x, POS 7 = 0x%x\n", pos6, pos7); } } /* mca_handle_nmi_slot */ @@ -367,21 +368,19 @@ * adapter was responsible for the error. */ - for(i = 0; i < MCA_NUMADAPTERS; i++) { - - /* Bit 7 of POS 5 is reset when this adapter has a hardware - * error. Bit 7 it reset if there's error information - * available in POS 6 and 7. - */ + for(i = 0; i < MCA_NUMADAPTERS; i++) + { + /* Bit 7 of POS 5 is reset when this adapter has a hardware + * error. Bit 7 it reset if there's error information + * available in POS 6 and 7. + */ + pos5 = mca_read_pos(i, 5); - pos5 = mca_read_pos(i, 5); - - if(!(pos5 & 0x80)) { + if(!(pos5 & 0x80)) { mca_handle_nmi_slot(i, !(pos5 & 0x40)); return; } } - mca_nmi_hook(); } /* mca_handle_nmi */ diff -Nru a/arch/i386/mach-voyager/Makefile b/arch/i386/mach-voyager/Makefile --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/mach-voyager/Makefile Mon Oct 28 16:32:38 2002 @@ -0,0 +1,17 @@ +# +# Makefile for the linux kernel. +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (ie not a .c file). +# +# Note 2! The CFLAGS definitions are now in the main makefile... + +EXTRA_CFLAGS += -I../kernel +export-objs := + +obj-y := setup.o voyager_basic.o voyager_thread.o + +obj-$(CONFIG_SMP) += voyager_smp.o voyager_cat.o + +include $(TOPDIR)/Rules.make diff -Nru a/arch/i386/mach-voyager/do_timer.h b/arch/i386/mach-voyager/do_timer.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/mach-voyager/do_timer.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,22 @@ +/* defines for inline arch setup functions */ +#include + +static inline void do_timer_interrupt_hook(struct pt_regs *regs) +{ + do_timer(regs); + + voyager_timer_interrupt(regs); +} + +static inline int do_timer_overflow(int count) +{ + /* can't read the ISR, just assume 1 tick + overflow */ + if(count > LATCH || count < 0) { + printk(KERN_ERR "VOYAGER PROBLEM: count is %d, latch is %d\n", count, LATCH); + count = LATCH; + } + count -= LATCH; + + return count; +} diff -Nru a/arch/i386/mach-voyager/entry_arch.h b/arch/i386/mach-voyager/entry_arch.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/mach-voyager/entry_arch.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,26 @@ +/* -*- mode: c; c-basic-offset: 8 -*- */ + +/* Copyright (C) 2002 + * + * Author: James.Bottomley@HansenPartnership.com + * + * linux/arch/i386/voyager/entry_arch.h + * + * This file builds the VIC and QIC CPI gates + */ + +/* initialise the voyager interrupt gates + * + * This uses the macros in irq.h to set up assembly jump gates. The + * calls are then redirected to the same routine with smp_ prefixed */ +BUILD_INTERRUPT(vic_sys_interrupt, VIC_SYS_INT) +BUILD_INTERRUPT(vic_cmn_interrupt, VIC_CMN_INT) +BUILD_INTERRUPT(vic_cpi_interrupt, VIC_CPI_LEVEL0); + +/* do all the QIC interrupts */ +BUILD_INTERRUPT(qic_timer_interrupt, QIC_TIMER_CPI); +BUILD_INTERRUPT(qic_invalidate_interrupt, QIC_INVALIDATE_CPI); +BUILD_INTERRUPT(qic_reschedule_interrupt, QIC_RESCHEDULE_CPI); +BUILD_INTERRUPT(qic_enable_irq_interrupt, QIC_ENABLE_IRQ_CPI); +BUILD_INTERRUPT(qic_call_function_interrupt, QIC_CALL_FUNCTION_CPI); + diff -Nru a/arch/i386/mach-voyager/irq_vectors.h b/arch/i386/mach-voyager/irq_vectors.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/mach-voyager/irq_vectors.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,71 @@ +/* -*- mode: c; c-basic-offset: 8 -*- */ + +/* Copyright (C) 2002 + * + * Author: James.Bottomley@HansenPartnership.com + * + * linux/arch/i386/voyager/irq_vectors.h + * + * This file provides definitions for the VIC and QIC CPIs + */ + +#ifndef _ASM_IRQ_VECTORS_H +#define _ASM_IRQ_VECTORS_H + +/* + * IDT vectors usable for external interrupt sources start + * at 0x20: + */ +#define FIRST_EXTERNAL_VECTOR 0x20 + +#define SYSCALL_VECTOR 0x80 + +/* + * Vectors 0x20-0x2f are used for ISA interrupts. + */ + +/* These define the CPIs we use in linux */ +#define VIC_CPI_LEVEL0 0 +#define VIC_CPI_LEVEL1 1 +/* now the fake CPIs */ +#define VIC_TIMER_CPI 2 +#define VIC_INVALIDATE_CPI 3 +#define VIC_RESCHEDULE_CPI 4 +#define VIC_ENABLE_IRQ_CPI 5 +#define VIC_CALL_FUNCTION_CPI 6 + +/* Now the QIC CPIs: Since we don't need the two initial levels, + * these are 2 less than the VIC CPIs */ +#define QIC_CPI_OFFSET 1 +#define QIC_TIMER_CPI (VIC_TIMER_CPI - QIC_CPI_OFFSET) +#define QIC_INVALIDATE_CPI (VIC_INVALIDATE_CPI - QIC_CPI_OFFSET) +#define QIC_RESCHEDULE_CPI (VIC_RESCHEDULE_CPI - QIC_CPI_OFFSET) +#define QIC_ENABLE_IRQ_CPI (VIC_ENABLE_IRQ_CPI - QIC_CPI_OFFSET) +#define QIC_CALL_FUNCTION_CPI (VIC_CALL_FUNCTION_CPI - QIC_CPI_OFFSET) + +#define VIC_START_FAKE_CPI VIC_TIMER_CPI +#define VIC_END_FAKE_CPI VIC_CALL_FUNCTION_CPI + +/* this is the SYS_INT CPI. */ +#define VIC_SYS_INT 8 +#define VIC_CMN_INT 15 + +/* This is the boot CPI for alternate processors. It gets overwritten + * by the above once the system has activated all available processors */ +#define VIC_CPU_BOOT_CPI VIC_CPI_LEVEL0 +#define VIC_CPU_BOOT_ERRATA_CPI (VIC_CPI_LEVEL0 + 8) + +#define NR_IRQS 224 + +#ifndef __ASSEMBLY__ +extern asmlinkage void vic_cpi_interrupt(void); +extern asmlinkage void vic_sys_interrupt(void); +extern asmlinkage void vic_cmn_interrupt(void); +extern asmlinkage void qic_timer_interrupt(void); +extern asmlinkage void qic_invalidate_interrupt(void); +extern asmlinkage void qic_reschedule_interrupt(void); +extern asmlinkage void qic_enable_irq_interrupt(void); +extern asmlinkage void qic_call_function_interrupt(void); +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_IRQ_VECTORS_H */ diff -Nru a/arch/i386/mach-voyager/setup.c b/arch/i386/mach-voyager/setup.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/mach-voyager/setup.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,43 @@ +/* + * Machine specific setup for generic + */ + +#include +#include +#include +#include +#include + +void __init pre_intr_init_hook(void) +{ + init_ISA_irqs(); +} + +/* + * IRQ2 is cascade interrupt to second interrupt controller + */ +static struct irqaction irq2 = { no_action, 0, 0, "cascade", NULL, NULL}; + +void __init intr_init_hook(void) +{ +#ifdef CONFIG_SMP + smp_intr_init(); +#endif + + setup_irq(2, &irq2); +} + +void __init pre_setup_arch_hook(void) +{ +} + +void __init trap_init_hook(void) +{ +} + +static struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, 0, "timer", NULL, NULL}; + +void __init time_init_hook(void) +{ + setup_irq(0, &irq0); +} diff -Nru a/arch/i386/mach-voyager/setup_arch_post.h b/arch/i386/mach-voyager/setup_arch_post.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/mach-voyager/setup_arch_post.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,73 @@ +/* Hook for machine specific memory setup. + * + * This is included late in kernel/setup.c so that it can make use of all of + * the static functions. */ + +static inline char * __init machine_specific_memory_setup(void) +{ + char *who; + + who = "NOT VOYAGER"; + + if(voyager_level == 5) { + __u32 addr, length; + int i; + + who = "Voyager-SUS"; + + e820.nr_map = 0; + for(i=0; voyager_memory_detect(i, &addr, &length); i++) { + add_memory_region(addr, length, E820_RAM); + } + return who; + } else if(voyager_level == 4) { + __u32 tom; + __u16 catbase = inb(VOYAGER_SSPB_RELOCATION_PORT)<<8; + /* select the DINO config space */ + outb(VOYAGER_DINO, VOYAGER_CAT_CONFIG_PORT); + /* Read DINO top of memory register */ + tom = ((inb(catbase + 0x4) & 0xf0) << 16) + + ((inb(catbase + 0x5) & 0x7f) << 24); + + if(inb(catbase) != VOYAGER_DINO) { + printk(KERN_ERR "Voyager: Failed to get DINO for L4, setting tom to EXT_MEM_K\n"); + tom = (EXT_MEM_K)<<10; + } + who = "Voyager-TOM"; + add_memory_region(0, 0x9f000, E820_RAM); + /* map from 1M to top of memory */ + add_memory_region(1*1024*1024, tom - 1*1024*1024, E820_RAM); + /* FIXME: Should check the ASICs to see if I need to + * take out the 8M window. Just do it at the moment + * */ + add_memory_region(8*1024*1024, 8*1024*1024, E820_RESERVED); + return who; + } + + who = "BIOS-e820"; + + /* + * Try to copy the BIOS-supplied E820-map. + * + * Otherwise fake a memory map; one section from 0k->640k, + * the next section from 1mb->appropriate_mem_k + */ + sanitize_e820_map(E820_MAP, &E820_MAP_NR); + if (copy_e820_map(E820_MAP, E820_MAP_NR) < 0) { + unsigned long mem_size; + + /* compare results from other methods and take the greater */ + if (ALT_MEM_K < EXT_MEM_K) { + mem_size = EXT_MEM_K; + who = "BIOS-88"; + } else { + mem_size = ALT_MEM_K; + who = "BIOS-e801"; + } + + e820.nr_map = 0; + add_memory_region(0, LOWMEMSIZE(), E820_RAM); + add_memory_region(HIGH_MEMORY, mem_size << 10, E820_RAM); + } + return who; +} diff -Nru a/arch/i386/mach-voyager/setup_arch_pre.h b/arch/i386/mach-voyager/setup_arch_pre.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/mach-voyager/setup_arch_pre.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,10 @@ +#include +#define VOYAGER_BIOS_INFO ((struct voyager_bios_info *)(PARAM+0x40)) + +/* Hook to call BIOS initialisation function */ + +/* for voyager, pass the voyager BIOS/SUS info area to the detection + * routines */ + +#define ARCH_SETUP voyager_detect(VOYAGER_BIOS_INFO); + diff -Nru a/arch/i386/mach-voyager/voyager_basic.c b/arch/i386/mach-voyager/voyager_basic.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/mach-voyager/voyager_basic.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,312 @@ +/* Copyright (C) 1999,2001 + * + * Author: J.E.J.Bottomley@HansenPartnership.com + * + * linux/arch/i386/kernel/voyager.c + * + * This file contains all the voyager specific routines for getting + * initialisation of the architecture to function. For additional + * features see: + * + * voyager_cat.c - Voyager CAT bus interface + * voyager_smp.c - Voyager SMP hal (emulates linux smp.c) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Power off function, if any + */ +void (*pm_power_off)(void); + +int reboot_thru_bios; + +int voyager_level = 0; + +struct voyager_SUS *voyager_SUS = NULL; + +void +voyager_detect(struct voyager_bios_info *bios) +{ + if(bios->len != 0xff) { + int class = (bios->class_1 << 8) + | (bios->class_2 & 0xff); + + printk("Voyager System detected.\n" + " Class %x, Revision %d.%d\n", + class, bios->major, bios->minor); + if(class == VOYAGER_LEVEL4) + voyager_level = 4; + else if(class < VOYAGER_LEVEL5_AND_ABOVE) + voyager_level = 3; + else + voyager_level = 5; + printk(" Architecture Level %d\n", voyager_level); + if(voyager_level < 4) + printk("\n**WARNING**: Voyager HAL only supports Levels 4 and 5 Architectures at the moment\n\n"); + /* install the power off handler */ + pm_power_off = voyager_power_off; + } else { + printk("\n\n**WARNING**: No Voyager Subsystem Found\n"); + } +} + +void +voyager_system_interrupt(int cpl, void *dev_id, struct pt_regs *regs) +{ + printk("Voyager: detected system interrupt\n"); +} + +/* Routine to read information from the extended CMOS area */ +__u8 +voyager_extended_cmos_read(__u16 addr) +{ + outb(addr & 0xff, 0x74); + outb((addr >> 8) & 0xff, 0x75); + return inb(0x76); +} + +/* internal definitions for the SUS Click Map of memory */ + +#define CLICK_ENTRIES 16 +#define CLICK_SIZE 4096 /* click to byte conversion for Length */ + +typedef struct ClickMap { + struct Entry { + __u32 Address; + __u32 Length; + } Entry[CLICK_ENTRIES]; +} ClickMap_t; + + +/* This routine is pretty much an awful hack to read the bios clickmap by + * mapping it into page 0. There are usually three regions in the map: + * Base Memory + * Extended Memory + * zero length marker for end of map + * + * Returns are 0 for failure and 1 for success on extracting region. + */ +int __init +voyager_memory_detect(int region, __u32 *start, __u32 *length) +{ + int i; + int retval = 0; + __u8 cmos[4]; + ClickMap_t *map; + unsigned long map_addr; + unsigned long old; + + if(region >= CLICK_ENTRIES) { + printk("Voyager: Illegal ClickMap region %d\n", region); + return 0; + } + + for(i = 0; i < sizeof(cmos); i++) + cmos[i] = voyager_extended_cmos_read(VOYAGER_MEMORY_CLICKMAP + i); + + map_addr = *(unsigned long *)cmos; + + /* steal page 0 for this */ + old = pg0[0]; + pg0[0] = ((map_addr & PAGE_MASK) | _PAGE_RW | _PAGE_PRESENT); + local_flush_tlb(); + /* now clear everything out but page 0 */ + map = (ClickMap_t *)(map_addr & (~PAGE_MASK)); + + /* zero length is the end of the clickmap */ + if(map->Entry[region].Length != 0) { + *length = map->Entry[region].Length * CLICK_SIZE; + *start = map->Entry[region].Address; + retval = 1; + } + + /* replace the mapping */ + pg0[0] = old; + local_flush_tlb(); + return retval; +} + +void +voyager_dump() +{ + /* get here via a sysrq */ +#ifdef CONFIG_SMP + voyager_smp_dump(); +#endif +} + +/* voyager specific handling code for timer interrupts. Used to hand + * off the timer tick to the SMP code, since the VIC doesn't have an + * internal timer (The QIC does, but that's another story). */ +void +voyager_timer_interrupt(struct pt_regs *regs) +{ + if((jiffies & 0x3ff) == 0) { + + /* There seems to be something flaky in either + * hardware or software that is resetting the timer 0 + * count to something much higher than it should be + * This seems to occur in the boot sequence, just + * before root is mounted. Therefore, every 10 + * seconds or so, we sanity check the timer zero count + * and kick it back to where it should be. + * + * FIXME: This is the most awful hack yet seen. I + * should work out exactly what is interfering with + * the timer count settings early in the boot sequence + * and swiftly introduce it to something sharp and + * pointy. */ + __u16 val; + extern spinlock_t i8253_lock; + + spin_lock(&i8253_lock); + + outb_p(0x00, 0x43); + val = inb_p(0x40); + val |= inb(0x40) << 8; + spin_unlock(&i8253_lock); + + if(val > LATCH) { + printk("\nVOYAGER: countdown timer value too high (%d), resetting\n\n", val); + spin_lock(&i8253_lock); + outb(0x34,0x43); + outb_p(LATCH & 0xff , 0x40); /* LSB */ + outb(LATCH >> 8 , 0x40); /* MSB */ + spin_unlock(&i8253_lock); + } + } +#ifdef CONFIG_SMP + smp_vic_timer_interrupt(regs); +#endif +} + +void +voyager_power_off(void) +{ + printk("VOYAGER Power Off\n"); + + if(voyager_level == 5) { + voyager_cat_power_off(); + } else if(voyager_level == 4) { + /* This doesn't apparently work on most L4 machines, + * but the specs say to do this to get automatic power + * off. Unfortunately, if it doesn't power off the + * machine, it ends up doing a cold restart, which + * isn't really intended, so comment out the code */ +#if 0 + int port; + + + /* enable the voyager Configuration Space */ + outb((inb(VOYAGER_MC_SETUP) & 0xf0) | 0x8, + VOYAGER_MC_SETUP); + /* the port for the power off flag is an offset from the + floating base */ + port = (inb(VOYAGER_SSPB_RELOCATION_PORT) << 8) + 0x21; + /* set the power off flag */ + outb(inb(port) | 0x1, port); +#endif + } + /* and wait for it to happen */ + for(;;) { + __asm("cli"); + __asm("hlt"); + } +} + +/* copied from process.c */ +static inline void +kb_wait(void) +{ + int i; + + for (i=0; i<0x10000; i++) + if ((inb_p(0x64) & 0x02) == 0) + break; +} + +void +machine_restart(char *cmd) +{ + printk("Voyager Warm Restart\n"); + kb_wait(); + + if(voyager_level == 5) { + /* write magic values to the RTC to inform system that + * shutdown is beginning */ + outb(0x8f, 0x70); + outb(0x5 , 0x71); + + udelay(50); + outb(0xfe,0x64); /* pull reset low */ + } else if(voyager_level == 4) { + __u16 catbase = inb(VOYAGER_SSPB_RELOCATION_PORT)<<8; + __u8 basebd = inb(VOYAGER_MC_SETUP); + + outb(basebd | 0x08, VOYAGER_MC_SETUP); + outb(0x02, catbase + 0x21); + } + for(;;) { + asm("cli"); + asm("hlt"); + } +} + +void +mca_nmi_hook(void) +{ + __u8 dumpval __attribute__((unused)) = inb(0xf823); + __u8 swnmi __attribute__((unused)) = inb(0xf813); + extern void show_stack(unsigned long *); + + /* FIXME: assume dump switch pressed */ + /* check to see if the dump switch was pressed */ + VDEBUG(("VOYAGER: dumpval = 0x%x, swnmi = 0x%x\n", dumpval, swnmi)); + /* clear swnmi */ + outb(0xff, 0xf813); + /* tell SUS to ignore dump */ + if(voyager_level == 5 && voyager_SUS != NULL) { + if(voyager_SUS->SUS_mbox == VOYAGER_DUMP_BUTTON_NMI) { + voyager_SUS->kernel_mbox = VOYAGER_NO_COMMAND; + voyager_SUS->kernel_flags |= VOYAGER_OS_IN_PROGRESS; + udelay(1000); + voyager_SUS->kernel_mbox = VOYAGER_IGNORE_DUMP; + voyager_SUS->kernel_flags &= ~VOYAGER_OS_IN_PROGRESS; + } + } + printk(KERN_ERR "VOYAGER: Dump switch pressed, printing CPU%d tracebacks\n", smp_processor_id()); + show_stack(NULL); + show_state(); +} + + + +void +machine_halt(void) +{ + /* treat a halt like a power off */ + machine_power_off(); +} + +void machine_power_off(void) +{ + if (pm_power_off) + pm_power_off(); +} diff -Nru a/arch/i386/mach-voyager/voyager_cat.c b/arch/i386/mach-voyager/voyager_cat.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/mach-voyager/voyager_cat.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,1178 @@ +/* -*- mode: c; c-basic-offset: 8 -*- */ + +/* Copyright (C) 1999,2001 + * + * Author: J.E.J.Bottomley@HansenPartnership.com + * + * linux/arch/i386/kernel/voyager_cat.c + * + * This file contains all the logic for manipulating the CAT bus + * in a level 5 machine. + * + * The CAT bus is a serial configuration and test bus. Its primary + * uses are to probe the initial configuration of the system and to + * diagnose error conditions when a system interrupt occurs. The low + * level interface is fairly primitive, so most of this file consists + * of bit shift manipulations to send and receive packets on the + * serial bus */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef VOYAGER_CAT_DEBUG +#define CDEBUG(x) printk x +#else +#define CDEBUG(x) +#endif + +/* the CAT command port */ +#define CAT_CMD (sspb + 0xe) +/* the CAT data port */ +#define CAT_DATA (sspb + 0xd) + +/* the internal cat functions */ +static void cat_pack(__u8 *msg, __u16 start_bit, __u8 *data, + __u16 num_bits); +static void cat_unpack(__u8 *msg, __u16 start_bit, __u8 *data, + __u16 num_bits); +static void cat_build_header(__u8 *header, const __u16 len, + const __u16 smallest_reg_bits, + const __u16 longest_reg_bits); +static int cat_sendinst(voyager_module_t *modp, voyager_asic_t *asicp, + __u8 reg, __u8 op); +static int cat_getdata(voyager_module_t *modp, voyager_asic_t *asicp, + __u8 reg, __u8 *value); +static int cat_shiftout(__u8 *data, __u16 data_bytes, __u16 header_bytes, + __u8 pad_bits); +static int cat_write(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, + __u8 value); +static int cat_read(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, + __u8 *value); +static int cat_subread(voyager_module_t *modp, voyager_asic_t *asicp, + __u16 offset, __u16 len, void *buf); +static int cat_senddata(voyager_module_t *modp, voyager_asic_t *asicp, + __u8 reg, __u8 value); +static int cat_disconnect(voyager_module_t *modp, voyager_asic_t *asicp); +static int cat_connect(voyager_module_t *modp, voyager_asic_t *asicp); + +static inline const char * +cat_module_name(int module_id) +{ + switch(module_id) { + case 0x10: + return "Processor Slot 0"; + case 0x11: + return "Processor Slot 1"; + case 0x12: + return "Processor Slot 2"; + case 0x13: + return "Processor Slot 4"; + case 0x14: + return "Memory Slot 0"; + case 0x15: + return "Memory Slot 1"; + case 0x18: + return "Primary Microchannel"; + case 0x19: + return "Secondary Microchannel"; + case 0x1a: + return "Power Supply Interface"; + case 0x1c: + return "Processor Slot 5"; + case 0x1d: + return "Processor Slot 6"; + case 0x1e: + return "Processor Slot 7"; + case 0x1f: + return "Processor Slot 8"; + default: + return "Unknown Module"; + } +} + +static int sspb = 0; /* stores the super port location */ +int voyager_8slot = 0; /* set to true if a 51xx monster */ + +voyager_module_t *voyager_cat_list; + +/* the I/O port assignments for the VIC and QIC */ +static struct resource vic_res = { + "Voyager Interrupt Controller", 0xFC00, 0xFC6F }; +static struct resource qic_res = { + "Quad Interrupt Controller", 0xFC70, 0xFCFF }; + +/* This function is used to pack a data bit stream inside a message. + * It writes num_bits of the data buffer in msg starting at start_bit. + * Note: This function assumes that any unused bit in the data stream + * is set to zero so that the ors will work correctly */ +#define BITS_PER_BYTE 8 +static void +cat_pack(__u8 *msg, const __u16 start_bit, __u8 *data, const __u16 num_bits) +{ + /* compute initial shift needed */ + const __u16 offset = start_bit % BITS_PER_BYTE; + __u16 len = num_bits / BITS_PER_BYTE; + __u16 byte = start_bit / BITS_PER_BYTE; + __u16 residue = (num_bits % BITS_PER_BYTE) + offset; + int i; + + /* adjust if we have more than a byte of residue */ + if(residue >= BITS_PER_BYTE) { + residue -= BITS_PER_BYTE; + len++; + } + + /* clear out the bits. We assume here that if len==0 then + * residue >= offset. This is always true for the catbus + * operations */ + msg[byte] &= 0xff << (BITS_PER_BYTE - offset); + msg[byte++] |= data[0] >> offset; + if(len == 0) + return; + for(i = 1; i < len; i++) + msg[byte++] = (data[i-1] << (BITS_PER_BYTE - offset)) + | (data[i] >> offset); + if(residue != 0) { + __u8 mask = 0xff >> residue; + __u8 last_byte = data[i-1] << (BITS_PER_BYTE - offset) + | (data[i] >> offset); + + last_byte &= ~mask; + msg[byte] &= mask; + msg[byte] |= last_byte; + } + return; +} +/* unpack the data again (same arguments as cat_pack()). data buffer + * must be zero populated. + * + * Function: given a message string move to start_bit and copy num_bits into + * data (starting at bit 0 in data). + */ +static void +cat_unpack(__u8 *msg, const __u16 start_bit, __u8 *data, const __u16 num_bits) +{ + /* compute initial shift needed */ + const __u16 offset = start_bit % BITS_PER_BYTE; + __u16 len = num_bits / BITS_PER_BYTE; + const __u8 last_bits = num_bits % BITS_PER_BYTE; + __u16 byte = start_bit / BITS_PER_BYTE; + int i; + + if(last_bits != 0) + len++; + + /* special case: want < 8 bits from msg and we can get it from + * a single byte of the msg */ + if(len == 0 && BITS_PER_BYTE - offset >= num_bits) { + data[0] = msg[byte] << offset; + data[0] &= 0xff >> (BITS_PER_BYTE - num_bits); + return; + } + for(i = 0; i < len; i++) { + /* this annoying if has to be done just in case a read of + * msg one beyond the array causes a panic */ + if(offset != 0) { + data[i] = msg[byte++] << offset; + data[i] |= msg[byte] >> (BITS_PER_BYTE - offset); + } + else { + data[i] = msg[byte++]; + } + } + /* do we need to truncate the final byte */ + if(last_bits != 0) { + data[i-1] &= 0xff << (BITS_PER_BYTE - last_bits); + } + return; +} + +static void +cat_build_header(__u8 *header, const __u16 len, const __u16 smallest_reg_bits, + const __u16 longest_reg_bits) +{ + int i; + __u16 start_bit = (smallest_reg_bits - 1) % BITS_PER_BYTE; + __u8 *last_byte = &header[len - 1]; + + if(start_bit == 0) + start_bit = 1; /* must have at least one bit in the hdr */ + + for(i=0; i < len; i++) + header[i] = 0; + + for(i = start_bit; i > 0; i--) + *last_byte = ((*last_byte) << 1) + 1; + +} + +static int +cat_sendinst(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, __u8 op) +{ + __u8 parity, inst, inst_buf[4] = { 0 }; + __u8 iseq[VOYAGER_MAX_SCAN_PATH], hseq[VOYAGER_MAX_REG_SIZE]; + __u16 ibytes, hbytes, padbits; + int i; + + /* + * Parity is the parity of the register number + 1 (READ_REGISTER + * and WRITE_REGISTER always add '1' to the number of bits == 1) + */ + parity = (__u8)(1 + (reg & 0x01) + + ((__u8)(reg & 0x02) >> 1) + + ((__u8)(reg & 0x04) >> 2) + + ((__u8)(reg & 0x08) >> 3)) % 2; + + inst = ((parity << 7) | (reg << 2) | op); + + outb(VOYAGER_CAT_IRCYC, CAT_CMD); + if(!modp->scan_path_connected) { + if(asicp->asic_id != VOYAGER_CAT_ID) { + printk("**WARNING***: cat_sendinst has disconnected scan path not to CAT asic\n"); + return 1; + } + outb(VOYAGER_CAT_HEADER, CAT_DATA); + outb(inst, CAT_DATA); + if(inb(CAT_DATA) != VOYAGER_CAT_HEADER) { + CDEBUG(("VOYAGER CAT: cat_sendinst failed to get CAT_HEADER\n")); + return 1; + } + return 0; + } + ibytes = modp->inst_bits / BITS_PER_BYTE; + if((padbits = modp->inst_bits % BITS_PER_BYTE) != 0) { + padbits = BITS_PER_BYTE - padbits; + ibytes++; + } + hbytes = modp->largest_reg / BITS_PER_BYTE; + if(modp->largest_reg % BITS_PER_BYTE) + hbytes++; + CDEBUG(("cat_sendinst: ibytes=%d, hbytes=%d\n", ibytes, hbytes)); + /* initialise the instruction sequence to 0xff */ + for(i=0; i < ibytes + hbytes; i++) + iseq[i] = 0xff; + cat_build_header(hseq, hbytes, modp->smallest_reg, modp->largest_reg); + cat_pack(iseq, modp->inst_bits, hseq, hbytes * BITS_PER_BYTE); + inst_buf[0] = inst; + inst_buf[1] = 0xFF >> (modp->largest_reg % BITS_PER_BYTE); + cat_pack(iseq, asicp->bit_location, inst_buf, asicp->ireg_length); +#ifdef VOYAGER_CAT_DEBUG + printk("ins = 0x%x, iseq: ", inst); + for(i=0; i< ibytes + hbytes; i++) + printk("0x%x ", iseq[i]); + printk("\n"); +#endif + if(cat_shiftout(iseq, ibytes, hbytes, padbits)) { + CDEBUG(("VOYAGER CAT: cat_sendinst: cat_shiftout failed\n")); + return 1; + } + CDEBUG(("CAT SHIFTOUT DONE\n")); + return 0; +} + +static int +cat_getdata(voyager_module_t *modp, voyager_asic_t *asicp, __u8 reg, + __u8 *value) +{ + if(!modp->scan_path_connected) { + if(asicp->asic_id != VOYAGER_CAT_ID) { + CDEBUG(("VOYAGER CAT: ERROR: cat_getdata to CAT asic with scan path connected\n")); + return 1; + } + if(reg > VOYAGER_SUBADDRHI) + outb(VOYAGER_CAT_RUN, CAT_CMD); + outb(VOYAGER_CAT_DRCYC, CAT_CMD); + outb(VOYAGER_CAT_HEADER, CAT_DATA); + *value = inb(CAT_DATA); + outb(0xAA, CAT_DATA); + if(inb(CAT_DATA) != VOYAGER_CAT_HEADER) { + CDEBUG(("cat_getdata: failed to get VOYAGER_CAT_HEADER\n")); + return 1; + } + return 0; + } + else { + __u16 sbits = modp->num_asics -1 + asicp->ireg_length; + __u16 sbytes = sbits / BITS_PER_BYTE; + __u16 tbytes; + __u8 string[VOYAGER_MAX_SCAN_PATH], trailer[VOYAGER_MAX_REG_SIZE]; + __u8 padbits; + int i; + + outb(VOYAGER_CAT_DRCYC, CAT_CMD); + + if((padbits = sbits % BITS_PER_BYTE) != 0) { + padbits = BITS_PER_BYTE - padbits; + sbytes++; + } + tbytes = asicp->ireg_length / BITS_PER_BYTE; + if(asicp->ireg_length % BITS_PER_BYTE) + tbytes++; + CDEBUG(("cat_getdata: tbytes = %d, sbytes = %d, padbits = %d\n", + tbytes, sbytes, padbits)); + cat_build_header(trailer, tbytes, 1, asicp->ireg_length); + + + for(i = tbytes - 1; i >= 0; i--) { + outb(trailer[i], CAT_DATA); + string[sbytes + i] = inb(CAT_DATA); + } + + for(i = sbytes - 1; i >= 0; i--) { + outb(0xaa, CAT_DATA); + string[i] = inb(CAT_DATA); + } + *value = 0; + cat_unpack(string, padbits + (tbytes * BITS_PER_BYTE) + asicp->asic_location, value, asicp->ireg_length); +#ifdef VOYAGER_CAT_DEBUG + printk("value=0x%x, string: ", *value); + for(i=0; i< tbytes+sbytes; i++) + printk("0x%x ", string[i]); + printk("\n"); +#endif + + /* sanity check the rest of the return */ + for(i=0; i < tbytes; i++) { + __u8 input = 0; + + cat_unpack(string, padbits + (i * BITS_PER_BYTE), &input, BITS_PER_BYTE); + if(trailer[i] != input) { + CDEBUG(("cat_getdata: failed to sanity check rest of ret(%d) 0x%x != 0x%x\n", i, input, trailer[i])); + return 1; + } + } + CDEBUG(("cat_getdata DONE\n")); + return 0; + } +} + +static int +cat_shiftout(__u8 *data, __u16 data_bytes, __u16 header_bytes, __u8 pad_bits) +{ + int i; + + for(i = data_bytes + header_bytes - 1; i >= header_bytes; i--) + outb(data[i], CAT_DATA); + + for(i = header_bytes - 1; i >= 0; i--) { + __u8 header = 0; + __u8 input; + + outb(data[i], CAT_DATA); + input = inb(CAT_DATA); + CDEBUG(("cat_shiftout: returned 0x%x\n", input)); + cat_unpack(data, ((data_bytes + i) * BITS_PER_BYTE) - pad_bits, + &header, BITS_PER_BYTE); + if(input != header) { + CDEBUG(("VOYAGER CAT: cat_shiftout failed to return header 0x%x != 0x%x\n", input, header)); + return 1; + } + } + return 0; +} + +static int +cat_senddata(voyager_module_t *modp, voyager_asic_t *asicp, + __u8 reg, __u8 value) +{ + outb(VOYAGER_CAT_DRCYC, CAT_CMD); + if(!modp->scan_path_connected) { + if(asicp->asic_id != VOYAGER_CAT_ID) { + CDEBUG(("VOYAGER CAT: ERROR: scan path disconnected when asic != CAT\n")); + return 1; + } + outb(VOYAGER_CAT_HEADER, CAT_DATA); + outb(value, CAT_DATA); + if(inb(CAT_DATA) != VOYAGER_CAT_HEADER) { + CDEBUG(("cat_senddata: failed to get correct header response to sent data\n")); + return 1; + } + if(reg > VOYAGER_SUBADDRHI) { + outb(VOYAGER_CAT_RUN, CAT_CMD); + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + } + + return 0; + } + else { + __u16 hbytes = asicp->ireg_length / BITS_PER_BYTE; + __u16 dbytes = (modp->num_asics - 1 + asicp->ireg_length)/BITS_PER_BYTE; + __u8 padbits, dseq[VOYAGER_MAX_SCAN_PATH], + hseq[VOYAGER_MAX_REG_SIZE]; + int i; + + if((padbits = (modp->num_asics - 1 + + asicp->ireg_length) % BITS_PER_BYTE) != 0) { + padbits = BITS_PER_BYTE - padbits; + dbytes++; + } + if(asicp->ireg_length % BITS_PER_BYTE) + hbytes++; + + cat_build_header(hseq, hbytes, 1, asicp->ireg_length); + + for(i = 0; i < dbytes + hbytes; i++) + dseq[i] = 0xff; + CDEBUG(("cat_senddata: dbytes=%d, hbytes=%d, padbits=%d\n", + dbytes, hbytes, padbits)); + cat_pack(dseq, modp->num_asics - 1 + asicp->ireg_length, + hseq, hbytes * BITS_PER_BYTE); + cat_pack(dseq, asicp->asic_location, &value, + asicp->ireg_length); +#ifdef VOYAGER_CAT_DEBUG + printk("dseq "); + for(i=0; i 1) { + /* set auto increment */ + __u8 newval; + + if(cat_read(modp, asicp, VOYAGER_AUTO_INC_REG, &val)) { + CDEBUG(("cat_subaddrsetup: read of VOYAGER_AUTO_INC_REG failed\n")); + return 1; + } + CDEBUG(("cat_subaddrsetup: VOYAGER_AUTO_INC_REG = 0x%x\n", val)); + newval = val | VOYAGER_AUTO_INC; + if(newval != val) { + if(cat_write(modp, asicp, VOYAGER_AUTO_INC_REG, val)) { + CDEBUG(("cat_subaddrsetup: write to VOYAGER_AUTO_INC_REG failed\n")); + return 1; + } + } + } + if(cat_write(modp, asicp, VOYAGER_SUBADDRLO, (__u8)(offset &0xff))) { + CDEBUG(("cat_subaddrsetup: write to SUBADDRLO failed\n")); + return 1; + } + if(asicp->subaddr > VOYAGER_SUBADDR_LO) { + if(cat_write(modp, asicp, VOYAGER_SUBADDRHI, (__u8)(offset >> 8))) { + CDEBUG(("cat_subaddrsetup: write to SUBADDRHI failed\n")); + return 1; + } + cat_read(modp, asicp, VOYAGER_SUBADDRHI, &val); + CDEBUG(("cat_subaddrsetup: offset = %d, hi = %d\n", offset, val)); + } + cat_read(modp, asicp, VOYAGER_SUBADDRLO, &val); + CDEBUG(("cat_subaddrsetup: offset = %d, lo = %d\n", offset, val)); + return 0; +} + +static int +cat_subwrite(voyager_module_t *modp, voyager_asic_t *asicp, __u16 offset, + __u16 len, void *buf) +{ + int i, retval; + + /* FIXME: need special actions for VOYAGER_CAT_ID here */ + if(asicp->asic_id == VOYAGER_CAT_ID) { + CDEBUG(("cat_subwrite: ATTEMPT TO WRITE TO CAT ASIC\n")); + /* FIXME -- This is supposed to be handled better + * There is a problem writing to the cat asic in the + * PSI. The 30us delay seems to work, though */ + udelay(30); + } + + if((retval = cat_subaddrsetup(modp, asicp, offset, len)) != 0) { + printk("cat_subwrite: cat_subaddrsetup FAILED\n"); + return retval; + } + + if(cat_sendinst(modp, asicp, VOYAGER_SUBADDRDATA, VOYAGER_WRITE_CONFIG)) { + printk("cat_subwrite: cat_sendinst FAILED\n"); + return 1; + } + for(i = 0; i < len; i++) { + if(cat_senddata(modp, asicp, 0xFF, ((__u8 *)buf)[i])) { + printk("cat_subwrite: cat_sendata element at %d FAILED\n", i); + return 1; + } + } + return 0; +} +static int +cat_subread(voyager_module_t *modp, voyager_asic_t *asicp, __u16 offset, + __u16 len, void *buf) +{ + int i, retval; + + if((retval = cat_subaddrsetup(modp, asicp, offset, len)) != 0) { + CDEBUG(("cat_subread: cat_subaddrsetup FAILED\n")); + return retval; + } + + if(cat_sendinst(modp, asicp, VOYAGER_SUBADDRDATA, VOYAGER_READ_CONFIG)) { + CDEBUG(("cat_subread: cat_sendinst failed\n")); + return 1; + } + for(i = 0; i < len; i++) { + if(cat_getdata(modp, asicp, 0xFF, + &((__u8 *)buf)[i])) { + CDEBUG(("cat_subread: cat_getdata element %d failed\n", i)); + return 1; + } + } + return 0; +} + + +/* buffer for storing EPROM data read in during initialisation */ +static __initdata __u8 eprom_buf[0xFFFF]; +static voyager_module_t *voyager_initial_module; + +/* Initialise the cat bus components. We assume this is called by the + * boot cpu *after* all memory initialisation has been done (so we can + * use kmalloc) but before smp initialisation, so we can probe the SMP + * configuration and pick up necessary information. */ +void +voyager_cat_init(void) +{ + voyager_module_t **modpp = &voyager_initial_module; + voyager_asic_t **asicpp; + voyager_asic_t *qabc_asic = NULL; + int i, j; + unsigned long qic_addr = 0; + __u8 qabc_data[0x20]; + __u8 num_submodules, val; + voyager_eprom_hdr_t *eprom_hdr = (voyager_eprom_hdr_t *)&eprom_buf[0]; + + __u8 cmos[4]; + unsigned long addr; + + /* initiallise the SUS mailbox */ + for(i=0; iSUS_version); + voyager_SUS->kernel_version = VOYAGER_MAILBOX_VERSION; + voyager_SUS->kernel_flags = VOYAGER_OS_HAS_SYSINT; + } + + /* clear the processor counts */ + voyager_extended_vic_processors = 0; + voyager_quad_processors = 0; + + + + printk("VOYAGER: beginning CAT bus probe\n"); + /* set up the SuperSet Port Block which tells us where the + * CAT communication port is */ + sspb = inb(VOYAGER_SSPB_RELOCATION_PORT) * 0x100; + VDEBUG(("VOYAGER DEBUG: sspb = 0x%x\n", sspb)); + + /* now find out if were 8 slot or normal */ + if((inb(VIC_PROC_WHO_AM_I) & EIGHT_SLOT_IDENTIFIER) + == EIGHT_SLOT_IDENTIFIER) { + voyager_8slot = 1; + printk(KERN_NOTICE "Voyager: Eight slot 51xx configuration detected\n"); + } + + for(i = VOYAGER_MIN_MODULE; + i <= VOYAGER_MAX_MODULE; i++) { + __u8 input; + int asic; + __u16 eprom_size; + __u16 sp_offset; + + outb(VOYAGER_CAT_DESELECT, VOYAGER_CAT_CONFIG_PORT); + outb(i, VOYAGER_CAT_CONFIG_PORT); + + /* check the presence of the module */ + outb(VOYAGER_CAT_RUN, CAT_CMD); + outb(VOYAGER_CAT_IRCYC, CAT_CMD); + outb(VOYAGER_CAT_HEADER, CAT_DATA); + /* stream series of alternating 1's and 0's to stimulate + * response */ + outb(0xAA, CAT_DATA); + input = inb(CAT_DATA); + outb(VOYAGER_CAT_END, CAT_CMD); + if(input != VOYAGER_CAT_HEADER) { + continue; + } + CDEBUG(("VOYAGER DEBUG: found module id 0x%x, %s\n", i, + cat_module_name(i))); + *modpp = kmalloc(sizeof(voyager_module_t), GFP_KERNEL); /*&voyager_module_storage[cat_count++];*/ + if(*modpp == NULL) { + printk("**WARNING** kmalloc failure in cat_init\n"); + continue; + } + memset(*modpp, 0, sizeof(voyager_module_t)); + /* need temporary asic for cat_subread. It will be + * filled in correctly later */ + (*modpp)->asic = kmalloc(sizeof(voyager_asic_t), GFP_KERNEL); /*&voyager_asic_storage[asic_count];*/ + if((*modpp)->asic == NULL) { + printk("**WARNING** kmalloc failure in cat_init\n"); + continue; + } + memset((*modpp)->asic, 0, sizeof(voyager_asic_t)); + (*modpp)->asic->asic_id = VOYAGER_CAT_ID; + (*modpp)->asic->subaddr = VOYAGER_SUBADDR_HI; + (*modpp)->module_addr = i; + (*modpp)->scan_path_connected = 0; + if(i == VOYAGER_PSI) { + /* Exception leg for modules with no EEPROM */ + printk("Module \"%s\"\n", cat_module_name(i)); + continue; + } + + CDEBUG(("cat_init: Reading eeprom for module 0x%x at offset %d\n", i, VOYAGER_XSUM_END_OFFSET)); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(*modpp, (*modpp)->asic); + if(cat_subread(*modpp, (*modpp)->asic, + VOYAGER_XSUM_END_OFFSET, sizeof(eprom_size), + &eprom_size)) { + printk("**WARNING**: Voyager couldn't read EPROM size for module 0x%x\n", i); + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + if(eprom_size > sizeof(eprom_buf)) { + printk("**WARNING**: Voyager insufficient size to read EPROM data, module 0x%x. Need %d\n", i, eprom_size); + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + CDEBUG(("cat_init: module 0x%x, eeprom_size %d\n", i, eprom_size)); + if(cat_subread(*modpp, (*modpp)->asic, 0, + eprom_size, eprom_buf)) { + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + outb(VOYAGER_CAT_END, CAT_CMD); + printk("Module \"%s\", version 0x%x, tracer 0x%x, asics %d\n", + cat_module_name(i), eprom_hdr->version_id, + *((__u32 *)eprom_hdr->tracer), eprom_hdr->num_asics); + (*modpp)->ee_size = eprom_hdr->ee_size; + (*modpp)->num_asics = eprom_hdr->num_asics; + asicpp = &((*modpp)->asic); + sp_offset = eprom_hdr->scan_path_offset; + /* All we really care about are the Quad cards. We + * identify them because they are in a processor slot + * and have only four asics */ + if((i < 0x10 || (i>=0x14 && i < 0x1c) || i>0x1f)) { + modpp = &((*modpp)->next); + continue; + } + /* Now we know it's in a processor slot, does it have + * a quad baseboard submodule */ + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_read(*modpp, (*modpp)->asic, VOYAGER_SUBMODPRESENT, + &num_submodules); + /* lowest two bits, active low */ + num_submodules = ~(0xfc | num_submodules); + CDEBUG(("VOYAGER CAT: %d submodules present\n", num_submodules)); + if(num_submodules == 0) { + /* fill in the dyadic extended processors */ + __u8 cpu = i & 0x07; + + printk("Module \"%s\": Dyadic Processor Card\n", + cat_module_name(i)); + voyager_extended_vic_processors |= (1<asic, VOYAGER_SUBMODSELECT, &val); + CDEBUG(("cat_init: SUBMODSELECT value = 0x%x\n", val)); + val = (val & 0x7c) | VOYAGER_QUAD_BASEBOARD; + cat_write(*modpp, (*modpp)->asic, VOYAGER_SUBMODSELECT, val); + + outb(VOYAGER_CAT_END, CAT_CMD); + + + CDEBUG(("cat_init: Reading eeprom for module 0x%x at offset %d\n", i, VOYAGER_XSUM_END_OFFSET)); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(*modpp, (*modpp)->asic); + if(cat_subread(*modpp, (*modpp)->asic, + VOYAGER_XSUM_END_OFFSET, sizeof(eprom_size), + &eprom_size)) { + printk("**WARNING**: Voyager couldn't read EPROM size for module 0x%x\n", i); + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + if(eprom_size > sizeof(eprom_buf)) { + printk("**WARNING**: Voyager insufficient size to read EPROM data, module 0x%x. Need %d\n", i, eprom_size); + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + CDEBUG(("cat_init: module 0x%x, eeprom_size %d\n", i, eprom_size)); + if(cat_subread(*modpp, (*modpp)->asic, 0, + eprom_size, eprom_buf)) { + outb(VOYAGER_CAT_END, CAT_CMD); + continue; + } + outb(VOYAGER_CAT_END, CAT_CMD); + /* Now do everything for the QBB submodule 1 */ + (*modpp)->ee_size = eprom_hdr->ee_size; + (*modpp)->num_asics = eprom_hdr->num_asics; + asicpp = &((*modpp)->asic); + sp_offset = eprom_hdr->scan_path_offset; + /* get rid of the dummy CAT asic and read the real one */ + kfree((*modpp)->asic); + for(asic=0; asic < (*modpp)->num_asics; asic++) { + int j; + voyager_asic_t *asicp = *asicpp + = kmalloc(sizeof(voyager_asic_t), GFP_KERNEL); /*&voyager_asic_storage[asic_count++];*/ + voyager_sp_table_t *sp_table; + voyager_at_t *asic_table; + voyager_jtt_t *jtag_table; + + if(asicp == NULL) { + printk("**WARNING** kmalloc failure in cat_init\n"); + continue; + } + memset(asicp, 0, sizeof(voyager_asic_t)); + asicpp = &(asicp->next); + asicp->asic_location = asic; + sp_table = (voyager_sp_table_t *)(eprom_buf + sp_offset); + asicp->asic_id = sp_table->asic_id; + asic_table = (voyager_at_t *)(eprom_buf + sp_table->asic_data_offset); + for(j=0; j<4; j++) + asicp->jtag_id[j] = asic_table->jtag_id[j]; + jtag_table = (voyager_jtt_t *)(eprom_buf + asic_table->jtag_offset); + asicp->ireg_length = jtag_table->ireg_len; + asicp->bit_location = (*modpp)->inst_bits; + (*modpp)->inst_bits += asicp->ireg_length; + if(asicp->ireg_length > (*modpp)->largest_reg) + (*modpp)->largest_reg = asicp->ireg_length; + if (asicp->ireg_length < (*modpp)->smallest_reg || + (*modpp)->smallest_reg == 0) + (*modpp)->smallest_reg = asicp->ireg_length; + CDEBUG(("asic 0x%x, ireg_length=%d, bit_location=%d\n", + asicp->asic_id, asicp->ireg_length, + asicp->bit_location)); + if(asicp->asic_id == VOYAGER_QUAD_QABC) { + CDEBUG(("VOYAGER CAT: QABC ASIC found\n")); + qabc_asic = asicp; + } + sp_offset += sizeof(voyager_sp_table_t); + } + CDEBUG(("Module inst_bits = %d, largest_reg = %d, smallest_reg=%d\n", + (*modpp)->inst_bits, (*modpp)->largest_reg, + (*modpp)->smallest_reg)); + /* OK, now we have the QUAD ASICs set up, use them. + * we need to: + * + * 1. Find the Memory area for the Quad CPIs. + * 2. Find the Extended VIC processor + * 3. Configure a second extended VIC processor (This + * cannot be done for the 51xx. + * */ + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_connect(*modpp, (*modpp)->asic); + CDEBUG(("CAT CONNECTED!!\n")); + cat_subread(*modpp, qabc_asic, 0, sizeof(qabc_data), qabc_data); + qic_addr = qabc_data[5] << 8; + qic_addr = (qic_addr | qabc_data[6]) << 8; + qic_addr = (qic_addr | qabc_data[7]) << 8; + printk("Module \"%s\": Quad Processor Card; CPI 0x%lx, SET=0x%x\n", + cat_module_name(i), qic_addr, qabc_data[8]); +#if 0 /* plumbing fails---FIXME */ + if((qabc_data[8] & 0xf0) == 0) { + /* FIXME: 32 way 8 CPU slot monster cannot be + * plumbed this way---need to check for it */ + + printk("Plumbing second Extended Quad Processor\n"); + /* second VIC line hardwired to Quad CPU 1 */ + qabc_data[8] |= 0x20; + cat_subwrite(*modpp, qabc_asic, 8, 1, &qabc_data[8]); +#ifdef VOYAGER_CAT_DEBUG + /* verify plumbing */ + cat_subread(*modpp, qabc_asic, 8, 1, &qabc_data[8]); + if((qabc_data[8] & 0xf0) == 0) { + CDEBUG(("PLUMBING FAILED: 0x%x\n", qabc_data[8])); + } +#endif + } +#endif + + { + struct resource *res = kmalloc(sizeof(struct resource),GFP_KERNEL); + memset(res, 0, sizeof(struct resource)); + res->name = kmalloc(128, GFP_KERNEL); + sprintf((char *)res->name, "Voyager %s Quad CPI", cat_module_name(i)); + res->start = qic_addr; + res->end = qic_addr + 0x3ff; + request_resource(&iomem_resource, res); + } + + qic_addr = (unsigned long)ioremap(qic_addr, 0x400); + + for(j = 0; j < 4; j++) { + __u8 cpu; + + if(voyager_8slot) { + /* 8 slot has a different mapping, + * each slot has only one vic line, so + * 1 cpu in each slot must be < 8 */ + cpu = (i & 0x07) + j*8; + } else { + cpu = (i & 0x03) + j*4; + } + if( (qabc_data[8] & (1<next); + } + *modpp = NULL; + printk("CAT Bus Initialisation finished: extended procs 0x%x, quad procs 0x%x, allowed vic boot = 0x%x\n", voyager_extended_vic_processors, voyager_quad_processors, voyager_allowed_boot_processors); + request_resource(&ioport_resource, &vic_res); + if(voyager_quad_processors) + request_resource(&ioport_resource, &qic_res); + /* set up the front power switch */ +} + +int +voyager_cat_readb(__u8 module, __u8 asic, int reg) +{ + return 0; +} + +static int +cat_disconnect(voyager_module_t *modp, voyager_asic_t *asicp) +{ + __u8 val; + int err = 0; + + if(!modp->scan_path_connected) + return 0; + if(asicp->asic_id != VOYAGER_CAT_ID) { + CDEBUG(("cat_disconnect: ASIC is not CAT\n")); + return 1; + } + err = cat_read(modp, asicp, VOYAGER_SCANPATH, &val); + if(err) { + CDEBUG(("cat_disconnect: failed to read SCANPATH\n")); + return err; + } + val &= VOYAGER_DISCONNECT_ASIC; + err = cat_write(modp, asicp, VOYAGER_SCANPATH, val); + if(err) { + CDEBUG(("cat_disconnect: failed to write SCANPATH\n")); + return err; + } + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + modp->scan_path_connected = 0; + + return 0; +} + +static int +cat_connect(voyager_module_t *modp, voyager_asic_t *asicp) +{ + __u8 val; + int err = 0; + + if(modp->scan_path_connected) + return 0; + if(asicp->asic_id != VOYAGER_CAT_ID) { + CDEBUG(("cat_connect: ASIC is not CAT\n")); + return 1; + } + + err = cat_read(modp, asicp, VOYAGER_SCANPATH, &val); + if(err) { + CDEBUG(("cat_connect: failed to read SCANPATH\n")); + return err; + } + val |= VOYAGER_CONNECT_ASIC; + err = cat_write(modp, asicp, VOYAGER_SCANPATH, val); + if(err) { + CDEBUG(("cat_connect: failed to write SCANPATH\n")); + return err; + } + outb(VOYAGER_CAT_END, CAT_CMD); + outb(VOYAGER_CAT_RUN, CAT_CMD); + modp->scan_path_connected = 1; + + return 0; +} + +void +voyager_cat_power_off(void) +{ + /* Power the machine off by writing to the PSI over the CAT + * bus */ + __u8 data; + voyager_module_t psi = { 0 }; + voyager_asic_t psi_asic = { 0 }; + + psi.asic = &psi_asic; + psi.asic->asic_id = VOYAGER_CAT_ID; + psi.asic->subaddr = VOYAGER_SUBADDR_HI; + psi.module_addr = VOYAGER_PSI; + psi.scan_path_connected = 0; + + outb(VOYAGER_CAT_END, CAT_CMD); + /* Connect the PSI to the CAT Bus */ + outb(VOYAGER_CAT_DESELECT, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_PSI, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(&psi, &psi_asic); + /* Read the status */ + cat_subread(&psi, &psi_asic, VOYAGER_PSI_GENERAL_REG, 1, &data); + outb(VOYAGER_CAT_END, CAT_CMD); + CDEBUG(("PSI STATUS 0x%x\n", data)); + /* These two writes are power off prep and perform */ + data = PSI_CLEAR; + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_subwrite(&psi, &psi_asic, VOYAGER_PSI_GENERAL_REG, 1, &data); + outb(VOYAGER_CAT_END, CAT_CMD); + data = PSI_POWER_DOWN; + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_subwrite(&psi, &psi_asic, VOYAGER_PSI_GENERAL_REG, 1, &data); + outb(VOYAGER_CAT_END, CAT_CMD); +} + +struct voyager_status voyager_status = { 0 }; + +void +voyager_cat_psi(__u8 cmd, __u16 reg, __u8 *data) +{ + voyager_module_t psi = { 0 }; + voyager_asic_t psi_asic = { 0 }; + + psi.asic = &psi_asic; + psi.asic->asic_id = VOYAGER_CAT_ID; + psi.asic->subaddr = VOYAGER_SUBADDR_HI; + psi.module_addr = VOYAGER_PSI; + psi.scan_path_connected = 0; + + outb(VOYAGER_CAT_END, CAT_CMD); + /* Connect the PSI to the CAT Bus */ + outb(VOYAGER_CAT_DESELECT, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_PSI, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(&psi, &psi_asic); + switch(cmd) { + case VOYAGER_PSI_READ: + cat_read(&psi, &psi_asic, reg, data); + break; + case VOYAGER_PSI_WRITE: + cat_write(&psi, &psi_asic, reg, *data); + break; + case VOYAGER_PSI_SUBREAD: + cat_subread(&psi, &psi_asic, reg, 1, data); + break; + case VOYAGER_PSI_SUBWRITE: + cat_subwrite(&psi, &psi_asic, reg, 1, data); + break; + default: + printk(KERN_ERR "Voyager PSI, unrecognised command %d\n", cmd); + break; + } + outb(VOYAGER_CAT_END, CAT_CMD); +} + +void +voyager_cat_do_common_interrupt(void) +{ + /* This is caused either by a memory parity error or something + * in the PSI */ + __u8 data; + voyager_module_t psi = { 0 }; + voyager_asic_t psi_asic = { 0 }; + struct voyager_psi psi_reg; + int i; + re_read: + psi.asic = &psi_asic; + psi.asic->asic_id = VOYAGER_CAT_ID; + psi.asic->subaddr = VOYAGER_SUBADDR_HI; + psi.module_addr = VOYAGER_PSI; + psi.scan_path_connected = 0; + + outb(VOYAGER_CAT_END, CAT_CMD); + /* Connect the PSI to the CAT Bus */ + outb(VOYAGER_CAT_DESELECT, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_PSI, VOYAGER_CAT_CONFIG_PORT); + outb(VOYAGER_CAT_RUN, CAT_CMD); + cat_disconnect(&psi, &psi_asic); + /* Read the status. NOTE: Need to read *all* the PSI regs here + * otherwise the cmn int will be reasserted */ + for(i = 0; i < sizeof(psi_reg.regs); i++) { + cat_read(&psi, &psi_asic, i, &((__u8 *)&psi_reg.regs)[i]); + } + outb(VOYAGER_CAT_END, CAT_CMD); + if((psi_reg.regs.checkbit & 0x02) == 0) { + psi_reg.regs.checkbit |= 0x02; + cat_write(&psi, &psi_asic, 5, psi_reg.regs.checkbit); + printk("VOYAGER RE-READ PSI\n"); + goto re_read; + } + outb(VOYAGER_CAT_RUN, CAT_CMD); + for(i = 0; i < sizeof(psi_reg.subregs); i++) { + /* This looks strange, but the PSI doesn't do auto increment + * correctly */ + cat_subread(&psi, &psi_asic, VOYAGER_PSI_SUPPLY_REG + i, + 1, &((__u8 *)&psi_reg.subregs)[i]); + } + outb(VOYAGER_CAT_END, CAT_CMD); +#ifdef VOYAGER_CAT_DEBUG + printk("VOYAGER PSI: "); + for(i=0; i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +int reboot_smp = 0; + +/* TLB state -- visible externally, indexed physically */ +struct tlb_state cpu_tlbstate[NR_CPUS] __cacheline_aligned = {[0 ... NR_CPUS-1] = { &init_mm, 0 }}; + +/* CPU IRQ affinity -- set to all ones initially */ +static unsigned long cpu_irq_affinity[NR_CPUS] __cacheline_aligned = { [0 ... NR_CPUS-1] = ~0UL }; + +/* Set when the idlers are all forked - Set in main.c but not actually + * used by any other parts of the kernel */ +int smp_threads_ready = 0; + +/* per CPU data structure (for /proc/cpuinfo et al), visible externally + * indexed physically */ +struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned; + +/* Per CPU interrupt stacks */ +extern union thread_union init_irq_union; +union thread_union *irq_stacks[NR_CPUS] __cacheline_aligned = + { &init_irq_union, }; + +/* physical ID of the CPU used to boot the system */ +unsigned char boot_cpu_id; + +/* The memory line addresses for the Quad CPIs */ +struct voyager_qic_cpi *voyager_quad_cpi_addr[NR_CPUS] __cacheline_aligned; + +/* The masks for the Extended VIC processors, filled in by cat_init */ +__u32 voyager_extended_vic_processors = 0; + +/* Masks for the extended Quad processors which cannot be VIC booted */ +__u32 voyager_allowed_boot_processors = 0; + +/* The mask for the Quad Processors (both extended and non-extended) */ +__u32 voyager_quad_processors = 0; + +/* Total count of live CPUs, used in process.c to display + * the CPU information and in irq.c for the per CPU irq + * activity count. Finally exported by i386_ksyms.c */ +static int voyager_extended_cpus = 1; + +/* Have we found an SMP box - used by time.c to do the profiling + interrupt for timeslicing; do not set to 1 until the per CPU timer + interrupt is active */ +int smp_found_config = 0; + +/* Used for the invalidate map that's also checked in the spinlock */ +volatile unsigned long smp_invalidate_needed; + +/* Bitmask of currently online CPUs - used by setup.c for + /proc/cpuinfo, visible externally but still physical */ +unsigned long cpu_online_map = 0; + +/* Bitmask of CPUs present in the system - exported by i386_syms.c, used + * by scheduler but indexed physically */ +unsigned long phys_cpu_present_map = 0; + +/* estimate of time used to flush the SMP-local cache - used in + * processor affinity calculations */ +cycles_t cacheflush_time = 0; + +/* cache decay ticks for scheduler---a fairly useless quantity for the + voyager system with its odd affinity and huge L3 cache */ +unsigned long cache_decay_ticks = 20; + + +/* The internal functions */ +static void send_CPI(__u32 cpuset, __u8 cpi); +static void ack_CPI(__u8 cpi); +static int ack_QIC_CPI(__u8 cpi); +static void ack_special_QIC_CPI(__u8 cpi); +static void ack_VIC_CPI(__u8 cpi); +static void send_CPI_allbutself(__u8 cpi); +static void enable_vic_irq(unsigned int irq); +static void disable_vic_irq(unsigned int irq); +static unsigned int startup_vic_irq(unsigned int irq); +static void enable_local_vic_irq(unsigned int irq); +static void disable_local_vic_irq(unsigned int irq); +static void before_handle_vic_irq(unsigned int irq); +static void after_handle_vic_irq(unsigned int irq); +static void set_vic_irq_affinity(unsigned int irq, unsigned long mask); +static void ack_vic_irq(unsigned int irq); +static void vic_enable_cpi(void); +static void do_boot_cpu(__u8 cpuid); +static void do_quad_bootstrap(void); +static inline void wrapper_smp_local_timer_interrupt(struct pt_regs *); + +int hard_smp_processor_id(void); + +/* Inline functions */ +static inline void +send_one_QIC_CPI(__u8 cpu, __u8 cpi) +{ + voyager_quad_cpi_addr[cpu]->qic_cpi[cpi].cpi = + (smp_processor_id() << 16) + cpi; +} + +static inline void +send_QIC_CPI(__u32 cpuset, __u8 cpi) +{ + int mask; + __u8 cpu; + + for_each_cpu(cpu, mask) { + if(cpuset & (1<>3 &0x7 on the 32 way */ + if(((cpuid >> 2) & 0x03) == i) + /* don't lower our own mask! */ + continue; + + /* masquerade as local Quad CPU */ + outb(QIC_CPUID_ENABLE | i, QIC_PROCESSOR_ID); + /* enable the startup CPI */ + outb(QIC_BOOT_CPI_MASK, QIC_MASK_REGISTER1); + /* restore cpu id */ + outb(0, QIC_PROCESSOR_ID); + } + local_irq_restore(flags); + } +} + + +/* Set up all the basic stuff: read the SMP config and make all the + * SMP information reflect only the boot cpu. All others will be + * brought on-line later. */ +void __init +find_smp_config(void) +{ + int i; + + boot_cpu_id = hard_smp_processor_id(); + + printk("VOYAGER SMP: Boot cpu is %d\n", boot_cpu_id); + + /* initialize the CPU structures (moved from smp_boot_cpus) */ + for(i=0; icpu = boot_cpu_id; +} + +/* + * The bootstrap kernel entry code has set these up. Save them + * for a given CPU, id is physical */ +void __init +smp_store_cpu_info(int id) +{ + struct cpuinfo_x86 *c=&cpu_data[id]; + + *c = boot_cpu_data; + identify_cpu(c); +} + +/* set up the trampoline and return the physical address of the code */ +static __u32 __init +setup_trampoline(void) +{ + /* these two are global symbols in trampoline.S */ + extern __u8 trampoline_end[]; + extern __u8 trampoline_data[]; + + memcpy((__u8 *)trampoline_base, trampoline_data, + trampoline_end - trampoline_data); + return virt_to_phys((__u8 *)trampoline_base); +} + +/* Routine initially called when a non-boot CPU is brought online */ +int __init +start_secondary(void *unused) +{ + __u8 cpuid = hard_smp_processor_id(); + /* external functions not defined in the headers */ + extern void calibrate_delay(void); + extern int cpu_idle(void); + + cpu_init(); + + /* OK, we're in the routine */ + ack_CPI(VIC_CPU_BOOT_CPI); + + /* setup the 8259 master slave pair belonging to this CPU --- + * we won't actually receive any until the boot CPU + * relinquishes it's static routing mask */ + vic_setup_pic(); + + qic_setup(); + + if(is_cpu_quad() && !is_cpu_vic_boot()) { + /* clear the boot CPI */ + __u8 dummy; + + dummy = voyager_quad_cpi_addr[cpuid]->qic_cpi[VIC_CPU_BOOT_CPI].cpi; + printk("read dummy %d\n", dummy); + } + + /* lower the mask to receive CPIs */ + vic_enable_cpi(); + + VDEBUG(("VOYAGER SMP: CPU%d, stack at about %p\n", cpuid, &cpuid)); + + /* enable interrupts */ + local_irq_enable(); + + /* get our bogomips */ + calibrate_delay(); + + /* save our processor parameters */ + smp_store_cpu_info(cpuid); + + /* if we're a quad, we may need to bootstrap other CPUs */ + do_quad_bootstrap(); + + set_bit(cpuid, &cpu_callin_map); + + /* signal that we're done */ + cpu_booted_map = 1; + + while (!test_bit(cpuid, &smp_commenced_mask)) + rep_nop(); + + local_flush_tlb(); + + set_bit(cpuid, &cpu_online_map); + wmb(); + return cpu_idle(); +} + +static struct task_struct * __init +fork_by_hand(void) +{ + struct pt_regs regs; + /* don't care about the eip and regs settings since we'll + * never reschedule the forked task. */ + return do_fork(CLONE_VM|CLONE_IDLETASK, 0, ®s, 0, NULL); +} + + +static void __init setup_irq_stack(struct task_struct *p, int cpu) +{ + unsigned long stk; + + stk = __get_free_pages(GFP_KERNEL, THREAD_ORDER+1); + if (!stk) + panic("I can't seem to allocate my irq stack. Oh well, giving up."); + + irq_stacks[cpu] = (void *)stk; + memset(irq_stacks[cpu], 0, THREAD_SIZE); + irq_stacks[cpu]->thread_info.cpu = cpu; + irq_stacks[cpu]->thread_info.preempt_count = 1; + /* interrupts are not preemptable */ + p->thread_info->irq_stack = irq_stacks[cpu]; + + /* If we want to make the irq stack more than one unit + * deep, we can chain then off of the irq_stack pointer + * here. + */ +} + + +/* Routine to kick start the given CPU and wait for it to report ready + * (or timeout in startup). When this routine returns, the requested + * CPU is either fully running and configured or known to be dead. + * + * We call this routine sequentially 1 CPU at a time, so no need for + * locking */ + +static void __init +do_boot_cpu(__u8 cpu) +{ + struct task_struct *idle; + int timeout; + unsigned long flags; + int quad_boot = (1<> 4) & 0xFFFF; + + cpucount++; + idle = fork_by_hand(); + if(IS_ERR(idle)) + panic("failed fork for CPU%d", cpu); + + setup_irq_stack(idle, cpu); + + init_idle(idle, cpu); + + idle->thread.eip = (unsigned long) start_secondary; + unhash_process(idle); + + /* The -4 is to correct for the fact that the stack pointer + * is used to find the location of the thread_info structure + * by masking off several of the LSBs. Without the -4, esp + * is pointing to the page after the one the stack is on. + */ + stack_start.esp = (void *)(THREAD_SIZE - 4 + (char *)idle->thread_info); + + /* Note: Don't modify initial ss override */ + VDEBUG(("VOYAGER SMP: Booting CPU%d at 0x%lx[%x:%x], stack %p\n", cpu, + (unsigned long)hijack_source.val, hijack_source.idt.Segment, + hijack_source.idt.Offset, stack_start.esp)); + /* set the original swapper_pg_dir[0] to map 0 to 4Mb transparently + * (so that the booting CPU can find start_32 */ + orig_swapper_pg_dir0 = swapper_pg_dir[0]; +#ifdef CONFIG_M486 + if(page_table_copies == NULL) + panic("No free memory for 486 page tables\n"); + for(i = 0; i < PAGE_SIZE/sizeof(unsigned long); i++) + page_table_copies[i] = (i * PAGE_SIZE) + | _PAGE_RW | _PAGE_USER | _PAGE_PRESENT; + + ((unsigned long *)swapper_pg_dir)[0] = + ((virt_to_phys(page_table_copies)) & PAGE_MASK) + | _PAGE_RW | _PAGE_USER | _PAGE_PRESENT; +#else + ((unsigned long *)swapper_pg_dir)[0] = 0x102007; +#endif + + if(quad_boot) { + printk("CPU %d: non extended Quad boot\n", cpu); + hijack_vector = (__u32 *)phys_to_virt((VIC_CPU_BOOT_CPI + QIC_DEFAULT_CPI_BASE)*4); + *hijack_vector = hijack_source.val; + } else { + printk("CPU%d: extended VIC boot\n", cpu); + hijack_vector = (__u32 *)phys_to_virt((VIC_CPU_BOOT_CPI + VIC_DEFAULT_CPI_BASE)*4); + *hijack_vector = hijack_source.val; + /* VIC errata, may also receive interrupt at this address */ + hijack_vector = (__u32 *)phys_to_virt((VIC_CPU_BOOT_ERRATA_CPI + VIC_DEFAULT_CPI_BASE)*4); + *hijack_vector = hijack_source.val; + } + /* All non-boot CPUs start with interrupts fully masked. Need + * to lower the mask of the CPI we're about to send. We do + * this in the VIC by masquerading as the processor we're + * about to boot and lowering its interrupt mask */ + local_irq_save(flags); + if(quad_boot) { + send_one_QIC_CPI(cpu, VIC_CPU_BOOT_CPI); + } else { + outb(VIC_CPU_MASQUERADE_ENABLE | cpu, VIC_PROCESSOR_ID); + /* here we're altering registers belonging to `cpu' */ + + outb(VIC_BOOT_INTERRUPT_MASK, 0x21); + /* now go back to our original identity */ + outb(boot_cpu_id, VIC_PROCESSOR_ID); + + /* and boot the CPU */ + + send_CPI((1<thread.esp),"r" (current->thread.eip)); +} + +/* handle a Voyager SYS_INT -- If we don't, the base board will + * panic the system. + * + * System interrupts occur because some problem was detected on the + * various busses. To find out what you have to probe all the + * hardware via the CAT bus. FIXME: At the moment we do nothing. */ +asmlinkage void +smp_vic_sys_interrupt(void) +{ + ack_CPI(VIC_SYS_INT); + printk("Voyager SYSTEM INTERRUPT\n"); +} + +/* Handle a voyager CMN_INT; These interrupts occur either because of + * a system status change or because a single bit memory error + * occurred. FIXME: At the moment, ignore all this. */ +asmlinkage void +smp_vic_cmn_interrupt(void) +{ + static __u8 in_cmn_int = 0; + static spinlock_t cmn_int_lock = SPIN_LOCK_UNLOCKED; + + /* common ints are broadcast, so make sure we only do this once */ + _raw_spin_lock(&cmn_int_lock); + if(in_cmn_int) + goto unlock_end; + + in_cmn_int++; + _raw_spin_unlock(&cmn_int_lock); + + VDEBUG(("Voyager COMMON INTERRUPT\n")); + + if(voyager_level == 5) + voyager_cat_do_common_interrupt(); + + _raw_spin_lock(&cmn_int_lock); + in_cmn_int = 0; + unlock_end: + _raw_spin_unlock(&cmn_int_lock); + ack_CPI(VIC_CMN_INT); +} + +/* + * Reschedule call back. Nothing to do, all the work is done + * automatically when we return from the interrupt. */ +asmlinkage void +smp_reschedule_interrupt(void) +{ + /* do nothing */ +} + +static struct mm_struct * flush_mm; +static unsigned long flush_va; +static spinlock_t tlbstate_lock = SPIN_LOCK_UNLOCKED; +#define FLUSH_ALL 0xffffffff + +/* + * We cannot call mmdrop() because we are in interrupt context, + * instead update mm->cpu_vm_mask. + * + * We need to reload %cr3 since the page tables may be going + * away from under us.. + */ +static void inline +leave_mm (unsigned long cpu) +{ + if (cpu_tlbstate[cpu].state == TLBSTATE_OK) + BUG(); + clear_bit(cpu, &cpu_tlbstate[cpu].active_mm->cpu_vm_mask); + load_cr3(swapper_pg_dir); +} + + +/* + * Invalidate call-back + */ +asmlinkage void +smp_invalidate_interrupt(void) +{ + __u8 cpu = get_cpu(); + + if(!test_bit(cpu, &smp_invalidate_needed)) + goto out; + /* This will flood messages. Don't uncomment unless you see + * Problems with cross cpu invalidation + VDEBUG(("VOYAGER SMP: CPU%d received INVALIDATE_CPI\n", + smp_processor_id())); + */ + + if (flush_mm == cpu_tlbstate[cpu].active_mm) { + if (cpu_tlbstate[cpu].state == TLBSTATE_OK) { + if (flush_va == FLUSH_ALL) + local_flush_tlb(); + else + __flush_tlb_one(flush_va); + } else + leave_mm(cpu); + } + clear_bit(cpu, &smp_invalidate_needed); + out: + put_cpu_no_resched(); +} + +/* All the new flush operations for 2.4 */ + + +/* This routine is called with a physical cpu mask */ +static void +flush_tlb_others (unsigned long cpumask, struct mm_struct *mm, + unsigned long va) +{ + int stuck = 50000; + + if (!cpumask) + BUG(); + if ((cpumask & cpu_online_map) != cpumask) + BUG(); + if (cpumask & (1 << smp_processor_id())) + BUG(); + if (!mm) + BUG(); + + spin_lock(&tlbstate_lock); + + flush_mm = mm; + flush_va = va; + atomic_set_mask(cpumask, &smp_invalidate_needed); + /* + * We have to send the CPI only to + * CPUs affected. + */ + send_CPI(cpumask, VIC_INVALIDATE_CPI); + + while (smp_invalidate_needed) { + if(--stuck == 0) { + printk("***WARNING*** Stuck doing invalidate CPI (CPU%d)\n", smp_processor_id()); + break; + } + } + + /* Uncomment only to debug invalidation problems + VDEBUG(("VOYAGER SMP: Completed invalidate CPI (CPU%d)\n", cpu)); + */ + + flush_mm = NULL; + flush_va = 0; + spin_unlock(&tlbstate_lock); +} + +void +flush_tlb_current_task(void) +{ + struct mm_struct *mm = current->mm; + unsigned long cpu_mask; + + preempt_disable(); + + cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id()); + local_flush_tlb(); + if (cpu_mask) + flush_tlb_others(cpu_mask, mm, FLUSH_ALL); + + preempt_enable(); +} + + +void +flush_tlb_mm (struct mm_struct * mm) +{ + unsigned long cpu_mask; + + preempt_disable(); + + cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id()); + + if (current->active_mm == mm) { + if (current->mm) + local_flush_tlb(); + else + leave_mm(smp_processor_id()); + } + if (cpu_mask) + flush_tlb_others(cpu_mask, mm, FLUSH_ALL); + + preempt_enable(); +} + +void flush_tlb_page(struct vm_area_struct * vma, unsigned long va) +{ + struct mm_struct *mm = vma->vm_mm; + unsigned long cpu_mask; + + preempt_disable(); + + cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id()); + if (current->active_mm == mm) { + if(current->mm) + __flush_tlb_one(va); + else + leave_mm(smp_processor_id()); + } + + if (cpu_mask) + flush_tlb_others(cpu_mask, mm, va); + + preempt_enable(); +} + +/* enable the requested IRQs */ +asmlinkage void +smp_enable_irq_interrupt(void) +{ + __u8 irq; + __u8 cpu = get_cpu(); + + VDEBUG(("VOYAGER SMP: CPU%d enabling irq mask 0x%x\n", cpu, + vic_irq_enable_mask[cpu])); + + spin_lock(&vic_irq_lock); + for(irq = 0; irq < 16; irq++) { + if(vic_irq_enable_mask[cpu] & (1<func; + void *info = call_data->info; + /* must take copy of wait because call_data may be replaced + * unless the function is waiting for us to finish */ + int wait = call_data->wait; + __u8 cpu = smp_processor_id(); + + /* + * Notify initiating CPU that I've grabbed the data and am + * about to execute the function + */ + mb(); + if(!test_and_clear_bit(cpu, &call_data->started)) { + /* If the bit wasn't set, this could be a replay */ + printk(KERN_WARNING "VOYAGER SMP: CPU %d received call funtion with no call pending\n", cpu); + return; + } + /* + * At this point the info structure may be out of scope unless wait==1 + */ + irq_enter(); + (*func)(info); + irq_exit(); + if (wait) { + mb(); + clear_bit(cpu, &call_data->finished); + } +} + +/* Call this function on all CPUs using the function_interrupt above + The function to run. This must be fast and non-blocking. + An arbitrary pointer to pass to the function. + If true, keep retrying until ready. + If true, wait until function has completed on other CPUs. + [RETURNS] 0 on success, else a negative status code. Does not return until + remote CPUs are nearly ready to execute <> or are or have executed. +*/ +int +smp_call_function (void (*func) (void *info), void *info, int retry, + int wait) +{ + struct call_data_struct data; + __u32 mask = cpu_online_map; + + mask &= ~(1<= 0x93000) + BUG(); +} + +/* send a reschedule CPI to one CPU by physical CPU number*/ +void +smp_send_reschedule(int cpu) +{ + send_one_CPI(cpu, VIC_RESCHEDULE_CPI); +} + + +int +hard_smp_processor_id(void) +{ + __u8 i; + __u8 cpumask = inb(VIC_PROC_WHO_AM_I); + if((cpumask & QUAD_IDENTIFIER) == QUAD_IDENTIFIER) + return cpumask & 0x1F; + + for(i = 0; i < 8; i++) { + if(cpumask & (1<1 eligible CPUs are equal lowest, the + * lowest processor number gets it. + * + * The priority of a CPU is controlled by a special per-CPU + * VIC priority register which is 3 bits wide 0 being lowest + * and 7 highest priority.. + * + * Therefore we subtract the average number of interrupts from + * the number we've fielded. If this number is negative, we + * lower the activity count and if it is positive, we raise + * it. + * + * I'm afraid this still leads to odd looking interrupt counts: + * the totals are all roughly equal, but the individual ones + * look rather skewed. + * + * FIXME: This algorithm is total crap when mixed with SMP + * affinity code since we now try to even up the interrupt + * counts when an affinity binding is keeping them on a + * particular CPU*/ + weight = (vic_intr_count[cpu]*voyager_extended_cpus + - vic_intr_total) >> 4; + weight += 4; + if(weight > 7) + weight = 7; + if(weight < 0) + weight = 0; + + outb((__u8)weight, VIC_PRIORITY_REGISTER); + +#ifdef VOYAGER_DEBUG + if((vic_tick[cpu] & 0xFFF) == 0) { + /* print this message roughly every 25 secs */ + printk("VOYAGER SMP: vic_tick[%d] = %lu, weight = %ld\n", + cpu, vic_tick[cpu], weight); + } +#endif +} + +/* setup the profiling timer */ +int +setup_profiling_timer(unsigned int multiplier) +{ + int i; + + if ( (!multiplier)) + return -EINVAL; + + /* + * Set the new multiplier for each CPU. CPUs don't start using the + * new values until the next timer interrupt in which they do process + * accounting. + */ + for (i = 0; i < NR_CPUS; ++i) + prof_multiplier[i] = multiplier; + + return 0; +} + + +/* The CPIs are handled in the per cpu 8259s, so they must be + * enabled to be received: FIX: enabling the CPIs in the early + * boot sequence interferes with bug checking; enable them later + * on in smp_init */ +#define VIC_SET_GATE(cpi, vector) \ + set_intr_gate((cpi) + VIC_DEFAULT_CPI_BASE, (vector)) +#define QIC_SET_GATE(cpi, vector) \ + set_intr_gate((cpi) + QIC_DEFAULT_CPI_BASE, (vector)) + +void __init +smp_intr_init(void) +{ + int i; + + /* initialize the per cpu irq mask to all disabled */ + for(i = 0; i < NR_CPUS; i++) + vic_irq_mask[i] = 0xFFFF; + + VIC_SET_GATE(VIC_CPI_LEVEL0, vic_cpi_interrupt); + + VIC_SET_GATE(VIC_SYS_INT, vic_sys_interrupt); + VIC_SET_GATE(VIC_CMN_INT, vic_cmn_interrupt); + + QIC_SET_GATE(QIC_TIMER_CPI, qic_timer_interrupt); + QIC_SET_GATE(QIC_INVALIDATE_CPI, qic_invalidate_interrupt); + QIC_SET_GATE(QIC_RESCHEDULE_CPI, qic_reschedule_interrupt); + QIC_SET_GATE(QIC_ENABLE_IRQ_CPI, qic_enable_irq_interrupt); + QIC_SET_GATE(QIC_CALL_FUNCTION_CPI, qic_call_function_interrupt); + + + /* now put the VIC descriptor into the first 48 IRQs + * + * This is for later: first 16 correspond to PC IRQs; next 16 + * are Primary MC IRQs and final 16 are Secondary MC IRQs */ + for(i = 0; i < 48; i++) + irq_desc[i].handler = &vic_irq_type; +} + +/* send a CPI at level cpi to a set of cpus in cpuset (set 1 bit per + * processor to recieve CPI */ +static void +send_CPI(__u32 cpuset, __u8 cpi) +{ + int mask; + __u8 cpu; + __u32 quad_cpuset = (cpuset & voyager_quad_processors); + + if(cpi < VIC_START_FAKE_CPI) { + /* fake CPI are only used for booting, so send to the + * extended quads as well---Quads must be VIC booted */ + outb((__u8)(cpuset), VIC_CPI_Registers[cpi]); + return; + } + if(quad_cpuset) + send_QIC_CPI(quad_cpuset, cpi); + cpuset &= ~quad_cpuset; + cpuset &= 0xff; /* only first 8 CPUs vaild for VIC CPI */ + if(cpuset == 0) + return; + for_each_cpu(cpu, mask) { + if(cpuset & (1<qic_cpi[cpi].cpi; +} + +static void +ack_special_QIC_CPI(__u8 cpi) +{ + switch(cpi) { + case VIC_CMN_INT: + outb(QIC_CMN_INT, QIC_INTERRUPT_CLEAR0); + break; + case VIC_SYS_INT: + outb(QIC_SYS_INT, QIC_INTERRUPT_CLEAR0); + break; + } + /* also clear at the VIC, just in case (nop for non-extended proc) */ + ack_VIC_CPI(cpi); +} + +/* Acknowledge receipt of CPI in the VIC (essentially an EOI) */ +static void +ack_VIC_CPI(__u8 cpi) +{ +#ifdef VOYAGER_DEBUG + unsigned long flags; + __u16 isr; + __u8 cpu = smp_processor_id(); + + local_irq_save(flags); + isr = vic_read_isr(); + if((isr & (1<<(cpi &7))) == 0) { + printk("VOYAGER SMP: CPU%d lost CPI%d\n", cpu, cpi); + } +#endif + /* send specific EOI; the two system interrupts have + * bit 4 set for a separate vector but behave as the + * corresponding 3 bit intr */ + outb_p(0x60|(cpi & 7),0x20); + +#ifdef VOYAGER_DEBUG + if((vic_read_isr() & (1<<(cpi &7))) != 0) { + printk("VOYAGER SMP: CPU%d still asserting CPI%d\n", cpu, cpi); + } + local_irq_restore(flags); +#endif +} + +/* cribbed with thanks from irq.c */ +#define __byte(x,y) (((unsigned char *)&(y))[x]) +#define cached_21(cpu) (__byte(0,vic_irq_mask[cpu])) +#define cached_A1(cpu) (__byte(1,vic_irq_mask[cpu])) + +static unsigned int +startup_vic_irq(unsigned int irq) +{ + enable_vic_irq(irq); + + return 0; +} + +/* The enable and disable routines. This is where we run into + * conflicting architectural philosophy. Fundamentally, the voyager + * architecture does not expect to have to disable interrupts globally + * (the IRQ controllers belong to each CPU). The processor masquerade + * which is used to start the system shouldn't be used in a running OS + * since it will cause great confusion if two separate CPUs drive to + * the same IRQ controller (I know, I've tried it). + * + * The solution is a variant on the NCR lazy SPL design: + * + * 1) To disable an interrupt, do nothing (other than set the + * IRQ_DISABLED flag). This dares the interrupt actually to arrive. + * + * 2) If the interrupt dares to come in, raise the local mask against + * it (this will result in all the CPU masks being raised + * eventually). + * + * 3) To enable the interrupt, lower the mask on the local CPU and + * broadcast an Interrupt enable CPI which causes all other CPUs to + * adjust their masks accordingly. */ + +static void +enable_vic_irq(unsigned int irq) +{ + int tmpmask; + /* linux doesn't to processor-irq affinity, so enable on + * all CPUs we know about */ + __u8 cpu = smp_processor_id(), real_cpu; + __u16 mask = (1<status |= IRQ_REPLAY | IRQ_INPROGRESS; + } else if(desc->status & IRQ_DISABLED) { + /* Damn, the interrupt actually arrived, do the lazy + * disable thing. The interrupt routine in irq.c will + * not handle a IRQ_DISABLED interrupt, so nothing more + * need be done here */ + VDEBUG(("VOYAGER DEBUG: lazy disable of irq %d on CPU %d\n", + irq, cpu)); + disable_local_vic_irq(irq); + desc->status |= IRQ_REPLAY; + } else { + desc->status &= ~IRQ_REPLAY; + } + + _raw_spin_unlock(&vic_irq_lock); +} + +/* Finish the VIC interrupt: basically mask */ +static void +after_handle_vic_irq(unsigned int irq) +{ + irq_desc_t *desc = irq_desc + irq; + + _raw_spin_lock(&vic_irq_lock); + { + unsigned int status = desc->status & ~IRQ_INPROGRESS; +#ifdef VOYAGER_DEBUG + __u16 isr; +#endif + + desc->status = status; + if ((status & IRQ_DISABLED)) + disable_local_vic_irq(irq); +#ifdef VOYAGER_DEBUG + /* DEBUG: before we ack, check what's in progress */ + isr = vic_read_isr(); + if((isr & (1<status &= ~(IRQ_REPLAY | IRQ_INPROGRESS); + } +#ifdef VOYAGER_DEBUG + isr = vic_read_isr(); + if((isr & (1<= 32) + /* You can only have 32 interrupts in a voyager system + * (and 32 only if you have a secondary microchannel + * bus) */ + return; + + for_each_cpu(cpu, tmpmask) { + unsigned long cpu_mask = (1< +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define THREAD_NAME "kvoyagerd" + +/* external variables */ +int kvoyagerd_running = 0; +DECLARE_MUTEX_LOCKED(kvoyagerd_sem); + +static int thread(void *); + +static __u8 set_timeout = 0; + +/* Start the machine monitor thread. Return 1 if OK, 0 if fail */ +static int __init +voyager_thread_start(void) +{ + if(kernel_thread(thread, NULL, CLONE_KERNEL) < 0) { + /* This is serious, but not fatal */ + printk(KERN_ERR "Voyager: Failed to create system monitor thread!!!\n"); + return 1; + } + return 0; +} + +static int +execute_helper(void *string) +{ + int ret; + + char *envp[] = { + "HOME=/", + "TERM=linux", + "PATH=/sbin:/usr/sbin:/bin:/usr/bin", + NULL, + }; + char *argv[] = { + "/bin/bash", + "-c", + (char *)string, + NULL, + }; + + if((ret = exec_usermodehelper(argv[0], argv, envp)) < 0) { + printk(KERN_ERR "Voyager failed to execute \"%s\"\n", + (char *)string); + } + return ret; +} + +static void +execute(char *string) +{ + if(kernel_thread(execute_helper, (void *)string, CLONE_VFORK | SIGCHLD) < 0) { + printk(KERN_ERR "Voyager failed to fork before exec of \"%s\"\n", + string); + } +} + +static void +check_from_kernel(void) +{ + if(voyager_status.switch_off) { + + /* FIXME: This should be configureable via proc */ + execute("umask 600; echo 0 > /etc/initrunlvl; kill -HUP 1"); + } else if(voyager_status.power_fail) { + VDEBUG(("Voyager daemon detected AC power failure\n")); + + /* FIXME: This should be configureable via proc */ + execute("umask 600; echo F > /etc/powerstatus; kill -PWR 1"); + set_timeout = 1; + } +} + +static void +check_continuing_condition(void) +{ + if(voyager_status.power_fail) { + __u8 data; + voyager_cat_psi(VOYAGER_PSI_SUBREAD, + VOYAGER_PSI_AC_FAIL_REG, &data); + if((data & 0x1f) == 0) { + /* all power restored */ + printk(KERN_NOTICE "VOYAGER AC power restored, cancelling shutdown\n"); + /* FIXME: should be user configureable */ + execute("umask 600; echo O > /etc/powerstatus; kill -PWR 1"); + set_timeout = 0; + } + } +} + +static void +wakeup(unsigned long unused) +{ + up(&kvoyagerd_sem); +} + +static int +thread(void *unused) +{ + struct timer_list wakeup_timer; + + kvoyagerd_running = 1; + + reparent_to_init(); + daemonize(); + + set_timeout = 0; + + init_timer(&wakeup_timer); + + strcpy(current->comm, THREAD_NAME); + sigfillset(¤t->blocked); + current->tty = NULL; /* get rid of controlling tty */ + + printk(KERN_NOTICE "Voyager starting monitor thread\n"); + + for(;;) { + down_interruptible(&kvoyagerd_sem); + VDEBUG(("Voyager Daemon awoken\n")); + if(voyager_status.request_from_kernel == 0) { + /* probably awoken from timeout */ + check_continuing_condition(); + } else { + check_from_kernel(); + voyager_status.request_from_kernel = 0; + } + if(set_timeout) { + del_timer(&wakeup_timer); + wakeup_timer.expires = HZ + jiffies; + wakeup_timer.function = wakeup; + add_timer(&wakeup_timer); + } + } +} + +static void __exit +voyager_thread_stop(void) +{ + /* FIXME: do nothing at the moment */ +} + +module_init(voyager_thread_start); +//module_exit(voyager_thread_stop); diff -Nru a/arch/ia64/Config.help b/arch/ia64/Config.help --- a/arch/ia64/Config.help Mon Oct 28 16:32:36 2002 +++ b/arch/ia64/Config.help Mon Oct 28 16:32:36 2002 @@ -157,6 +157,11 @@ and ds.o. If you want to compile it as a module, say M here and read . +CONFIG_KALLSYMS + Say Y here to let the kernel print out symbolic crash information and + symbolic stack backtraces. This increases the size of the kernel + somewhat, as all symbols have to be loaded into the kernel image. + CONFIG_KCORE_ELF If you enabled support for /proc file system then the file /proc/kcore will contain the kernel core image. This can be used diff -Nru a/arch/ia64/Makefile b/arch/ia64/Makefile --- a/arch/ia64/Makefile Mon Oct 28 16:32:35 2002 +++ b/arch/ia64/Makefile Mon Oct 28 16:32:35 2002 @@ -33,44 +33,48 @@ CFLAGS += -mb-step endif -HEAD := arch/$(ARCH)/kernel/head.o arch/ia64/kernel/init_task.o +HEAD := arch/$(ARCH)/kernel/head.o arch/$(ARCH)/kernel/init_task.o -core-$(CONFIG_IA64_GENERIC) += arch/$(ARCH)/hp/ arch/$(ARCH)/dig/ -core-$(CONFIG_IA64_HP_SIM) += arch/$(ARCH)/hp/ -core-$(CONFIG_IA64_HP_ZX1) += arch/$(ARCH)/hp/ arch/$(ARCH)/dig/ -core-$(CONFIG_IA64_SGI_SN) += arch/$(ARCH)/sn/kernel arch/$(ARCH)/sn/io +libs-y += arch/$(ARCH)/lib/ +core-y += arch/$(ARCH)/kernel/ arch/$(ARCH)/mm/ +core-$(CONFIG_IA32_SUPPORT) += arch/$(ARCH)/ia32/ core-$(CONFIG_IA64_DIG) += arch/$(ARCH)/dig/ +core-$(CONFIG_IA64_GENERIC) += arch/$(ARCH)/dig/ arch/$(ARCH)/hp/common/ arch/$(ARCH)/hp/zx1/ \ + arch/$(ARCH)/hp/sim/ +core-$(CONFIG_IA64_HP_ZX1) += arch/$(ARCH)/dig/ +core-$(CONFIG_IA64_SGI_SN) += arch/$(ARCH)/sn/kernel arch/$(ARCH)/sn/io \ + arch/$(ARCH)/sn/fakeprom +drivers-$(CONFIG_PCI) += arch/$(ARCH)/pci/ +drivers-$(CONFIG_IA64_HP_SIM) += arch/$(ARCH)/hp/sim/ +drivers-$(CONFIG_IA64_HP_ZX1) += arch/$(ARCH)/hp/common/ arch/$(ARCH)/hp/zx1/ ifdef CONFIG_IA64_SGI_SN CFLAGS += -DBRINGUP SUBDIRS += arch/$(ARCH)/sn/fakeprom endif -core-$(CONFIG_IA32_SUPPORT) += arch/$(ARCH)/ia32/ +makeboot = $(call descend,arch/ia64/boot,$(1)) +maketool = $(call descend,arch/ia64/tools,$(1)) -libs-y += arch/$(ARCH)/lib/ -core-y += arch/$(ARCH)/kernel/ arch/$(ARCH)/mm/ -drivers-$(CONFIG_PCI) += arch/$(ARCH)/pci/ -drivers-$(CONFIG_IA64_HP_ZX1) += arch/$(ARCH)/hp/common/ arch/$(ARCH)/hp/zx1/ +.PHONY: compressed archclean archmrproper $(TOPDIR)/include/asm-ia64/offsets.h + +all: compressed boot -MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot +boot: vmlinux + +@$(call makeboot,all) compressed: vmlinux $(OBJCOPY) $(OBJCOPYFLAGS) vmlinux vmlinux-tmp gzip vmlinux-tmp mv vmlinux-tmp.gz vmlinux.gz -rawboot: - @$(MAKEBOOT) rawboot - archclean: - @$(MAKEBOOT) clean + $(MAKE) -rR -f scripts/Makefile.clean obj=arch/$(ARCH)/boot archmrproper: - @$(MAKE) -C arch/$(ARCH)/tools mrproper prepare: $(TOPDIR)/include/asm-ia64/offsets.h $(TOPDIR)/include/asm-ia64/offsets.h: include/asm include/linux/version.h \ include/config/MARKER - @$(MAKE) -C arch/$(ARCH)/tools $@ + +@$(call maketool,$@) diff -Nru a/arch/ia64/boot/Makefile b/arch/ia64/boot/Makefile --- a/arch/ia64/boot/Makefile Mon Oct 28 16:32:37 2002 +++ b/arch/ia64/boot/Makefile Mon Oct 28 16:32:37 2002 @@ -8,9 +8,9 @@ # Copyright (C) 1998 by David Mosberger-Tang # -LINKFLAGS = -static -T bootloader.lds +LINKFLAGS = -static -T $(src)/bootloader.lds -OBJECTS = bootloader.o +OBJS = $(obj)/bootloader.o targets-$(CONFIG_IA64_HP_SIM) += bootloader targets-$(CONFIG_IA64_GENERIC) += bootloader @@ -19,8 +19,8 @@ all: $(targets-y) -bootloader: $(OBJECTS) - $(LD) $(LINKFLAGS) $(OBJECTS) $(TOPDIR)/lib/lib.a $(TOPDIR)/arch/$(ARCH)/lib/lib.a \ +bootloader: $(OBJS) + $(LD) $(LINKFLAGS) $(OBJS) $(TOPDIR)/lib/lib.a $(TOPDIR)/arch/$(ARCH)/lib/lib.a \ -o bootloader clean: diff -Nru a/arch/ia64/config.in b/arch/ia64/config.in --- a/arch/ia64/config.in Mon Oct 28 16:32:38 2002 +++ b/arch/ia64/config.in Mon Oct 28 16:32:38 2002 @@ -66,6 +66,10 @@ if [ "$CONFIG_IA64_GENERIC" = "y" -o "$CONFIG_IA64_DIG" = "y" -o "$CONFIG_IA64_HP_ZX1" = "y" ]; then + bool ' Enable NUMA support' CONFIG_NUMA + if [ "$CONFIG_NUMA" = "y" ]; then + define_bool CONFIG_DISCONTIGMEM y + fi bool ' Enable IA-64 Machine Check Abort' CONFIG_IA64_MCA define_bool CONFIG_PM y define_bool CONFIG_IOSAPIC y @@ -267,6 +271,7 @@ bool 'Kernel debugging' CONFIG_DEBUG_KERNEL if [ "$CONFIG_DEBUG_KERNEL" != "n" ]; then + bool ' Load all symbols for debugging/kksymoops' CONFIG_KALLSYMS bool ' Print possible IA64 hazards to console' CONFIG_IA64_PRINT_HAZARDS bool ' Disable VHPT' CONFIG_DISABLE_VHPT bool ' Magic SysRq key' CONFIG_MAGIC_SYSRQ diff -Nru a/arch/ia64/defconfig b/arch/ia64/defconfig --- a/arch/ia64/defconfig Mon Oct 28 16:32:35 2002 +++ b/arch/ia64/defconfig Mon Oct 28 16:32:35 2002 @@ -43,7 +43,6 @@ # CONFIG_IA64_PAGE_SIZE_4KB is not set # CONFIG_IA64_PAGE_SIZE_8KB is not set CONFIG_IA64_PAGE_SIZE_16KB=y -# CONFIG_IA64_PAGE_SIZE_64KB is not set CONFIG_ACPI=y CONFIG_ACPI_EFI=y CONFIG_ACPI_INTERPRETER=y @@ -51,34 +50,38 @@ CONFIG_IA64_BRL_EMU=y # CONFIG_ITANIUM_BSTEP_SPECIFIC is not set CONFIG_IA64_L1_CACHE_SHIFT=6 +# CONFIG_NUMA is not set CONFIG_IA64_MCA=y CONFIG_PM=y +CONFIG_IOSAPIC=y CONFIG_KCORE_ELF=y +CONFIG_FORCE_MAX_ZONEORDER=18 +# CONFIG_HUGETLB_PAGE is not set CONFIG_SMP=y CONFIG_IA32_SUPPORT=y CONFIG_PERFMON=y CONFIG_IA64_PALINFO=y CONFIG_EFI_VARS=y +CONFIG_NR_CPUS=16 CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_MISC is not set -CONFIG_NR_CPUS=64 # # ACPI Support # +CONFIG_ACPI_BUTTON=y +CONFIG_ACPI_FAN=m +CONFIG_ACPI_PROCESSOR=m +CONFIG_ACPI_THERMAL=m +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_PCI=y CONFIG_ACPI=y CONFIG_ACPI_EFI=y CONFIG_ACPI_BOOT=y CONFIG_ACPI_BUS=y CONFIG_ACPI_INTERPRETER=y -CONFIG_ACPI_PCI=y CONFIG_ACPI_POWER=y CONFIG_ACPI_SYSTEM=y -CONFIG_ACPI_BUTTON=y -CONFIG_ACPI_FAN=m -CONFIG_ACPI_PROCESSOR=m -CONFIG_ACPI_THERMAL=m -# CONFIG_ACPI_DEBUG is not set CONFIG_PCI=y CONFIG_PCI_NAMES=y # CONFIG_HOTPLUG is not set @@ -90,50 +93,6 @@ # CONFIG_PARPORT is not set # -# Networking options -# -CONFIG_PACKET=y -CONFIG_PACKET_MMAP=y -# CONFIG_NETLINK_DEV is not set -# CONFIG_NETFILTER is not set -CONFIG_FILTER=y -CONFIG_UNIX=y -CONFIG_INET=y -# CONFIG_IP_MULTICAST is not set -# CONFIG_IP_ADVANCED_ROUTER is not set -# CONFIG_IP_PNP is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPGRE is not set -# CONFIG_ARPD is not set -# CONFIG_INET_ECN is not set -# CONFIG_SYN_COOKIES is not set -# CONFIG_IPV6 is not set -# CONFIG_KHTTPD is not set -# CONFIG_ATM is not set -# CONFIG_VLAN_8021Q is not set - -# -# -# -# CONFIG_IPX is not set -# CONFIG_ATALK is not set -# CONFIG_DECNET is not set -# CONFIG_BRIDGE is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_LLC is not set -# CONFIG_NET_DIVERT is not set -# CONFIG_ECONET is not set -# CONFIG_WAN_ROUTER is not set -# CONFIG_NET_FASTROUTE is not set -# CONFIG_NET_HW_FLOWCONTROL is not set - -# -# QoS and/or fair queueing -# -# CONFIG_NET_SCHED is not set - -# # Memory Technology Devices (MTD) # # CONFIG_MTD is not set @@ -142,6 +101,12 @@ # Plug and Play configuration # # CONFIG_PNP is not set +# CONFIG_PNP_NAMES is not set +# CONFIG_PNP_DEBUG is not set + +# +# Protocols +# # CONFIG_ISAPNP is not set # CONFIG_PNPBIOS is not set @@ -155,6 +120,7 @@ # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_CISS_SCSI_TAPE is not set # CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_RAM is not set @@ -188,12 +154,21 @@ # CONFIG_BLK_DEV_LVM is not set # -# ATA/IDE/MFM/RLL support +# Fusion MPT device support +# +# CONFIG_FUSION is not set +# CONFIG_FUSION_BOOT is not set +# CONFIG_FUSION_ISENSE is not set +# CONFIG_FUSION_CTL is not set +# CONFIG_FUSION_LAN is not set + +# +# ATA/ATAPI/MFM/RLL support # CONFIG_IDE=y # -# ATA and ATAPI Block devices +# IDE, ATA and ATAPI Block devices # CONFIG_BLK_DEV_IDE=y @@ -207,29 +182,35 @@ # CONFIG_IDEDISK_STROKE is not set # CONFIG_BLK_DEV_IDECS is not set CONFIG_BLK_DEV_IDECD=y -# CONFIG_BLK_DEV_IDETAPE is not set CONFIG_BLK_DEV_IDEFLOPPY=y CONFIG_BLK_DEV_IDESCSI=y +# CONFIG_IDE_TASK_IOCTL is not set # -# IDE chipset support +# IDE chipset support/bugfixes # # CONFIG_BLK_DEV_CMD640 is not set # CONFIG_BLK_DEV_CMD640_ENHANCED is not set # CONFIG_BLK_DEV_ISAPNP is not set -# CONFIG_BLK_DEV_RZ1000 is not set -# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_IDEPCI=y +# CONFIG_BLK_DEV_GENERIC is not set CONFIG_IDEPCI_SHARE_IRQ=y CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDE_TCQ is not set +# CONFIG_BLK_DEV_IDE_TCQ_DEFAULT is not set +# CONFIG_BLK_DEV_OFFBOARD is not set +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set # CONFIG_IDEDMA_PCI_AUTO is not set # CONFIG_IDEDMA_ONLYDISK is not set CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_PCI_WIP is not set # CONFIG_IDEDMA_NEW_DRIVE_LISTINGS is not set +CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set -# CONFIG_AEC62XX_TUNING is not set # CONFIG_BLK_DEV_ALI15X3 is not set # CONFIG_WDC_ALI15X3 is not set # CONFIG_BLK_DEV_AMD74XX is not set +# CONFIG_AMD74XX_OVERRIDE is not set # CONFIG_BLK_DEV_CMD64X is not set # CONFIG_BLK_DEV_CY82C693 is not set # CONFIG_BLK_DEV_CS5530 is not set @@ -237,21 +218,25 @@ # CONFIG_HPT34X_AUTODMA is not set # CONFIG_BLK_DEV_HPT366 is not set # CONFIG_BLK_DEV_PIIX is not set +# CONFIG_BLK_DEV_NFORCE is not set # CONFIG_BLK_DEV_NS87415 is not set # CONFIG_BLK_DEV_OPTI621 is not set -# CONFIG_BLK_DEV_PDC202XX is not set +# CONFIG_BLK_DEV_PDC202XX_OLD is not set # CONFIG_PDC202XX_BURST is not set +# CONFIG_BLK_DEV_PDC202XX_NEW is not set # CONFIG_PDC202XX_FORCE is not set +# CONFIG_BLK_DEV_RZ1000 is not set # CONFIG_BLK_DEV_SVWKS is not set +# CONFIG_BLK_DEV_SIIMAGE is not set # CONFIG_BLK_DEV_SIS5513 is not set +# CONFIG_BLK_DEV_SLC90E66 is not set # CONFIG_BLK_DEV_TRM290 is not set # CONFIG_BLK_DEV_VIA82CXXX is not set # CONFIG_IDE_CHIPSETS is not set -# CONFIG_IDEDMA_IVB is not set # CONFIG_IDEDMA_AUTO is not set -# CONFIG_BLK_DEV_ATARAID is not set -# CONFIG_BLK_DEV_ATARAID_PDC is not set -# CONFIG_BLK_DEV_ATARAID_HPT is not set +# CONFIG_IDEDMA_IVB is not set +# CONFIG_DMA_NONPCI is not set +CONFIG_BLK_DEV_IDE_MODES=y # # SCSI support @@ -272,6 +257,7 @@ # Some SCSI devices (e.g. CD jukebox) support multiple LUNs # # CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_REPORT_LUNS is not set CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y @@ -281,9 +267,7 @@ # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_7000FASST is not set # CONFIG_SCSI_ACARD is not set -# CONFIG_SCSI_AHA152X is not set -# CONFIG_SCSI_AHA1542 is not set -# CONFIG_SCSI_AHA1740 is not set +# CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC7XXX_OLD is not set # CONFIG_SCSI_DPT_I2O is not set @@ -316,15 +300,60 @@ # CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_FC is not set CONFIG_SCSI_QLOGIC_1280=y -# CONFIG_SCSI_QLOGIC_QLA2100 is not set -# CONFIG_SCSI_SIM710 is not set # CONFIG_SCSI_SYM53C416 is not set # CONFIG_SCSI_DC390T is not set # CONFIG_SCSI_T128 is not set # CONFIG_SCSI_U14_34F is not set +# CONFIG_SCSI_NSP32 is not set # CONFIG_SCSI_DEBUG is not set # +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +# CONFIG_NETLINK_DEV is not set +# CONFIG_NETFILTER is not set +CONFIG_FILTER=y +CONFIG_UNIX=y +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_IPV6 is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IPV6_SCTP__=y +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_LLC is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_DEV_APPLETALK is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# # Network device support # CONFIG_NETDEVICES=y @@ -352,6 +381,11 @@ # CONFIG_LANCE is not set # CONFIG_NET_VENDOR_SMC is not set # CONFIG_NET_VENDOR_RACAL is not set + +# +# Tulip family network device support +# +# CONFIG_NET_TULIP is not set # CONFIG_HP100 is not set # CONFIG_NET_ISA is not set CONFIG_NET_PCI=y @@ -373,10 +407,11 @@ # CONFIG_8139TOO_PIO is not set # CONFIG_8139TOO_TUNE_TWISTER is not set # CONFIG_8139TOO_8129 is not set -# CONFIG_8139_NEW_RX_RESET is not set +# CONFIG_8139_OLD_RX_RESET is not set # CONFIG_SIS900 is not set # CONFIG_EPIC100 is not set # CONFIG_SUNDANCE is not set +# CONFIG_SUNDANCE_MMIO is not set # CONFIG_TLAN is not set # CONFIG_VIA_RHINE is not set # CONFIG_VIA_RHINE_MMIO is not set @@ -388,6 +423,7 @@ # CONFIG_ACENIC is not set # CONFIG_DL2K is not set # CONFIG_E1000 is not set +# CONFIG_E1000_NAPI is not set # CONFIG_MYRI_SBUS is not set # CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set @@ -419,11 +455,6 @@ # CONFIG_WAN is not set # -# "Tulip" family network device support -# -# CONFIG_NET_TULIP is not set - -# # Amateur Radio support # # CONFIG_HAMRADIO is not set @@ -431,7 +462,7 @@ # # ISDN subsystem # -# CONFIG_ISDN is not set +# CONFIG_ISDN_BOOL is not set # # CD-ROM drivers (not for SCSI or IDE/ATAPI drives) @@ -442,22 +473,50 @@ # Input device support # CONFIG_INPUT=y -CONFIG_INPUT_KEYBDEV=y + +# +# Userland interfaces +# CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input I/O drivers +# # CONFIG_GAMEPORT is not set CONFIG_SOUND_GAMEPORT=y # CONFIG_GAMEPORT_NS558 is not set # CONFIG_GAMEPORT_L4 is not set -# CONFIG_INPUT_EMU10K1 is not set -# CONFIG_GAMEPORT_PCIGAME is not set +# CONFIG_GAMEPORT_EMU10K1 is not set +# CONFIG_GAMEPORT_VORTEX is not set # CONFIG_GAMEPORT_FM801 is not set # CONFIG_GAMEPORT_CS461x is not set CONFIG_SERIO=y +CONFIG_SERIO_I8042=y CONFIG_SERIO_SERPORT=y +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PARKBD is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_INPORT is not set +# CONFIG_MOUSE_LOGIBM is not set +# CONFIG_MOUSE_PC110PAD is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_JOYSTICK_ANALOG is not set # CONFIG_JOYSTICK_A3D is not set @@ -465,30 +524,56 @@ # CONFIG_JOYSTICK_COBRA is not set # CONFIG_JOYSTICK_GF2K is not set # CONFIG_JOYSTICK_GRIP is not set +# CONFIG_JOYSTICK_GRIP_MP is not set +# CONFIG_JOYSTICK_GUILLEMOT is not set # CONFIG_JOYSTICK_INTERACT is not set # CONFIG_JOYSTICK_SIDEWINDER is not set # CONFIG_JOYSTICK_TMDC is not set -# CONFIG_JOYSTICK_IFORCE_USB is not set -# CONFIG_JOYSTICK_IFORCE_232 is not set +# CONFIG_JOYSTICK_IFORCE is not set # CONFIG_JOYSTICK_WARRIOR is not set # CONFIG_JOYSTICK_MAGELLAN is not set # CONFIG_JOYSTICK_SPACEORB is not set # CONFIG_JOYSTICK_SPACEBALL is not set # CONFIG_JOYSTICK_STINGER is not set +# CONFIG_JOYSTICK_TWIDDLER is not set # CONFIG_JOYSTICK_DB9 is not set # CONFIG_JOYSTICK_GAMECON is not set # CONFIG_JOYSTICK_TURBOGRAFX is not set +# CONFIG_INPUT_JOYDUMP is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_PCSPKR is not set +# CONFIG_INPUT_UINPUT is not set # # Character devices # CONFIG_VT=y CONFIG_VT_CONSOLE=y -CONFIG_SERIAL=y -CONFIG_SERIAL_CONSOLE=y -CONFIG_SERIAL_ACPI=y -# CONFIG_SERIAL_EXTENDED is not set +CONFIG_HW_CONSOLE=y # CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +# CONFIG_SERIAL_8250_CS is not set +# CONFIG_SERIAL_8250_ACPI is not set +# CONFIG_SERIAL_8250_HCDP is not set +CONFIG_SERIAL_8250_EXTENDED=y +# CONFIG_SERIAL_8250_MANY_PORTS is not set +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_MULTIPORT is not set +# CONFIG_SERIAL_8250_RSA is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=256 @@ -500,6 +585,8 @@ # CONFIG_I2C_PHILIPSPAR is not set # CONFIG_I2C_ELV is not set # CONFIG_I2C_VELLEMAN is not set +# CONFIG_SCx200_I2C is not set +# CONFIG_SCx200_ACB is not set # CONFIG_I2C_ALGOPCF is not set CONFIG_I2C_CHARDEV=y CONFIG_I2C_PROC=y @@ -508,10 +595,6 @@ # Mice # # CONFIG_BUSMOUSE is not set -CONFIG_MOUSE=y -CONFIG_PSMOUSE=y -# CONFIG_82C710_MOUSE is not set -# CONFIG_PC110_PAD is not set # CONFIG_QIC02_TAPE is not set # @@ -521,6 +604,7 @@ # CONFIG_INTEL_RNG is not set # CONFIG_NVRAM is not set # CONFIG_RTC is not set +# CONFIG_GEN_RTC is not set CONFIG_EFI_RTC=y # CONFIG_DTLK is not set # CONFIG_R3964 is not set @@ -531,71 +615,37 @@ # # CONFIG_FTAPE is not set CONFIG_AGP=y -# CONFIG_AGP_INTEL is not set +CONFIG_AGP_INTEL=y +CONFIG_AGP_I810=y +CONFIG_AGP_VIA=y +CONFIG_AGP_AMD=y +CONFIG_AGP_SIS=y +CONFIG_AGP_ALI=y +CONFIG_AGP_SWORKS=y +# CONFIG_AGP_AMD_8151 is not set CONFIG_AGP_I460=y -# CONFIG_AGP_I810 is not set -# CONFIG_AGP_VIA is not set -# CONFIG_AGP_AMD is not set -# CONFIG_AGP_SIS is not set -# CONFIG_AGP_ALI is not set -# CONFIG_AGP_SWORKS is not set +CONFIG_AGP_HP_ZX1=y +CONFIG_DRM=y CONFIG_DRM_TDFX=y -# CONFIG_DRM_GAMMA is not set -# CONFIG_DRM_R128 is not set -# CONFIG_DRM_RADEON is not set -# CONFIG_DRM_I810 is not set -# CONFIG_DRM_MGA is not set +CONFIG_DRM_R128=y +CONFIG_DRM_RADEON=y +CONFIG_DRM_I810=y +CONFIG_DRM_I830=y +CONFIG_DRM_MGA=y +# CONFIG_SCx200_GPIO is not set +# CONFIG_RAW_DRIVER is not set # # Multimedia devices # -CONFIG_VIDEO_DEV=y - -# -# Video For Linux -# -CONFIG_VIDEO_PROC_FS=y -# CONFIG_I2C_PARPORT is not set - -# -# Video Adapters -# -# CONFIG_VIDEO_BT848 is not set -# CONFIG_VIDEO_PMS is not set -# CONFIG_VIDEO_CPIA is not set -# CONFIG_VIDEO_SAA5249 is not set -# CONFIG_TUNER_3036 is not set -# CONFIG_VIDEO_STRADIS is not set -# CONFIG_VIDEO_ZORAN is not set -# CONFIG_VIDEO_ZORAN_BUZ is not set -# CONFIG_VIDEO_ZORAN_DC10 is not set -# CONFIG_VIDEO_ZORAN_LML33 is not set -# CONFIG_VIDEO_ZR36120 is not set -# CONFIG_VIDEO_MEYE is not set - -# -# Radio Adapters -# -# CONFIG_RADIO_CADET is not set -# CONFIG_RADIO_RTRACK is not set -# CONFIG_RADIO_RTRACK2 is not set -# CONFIG_RADIO_AZTECH is not set -# CONFIG_RADIO_GEMTEK is not set -# CONFIG_RADIO_GEMTEK_PCI is not set -# CONFIG_RADIO_MAXIRADIO is not set -# CONFIG_RADIO_MAESTRO is not set -# CONFIG_RADIO_MIROPCM20 is not set -# CONFIG_RADIO_MIROPCM20_RDS is not set -# CONFIG_RADIO_SF16FMI is not set -# CONFIG_RADIO_TERRATEC is not set -# CONFIG_RADIO_TRUST is not set -# CONFIG_RADIO_TYPHOON is not set -# CONFIG_RADIO_ZOLTRIX is not set +# CONFIG_VIDEO_DEV is not set # # File systems # # CONFIG_QUOTA is not set +# CONFIG_QFMT_V1 is not set +# CONFIG_QFMT_V2 is not set CONFIG_AUTOFS_FS=y # CONFIG_AUTOFS4_FS is not set # CONFIG_REISERFS_FS is not set @@ -606,9 +656,9 @@ # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_BFS_FS is not set -CONFIG_EXT3_FS=m -CONFIG_JBD=m -CONFIG_JBD_DEBUG=y +CONFIG_EXT3_FS=y +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y # CONFIG_UMSDOS_FS is not set @@ -645,6 +695,9 @@ # CONFIG_UDF_RW is not set # CONFIG_UFS_FS is not set # CONFIG_UFS_FS_WRITE is not set +# CONFIG_XFS_FS is not set +# CONFIG_XFS_RT is not set +# CONFIG_XFS_QUOTA is not set # # Network File Systems @@ -653,13 +706,17 @@ # CONFIG_INTERMEZZO_FS is not set CONFIG_NFS_FS=y CONFIG_NFS_V3=y +CONFIG_NFS_V4=y # CONFIG_ROOT_NFS is not set CONFIG_NFSD=y CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y # CONFIG_NFSD_TCP is not set CONFIG_SUNRPC=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=y +# CONFIG_CIFS is not set # CONFIG_SMB_FS is not set # CONFIG_NCP_FS is not set # CONFIG_NCPFS_PACKET_SIGNING is not set @@ -670,6 +727,7 @@ # CONFIG_NCPFS_SMALLDOS is not set # CONFIG_NCPFS_NLS is not set # CONFIG_NCPFS_EXTRAS is not set +# CONFIG_AFS_FS is not set # CONFIG_ZISOFS_FS is not set # @@ -792,23 +850,23 @@ # Miscellaneous USB options # CONFIG_USB_DEVICEFS=y -# CONFIG_USB_BANDWIDTH is not set # CONFIG_USB_LONG_TIMEOUT is not set +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_DYNAMIC_MINORS is not set # # USB Host Controller Drivers # # CONFIG_USB_EHCI_HCD is not set # CONFIG_USB_OHCI_HCD is not set -CONFIG_USB_UHCI=m -# CONFIG_USB_UHCI_ALT is not set -# CONFIG_USB_OHCI is not set +CONFIG_USB_UHCI_HCD_ALT=y # # USB Device Class drivers # # CONFIG_USB_AUDIO is not set # CONFIG_USB_BLUETOOTH_TTY is not set +# CONFIG_USB_MIDI is not set # CONFIG_USB_ACM is not set # CONFIG_USB_PRINTER is not set # CONFIG_USB_STORAGE is not set @@ -819,22 +877,26 @@ # CONFIG_USB_STORAGE_DPCM is not set # CONFIG_USB_STORAGE_HP8200e is not set # CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # # USB Human Interface Devices (HID) # -CONFIG_USB_HID=m +CONFIG_USB_HID=y CONFIG_USB_HIDINPUT=y +# CONFIG_HID_FF is not set +# CONFIG_HID_PID is not set +# CONFIG_LOGITECH_FF is not set CONFIG_USB_HIDDEV=y -CONFIG_USB_KBD=m -CONFIG_USB_MOUSE=m +# CONFIG_USB_AIPTEK is not set # CONFIG_USB_WACOM is not set +# CONFIG_USB_POWERMATE is not set +# CONFIG_USB_XPAD is not set # # USB Imaging devices # -# CONFIG_USB_DC2XX is not set # CONFIG_USB_MDC800 is not set # CONFIG_USB_SCANNER is not set # CONFIG_USB_MICROTEK is not set @@ -844,6 +906,10 @@ # USB Multimedia devices # # CONFIG_USB_DABUSB is not set + +# +# Video4Linux support is needed for USB Multimedia device support +# # CONFIG_USB_VICAM is not set # CONFIG_USB_DSBR is not set # CONFIG_USB_IBMCAM is not set @@ -882,6 +948,7 @@ # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set @@ -891,6 +958,8 @@ # CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set # CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_MCT_U232 is not set @@ -908,6 +977,10 @@ # CONFIG_USB_TIGL is not set # CONFIG_USB_AUERSWALD is not set # CONFIG_USB_RIO500 is not set +# CONFIG_USB_BRLVGER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_SPEEDTOUCH is not set +# CONFIG_USB_TEST is not set # # Library routines @@ -927,11 +1000,19 @@ # CONFIG_IA64_GRANULE_16MB is not set CONFIG_IA64_GRANULE_64MB=y CONFIG_DEBUG_KERNEL=y +CONFIG_KALLSYMS=y CONFIG_IA64_PRINT_HAZARDS=y # CONFIG_DISABLE_VHPT is not set CONFIG_MAGIC_SYSRQ=y CONFIG_IA64_EARLY_PRINTK=y +# CONFIG_IA64_EARLY_PRINTK_UART is not set +CONFIG_IA64_EARLY_PRINTK_VGA=y # CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_IA64_DEBUG_CMPXCHG is not set # CONFIG_IA64_DEBUG_IRQ is not set + +# +# Security options +# +CONFIG_SECURITY_CAPABILITIES=y diff -Nru a/arch/ia64/hp/Makefile b/arch/ia64/hp/Makefile --- a/arch/ia64/hp/Makefile Mon Oct 28 16:32:37 2002 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,7 +0,0 @@ -# arch/ia64/hp/Makefile -# Copyright (c) 2002 Matthew Wilcox for Hewlett Packard - -obj-$(CONFIG_IA64_GENERIC) += sim/ zx1/ common/ -obj-$(CONFIG_IA64_HP_SIM) += sim/ - -include $(TOPDIR)/Rules.make diff -Nru a/arch/ia64/hp/sim/simscsi.c b/arch/ia64/hp/sim/simscsi.c --- a/arch/ia64/hp/sim/simscsi.c Mon Oct 28 16:32:36 2002 +++ b/arch/ia64/hp/sim/simscsi.c Mon Oct 28 16:32:36 2002 @@ -361,7 +361,9 @@ break; case MODE_SENSE: - printk("MODE_SENSE\n"); + /* sd.c uses this to determine whether disk does write-caching. */ + memset(sc->request_buffer, 0, 128); + sc->result = GOOD; break; case START_STOP: @@ -390,7 +392,5 @@ static Scsi_Host_Template driver_template = SIMSCSI; - -#define __initcall(fn) late_initcall(fn) #include "../drivers/scsi/scsi_module.c" diff -Nru a/arch/ia64/hp/sim/simserial.c b/arch/ia64/hp/sim/simserial.c --- a/arch/ia64/hp/sim/simserial.c Mon Oct 28 16:32:36 2002 +++ b/arch/ia64/hp/sim/simserial.c Mon Oct 28 16:32:36 2002 @@ -752,8 +752,7 @@ info->flags = sstate->flags; info->xmit_fifo_size = sstate->xmit_fifo_size; info->line = line; - info->tqueue.routine = do_softint; - info->tqueue.data = info; + INIT_WORK(&info->work, do_softint, info); info->state = sstate; if (sstate->info) { kfree(info); diff -Nru a/arch/ia64/ia32/ia32_ioctl.c b/arch/ia64/ia32/ia32_ioctl.c --- a/arch/ia64/ia32/ia32_ioctl.c Mon Oct 28 16:32:37 2002 +++ b/arch/ia64/ia32/ia32_ioctl.c Mon Oct 28 16:32:37 2002 @@ -26,6 +26,12 @@ #include #include #include +#include +/* Ugly hack. */ +#undef __KERNEL__ +#include +#define __KERNEL__ +#include #include @@ -60,6 +66,235 @@ || put_user(d->d_reclen, &d32->d_reclen) || copy_to_user(d32->d_name, d->d_name, namelen + 1)); } +/* + * The transform code for the SG_IO ioctl was brazenly lifted from + * the Sparc64 port in the file `arch/sparc64/kernel/ioctl32.c'. + * Thanks to Jakub Jelinek & Eddie C. Dost. + */ +typedef struct sg_io_hdr32 { + int interface_id; /* [i] 'S' for SCSI generic (required) */ + int dxfer_direction; /* [i] data transfer direction */ + char cmd_len; /* [i] SCSI command length ( <= 16 bytes) */ + char mx_sb_len; /* [i] max length to write to sbp */ + short iovec_count; /* [i] 0 implies no scatter gather */ + int dxfer_len; /* [i] byte count of data transfer */ + int dxferp; /* [i], [*io] points to data transfer memory + or scatter gather list */ + int cmdp; /* [i], [*i] points to command to perform */ + int sbp; /* [i], [*o] points to sense_buffer memory */ + int timeout; /* [i] MAX_UINT->no timeout (unit: millisec) */ + int flags; /* [i] 0 -> default, see SG_FLAG... */ + int pack_id; /* [i->o] unused internally (normally) */ + int usr_ptr; /* [i->o] unused internally */ + char status; /* [o] scsi status */ + char masked_status; /* [o] shifted, masked scsi status */ + char msg_status; /* [o] messaging level data (optional) */ + char sb_len_wr; /* [o] byte count actually written to sbp */ + short host_status; /* [o] errors from host adapter */ + short driver_status; /* [o] errors from software driver */ + int resid; /* [o] dxfer_len - actual_transferred */ + int duration; /* [o] time taken by cmd (unit: millisec) */ + int info; /* [o] auxiliary information */ +} sg_io_hdr32_t; /* 64 bytes long (on IA32) */ + +struct iovec32 { unsigned int iov_base; int iov_len; }; + +static int alloc_sg_iovec(sg_io_hdr_t *sgp, int uptr32) +{ + struct iovec32 *uiov = (struct iovec32 *) P(uptr32); + sg_iovec_t *kiov; + int i; + + sgp->dxferp = kmalloc(sgp->iovec_count * + sizeof(sg_iovec_t), GFP_KERNEL); + if (!sgp->dxferp) + return -ENOMEM; + memset(sgp->dxferp, 0, + sgp->iovec_count * sizeof(sg_iovec_t)); + + kiov = (sg_iovec_t *) sgp->dxferp; + for (i = 0; i < sgp->iovec_count; i++) { + int iov_base32; + if (__get_user(iov_base32, &uiov->iov_base) || + __get_user(kiov->iov_len, &uiov->iov_len)) + return -EFAULT; + + kiov->iov_base = kmalloc(kiov->iov_len, GFP_KERNEL); + if (!kiov->iov_base) + return -ENOMEM; + if (copy_from_user(kiov->iov_base, + (void *) P(iov_base32), + kiov->iov_len)) + return -EFAULT; + + uiov++; + kiov++; + } + + return 0; +} + +static int copy_back_sg_iovec(sg_io_hdr_t *sgp, int uptr32) +{ + struct iovec32 *uiov = (struct iovec32 *) P(uptr32); + sg_iovec_t *kiov = (sg_iovec_t *) sgp->dxferp; + int i; + + for (i = 0; i < sgp->iovec_count; i++) { + int iov_base32; + + if (__get_user(iov_base32, &uiov->iov_base)) + return -EFAULT; + + if (copy_to_user((void *) P(iov_base32), + kiov->iov_base, + kiov->iov_len)) + return -EFAULT; + + uiov++; + kiov++; + } + + return 0; +} + +static void free_sg_iovec(sg_io_hdr_t *sgp) +{ + sg_iovec_t *kiov = (sg_iovec_t *) sgp->dxferp; + int i; + + for (i = 0; i < sgp->iovec_count; i++) { + if (kiov->iov_base) { + kfree(kiov->iov_base); + kiov->iov_base = NULL; + } + kiov++; + } + kfree(sgp->dxferp); + sgp->dxferp = NULL; +} + +static int sg_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg) +{ + sg_io_hdr32_t *sg_io32; + sg_io_hdr_t sg_io64; + int dxferp32, cmdp32, sbp32; + mm_segment_t old_fs; + int err = 0; + + sg_io32 = (sg_io_hdr32_t *)arg; + err = __get_user(sg_io64.interface_id, &sg_io32->interface_id); + err |= __get_user(sg_io64.dxfer_direction, &sg_io32->dxfer_direction); + err |= __get_user(sg_io64.cmd_len, &sg_io32->cmd_len); + err |= __get_user(sg_io64.mx_sb_len, &sg_io32->mx_sb_len); + err |= __get_user(sg_io64.iovec_count, &sg_io32->iovec_count); + err |= __get_user(sg_io64.dxfer_len, &sg_io32->dxfer_len); + err |= __get_user(sg_io64.timeout, &sg_io32->timeout); + err |= __get_user(sg_io64.flags, &sg_io32->flags); + err |= __get_user(sg_io64.pack_id, &sg_io32->pack_id); + + sg_io64.dxferp = NULL; + sg_io64.cmdp = NULL; + sg_io64.sbp = NULL; + + err |= __get_user(cmdp32, &sg_io32->cmdp); + sg_io64.cmdp = kmalloc(sg_io64.cmd_len, GFP_KERNEL); + if (!sg_io64.cmdp) { + err = -ENOMEM; + goto out; + } + if (copy_from_user(sg_io64.cmdp, + (void *) P(cmdp32), + sg_io64.cmd_len)) { + err = -EFAULT; + goto out; + } + + err |= __get_user(sbp32, &sg_io32->sbp); + sg_io64.sbp = kmalloc(sg_io64.mx_sb_len, GFP_KERNEL); + if (!sg_io64.sbp) { + err = -ENOMEM; + goto out; + } + if (copy_from_user(sg_io64.sbp, + (void *) P(sbp32), + sg_io64.mx_sb_len)) { + err = -EFAULT; + goto out; + } + + err |= __get_user(dxferp32, &sg_io32->dxferp); + if (sg_io64.iovec_count) { + int ret; + + if ((ret = alloc_sg_iovec(&sg_io64, dxferp32))) { + err = ret; + goto out; + } + } else { + sg_io64.dxferp = kmalloc(sg_io64.dxfer_len, GFP_KERNEL); + if (!sg_io64.dxferp) { + err = -ENOMEM; + goto out; + } + if (copy_from_user(sg_io64.dxferp, + (void *) P(dxferp32), + sg_io64.dxfer_len)) { + err = -EFAULT; + goto out; + } + } + + /* Unused internally, do not even bother to copy it over. */ + sg_io64.usr_ptr = NULL; + + if (err) + return -EFAULT; + + old_fs = get_fs(); + set_fs (KERNEL_DS); + err = sys_ioctl (fd, cmd, (unsigned long) &sg_io64); + set_fs (old_fs); + + if (err < 0) + goto out; + + err = __put_user(sg_io64.pack_id, &sg_io32->pack_id); + err |= __put_user(sg_io64.status, &sg_io32->status); + err |= __put_user(sg_io64.masked_status, &sg_io32->masked_status); + err |= __put_user(sg_io64.msg_status, &sg_io32->msg_status); + err |= __put_user(sg_io64.sb_len_wr, &sg_io32->sb_len_wr); + err |= __put_user(sg_io64.host_status, &sg_io32->host_status); + err |= __put_user(sg_io64.driver_status, &sg_io32->driver_status); + err |= __put_user(sg_io64.resid, &sg_io32->resid); + err |= __put_user(sg_io64.duration, &sg_io32->duration); + err |= __put_user(sg_io64.info, &sg_io32->info); + err |= copy_to_user((void *)P(sbp32), sg_io64.sbp, sg_io64.mx_sb_len); + if (sg_io64.dxferp) { + if (sg_io64.iovec_count) + err |= copy_back_sg_iovec(&sg_io64, dxferp32); + else + err |= copy_to_user((void *)P(dxferp32), + sg_io64.dxferp, + sg_io64.dxfer_len); + } + if (err) + err = -EFAULT; + +out: + if (sg_io64.cmdp) + kfree(sg_io64.cmdp); + if (sg_io64.sbp) + kfree(sg_io64.sbp); + if (sg_io64.dxferp) { + if (sg_io64.iovec_count) { + free_sg_iovec(&sg_io64); + } else { + kfree(sg_io64.dxferp); + } + } + return err; +} asmlinkage long sys32_ioctl (unsigned int fd, unsigned int cmd, unsigned int arg) @@ -270,6 +505,9 @@ break; default: return sys_ioctl(fd, cmd, (unsigned long)arg); + + case IOCTL_NR(SG_IO): + return(sg_ioctl_trans(fd, cmd, arg)); } printk("%x:unimplemented IA32 ioctl system call\n", cmd); diff -Nru a/arch/ia64/ia32/ia32_signal.c b/arch/ia64/ia32/ia32_signal.c --- a/arch/ia64/ia32/ia32_signal.c Mon Oct 28 16:32:35 2002 +++ b/arch/ia64/ia32/ia32_signal.c Mon Oct 28 16:32:35 2002 @@ -39,6 +39,16 @@ #define __IA32_NR_sigreturn 119 #define __IA32_NR_rt_sigreturn 173 +register double f16 asm ("f16"); register double f17 asm ("f17"); +register double f18 asm ("f18"); register double f19 asm ("f19"); +register double f20 asm ("f20"); register double f21 asm ("f21"); +register double f22 asm ("f22"); register double f23 asm ("f23"); + +register double f24 asm ("f24"); register double f25 asm ("f25"); +register double f26 asm ("f26"); register double f27 asm ("f27"); +register double f28 asm ("f28"); register double f29 asm ("f29"); +register double f30 asm ("f30"); register double f31 asm ("f31"); + struct sigframe_ia32 { int pretcode; @@ -143,6 +153,282 @@ return err; } + +/* + * SAVE and RESTORE of ia32 fpstate info, from ia64 current state + * Used in exception handler to pass the fpstate to the user, and restore + * the fpstate while returning from the exception handler. + * + * fpstate info and their mapping to IA64 regs: + * fpstate REG(BITS) Attribute Comments + * cw ar.fcr(0:12) with bits 7 and 6 not used + * sw ar.fsr(0:15) + * tag ar.fsr(16:31) with odd numbered bits not used + * (read returns 0, writes ignored) + * ipoff ar.fir(0:31) RO + * cssel ar.fir(32:47) RO + * dataoff ar.fdr(0:31) RO + * datasel ar.fdr(32:47) RO + * + * _st[(0+TOS)%8] f8 + * _st[(1+TOS)%8] f9 (f8, f9 from ptregs) + * : : : (f10..f15 from live reg) + * : : : + * _st[(7+TOS)%8] f15 TOS=sw.top(bits11:13) + * + * status Same as sw RO + * magic 0 as X86_FXSR_MAGIC in ia32 + * mxcsr Bits(7:15)=ar.fcr(39:47) + * Bits(0:5) =ar.fsr(32:37) with bit 6 reserved + * _xmm[0..7] f16..f31 (live registers) + * with _xmm[0] + * Bit(64:127)=f17(0:63) + * Bit(0:63)=f16(0:63) + * All other fields unused... + */ + +#define __ldfe(regnum, x) \ +({ \ + register double __f__ asm ("f"#regnum); \ + __asm__ __volatile__ ("ldfe %0=[%1] ;;" :"=f"(__f__): "r"(x)); \ +}) + +#define __ldf8(regnum, x) \ +({ \ + register double __f__ asm ("f"#regnum); \ + __asm__ __volatile__ ("ldf8 %0=[%1] ;;" :"=f"(__f__): "r"(x)); \ +}) + +#define __stfe(x, regnum) \ +({ \ + register double __f__ asm ("f"#regnum); \ + __asm__ __volatile__ ("stfe [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \ +}) + +#define __stf8(x, regnum) \ +({ \ + register double __f__ asm ("f"#regnum); \ + __asm__ __volatile__ ("stf8 [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \ +}) + +static int +save_ia32_fpstate_live (struct _fpstate_ia32 *save) +{ + struct task_struct *tsk = current; + struct pt_regs *ptp; + struct _fpreg_ia32 *fpregp; + char buf[32]; + unsigned long fsr, fcr, fir, fdr; + unsigned long new_fsr; + unsigned long num128[2]; + unsigned long mxcsr=0; + int fp_tos, fr8_st_map; + + if (!access_ok(VERIFY_WRITE, save, sizeof(*save))) + return -EFAULT; + + /* Readin fsr, fcr, fir, fdr and copy onto fpstate */ + asm volatile ( "mov %0=ar.fsr;" : "=r"(fsr)); + asm volatile ( "mov %0=ar.fcr;" : "=r"(fcr)); + asm volatile ( "mov %0=ar.fir;" : "=r"(fir)); + asm volatile ( "mov %0=ar.fdr;" : "=r"(fdr)); + /* + * We need to clear the exception state before calling the signal handler. Clear + * the bits 15, bits 0-7 in fp status word. Similar to the functionality of fnclex + * instruction. + */ + new_fsr = fsr & ~0x80ff; + asm volatile ( "mov ar.fsr=%0;" :: "r"(new_fsr)); + + __put_user(fcr & 0xffff, &save->cw); + __put_user(fsr & 0xffff, &save->sw); + __put_user((fsr>>16) & 0xffff, &save->tag); + __put_user(fir, &save->ipoff); + __put_user((fir>>32) & 0xffff, &save->cssel); + __put_user(fdr, &save->dataoff); + __put_user((fdr>>32) & 0xffff, &save->datasel); + __put_user(fsr & 0xffff, &save->status); + + mxcsr = ((fcr>>32) & 0xff80) | ((fsr>>32) & 0x3f); + __put_user(mxcsr & 0xffff, &save->mxcsr); + __put_user( 0, &save->magic); //#define X86_FXSR_MAGIC 0x0000 + + /* + * save f8 and f9 from pt_regs + * save f10..f15 from live register set + */ + /* + * Find the location where f8 has to go in fp reg stack. This depends on + * TOP(11:13) field of sw. Other f reg continue sequentially from where f8 maps + * to. + */ + fp_tos = (fsr>>11)&0x7; + fr8_st_map = (8-fp_tos)&0x7; + ptp = ia64_task_regs(tsk); + fpregp = (struct _fpreg_ia32 *)(((unsigned long)buf + 15) & ~15); + ia64f2ia32f(fpregp, &ptp->f8); + copy_to_user(&save->_st[(0+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32)); + ia64f2ia32f(fpregp, &ptp->f9); + copy_to_user(&save->_st[(1+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32)); + + __stfe(fpregp, 10); + copy_to_user(&save->_st[(2+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32)); + __stfe(fpregp, 11); + copy_to_user(&save->_st[(3+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32)); + __stfe(fpregp, 12); + copy_to_user(&save->_st[(4+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32)); + __stfe(fpregp, 13); + copy_to_user(&save->_st[(5+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32)); + __stfe(fpregp, 14); + copy_to_user(&save->_st[(6+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32)); + __stfe(fpregp, 15); + copy_to_user(&save->_st[(7+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32)); + + __stf8(&num128[0], 16); + __stf8(&num128[1], 17); + copy_to_user(&save->_xmm[0], num128, sizeof(struct _xmmreg_ia32)); + + __stf8(&num128[0], 18); + __stf8(&num128[1], 19); + copy_to_user(&save->_xmm[1], num128, sizeof(struct _xmmreg_ia32)); + + __stf8(&num128[0], 20); + __stf8(&num128[1], 21); + copy_to_user(&save->_xmm[2], num128, sizeof(struct _xmmreg_ia32)); + + __stf8(&num128[0], 22); + __stf8(&num128[1], 23); + copy_to_user(&save->_xmm[3], num128, sizeof(struct _xmmreg_ia32)); + + __stf8(&num128[0], 24); + __stf8(&num128[1], 25); + copy_to_user(&save->_xmm[4], num128, sizeof(struct _xmmreg_ia32)); + + __stf8(&num128[0], 26); + __stf8(&num128[1], 27); + copy_to_user(&save->_xmm[5], num128, sizeof(struct _xmmreg_ia32)); + + __stf8(&num128[0], 28); + __stf8(&num128[1], 29); + copy_to_user(&save->_xmm[6], num128, sizeof(struct _xmmreg_ia32)); + + __stf8(&num128[0], 30); + __stf8(&num128[1], 31); + copy_to_user(&save->_xmm[7], num128, sizeof(struct _xmmreg_ia32)); + return 0; +} + +static int +restore_ia32_fpstate_live (struct _fpstate_ia32 *save) +{ + struct task_struct *tsk = current; + struct pt_regs *ptp; + unsigned int lo, hi; + unsigned long num128[2]; + unsigned long num64, mxcsr; + struct _fpreg_ia32 *fpregp; + char buf[32]; + unsigned long fsr, fcr; + int fp_tos, fr8_st_map; + + if (!access_ok(VERIFY_READ, save, sizeof(*save))) + return(-EFAULT); + + /* + * Updating fsr, fcr, fir, fdr. + * Just a bit more complicated than save. + * - Need to make sure that we dont write any value other than the + * specific fpstate info + * - Need to make sure that the untouched part of frs, fdr, fir, fcr + * should remain same while writing. + * So, we do a read, change specific fields and write. + */ + asm volatile ( "mov %0=ar.fsr;" : "=r"(fsr)); + asm volatile ( "mov %0=ar.fcr;" : "=r"(fcr)); + + __get_user(mxcsr, (unsigned int *)&save->mxcsr); + /* setting bits 0..5 8..12 with cw and 39..47 from mxcsr */ + __get_user(lo, (unsigned int *)&save->cw); + num64 = mxcsr & 0xff10; + num64 = (num64 << 32) | (lo & 0x1f3f); + fcr = (fcr & (~0xff1000001f3f)) | num64; + + /* setting bits 0..31 with sw and tag and 32..37 from mxcsr */ + __get_user(lo, (unsigned int *)&save->sw); + __get_user(hi, (unsigned int *)&save->tag); + num64 = mxcsr & 0x3f; + num64 = (num64 << 16) | (hi & 0xffff); + num64 = (num64 << 16) | (lo & 0xffff); + fsr = (fsr & (~0x3fffffffff)) | num64; + + asm volatile ( "mov ar.fsr=%0;" :: "r"(fsr)); + asm volatile ( "mov ar.fcr=%0;" :: "r"(fcr)); + /* + * restore f8, f9 onto pt_regs + * restore f10..f15 onto live registers + */ + /* + * Find the location where f8 has to go in fp reg stack. This depends on + * TOP(11:13) field of sw. Other f reg continue sequentially from where f8 maps + * to. + */ + fp_tos = (fsr>>11)&0x7; + fr8_st_map = (8-fp_tos)&0x7; + fpregp = (struct _fpreg_ia32 *)(((unsigned long)buf + 15) & ~15); + + ptp = ia64_task_regs(tsk); + copy_from_user(fpregp, &save->_st[(0+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32)); + ia32f2ia64f(&ptp->f8, fpregp); + copy_from_user(fpregp, &save->_st[(1+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32)); + ia32f2ia64f(&ptp->f9, fpregp); + + copy_from_user(fpregp, &save->_st[(2+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32)); + __ldfe(10, fpregp); + copy_from_user(fpregp, &save->_st[(3+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32)); + __ldfe(11, fpregp); + copy_from_user(fpregp, &save->_st[(4+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32)); + __ldfe(12, fpregp); + copy_from_user(fpregp, &save->_st[(5+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32)); + __ldfe(13, fpregp); + copy_from_user(fpregp, &save->_st[(6+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32)); + __ldfe(14, fpregp); + copy_from_user(fpregp, &save->_st[(7+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32)); + __ldfe(15, fpregp); + + copy_from_user(num128, &save->_xmm[0], sizeof(struct _xmmreg_ia32)); + __ldf8(16, &num128[0]); + __ldf8(17, &num128[1]); + + copy_from_user(num128, &save->_xmm[1], sizeof(struct _xmmreg_ia32)); + __ldf8(18, &num128[0]); + __ldf8(19, &num128[1]); + + copy_from_user(num128, &save->_xmm[2], sizeof(struct _xmmreg_ia32)); + __ldf8(20, &num128[0]); + __ldf8(21, &num128[1]); + + copy_from_user(num128, &save->_xmm[3], sizeof(struct _xmmreg_ia32)); + __ldf8(22, &num128[0]); + __ldf8(23, &num128[1]); + + copy_from_user(num128, &save->_xmm[4], sizeof(struct _xmmreg_ia32)); + __ldf8(24, &num128[0]); + __ldf8(25, &num128[1]); + + copy_from_user(num128, &save->_xmm[5], sizeof(struct _xmmreg_ia32)); + __ldf8(26, &num128[0]); + __ldf8(27, &num128[1]); + + copy_from_user(num128, &save->_xmm[6], sizeof(struct _xmmreg_ia32)); + __ldf8(28, &num128[0]); + __ldf8(29, &num128[1]); + + copy_from_user(num128, &save->_xmm[7], sizeof(struct _xmmreg_ia32)); + __ldf8(30, &num128[0]); + __ldf8(31, &num128[1]); + return 0; +} + static inline void sigact_set_handler (struct k_sigaction *sa, unsigned int handler, unsigned int restorer) { @@ -170,13 +456,13 @@ sigdelsetmask(&set, ~_BLOCKABLE); - spin_lock_irq(¤t->sigmask_lock); + spin_lock_irq(¤t->sig->siglock); { oldset = current->blocked; current->blocked = set; recalc_sigpending(); } - spin_unlock_irq(¤t->sigmask_lock); + spin_unlock_irq(¤t->sig->siglock); /* * The return below usually returns to the signal handler. We need to pre-set the @@ -371,6 +657,9 @@ int err = 0; unsigned long flag; + if (!access_ok(VERIFY_WRITE, sc, sizeof(*sc))) + return -EFAULT; + err |= __put_user((regs->r16 >> 32) & 0xffff, (unsigned int *)&sc->fs); err |= __put_user((regs->r16 >> 48) & 0xffff, (unsigned int *)&sc->gs); err |= __put_user((regs->r16 >> 16) & 0xffff, (unsigned int *)&sc->es); @@ -397,6 +686,11 @@ err |= __put_user(regs->r12, &sc->esp_at_signal); err |= __put_user((regs->r17 >> 16) & 0xffff, (unsigned int *)&sc->ss); + if ( save_ia32_fpstate_live(fpstate) < 0 ) + err = -EFAULT; + else + err |= __put_user((u32)(u64)fpstate, &sc->fpstate); + #if 0 tmp = save_i387(fpstate); if (tmp < 0) @@ -418,6 +712,9 @@ { unsigned int err = 0; + if (!access_ok(VERIFY_READ, sc, sizeof(*sc))) + return(-EFAULT); + #define COPY(ia64x, ia32x) err |= __get_user(regs->ia64x, &sc->ia32x) #define copyseg_gs(tmp) (regs->r16 |= (unsigned long) tmp << 48) @@ -477,6 +774,16 @@ regs->r1 = -1; /* disable syscall checks, r1 is orig_eax */ } + { + struct _fpstate_ia32 *buf = NULL; + u32 fpstate_ptr; + err |= get_user(fpstate_ptr, &(sc->fpstate)); + buf = (struct _fpstate_ia32 *)(u64)fpstate_ptr; + if (buf) { + err |= restore_ia32_fpstate_live(buf); + } + } + #if 0 { struct _fpstate * buf; @@ -686,10 +993,10 @@ goto badframe; sigdelsetmask(&set, ~_BLOCKABLE); - spin_lock_irq(¤t->sigmask_lock); + spin_lock_irq(¤t->sig->siglock); current->blocked = (sigset_t) set; recalc_sigpending(); - spin_unlock_irq(¤t->sigmask_lock); + spin_unlock_irq(¤t->sig->siglock); if (restore_sigcontext_ia32(regs, &frame->sc, &eax)) goto badframe; @@ -717,10 +1024,10 @@ goto badframe; sigdelsetmask(&set, ~_BLOCKABLE); - spin_lock_irq(¤t->sigmask_lock); + spin_lock_irq(¤t->sig->siglock); current->blocked = set; recalc_sigpending(); - spin_unlock_irq(¤t->sigmask_lock); + spin_unlock_irq(¤t->sig->siglock); if (restore_sigcontext_ia32(regs, &frame->uc.uc_mcontext, &eax)) goto badframe; diff -Nru a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c --- a/arch/ia64/ia32/sys_ia32.c Mon Oct 28 16:32:37 2002 +++ b/arch/ia64/ia32/sys_ia32.c Mon Oct 28 16:32:37 2002 @@ -2842,20 +2842,6 @@ } } -static inline void -ia32f2ia64f (void *dst, void *src) -{ - asm volatile ("ldfe f6=[%1];; stf.spill [%0]=f6" :: "r"(dst), "r"(src) : "memory"); - return; -} - -static inline void -ia64f2ia32f (void *dst, void *src) -{ - asm volatile ("ldf.fill f6=[%1];; stfe [%0]=f6" :: "r"(dst), "r"(src) : "memory"); - return; -} - static void put_fpreg (int regno, struct _fpreg_ia32 *reg, struct pt_regs *ptp, struct switch_stack *swp, int tos) diff -Nru a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c --- a/arch/ia64/kernel/acpi.c Mon Oct 28 16:32:36 2002 +++ b/arch/ia64/kernel/acpi.c Mon Oct 28 16:32:36 2002 @@ -8,6 +8,9 @@ * Copyright (C) 2000 Intel Corp. * Copyright (C) 2000,2001 J.I. Lee * Copyright (C) 2001 Paul Diefenbaugh + * Copyright (C) 2001 Jenna Hall + * Copyright (C) 2001 Takayoshi Kochi + * Copyright (C) 2002 Erich Focht * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * @@ -43,6 +46,7 @@ #include #include #include +#include #define PREFIX "ACPI: " @@ -447,6 +451,189 @@ } +#ifdef CONFIG_ACPI_NUMA + +#define SLIT_DEBUG + +#define PXM_FLAG_LEN ((MAX_PXM_DOMAINS + 1)/32) + +static int __initdata srat_num_cpus; /* number of cpus */ +static u32 __initdata pxm_flag[PXM_FLAG_LEN]; +#define pxm_bit_set(bit) (set_bit(bit,(void *)pxm_flag)) +#define pxm_bit_test(bit) (test_bit(bit,(void *)pxm_flag)) +/* maps to convert between proximity domain and logical node ID */ +int __initdata pxm_to_nid_map[MAX_PXM_DOMAINS]; +int __initdata nid_to_pxm_map[NR_NODES]; +static struct acpi_table_slit __initdata *slit_table; + +/* + * ACPI 2.0 SLIT (System Locality Information Table) + * http://devresource.hp.com/devresource/Docs/TechPapers/IA64/slit.pdf + */ +void __init +acpi_numa_slit_init (struct acpi_table_slit *slit) +{ + u32 len; + + len = sizeof(struct acpi_table_header) + 8 + + slit->localities * slit->localities; + if (slit->header.length != len) { + printk("ACPI 2.0 SLIT: size mismatch: %d expected, %d actual\n", + len, slit->header.length); + memset(numa_slit, 10, sizeof(numa_slit)); + return; + } + slit_table = slit; +} + +void __init +acpi_numa_processor_affinity_init (struct acpi_table_processor_affinity *pa) +{ + /* record this node in proximity bitmap */ + pxm_bit_set(pa->proximity_domain); + + node_cpuid[srat_num_cpus].phys_id = (pa->apic_id << 8) | (pa->lsapic_eid); + /* nid should be overridden as logical node id later */ + node_cpuid[srat_num_cpus].nid = pa->proximity_domain; + srat_num_cpus++; +} + +void __init +acpi_numa_memory_affinity_init (struct acpi_table_memory_affinity *ma) +{ + unsigned long paddr, size, hole_size, min_hole_size; + u8 pxm; + struct node_memblk_s *p, *q, *pend; + + pxm = ma->proximity_domain; + + /* fill node memory chunk structure */ + paddr = ma->base_addr_hi; + paddr = (paddr << 32) | ma->base_addr_lo; + size = ma->length_hi; + size = (size << 32) | ma->length_lo; + + if (num_memblks >= NR_MEMBLKS) { + printk("Too many mem chunks in SRAT. Ignoring %ld MBytes at %lx\n", + size/(1024*1024), paddr); + return; + } + + /* Ignore disabled entries */ + if (!ma->flags.enabled) + return; + + /* + * When the chunk is not the first one in the node, check distance + * from the other chunks. When the hole is too huge ignore the chunk. + * This restriction should be removed when multiple chunks per node + * is supported. + */ + pend = &node_memblk[num_memblks]; + min_hole_size = 0; + for (p = &node_memblk[0]; p < pend; p++) { + if (p->nid != pxm) + continue; + if (p->start_paddr < paddr) + hole_size = paddr - (p->start_paddr + p->size); + else + hole_size = p->start_paddr - (paddr + size); + + if (!min_hole_size || hole_size < min_hole_size) + min_hole_size = hole_size; + } + + if (min_hole_size) { + if (min_hole_size > size) { + printk("Too huge memory hole. Ignoring %ld MBytes at %lx\n", + size/(1024*1024), paddr); + return; + } + } + + /* record this node in proximity bitmap */ + pxm_bit_set(pxm); + + /* Insertion sort based on base address */ + pend = &node_memblk[num_memblks]; + for (p = &node_memblk[0]; p < pend; p++) { + if (paddr < p->start_paddr) + break; + } + if (p < pend) { + for (q = pend; q >= p; q--) + *(q + 1) = *q; + } + p->start_paddr = paddr; + p->size = size; + p->nid = pxm; + num_memblks++; +} + +void __init +acpi_numa_arch_fixup(void) +{ + int i, j, node_from, node_to; + + /* calculate total number of nodes in system from PXM bitmap */ + numnodes = 0; /* init total nodes in system */ + + memset(pxm_to_nid_map, -1, sizeof(pxm_to_nid_map)); + memset(nid_to_pxm_map, -1, sizeof(nid_to_pxm_map)); + for (i = 0; i < MAX_PXM_DOMAINS; i++) { + if (pxm_bit_test(i)) { + pxm_to_nid_map[i] = numnodes; + nid_to_pxm_map[numnodes++] = i; + } + } + + /* set logical node id in memory chunk structure */ + for (i = 0; i < num_memblks; i++) + node_memblk[i].nid = pxm_to_nid_map[node_memblk[i].nid]; + + /* assign memory bank numbers for each chunk on each node */ + for (i = 0; i < numnodes; i++) { + int bank; + + bank = 0; + for (j = 0; j < num_memblks; j++) + if (node_memblk[j].nid == i) + node_memblk[j].bank = bank++; + } + + /* set logical node id in cpu structure */ + for (i = 0; i < srat_num_cpus; i++) + node_cpuid[i].nid = pxm_to_nid_map[node_cpuid[i].nid]; + + printk("Number of logical nodes in system = %d\n", numnodes); + printk("Number of memory chunks in system = %d\n", num_memblks); + + if (!slit_table) return; + memset(numa_slit, -1, sizeof(numa_slit)); + for (i=0; ilocalities; i++) { + if (!pxm_bit_test(i)) + continue; + node_from = pxm_to_nid_map[i]; + for (j=0; jlocalities; j++) { + if (!pxm_bit_test(j)) + continue; + node_to = pxm_to_nid_map[j]; + node_distance(node_from, node_to) = + slit_table->entry[i*slit_table->localities + j]; + } + } + +#ifdef SLIT_DEBUG + printk("ACPI 2.0 SLIT locality table:\n"); + for (i = 0; i < numnodes; i++) { + for (j = 0; j < numnodes; j++) + printk("%03d ", node_distance(i,j)); + printk("\n"); + } +#endif +} +#endif /* CONFIG_ACPI_NUMA */ + static int __init acpi_parse_fadt (unsigned long phys_addr, unsigned long size) { @@ -556,12 +743,6 @@ int __init acpi_boot_init (char *cmdline) { - int result; - - /* Initialize the ACPI boot-time table parser */ - result = acpi_table_init(cmdline); - if (result) - return result; /* * MADT @@ -631,6 +812,9 @@ smp_boot_data.cpu_count = total_cpus; smp_build_cpu_map(); +#ifdef CONFIG_NUMA + build_cpu_to_node_map(); +#endif #endif /* Make boot-up look pretty */ printk("%d CPUs available, %d CPUs total\n", available_cpus, total_cpus); diff -Nru a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c --- a/arch/ia64/kernel/efi.c Mon Oct 28 16:32:35 2002 +++ b/arch/ia64/kernel/efi.c Mon Oct 28 16:32:35 2002 @@ -60,66 +60,156 @@ static unsigned long mem_limit = ~0UL; -static efi_status_t -phys_get_time (efi_time_t *tm, efi_time_cap_t *tc) -{ - return efi_call_phys(__va(runtime->get_time), __pa(tm), __pa(tc)); -} - -static efi_status_t -phys_set_time (efi_time_t *tm) -{ - return efi_call_phys(__va(runtime->set_time), __pa(tm)); -} - -static efi_status_t -phys_get_wakeup_time (efi_bool_t *enabled, efi_bool_t *pending, efi_time_t *tm) -{ - return efi_call_phys(__va(runtime->get_wakeup_time), __pa(enabled), __pa(pending), - __pa(tm)); -} - -static efi_status_t -phys_set_wakeup_time (efi_bool_t enabled, efi_time_t *tm) -{ - return efi_call_phys(__va(runtime->set_wakeup_time), enabled, __pa(tm)); -} - -static efi_status_t -phys_get_variable (efi_char16_t *name, efi_guid_t *vendor, u32 *attr, - unsigned long *data_size, void *data) -{ - return efi_call_phys(__va(runtime->get_variable), __pa(name), __pa(vendor), __pa(attr), - __pa(data_size), __pa(data)); -} - -static efi_status_t -phys_get_next_variable (unsigned long *name_size, efi_char16_t *name, efi_guid_t *vendor) -{ - return efi_call_phys(__va(runtime->get_next_variable), __pa(name_size), __pa(name), - __pa(vendor)); -} - -static efi_status_t -phys_set_variable (efi_char16_t *name, efi_guid_t *vendor, u32 attr, - unsigned long data_size, void *data) -{ - return efi_call_phys(__va(runtime->set_variable), __pa(name), __pa(vendor), attr, - data_size, __pa(data)); -} +#define efi_call_virt(f, args...) (*(f))(args) -static efi_status_t -phys_get_next_high_mono_count (u64 *count) -{ - return efi_call_phys(__va(runtime->get_next_high_mono_count), __pa(count)); -} - -static void -phys_reset_system (int reset_type, efi_status_t status, - unsigned long data_size, efi_char16_t *data) -{ - efi_call_phys(__va(runtime->reset_system), status, data_size, __pa(data)); -} +#define STUB_GET_TIME(prefix, adjust_arg) \ +static efi_status_t \ +prefix##_get_time (efi_time_t *tm, efi_time_cap_t *tc) \ +{ \ + struct ia64_fpreg fr[6]; \ + efi_status_t ret; \ + \ + ia64_save_scratch_fpregs(fr); \ + ret = efi_call_##prefix((efi_get_time_t *) __va(runtime->get_time), adjust_arg(tm), \ + adjust_arg(tc)); \ + ia64_load_scratch_fpregs(fr); \ + return ret; \ +} + +#define STUB_SET_TIME(prefix, adjust_arg) \ +static efi_status_t \ +prefix##_set_time (efi_time_t *tm) \ +{ \ + struct ia64_fpreg fr[6]; \ + efi_status_t ret; \ + \ + ia64_save_scratch_fpregs(fr); \ + ret = efi_call_##prefix((efi_set_time_t *) __va(runtime->set_time), adjust_arg(tm)); \ + ia64_load_scratch_fpregs(fr); \ + return ret; \ +} + +#define STUB_GET_WAKEUP_TIME(prefix, adjust_arg) \ +static efi_status_t \ +prefix##_get_wakeup_time (efi_bool_t *enabled, efi_bool_t *pending, efi_time_t *tm) \ +{ \ + struct ia64_fpreg fr[6]; \ + efi_status_t ret; \ + \ + ia64_save_scratch_fpregs(fr); \ + ret = efi_call_##prefix((efi_get_wakeup_time_t *) __va(runtime->get_wakeup_time), \ + adjust_arg(enabled), adjust_arg(pending), adjust_arg(tm)); \ + ia64_load_scratch_fpregs(fr); \ + return ret; \ +} + +#define STUB_SET_WAKEUP_TIME(prefix, adjust_arg) \ +static efi_status_t \ +prefix##_set_wakeup_time (efi_bool_t enabled, efi_time_t *tm) \ +{ \ + struct ia64_fpreg fr[6]; \ + efi_status_t ret; \ + \ + ia64_save_scratch_fpregs(fr); \ + ret = efi_call_##prefix((efi_set_wakeup_time_t *) __va(runtime->set_wakeup_time), \ + enabled, adjust_arg(tm)); \ + ia64_load_scratch_fpregs(fr); \ + return ret; \ +} + +#define STUB_GET_VARIABLE(prefix, adjust_arg) \ +static efi_status_t \ +prefix##_get_variable (efi_char16_t *name, efi_guid_t *vendor, u32 *attr, \ + unsigned long *data_size, void *data) \ +{ \ + struct ia64_fpreg fr[6]; \ + efi_status_t ret; \ + \ + ia64_save_scratch_fpregs(fr); \ + ret = efi_call_##prefix((efi_get_variable_t *) __va(runtime->get_variable), \ + adjust_arg(name), adjust_arg(vendor), adjust_arg(attr), \ + adjust_arg(data_size), adjust_arg(data)); \ + ia64_load_scratch_fpregs(fr); \ + return ret; \ +} + +#define STUB_GET_NEXT_VARIABLE(prefix, adjust_arg) \ +static efi_status_t \ +prefix##_get_next_variable (unsigned long *name_size, efi_char16_t *name, efi_guid_t *vendor) \ +{ \ + struct ia64_fpreg fr[6]; \ + efi_status_t ret; \ + \ + ia64_save_scratch_fpregs(fr); \ + ret = efi_call_##prefix((efi_get_next_variable_t *) __va(runtime->get_next_variable), \ + adjust_arg(name_size), adjust_arg(name), adjust_arg(vendor)); \ + ia64_load_scratch_fpregs(fr); \ + return ret; \ +} + +#define STUB_SET_VARIABLE(prefix, adjust_arg) \ +static efi_status_t \ +prefix##_set_variable (efi_char16_t *name, efi_guid_t *vendor, u32 attr, \ + unsigned long data_size, void *data) \ +{ \ + struct ia64_fpreg fr[6]; \ + efi_status_t ret; \ + \ + ia64_save_scratch_fpregs(fr); \ + ret = efi_call_##prefix((efi_set_variable_t *) __va(runtime->set_variable), \ + adjust_arg(name), adjust_arg(vendor), attr, data_size, \ + adjust_arg(data)); \ + ia64_load_scratch_fpregs(fr); \ + return ret; \ +} + +#define STUB_GET_NEXT_HIGH_MONO_COUNT(prefix, adjust_arg) \ +static efi_status_t \ +prefix##_get_next_high_mono_count (u64 *count) \ +{ \ + struct ia64_fpreg fr[6]; \ + efi_status_t ret; \ + \ + ia64_save_scratch_fpregs(fr); \ + ret = efi_call_##prefix((efi_get_next_high_mono_count_t *) \ + __va(runtime->get_next_high_mono_count), adjust_arg(count)); \ + ia64_load_scratch_fpregs(fr); \ + return ret; \ +} + +#define STUB_RESET_SYSTEM(prefix, adjust_arg) \ +static void \ +prefix##_reset_system (int reset_type, efi_status_t status, \ + unsigned long data_size, efi_char16_t *data) \ +{ \ + struct ia64_fpreg fr[6]; \ + \ + ia64_save_scratch_fpregs(fr); \ + efi_call_##prefix((efi_reset_system_t *) __va(runtime->reset_system), \ + reset_type, status, data_size, adjust_arg(data)); \ + /* should not return, but just in case... */ \ + ia64_load_scratch_fpregs(fr); \ +} + +STUB_GET_TIME(phys, __pa) +STUB_SET_TIME(phys, __pa) +STUB_GET_WAKEUP_TIME(phys, __pa) +STUB_SET_WAKEUP_TIME(phys, __pa) +STUB_GET_VARIABLE(phys, __pa) +STUB_GET_NEXT_VARIABLE(phys, __pa) +STUB_SET_VARIABLE(phys, __pa) +STUB_GET_NEXT_HIGH_MONO_COUNT(phys, __pa) +STUB_RESET_SYSTEM(phys, __pa) + +STUB_GET_TIME(virt, ) +STUB_SET_TIME(virt, ) +STUB_GET_WAKEUP_TIME(virt, ) +STUB_SET_WAKEUP_TIME(virt, ) +STUB_GET_VARIABLE(virt, ) +STUB_GET_NEXT_VARIABLE(virt, ) +STUB_SET_VARIABLE(virt, ) +STUB_GET_NEXT_HIGH_MONO_COUNT(virt, ) +STUB_RESET_SYSTEM(virt, ) void efi_gettimeofday (struct timeval *tv) @@ -574,18 +664,17 @@ } /* - * Now that EFI is in virtual mode, we arrange for EFI functions to be - * called directly: + * Now that EFI is in virtual mode, we call the EFI functions more efficiently: */ - efi.get_time = __va(runtime->get_time); - efi.set_time = __va(runtime->set_time); - efi.get_wakeup_time = __va(runtime->get_wakeup_time); - efi.set_wakeup_time = __va(runtime->set_wakeup_time); - efi.get_variable = __va(runtime->get_variable); - efi.get_next_variable = __va(runtime->get_next_variable); - efi.set_variable = __va(runtime->set_variable); - efi.get_next_high_mono_count = __va(runtime->get_next_high_mono_count); - efi.reset_system = __va(runtime->reset_system); + efi.get_time = virt_get_time; + efi.set_time = virt_set_time; + efi.get_wakeup_time = virt_get_wakeup_time; + efi.set_wakeup_time = virt_set_wakeup_time; + efi.get_variable = virt_get_variable; + efi.get_next_variable = virt_get_next_variable; + efi.set_variable = virt_set_variable; + efi.get_next_high_mono_count = virt_get_next_high_mono_count; + efi.reset_system = virt_reset_system; } /* diff -Nru a/arch/ia64/kernel/fw-emu.c b/arch/ia64/kernel/fw-emu.c --- a/arch/ia64/kernel/fw-emu.c Mon Oct 28 16:32:35 2002 +++ b/arch/ia64/kernel/fw-emu.c Mon Oct 28 16:32:35 2002 @@ -2,7 +2,7 @@ * PAL & SAL emulation. * * Copyright (C) 1998-2001 Hewlett-Packard Co - * Copyright (C) 1998-2001 David Mosberger-Tang + * David Mosberger-Tang * * For the HP simulator, this file gets include in boot/bootloader.c. * For SoftSDV, this file gets included in sys_softsdv.c. diff -Nru a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c --- a/arch/ia64/kernel/iosapic.c Mon Oct 28 16:32:36 2002 +++ b/arch/ia64/kernel/iosapic.c Mon Oct 28 16:32:36 2002 @@ -133,12 +133,8 @@ return -1; } -/* - * Translate GSI number to the corresponding IA-64 interrupt vector. If no - * entry exists, return -1. - */ -int -gsi_to_vector (unsigned int gsi) +static inline int +_gsi_to_vector (unsigned int gsi) { struct iosapic_intr_info *info; @@ -148,6 +144,26 @@ return -1; } +/* + * Translate GSI number to the corresponding IA-64 interrupt vector. If no + * entry exists, return -1. + */ +inline int +gsi_to_vector (unsigned int gsi) +{ + return _gsi_to_vector(gsi); +} + +int +gsi_to_irq (unsigned int gsi) +{ + /* + * XXX fix me: this assumes an identity mapping vetween IA-64 vector and Linux irq + * numbers... + */ + return _gsi_to_vector(gsi); +} + static void set_rte (unsigned int vector, unsigned int dest) { @@ -157,7 +173,7 @@ int rte_index; char redir; - DBG(KERN_DEBUG"IOSAPIC: routing vector %d to %x\n", vector, dest); + DBG(KERN_DEBUG"IOSAPIC: routing vector %d to 0x%x\n", vector, dest); rte_index = iosapic_intr_info[vector].rte_index; if (rte_index < 0) diff -Nru a/arch/ia64/kernel/ivt.S b/arch/ia64/kernel/ivt.S --- a/arch/ia64/kernel/ivt.S Mon Oct 28 16:32:35 2002 +++ b/arch/ia64/kernel/ivt.S Mon Oct 28 16:32:35 2002 @@ -116,8 +116,8 @@ ;; (p8) dep r25=r18,r25,2,6 (p8) shr r22=r22,HPAGE_SHIFT-PAGE_SHIFT - ;; #endif + ;; cmp.eq p6,p7=5,r17 // is IFA pointing into to region 5? shr.u r18=r22,PGDIR_SHIFT // get bits 33-63 of the faulting address ;; diff -Nru a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c --- a/arch/ia64/kernel/mca.c Mon Oct 28 16:32:36 2002 +++ b/arch/ia64/kernel/mca.c Mon Oct 28 16:32:36 2002 @@ -1012,28 +1012,13 @@ void ia64_log_rec_header_print (sal_log_record_header_t *lh, prfunc_t prfunc) { - char str_buf[32]; - - sprintf(str_buf, "%2d.%02d", - (lh->revision.major >> 4) * 10 + (lh->revision.major & 0xf), - (lh->revision.minor >> 4) * 10 + (lh->revision.minor & 0xf)); - prfunc("+Err Record ID: %d SAL Rev: %s\n", lh->id, str_buf); - sprintf(str_buf, "%02d/%02d/%04d/ %02d:%02d:%02d", - (lh->timestamp.slh_month >> 4) * 10 + - (lh->timestamp.slh_month & 0xf), - (lh->timestamp.slh_day >> 4) * 10 + - (lh->timestamp.slh_day & 0xf), - (lh->timestamp.slh_century >> 4) * 1000 + - (lh->timestamp.slh_century & 0xf) * 100 + - (lh->timestamp.slh_year >> 4) * 10 + - (lh->timestamp.slh_year & 0xf), - (lh->timestamp.slh_hour >> 4) * 10 + - (lh->timestamp.slh_hour & 0xf), - (lh->timestamp.slh_minute >> 4) * 10 + - (lh->timestamp.slh_minute & 0xf), - (lh->timestamp.slh_second >> 4) * 10 + - (lh->timestamp.slh_second & 0xf)); - prfunc("+Time: %s Severity %d\n", str_buf, lh->severity); + prfunc("+Err Record ID: %d SAL Rev: %2x.%02x\n", lh->id, + lh->revision.major, lh->revision.minor); + prfunc("+Time: %02x/%02x/%02x%02x %02x:%02x:%02x Severity %d\n", + lh->timestamp.slh_month, lh->timestamp.slh_day, + lh->timestamp.slh_century, lh->timestamp.slh_year, + lh->timestamp.slh_hour, lh->timestamp.slh_minute, + lh->timestamp.slh_second, lh->severity); } /* diff -Nru a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c --- a/arch/ia64/kernel/perfmon.c Mon Oct 28 16:32:37 2002 +++ b/arch/ia64/kernel/perfmon.c Mon Oct 28 16:32:37 2002 @@ -63,6 +63,26 @@ * Misc macros and definitions */ #define PMU_FIRST_COUNTER 4 +#define PMU_MAX_PMCS 256 +#define PMU_MAX_PMDS 256 + +/* + * type of a PMU register (bitmask). + * bitmask structure: + * bit0 : register implemented + * bit1 : end marker + * bit2-3 : reserved + * bit4-7 : register type + * bit8-31: reserved + */ +#define PFM_REG_IMPL 0x1 /* register implemented */ +#define PFM_REG_END 0x2 /* end marker */ +#define PFM_REG_MONITOR (0x1<<4|PFM_REG_IMPL) /* a PMC with a pmc.pm field only */ +#define PFM_REG_COUNTING (0x2<<4|PFM_REG_IMPL) /* a PMC with a pmc.pm AND pmc.oi, a PMD used as a counter */ +#define PFM_REG_CONTROL (0x3<<4|PFM_REG_IMPL) /* PMU control register */ +#define PFM_REG_CONFIG (0x4<<4|PFM_REG_IMPL) /* refine configuration */ +#define PFM_REG_BUFFER (0x5<<4|PFM_REG_IMPL) /* PMD used as buffer */ + #define PFM_IS_DISABLED() pmu_conf.pfm_is_disabled @@ -70,13 +90,18 @@ #define PFM_FL_INHERIT_MASK (PFM_FL_INHERIT_NONE|PFM_FL_INHERIT_ONCE|PFM_FL_INHERIT_ALL) /* i assume unsigned */ -#define PMC_IS_IMPL(i) (i>6] & (1UL<< (i) %64)) -#define PMD_IS_IMPL(i) (i>6)] & (1UL<<(i) % 64)) +#define PMC_IS_IMPL(i) (i< PMU_MAX_PMCS && (pmu_conf.pmc_desc[i].type & PFM_REG_IMPL)) +#define PMD_IS_IMPL(i) (i< PMU_MAX_PMDS && (pmu_conf.pmd_desc[i].type & PFM_REG_IMPL)) /* XXX: these three assume that register i is implemented */ #define PMD_IS_COUNTING(i) (pmu_conf.pmd_desc[i].type == PFM_REG_COUNTING) #define PMC_IS_COUNTING(i) (pmu_conf.pmc_desc[i].type == PFM_REG_COUNTING) #define PMC_IS_MONITOR(i) (pmu_conf.pmc_desc[i].type == PFM_REG_MONITOR) +#define PMC_DFL_VAL(i) pmu_conf.pmc_desc[i].default_value +#define PMC_RSVD_MASK(i) pmu_conf.pmc_desc[i].reserved_mask +#define PMD_PMD_DEP(i) pmu_conf.pmd_desc[i].dep_pmd[0] +#define PMC_PMD_DEP(i) pmu_conf.pmc_desc[i].dep_pmd[0] + /* k assume unsigned */ #define IBR_IS_IMPL(k) (kpsb_lock) /* - * The possible type of a PMU register - */ -typedef enum { - PFM_REG_NOTIMPL, /* not implemented */ - PFM_REG_NONE, /* end marker */ - PFM_REG_MONITOR, /* a PMC with a pmc.pm field only */ - PFM_REG_COUNTING,/* a PMC with a pmc.pm AND pmc.oi, a PMD used as a counter */ - PFM_REG_CONTROL, /* PMU control register */ - PFM_REG_CONFIG, /* refine configuration */ - PFM_REG_BUFFER /* PMD used as buffer */ -} pfm_pmu_reg_type_t; - -/* * 64-bit software counter structure */ typedef struct { @@ -283,13 +295,16 @@ * dep_pmc[]: a bitmask of dependent PMC registers */ typedef struct { - pfm_pmu_reg_type_t type; + unsigned int type; int pm_pos; + unsigned long default_value; /* power-on default value */ + unsigned long reserved_mask; /* bitmask of reserved bits */ int (*read_check)(struct task_struct *task, unsigned int cnum, unsigned long *val, struct pt_regs *regs); int (*write_check)(struct task_struct *task, unsigned int cnum, unsigned long *val, struct pt_regs *regs); unsigned long dep_pmd[4]; unsigned long dep_pmc[4]; } pfm_reg_desc_t; + /* assume cnum is a valid monitor */ #define PMC_PM(cnum, val) (((val) >> (pmu_conf.pmc_desc[cnum].pm_pos)) & 0x1) #define PMC_WR_FUNC(cnum) (pmu_conf.pmc_desc[cnum].write_check) @@ -401,8 +416,6 @@ }; static struct ctl_table_header *pfm_sysctl_header; -static unsigned long reset_pmcs[IA64_NUM_PMC_REGS]; /* contains PAL reset values for PMCS */ - static void pfm_vm_close(struct vm_area_struct * area); static struct vm_operations_struct pfm_vm_ops={ @@ -422,7 +435,7 @@ /* * forward declarations */ -static void ia64_reset_pmu(struct task_struct *); +static void pfm_reset_pmu(struct task_struct *); #ifdef CONFIG_SMP static void pfm_fetch_regs(int cpu, struct task_struct *task, pfm_context_t *ctx); #endif @@ -2244,7 +2257,7 @@ pfm_lazy_save_regs(PMU_OWNER()); /* reset all registers to stable quiet state */ - ia64_reset_pmu(task); + pfm_reset_pmu(task); /* make sure nothing starts */ if (ctx->ctx_fl_system) { @@ -2307,7 +2320,7 @@ if (!PMC_IS_IMPL(cnum)) goto abort_mission; - tmp.reg_value = reset_pmcs[cnum]; + tmp.reg_value = PMC_DFL_VAL(cnum); PFM_REG_RETFLAG_SET(tmp.reg_flags, 0); @@ -2998,6 +3011,8 @@ p += sprintf(p, "CPU%-2d recorded samples : %lu\n", i, pfm_stats[i].pfm_recorded_samples_count); p += sprintf(p, "CPU%-2d smpl buffer full : %lu\n", i, pfm_stats[i].pfm_full_smpl_buffer_count); p += sprintf(p, "CPU%-2d owner : %d\n", i, pmu_owners[i].owner ? pmu_owners[i].owner->pid: -1); + p += sprintf(p, "CPU%-2d syst_wide : %d\n", i, per_cpu(pfm_syst_wide, i)); + p += sprintf(p, "CPU%-2d dcr_pp : %d\n", i, per_cpu(pfm_dcr_pp, i)); } LOCK_PFS(); @@ -3398,11 +3413,10 @@ * XXX: make this routine able to work with non current context */ static void -ia64_reset_pmu(struct task_struct *task) +pfm_reset_pmu(struct task_struct *task) { struct thread_struct *t = &task->thread; pfm_context_t *ctx = t->pfm_context; - unsigned long mask; int i; if (task != current) { @@ -3415,30 +3429,27 @@ /* * install reset values for PMC. We skip PMC0 (done above) - * XX: good up to 64 PMCS */ - mask = pmu_conf.impl_regs[0] >> 1; - for(i=1; mask; mask>>=1, i++) { - if (mask & 0x1) { - ia64_set_pmc(i, reset_pmcs[i]); - /* - * When restoring context, we must restore ALL pmcs, even the ones - * that the task does not use to avoid leaks and possibly corruption - * of the sesion because of configuration conflicts. So here, we - * initialize the entire set used in the context switch restore routine. - */ - t->pmc[i] = reset_pmcs[i]; - DBprintk((" pmc[%d]=0x%lx\n", i, reset_pmcs[i])); - - } + for (i=1; (pmu_conf.pmc_desc[i].type & PFM_REG_END) == 0; i++) { + if ((pmu_conf.pmc_desc[i].type & PFM_REG_IMPL) == 0) continue; + ia64_set_pmc(i, PMC_DFL_VAL(i)); + /* + * When restoring context, we must restore ALL pmcs, even the ones + * that the task does not use to avoid leaks and possibly corruption + * of the sesion because of configuration conflicts. So here, we + * initialize the entire set used in the context switch restore routine. + */ + t->pmc[i] = PMC_DFL_VAL(i); + DBprintk(("pmc[%d]=0x%lx\n", i, t->pmc[i])); } + /* * clear reset values for PMD. * XXX: good up to 64 PMDS. Suppose that zero is a valid value. */ - mask = pmu_conf.impl_regs[4]; - for(i=0; mask; mask>>=1, i++) { - if (mask & 0x1) ia64_set_pmd(i, 0UL); + for (i=0; (pmu_conf.pmd_desc[i].type & PFM_REG_END) == 0; i++) { + if ((pmu_conf.pmd_desc[i].type & PFM_REG_IMPL) == 0) continue; + ia64_set_pmd(i, 0UL); t->pmd[i] = 0UL; } @@ -4119,23 +4130,6 @@ }; -static void -pfm_pmu_snapshot(void) -{ - int i; - - for (i=0; i < IA64_NUM_PMC_REGS; i++) { - if (i >= pmu_conf.num_pmcs) break; - if (PMC_IS_IMPL(i)) reset_pmcs[i] = ia64_get_pmc(i); - } -#ifdef CONFIG_MCKINLEY - /* - * set the 'stupid' enable bit to power the PMU! - */ - reset_pmcs[4] |= 1UL << 23; -#endif -} - /* * perfmon initialization routine, called from the initcall() table */ @@ -4160,6 +4154,9 @@ } pmu_conf.perf_ovfl_val = (1UL << pm_info.pal_perf_mon_info_s.width) - 1; + /* + * XXX: use the pfm_*_desc tables instead and simply verify with PAL + */ pmu_conf.max_counters = pm_info.pal_perf_mon_info_s.generic; pmu_conf.num_pmcs = find_num_pm_regs(pmu_conf.impl_regs); pmu_conf.num_pmds = find_num_pm_regs(&pmu_conf.impl_regs[4]); @@ -4184,23 +4181,10 @@ pmu_conf.num_dbrs <<=1; /* - * take a snapshot of all PMU registers. PAL is supposed - * to configure them with stable/safe values, i.e., not - * capturing anything. - * We take a snapshot now, before we make any modifications. This - * will become our master copy. Then we will reuse the snapshot - * to reset the PMU in pfm_enable(). Using this technique, perfmon - * does NOT have to know about the specific values to program for - * the PMC/PMD. The safe values may be different from one CPU model to - * the other. - */ - pfm_pmu_snapshot(); - - /* * setup the register configuration descriptions for the CPU */ - pmu_conf.pmc_desc = pmc_desc; - pmu_conf.pmd_desc = pmd_desc; + pmu_conf.pmc_desc = pfm_pmc_desc; + pmu_conf.pmd_desc = pfm_pmd_desc; /* we are all set */ pmu_conf.pfm_is_disabled = 0; @@ -4222,11 +4206,34 @@ void perfmon_init_percpu (void) { + int i; + if (smp_processor_id() == 0) register_percpu_irq(IA64_PERFMON_VECTOR, &perfmon_irqaction); ia64_set_pmv(IA64_PERFMON_VECTOR); ia64_srlz_d(); + + /* + * we first initialize the PMU to a stable state. + * the values may have been changed from their power-up + * values by software executed before the kernel took over. + * + * At this point, pmu_conf has not yet been initialized + * + * On McKinley, this code is ineffective until PMC4 is initialized. + */ + for (i=1; (pfm_pmc_desc[i].type & PFM_REG_END) == 0; i++) { + if ((pfm_pmc_desc[i].type & PFM_REG_IMPL) == 0) continue; + ia64_set_pmc(i, pfm_pmc_desc[i].default_value); + } + for (i=0; (pfm_pmd_desc[i].type & PFM_REG_END) == 0; i++) { + if ((pfm_pmd_desc[i].type & PFM_REG_IMPL) == 0) continue; + ia64_set_pmd(i, 0UL); + } + ia64_set_pmc(0,1UL); + ia64_srlz_d(); + } #else /* !CONFIG_PERFMON */ diff -Nru a/arch/ia64/kernel/perfmon_generic.h b/arch/ia64/kernel/perfmon_generic.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ia64/kernel/perfmon_generic.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,29 @@ +#define RDEP(x) (1UL<<(x)) + +#if defined(CONFIG_ITANIUM) || defined(CONFIG_MCKINLEY) +#error "This file should only be used when CONFIG_ITANIUM and CONFIG_MCKINLEY are not defined" +#endif + +static pfm_reg_desc_t pmc_desc[PMU_MAX_PMCS]={ +/* pmc0 */ { PFM_REG_CONTROL , 0, 0x1UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc1 */ { PFM_REG_CONTROL , 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc2 */ { PFM_REG_CONTROL , 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc3 */ { PFM_REG_CONTROL , 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc4 */ { PFM_REG_COUNTING, 0, 0x0UL, -1UL, NULL, NULL, {RDEP(4),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc5 */ { PFM_REG_COUNTING, 0, 0x0UL, -1UL, NULL, NULL, {RDEP(5),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc6 */ { PFM_REG_COUNTING, 0, 0x0UL, -1UL, NULL, NULL, {RDEP(6),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc7 */ { PFM_REG_COUNTING, 0, 0x0UL, -1UL, NULL, NULL, {RDEP(7),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, + { PFM_REG_END , 0, 0x0UL, -1UL, NULL, NULL, {0,}, {0,}}, /* end marker */ +}; + +static pfm_reg_desc_t pmd_desc[PMU_MAX_PMDS]={ +/* pmd0 */ { PFM_REG_NOTIMPL , 0, 0x0UL, -1UL, NULL, NULL, {0,}, {0,}}, +/* pmd1 */ { PFM_REG_NOTIMPL , 0, 0x0UL, -1UL, NULL, NULL, {0,}, {0,}}, +/* pmd2 */ { PFM_REG_NOTIMPL , 0, 0x0UL, -1UL, NULL, NULL, {0,}, {0,}}, +/* pmd3 */ { PFM_REG_NOTIMPL , 0, 0x0UL, -1UL, NULL, NULL, {0,}, {0,}}, +/* pmd4 */ { PFM_REG_COUNTING, 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(4),0UL, 0UL, 0UL}}, +/* pmd5 */ { PFM_REG_COUNTING, 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(5),0UL, 0UL, 0UL}}, +/* pmd6 */ { PFM_REG_COUNTING, 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(6),0UL, 0UL, 0UL}}, +/* pmd7 */ { PFM_REG_COUNTING, 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(7),0UL, 0UL, 0UL}}, + { PFM_REG_END , 0, 0x0UL, -1UL, NULL, NULL, {0,}, {0,}}, /* end marker */ +}; diff -Nru a/arch/ia64/kernel/perfmon_itanium.h b/arch/ia64/kernel/perfmon_itanium.h --- a/arch/ia64/kernel/perfmon_itanium.h Mon Oct 28 16:32:38 2002 +++ b/arch/ia64/kernel/perfmon_itanium.h Mon Oct 28 16:32:38 2002 @@ -15,44 +15,44 @@ static int pfm_ita_pmc_check(struct task_struct *task, unsigned int cnum, unsigned long *val, struct pt_regs *regs); static int pfm_write_ibr_dbr(int mode, struct task_struct *task, void *arg, int count, struct pt_regs *regs); -static pfm_reg_desc_t pmc_desc[256]={ -/* pmc0 */ { PFM_REG_CONTROL, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc1 */ { PFM_REG_CONTROL, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc2 */ { PFM_REG_CONTROL, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc3 */ { PFM_REG_CONTROL, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc4 */ { PFM_REG_COUNTING, 6, NULL, NULL, {RDEP(4),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc5 */ { PFM_REG_COUNTING, 6, NULL, NULL, {RDEP(5),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc6 */ { PFM_REG_COUNTING, 6, NULL, NULL, {RDEP(6),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc7 */ { PFM_REG_COUNTING, 6, NULL, NULL, {RDEP(7),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc8 */ { PFM_REG_CONFIG, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc9 */ { PFM_REG_CONFIG, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc10 */ { PFM_REG_MONITOR, 6, NULL, NULL, {RDEP(0)|RDEP(1),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc11 */ { PFM_REG_MONITOR, 6, NULL, pfm_ita_pmc_check, {RDEP(2)|RDEP(3)|RDEP(17),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc12 */ { PFM_REG_MONITOR, 6, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc13 */ { PFM_REG_CONFIG, 0, NULL, pfm_ita_pmc_check, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, - { PFM_REG_NONE, 0, NULL, NULL, {0,}, {0,}}, /* end marker */ +static pfm_reg_desc_t pfm_pmc_desc[PMU_MAX_PMCS]={ +/* pmc0 */ { PFM_REG_CONTROL , 0, 0x1UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc1 */ { PFM_REG_CONTROL , 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc2 */ { PFM_REG_CONTROL , 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc3 */ { PFM_REG_CONTROL , 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc4 */ { PFM_REG_COUNTING, 6, 0x0UL, -1UL, NULL, NULL, {RDEP(4),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc5 */ { PFM_REG_COUNTING, 6, 0x0UL, -1UL, NULL, NULL, {RDEP(5),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc6 */ { PFM_REG_COUNTING, 6, 0x0UL, -1UL, NULL, NULL, {RDEP(6),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc7 */ { PFM_REG_COUNTING, 6, 0x0UL, -1UL, NULL, NULL, {RDEP(7),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc8 */ { PFM_REG_CONFIG , 0, 0xf00000003ffffff8UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc9 */ { PFM_REG_CONFIG , 0, 0xf00000003ffffff8UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc10 */ { PFM_REG_MONITOR , 6, 0x0UL, -1UL, NULL, NULL, {RDEP(0)|RDEP(1),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc11 */ { PFM_REG_MONITOR , 6, 0x0000000010000000UL, -1UL, NULL, pfm_ita_pmc_check, {RDEP(2)|RDEP(3)|RDEP(17),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc12 */ { PFM_REG_MONITOR , 6, 0x0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc13 */ { PFM_REG_CONFIG , 0, 0x0003ffff00000001UL, -1UL, NULL, pfm_ita_pmc_check, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, + { PFM_REG_END , 0, 0x0UL, -1UL, NULL, NULL, {0,}, {0,}}, /* end marker */ }; -static pfm_reg_desc_t pmd_desc[256]={ -/* pmd0 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(1),0UL, 0UL, 0UL}, {RDEP(10),0UL, 0UL, 0UL}}, -/* pmd1 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(0),0UL, 0UL, 0UL}, {RDEP(10),0UL, 0UL, 0UL}}, -/* pmd2 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(3)|RDEP(17),0UL, 0UL, 0UL}, {RDEP(11),0UL, 0UL, 0UL}}, -/* pmd3 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(2)|RDEP(17),0UL, 0UL, 0UL}, {RDEP(11),0UL, 0UL, 0UL}}, -/* pmd4 */ { PFM_REG_COUNTING, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(4),0UL, 0UL, 0UL}}, -/* pmd5 */ { PFM_REG_COUNTING, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(5),0UL, 0UL, 0UL}}, -/* pmd6 */ { PFM_REG_COUNTING, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(6),0UL, 0UL, 0UL}}, -/* pmd7 */ { PFM_REG_COUNTING, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(7),0UL, 0UL, 0UL}}, -/* pmd8 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd9 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd10 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd11 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd12 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd13 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd14 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd15 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd16 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd17 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(2)|RDEP(3),0UL, 0UL, 0UL}, {RDEP(11),0UL, 0UL, 0UL}}, - { PFM_REG_NONE, 0, NULL, NULL, {0,}, {0,}}, /* end marker */ +static pfm_reg_desc_t pfm_pmd_desc[PMU_MAX_PMDS]={ +/* pmd0 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(1),0UL, 0UL, 0UL}, {RDEP(10),0UL, 0UL, 0UL}}, +/* pmd1 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(0),0UL, 0UL, 0UL}, {RDEP(10),0UL, 0UL, 0UL}}, +/* pmd2 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(3)|RDEP(17),0UL, 0UL, 0UL}, {RDEP(11),0UL, 0UL, 0UL}}, +/* pmd3 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(2)|RDEP(17),0UL, 0UL, 0UL}, {RDEP(11),0UL, 0UL, 0UL}}, +/* pmd4 */ { PFM_REG_COUNTING, 0, 0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(4),0UL, 0UL, 0UL}}, +/* pmd5 */ { PFM_REG_COUNTING, 0, 0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(5),0UL, 0UL, 0UL}}, +/* pmd6 */ { PFM_REG_COUNTING, 0, 0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(6),0UL, 0UL, 0UL}}, +/* pmd7 */ { PFM_REG_COUNTING, 0, 0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(7),0UL, 0UL, 0UL}}, +/* pmd8 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd9 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd10 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd11 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd12 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd13 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd14 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd15 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd16 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd17 */ { PFM_REG_BUFFER , 0, 0UL, -1UL, NULL, NULL, {RDEP(2)|RDEP(3),0UL, 0UL, 0UL}, {RDEP(11),0UL, 0UL, 0UL}}, + { PFM_REG_END , 0, 0UL, -1UL, NULL, NULL, {0,}, {0,}}, /* end marker */ }; static int diff -Nru a/arch/ia64/kernel/perfmon_mckinley.h b/arch/ia64/kernel/perfmon_mckinley.h --- a/arch/ia64/kernel/perfmon_mckinley.h Mon Oct 28 16:32:37 2002 +++ b/arch/ia64/kernel/perfmon_mckinley.h Mon Oct 28 16:32:37 2002 @@ -12,51 +12,73 @@ #error "This file is only valid when CONFIG_MCKINLEY is defined" #endif +static int pfm_mck_reserved(struct task_struct *task, unsigned int cnum, unsigned long *val, struct pt_regs *regs); static int pfm_mck_pmc_check(struct task_struct *task, unsigned int cnum, unsigned long *val, struct pt_regs *regs); static int pfm_write_ibr_dbr(int mode, struct task_struct *task, void *arg, int count, struct pt_regs *regs); -static pfm_reg_desc_t pmc_desc[256]={ -/* pmc0 */ { PFM_REG_CONTROL, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc1 */ { PFM_REG_CONTROL, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc2 */ { PFM_REG_CONTROL, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc3 */ { PFM_REG_CONTROL, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc4 */ { PFM_REG_COUNTING, 6, NULL, pfm_mck_pmc_check, {RDEP(4),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc5 */ { PFM_REG_COUNTING, 6, NULL, NULL, {RDEP(5),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc6 */ { PFM_REG_COUNTING, 6, NULL, NULL, {RDEP(6),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc7 */ { PFM_REG_COUNTING, 6, NULL, NULL, {RDEP(7),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc8 */ { PFM_REG_CONFIG, 0, NULL, pfm_mck_pmc_check, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc9 */ { PFM_REG_CONFIG, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc10 */ { PFM_REG_MONITOR, 4, NULL, NULL, {RDEP(0)|RDEP(1),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc11 */ { PFM_REG_MONITOR, 6, NULL, NULL, {RDEP(2)|RDEP(3)|RDEP(17),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc12 */ { PFM_REG_MONITOR, 6, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc13 */ { PFM_REG_CONFIG, 0, NULL, pfm_mck_pmc_check, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc14 */ { PFM_REG_CONFIG, 0, NULL, pfm_mck_pmc_check, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, -/* pmc15 */ { PFM_REG_CONFIG, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, - { PFM_REG_NONE, 0, NULL, NULL, {0,}, {0,}}, /* end marker */ +static pfm_reg_desc_t pfm_pmc_desc[PMU_MAX_PMCS]={ +/* pmc0 */ { PFM_REG_CONTROL , 0, 0x1UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc1 */ { PFM_REG_CONTROL , 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc2 */ { PFM_REG_CONTROL , 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc3 */ { PFM_REG_CONTROL , 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc4 */ { PFM_REG_COUNTING, 6, 0x0000000000800000UL, 0xfffff7fUL, NULL, pfm_mck_pmc_check, {RDEP(4),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc5 */ { PFM_REG_COUNTING, 6, 0x0UL, 0xfffff7fUL, NULL, pfm_mck_reserved, {RDEP(5),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc6 */ { PFM_REG_COUNTING, 6, 0x0UL, 0xfffff7fUL, NULL, pfm_mck_reserved, {RDEP(6),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc7 */ { PFM_REG_COUNTING, 6, 0x0UL, 0xfffff7fUL, NULL, pfm_mck_reserved, {RDEP(7),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc8 */ { PFM_REG_CONFIG , 0, 0xffffffff3fffffffUL, 0xffffffff9fffffffUL, NULL, pfm_mck_pmc_check, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc9 */ { PFM_REG_CONFIG , 0, 0xffffffff3ffffffcUL, 0xffffffff9fffffffUL, NULL, pfm_mck_pmc_check, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc10 */ { PFM_REG_MONITOR , 4, 0x0UL, 0xffffUL, NULL, pfm_mck_reserved, {RDEP(0)|RDEP(1),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc11 */ { PFM_REG_MONITOR , 6, 0x0UL, 0x30f01cf, NULL, pfm_mck_reserved, {RDEP(2)|RDEP(3)|RDEP(17),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc12 */ { PFM_REG_MONITOR , 6, 0x0UL, 0xffffUL, NULL, pfm_mck_reserved, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc13 */ { PFM_REG_CONFIG , 0, 0x00002078fefefefeUL, 0x1e00018181818UL, NULL, pfm_mck_pmc_check, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc14 */ { PFM_REG_CONFIG , 0, 0x0db60db60db60db6UL, 0x2492UL, NULL, pfm_mck_pmc_check, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, +/* pmc15 */ { PFM_REG_CONFIG , 0, 0x00000000fffffff0UL, 0xfUL, NULL, pfm_mck_reserved, {0UL,0UL, 0UL, 0UL}, {0UL,0UL, 0UL, 0UL}}, + { PFM_REG_END , 0, 0x0UL, -1UL, NULL, NULL, {0,}, {0,}}, /* end marker */ }; -static pfm_reg_desc_t pmd_desc[256]={ -/* pmd0 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(1),0UL, 0UL, 0UL}, {RDEP(10),0UL, 0UL, 0UL}}, -/* pmd1 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(0),0UL, 0UL, 0UL}, {RDEP(10),0UL, 0UL, 0UL}}, -/* pmd2 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(3)|RDEP(17),0UL, 0UL, 0UL}, {RDEP(11),0UL, 0UL, 0UL}}, -/* pmd3 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(2)|RDEP(17),0UL, 0UL, 0UL}, {RDEP(11),0UL, 0UL, 0UL}}, -/* pmd4 */ { PFM_REG_COUNTING, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(4),0UL, 0UL, 0UL}}, -/* pmd5 */ { PFM_REG_COUNTING, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(5),0UL, 0UL, 0UL}}, -/* pmd6 */ { PFM_REG_COUNTING, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(6),0UL, 0UL, 0UL}}, -/* pmd7 */ { PFM_REG_COUNTING, 0, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(7),0UL, 0UL, 0UL}}, -/* pmd8 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd9 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd10 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd11 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd12 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd13 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd14 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd15 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd16 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, -/* pmd17 */ { PFM_REG_BUFFER, 0, NULL, NULL, {RDEP(2)|RDEP(3),0UL, 0UL, 0UL}, {RDEP(11),0UL, 0UL, 0UL}}, - { PFM_REG_NONE, 0, NULL, NULL, {0,}, {0,}}, /* end marker */ +static pfm_reg_desc_t pfm_pmd_desc[PMU_MAX_PMDS]={ +/* pmd0 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(1),0UL, 0UL, 0UL}, {RDEP(10),0UL, 0UL, 0UL}}, +/* pmd1 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(0),0UL, 0UL, 0UL}, {RDEP(10),0UL, 0UL, 0UL}}, +/* pmd2 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(3)|RDEP(17),0UL, 0UL, 0UL}, {RDEP(11),0UL, 0UL, 0UL}}, +/* pmd3 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(2)|RDEP(17),0UL, 0UL, 0UL}, {RDEP(11),0UL, 0UL, 0UL}}, +/* pmd4 */ { PFM_REG_COUNTING, 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(4),0UL, 0UL, 0UL}}, +/* pmd5 */ { PFM_REG_COUNTING, 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(5),0UL, 0UL, 0UL}}, +/* pmd6 */ { PFM_REG_COUNTING, 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(6),0UL, 0UL, 0UL}}, +/* pmd7 */ { PFM_REG_COUNTING, 0, 0x0UL, -1UL, NULL, NULL, {0UL,0UL, 0UL, 0UL}, {RDEP(7),0UL, 0UL, 0UL}}, +/* pmd8 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd9 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd10 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd11 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd12 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(13)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd13 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(14)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd14 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(15)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd15 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(16),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd16 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(8)|RDEP(9)|RDEP(10)|RDEP(11)|RDEP(12)|RDEP(13)|RDEP(14)|RDEP(15),0UL, 0UL, 0UL}, {RDEP(12),0UL, 0UL, 0UL}}, +/* pmd17 */ { PFM_REG_BUFFER , 0, 0x0UL, -1UL, NULL, NULL, {RDEP(2)|RDEP(3),0UL, 0UL, 0UL}, {RDEP(11),0UL, 0UL, 0UL}}, + { PFM_REG_END , 0, 0x0UL, -1UL, NULL, NULL, {0,}, {0,}}, /* end marker */ }; +/* + * PMC reserved fields must have their power-up values preserved + */ +static int +pfm_mck_reserved(struct task_struct *task, unsigned int cnum, unsigned long *val, struct pt_regs *regs) +{ + unsigned long tmp1, tmp2, ival = *val; + + /* remove reserved areas from user value */ + tmp1 = ival & PMC_RSVD_MASK(cnum); + + /* get reserved fields values */ + tmp2 = PMC_DFL_VAL(cnum) & ~PMC_RSVD_MASK(cnum); + + *val = tmp1 | tmp2; + + DBprintk(("pmc[%d]=0x%lx, mask=0x%lx, reset=0x%lx, val=0x%lx\n", + cnum, ival, PMC_RSVD_MASK(cnum), PMC_DFL_VAL(cnum), *val)); + return 0; +} + static int pfm_mck_pmc_check(struct task_struct *task, unsigned int cnum, unsigned long *val, struct pt_regs *regs) { @@ -65,6 +87,9 @@ int ret = 0, check_case1 = 0; unsigned long val8 = 0, val14 = 0, val13 = 0; + /* first preserve the reserved fields */ + pfm_mck_reserved(task, cnum, val, regs); + /* * we must clear the debug registers if any pmc13.ena_dbrpX bit is enabled * before they are written (fl_using_dbreg==0) to avoid picking up stale information. @@ -105,7 +130,10 @@ case 8: val8 = *val; val13 = th->pmc[13]; val14 = th->pmc[14]; + *val |= 1UL << 2; /* bit 2 must always be 1 */ check_case1 = 1; + break; + case 9: *val |= 1UL << 2; /* bit 2 must always be 1 */ break; case 13: val8 = th->pmc[8]; val13 = *val; diff -Nru a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c --- a/arch/ia64/kernel/process.c Mon Oct 28 16:32:36 2002 +++ b/arch/ia64/kernel/process.c Mon Oct 28 16:32:36 2002 @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -45,8 +46,9 @@ do_show_stack (struct unw_frame_info *info, void *arg) { unsigned long ip, sp, bsp; + char buf[80]; /* don't make it so big that it overflows the stack! */ - printk("\nCall Trace: "); + printk("\nCall Trace:\n"); do { unw_get_ip(info, &ip); if (ip == 0) @@ -54,7 +56,9 @@ unw_get_sp(info, &sp); unw_get_bsp(info, &bsp); - printk("[<%016lx>] sp=0x%016lx bsp=0x%016lx\n", ip, sp, bsp); + snprintf(buf, sizeof(buf), " [<%016lx>] %%s sp=0x%016lx bsp=0x%016lx\n", + ip, sp, bsp); + print_symbol(buf, ip); } while (unw_unwind(info) >= 0); } @@ -94,6 +98,7 @@ printk("\nPid: %d, comm: %20s\n", current->pid, current->comm); printk("psr : %016lx ifs : %016lx ip : [<%016lx>] %s\n", regs->cr_ipsr, regs->cr_ifs, ip, print_tainted()); + print_symbol("ip is at %s\n", ip); printk("unat: %016lx pfs : %016lx rsc : %016lx\n", regs->ar_unat, regs->ar_pfs, regs->ar_rsc); printk("rnat: %016lx bsps: %016lx pr : %016lx\n", @@ -199,10 +204,8 @@ if ((task->thread.flags & IA64_THREAD_PM_VALID) != 0) pfm_save_regs(task); -# ifdef CONFIG_SMP if (__get_cpu_var(pfm_syst_wide)) pfm_syst_wide_update_task(task, 0); -# endif #endif #ifdef CONFIG_IA32_SUPPORT @@ -221,9 +224,8 @@ if ((task->thread.flags & IA64_THREAD_PM_VALID) != 0) pfm_load_regs(task); -# ifdef CONFIG_SMP - if (__get_cpu_var(pfm_syst_wide)) pfm_syst_wide_update_task(task, 1); -# endif + if (__get_cpu_var(pfm_syst_wide)) + pfm_syst_wide_update_task(task, 1); #endif #ifdef CONFIG_IA32_SUPPORT diff -Nru a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c --- a/arch/ia64/kernel/setup.c Mon Oct 28 16:32:35 2002 +++ b/arch/ia64/kernel/setup.c Mon Oct 28 16:32:35 2002 @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -49,9 +50,6 @@ # error "struct cpuinfo_ia64 too big!" #endif -#define MIN(a,b) ((a) < (b) ? (a) : (b)) -#define MAX(a,b) ((a) > (b) ? (a) : (b)) - extern char _end; #ifdef CONFIG_SMP @@ -95,6 +93,10 @@ static struct rsvd_region rsvd_region[IA64_MAX_RSVD_REGIONS + 1]; static int num_rsvd_regions; +#define IGNORE_PFN0 1 /* XXX fix me: ignore pfn 0 until TLB miss handler is updated... */ + +#ifndef CONFIG_DISCONTIGMEM + static unsigned long bootmap_start; /* physical address where the bootmem map is located */ static int @@ -108,17 +110,63 @@ return 0; } -#define IGNORE_PFN0 1 /* XXX fix me: ignore pfn 0 until TLB miss handler is updated... */ +#else /* CONFIG_DISCONTIGMEM */ /* - * Free available memory based on the primitive map created from - * the boot parameters. This routine does not assume the incoming - * segments are sorted. + * efi_memmap_walk() knows nothing about layout of memory across nodes. Find + * out to which node a block of memory belongs. Ignore memory that we cannot + * identify, and split blocks that run across multiple nodes. + * + * Take this opportunity to round the start address up and the end address + * down to page boundaries. */ -static int -free_available_memory (unsigned long start, unsigned long end, void *arg) +void +call_pernode_memory (unsigned long start, unsigned long end, void *arg) +{ + unsigned long rs, re; + void (*func)(unsigned long, unsigned long, int, int); + int i; + + start = PAGE_ALIGN(start); + end &= PAGE_MASK; + if (start >= end) + return; + + func = arg; + + if (!num_memblks) { + /* + * This machine doesn't have SRAT, so call func with + * nid=0, bank=0. + */ + if (start < end) + (*func)(start, end - start, 0, 0); + return; + } + + for (i = 0; i < num_memblks; i++) { + rs = max(start, node_memblk[i].start_paddr); + re = min(end, node_memblk[i].start_paddr+node_memblk[i].size); + + if (rs < re) + (*func)(rs, re-rs, node_memblk[i].nid, + node_memblk[i].bank); + } +} + +#endif /* CONFIG_DISCONTIGMEM */ + +/* + * Filter incoming memory segments based on the primitive map created from the boot + * parameters. Segments contained in the map are removed from the memory ranges. A + * caller-specified function is called with the memory ranges that remain after filtering. + * This routine does not assume the incoming segments are sorted. + */ +int +filter_rsvd_memory (unsigned long start, unsigned long end, void *arg) { unsigned long range_start, range_end, prev_start; + void (*func)(unsigned long, unsigned long); int i; #if IGNORE_PFN0 @@ -132,13 +180,18 @@ * lowest possible address(walker uses virtual) */ prev_start = PAGE_OFFSET; + func = arg; for (i = 0; i < num_rsvd_regions; ++i) { - range_start = MAX(start, prev_start); - range_end = MIN(end, rsvd_region[i].start); + range_start = max(start, prev_start); + range_end = min(end, rsvd_region[i].start); if (range_start < range_end) - free_bootmem(__pa(range_start), range_end - range_start); +#ifdef CONFIG_DISCONTIGMEM + call_pernode_memory(__pa(range_start), __pa(range_end), func); +#else + (*func)(__pa(range_start), range_end - range_start); +#endif /* nothing more available in this segment */ if (range_end == end) return 0; @@ -150,6 +203,7 @@ } +#ifndef CONFIG_DISCONTIGMEM /* * Find a place to put the bootmap and return its starting address in bootmap_start. * This address must be page-aligned. @@ -171,8 +225,8 @@ free_start = PAGE_OFFSET; for (i = 0; i < num_rsvd_regions; i++) { - range_start = MAX(start, free_start); - range_end = MIN(end, rsvd_region[i].start & PAGE_MASK); + range_start = max(start, free_start); + range_end = min(end, rsvd_region[i].start & PAGE_MASK); if (range_end <= range_start) continue; /* skip over empty range */ @@ -188,6 +242,7 @@ } return 0; } +#endif /* !CONFIG_DISCONTIGMEM */ static void sort_regions (struct rsvd_region *rsvd_region, int max) @@ -252,6 +307,15 @@ sort_regions(rsvd_region, num_rsvd_regions); +#ifdef CONFIG_DISCONTIGMEM + { + extern void discontig_mem_init (void); + + bootmap_size = max_pfn = 0; /* stop gcc warnings */ + discontig_mem_init(); + } +#else /* !CONFIG_DISCONTIGMEM */ + /* first find highest page frame number */ max_pfn = 0; efi_memmap_walk(find_max_pfn, &max_pfn); @@ -268,8 +332,9 @@ bootmap_size = init_bootmem(bootmap_start >> PAGE_SHIFT, max_pfn); /* Free all available memory, then mark bootmem-map as being in use. */ - efi_memmap_walk(free_available_memory, 0); + efi_memmap_walk(filter_rsvd_memory, free_bootmem); reserve_bootmem(bootmap_start, bootmap_size); +#endif /* !CONFIG_DISCONTIGMEM */ #ifdef CONFIG_BLK_DEV_INITRD if (ia64_boot_param->initrd_start) { @@ -296,6 +361,16 @@ efi_init(); +#ifdef CONFIG_ACPI_BOOT + /* Initialize the ACPI boot-time table parser */ + acpi_table_init(*cmdline_p); + +#ifdef CONFIG_ACPI_NUMA + acpi_numa_init(); +#endif + +#endif /* CONFIG_APCI_BOOT */ + find_memory(); #if 0 @@ -530,6 +605,7 @@ /* start_kernel() requires this... */ } + /* * cpu_init() initializes state that is per-CPU. This function acts * as a 'CPU state barrier', nothing should get across. @@ -542,32 +618,40 @@ unsigned long num_phys_stacked; pal_vm_info_2_u_t vmi; unsigned int max_ctx; - struct cpuinfo_ia64 *my_cpu_info; - void *my_cpu_data; + struct cpuinfo_ia64 *cpu_info; + void *cpu_data; #ifdef CONFIG_SMP extern char __per_cpu_end[]; - int cpu = smp_processor_id(); + int cpu; if (__per_cpu_end - __per_cpu_start > PAGE_SIZE) panic("Per-cpu data area too big! (%Zu > %Zu)", __per_cpu_end - __per_cpu_start, PAGE_SIZE); + /* - * On the BSP, the page allocator isn't initialized by the time we get here. On - * the APs, the bootmem allocator is no longer available... + * get_free_pages() cannot be used before cpu_init() done. BSP allocates + * "NR_CPUS" pages for all CPUs to avoid that AP calls get_zeroed_page(). */ - if (cpu == 0) - my_cpu_data = alloc_bootmem_pages(__per_cpu_end - __per_cpu_start); - else - my_cpu_data = (void *) get_zeroed_page(GFP_KERNEL); - memcpy(my_cpu_data, __phys_per_cpu_start, __per_cpu_end - __per_cpu_start); - __per_cpu_offset[cpu] = (char *) my_cpu_data - __per_cpu_start; - my_cpu_info = my_cpu_data + ((char *) &__get_cpu_var(cpu_info) - __per_cpu_start); -#else - my_cpu_data = __phys_per_cpu_start; + if (smp_processor_id() == 0) { + cpu_data = (unsigned long)alloc_bootmem_pages(PAGE_SIZE * NR_CPUS); + for (cpu = 0; cpu < NR_CPUS; cpu++) { + memcpy(cpu_data, __phys_per_cpu_start, __per_cpu_end - __per_cpu_start); + __per_cpu_offset[cpu] = (char *) cpu_data - __per_cpu_start; + cpu_data += PAGE_SIZE; + } + } + cpu_data = __per_cpu_start + __per_cpu_offset[smp_processor_id()]; +#else /* !CONFIG_SMP */ + cpu_data = __phys_per_cpu_start; +#endif /* !CONFIG_SMP */ + + cpu_info = cpu_data + ((char *) &__get_cpu_var(cpu_info) - __per_cpu_start); +#ifdef CONFIG_NUMA + cpu_info->node_data = get_node_data_ptr(); + cpu_info->nodeid = boot_get_local_nodeid(); #endif - my_cpu_info = my_cpu_data + ((char *) &__get_cpu_var(cpu_info) - __per_cpu_start); /* * We can't pass "local_cpu_data" to identify_cpu() because we haven't called @@ -575,14 +659,14 @@ * depends on the data returned by identify_cpu(). We break the dependency by * accessing cpu_data() the old way, through identity mapped space. */ - identify_cpu(my_cpu_info); + identify_cpu(cpu_info); #ifdef CONFIG_MCKINLEY { -#define FEATURE_SET 16 +# define FEATURE_SET 16 struct ia64_pal_retval iprv; - if (my_cpu_info->family == 0x1f) { + if (cpu_info->family == 0x1f) { PAL_CALL_PHYS(iprv, PAL_PROC_GET_FEATURES, 0, FEATURE_SET, 0); if ((iprv.status == 0) && (iprv.v0 & 0x80) && (iprv.v2 & 0x80)) PAL_CALL_PHYS(iprv, PAL_PROC_SET_FEATURES, @@ -613,7 +697,7 @@ if (current->mm) BUG(); - ia64_mmu_init(my_cpu_data); + ia64_mmu_init(cpu_data); #ifdef CONFIG_IA32_SUPPORT /* initialize global ia32 state - CR0 and CR4 */ diff -Nru a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c --- a/arch/ia64/kernel/signal.c Mon Oct 28 16:32:37 2002 +++ b/arch/ia64/kernel/signal.c Mon Oct 28 16:32:37 2002 @@ -41,6 +41,16 @@ # define GET_SIGSET(k,u) __get_user((k)->sig[0], &(u)->sig[0]) #endif +register double f16 asm ("f16"); register double f17 asm ("f17"); +register double f18 asm ("f18"); register double f19 asm ("f19"); +register double f20 asm ("f20"); register double f21 asm ("f21"); +register double f22 asm ("f22"); register double f23 asm ("f23"); + +register double f24 asm ("f24"); register double f25 asm ("f25"); +register double f26 asm ("f26"); register double f27 asm ("f27"); +register double f28 asm ("f28"); register double f29 asm ("f29"); +register double f30 asm ("f30"); register double f31 asm ("f31"); + long ia64_rt_sigsuspend (sigset_t *uset, size_t sigsetsize, struct sigscratch *scr) { @@ -58,13 +68,13 @@ sigdelsetmask(&set, ~_BLOCKABLE); - spin_lock_irq(¤t->sigmask_lock); + spin_lock_irq(¤t->sig->siglock); { oldset = current->blocked; current->blocked = set; recalc_sigpending(); } - spin_unlock_irq(¤t->sigmask_lock); + spin_unlock_irq(¤t->sig->siglock); /* * The return below usually returns to the signal handler. We need to @@ -264,12 +274,12 @@ sigdelsetmask(&set, ~_BLOCKABLE); - spin_lock_irq(¤t->sigmask_lock); + spin_lock_irq(¤t->sig->siglock); { current->blocked = set; recalc_sigpending(); } - spin_unlock_irq(¤t->sigmask_lock); + spin_unlock_irq(¤t->sig->siglock); if (restore_sigcontext(sc, scr)) goto give_sigsegv; @@ -458,13 +468,13 @@ ka->sa.sa_handler = SIG_DFL; if (!(ka->sa.sa_flags & SA_NODEFER)) { - spin_lock_irq(¤t->sigmask_lock); + spin_lock_irq(¤t->sig->siglock); { sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); sigaddset(¤t->blocked, sig); recalc_sigpending(); } - spin_unlock_irq(¤t->sigmask_lock); + spin_unlock_irq(¤t->sig->siglock); } return 1; } diff -Nru a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c --- a/arch/ia64/kernel/smpboot.c Mon Oct 28 16:32:36 2002 +++ b/arch/ia64/kernel/smpboot.c Mon Oct 28 16:32:36 2002 @@ -16,6 +16,7 @@ #include +#include #include #include #include @@ -426,6 +427,37 @@ cpu++; } } + +#ifdef CONFIG_NUMA + +char cpu_to_node_map[NR_CPUS] __cacheline_aligned; + +/* + * Build cpu to node mapping. + */ +void __init +build_cpu_to_node_map (void) +{ + int cpu, i; + + for(cpu = 0; cpu < NR_CPUS; ++cpu) { + /* + * All Itanium NUMA platforms I know use ACPI, so maybe we + * can drop this ifdef completely. [EF] + */ +#ifdef CONFIG_ACPI_NUMA + for (i = 0; i < NR_CPUS; ++i) + if (cpu_physical_id(cpu) == node_cpuid[i].phys_id) { + cpu_to_node_map[cpu] = node_cpuid[i].nid; + break; + } +#else +# error Fixme: Dunno how to build CPU-to-node map. +#endif + } +} + +#endif /* CONFIG_NUMA */ /* * Cycle through the APs sending Wakeup IPIs to boot each. diff -Nru a/arch/ia64/kernel/sys_ia64.c b/arch/ia64/kernel/sys_ia64.c --- a/arch/ia64/kernel/sys_ia64.c Mon Oct 28 16:32:37 2002 +++ b/arch/ia64/kernel/sys_ia64.c Mon Oct 28 16:32:37 2002 @@ -282,18 +282,20 @@ extern int free_hugepages(struct vm_area_struct *); int retval; - vma = find_vma(mm, addr); - if (!vma || !is_vm_hugetlb_page(vma) || (vma->vm_start != addr)) - return -EINVAL; - down_write(&mm->mmap_sem); { + vma = find_vma(mm, addr); + if (!vma || !is_vm_hugetlb_page(vma) || (vma->vm_start != addr)) + retval = -EINVAL; + goto out; + spin_lock(&mm->page_table_lock); { retval = free_hugepages(vma); } spin_unlock(&mm->page_table_lock); } +out: up_write(&mm->mmap_sem); return retval; } diff -Nru a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c --- a/arch/ia64/kernel/time.c Mon Oct 28 16:32:36 2002 +++ b/arch/ia64/kernel/time.c Mon Oct 28 16:32:36 2002 @@ -1,9 +1,9 @@ /* * linux/arch/ia64/kernel/time.c * - * Copyright (C) 1998-2001 Hewlett-Packard Co - * Copyright (C) 1998-2000 Stephane Eranian - * Copyright (C) 1999-2001 David Mosberger + * Copyright (C) 1998-2002 Hewlett-Packard Co + * Stephane Eranian + * David Mosberger * Copyright (C) 1999 Don Dugger * Copyright (C) 1999-2000 VA Linux Systems * Copyright (C) 1999-2000 Walt Drummond @@ -12,6 +12,7 @@ #include #include +#include #include #include #include diff -Nru a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c --- a/arch/ia64/kernel/traps.c Mon Oct 28 16:32:38 2002 +++ b/arch/ia64/kernel/traps.c Mon Oct 28 16:32:38 2002 @@ -54,8 +54,8 @@ if (ia64_boot_param->fpswa) { /* FPSWA fixup: make the interface pointer a kernel virtual address: */ fpswa_interface = __va(ia64_boot_param->fpswa); - major = fpswa_interface->revision & 0xffff; - minor = fpswa_interface->revision >> 16; + major = fpswa_interface->revision >> 16; + minor = fpswa_interface->revision & 0xffff; } printk("fpswa interface at %lx (rev %d.%d)\n", ia64_boot_param->fpswa, major, minor); } @@ -69,7 +69,6 @@ { int loglevel_save = console_loglevel; - spin_lock_init(&timerlist_lock); if (yes) { oops_in_progress = 1; return; diff -Nru a/arch/ia64/lib/Makefile b/arch/ia64/lib/Makefile --- a/arch/ia64/lib/Makefile Mon Oct 28 16:32:38 2002 +++ b/arch/ia64/lib/Makefile Mon Oct 28 16:32:38 2002 @@ -32,26 +32,26 @@ AFLAGS___modsi3.o = -DMODULO AFLAGS___umodsi3.o = -DUNSIGNED -DMODULO -__divdi3.o: idiv64.S +$(obj)/__divdi3.o: $(src)/idiv64.S $(cmd_as_o_S) -__udivdi3.o: idiv64.S +$(obj)/__udivdi3.o: $(src)/idiv64.S $(cmd_as_o_S) -__moddi3.o: idiv64.S +$(obj)/__moddi3.o: $(src)/idiv64.S $(cmd_as_o_S) -__umoddi3.o: idiv64.S +$(obj)/__umoddi3.o: $(src)/idiv64.S $(cmd_as_o_S) -__divsi3.o: idiv32.S +$(obj)/__divsi3.o: $(src)/idiv32.S $(cmd_as_o_S) -__udivsi3.o: idiv32.S +$(obj)/__udivsi3.o: $(src)/idiv32.S $(cmd_as_o_S) -__modsi3.o: idiv32.S +$(obj)/__modsi3.o: $(src)/idiv32.S $(cmd_as_o_S) -__umodsi3.o: idiv32.S +$(obj)/__umodsi3.o: $(src)/idiv32.S $(cmd_as_o_S) diff -Nru a/arch/ia64/mm/Makefile b/arch/ia64/mm/Makefile --- a/arch/ia64/mm/Makefile Mon Oct 28 16:32:36 2002 +++ b/arch/ia64/mm/Makefile Mon Oct 28 16:32:36 2002 @@ -9,5 +9,7 @@ obj-y := init.o fault.o tlb.o extable.o obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o +obj-$(CONFIG_NUMA) += numa.o +obj-$(CONFIG_DISCONTIGMEM) += discontig.o include $(TOPDIR)/Rules.make diff -Nru a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ia64/mm/discontig.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,305 @@ +/* + * Copyright (c) 2000 Silicon Graphics, Inc. All rights reserved. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 Tony Luck + * Copyright (c) 2002 NEC Corp. + * Copyright (c) 2002 Kimio Suganuma + */ + +/* + * Platform initialization for Discontig Memory + */ + +#include +#include +#include +#include +#include +#include + + +/* + * Round an address upward to the next multiple of GRANULE size. + */ +#define GRANULEROUNDUP(n) (((n)+IA64_GRANULE_SIZE-1) & ~(IA64_GRANULE_SIZE-1)) + +static struct ia64_node_data *node_data[NR_NODES]; +static long boot_pg_data[8*NR_NODES+sizeof(pg_data_t)] __initdata; +static pg_data_t *pg_data_ptr[NR_NODES] __initdata; +static bootmem_data_t bdata[NR_NODES][NR_BANKS_PER_NODE+1] __initdata; + +extern int filter_rsvd_memory (unsigned long start, unsigned long end, void *arg); + +/* + * Return the compact node number of this cpu. Used prior to + * setting up the cpu_data area. + * Note - not fast, intended for boot use only!! + */ +int +boot_get_local_nodeid(void) +{ + int i; + + for (i = 0; i < NR_CPUS; i++) + if (node_cpuid[i].phys_id == hard_smp_processor_id()) + return node_cpuid[i].nid; + + /* node info missing, so nid should be 0.. */ + return 0; +} + +/* + * Return a pointer to the pg_data structure for a node. + * This function is used ONLY in early boot before the cpu_data + * structure is available. + */ +pg_data_t* __init +boot_get_pg_data_ptr(long node) +{ + return pg_data_ptr[node]; +} + + +/* + * Return a pointer to the node data for the current node. + * (boottime initialization only) + */ +struct ia64_node_data * +get_node_data_ptr(void) +{ + return node_data[boot_get_local_nodeid()]; +} + +/* + * We allocate one of the bootmem_data_t structs for each piece of memory + * that we wish to treat as a contiguous block. Each such block must start + * on a BANKSIZE boundary. Multiple banks per node is not supported. + */ +static int __init +build_maps(unsigned long pstart, unsigned long length, int node) +{ + bootmem_data_t *bdp; + unsigned long cstart, epfn; + + bdp = pg_data_ptr[node]->bdata; + epfn = GRANULEROUNDUP(pstart + length) >> PAGE_SHIFT; + cstart = pstart & ~(BANKSIZE - 1); + + if (!bdp->node_low_pfn) { + bdp->node_boot_start = cstart; + bdp->node_low_pfn = epfn; + } else { + bdp->node_boot_start = min(cstart, bdp->node_boot_start); + bdp->node_low_pfn = max(epfn, bdp->node_low_pfn); + } + + min_low_pfn = min(min_low_pfn, bdp->node_boot_start>>PAGE_SHIFT); + max_low_pfn = max(max_low_pfn, bdp->node_low_pfn); + + return 0; +} + +/* + * Find space on each node for the bootmem map. + * + * Called by efi_memmap_walk to find boot memory on each node. Note that + * only blocks that are free are passed to this routine (currently filtered by + * free_available_memory). + */ +static int __init +find_bootmap_space(unsigned long pstart, unsigned long length, int node) +{ + unsigned long mapsize, pages, epfn; + bootmem_data_t *bdp; + + epfn = (pstart + length) >> PAGE_SHIFT; + bdp = &pg_data_ptr[node]->bdata[0]; + + if (pstart < bdp->node_boot_start || epfn > bdp->node_low_pfn) + return 0; + + if (!bdp->node_bootmem_map) { + pages = bdp->node_low_pfn - (bdp->node_boot_start>>PAGE_SHIFT); + mapsize = bootmem_bootmap_pages(pages) << PAGE_SHIFT; + if (length > mapsize) { + init_bootmem_node( + BOOT_NODE_DATA(node), + pstart>>PAGE_SHIFT, + bdp->node_boot_start>>PAGE_SHIFT, + bdp->node_low_pfn); + } + + } + + return 0; +} + + +/* + * Free available memory to the bootmem allocator. + * + * Note that only blocks that are free are passed to this routine (currently + * filtered by free_available_memory). + * + */ +static int __init +discontig_free_bootmem_node(unsigned long pstart, unsigned long length, int node) +{ + free_bootmem_node(BOOT_NODE_DATA(node), pstart, length); + + return 0; +} + + +/* + * Reserve the space used by the bootmem maps. + */ +static void __init +discontig_reserve_bootmem(void) +{ + int node; + unsigned long mapbase, mapsize, pages; + bootmem_data_t *bdp; + + for (node = 0; node < numnodes; node++) { + bdp = BOOT_NODE_DATA(node)->bdata; + + pages = bdp->node_low_pfn - (bdp->node_boot_start>>PAGE_SHIFT); + mapsize = bootmem_bootmap_pages(pages) << PAGE_SHIFT; + mapbase = __pa(bdp->node_bootmem_map); + reserve_bootmem_node(BOOT_NODE_DATA(node), mapbase, mapsize); + } +} + +/* + * Allocate per node tables. + * - the pg_data structure is allocated on each node. This minimizes offnode + * memory references + * - the node data is allocated & initialized. Portions of this structure is read-only (after + * boot) and contains node-local pointers to usefuls data structures located on + * other nodes. + * + * We also switch to using the "real" pg_data structures at this point. Earlier in boot, we + * use a different structure. The only use for pg_data prior to the point in boot is to get + * the pointer to the bdata for the node. + */ +static void __init +allocate_pernode_structures(void) +{ + pg_data_t *pgdat=0, *new_pgdat_list=0; + int node, mynode; + + mynode = boot_get_local_nodeid(); + for (node = numnodes - 1; node >= 0 ; node--) { + node_data[node] = alloc_bootmem_node(BOOT_NODE_DATA(node), sizeof (struct ia64_node_data)); + pgdat = __alloc_bootmem_node(BOOT_NODE_DATA(node), sizeof(pg_data_t), SMP_CACHE_BYTES, 0); + pgdat->bdata = &(bdata[node][0]); + pg_data_ptr[node] = pgdat; + pgdat->pgdat_next = new_pgdat_list; + new_pgdat_list = pgdat; + } + + memcpy(node_data[mynode]->pg_data_ptrs, pg_data_ptr, sizeof(pg_data_ptr)); + memcpy(node_data[mynode]->node_data_ptrs, node_data, sizeof(node_data)); + + pgdat_list = new_pgdat_list; +} + +/* + * Called early in boot to setup the boot memory allocator, and to + * allocate the node-local pg_data & node-directory data structures.. + */ +void __init +discontig_mem_init(void) +{ + int node; + + if (numnodes == 0) { + printk("node info missing!\n"); + numnodes = 1; + } + + for (node = 0; node < numnodes; node++) { + pg_data_ptr[node] = (pg_data_t*) &boot_pg_data[node]; + pg_data_ptr[node]->bdata = &bdata[node][0]; + } + + min_low_pfn = -1; + max_low_pfn = 0; + + efi_memmap_walk(filter_rsvd_memory, build_maps); + efi_memmap_walk(filter_rsvd_memory, find_bootmap_space); + efi_memmap_walk(filter_rsvd_memory, discontig_free_bootmem_node); + discontig_reserve_bootmem(); + allocate_pernode_structures(); +} + +/* + * Initialize the paging system. + * - determine sizes of each node + * - initialize the paging system for the node + * - build the nodedir for the node. This contains pointers to + * the per-bank mem_map entries. + * - fix the page struct "virtual" pointers. These are bank specific + * values that the paging system doesnt understand. + * - replicate the nodedir structure to other nodes + */ + +void __init +discontig_paging_init(void) +{ + int node, mynode; + unsigned long max_dma, zones_size[MAX_NR_ZONES]; + unsigned long kaddr, ekaddr, bid; + struct page *page; + bootmem_data_t *bdp; + + max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT; + + mynode = boot_get_local_nodeid(); + for (node = 0; node < numnodes; node++) { + long pfn, startpfn; + + memset(zones_size, 0, sizeof(zones_size)); + + startpfn = -1; + bdp = BOOT_NODE_DATA(node)->bdata; + pfn = bdp->node_boot_start >> PAGE_SHIFT; + if (startpfn == -1) + startpfn = pfn; + if (pfn > max_dma) + zones_size[ZONE_NORMAL] += (bdp->node_low_pfn - pfn); + else if (bdp->node_low_pfn < max_dma) + zones_size[ZONE_DMA] += (bdp->node_low_pfn - pfn); + else { + zones_size[ZONE_DMA] += (max_dma - pfn); + zones_size[ZONE_NORMAL] += (bdp->node_low_pfn - max_dma); + } + + free_area_init_node(node, NODE_DATA(node), NULL, zones_size, startpfn, 0); + + page = NODE_DATA(node)->node_mem_map; + + bdp = BOOT_NODE_DATA(node)->bdata; + + kaddr = (unsigned long)__va(bdp->node_boot_start); + ekaddr = (unsigned long)__va(bdp->node_low_pfn << PAGE_SHIFT); + while (kaddr < ekaddr) { + bid = BANK_MEM_MAP_INDEX(kaddr); + node_data[mynode]->node_id_map[bid] = node; + node_data[mynode]->bank_mem_map_base[bid] = page; + kaddr += BANKSIZE; + page += BANKSIZE/PAGE_SIZE; + } + } + + /* + * Finish setting up the node data for this node, then copy it to the other nodes. + */ + for (node=0; node < numnodes; node++) + if (mynode != node) { + memcpy(node_data[node], node_data[mynode], sizeof(struct ia64_node_data)); + node_data[node]->node = node; + } +} + diff -Nru a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c --- a/arch/ia64/mm/init.c Mon Oct 28 16:32:36 2002 +++ b/arch/ia64/mm/init.c Mon Oct 28 16:32:36 2002 @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -78,7 +79,7 @@ vma->vm_mm = current->mm; vma->vm_start = IA64_RBS_BOT; vma->vm_end = vma->vm_start + PAGE_SIZE; - vma->vm_page_prot = protection_map[VM_READ | VM_WRITE]; + vma->vm_page_prot = protection_map[VM_DATA_DEFAULT_FLAGS & 0x7]; vma->vm_flags = VM_READ|VM_WRITE|VM_MAYREAD|VM_MAYWRITE|VM_GROWSUP; vma->vm_ops = NULL; vma->vm_pgoff = 0; @@ -347,6 +348,15 @@ extern struct list_head htlbpage_freelist; #endif +#ifdef CONFIG_DISCONTIGMEM +void +paging_init (void) +{ + extern void discontig_paging_init(void); + + discontig_paging_init(); +} +#else /* !CONFIG_DISCONTIGMEM */ void paging_init (void) { @@ -365,6 +375,7 @@ } free_area_init(zones_size); } +#endif /* !CONFIG_DISCONTIGMEM */ static int count_pages (u64 start, u64 end, void *arg) @@ -380,10 +391,9 @@ { unsigned long num_reserved = 0; unsigned long *count = arg; - struct page *pg; - for (pg = virt_to_page(start); pg < virt_to_page(end); ++pg) - if (PageReserved(pg)) + for (; start < end; start += PAGE_SIZE) + if (PageReserved(virt_to_page(start))) ++num_reserved; *count += num_reserved; return 0; @@ -395,6 +405,7 @@ extern char __start_gate_section[]; long reserved_pages, codesize, datasize, initsize; unsigned long num_pgt_pages; + pg_data_t *pgdat; #ifdef CONFIG_PCI /* @@ -405,16 +416,19 @@ platform_pci_dma_init(); #endif +#ifndef CONFIG_DISCONTIGMEM if (!mem_map) BUG(); + max_mapnr = max_low_pfn; +#endif num_physpages = 0; efi_memmap_walk(count_pages, &num_physpages); - max_mapnr = max_low_pfn; high_memory = __va(max_low_pfn * PAGE_SIZE); - totalram_pages += free_all_bootmem(); + for_each_pgdat(pgdat) + totalram_pages += free_all_bootmem_node(pgdat); reserved_pages = 0; efi_memmap_walk(count_reserved_pages, &reserved_pages); @@ -425,7 +439,7 @@ printk("Memory: %luk/%luk available (%luk code, %luk reserved, %luk data, %luk init)\n", (unsigned long) nr_free_pages() << (PAGE_SHIFT - 10), - max_mapnr << (PAGE_SHIFT - 10), codesize >> 10, reserved_pages << (PAGE_SHIFT - 10), + num_physpages << (PAGE_SHIFT - 10), codesize >> 10, reserved_pages << (PAGE_SHIFT - 10), datasize >> 10, initsize >> 10); /* @@ -440,6 +454,8 @@ num_pgt_pages = nr_free_pages() / 10; if (num_pgt_pages > pgt_cache_water[1]) pgt_cache_water[1] = num_pgt_pages; + + show_mem(); /* install the gate page in the global page table: */ put_gate_page(virt_to_page(__start_gate_section), GATE_ADDR); diff -Nru a/arch/ia64/mm/numa.c b/arch/ia64/mm/numa.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/ia64/mm/numa.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,46 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * This file contains NUMA specific variables and functions which can + * be split away from DISCONTIGMEM and are used on NUMA machines with + * contiguous memory. + * + * 2002/08/07 Erich Focht + */ + +#include +#include +#include +#include +#include +#include +#include + +/* + * The following structures are usually initialized by ACPI or + * similar mechanisms and describe the NUMA characteristics of the machine. + */ +int num_memblks = 0; +struct node_memblk_s node_memblk[NR_MEMBLKS]; +struct node_cpuid_s node_cpuid[NR_CPUS]; +/* + * This is a matrix with "distances" between nodes, they should be + * proportional to the memory access latency ratios. + */ +u8 numa_slit[NR_NODES * NR_NODES]; + +/* Identify which cnode a physical address resides on */ +int +paddr_to_nid(unsigned long paddr) +{ + int i; + + for (i = 0; i < num_memblks; i++) + if (paddr >= node_memblk[i].start_paddr && + paddr < node_memblk[i].start_paddr + node_memblk[i].size) + break; + + return (i < num_memblks) ? node_memblk[i].nid : -1; +} diff -Nru a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c --- a/arch/ia64/pci/pci.c Mon Oct 28 16:32:36 2002 +++ b/arch/ia64/pci/pci.c Mon Oct 28 16:32:36 2002 @@ -141,13 +141,13 @@ /* * Called after each bus is probed, but before its children are examined. */ -void __init +void __devinit pcibios_fixup_bus (struct pci_bus *b) { return; } -void __init +void __devinit pcibios_update_resource (struct pci_dev *dev, struct resource *root, struct resource *res, int resource) { @@ -163,7 +163,7 @@ /* ??? FIXME -- record old value for shutdown. */ } -void __init +void __devinit pcibios_update_irq (struct pci_dev *dev, int irq) { pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); @@ -171,7 +171,7 @@ /* ??? FIXME -- record old value for shutdown. */ } -void __init +void __devinit pcibios_fixup_pbus_ranges (struct pci_bus * bus, struct pbus_set_ranges_data * ranges) { } diff -Nru a/arch/ia64/tools/Makefile b/arch/ia64/tools/Makefile --- a/arch/ia64/tools/Makefile Mon Oct 28 16:32:37 2002 +++ b/arch/ia64/tools/Makefile Mon Oct 28 16:32:37 2002 @@ -2,6 +2,8 @@ TARGET = $(TOPDIR)/include/asm-ia64/offsets.h +src = $(obj) + all: fastdep: @@ -9,13 +11,13 @@ mrproper: clean clean: - rm -f print_offsets.s print_offsets offsets.h + rm -f $(obj)/print_offsets.s $(obj)/print_offsets $(obj)/offsets.h -$(TARGET): offsets.h - @if ! cmp -s offsets.h ${TARGET}; then \ +$(TARGET): $(obj)/offsets.h + @if ! cmp -s $(obj)/offsets.h ${TARGET}; then \ echo -e "*** Updating ${TARGET}..."; \ - cp offsets.h ${TARGET}; \ - else \ + cp $(obj)/offsets.h ${TARGET}; \ + else \ echo "*** ${TARGET} is up to date"; \ fi @@ -30,25 +32,26 @@ ifeq ($(CROSS_COMPILE),) -offsets.h: print_offsets - ./print_offsets > offsets.h +$(obj)/offsets.h: $(obj)/print_offsets + $(obj)/print_offsets > $(obj)/offsets.h comma := , -print_offsets: print_offsets.c FORCE +$(obj)/print_offsets: $(src)/print_offsets.c FORCE + [ -r $(TARGET) ] || echo "#define IA64_TASK_SIZE 0" > $(TARGET) $(CC) $(CFLAGS) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) \ - print_offsets.c -o $@ + $(src)/print_offsets.c -o $@ FORCE: else -offsets.h: print_offsets.s - $(AWK) -f print_offsets.awk $^ > $@ +$(obj)/offsets.h: $(obj)/print_offsets.s + $(AWK) -f $(src)/print_offsets.awk $^ > $@ -print_offsets.s: print_offsets.c - $(CC) $(CFLAGS) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) -S \ - print_offsets.c -o $@ +$(obj)/print_offsets.s: $(src)/print_offsets.c + [ -r $(TARGET) ] || echo "#define IA64_TASK_SIZE 0" > $(TARGET) + $(CC) $(CFLAGS) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) -S $^ -o $@ endif diff -Nru a/arch/ia64/vmlinux.lds.S b/arch/ia64/vmlinux.lds.S --- a/arch/ia64/vmlinux.lds.S Mon Oct 28 16:32:37 2002 +++ b/arch/ia64/vmlinux.lds.S Mon Oct 28 16:32:37 2002 @@ -12,11 +12,11 @@ { /* Sections to be discarded */ /DISCARD/ : { - *(.text.exit) - *(.data.exit) + *(.exit.text) + *(.exit.data) *(.exitcall.exit) - *(.IA_64.unwind.text.exit) - *(.IA_64.unwind_info.text.exit) + *(.IA_64.unwind.exit.text) + *(.IA_64.unwind_info.exit.text) } v = PAGE_OFFSET; /* this symbol is here to make debugging easier... */ @@ -65,6 +65,13 @@ { *(__ksymtab) } __stop___ksymtab = .; + __kallsyms : AT(ADDR(__kallsyms) - PAGE_OFFSET) + { + __start___kallsyms = .; /* All kernel symbols */ + *(__kallsyms) + __stop___kallsyms = .; + } + /* Unwind info & table: */ . = ALIGN(8); .IA_64.unwind_info : AT(ADDR(.IA_64.unwind_info) - PAGE_OFFSET) @@ -85,15 +92,15 @@ . = ALIGN(PAGE_SIZE); __init_begin = .; - .text.init : AT(ADDR(.text.init) - PAGE_OFFSET) - { *(.text.init) } + .init.text : AT(ADDR(.init.text) - PAGE_OFFSET) + { *(.init.text) } - .data.init : AT(ADDR(.data.init) - PAGE_OFFSET) - { *(.data.init) } + .init.data : AT(ADDR(.init.data) - PAGE_OFFSET) + { *(.init.data) } . = ALIGN(16); __setup_start = .; - .setup.init : AT(ADDR(.setup.init) - PAGE_OFFSET) - { *(.setup.init) } + .init.setup : AT(ADDR(.init.setup) - PAGE_OFFSET) + { *(.init.setup) } __setup_end = .; __initcall_start = .; .initcall.init : AT(ADDR(.initcall.init) - PAGE_OFFSET) diff -Nru a/arch/x86_64/boot/Makefile b/arch/x86_64/boot/Makefile --- a/arch/x86_64/boot/Makefile Mon Oct 28 16:32:36 2002 +++ b/arch/x86_64/boot/Makefile Mon Oct 28 16:32:36 2002 @@ -46,7 +46,7 @@ $(obj)/bzImage: EXTRA_AFLAGS := -traditional $(SVGA_MODE) $(RAMDISK) -D__BIG_KERNEL__ $(obj)/bzImage: BUILDFLAGS := -b -quiet_cmd_image = BUILD $(echo_target) +quiet_cmd_image = BUILD $@ cmd_image = $(obj)/tools/build $(BUILDFLAGS) $(obj)/bootsect $(obj)/setup \ $(obj)/vmlinux.bin $(ROOT_DEV) > $@ diff -Nru a/drivers/acorn/block/mfmhd.c b/drivers/acorn/block/mfmhd.c --- a/drivers/acorn/block/mfmhd.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acorn/block/mfmhd.c Mon Oct 28 16:32:36 2002 @@ -105,7 +105,6 @@ #include #include #include -#include #include #include #include diff -Nru a/drivers/acpi/Config.help b/drivers/acpi/Config.help --- a/drivers/acpi/Config.help Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/Config.help Mon Oct 28 16:32:36 2002 @@ -72,6 +72,11 @@ ACPI C2 and C3 processor states to save power, on systems that support it. +CONFIG_ACPI_PROCESSOR_PERF + This driver adds support for CPU frequency scaling, if this is supported + by the hardware and the BIOS. If you are compiling for a mobile system, + say Y. + CONFIG_ACPI_THERMAL This driver adds support for ACPI thermal zones. Most mobile and some desktop systems support ACPI thermal zones. It is HIGHLY diff -Nru a/drivers/acpi/Config.in b/drivers/acpi/Config.in --- a/drivers/acpi/Config.in Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/Config.in Mon Oct 28 16:32:37 2002 @@ -21,6 +21,12 @@ tristate ' Button' CONFIG_ACPI_BUTTON tristate ' Fan' CONFIG_ACPI_FAN tristate ' Processor' CONFIG_ACPI_PROCESSOR + if [ "$CONFIG_ACPI_PROCESSOR" != "n" ]; then + bool ' Processor Performance States' CONFIG_ACPI_PROCESSOR_PERF + if [ "$CONFIG_CPU_FREQ" != "y" ]; then + define_bool CONFIG_CPU_FREQ $CONFIG_ACPI_PROCESSOR_PERF + fi + fi dep_tristate ' Thermal Zone' CONFIG_ACPI_THERMAL $CONFIG_ACPI_PROCESSOR if [ "$CONFIG_NUMA" = "y" ]; then dep_bool ' NUMA support' CONFIG_ACPI_NUMA $CONFIG_NUMA diff -Nru a/drivers/acpi/acpi_ksyms.c b/drivers/acpi/acpi_ksyms.c --- a/drivers/acpi/acpi_ksyms.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/acpi_ksyms.c Mon Oct 28 16:32:36 2002 @@ -86,6 +86,7 @@ EXPORT_SYMBOL(acpi_set_register); EXPORT_SYMBOL(acpi_enter_sleep_state); EXPORT_SYMBOL(acpi_get_system_info); +EXPORT_SYMBOL(acpi_get_devices); /* ACPI OS Services Layer (acpi_osl.c) */ @@ -100,6 +101,8 @@ EXPORT_SYMBOL(acpi_os_delete_semaphore); EXPORT_SYMBOL(acpi_os_wait_semaphore); +EXPORT_SYMBOL(acpi_os_read_pci_configuration); + /* ACPI Utilities (acpi_utils.c) */ EXPORT_SYMBOL(acpi_extract_package); @@ -126,3 +129,15 @@ EXPORT_SYMBOL(acpi_bus_unregister_driver); #endif /*CONFIG_ACPI_BUS*/ + + +/* ACPI PCI Driver (pci_irq.c) */ + +#ifdef CONFIG_ACPI_PCI + +#include +extern int acpi_pci_irq_enable(struct pci_dev *dev); +EXPORT_SYMBOL(acpi_pci_irq_enable); +extern int acpi_pci_irq_lookup (int segment, int bus, int device, int pin); +EXPORT_SYMBOL(acpi_pci_irq_lookup); +#endif /*CONFIG_ACPI_PCI */ diff -Nru a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c --- a/drivers/acpi/blacklist.c Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/blacklist.c Mon Oct 28 16:32:35 2002 @@ -78,9 +78,7 @@ {"INT440", "SYSFexxx", 0x00001001, ACPI_DSDT, less_than_or_equal, "Does not use _REG to protect EC OpRegions", 1}, /* IBM 600E - _ADR should return 7, but it returns 1 */ {"IBM ", "TP600E ", 0x00000105, ACPI_DSDT, less_than_or_equal, "Incorrect _ADR", 1}, - {"VIA694", "AWRDACPI", 0, ACPI_DSDT, all_versions, "Bogus table", 1}, {"ASUS\0\0", "P2B-S ", 0, ACPI_DSDT, all_versions, "Bogus PCI routing", 1}, - {"COMPAQ", "DSDT", 0, ACPI_DSDT, all_versions, "Bogus PCI routing", 1}, {""} }; diff -Nru a/drivers/acpi/dispatcher/dsfield.c b/drivers/acpi/dispatcher/dsfield.c --- a/drivers/acpi/dispatcher/dsfield.c Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/dispatcher/dsfield.c Mon Oct 28 16:32:35 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dsfield - Dispatcher field routines - * $Revision: 68 $ + * $Revision: 69 $ * *****************************************************************************/ @@ -103,7 +103,7 @@ * Enter the Name_string into the namespace */ status = acpi_ns_lookup (walk_state->scope_info, arg->common.value.string, - INTERNAL_TYPE_DEF_ANY, ACPI_IMODE_LOAD_PASS1, + ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, flags, walk_state, &(node)); if (ACPI_FAILURE (status)) { ACPI_REPORT_NSERROR (arg->common.value.string, status); @@ -343,7 +343,7 @@ /* Each remaining arg is a Named Field */ - info.field_type = INTERNAL_TYPE_REGION_FIELD; + info.field_type = ACPI_TYPE_LOCAL_REGION_FIELD; info.region_node = region_node; status = acpi_ds_get_field_names (&info, walk_state, arg->common.next); @@ -384,17 +384,17 @@ switch (walk_state->opcode) { case AML_FIELD_OP: arg = acpi_ps_get_arg (op, 2); - type = INTERNAL_TYPE_REGION_FIELD; + type = ACPI_TYPE_LOCAL_REGION_FIELD; break; case AML_BANK_FIELD_OP: arg = acpi_ps_get_arg (op, 4); - type = INTERNAL_TYPE_BANK_FIELD; + type = ACPI_TYPE_LOCAL_BANK_FIELD; break; case AML_INDEX_FIELD_OP: arg = acpi_ps_get_arg (op, 3); - type = INTERNAL_TYPE_INDEX_FIELD; + type = ACPI_TYPE_LOCAL_INDEX_FIELD; break; default: @@ -477,11 +477,11 @@ } } - /* Second arg is the Bank Register (must already exist) */ + /* Second arg is the Bank Register (Field) (must already exist) */ arg = arg->common.next; status = acpi_ns_lookup (walk_state->scope_info, arg->common.value.string, - INTERNAL_TYPE_BANK_FIELD_DEFN, ACPI_IMODE_EXECUTE, + ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, walk_state, &info.register_node); if (ACPI_FAILURE (status)) { ACPI_REPORT_NSERROR (arg->common.value.string, status); @@ -500,7 +500,7 @@ /* Each remaining arg is a Named Field */ - info.field_type = INTERNAL_TYPE_BANK_FIELD; + info.field_type = ACPI_TYPE_LOCAL_BANK_FIELD; info.region_node = region_node; status = acpi_ds_get_field_names (&info, walk_state, arg->common.next); @@ -552,7 +552,7 @@ arg = arg->common.next; status = acpi_ns_lookup (walk_state->scope_info, arg->common.value.string, - INTERNAL_TYPE_INDEX_FIELD_DEFN, ACPI_IMODE_EXECUTE, + ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, walk_state, &info.data_register_node); if (ACPI_FAILURE (status)) { ACPI_REPORT_NSERROR (arg->common.value.string, status); @@ -566,7 +566,7 @@ /* Each remaining arg is a Named Field */ - info.field_type = INTERNAL_TYPE_INDEX_FIELD; + info.field_type = ACPI_TYPE_LOCAL_INDEX_FIELD; info.region_node = region_node; status = acpi_ds_get_field_names (&info, walk_state, arg->common.next); diff -Nru a/drivers/acpi/dispatcher/dsmthdat.c b/drivers/acpi/dispatcher/dsmthdat.c --- a/drivers/acpi/dispatcher/dsmthdat.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/dispatcher/dsmthdat.c Mon Oct 28 16:32:36 2002 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dsmthdat - control method arguments and local variables - * $Revision: 63 $ + * $Revision: 64 $ * ******************************************************************************/ @@ -603,7 +603,7 @@ * If we have a valid reference object that came from Ref_of(), do the * indirect store */ - if ((current_obj_desc->common.type == INTERNAL_TYPE_REFERENCE) && + if ((current_obj_desc->common.type == ACPI_TYPE_LOCAL_REFERENCE) && (current_obj_desc->reference.opcode == AML_REF_OF_OP)) { ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Arg (%p) is an Obj_ref(Node), storing in node %p\n", diff -Nru a/drivers/acpi/dispatcher/dsobject.c b/drivers/acpi/dispatcher/dsobject.c --- a/drivers/acpi/dispatcher/dsobject.c Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/dispatcher/dsobject.c Mon Oct 28 16:32:35 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dsobject - Dispatcher object management routines - * $Revision: 108 $ + * $Revision: 110 $ * *****************************************************************************/ @@ -707,7 +707,7 @@ case ACPI_TYPE_STRING: obj_desc->string.pointer = op->common.value.string; - obj_desc->string.length = ACPI_STRLEN (op->common.value.string); + obj_desc->string.length = (u32) ACPI_STRLEN (op->common.value.string); /* * The string is contained in the ACPI table, don't ever try @@ -721,7 +721,7 @@ break; - case INTERNAL_TYPE_REFERENCE: + case ACPI_TYPE_LOCAL_REFERENCE: switch (op_info->type) { case AML_TYPE_LOCAL_VARIABLE: diff -Nru a/drivers/acpi/dispatcher/dsopcode.c b/drivers/acpi/dispatcher/dsopcode.c --- a/drivers/acpi/dispatcher/dsopcode.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/dispatcher/dsopcode.c Mon Oct 28 16:32:37 2002 @@ -2,7 +2,7 @@ * * Module Name: dsopcode - Dispatcher Op Region support and handling of * "control" opcodes - * $Revision: 82 $ + * $Revision: 83 $ * *****************************************************************************/ @@ -1021,7 +1021,7 @@ * Allow references created by the Index operator to return unchanged. */ if ((ACPI_GET_DESCRIPTOR_TYPE (walk_state->results->results.obj_desc[0]) == ACPI_DESC_TYPE_OPERAND) && - (ACPI_GET_OBJECT_TYPE (walk_state->results->results.obj_desc [0]) == INTERNAL_TYPE_REFERENCE) && + (ACPI_GET_OBJECT_TYPE (walk_state->results->results.obj_desc [0]) == ACPI_TYPE_LOCAL_REFERENCE) && ((walk_state->results->results.obj_desc [0])->reference.opcode != AML_INDEX_OP)) { status = acpi_ex_resolve_to_value (&walk_state->results->results.obj_desc [0], walk_state); if (ACPI_FAILURE (status)) { diff -Nru a/drivers/acpi/dispatcher/dsutils.c b/drivers/acpi/dispatcher/dsutils.c --- a/drivers/acpi/dispatcher/dsutils.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/dispatcher/dsutils.c Mon Oct 28 16:32:36 2002 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dsutils - Dispatcher utilities - * $Revision: 95 $ + * $Revision: 96 $ * ******************************************************************************/ @@ -431,7 +431,7 @@ /* Get the object type of the argument */ op_info = acpi_ps_get_opcode_info (opcode); - if (op_info->object_type == INTERNAL_TYPE_INVALID) { + if (op_info->object_type == ACPI_TYPE_INVALID) { return_ACPI_STATUS (AE_NOT_IMPLEMENTED); } diff -Nru a/drivers/acpi/dispatcher/dswload.c b/drivers/acpi/dispatcher/dswload.c --- a/drivers/acpi/dispatcher/dswload.c Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/dispatcher/dswload.c Mon Oct 28 16:32:35 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dswload - Dispatcher namespace load callbacks - * $Revision: 75 $ + * $Revision: 78 $ * *****************************************************************************/ @@ -151,49 +151,27 @@ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "State=%p Op=%p [%s] ", walk_state, op, acpi_ut_get_type_name (object_type))); - /* - * Setup the search flags. - * - * Since we are entering a name into the namespace, we do not want to - * enable the search-to-root upsearch. - * - * There are only two conditions where it is acceptable that the name - * already exists: - * 1) the Scope() operator can reopen a scoping object that was - * previously defined (Scope, Method, Device, etc.) - * 2) Whenever we are parsing a deferred opcode (Op_region, Buffer, - * Buffer_field, or Package), the name of the object is already - * in the namespace. - */ - flags = ACPI_NS_NO_UPSEARCH; - if ((walk_state->opcode != AML_SCOPE_OP) && - (!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) { - flags |= ACPI_NS_ERROR_IF_FOUND; - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH, "Cannot already exist\n")); - } - else { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH, "Both Find or Create allowed\n")); - } + switch (walk_state->opcode) { + case AML_SCOPE_OP: - /* - * Enter the named type into the internal namespace. We enter the name - * as we go downward in the parse tree. Any necessary subobjects that involve - * arguments to the opcode must be created as we go back up the parse tree later. - */ - status = acpi_ns_lookup (walk_state->scope_info, path, object_type, - ACPI_IMODE_LOAD_PASS1, flags, walk_state, &(node)); - if (ACPI_FAILURE (status)) { - ACPI_REPORT_NSERROR (path, status); - return (status); - } + /* + * The target name of the Scope() operator must exist at this point so + * that we can actually open the scope to enter new names underneath it. + * Allow search-to-root for single namesegs. + */ + status = acpi_ns_lookup (walk_state->scope_info, path, object_type, + ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, walk_state, &(node)); + if (ACPI_FAILURE (status)) { + ACPI_REPORT_NSERROR (path, status); + return (status); + } - /* - * For the scope op, we must check to make sure that the target is - * one of the opcodes that actually opens a scope - */ - if (walk_state->opcode == AML_SCOPE_OP) { + /* + * Check to make sure that the target is + * one of the opcodes that actually opens a scope + */ switch (node->type) { - case ACPI_TYPE_ANY: /* Scope nodes are untyped (ANY) */ + case ACPI_TYPE_LOCAL_SCOPE: /* Scope */ case ACPI_TYPE_DEVICE: case ACPI_TYPE_POWER: case ACPI_TYPE_PROCESSOR: @@ -223,7 +201,7 @@ walk_state->scope_info->common.value = ACPI_TYPE_ANY; break; - default: + default: /* All other types are an error */ @@ -232,8 +210,53 @@ return (AE_AML_OPERAND_TYPE); } + break; + + + default: + + /* + * For all other named opcodes, we will enter the name into the namespace. + * + * Setup the search flags. + * Since we are entering a name into the namespace, we do not want to + * enable the search-to-root upsearch. + * + * There are only two conditions where it is acceptable that the name + * already exists: + * 1) the Scope() operator can reopen a scoping object that was + * previously defined (Scope, Method, Device, etc.) + * 2) Whenever we are parsing a deferred opcode (Op_region, Buffer, + * Buffer_field, or Package), the name of the object is already + * in the namespace. + */ + flags = ACPI_NS_NO_UPSEARCH; + if ((walk_state->opcode != AML_SCOPE_OP) && + (!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) { + flags |= ACPI_NS_ERROR_IF_FOUND; + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH, "Cannot already exist\n")); + } + else { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH, "Both Find or Create allowed\n")); + } + + /* + * Enter the named type into the internal namespace. We enter the name + * as we go downward in the parse tree. Any necessary subobjects that involve + * arguments to the opcode must be created as we go back up the parse tree later. + */ + status = acpi_ns_lookup (walk_state->scope_info, path, object_type, + ACPI_IMODE_LOAD_PASS1, flags, walk_state, &(node)); + if (ACPI_FAILURE (status)) { + ACPI_REPORT_NSERROR (path, status); + return (status); + } + break; } + + /* Common exit */ + if (!op) { /* Create a new op */ @@ -419,59 +442,43 @@ "State=%p Op=%p Type=%X\n", walk_state, op, object_type)); - if (walk_state->opcode == AML_FIELD_OP || - walk_state->opcode == AML_BANK_FIELD_OP || - walk_state->opcode == AML_INDEX_FIELD_OP) { + switch (walk_state->opcode) { + case AML_FIELD_OP: + case AML_BANK_FIELD_OP: + case AML_INDEX_FIELD_OP: + node = NULL; status = AE_OK; - } - else if (walk_state->opcode == AML_INT_NAMEPATH_OP) { + break; + + case AML_INT_NAMEPATH_OP: + /* * The Name_path is an object reference to an existing object. Don't enter the * name into the namespace, but look it up for use later */ status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, walk_state, &(node)); - } - else { - /* All other opcodes */ - - if (op && op->common.node) { - /* This op/node was previously entered into the namespace */ - - node = op->common.node; - - if (acpi_ns_opens_scope (object_type)) { - status = acpi_ds_scope_stack_push (node, object_type, walk_state); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } + break; - } - return_ACPI_STATUS (AE_OK); - } + case AML_SCOPE_OP: /* - * Enter the named type into the internal namespace. We enter the name - * as we go downward in the parse tree. Any necessary subobjects that involve - * arguments to the opcode must be created as we go back up the parse tree later. + * The Path is an object reference to an existing object. Don't enter the + * name into the namespace, but look it up for use later */ status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type, - ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, walk_state, &(node)); - } - - if (ACPI_FAILURE (status)) { - ACPI_REPORT_NSERROR (buffer_ptr, status); - return_ACPI_STATUS (status); - } - - /* - * For the scope op, we must check to make sure that the target is - * one of the opcodes that actually opens a scope - */ - if (walk_state->opcode == AML_SCOPE_OP) { + ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, walk_state, &(node)); + if (ACPI_FAILURE (status)) { + ACPI_REPORT_NSERROR (buffer_ptr, status); + return_ACPI_STATUS (status); + } + /* + * We must check to make sure that the target is + * one of the opcodes that actually opens a scope + */ switch (node->type) { - case ACPI_TYPE_ANY: /* Scope nodes are untyped (ANY) */ + case ACPI_TYPE_LOCAL_SCOPE: /* Scope */ case ACPI_TYPE_DEVICE: case ACPI_TYPE_POWER: case ACPI_TYPE_PROCESSOR: @@ -499,7 +506,7 @@ walk_state->scope_info->common.value = ACPI_TYPE_ANY; break; - default: + default: /* All other types are an error */ @@ -508,7 +515,42 @@ return (AE_AML_OPERAND_TYPE); } + break; + + default: + + /* All other opcodes */ + + if (op && op->common.node) { + /* This op/node was previously entered into the namespace */ + + node = op->common.node; + + if (acpi_ns_opens_scope (object_type)) { + status = acpi_ds_scope_stack_push (node, object_type, walk_state); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + + } + return_ACPI_STATUS (AE_OK); + } + + /* + * Enter the named type into the internal namespace. We enter the name + * as we go downward in the parse tree. Any necessary subobjects that involve + * arguments to the opcode must be created as we go back up the parse tree later. + */ + status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type, + ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, walk_state, &(node)); + break; } + + if (ACPI_FAILURE (status)) { + ACPI_REPORT_NSERROR (buffer_ptr, status); + return_ACPI_STATUS (status); + } + if (!op) { /* Create a new op */ diff -Nru a/drivers/acpi/dispatcher/dswscope.c b/drivers/acpi/dispatcher/dswscope.c --- a/drivers/acpi/dispatcher/dswscope.c Mon Oct 28 16:32:38 2002 +++ b/drivers/acpi/dispatcher/dswscope.c Mon Oct 28 16:32:38 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dswscope - Scope stack manipulation - * $Revision: 53 $ + * $Revision: 56 $ * *****************************************************************************/ @@ -25,7 +25,6 @@ #include "acpi.h" -#include "acinterp.h" #include "acdispat.h" @@ -88,6 +87,7 @@ acpi_walk_state *walk_state) { acpi_generic_state *scope_info; + acpi_generic_state *old_scope_info; ACPI_FUNCTION_TRACE ("Ds_scope_stack_push"); @@ -102,7 +102,7 @@ /* Make sure object type is valid */ - if (!acpi_ex_validate_object_type (type)) { + if (!acpi_ut_valid_object_type (type)) { ACPI_REPORT_WARNING (("Ds_scope_stack_push: type code out of range\n")); } @@ -120,6 +120,28 @@ scope_info->scope.node = node; scope_info->common.value = (u16) type; + walk_state->scope_depth++; + + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, + "[%.2d] Pushed scope ", (u32) walk_state->scope_depth)); + + old_scope_info = walk_state->scope_info; + if (old_scope_info) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, + "[%4.4s] (%10s)", + old_scope_info->scope.node->name.ascii, + acpi_ut_get_type_name (old_scope_info->common.value))); + } + else { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, + "[\\___] (%10s)", "ROOT")); + } + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, + ", New scope -> [%4.4s] (%s)\n", + scope_info->scope.node->name.ascii, + acpi_ut_get_type_name (scope_info->common.value))); + /* Push new scope object onto stack */ acpi_ut_push_generic_state (&walk_state->scope_info, scope_info); @@ -150,6 +172,7 @@ acpi_walk_state *walk_state) { acpi_generic_state *scope_info; + acpi_generic_state *new_scope_info; ACPI_FUNCTION_TRACE ("Ds_scope_stack_pop"); @@ -163,8 +186,25 @@ return_ACPI_STATUS (AE_STACK_UNDERFLOW); } + walk_state->scope_depth--; + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, - "Popped object type (%s)\n", acpi_ut_get_type_name (scope_info->common.value))); + "[%.2d] Popped scope [%4.4s] (%10s), New scope -> ", + (u32) walk_state->scope_depth, + scope_info->scope.node->name.ascii, + acpi_ut_get_type_name (scope_info->common.value))); + + new_scope_info = walk_state->scope_info; + if (new_scope_info) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, + "[%4.4s] (%s)\n", + new_scope_info->scope.node->name.ascii, + acpi_ut_get_type_name (new_scope_info->common.value))); + } + else { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, + "[\\___] (ROOT)\n")); + } acpi_ut_delete_generic_state (scope_info); diff -Nru a/drivers/acpi/dispatcher/dswstate.c b/drivers/acpi/dispatcher/dswstate.c --- a/drivers/acpi/dispatcher/dswstate.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/dispatcher/dswstate.c Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dswstate - Dispatcher parse tree walk management routines - * $Revision: 68 $ + * $Revision: 69 $ * *****************************************************************************/ @@ -174,7 +174,7 @@ acpi_operand_object **object, acpi_walk_state *walk_state) { - u32 index; + NATIVE_UINT index; acpi_generic_state *state; @@ -205,7 +205,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] Index=%X State=%p Num=%X\n", *object, (*object) ? acpi_ut_get_object_type_name (*object) : "NULL", - index -1, walk_state, state->results.num_results)); + (u32) index -1, walk_state, state->results.num_results)); return (AE_OK); } diff -Nru a/drivers/acpi/ec.c b/drivers/acpi/ec.c --- a/drivers/acpi/ec.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/ec.c Mon Oct 28 16:32:37 2002 @@ -80,6 +80,7 @@ struct acpi_ec { acpi_handle handle; + unsigned long uid; unsigned long gpe_bit; acpi_generic_address status_addr; acpi_generic_address command_addr; @@ -90,9 +91,6 @@ /* If we find an EC via the ECDT, we need to keep a ptr to its context */ static struct acpi_ec *ec_ecdt; -/* compare this against UIDs in properly enumerated ECs to determine if we - have a dupe */ -static unsigned long ecdt_uid = 0xFFFFFFFF; /* -------------------------------------------------------------------------- Transaction Management @@ -297,80 +295,65 @@ u8 data; }; - static void acpi_ec_gpe_query ( - void *data) + void *ec_cxt) { - struct acpi_ec_query_data *query_data = NULL; + struct acpi_ec *ec = (struct acpi_ec *) ec_cxt; + u32 value = 0; + unsigned long flags = 0; static char object_name[5] = {'_','Q','0','0','\0'}; const char hex[] = {'0','1','2','3','4','5','6','7', '8','9','A','B','C','D','E','F'}; ACPI_FUNCTION_TRACE("acpi_ec_gpe_query"); - if (!data) - return; + if (!ec_cxt) + goto end; - query_data = (struct acpi_ec_query_data *) data; + spin_lock_irqsave(&ec->lock, flags); + acpi_hw_low_level_read(8, &value, &ec->command_addr, 0); + spin_unlock_irqrestore(&ec->lock, flags); - object_name[2] = hex[((query_data->data >> 4) & 0x0F)]; - object_name[3] = hex[(query_data->data & 0x0F)]; + /* TBD: Implement asynch events! + * NOTE: All we care about are EC-SCI's. Other EC events are + * handled via polling (yuck!). This is because some systems + * treat EC-SCIs as level (versus EDGE!) triggered, preventing + * a purely interrupt-driven approach (grumble, grumble). + */ + if (!(value & ACPI_EC_FLAG_SCI)) + goto end; - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluating %s\n", object_name)); + if (acpi_ec_query(ec, &value)) + goto end; + + object_name[2] = hex[((value >> 4) & 0x0F)]; + object_name[3] = hex[(value & 0x0F)]; - acpi_evaluate_object(query_data->handle, object_name, NULL, NULL); + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluating %s\n", object_name)); - kfree(query_data); + acpi_evaluate_object(ec->handle, object_name, NULL, NULL); - return; +end: + acpi_enable_event(ec->gpe_bit, ACPI_EVENT_GPE, 0); } - static void acpi_ec_gpe_handler ( void *data) { acpi_status status = AE_OK; struct acpi_ec *ec = (struct acpi_ec *) data; - u32 value = 0; - unsigned long flags = 0; - struct acpi_ec_query_data *query_data = NULL; if (!ec) return; - spin_lock_irqsave(&ec->lock, flags); - acpi_hw_low_level_read(8, &value, &ec->command_addr, 0); - spin_unlock_irqrestore(&ec->lock, flags); - - /* TBD: Implement asynch events! - * NOTE: All we care about are EC-SCI's. Other EC events are - * handled via polling (yuck!). This is because some systems - * treat EC-SCIs as level (versus EDGE!) triggered, preventing - * a purely interrupt-driven approach (grumble, grumble). - */ - if (!(value & ACPI_EC_FLAG_SCI)) - return; - - if (acpi_ec_query(ec, &value)) - return; - - query_data = kmalloc(sizeof(struct acpi_ec_query_data), GFP_ATOMIC); - if (!query_data) - return; - query_data->handle = ec->handle; - query_data->data = value; + acpi_disable_event(ec->gpe_bit, ACPI_EVENT_GPE, 0); status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, - acpi_ec_gpe_query, query_data); - if (ACPI_FAILURE(status)) - kfree(query_data); - - return; + acpi_ec_gpe_query, ec); } - /* -------------------------------------------------------------------------- Address Space Management -------------------------------------------------------------------------- */ @@ -559,6 +542,7 @@ memset(ec, 0, sizeof(struct acpi_ec)); ec->handle = device->handle; + ec->uid = -1; ec->lock = SPIN_LOCK_UNLOCKED; sprintf(acpi_device_name(device), "%s", ACPI_EC_DEVICE_NAME); sprintf(acpi_device_class(device), "%s", ACPI_EC_CLASS); @@ -567,10 +551,10 @@ /* Use the global lock for all EC transactions? */ acpi_evaluate_integer(ec->handle, "_GLK", NULL, &ec->global_lock); - /* If our UID matches ecdt_uid, we already found this EC via the - ECDT. Abort. */ + /* If our UID matches the UID for the ECDT-enumerated EC, + we already found this EC, so abort. */ acpi_evaluate_integer(ec->handle, "_UID", NULL, &uid); - if (ecdt_uid == uid) { + if (ec_ecdt && ec_ecdt->uid == uid) { result = -ENODEV; goto end; } @@ -758,7 +742,12 @@ ec_ecdt->lock = SPIN_LOCK_UNLOCKED; /* use the GL just to be safe */ ec_ecdt->global_lock = TRUE; - ecdt_uid = ecdt_ptr->uid; + ec_ecdt->uid = ecdt_ptr->uid; + + status = acpi_get_handle(NULL, ecdt_ptr->ec_id, &ec_ecdt->handle); + if (ACPI_FAILURE(status)) { + goto error; + } /* * Install GPE handler @@ -783,7 +772,9 @@ return 0; error: + printk(KERN_ERR PREFIX "Could not use ECDT\n"); kfree(ec_ecdt); + ec_ecdt = NULL; return -ENODEV; } @@ -835,3 +826,4 @@ return_VOID; } + diff -Nru a/drivers/acpi/events/evevent.c b/drivers/acpi/events/evevent.c --- a/drivers/acpi/events/evevent.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/events/evevent.c Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evevent - Fixed and General Purpose Even handling and dispatch - * $Revision: 92 $ + * $Revision: 95 $ * *****************************************************************************/ @@ -343,40 +343,58 @@ acpi_gbl_gpe_block_info[0].block_base_number = 0; acpi_gbl_gpe_block_info[1].block_base_number = acpi_gbl_FADT->gpe1_base; + /* Warn and exit if there are no GPE registers */ + acpi_gbl_gpe_register_count = acpi_gbl_gpe_block_info[0].register_count + acpi_gbl_gpe_block_info[1].register_count; if (!acpi_gbl_gpe_register_count) { - ACPI_REPORT_WARNING (("Zero GPEs are defined in the FADT\n")); + ACPI_REPORT_WARNING (("There are no GPE blocks defined in the FADT\n")); return_ACPI_STATUS (AE_OK); } - /* Determine the maximum GPE number for this machine */ + /* + * Determine the maximum GPE number for this machine. + * Note: both GPE0 and GPE1 are optional, and either can exist without + * the other + */ + if (acpi_gbl_gpe_block_info[0].register_count) { + /* GPE block 0 exists */ - acpi_gbl_gpe_number_max = ACPI_MUL_8 (acpi_gbl_gpe_block_info[0].register_count) - 1; + acpi_gbl_gpe_number_max = ACPI_MUL_8 (acpi_gbl_gpe_block_info[0].register_count) - 1; + } if (acpi_gbl_gpe_block_info[1].register_count) { - /* Check for GPE0/GPE1 overlap */ + /* GPE block 1 exists */ - if (acpi_gbl_gpe_number_max >= acpi_gbl_FADT->gpe1_base) { - ACPI_REPORT_ERROR (("GPE0 block overlaps the GPE1 block\n")); + /* Check for GPE0/GPE1 overlap (if both banks exist) */ + + if ((acpi_gbl_gpe_block_info[0].register_count) && + (acpi_gbl_gpe_number_max >= acpi_gbl_FADT->gpe1_base)) { + ACPI_REPORT_ERROR (( + "GPE0 block (GPE 0 to %d) overlaps the GPE1 block (GPE %d to %d)\n", + acpi_gbl_gpe_number_max, acpi_gbl_FADT->gpe1_base, + acpi_gbl_FADT->gpe1_base + (ACPI_MUL_8 (acpi_gbl_gpe_block_info[1].register_count) - 1))); return_ACPI_STATUS (AE_BAD_VALUE); } - /* GPE0 and GPE1 do not have to be contiguous in the GPE number space */ - - acpi_gbl_gpe_number_max = acpi_gbl_FADT->gpe1_base + (ACPI_MUL_8 (acpi_gbl_gpe_block_info[1].register_count) - 1); + /* + * GPE0 and GPE1 do not have to be contiguous in the GPE number space, + * But, GPE0 always starts at zero. + */ + acpi_gbl_gpe_number_max = acpi_gbl_FADT->gpe1_base + + (ACPI_MUL_8 (acpi_gbl_gpe_block_info[1].register_count) - 1); } /* Check for Max GPE number out-of-range */ if (acpi_gbl_gpe_number_max > ACPI_GPE_MAX) { - ACPI_REPORT_ERROR (("Maximum GPE number from FADT is too large: 0x%X\n", acpi_gbl_gpe_number_max)); + ACPI_REPORT_ERROR (("Maximum GPE number from FADT is too large: 0x%X\n", + acpi_gbl_gpe_number_max)); return_ACPI_STATUS (AE_BAD_VALUE); } - /* - * Allocate the GPE number-to-index translation table - */ + /* Allocate the GPE number-to-index translation table */ + acpi_gbl_gpe_number_to_index = ACPI_MEM_CALLOCATE ( sizeof (ACPI_GPE_INDEX_INFO) * ((ACPI_SIZE) acpi_gbl_gpe_number_max + 1)); @@ -391,9 +409,8 @@ ACPI_MEMSET (acpi_gbl_gpe_number_to_index, (int) ACPI_GPE_INVALID, sizeof (ACPI_GPE_INDEX_INFO) * ((ACPI_SIZE) acpi_gbl_gpe_number_max + 1)); - /* - * Allocate the GPE register information block - */ + /* Allocate the GPE register information block */ + acpi_gbl_gpe_register_info = ACPI_MEM_CALLOCATE ( (ACPI_SIZE) acpi_gbl_gpe_register_count * sizeof (ACPI_GPE_REGISTER_INFO)); @@ -465,7 +482,6 @@ * are cleared by writing a '1', while enable registers are cleared * by writing a '0'. */ - status = acpi_hw_low_level_write (8, 0x00, &gpe_register_info->enable_address, 0); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); @@ -479,16 +495,18 @@ gpe_register++; } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "GPE Block%d: %X registers at %8.8X%8.8X\n", - (s32) gpe_block, acpi_gbl_gpe_block_info[0].register_count, - ACPI_HIDWORD (ACPI_GET_ADDRESS (acpi_gbl_gpe_block_info[gpe_block].block_address->address)), - ACPI_LODWORD (ACPI_GET_ADDRESS (acpi_gbl_gpe_block_info[gpe_block].block_address->address)))); - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "GPE Block%d Range GPE #%2.2X to GPE #%2.2X\n", - (s32) gpe_block, - acpi_gbl_gpe_block_info[gpe_block].block_base_number, - acpi_gbl_gpe_block_info[gpe_block].block_base_number + - ((acpi_gbl_gpe_block_info[gpe_block].register_count * 8) -1))); + if (i) { + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "GPE Block%d: %X registers at %8.8X%8.8X\n", + (s32) gpe_block, acpi_gbl_gpe_block_info[0].register_count, + ACPI_HIDWORD (ACPI_GET_ADDRESS (acpi_gbl_gpe_block_info[gpe_block].block_address->address)), + ACPI_LODWORD (ACPI_GET_ADDRESS (acpi_gbl_gpe_block_info[gpe_block].block_address->address)))); + + ACPI_REPORT_INFO (("GPE Block%d defined as GPE%d to GPE%d\n", + (s32) gpe_block, + acpi_gbl_gpe_block_info[gpe_block].block_base_number, + acpi_gbl_gpe_block_info[gpe_block].block_base_number + + ((acpi_gbl_gpe_block_info[gpe_block].register_count * 8) -1))); + } } return_ACPI_STATUS (AE_OK); @@ -794,7 +812,7 @@ */ status = acpi_ns_evaluate_by_handle (gpe_info.method_handle, NULL, NULL); if (ACPI_FAILURE (status)) { - ACPI_REPORT_ERROR (("%s while evaluated GPE%X method\n", + ACPI_REPORT_ERROR (("%s while evaluating GPE%X method\n", acpi_format_exception (status), gpe_number)); } } @@ -846,7 +864,7 @@ gpe_number_index = acpi_ev_get_gpe_number_index (gpe_number); if (gpe_number_index == ACPI_GPE_INVALID) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid event, GPE[%X].\n", gpe_number)); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "GPE[%X] is not a valid event\n", gpe_number)); return_VALUE (ACPI_INTERRUPT_NOT_HANDLED); } diff -Nru a/drivers/acpi/events/evxface.c b/drivers/acpi/events/evxface.c --- a/drivers/acpi/events/evxface.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/events/evxface.c Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evxface - External interfaces for ACPI events - * $Revision: 130 $ + * $Revision: 131 $ * *****************************************************************************/ @@ -294,7 +294,7 @@ /* Install the handler */ - notify_obj = acpi_ut_create_internal_object (INTERNAL_TYPE_NOTIFY); + notify_obj = acpi_ut_create_internal_object (ACPI_TYPE_LOCAL_NOTIFY); if (!notify_obj) { status = AE_NO_MEMORY; goto unlock_and_exit; diff -Nru a/drivers/acpi/events/evxfregn.c b/drivers/acpi/events/evxfregn.c --- a/drivers/acpi/events/evxfregn.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/events/evxfregn.c Mon Oct 28 16:32:36 2002 @@ -2,7 +2,7 @@ * * Module Name: evxfregn - External Interfaces, ACPI Operation Regions and * Address Spaces. - * $Revision: 50 $ + * $Revision: 51 $ * *****************************************************************************/ @@ -220,7 +220,7 @@ * So, we just allocate the object for the handler and link it * into the list. */ - handler_obj = acpi_ut_create_internal_object (INTERNAL_TYPE_ADDRESS_HANDLER); + handler_obj = acpi_ut_create_internal_object (ACPI_TYPE_LOCAL_ADDRESS_HANDLER); if (!handler_obj) { status = AE_NO_MEMORY; goto unlock_and_exit; diff -Nru a/drivers/acpi/executer/exconfig.c b/drivers/acpi/executer/exconfig.c --- a/drivers/acpi/executer/exconfig.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/executer/exconfig.c Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exconfig - Namespace reconfiguration (Load/Unload opcodes) - * $Revision: 67 $ + * $Revision: 69 $ * *****************************************************************************/ @@ -67,7 +67,7 @@ /* Create an object to be the table handle */ - obj_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_REFERENCE); + obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_LOCAL_REFERENCE); if (!obj_desc) { return_ACPI_STATUS (AE_NO_MEMORY); } @@ -77,7 +77,6 @@ table_info.pointer = table; table_info.length = (ACPI_SIZE) table->length; table_info.allocation = ACPI_MEM_ALLOCATED; - table_info.base_pointer = table; status = acpi_tb_install_table (&table_info); if (ACPI_FAILURE (status)) { @@ -316,9 +315,9 @@ case ACPI_TYPE_BUFFER_FIELD: - case INTERNAL_TYPE_REGION_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Load from Field %p %s\n", obj_desc, acpi_ut_get_object_type_name (obj_desc))); @@ -417,7 +416,7 @@ */ if ((!ddb_handle) || (ACPI_GET_DESCRIPTOR_TYPE (ddb_handle) != ACPI_DESC_TYPE_OPERAND) || - (ACPI_GET_OBJECT_TYPE (ddb_handle) != INTERNAL_TYPE_REFERENCE)) { + (ACPI_GET_OBJECT_TYPE (ddb_handle) != ACPI_TYPE_LOCAL_REFERENCE)) { return_ACPI_STATUS (AE_BAD_PARAMETER); } diff -Nru a/drivers/acpi/executer/exconvrt.c b/drivers/acpi/executer/exconvrt.c --- a/drivers/acpi/executer/exconvrt.c Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/executer/exconvrt.c Mon Oct 28 16:32:35 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exconvrt - Object conversion routines - * $Revision: 39 $ + * $Revision: 41 $ * *****************************************************************************/ @@ -510,7 +510,7 @@ new_buf [index-1] = 0; ret_desc->buffer.pointer = new_buf; - ret_desc->string.length = ACPI_STRLEN ((char *) new_buf); + ret_desc->string.length = (u32) ACPI_STRLEN ((char *) new_buf); /* Return the new buffer descriptor */ @@ -587,7 +587,7 @@ case ARGI_INTEGER_REF: /* Handles Increment, Decrement cases */ switch (destination_type) { - case INTERNAL_TYPE_REGION_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: /* * Named field can always handle conversions */ @@ -612,8 +612,8 @@ switch (destination_type) { case ACPI_TYPE_INTEGER: case ACPI_TYPE_BUFFER_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: /* * These types require an Integer operand. We can convert * a Buffer or a String to an Integer if necessary. diff -Nru a/drivers/acpi/executer/excreate.c b/drivers/acpi/executer/excreate.c --- a/drivers/acpi/executer/excreate.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/executer/excreate.c Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: excreate - Named object creation - * $Revision: 94 $ + * $Revision: 97 $ * *****************************************************************************/ @@ -55,7 +55,7 @@ { acpi_namespace_node *target_node; acpi_namespace_node *alias_node; - acpi_status status; + acpi_status status = AE_OK; ACPI_FUNCTION_TRACE ("Ex_create_alias"); @@ -66,7 +66,7 @@ alias_node = (acpi_namespace_node *) walk_state->operands[0]; target_node = (acpi_namespace_node *) walk_state->operands[1]; - if (target_node->type == INTERNAL_TYPE_ALIAS) { + if (target_node->type == ACPI_TYPE_LOCAL_ALIAS) { /* * Dereference an existing alias so that we don't create a chain * of aliases. With this code, we guarantee that an alias is @@ -95,8 +95,8 @@ * NS node, not the object itself. This is because for these * types, the object can change dynamically via a Store. */ - alias_node->type = INTERNAL_TYPE_ALIAS; - alias_node->object = (acpi_operand_object *) target_node; + alias_node->type = ACPI_TYPE_LOCAL_ALIAS; + alias_node->object = ACPI_CAST_PTR (acpi_operand_object, target_node); break; default: @@ -117,7 +117,7 @@ /* Since both operands are Nodes, we don't need to delete them */ - return_ACPI_STATUS (AE_OK); + return_ACPI_STATUS (status); } @@ -221,9 +221,10 @@ /* Init object and attach to NS node */ obj_desc->mutex.sync_level = (u8) walk_state->operands[1]->integer.value; + obj_desc->mutex.node = (acpi_namespace_node *) walk_state->operands[0]; - status = acpi_ns_attach_object ((acpi_namespace_node *) walk_state->operands[0], - obj_desc, ACPI_TYPE_MUTEX); + status = acpi_ns_attach_object (obj_desc->mutex.node, + obj_desc, ACPI_TYPE_MUTEX); cleanup: diff -Nru a/drivers/acpi/executer/exdump.c b/drivers/acpi/executer/exdump.c --- a/drivers/acpi/executer/exdump.c Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/executer/exdump.c Mon Oct 28 16:32:35 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exdump - Interpreter debug output routines - * $Revision: 160 $ + * $Revision: 162 $ * *****************************************************************************/ @@ -58,7 +58,6 @@ { u8 *buf = NULL; u32 length; - u32 i; acpi_operand_object **element; u16 element_index; @@ -97,7 +96,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", obj_desc)); switch (ACPI_GET_OBJECT_TYPE (obj_desc)) { - case INTERNAL_TYPE_REFERENCE: + case ACPI_TYPE_LOCAL_REFERENCE: switch (obj_desc->reference.opcode) { case AML_DEBUG_OP: @@ -217,22 +216,6 @@ break; - case INTERNAL_TYPE_IF: - - acpi_os_printf ("If [Integer] %8.8X%8.8X\n", - ACPI_HIDWORD (obj_desc->integer.value), - ACPI_LODWORD (obj_desc->integer.value)); - break; - - - case INTERNAL_TYPE_WHILE: - - acpi_os_printf ("While [Integer] %8.8X%8.8X\n", - ACPI_HIDWORD (obj_desc->integer.value), - ACPI_LODWORD (obj_desc->integer.value)); - break; - - case ACPI_TYPE_PACKAGE: acpi_os_printf ("Package count %X @ %p\n", @@ -279,24 +262,20 @@ case ACPI_TYPE_STRING: - acpi_os_printf ("String length %X @ %p \"", + acpi_os_printf ("String length %X @ %p ", obj_desc->string.length, obj_desc->string.pointer); - - for (i = 0; i < obj_desc->string.length; i++) { - acpi_os_printf ("%c", - obj_desc->string.pointer[i]); - } - acpi_os_printf ("\"\n"); + acpi_ut_print_string (obj_desc->string.pointer, ACPI_UINT8_MAX); + acpi_os_printf ("\n"); break; - case INTERNAL_TYPE_BANK_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: acpi_os_printf ("Bank_field\n"); break; - case INTERNAL_TYPE_REGION_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: acpi_os_printf ( "Region_field: Bits=%X Acc_width=%X Lock=%X Update=%X at byte=%X bit=%X of below:\n", @@ -308,7 +287,7 @@ break; - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: acpi_os_printf ("Index_field\n"); break; @@ -321,16 +300,13 @@ obj_desc->buffer_field.bit_length, obj_desc->buffer_field.base_byte_offset, obj_desc->buffer_field.start_field_bit_offset); - if (!obj_desc->buffer_field.buffer_obj) - { + if (!obj_desc->buffer_field.buffer_obj) { ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL* \n")); } - else if (ACPI_GET_OBJECT_TYPE (obj_desc->buffer_field.buffer_obj) != ACPI_TYPE_BUFFER) - { + else if (ACPI_GET_OBJECT_TYPE (obj_desc->buffer_field.buffer_obj) != ACPI_TYPE_BUFFER) { acpi_os_printf ("*not a Buffer* \n"); } - else - { + else { ACPI_DUMP_STACK_ENTRY (obj_desc->buffer_field.buffer_obj); } @@ -423,13 +399,11 @@ ACPI_FUNCTION_NAME ("Ex_dump_operands"); - if (!ident) - { + if (!ident) { ident = "?"; } - if (!note) - { + if (!note) { note = "?"; } @@ -437,15 +411,13 @@ "************* Operand Stack Contents (Opcode [%s], %d Operands)\n", ident, num_levels)); - if (num_levels == 0) - { + if (num_levels == 0) { num_levels = 1; } /* Dump the operand stack starting at the top */ - for (i = 0; num_levels > 0; i--, num_levels--) - { + for (i = 0; num_levels > 0; i--, num_levels--) { obj_desc = &operands[i]; acpi_ex_dump_operand (*obj_desc); } @@ -529,10 +501,8 @@ ACPI_FUNCTION_ENTRY (); - if (!flags) - { - if (!((ACPI_LV_OBJECTS & acpi_dbg_level) && (_COMPONENT & acpi_dbg_layer))) - { + if (!flags) { + if (!((ACPI_LV_OBJECTS & acpi_dbg_level) && (_COMPONENT & acpi_dbg_layer))) { return; } } @@ -571,24 +541,20 @@ ACPI_FUNCTION_TRACE ("Ex_dump_object_descriptor"); - if (!flags) - { - if (!((ACPI_LV_OBJECTS & acpi_dbg_level) && (_COMPONENT & acpi_dbg_layer))) - { + if (!flags) { + if (!((ACPI_LV_OBJECTS & acpi_dbg_level) && (_COMPONENT & acpi_dbg_layer))) { return_VOID; } } - if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) == ACPI_DESC_TYPE_NAMED) - { + if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) == ACPI_DESC_TYPE_NAMED) { acpi_ex_dump_node ((acpi_namespace_node *) obj_desc, flags); acpi_os_printf ("\nAttached Object (%p):\n", ((acpi_namespace_node *) obj_desc)->object); acpi_ex_dump_object_descriptor (((acpi_namespace_node *) obj_desc)->object, flags); return; } - if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) != ACPI_DESC_TYPE_OPERAND) - { + if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) != ACPI_DESC_TYPE_OPERAND) { acpi_os_printf ("Ex_dump_object_descriptor: %p is not a valid ACPI object\n", obj_desc); return_VOID; } @@ -601,8 +567,7 @@ /* Object-specific Fields */ - switch (ACPI_GET_OBJECT_TYPE (obj_desc)) - { + switch (ACPI_GET_OBJECT_TYPE (obj_desc)) { case ACPI_TYPE_INTEGER: acpi_os_printf ("%20s : %8.8X%8.8X\n", "Value", @@ -614,7 +579,10 @@ case ACPI_TYPE_STRING: acpi_ex_out_integer ("Length", obj_desc->string.length); - acpi_ex_out_pointer ("Pointer", obj_desc->string.pointer); + + acpi_os_printf ("%20s : %p ", "Pointer", obj_desc->string.pointer); + acpi_ut_print_string (obj_desc->string.pointer, ACPI_UINT8_MAX); + acpi_os_printf ("\n"); break; @@ -633,14 +601,11 @@ /* Dump the package contents */ - if (obj_desc->package.count > 0) - { + if (obj_desc->package.count > 0) { acpi_os_printf ("\nPackage Contents:\n"); - for (i = 0; i < obj_desc->package.count; i++) - { + for (i = 0; i < obj_desc->package.count; i++) { acpi_os_printf ("[%.3d] %p", i, obj_desc->package.elements[i]); - if (obj_desc->package.elements[i]) - { + if (obj_desc->package.elements[i]) { acpi_os_printf (" %s", acpi_ut_get_object_type_name (obj_desc->package.elements[i])); } acpi_os_printf ("\n"); @@ -723,9 +688,9 @@ case ACPI_TYPE_BUFFER_FIELD: - case INTERNAL_TYPE_REGION_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: acpi_ex_out_integer ("Field_flags", obj_desc->common_field.field_flags); acpi_ex_out_integer ("Access_byte_width", obj_desc->common_field.access_byte_width); @@ -737,23 +702,22 @@ acpi_ex_out_integer ("End_buf_valid_bits", obj_desc->common_field.end_buffer_valid_bits); acpi_ex_out_pointer ("Parent_node", obj_desc->common_field.node); - switch (ACPI_GET_OBJECT_TYPE (obj_desc)) - { + switch (ACPI_GET_OBJECT_TYPE (obj_desc)) { case ACPI_TYPE_BUFFER_FIELD: acpi_ex_out_pointer ("Buffer_obj", obj_desc->buffer_field.buffer_obj); break; - case INTERNAL_TYPE_REGION_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: acpi_ex_out_pointer ("Region_obj", obj_desc->field.region_obj); break; - case INTERNAL_TYPE_BANK_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: acpi_ex_out_integer ("Value", obj_desc->bank_field.value); acpi_ex_out_pointer ("Region_obj", obj_desc->bank_field.region_obj); acpi_ex_out_pointer ("Bank_obj", obj_desc->bank_field.bank_obj); break; - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: acpi_ex_out_integer ("Value", obj_desc->index_field.value); acpi_ex_out_pointer ("Index", obj_desc->index_field.index_obj); acpi_ex_out_pointer ("Data", obj_desc->index_field.data_obj); @@ -766,7 +730,7 @@ break; - case INTERNAL_TYPE_REFERENCE: + case ACPI_TYPE_LOCAL_REFERENCE: acpi_ex_out_integer ("Target_type", obj_desc->reference.target_type); acpi_ex_out_string ("Opcode", (acpi_ps_get_opcode_info (obj_desc->reference.opcode))->name); @@ -777,7 +741,7 @@ break; - case INTERNAL_TYPE_ADDRESS_HANDLER: + case ACPI_TYPE_LOCAL_ADDRESS_HANDLER: acpi_ex_out_integer ("Space_id", obj_desc->addr_handler.space_id); acpi_ex_out_pointer ("Next", obj_desc->addr_handler.next); @@ -787,24 +751,16 @@ break; - case INTERNAL_TYPE_NOTIFY: + case ACPI_TYPE_LOCAL_NOTIFY: acpi_ex_out_pointer ("Node", obj_desc->notify_handler.node); acpi_ex_out_pointer ("Context", obj_desc->notify_handler.context); break; - case INTERNAL_TYPE_ALIAS: - case INTERNAL_TYPE_FIELD_DEFN: - case INTERNAL_TYPE_BANK_FIELD_DEFN: - case INTERNAL_TYPE_INDEX_FIELD_DEFN: - case INTERNAL_TYPE_IF: - case INTERNAL_TYPE_ELSE: - case INTERNAL_TYPE_WHILE: - case INTERNAL_TYPE_SCOPE: - case INTERNAL_TYPE_DEF_ANY: - case INTERNAL_TYPE_EXTRA: - case INTERNAL_TYPE_DATA: + case ACPI_TYPE_LOCAL_ALIAS: + case ACPI_TYPE_LOCAL_EXTRA: + case ACPI_TYPE_LOCAL_DATA: default: acpi_os_printf ("Ex_dump_object_descriptor: Display not implemented for object type %s\n", diff -Nru a/drivers/acpi/executer/exfldio.c b/drivers/acpi/executer/exfldio.c --- a/drivers/acpi/executer/exfldio.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/executer/exfldio.c Mon Oct 28 16:32:36 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exfldio - Aml Field I/O - * $Revision: 88 $ + * $Revision: 89 $ * *****************************************************************************/ @@ -338,7 +338,7 @@ break; - case INTERNAL_TYPE_BANK_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: /* Ensure that the Bank_value is not beyond the capacity of the register */ @@ -366,7 +366,7 @@ /*lint -fallthrough */ - case INTERNAL_TYPE_REGION_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: /* * For simple Region_fields, we just directly access the owning * Operation Region. @@ -381,7 +381,7 @@ break; - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: /* Ensure that the Index_value is not beyond the capacity of the register */ diff -Nru a/drivers/acpi/executer/exmisc.c b/drivers/acpi/executer/exmisc.c --- a/drivers/acpi/executer/exmisc.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/executer/exmisc.c Mon Oct 28 16:32:37 2002 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exmisc - ACPI AML (p-code) execution - specific opcodes - * $Revision: 109 $ + * $Revision: 110 $ * *****************************************************************************/ @@ -67,7 +67,7 @@ switch (ACPI_GET_DESCRIPTOR_TYPE (obj_desc)) { case ACPI_DESC_TYPE_OPERAND: - if (ACPI_GET_OBJECT_TYPE (obj_desc) != INTERNAL_TYPE_REFERENCE) { + if (ACPI_GET_OBJECT_TYPE (obj_desc) != ACPI_TYPE_LOCAL_REFERENCE) { return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } @@ -111,7 +111,7 @@ /* Create a new reference object */ - reference_obj = acpi_ut_create_internal_object (INTERNAL_TYPE_REFERENCE); + reference_obj = acpi_ut_create_internal_object (ACPI_TYPE_LOCAL_REFERENCE); if (!reference_obj) { return_ACPI_STATUS (AE_NO_MEMORY); } diff -Nru a/drivers/acpi/executer/exmutex.c b/drivers/acpi/executer/exmutex.c --- a/drivers/acpi/executer/exmutex.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/executer/exmutex.c Mon Oct 28 16:32:37 2002 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exmutex - ASL Mutex Acquire/Release functions - * $Revision: 13 $ + * $Revision: 16 $ * *****************************************************************************/ @@ -132,22 +132,35 @@ ACPI_FUNCTION_TRACE_PTR ("Ex_acquire_mutex", obj_desc); + if (!obj_desc) { return_ACPI_STATUS (AE_BAD_PARAMETER); } + /* Sanity check -- we must have a valid thread ID */ + + if (!walk_state->thread) { + ACPI_REPORT_ERROR (("Cannot acquire Mutex [%4.4s], null thread info\n", + obj_desc->mutex.node->name.ascii)); + return_ACPI_STATUS (AE_AML_INTERNAL); + } + /* * Current Sync must be less than or equal to the sync level of the * mutex. This mechanism provides some deadlock prevention */ if (walk_state->thread->current_sync_level > obj_desc->mutex.sync_level) { + ACPI_REPORT_ERROR (("Cannot acquire Mutex [%4.4s], incorrect Sync_level\n", + obj_desc->mutex.node->name.ascii)); return_ACPI_STATUS (AE_AML_MUTEX_ORDER); } /* * Support for multiple acquires by the owning thread */ - if (obj_desc->mutex.owner_thread == walk_state->thread) { + + if ((obj_desc->mutex.owner_thread) && + (obj_desc->mutex.owner_thread->thread_id == walk_state->thread->thread_id)) { /* * The mutex is already owned by this thread, * just increment the acquisition depth @@ -210,12 +223,27 @@ /* The mutex must have been previously acquired in order to release it */ if (!obj_desc->mutex.owner_thread) { + ACPI_REPORT_ERROR (("Cannot release Mutex [%4.4s], not acquired\n", + obj_desc->mutex.node->name.ascii)); return_ACPI_STATUS (AE_AML_MUTEX_NOT_ACQUIRED); } + /* Sanity check -- we must have a valid thread ID */ + + if (!walk_state->thread) { + ACPI_REPORT_ERROR (("Cannot release Mutex [%4.4s], null thread info\n", + obj_desc->mutex.node->name.ascii)); + return_ACPI_STATUS (AE_AML_INTERNAL); + } + /* The Mutex is owned, but this thread must be the owner */ - if (obj_desc->mutex.owner_thread != walk_state->thread) { + if (obj_desc->mutex.owner_thread->thread_id != walk_state->thread->thread_id) { + ACPI_REPORT_ERROR (( + "Thread %X cannot release Mutex [%4.4s] acquired by thread %X\n", + walk_state->thread->thread_id, + obj_desc->mutex.node->name.ascii, + obj_desc->mutex.owner_thread->thread_id)); return_ACPI_STATUS (AE_AML_NOT_OWNER); } @@ -224,6 +252,8 @@ * equal to the current sync level */ if (obj_desc->mutex.sync_level > walk_state->thread->current_sync_level) { + ACPI_REPORT_ERROR (("Cannot release Mutex [%4.4s], incorrect Sync_level\n", + obj_desc->mutex.node->name.ascii)); return_ACPI_STATUS (AE_AML_MUTEX_ORDER); } diff -Nru a/drivers/acpi/executer/exnames.c b/drivers/acpi/executer/exnames.c --- a/drivers/acpi/executer/exnames.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/executer/exnames.c Mon Oct 28 16:32:36 2002 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exnames - interpreter/scanner name load/execute - * $Revision: 91 $ + * $Revision: 92 $ * *****************************************************************************/ @@ -247,9 +247,9 @@ ACPI_FUNCTION_TRACE_PTR ("Ex_get_name_string", aml_address); - if (INTERNAL_TYPE_REGION_FIELD == data_type || - INTERNAL_TYPE_BANK_FIELD == data_type || - INTERNAL_TYPE_INDEX_FIELD == data_type) { + if (ACPI_TYPE_LOCAL_REGION_FIELD == data_type || + ACPI_TYPE_LOCAL_BANK_FIELD == data_type || + ACPI_TYPE_LOCAL_INDEX_FIELD == data_type) { /* Disallow prefixes for types associated with Field_unit names */ name_string = acpi_ex_allocate_name_string (0, 1); diff -Nru a/drivers/acpi/executer/exoparg1.c b/drivers/acpi/executer/exoparg1.c --- a/drivers/acpi/executer/exoparg1.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/executer/exoparg1.c Mon Oct 28 16:32:37 2002 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exoparg1 - AML execution - opcodes with 1 argument - * $Revision: 143 $ + * $Revision: 144 $ * *****************************************************************************/ @@ -642,7 +642,7 @@ if (ACPI_GET_DESCRIPTOR_TYPE (operand[0]) != ACPI_DESC_TYPE_NAMED) { switch (ACPI_GET_OBJECT_TYPE (operand[0])) { - case INTERNAL_TYPE_REFERENCE: + case ACPI_TYPE_LOCAL_REFERENCE: /* * This is a Deref_of (Local_x | Arg_x) * diff -Nru a/drivers/acpi/executer/exoparg2.c b/drivers/acpi/executer/exoparg2.c --- a/drivers/acpi/executer/exoparg2.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/executer/exoparg2.c Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exoparg2 - AML execution - opcodes with 2 arguments - * $Revision: 111 $ + * $Revision: 113 $ * *****************************************************************************/ @@ -242,11 +242,11 @@ acpi_ex_opcode_2A_1T_1R ( acpi_walk_state *walk_state) { - acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object **operand = &walk_state->operands[0]; acpi_operand_object *return_desc = NULL; acpi_operand_object *temp_desc = NULL; u32 index; - acpi_status status = AE_OK; + acpi_status status = AE_OK; ACPI_SIZE length; @@ -379,7 +379,7 @@ /* Set the string length */ - return_desc->string.length = length; + return_desc->string.length = (u32) length; break; @@ -393,7 +393,7 @@ /* Create the internal return object */ - return_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_REFERENCE); + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_LOCAL_REFERENCE); if (!return_desc) { status = AE_NO_MEMORY; goto cleanup; diff -Nru a/drivers/acpi/executer/exprep.c b/drivers/acpi/executer/exprep.c --- a/drivers/acpi/executer/exprep.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/executer/exprep.c Mon Oct 28 16:32:36 2002 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exprep - ACPI AML (p-code) execution - field prep utilities - * $Revision: 119 $ + * $Revision: 120 $ * *****************************************************************************/ @@ -313,7 +313,7 @@ /* Parameter validation */ - if (info->field_type != INTERNAL_TYPE_INDEX_FIELD) { + if (info->field_type != ACPI_TYPE_LOCAL_INDEX_FIELD) { if (!info->region_node) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null Region_node\n")); return_ACPI_STATUS (AE_AML_NO_OPERAND); @@ -349,7 +349,7 @@ /* Initialize areas of the object that are specific to the field type */ switch (info->field_type) { - case INTERNAL_TYPE_REGION_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: obj_desc->field.region_obj = acpi_ns_get_attached_object (info->region_node); @@ -364,7 +364,7 @@ break; - case INTERNAL_TYPE_BANK_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: obj_desc->bank_field.value = info->bank_value; obj_desc->bank_field.region_obj = acpi_ns_get_attached_object (info->region_node); @@ -385,7 +385,7 @@ break; - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: obj_desc->index_field.index_obj = acpi_ns_get_attached_object (info->register_node); obj_desc->index_field.data_obj = acpi_ns_get_attached_object (info->data_register_node); diff -Nru a/drivers/acpi/executer/exresnte.c b/drivers/acpi/executer/exresnte.c --- a/drivers/acpi/executer/exresnte.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/executer/exresnte.c Mon Oct 28 16:32:36 2002 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exresnte - AML Interpreter object resolution - * $Revision: 59 $ + * $Revision: 60 $ * *****************************************************************************/ @@ -88,7 +88,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Entry=%p Source_desc=%p Type=%X\n", node, source_desc, entry_type)); - if (entry_type == INTERNAL_TYPE_ALIAS) { + if (entry_type == ACPI_TYPE_LOCAL_ALIAS) { /* There is always exactly one level of indirection */ node = (acpi_namespace_node *) node->object; @@ -185,9 +185,9 @@ case ACPI_TYPE_BUFFER_FIELD: - case INTERNAL_TYPE_REGION_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Field_read Node=%p Source_desc=%p Type=%X\n", node, source_desc, entry_type)); @@ -223,7 +223,7 @@ return_ACPI_STATUS (AE_AML_OPERAND_TYPE); /* Cannot be AE_TYPE */ - case INTERNAL_TYPE_REFERENCE: + case ACPI_TYPE_LOCAL_REFERENCE: /* No named references are allowed here */ diff -Nru a/drivers/acpi/executer/exresolv.c b/drivers/acpi/executer/exresolv.c --- a/drivers/acpi/executer/exresolv.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/executer/exresolv.c Mon Oct 28 16:32:36 2002 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exresolv - AML Interpreter object resolution - * $Revision: 116 $ + * $Revision: 117 $ * *****************************************************************************/ @@ -132,7 +132,7 @@ /* This is an acpi_operand_object */ switch (ACPI_GET_OBJECT_TYPE (stack_desc)) { - case INTERNAL_TYPE_REFERENCE: + case ACPI_TYPE_LOCAL_REFERENCE: opcode = stack_desc->reference.opcode; @@ -262,9 +262,9 @@ * These cases may never happen here, but just in case.. */ case ACPI_TYPE_BUFFER_FIELD: - case INTERNAL_TYPE_REGION_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Field_read Source_desc=%p Type=%X\n", stack_desc, ACPI_GET_OBJECT_TYPE (stack_desc))); @@ -309,7 +309,7 @@ acpi_object_type type; - ACPI_FUNCTION_TRACE ("Ex_get_object_type"); + ACPI_FUNCTION_TRACE ("Acpi_ex_resolve_multiple"); /* @@ -318,7 +318,7 @@ * of the Object_type and Size_of operators). This means traversing * the list of possibly many nested references. */ - while (ACPI_GET_OBJECT_TYPE (obj_desc) == INTERNAL_TYPE_REFERENCE) { + while (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_LOCAL_REFERENCE) { switch (obj_desc->reference.opcode) { case AML_REF_OF_OP: @@ -427,11 +427,18 @@ /* Convert internal types to external types */ switch (type) { - case INTERNAL_TYPE_REGION_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: type = ACPI_TYPE_FIELD_UNIT; + break; + + case ACPI_TYPE_LOCAL_SCOPE: + + /* Per ACPI Specification, Scope is untyped */ + + type = ACPI_TYPE_ANY; break; default: diff -Nru a/drivers/acpi/executer/exresop.c b/drivers/acpi/executer/exresop.c --- a/drivers/acpi/executer/exresop.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/executer/exresop.c Mon Oct 28 16:32:37 2002 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exresop - AML Interpreter operand/object resolution - * $Revision: 58 $ + * $Revision: 59 $ * *****************************************************************************/ @@ -64,7 +64,7 @@ return (AE_OK); } - if (type_needed == INTERNAL_TYPE_REFERENCE) { + if (type_needed == ACPI_TYPE_LOCAL_REFERENCE) { /* * Allow the AML "Constant" opcodes (Zero, One, etc.) to be reference * objects and thus allow them to be targets. (As per the ACPI @@ -183,14 +183,14 @@ /* Check for bad acpi_object_type */ - if (!acpi_ex_validate_object_type (object_type)) { + if (!acpi_ut_valid_object_type (object_type)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Bad operand object type [%X]\n", object_type)); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } - if (object_type == (u8) INTERNAL_TYPE_REFERENCE) { + if (object_type == (u8) ACPI_TYPE_LOCAL_REFERENCE) { /* * Decode the Reference */ @@ -267,13 +267,13 @@ case ARGI_FIXED_TARGET: /* No implicit conversion before store to target */ case ARGI_SIMPLE_TARGET: /* Name, Local, or Arg - no implicit conversion */ - /* Need an operand of type INTERNAL_TYPE_REFERENCE */ + /* Need an operand of type ACPI_TYPE_LOCAL_REFERENCE */ if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) == ACPI_DESC_TYPE_NAMED) /* Node (name) ptr OK as-is */ { goto next_operand; } - status = acpi_ex_check_object_type (INTERNAL_TYPE_REFERENCE, + status = acpi_ex_check_object_type (ACPI_TYPE_LOCAL_REFERENCE, object_type, obj_desc); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); @@ -300,7 +300,7 @@ * -- All others must be resolved below. */ if ((opcode == AML_STORE_OP) && - (ACPI_GET_OBJECT_TYPE (*stack_ptr) == INTERNAL_TYPE_REFERENCE) && + (ACPI_GET_OBJECT_TYPE (*stack_ptr) == ACPI_TYPE_LOCAL_REFERENCE) && ((*stack_ptr)->reference.opcode == AML_INDEX_OP)) { goto next_operand; } @@ -353,13 +353,6 @@ type_needed = ACPI_TYPE_REGION; break; - case ARGI_IF: /* If */ - - /* Need an operand of type INTERNAL_TYPE_IF */ - - type_needed = INTERNAL_TYPE_IF; - break; - case ARGI_PACKAGE: /* Package */ /* Need an operand of type ACPI_TYPE_PACKAGE */ @@ -502,7 +495,7 @@ case ACPI_TYPE_PACKAGE: case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: - case INTERNAL_TYPE_REFERENCE: + case ACPI_TYPE_LOCAL_REFERENCE: /* Valid operand */ break; diff -Nru a/drivers/acpi/executer/exstore.c b/drivers/acpi/executer/exstore.c --- a/drivers/acpi/executer/exstore.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/executer/exstore.c Mon Oct 28 16:32:36 2002 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exstore - AML Interpreter object store support - * $Revision: 172 $ + * $Revision: 173 $ * *****************************************************************************/ @@ -92,7 +92,7 @@ /* Destination object must be a Reference or a Constant object */ switch (ACPI_GET_OBJECT_TYPE (dest_desc)) { - case INTERNAL_TYPE_REFERENCE: + case ACPI_TYPE_LOCAL_REFERENCE: break; case ACPI_TYPE_INTEGER: @@ -428,9 +428,9 @@ */ switch (target_type) { case ACPI_TYPE_BUFFER_FIELD: - case INTERNAL_TYPE_REGION_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: /* * For fields, copy the source data to the target field. diff -Nru a/drivers/acpi/executer/exstoren.c b/drivers/acpi/executer/exstoren.c --- a/drivers/acpi/executer/exstoren.c Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/executer/exstoren.c Mon Oct 28 16:32:35 2002 @@ -3,7 +3,7 @@ * * Module Name: exstoren - AML Interpreter object store support, * Store to Node (namespace object) - * $Revision: 51 $ + * $Revision: 52 $ * *****************************************************************************/ @@ -67,9 +67,9 @@ */ switch (target_type) { case ACPI_TYPE_BUFFER_FIELD: - case INTERNAL_TYPE_REGION_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: /* * These cases all require only Integers or values that * can be converted to Integers (Strings or Buffers) @@ -84,7 +84,7 @@ * are all essentially the same. This case handles the * "interchangeable" types Integer, String, and Buffer. */ - if (ACPI_GET_OBJECT_TYPE (source_desc) == INTERNAL_TYPE_REFERENCE) { + if (ACPI_GET_OBJECT_TYPE (source_desc) == ACPI_TYPE_LOCAL_REFERENCE) { /* Resolve a reference object first */ status = acpi_ex_resolve_to_value (source_desc_ptr, walk_state); @@ -111,7 +111,7 @@ break; - case INTERNAL_TYPE_ALIAS: + case ACPI_TYPE_LOCAL_ALIAS: /* * Aliases are resolved by Acpi_ex_prep_operands diff -Nru a/drivers/acpi/executer/exstorob.c b/drivers/acpi/executer/exstorob.c --- a/drivers/acpi/executer/exstorob.c Mon Oct 28 16:32:38 2002 +++ b/drivers/acpi/executer/exstorob.c Mon Oct 28 16:32:38 2002 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exstorob - AML Interpreter object store support, store to object - * $Revision: 45 $ + * $Revision: 46 $ * *****************************************************************************/ @@ -144,7 +144,7 @@ * String will fit in existing buffer. * Clear old string and copy in the new one */ - ACPI_MEMSET (target_desc->string.pointer, 0, target_desc->string.length + 1); + ACPI_MEMSET (target_desc->string.pointer, 0, (ACPI_SIZE) target_desc->string.length + 1); ACPI_MEMCPY (target_desc->string.pointer, buffer, length); } else { diff -Nru a/drivers/acpi/executer/exutils.c b/drivers/acpi/executer/exutils.c --- a/drivers/acpi/executer/exutils.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/executer/exutils.c Mon Oct 28 16:32:36 2002 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exutils - interpreter/scanner utilities - * $Revision: 103 $ + * $Revision: 105 $ * *****************************************************************************/ @@ -50,32 +50,6 @@ ACPI_MODULE_NAME ("exutils") -/******************************************************************************* - * - * FUNCTION: Acpi_ex_validate_object_type - * - * PARAMETERS: Type Object type to validate - * - * DESCRIPTION: Determine if a type is a valid ACPI object type - * - ******************************************************************************/ - -u8 -acpi_ex_validate_object_type ( - acpi_object_type type) -{ - - ACPI_FUNCTION_ENTRY (); - - - if ((type > ACPI_TYPE_MAX && type < INTERNAL_TYPE_BEGIN) || - (type > INTERNAL_TYPE_MAX)) { - return (FALSE); - } - - return (TRUE); -} - #ifndef ACPI_NO_METHOD_EXECUTION /******************************************************************************* @@ -336,7 +310,7 @@ eisa_id = acpi_ut_dword_byte_swap (numeric_id); - out_string[0] = (char) ('@' + ((eisa_id >> 26) & 0x1f)); + out_string[0] = (char) ('@' + (((unsigned long) eisa_id >> 26) & 0x1f)); out_string[1] = (char) ('@' + ((eisa_id >> 21) & 0x1f)); out_string[2] = (char) ('@' + ((eisa_id >> 16) & 0x1f)); out_string[3] = acpi_ut_hex_to_ascii_char ((acpi_integer) eisa_id, 12); diff -Nru a/drivers/acpi/hardware/hwsleep.c b/drivers/acpi/hardware/hwsleep.c --- a/drivers/acpi/hardware/hwsleep.c Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/hardware/hwsleep.c Mon Oct 28 16:32:35 2002 @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface - * $Revision: 46 $ + * $Revision: 47 $ * *****************************************************************************/ @@ -308,6 +308,11 @@ /* Spin until we wake */ } while (!in_value); + + status = acpi_set_register (ACPI_BITREG_ARB_DISABLE, 0, ACPI_MTX_LOCK); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } return_ACPI_STATUS (AE_OK); } diff -Nru a/drivers/acpi/include/acconfig.h b/drivers/acpi/include/acconfig.h --- a/drivers/acpi/include/acconfig.h Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/include/acconfig.h Mon Oct 28 16:32:36 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acconfig.h - Global configuration constants - * $Revision: 112 $ + * $Revision: 114 $ * *****************************************************************************/ @@ -54,7 +54,7 @@ /* Version string */ -#define ACPI_CA_VERSION 0x20021002 +#define ACPI_CA_VERSION 0x20021022 /* Version of ACPI supported */ diff -Nru a/drivers/acpi/include/acdisasm.h b/drivers/acpi/include/acdisasm.h --- a/drivers/acpi/include/acdisasm.h Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/include/acdisasm.h Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acdisasm.h - AML disassembler - * $Revision: 3 $ + * $Revision: 4 $ * *****************************************************************************/ @@ -106,10 +106,6 @@ u32 acpi_dm_dump_name ( char *name); - -void -acpi_dm_string ( - char *string); void acpi_dm_unicode ( diff -Nru a/drivers/acpi/include/acglobal.h b/drivers/acpi/include/acglobal.h --- a/drivers/acpi/include/acglobal.h Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/include/acglobal.h Mon Oct 28 16:32:35 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acglobal.h - Declarations for global variables - * $Revision: 131 $ + * $Revision: 132 $ * *****************************************************************************/ @@ -152,7 +152,7 @@ * ****************************************************************************/ -#define NUM_NS_TYPES INTERNAL_TYPE_INVALID+1 +#define NUM_NS_TYPES ACPI_TYPE_INVALID+1 #if defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY) #define NUM_PREDEFINED_NAMES 10 @@ -279,8 +279,8 @@ /* * Statistic globals */ -ACPI_EXTERN u16 acpi_gbl_obj_type_count[INTERNAL_TYPE_NODE_MAX+1]; -ACPI_EXTERN u16 acpi_gbl_node_type_count[INTERNAL_TYPE_NODE_MAX+1]; +ACPI_EXTERN u16 acpi_gbl_obj_type_count[ACPI_TYPE_NS_NODE_MAX+1]; +ACPI_EXTERN u16 acpi_gbl_node_type_count[ACPI_TYPE_NS_NODE_MAX+1]; ACPI_EXTERN u16 acpi_gbl_obj_type_count_misc; ACPI_EXTERN u16 acpi_gbl_node_type_count_misc; ACPI_EXTERN u32 acpi_gbl_num_nodes; diff -Nru a/drivers/acpi/include/acinterp.h b/drivers/acpi/include/acinterp.h --- a/drivers/acpi/include/acinterp.h Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/include/acinterp.h Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acinterp.h - Interpreter subcomponent prototypes and defines - * $Revision: 139 $ + * $Revision: 140 $ * *****************************************************************************/ @@ -611,10 +611,6 @@ void acpi_ex_truncate_for32bit_table ( acpi_operand_object *obj_desc); - -u8 -acpi_ex_validate_object_type ( - acpi_object_type type); u8 acpi_ex_acquire_global_lock ( diff -Nru a/drivers/acpi/include/aclocal.h b/drivers/acpi/include/aclocal.h --- a/drivers/acpi/include/aclocal.h Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/include/aclocal.h Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: aclocal.h - Internal data types used across the ACPI subsystem - * $Revision: 176 $ + * $Revision: 178 $ * *****************************************************************************/ @@ -212,7 +212,6 @@ struct acpi_table_desc *next; struct acpi_table_desc *installed_desc; acpi_table_header *pointer; - void *base_pointer; u8 *aml_start; u64 physical_address; u32 aml_length; @@ -655,6 +654,7 @@ char *filename; char *external_name; char *namepath; + char name_seg[4]; u32 extra_value; u32 column; u32 line_number; diff -Nru a/drivers/acpi/include/acnamesp.h b/drivers/acpi/include/acnamesp.h --- a/drivers/acpi/include/acnamesp.h Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/include/acnamesp.h Mon Oct 28 16:32:35 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acnamesp.h - Namespace subcomponent prototypes and defines - * $Revision: 127 $ + * $Revision: 129 $ * *****************************************************************************/ @@ -178,6 +178,10 @@ acpi_ns_delete_children ( acpi_namespace_node *parent); +int +acpi_ns_compare_names ( + char *name1, + char *name2); /* * Namespace modification - nsmodify @@ -281,17 +285,13 @@ /* - * Parent/Child/Peer utility functions - nsfamily + * Parent/Child/Peer utility functions */ acpi_name acpi_ns_find_parent_name ( acpi_namespace_node *node_to_search); -u8 -acpi_ns_exist_downstream_sibling ( - acpi_namespace_node *this_node); - /* * Name and Scope manipulation - nsnames @@ -397,8 +397,8 @@ void acpi_ns_install_node ( acpi_walk_state *walk_state, - acpi_namespace_node *parent_node, /* Parent */ - acpi_namespace_node *node, /* New Child*/ + acpi_namespace_node *parent_node, + acpi_namespace_node *node, acpi_object_type type); diff -Nru a/drivers/acpi/include/acobject.h b/drivers/acpi/include/acobject.h --- a/drivers/acpi/include/acobject.h Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/include/acobject.h Mon Oct 28 16:32:35 2002 @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: acobject.h - Definition of acpi_operand_object (Internal object only) - * $Revision: 113 $ + * $Revision: 114 $ * *****************************************************************************/ @@ -199,6 +199,7 @@ void *semaphore; union acpi_operand_obj *prev; /* Link for list of acquired mutexes */ union acpi_operand_obj *next; /* Link for list of acquired mutexes */ + acpi_namespace_node *node; /* containing object */ } ACPI_OBJECT_MUTEX; diff -Nru a/drivers/acpi/include/acstruct.h b/drivers/acpi/include/acstruct.h --- a/drivers/acpi/include/acstruct.h Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/include/acstruct.h Mon Oct 28 16:32:35 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acstruct.h - Internal structs - * $Revision: 19 $ + * $Revision: 20 $ * *****************************************************************************/ @@ -59,6 +59,8 @@ u8 return_used; u8 walk_type; u16 opcode; /* Current AML opcode */ + u8 scope_depth; + u8 reserved1; u32 arg_count; /* push for fixed or var args */ u32 aml_offset; u32 arg_types; diff -Nru a/drivers/acpi/include/actypes.h b/drivers/acpi/include/actypes.h --- a/drivers/acpi/include/actypes.h Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/include/actypes.h Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: actypes.h - Common data types for the entire ACPI subsystem - * $Revision: 239 $ + * $Revision: 240 $ * *****************************************************************************/ @@ -42,7 +42,7 @@ /* - * Data types - Fixed across all compilation models + * Data types - Fixed across all compilation models (16/32/64) * * BOOLEAN Logical Boolean. * INT8 8-bit (1 byte) signed value @@ -91,6 +91,7 @@ #elif ACPI_MACHINE_WIDTH == 16 + /* * 16-bit type definitions */ @@ -133,6 +134,7 @@ #elif ACPI_MACHINE_WIDTH == 32 + /* * 32-bit type definitions (default) */ @@ -168,7 +170,6 @@ /* * Miscellaneous common types */ - typedef UINT32 UINT32_BIT; typedef NATIVE_UINT ACPI_PTRDIFF; typedef char NATIVE_CHAR; @@ -226,7 +227,6 @@ /* * Useful defines */ - #ifdef FALSE #undef FALSE #endif @@ -245,7 +245,6 @@ /* * Local datatypes */ - typedef u32 acpi_status; /* All ACPI Exceptions */ typedef u32 acpi_name; /* 4-byte ACPI name */ typedef char* acpi_string; /* Null terminated ASCII string */ @@ -314,7 +313,6 @@ /* * Constants with special meanings */ - #define ACPI_ROOT_OBJECT (acpi_handle) ACPI_PTR_ADD (char, NULL, ACPI_MAX_PTR) @@ -386,7 +384,6 @@ /* * Table types. These values are passed to the table related APIs */ - typedef u32 acpi_table_type; #define ACPI_TABLE_RSDP (acpi_table_type) 0 @@ -401,15 +398,14 @@ /* - * Types associated with names. The first group of - * values correspond to the definition of the ACPI - * Object_type operator (See the ACPI Spec). Therefore, + * Types associated with ACPI names and objects. The first group of + * values (up to ACPI_TYPE_EXTERNAL_MAX) correspond to the definition + * of the ACPI Object_type() operator (See the ACPI Spec). Therefore, * only add to the first group if the spec changes. * - * Types must be kept in sync with the Acpi_ns_properties - * and Acpi_ns_type_names arrays + * Types must be kept in sync with the global Acpi_ns_properties + * and Acpi_ns_type_names arrays. */ - typedef u32 acpi_object_type; #define ACPI_TYPE_ANY 0x00 @@ -430,52 +426,45 @@ #define ACPI_TYPE_DDB_HANDLE 0x0F #define ACPI_TYPE_DEBUG_OBJECT 0x10 -#define ACPI_TYPE_MAX 0x10 +#define ACPI_TYPE_EXTERNAL_MAX 0x10 + +/* + * These are object types that do not map directly to the ACPI + * Object_type() operator. They are used for various internal purposes only. + * If new predefined ACPI_TYPEs are added (via the ACPI specification), these + * internal types must move upwards. (There is code that depends on these + * values being contiguous with the external types above.) + */ +#define ACPI_TYPE_LOCAL_REGION_FIELD 0x11 +#define ACPI_TYPE_LOCAL_BANK_FIELD 0x12 +#define ACPI_TYPE_LOCAL_INDEX_FIELD 0x13 +#define ACPI_TYPE_LOCAL_REFERENCE 0x14 /* Arg#, Local#, Name, Debug, Ref_of, Index */ +#define ACPI_TYPE_LOCAL_ALIAS 0x15 +#define ACPI_TYPE_LOCAL_NOTIFY 0x16 +#define ACPI_TYPE_LOCAL_ADDRESS_HANDLER 0x17 +#define ACPI_TYPE_LOCAL_RESOURCE 0x18 +#define ACPI_TYPE_LOCAL_RESOURCE_FIELD 0x19 +#define ACPI_TYPE_LOCAL_SCOPE 0x1A /* 1 Name, multiple Object_list Nodes */ + +#define ACPI_TYPE_NS_NODE_MAX 0x1A /* Last typecode used within a NS Node */ /* - * This section contains object types that do not relate to the ACPI Object_type operator. - * They are used for various internal purposes only. If new predefined ACPI_TYPEs are - * added (via the ACPI specification), these internal types must move upwards. - * Also, values exceeding the largest official ACPI Object_type must not overlap with - * defined AML opcodes. - */ -#define INTERNAL_TYPE_BEGIN 0x11 - -#define INTERNAL_TYPE_REGION_FIELD 0x11 -#define INTERNAL_TYPE_BANK_FIELD 0x12 -#define INTERNAL_TYPE_INDEX_FIELD 0x13 -#define INTERNAL_TYPE_REFERENCE 0x14 /* Arg#, Local#, Name, Debug; used only in descriptors */ -#define INTERNAL_TYPE_ALIAS 0x15 -#define INTERNAL_TYPE_NOTIFY 0x16 -#define INTERNAL_TYPE_ADDRESS_HANDLER 0x17 -#define INTERNAL_TYPE_RESOURCE 0x18 -#define INTERNAL_TYPE_RESOURCE_FIELD 0x19 - - -#define INTERNAL_TYPE_NODE_MAX 0x19 - -/* These are pseudo-types because there are never any namespace nodes with these types */ - -#define INTERNAL_TYPE_FIELD_DEFN 0x1A /* Name, Byte_const, multiple Field_element */ -#define INTERNAL_TYPE_BANK_FIELD_DEFN 0x1B /* 2 Name,DWord_const,Byte_const,multi Field_element */ -#define INTERNAL_TYPE_INDEX_FIELD_DEFN 0x1C /* 2 Name, Byte_const, multiple Field_element */ -#define INTERNAL_TYPE_IF 0x1D -#define INTERNAL_TYPE_ELSE 0x1E -#define INTERNAL_TYPE_WHILE 0x1F -#define INTERNAL_TYPE_SCOPE 0x20 /* Name, multiple Node */ -#define INTERNAL_TYPE_DEF_ANY 0x21 /* type is Any, suppress search of enclosing scopes */ -#define INTERNAL_TYPE_EXTRA 0x22 -#define INTERNAL_TYPE_DATA 0x23 + * These are special object types that never appear in + * a Namespace node, only in an acpi_operand_object + */ +#define ACPI_TYPE_LOCAL_EXTRA 0x1B +#define ACPI_TYPE_LOCAL_DATA 0x1C -#define INTERNAL_TYPE_MAX 0x23 +#define ACPI_TYPE_LOCAL_MAX 0x1C -#define INTERNAL_TYPE_INVALID 0x24 +/* All types above here are invalid */ + +#define ACPI_TYPE_INVALID 0x1D #define ACPI_TYPE_NOT_FOUND 0xFF /* - * Bitmapped ACPI types - * Used internally only + * Bitmapped ACPI types. Used internally only */ #define ACPI_BTYPE_ANY 0x00000000 #define ACPI_BTYPE_INTEGER 0x00000001 @@ -515,7 +504,6 @@ /* * Acpi_event Types: Fixed & General Purpose */ - typedef u32 acpi_event_type; #define ACPI_EVENT_FIXED 0 @@ -524,7 +512,6 @@ /* * Fixed events */ - #define ACPI_EVENT_PMTIMER 0 #define ACPI_EVENT_GLOBAL 1 #define ACPI_EVENT_POWER_BUTTON 2 @@ -543,9 +530,7 @@ /* * GPEs */ - #define ACPI_EVENT_WAKE_ENABLE 0x1 - #define ACPI_EVENT_WAKE_DISABLE 0x1 @@ -578,7 +563,7 @@ #define ACPI_DEVICE_NOTIFY 1 #define ACPI_MAX_NOTIFY_HANDLER_TYPE 1 -#define ACPI_MAX_SYS_NOTIFY 0x7f +#define ACPI_MAX_SYS_NOTIFY 0x7f /* Address Space (Operation Region) Types */ @@ -626,10 +611,10 @@ #define ACPI_BITREG_MAX 0x13 #define ACPI_NUM_BITREG ACPI_BITREG_MAX + 1 + /* * External ACPI object definition */ - typedef union acpi_obj { acpi_object_type type; /* See definition of Acpi_ns_type for values */ @@ -688,7 +673,6 @@ /* * List of objects, used as a parameter list for control method evaluation */ - typedef struct acpi_obj_list { u32 count; @@ -700,7 +684,6 @@ /* * Miscellaneous common Data Structures used by the interfaces */ - #define ACPI_NO_BUFFER 0 #define ACPI_ALLOCATE_BUFFER (ACPI_SIZE) (-1) #define ACPI_ALLOCATE_LOCAL_BUFFER (ACPI_SIZE) (-2) @@ -716,7 +699,6 @@ /* * Name_type for Acpi_get_name */ - #define ACPI_FULL_PATHNAME 0 #define ACPI_SINGLE_NAME 1 #define ACPI_NAME_TYPE_MAX 1 @@ -725,7 +707,6 @@ /* * Structure and flags for Acpi_get_system_info */ - #define ACPI_SYS_MODE_UNKNOWN 0x0000 #define ACPI_SYS_MODE_ACPI 0x0001 #define ACPI_SYS_MODE_LEGACY 0x0002 @@ -745,7 +726,6 @@ /* * System info returned by Acpi_get_system_info() */ - typedef struct _acpi_sys_info { u32 acpi_ca_version; @@ -764,7 +744,6 @@ /* * Various handlers and callback procedures */ - typedef u32 (*acpi_event_handler) ( void *context); @@ -1001,7 +980,7 @@ /* * END_DEPENDENT_FUNCTIONS_RESOURCE struct is not - * needed because it has no fields + * needed because it has no fields */ typedef struct diff -Nru a/drivers/acpi/include/acutils.h b/drivers/acpi/include/acutils.h --- a/drivers/acpi/include/acutils.h Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/include/acutils.h Mon Oct 28 16:32:35 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acutils.h -- prototypes for the common (subsystem-wide) procedures - * $Revision: 146 $ + * $Revision: 147 $ * *****************************************************************************/ @@ -636,6 +636,11 @@ /* * utmisc */ + +void +acpi_ut_print_string ( + char *string, + u8 max_length); acpi_status acpi_ut_divide ( diff -Nru a/drivers/acpi/namespace/nsaccess.c b/drivers/acpi/namespace/nsaccess.c --- a/drivers/acpi/namespace/nsaccess.c Mon Oct 28 16:32:38 2002 +++ b/drivers/acpi/namespace/nsaccess.c Mon Oct 28 16:32:38 2002 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nsaccess - Top-level functions for accessing ACPI namespace - * $Revision: 161 $ + * $Revision: 165 $ * ******************************************************************************/ @@ -142,7 +142,7 @@ /* * Build an object around the static string */ - obj_desc->string.length = ACPI_STRLEN (init_val->val); + obj_desc->string.length = (u32) ACPI_STRLEN (init_val->val); obj_desc->string.pointer = init_val->val; obj_desc->common.flags |= AOPOBJ_STATIC_POINTER; break; @@ -150,6 +150,7 @@ case ACPI_TYPE_MUTEX: + obj_desc->mutex.node = new_node; obj_desc->mutex.sync_level = (u16) ACPI_STRTOUL (init_val->val, NULL, 10); @@ -246,6 +247,7 @@ acpi_namespace_node *current_node = NULL; acpi_namespace_node *this_node = NULL; u32 num_segments; + u32 num_carats; acpi_name simple_name; acpi_object_type type_to_check_for; acpi_object_type this_search_type; @@ -299,26 +301,9 @@ } } - /* - * This check is explicitly split to relax the Type_to_check_for - * conditions for Bank_field_defn. Originally, both Bank_field_defn and - * Def_field_defn caused Type_to_check_for to be set to ACPI_TYPE_REGION, - * but the Bank_field_defn may also check for a Field definition as well - * as an Operation_region. - */ - if (INTERNAL_TYPE_FIELD_DEFN == type) { - /* Def_field_defn defines fields in a Region */ + /* Save type TBD: may be no longer necessary */ - type_to_check_for = ACPI_TYPE_REGION; - } - else if (INTERNAL_TYPE_BANK_FIELD_DEFN == type) { - /* Bank_field_defn defines data fields in a Field Object */ - - type_to_check_for = ACPI_TYPE_ANY; - } - else { - type_to_check_for = type; - } + type_to_check_for = type; /* * Begin examination of the actual pathname @@ -364,14 +349,15 @@ /* Pathname is relative to current scope, start there */ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, - "Searching relative to prefix scope [%p]\n", - prefix_node)); + "Searching relative to prefix scope [%4.4s] (%p)\n", + prefix_node->name.ascii, prefix_node)); /* * Handle multiple Parent Prefixes (carat) by just getting * the parent node for each prefix instance. */ this_node = prefix_node; + num_carats = 0; while (*path == (u8) AML_PARENT_PREFIX) { /* Name is fully qualified, no search rules apply */ @@ -384,6 +370,7 @@ /* Backup to the parent node */ + num_carats++; this_node = acpi_ns_get_parent_node (this_node); if (!this_node) { /* Current scope has no parent scope */ @@ -396,7 +383,8 @@ if (search_parent_flag == ACPI_NS_NO_UPSEARCH) { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, - "Path is absolute with one or more carats\n")); + "Search scope is [%4.4s], path has %d carat(s)\n", + this_node->name.ascii, num_carats)); } } @@ -420,6 +408,7 @@ * have the correct target node and there are no name segments. */ num_segments = 0; + type = this_node->type; ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Prefix-only Pathname (Zero name segments), Flags=%X\n", flags)); @@ -525,6 +514,7 @@ current_node)); } + *return_node = this_node; return_ACPI_STATUS (status); } @@ -535,27 +525,24 @@ * 2) And we are looking for a specific type * (Not checking for TYPE_ANY) * 3) Which is not an alias - * 4) Which is not a local type (TYPE_DEF_ANY) - * 5) Which is not a local type (TYPE_SCOPE) - * 6) Which is not a local type (TYPE_INDEX_FIELD_DEFN) - * 7) And the type of target object is known (not TYPE_ANY) - * 8) And target object does not match what we are looking for + * 4) Which is not a local type (TYPE_SCOPE) + * 5) And the type of target object is known (not TYPE_ANY) + * 6) And target object does not match what we are looking for * * Then we have a type mismatch. Just warn and ignore it. */ if ((num_segments == 0) && (type_to_check_for != ACPI_TYPE_ANY) && - (type_to_check_for != INTERNAL_TYPE_ALIAS) && - (type_to_check_for != INTERNAL_TYPE_DEF_ANY) && - (type_to_check_for != INTERNAL_TYPE_SCOPE) && - (type_to_check_for != INTERNAL_TYPE_INDEX_FIELD_DEFN) && + (type_to_check_for != ACPI_TYPE_LOCAL_ALIAS) && + (type_to_check_for != ACPI_TYPE_LOCAL_SCOPE) && (this_node->type != ACPI_TYPE_ANY) && (this_node->type != type_to_check_for)) { /* Complain about a type mismatch */ ACPI_REPORT_WARNING ( - ("Ns_lookup: %4.4s, type %X, checking for type %X\n", - (char *) &simple_name, this_node->type, type_to_check_for)); + ("Ns_lookup: Type mismatch on %4.4s (%s), searching for (%s)\n", + (char *) &simple_name, acpi_ut_get_type_name (this_node->type), + acpi_ut_get_type_name (type_to_check_for))); } /* @@ -581,15 +568,11 @@ * If entry is a type which opens a scope, push the new scope on the * scope stack. */ - if (acpi_ns_opens_scope (type_to_check_for)) { + if (acpi_ns_opens_scope (type)) { status = acpi_ds_scope_stack_push (this_node, type, walk_state); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } - - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, - "Setting current scope to [%4.4s] (%p)\n", - this_node->name.ascii, this_node)); } } diff -Nru a/drivers/acpi/namespace/nsalloc.c b/drivers/acpi/namespace/nsalloc.c --- a/drivers/acpi/namespace/nsalloc.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/namespace/nsalloc.c Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nsalloc - Namespace allocation and deletion utilities - * $Revision: 74 $ + * $Revision: 75 $ * ******************************************************************************/ @@ -127,6 +127,55 @@ /******************************************************************************* * + * FUNCTION: Acpi_ns_compare_names + * + * PARAMETERS: Name1 - First name to compare + * Name2 - Second name to compare + * + * RETURN: value from strncmp + * + * DESCRIPTION: Compare two ACPI names. Names that are prefixed with an + * underscore are forced to be alphabetically first. + * + ******************************************************************************/ + +int +acpi_ns_compare_names ( + char *name1, + char *name2) +{ + char reversed_name1[ACPI_NAME_SIZE]; + char reversed_name2[ACPI_NAME_SIZE]; + u32 i; + u32 j; + + + /* + * Replace all instances of "underscore" with a value that is smaller so + * that all names that are prefixed with underscore(s) are alphabetically + * first. + * + * Reverse the name bytewise so we can just do a 32-bit compare instead + * of a strncmp. + */ + for (i = 0, j= (ACPI_NAME_SIZE - 1); i < ACPI_NAME_SIZE; i++, j--) { + reversed_name1[j] = name1[i]; + if (name1[i] == '_') { + reversed_name1[j] = '*'; + } + + reversed_name2[j] = name2[i]; + if (name2[i] == '_') { + reversed_name2[j] = '*'; + } + } + + return (*(s32 *) reversed_name1 - *(s32 *) reversed_name2); +} + + +/******************************************************************************* + * * FUNCTION: Acpi_ns_install_node * * PARAMETERS: Walk_state - Current state of the walk @@ -139,8 +188,10 @@ * DESCRIPTION: Initialize a new namespace node and install it amongst * its peers. * - * Note: Current namespace lookup is linear search, so the nodes - * are not linked in any particular order. + * Note: Current namespace lookup is linear search. However, the + * nodes are linked in alphabetical order to 1) put all reserved + * names (start with underscore) first, and to 2) make a readable + * namespace dump. * ******************************************************************************/ @@ -153,6 +204,7 @@ { u16 owner_id = TABLE_ID_DSDT; acpi_namespace_node *child_node; + acpi_namespace_node *previous_child_node; ACPI_FUNCTION_TRACE ("Ns_install_node"); @@ -172,66 +224,68 @@ child_node = parent_node->child; if (!child_node) { parent_node->child = node; + node->flags |= ANOBJ_END_OF_PEER_LIST; + node->peer = parent_node; } else { - while (!(child_node->flags & ANOBJ_END_OF_PEER_LIST)) { - child_node = child_node->peer; - } + /* + * Walk the list whilst searching for the the correct + * alphabetic placement. + */ + previous_child_node = NULL; + while (acpi_ns_compare_names (child_node->name.ascii, node->name.ascii) < 0) { + if (child_node->flags & ANOBJ_END_OF_PEER_LIST) { + /* Last peer; Clear end-of-list flag */ - child_node->peer = node; + child_node->flags &= ~ANOBJ_END_OF_PEER_LIST; - /* Clear end-of-list flag */ + /* This node is the new peer to the child node */ - child_node->flags &= ~ANOBJ_END_OF_PEER_LIST; - } + child_node->peer = node; - /* Init the new entry */ + /* This node is the new end-of-list */ - node->owner_id = owner_id; - node->flags |= ANOBJ_END_OF_PEER_LIST; - node->peer = parent_node; + node->flags |= ANOBJ_END_OF_PEER_LIST; + node->peer = parent_node; + break; + } + /* Get next peer */ - /* - * If adding a name with unknown type, or having to - * add the region in order to define fields in it, we - * have a forward reference. - */ - if ((ACPI_TYPE_ANY == type) || - (INTERNAL_TYPE_FIELD_DEFN == type) || - (INTERNAL_TYPE_BANK_FIELD_DEFN == type)) { - /* - * We don't want to abort here, however! - * We will fill in the actual type when the - * real definition is found later. - */ - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] is a forward reference\n", - node->name.ascii)); - } + previous_child_node = child_node; + child_node = child_node->peer; + } - /* - * The Def_field_defn and Bank_field_defn cases are actually - * looking up the Region in which the field will be defined - */ - if ((INTERNAL_TYPE_FIELD_DEFN == type) || - (INTERNAL_TYPE_BANK_FIELD_DEFN == type)) { - type = ACPI_TYPE_REGION; - } + /* Did the node get inserted at the end-of-list? */ - /* - * Scope, Def_any, and Index_field_defn are bogus "types" which do - * not actually have anything to do with the type of the name - * being looked up. Save any other value of Type as the type of - * the entry. - */ - if ((type != INTERNAL_TYPE_SCOPE) && - (type != INTERNAL_TYPE_DEF_ANY) && - (type != INTERNAL_TYPE_INDEX_FIELD_DEFN)) { - node->type = (u8) type; + if (!(node->flags & ANOBJ_END_OF_PEER_LIST)) { + /* + * Loop above terminated without reaching the end-of-list. + * Insert the new node at the current location + */ + if (previous_child_node) { + /* Insert node alphabetically */ + + node->peer = child_node; + previous_child_node->peer = node; + } + else { + /* Insert node alphabetically at start of list */ + + node->peer = child_node; + parent_node->child = node; + } + } } - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%4.4s added to %p at %p\n", - node->name.ascii, parent_node, node)); + /* Init the new entry */ + + node->owner_id = owner_id; + node->type = (u8) type; + + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%4.4s (%s) added to %4.4s (%s) %p at %p\n", + node->name.ascii, acpi_ut_get_type_name (node->type), + parent_node->name.ascii, acpi_ut_get_type_name (parent_node->type), parent_node, node)); /* * Increment the reference count(s) of all parents up to diff -Nru a/drivers/acpi/namespace/nsdump.c b/drivers/acpi/namespace/nsdump.c --- a/drivers/acpi/namespace/nsdump.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/namespace/nsdump.c Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: nsdump - table dumping routines for debug - * $Revision: 141 $ + * $Revision: 145 $ * *****************************************************************************/ @@ -150,22 +150,14 @@ acpi_object_type obj_type; acpi_object_type type; u32 bytes_to_dump; - u32 downstream_sibling_mask = 0; - u32 level_tmp; - u32 which_bit; - u32 i; u32 dbg_level; + u32 i; ACPI_FUNCTION_NAME ("Ns_dump_one_object"); - this_node = acpi_ns_map_handle_to_node (obj_handle); - - level_tmp = level; - type = this_node->type; - which_bit = 1; - + /* Is output enabled? */ if (!(acpi_dbg_level & info->debug_level)) { return (AE_OK); @@ -176,6 +168,9 @@ return (AE_OK); } + this_node = acpi_ns_map_handle_to_node (obj_handle); + type = this_node->type; + /* Check if the owner matches */ if ((info->owner_id != ACPI_UINT32_MAX) && @@ -185,45 +180,12 @@ /* Indent the object according to the level */ - while (level_tmp--) { - /* Print appropriate characters to form tree structure */ - - if (level_tmp) { - if (downstream_sibling_mask & which_bit) { - acpi_os_printf ("|"); - } - else { - acpi_os_printf (" "); - } - - which_bit <<= 1; - } - else { - if (acpi_ns_exist_downstream_sibling (this_node + 1)) { - downstream_sibling_mask |= ((u32) 1 << (level - 1)); - acpi_os_printf ("+"); - } - else { - downstream_sibling_mask &= ACPI_UINT32_MAX ^ ((u32) 1 << (level - 1)); - acpi_os_printf ("+"); - } - - if (this_node->child == NULL) { - acpi_os_printf ("-"); - } - else if (acpi_ns_exist_downstream_sibling (this_node->child)) { - acpi_os_printf ("+"); - } - else { - acpi_os_printf ("-"); - } - } - } + acpi_os_printf ("%2d%*s", level - 1, level * 2, " "); - /* Check the integrity of our data */ + /* Check the node type and name */ - if (type > INTERNAL_TYPE_MAX) { - type = INTERNAL_TYPE_DEF_ANY; /* prints as *ERROR* */ + if (type > ACPI_TYPE_LOCAL_MAX) { + ACPI_REPORT_WARNING (("Invalid ACPI Type %08X\n", type)); } if (!acpi_ut_valid_acpi_name (this_node->name.integer)) { @@ -233,7 +195,7 @@ /* * Now we can print out the pertinent information */ - acpi_os_printf (" %4.4s %-12s %p", + acpi_os_printf ("%4.4s %-12s %p ", this_node->name.ascii, acpi_ut_get_type_name (type), this_node); dbg_level = acpi_dbg_level; @@ -254,7 +216,7 @@ switch (type) { case ACPI_TYPE_PROCESSOR: - acpi_os_printf (" ID %X Len %.4X Addr %p\n", + acpi_os_printf ("ID %X Len %.4X Addr %p\n", obj_desc->processor.proc_id, obj_desc->processor.length, (char *) obj_desc->processor.address); @@ -263,13 +225,13 @@ case ACPI_TYPE_DEVICE: - acpi_os_printf (" Notification object: %p", obj_desc); + acpi_os_printf ("Notify object: %p", obj_desc); break; case ACPI_TYPE_METHOD: - acpi_os_printf (" Args %X Len %.4X Aml %p\n", + acpi_os_printf ("Args %X Len %.4X Aml %p\n", (u32) obj_desc->method.param_count, obj_desc->method.aml_length, obj_desc->method.aml_start); @@ -278,7 +240,7 @@ case ACPI_TYPE_INTEGER: - acpi_os_printf (" = %8.8X%8.8X\n", + acpi_os_printf ("= %8.8X%8.8X\n", ACPI_HIDWORD (obj_desc->integer.value), ACPI_LODWORD (obj_desc->integer.value)); break; @@ -287,11 +249,11 @@ case ACPI_TYPE_PACKAGE: if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { - acpi_os_printf (" Elements %.2X\n", + acpi_os_printf ("Elements %.2X\n", obj_desc->package.count); } else { - acpi_os_printf (" [Length not yet evaluated]\n"); + acpi_os_printf ("[Length not yet evaluated]\n"); } break; @@ -299,7 +261,7 @@ case ACPI_TYPE_BUFFER: if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { - acpi_os_printf (" Len %.2X", + acpi_os_printf ("Len %.2X", obj_desc->buffer.length); /* Dump some of the buffer */ @@ -313,28 +275,22 @@ acpi_os_printf ("\n"); } else { - acpi_os_printf (" [Length not yet evaluated]\n"); + acpi_os_printf ("[Length not yet evaluated]\n"); } break; case ACPI_TYPE_STRING: - acpi_os_printf (" Len %.2X", obj_desc->string.length); - - if (obj_desc->string.length > 0) { - acpi_os_printf (" = \"%.32s\"", obj_desc->string.pointer); - if (obj_desc->string.length > 32) { - acpi_os_printf ("..."); - } - } + acpi_os_printf ("Len %.2X ", obj_desc->string.length); + acpi_ut_print_string (obj_desc->string.pointer, 32); acpi_os_printf ("\n"); break; case ACPI_TYPE_REGION: - acpi_os_printf (" [%s]", acpi_ut_get_region_name (obj_desc->region.space_id)); + acpi_os_printf ("[%s]", acpi_ut_get_region_name (obj_desc->region.space_id)); if (obj_desc->region.flags & AOPOBJ_DATA_VALID) { acpi_os_printf (" Addr %8.8X%8.8X Len %.4X\n", ACPI_HIDWORD (obj_desc->region.address), @@ -347,9 +303,9 @@ break; - case INTERNAL_TYPE_REFERENCE: + case ACPI_TYPE_LOCAL_REFERENCE: - acpi_os_printf (" [%s]\n", + acpi_os_printf ("[%s]\n", acpi_ps_get_opcode_name (obj_desc->reference.opcode)); break; @@ -358,43 +314,43 @@ if (obj_desc->buffer_field.buffer_obj && obj_desc->buffer_field.buffer_obj->buffer.node) { - acpi_os_printf (" Buf [%4.4s]", + acpi_os_printf ("Buf [%4.4s]", obj_desc->buffer_field.buffer_obj->buffer.node->name.ascii); } break; - case INTERNAL_TYPE_REGION_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: - acpi_os_printf (" Rgn [%4.4s]", + acpi_os_printf ("Rgn [%4.4s]", obj_desc->common_field.region_obj->region.node->name.ascii); break; - case INTERNAL_TYPE_BANK_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: - acpi_os_printf (" Rgn [%4.4s] Bnk [%4.4s]", + acpi_os_printf ("Rgn [%4.4s] Bnk [%4.4s]", obj_desc->common_field.region_obj->region.node->name.ascii, obj_desc->bank_field.bank_obj->common_field.node->name.ascii); break; - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: - acpi_os_printf (" Idx [%4.4s] Dat [%4.4s]", + acpi_os_printf ("Idx [%4.4s] Dat [%4.4s]", obj_desc->index_field.index_obj->common_field.node->name.ascii, obj_desc->index_field.data_obj->common_field.node->name.ascii); break; - case INTERNAL_TYPE_ALIAS: + case ACPI_TYPE_LOCAL_ALIAS: - acpi_os_printf (" Target %4.4s (%p)\n", ((acpi_namespace_node *) obj_desc)->name.ascii, obj_desc); + acpi_os_printf ("Target %4.4s (%p)\n", ((acpi_namespace_node *) obj_desc)->name.ascii, obj_desc); break; default: - acpi_os_printf (" Object %p\n", obj_desc); + acpi_os_printf ("Object %p\n", obj_desc); break; } @@ -402,9 +358,10 @@ switch (type) { case ACPI_TYPE_BUFFER_FIELD: - case INTERNAL_TYPE_REGION_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: + acpi_os_printf (" Off %.2X Len %.2X Acc %.2hd\n", (obj_desc->common_field.base_byte_offset * 8) + obj_desc->common_field.start_field_bit_offset, @@ -420,9 +377,7 @@ case ACPI_DISPLAY_OBJECTS: - acpi_os_printf ("%p O:%p", - this_node, obj_desc); - + acpi_os_printf ("O:%p", obj_desc); if (!obj_desc) { /* No attached object, we are done */ @@ -490,7 +445,7 @@ /* Dump attached objects */ while (obj_desc) { - obj_type = INTERNAL_TYPE_INVALID; + obj_type = ACPI_TYPE_INVALID; acpi_os_printf (" Attached Object %p: ", obj_desc); /* Decode the type of attached object and dump the contents */ @@ -507,7 +462,7 @@ obj_type = ACPI_GET_OBJECT_TYPE (obj_desc); - if (obj_type > INTERNAL_TYPE_MAX) { + if (obj_type > ACPI_TYPE_LOCAL_MAX) { acpi_os_printf ("(Ptr to ACPI Object type %X [UNKNOWN])\n", obj_type); bytes_to_dump = 32; } @@ -558,15 +513,15 @@ obj_desc = (void *) obj_desc->method.aml_start; break; - case INTERNAL_TYPE_REGION_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: obj_desc = (void *) obj_desc->field.region_obj; break; - case INTERNAL_TYPE_BANK_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: obj_desc = (void *) obj_desc->bank_field.region_obj; break; - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: obj_desc = (void *) obj_desc->index_field.index_obj; break; @@ -574,7 +529,7 @@ goto cleanup; } - obj_type = INTERNAL_TYPE_INVALID; /* Terminate loop after next pass */ + obj_type = ACPI_TYPE_INVALID; /* Terminate loop after next pass */ } cleanup: diff -Nru a/drivers/acpi/namespace/nsobject.c b/drivers/acpi/namespace/nsobject.c --- a/drivers/acpi/namespace/nsobject.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/namespace/nsobject.c Mon Oct 28 16:32:36 2002 @@ -2,7 +2,7 @@ * * Module Name: nsobject - Utilities for objects attached to namespace * table entries - * $Revision: 83 $ + * $Revision: 84 $ * ******************************************************************************/ @@ -127,14 +127,9 @@ else { obj_desc = (acpi_operand_object *) object; - /* If a valid type (non-ANY) was given, just use it */ + /* Use the given type */ - if (ACPI_TYPE_ANY != type) { - object_type = type; - } - else { - object_type = INTERNAL_TYPE_DEF_ANY; - } + object_type = type; } ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n", @@ -201,7 +196,7 @@ obj_desc = node->object; if (!obj_desc || - (ACPI_GET_OBJECT_TYPE (obj_desc) == INTERNAL_TYPE_DATA)) { + (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_LOCAL_DATA)) { return_VOID; } @@ -211,7 +206,7 @@ if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) == ACPI_DESC_TYPE_OPERAND) { node->object = obj_desc->common.next_object; if (node->object && - (ACPI_GET_OBJECT_TYPE (node->object) != INTERNAL_TYPE_DATA)) { + (ACPI_GET_OBJECT_TYPE (node->object) != ACPI_TYPE_LOCAL_DATA)) { node->object = node->object->common.next_object; } } @@ -256,7 +251,7 @@ if (!node->object || ((ACPI_GET_DESCRIPTOR_TYPE (node->object) != ACPI_DESC_TYPE_OPERAND) && (ACPI_GET_DESCRIPTOR_TYPE (node->object) != ACPI_DESC_TYPE_NAMED)) || - (ACPI_GET_OBJECT_TYPE (node->object) == INTERNAL_TYPE_DATA)) { + (ACPI_GET_OBJECT_TYPE (node->object) == ACPI_TYPE_LOCAL_DATA)) { return_PTR (NULL); } @@ -282,10 +277,10 @@ ACPI_FUNCTION_TRACE_PTR ("Ns_get_secondary_object", obj_desc); - if ((!obj_desc) || - (ACPI_GET_OBJECT_TYPE (obj_desc) == INTERNAL_TYPE_DATA) || - (!obj_desc->common.next_object) || - (ACPI_GET_OBJECT_TYPE (obj_desc->common.next_object) == INTERNAL_TYPE_DATA)) { + if ((!obj_desc) || + (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_LOCAL_DATA) || + (!obj_desc->common.next_object) || + (ACPI_GET_OBJECT_TYPE (obj_desc->common.next_object) == ACPI_TYPE_LOCAL_DATA)) { return_PTR (NULL); } @@ -320,7 +315,7 @@ prev_obj_desc = NULL; obj_desc = node->object; while (obj_desc) { - if ((ACPI_GET_OBJECT_TYPE (obj_desc) == INTERNAL_TYPE_DATA) && + if ((ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_LOCAL_DATA) && (obj_desc->data.handler == handler)) { return (AE_ALREADY_EXISTS); } @@ -332,7 +327,7 @@ /* Create an internal object for the data */ - data_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_DATA); + data_desc = acpi_ut_create_internal_object (ACPI_TYPE_LOCAL_DATA); if (!data_desc) { return (AE_NO_MEMORY); } @@ -378,7 +373,7 @@ prev_obj_desc = NULL; obj_desc = node->object; while (obj_desc) { - if ((ACPI_GET_OBJECT_TYPE (obj_desc) == INTERNAL_TYPE_DATA) && + if ((ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_LOCAL_DATA) && (obj_desc->data.handler == handler)) { if (prev_obj_desc) { prev_obj_desc->common.next_object = obj_desc->common.next_object; @@ -422,7 +417,7 @@ obj_desc = node->object; while (obj_desc) { - if ((ACPI_GET_OBJECT_TYPE (obj_desc) == INTERNAL_TYPE_DATA) && + if ((ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_LOCAL_DATA) && (obj_desc->data.handler == handler)) { *data = obj_desc->data.pointer; return (AE_OK); diff -Nru a/drivers/acpi/namespace/nssearch.c b/drivers/acpi/namespace/nssearch.c --- a/drivers/acpi/namespace/nssearch.c Mon Oct 28 16:32:38 2002 +++ b/drivers/acpi/namespace/nssearch.c Mon Oct 28 16:32:38 2002 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nssearch - Namespace search - * $Revision: 89 $ + * $Revision: 92 $ * ******************************************************************************/ @@ -37,14 +37,15 @@ * FUNCTION: Acpi_ns_search_node * * PARAMETERS: *Target_name - Ascii ACPI name to search for - * *Node - Starting table where search will begin + * *Node - Starting node where search will begin * Type - Object type to match * **Return_node - Where the matched Named obj is returned * * RETURN: Status * - * DESCRIPTION: Search a single namespace table. Performs a simple search, - * does not add entries or search parents. + * DESCRIPTION: Search a single level of the namespace. Performs a + * simple search of the specified level, and does not add + * entries or search parents. * * * Named object lists are built (and subsequently dumped) in the @@ -77,7 +78,7 @@ scope_name = acpi_ns_get_external_pathname (node); if (scope_name) { - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s [%p] For %4.4s (type %s)\n", + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s [%p] For %4.4s (%s)\n", scope_name, node, (char *) &target_name, acpi_ut_get_type_name (type))); ACPI_MEM_FREE (scope_name); @@ -86,8 +87,8 @@ #endif /* - * Search for name in this table, which is to say that we must search - * for the name among the children of this object + * Search for name at this namespace level, which is to say that we + * must search for the name among the children of this object */ next_node = node->child; while (next_node) { @@ -95,30 +96,8 @@ if (next_node->name.integer == target_name) { /* - * Found matching entry. Capture the type if appropriate, before - * returning the entry. - * - * The Def_field_defn and Bank_field_defn cases are actually looking up - * the Region in which the field will be defined + * Found matching entry. */ - if ((INTERNAL_TYPE_FIELD_DEFN == type) || - (INTERNAL_TYPE_BANK_FIELD_DEFN == type)) { - type = ACPI_TYPE_REGION; - } - - /* - * Scope, Def_any, and Index_field_defn are bogus "types" which do not - * actually have anything to do with the type of the name being - * looked up. For any other value of Type, if the type stored in - * the entry is Any (i.e. unknown), save the actual type. - */ - if (type != INTERNAL_TYPE_SCOPE && - type != INTERNAL_TYPE_DEF_ANY && - type != INTERNAL_TYPE_INDEX_FIELD_DEFN && - next_node->type == ACPI_TYPE_ANY) { - next_node->type = (u8) type; - } - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Name %4.4s Type [%s] found at %p\n", (char *) &target_name, acpi_ut_get_type_name (next_node->type), next_node)); @@ -142,7 +121,7 @@ next_node = next_node->peer; } - /* Searched entire table, not found */ + /* Searched entire namespace level, not found */ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Name %4.4s Type [%s] not found at %p\n", (char *) &target_name, acpi_ut_get_type_name (type), next_node)); @@ -156,14 +135,14 @@ * FUNCTION: Acpi_ns_search_parent_tree * * PARAMETERS: *Target_name - Ascii ACPI name to search for - * *Node - Starting table where search will begin + * *Node - Starting node where search will begin * Type - Object type to match * **Return_node - Where the matched Named Obj is returned * * RETURN: Status * * DESCRIPTION: Called when a name has not been found in the current namespace - * table. Before adding it or giving up, ACPI scope rules require + * level. Before adding it or giving up, ACPI scope rules require * searching enclosing scopes in cases identified by Acpi_ns_local(). * * "A name is located by finding the matching name in the current @@ -193,22 +172,19 @@ parent_node = acpi_ns_get_parent_node (node); /* - * If there is no parent (at the root) or type is "local", we won't be - * searching the parent tree. + * If there is no parent (i.e., we are at the root) or + * type is "local", we won't be searching the parent tree. */ - if ((acpi_ns_local (type)) || - (!parent_node)) { - if (!parent_node) { - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] has no parent\n", - (char *) &target_name)); - } - - if (acpi_ns_local (type)) { - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, - "[%4.4s] type [%s] must be local to this scope (no parent search)\n", - (char *) &target_name, acpi_ut_get_type_name (type))); - } + if (!parent_node) { + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] has no parent\n", + (char *) &target_name)); + return_ACPI_STATUS (AE_NOT_FOUND); + } + if (acpi_ns_local (type)) { + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, + "[%4.4s] type [%s] must be local to this scope (no parent search)\n", + (char *) &target_name, acpi_ut_get_type_name (type))); return_ACPI_STATUS (AE_NOT_FOUND); } @@ -251,8 +227,8 @@ * * PARAMETERS: Target_name - Ascii ACPI name to search for (4 chars) * Walk_state - Current state of the walk - * *Node - Starting table where search will begin - * Interpreter_mode - Add names only in MODE_Load_pass_x. + * *Node - Starting node where search will begin + * Interpreter_mode - Add names only in ACPI_MODE_LOAD_PASS_x. * Otherwise,search only. * Type - Object type to match * Flags - Flags describing the search restrictions @@ -260,12 +236,12 @@ * * RETURN: Status * - * DESCRIPTION: Search for a name segment in a single name table, + * DESCRIPTION: Search for a name segment in a single namespace level, * optionally adding it if it is not found. If the passed * Type is not Any and the type previously stored in the * entry was Any (i.e. unknown), update the stored type. * - * In IMODE_EXECUTE, search only. + * In ACPI_IMODE_EXECUTE, search only. * In other modes, search and add if not found. * ******************************************************************************/ @@ -300,14 +276,12 @@ /* Name must consist of printable characters */ if (!acpi_ut_valid_acpi_name (target_name)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "*** Bad character in name: %08x *** \n", + ACPI_REPORT_ERROR (("Ns_search_and_enter: Bad character in ACPI Name: %X\n", target_name)); - - ACPI_REPORT_ERROR (("Ns_search_and_enter: Bad character in ACPI Name\n")); return_ACPI_STATUS (AE_BAD_CHARACTER); } - /* Try to find the name in the table specified by the caller */ + /* Try to find the name in the namespace level specified by the caller */ *return_node = ACPI_ENTRY_NOT_FOUND; status = acpi_ns_search_node (target_name, node, type, return_node); @@ -340,7 +314,7 @@ if ((interpreter_mode != ACPI_IMODE_LOAD_PASS1) && (flags & ACPI_NS_SEARCH_PARENT)) { /* - * Not found in table - search parent tree according + * Not found at this level - search parent tree according * to ACPI specification */ status = acpi_ns_search_parent_tree (target_name, node, diff -Nru a/drivers/acpi/namespace/nsutils.c b/drivers/acpi/namespace/nsutils.c --- a/drivers/acpi/namespace/nsutils.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/namespace/nsutils.c Mon Oct 28 16:32:37 2002 @@ -2,7 +2,7 @@ * * Module Name: nsutils - Utilities for accessing ACPI namespace, accessing * parents and siblings and Scope manipulation - * $Revision: 113 $ + * $Revision: 115 $ * *****************************************************************************/ @@ -747,7 +747,7 @@ acpi_ns_opens_scope ( acpi_object_type type) { - ACPI_FUNCTION_TRACE_U32 ("Ns_opens_scope", type); + ACPI_FUNCTION_TRACE_STR ("Ns_opens_scope", acpi_ut_get_type_name (type)); if (!acpi_ut_valid_object_type (type)) { @@ -883,43 +883,6 @@ return_VALUE (ACPI_UNKNOWN_NAME); } - - -#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_exist_downstream_sibling - * - * PARAMETERS: *Node - pointer to first Node to examine - * - * RETURN: TRUE if sibling is found, FALSE otherwise - * - * DESCRIPTION: Searches remainder of scope being processed to determine - * whether there is a downstream sibling to the current - * object. This function is used to determine what type of - * line drawing character to use when displaying namespace - * trees. - * - ******************************************************************************/ - -u8 -acpi_ns_exist_downstream_sibling ( - acpi_namespace_node *node) -{ - - if (!node) { - return (FALSE); - } - - if (node->name.integer) { - return (TRUE); - } - - return (FALSE); -} - -#endif /* ACPI_DEBUG_OUTPUT */ /******************************************************************************* diff -Nru a/drivers/acpi/namespace/nsxfeval.c b/drivers/acpi/namespace/nsxfeval.c --- a/drivers/acpi/namespace/nsxfeval.c Mon Oct 28 16:32:38 2002 +++ b/drivers/acpi/namespace/nsxfeval.c Mon Oct 28 16:32:38 2002 @@ -2,7 +2,7 @@ * * Module Name: nsxfeval - Public interfaces to the ACPI subsystem * ACPI Object evaluation interfaces - * $Revision: 2 $ + * $Revision: 3 $ * ******************************************************************************/ @@ -373,8 +373,8 @@ /* Parameter validation */ - if ((type > ACPI_TYPE_MAX) || - (!max_depth) || + if ((type > ACPI_TYPE_EXTERNAL_MAX) || + (!max_depth) || (!user_function)) { return_ACPI_STATUS (AE_BAD_PARAMETER); } diff -Nru a/drivers/acpi/namespace/nsxfobj.c b/drivers/acpi/namespace/nsxfobj.c --- a/drivers/acpi/namespace/nsxfobj.c Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/namespace/nsxfobj.c Mon Oct 28 16:32:35 2002 @@ -2,7 +2,7 @@ * * Module Name: nsxfobj - Public interfaces to the ACPI subsystem * ACPI Object oriented interfaces - * $Revision: 113 $ + * $Revision: 114 $ * ******************************************************************************/ @@ -188,7 +188,7 @@ /* Parameter validation */ - if (type > ACPI_TYPE_MAX) { + if (type > ACPI_TYPE_EXTERNAL_MAX) { return (AE_BAD_PARAMETER); } diff -Nru a/drivers/acpi/parser/psopcode.c b/drivers/acpi/parser/psopcode.c --- a/drivers/acpi/parser/psopcode.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/parser/psopcode.c Mon Oct 28 16:32:36 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psopcode - Parser/Interpreter opcode information table - * $Revision: 72 $ + * $Revision: 73 $ * *****************************************************************************/ @@ -451,144 +451,144 @@ const acpi_opcode_info acpi_gbl_aml_op_info[AML_NUM_OPCODES] = { /*! [Begin] no source code translation */ -/* Index Name Parser Args Interpreter Args ObjectType Class Type Flags */ +/* Index Name Parser Args Interpreter Args ObjectType Class Type Flags */ -/* 00 */ ACPI_OP ("Zero", ARGP_ZERO_OP, ARGI_ZERO_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, AML_CONSTANT), -/* 01 */ ACPI_OP ("One", ARGP_ONE_OP, ARGI_ONE_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, AML_CONSTANT), -/* 02 */ ACPI_OP ("Alias", ARGP_ALIAS_OP, ARGI_ALIAS_OP, INTERNAL_TYPE_ALIAS, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 03 */ ACPI_OP ("Name", ARGP_NAME_OP, ARGI_NAME_OP, ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 04 */ ACPI_OP ("ByteConst", ARGP_BYTE_OP, ARGI_BYTE_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_CONSTANT), -/* 05 */ ACPI_OP ("WordConst", ARGP_WORD_OP, ARGI_WORD_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_CONSTANT), -/* 06 */ ACPI_OP ("DwordConst", ARGP_DWORD_OP, ARGI_DWORD_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_CONSTANT), -/* 07 */ ACPI_OP ("String", ARGP_STRING_OP, ARGI_STRING_OP, ACPI_TYPE_STRING, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_CONSTANT), -/* 08 */ ACPI_OP ("Scope", ARGP_SCOPE_OP, ARGI_SCOPE_OP, INTERNAL_TYPE_SCOPE, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 09 */ ACPI_OP ("Buffer", ARGP_BUFFER_OP, ARGI_BUFFER_OP, ACPI_TYPE_BUFFER, AML_CLASS_CREATE, AML_TYPE_CREATE_OBJECT, AML_HAS_ARGS | AML_DEFER | AML_CONSTANT), -/* 0A */ ACPI_OP ("Package", ARGP_PACKAGE_OP, ARGI_PACKAGE_OP, ACPI_TYPE_PACKAGE, AML_CLASS_CREATE, AML_TYPE_CREATE_OBJECT, AML_HAS_ARGS | AML_DEFER | AML_CONSTANT), -/* 0B */ ACPI_OP ("Method", ARGP_METHOD_OP, ARGI_METHOD_OP, ACPI_TYPE_METHOD, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED | AML_DEFER), -/* 0C */ ACPI_OP ("Local0", ARGP_LOCAL0, ARGI_LOCAL0, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 0D */ ACPI_OP ("Local1", ARGP_LOCAL1, ARGI_LOCAL1, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 0E */ ACPI_OP ("Local2", ARGP_LOCAL2, ARGI_LOCAL2, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 0F */ ACPI_OP ("Local3", ARGP_LOCAL3, ARGI_LOCAL3, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 10 */ ACPI_OP ("Local4", ARGP_LOCAL4, ARGI_LOCAL4, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 11 */ ACPI_OP ("Local5", ARGP_LOCAL5, ARGI_LOCAL5, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 12 */ ACPI_OP ("Local6", ARGP_LOCAL6, ARGI_LOCAL6, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 13 */ ACPI_OP ("Local7", ARGP_LOCAL7, ARGI_LOCAL7, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), -/* 14 */ ACPI_OP ("Arg0", ARGP_ARG0, ARGI_ARG0, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 15 */ ACPI_OP ("Arg1", ARGP_ARG1, ARGI_ARG1, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 16 */ ACPI_OP ("Arg2", ARGP_ARG2, ARGI_ARG2, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 17 */ ACPI_OP ("Arg3", ARGP_ARG3, ARGI_ARG3, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 18 */ ACPI_OP ("Arg4", ARGP_ARG4, ARGI_ARG4, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 19 */ ACPI_OP ("Arg5", ARGP_ARG5, ARGI_ARG5, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 1A */ ACPI_OP ("Arg6", ARGP_ARG6, ARGI_ARG6, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), -/* 1B */ ACPI_OP ("Store", ARGP_STORE_OP, ARGI_STORE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 1C */ ACPI_OP ("RefOf", ARGP_REF_OF_OP, ARGI_REF_OF_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), -/* 1D */ ACPI_OP ("Add", ARGP_ADD_OP, ARGI_ADD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), -/* 1E */ ACPI_OP ("Concatenate", ARGP_CONCAT_OP, ARGI_CONCAT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT), -/* 1F */ ACPI_OP ("Subtract", ARGP_SUBTRACT_OP, ARGI_SUBTRACT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), -/* 20 */ ACPI_OP ("Increment", ARGP_INCREMENT_OP, ARGI_INCREMENT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT), -/* 21 */ ACPI_OP ("Decrement", ARGP_DECREMENT_OP, ARGI_DECREMENT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT), -/* 22 */ ACPI_OP ("Multiply", ARGP_MULTIPLY_OP, ARGI_MULTIPLY_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), -/* 23 */ ACPI_OP ("Divide", ARGP_DIVIDE_OP, ARGI_DIVIDE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_2T_1R, AML_FLAGS_EXEC_2A_2T_1R | AML_CONSTANT), -/* 24 */ ACPI_OP ("ShiftLeft", ARGP_SHIFT_LEFT_OP, ARGI_SHIFT_LEFT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), -/* 25 */ ACPI_OP ("ShiftRight", ARGP_SHIFT_RIGHT_OP, ARGI_SHIFT_RIGHT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), -/* 26 */ ACPI_OP ("And", ARGP_BIT_AND_OP, ARGI_BIT_AND_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), -/* 27 */ ACPI_OP ("NAnd", ARGP_BIT_NAND_OP, ARGI_BIT_NAND_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), -/* 28 */ ACPI_OP ("Or", ARGP_BIT_OR_OP, ARGI_BIT_OR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), -/* 29 */ ACPI_OP ("NOr", ARGP_BIT_NOR_OP, ARGI_BIT_NOR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), -/* 2A */ ACPI_OP ("XOr", ARGP_BIT_XOR_OP, ARGI_BIT_XOR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), -/* 2B */ ACPI_OP ("Not", ARGP_BIT_NOT_OP, ARGI_BIT_NOT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), -/* 2C */ ACPI_OP ("FindSetLeftBit", ARGP_FIND_SET_LEFT_BIT_OP, ARGI_FIND_SET_LEFT_BIT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), -/* 2D */ ACPI_OP ("FindSetRightBit", ARGP_FIND_SET_RIGHT_BIT_OP,ARGI_FIND_SET_RIGHT_BIT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), -/* 2E */ ACPI_OP ("DerefOf", ARGP_DEREF_OF_OP, ARGI_DEREF_OF_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), -/* 2F */ ACPI_OP ("Notify", ARGP_NOTIFY_OP, ARGI_NOTIFY_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_0R, AML_FLAGS_EXEC_2A_0T_0R), -/* 30 */ ACPI_OP ("SizeOf", ARGP_SIZE_OF_OP, ARGI_SIZE_OF_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), -/* 31 */ ACPI_OP ("Index", ARGP_INDEX_OP, ARGI_INDEX_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT), -/* 32 */ ACPI_OP ("Match", ARGP_MATCH_OP, ARGI_MATCH_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R | AML_CONSTANT), -/* 33 */ ACPI_OP ("CreateDWordField", ARGP_CREATE_DWORD_FIELD_OP,ARGI_CREATE_DWORD_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), -/* 34 */ ACPI_OP ("CreateWordField", ARGP_CREATE_WORD_FIELD_OP, ARGI_CREATE_WORD_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), -/* 35 */ ACPI_OP ("CreateByteField", ARGP_CREATE_BYTE_FIELD_OP, ARGI_CREATE_BYTE_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), -/* 36 */ ACPI_OP ("CreateBitField", ARGP_CREATE_BIT_FIELD_OP, ARGI_CREATE_BIT_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), -/* 37 */ ACPI_OP ("ObjectType", ARGP_TYPE_OP, ARGI_TYPE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), -/* 38 */ ACPI_OP ("LAnd", ARGP_LAND_OP, ARGI_LAND_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT), -/* 39 */ ACPI_OP ("LOr", ARGP_LOR_OP, ARGI_LOR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT), -/* 3A */ ACPI_OP ("LNot", ARGP_LNOT_OP, ARGI_LNOT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT), -/* 3B */ ACPI_OP ("LEqual", ARGP_LEQUAL_OP, ARGI_LEQUAL_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT), -/* 3C */ ACPI_OP ("LGreater", ARGP_LGREATER_OP, ARGI_LGREATER_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT), -/* 3D */ ACPI_OP ("LLess", ARGP_LLESS_OP, ARGI_LLESS_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT), -/* 3E */ ACPI_OP ("If", ARGP_IF_OP, ARGI_IF_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), -/* 3F */ ACPI_OP ("Else", ARGP_ELSE_OP, ARGI_ELSE_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), -/* 40 */ ACPI_OP ("While", ARGP_WHILE_OP, ARGI_WHILE_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), -/* 41 */ ACPI_OP ("Noop", ARGP_NOOP_OP, ARGI_NOOP_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), -/* 42 */ ACPI_OP ("Return", ARGP_RETURN_OP, ARGI_RETURN_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), -/* 43 */ ACPI_OP ("Break", ARGP_BREAK_OP, ARGI_BREAK_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), -/* 44 */ ACPI_OP ("BreakPoint", ARGP_BREAK_POINT_OP, ARGI_BREAK_POINT_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), -/* 45 */ ACPI_OP ("Ones", ARGP_ONES_OP, ARGI_ONES_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, AML_CONSTANT), +/* 00 */ ACPI_OP ("Zero", ARGP_ZERO_OP, ARGI_ZERO_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, AML_CONSTANT), +/* 01 */ ACPI_OP ("One", ARGP_ONE_OP, ARGI_ONE_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, AML_CONSTANT), +/* 02 */ ACPI_OP ("Alias", ARGP_ALIAS_OP, ARGI_ALIAS_OP, ACPI_TYPE_LOCAL_ALIAS, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 03 */ ACPI_OP ("Name", ARGP_NAME_OP, ARGI_NAME_OP, ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 04 */ ACPI_OP ("ByteConst", ARGP_BYTE_OP, ARGI_BYTE_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_CONSTANT), +/* 05 */ ACPI_OP ("WordConst", ARGP_WORD_OP, ARGI_WORD_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_CONSTANT), +/* 06 */ ACPI_OP ("DwordConst", ARGP_DWORD_OP, ARGI_DWORD_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_CONSTANT), +/* 07 */ ACPI_OP ("String", ARGP_STRING_OP, ARGI_STRING_OP, ACPI_TYPE_STRING, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_CONSTANT), +/* 08 */ ACPI_OP ("Scope", ARGP_SCOPE_OP, ARGI_SCOPE_OP, ACPI_TYPE_LOCAL_SCOPE, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 09 */ ACPI_OP ("Buffer", ARGP_BUFFER_OP, ARGI_BUFFER_OP, ACPI_TYPE_BUFFER, AML_CLASS_CREATE, AML_TYPE_CREATE_OBJECT, AML_HAS_ARGS | AML_DEFER | AML_CONSTANT), +/* 0A */ ACPI_OP ("Package", ARGP_PACKAGE_OP, ARGI_PACKAGE_OP, ACPI_TYPE_PACKAGE, AML_CLASS_CREATE, AML_TYPE_CREATE_OBJECT, AML_HAS_ARGS | AML_DEFER | AML_CONSTANT), +/* 0B */ ACPI_OP ("Method", ARGP_METHOD_OP, ARGI_METHOD_OP, ACPI_TYPE_METHOD, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED | AML_DEFER), +/* 0C */ ACPI_OP ("Local0", ARGP_LOCAL0, ARGI_LOCAL0, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 0D */ ACPI_OP ("Local1", ARGP_LOCAL1, ARGI_LOCAL1, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 0E */ ACPI_OP ("Local2", ARGP_LOCAL2, ARGI_LOCAL2, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 0F */ ACPI_OP ("Local3", ARGP_LOCAL3, ARGI_LOCAL3, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 10 */ ACPI_OP ("Local4", ARGP_LOCAL4, ARGI_LOCAL4, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 11 */ ACPI_OP ("Local5", ARGP_LOCAL5, ARGI_LOCAL5, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 12 */ ACPI_OP ("Local6", ARGP_LOCAL6, ARGI_LOCAL6, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 13 */ ACPI_OP ("Local7", ARGP_LOCAL7, ARGI_LOCAL7, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 14 */ ACPI_OP ("Arg0", ARGP_ARG0, ARGI_ARG0, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 15 */ ACPI_OP ("Arg1", ARGP_ARG1, ARGI_ARG1, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 16 */ ACPI_OP ("Arg2", ARGP_ARG2, ARGI_ARG2, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 17 */ ACPI_OP ("Arg3", ARGP_ARG3, ARGI_ARG3, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 18 */ ACPI_OP ("Arg4", ARGP_ARG4, ARGI_ARG4, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 19 */ ACPI_OP ("Arg5", ARGP_ARG5, ARGI_ARG5, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 1A */ ACPI_OP ("Arg6", ARGP_ARG6, ARGI_ARG6, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 1B */ ACPI_OP ("Store", ARGP_STORE_OP, ARGI_STORE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 1C */ ACPI_OP ("RefOf", ARGP_REF_OF_OP, ARGI_REF_OF_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 1D */ ACPI_OP ("Add", ARGP_ADD_OP, ARGI_ADD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), +/* 1E */ ACPI_OP ("Concatenate", ARGP_CONCAT_OP, ARGI_CONCAT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT), +/* 1F */ ACPI_OP ("Subtract", ARGP_SUBTRACT_OP, ARGI_SUBTRACT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), +/* 20 */ ACPI_OP ("Increment", ARGP_INCREMENT_OP, ARGI_INCREMENT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT), +/* 21 */ ACPI_OP ("Decrement", ARGP_DECREMENT_OP, ARGI_DECREMENT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT), +/* 22 */ ACPI_OP ("Multiply", ARGP_MULTIPLY_OP, ARGI_MULTIPLY_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), +/* 23 */ ACPI_OP ("Divide", ARGP_DIVIDE_OP, ARGI_DIVIDE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_2T_1R, AML_FLAGS_EXEC_2A_2T_1R | AML_CONSTANT), +/* 24 */ ACPI_OP ("ShiftLeft", ARGP_SHIFT_LEFT_OP, ARGI_SHIFT_LEFT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), +/* 25 */ ACPI_OP ("ShiftRight", ARGP_SHIFT_RIGHT_OP, ARGI_SHIFT_RIGHT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), +/* 26 */ ACPI_OP ("And", ARGP_BIT_AND_OP, ARGI_BIT_AND_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), +/* 27 */ ACPI_OP ("NAnd", ARGP_BIT_NAND_OP, ARGI_BIT_NAND_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), +/* 28 */ ACPI_OP ("Or", ARGP_BIT_OR_OP, ARGI_BIT_OR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), +/* 29 */ ACPI_OP ("NOr", ARGP_BIT_NOR_OP, ARGI_BIT_NOR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), +/* 2A */ ACPI_OP ("XOr", ARGP_BIT_XOR_OP, ARGI_BIT_XOR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT), +/* 2B */ ACPI_OP ("Not", ARGP_BIT_NOT_OP, ARGI_BIT_NOT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), +/* 2C */ ACPI_OP ("FindSetLeftBit", ARGP_FIND_SET_LEFT_BIT_OP, ARGI_FIND_SET_LEFT_BIT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), +/* 2D */ ACPI_OP ("FindSetRightBit", ARGP_FIND_SET_RIGHT_BIT_OP,ARGI_FIND_SET_RIGHT_BIT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), +/* 2E */ ACPI_OP ("DerefOf", ARGP_DEREF_OF_OP, ARGI_DEREF_OF_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 2F */ ACPI_OP ("Notify", ARGP_NOTIFY_OP, ARGI_NOTIFY_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_0R, AML_FLAGS_EXEC_2A_0T_0R), +/* 30 */ ACPI_OP ("SizeOf", ARGP_SIZE_OF_OP, ARGI_SIZE_OF_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 31 */ ACPI_OP ("Index", ARGP_INDEX_OP, ARGI_INDEX_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT), +/* 32 */ ACPI_OP ("Match", ARGP_MATCH_OP, ARGI_MATCH_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R | AML_CONSTANT), +/* 33 */ ACPI_OP ("CreateDWordField", ARGP_CREATE_DWORD_FIELD_OP,ARGI_CREATE_DWORD_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 34 */ ACPI_OP ("CreateWordField", ARGP_CREATE_WORD_FIELD_OP, ARGI_CREATE_WORD_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 35 */ ACPI_OP ("CreateByteField", ARGP_CREATE_BYTE_FIELD_OP, ARGI_CREATE_BYTE_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 36 */ ACPI_OP ("CreateBitField", ARGP_CREATE_BIT_FIELD_OP, ARGI_CREATE_BIT_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 37 */ ACPI_OP ("ObjectType", ARGP_TYPE_OP, ARGI_TYPE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 38 */ ACPI_OP ("LAnd", ARGP_LAND_OP, ARGI_LAND_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT), +/* 39 */ ACPI_OP ("LOr", ARGP_LOR_OP, ARGI_LOR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT), +/* 3A */ ACPI_OP ("LNot", ARGP_LNOT_OP, ARGI_LNOT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT), +/* 3B */ ACPI_OP ("LEqual", ARGP_LEQUAL_OP, ARGI_LEQUAL_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT), +/* 3C */ ACPI_OP ("LGreater", ARGP_LGREATER_OP, ARGI_LGREATER_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT), +/* 3D */ ACPI_OP ("LLess", ARGP_LLESS_OP, ARGI_LLESS_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT), +/* 3E */ ACPI_OP ("If", ARGP_IF_OP, ARGI_IF_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 3F */ ACPI_OP ("Else", ARGP_ELSE_OP, ARGI_ELSE_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 40 */ ACPI_OP ("While", ARGP_WHILE_OP, ARGI_WHILE_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 41 */ ACPI_OP ("Noop", ARGP_NOOP_OP, ARGI_NOOP_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 42 */ ACPI_OP ("Return", ARGP_RETURN_OP, ARGI_RETURN_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 43 */ ACPI_OP ("Break", ARGP_BREAK_OP, ARGI_BREAK_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 44 */ ACPI_OP ("BreakPoint", ARGP_BREAK_POINT_OP, ARGI_BREAK_POINT_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 45 */ ACPI_OP ("Ones", ARGP_ONES_OP, ARGI_ONES_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, AML_CONSTANT), /* Prefixed opcodes (Two-byte opcodes with a prefix op) */ -/* 46 */ ACPI_OP ("Mutex", ARGP_MUTEX_OP, ARGI_MUTEX_OP, ACPI_TYPE_MUTEX, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 47 */ ACPI_OP ("Event", ARGP_EVENT_OP, ARGI_EVENT_OP, ACPI_TYPE_EVENT, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED ), -/* 48 */ ACPI_OP ("CondRefOf", ARGP_COND_REF_OF_OP, ARGI_COND_REF_OF_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 49 */ ACPI_OP ("CreateField", ARGP_CREATE_FIELD_OP, ARGI_CREATE_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_FIELD | AML_CREATE), -/* 4A */ ACPI_OP ("Load", ARGP_LOAD_OP, ARGI_LOAD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_0R, AML_FLAGS_EXEC_1A_1T_0R), -/* 4B */ ACPI_OP ("Stall", ARGP_STALL_OP, ARGI_STALL_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), -/* 4C */ ACPI_OP ("Sleep", ARGP_SLEEP_OP, ARGI_SLEEP_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), -/* 4D */ ACPI_OP ("Acquire", ARGP_ACQUIRE_OP, ARGI_ACQUIRE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R), -/* 4E */ ACPI_OP ("Signal", ARGP_SIGNAL_OP, ARGI_SIGNAL_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), -/* 4F */ ACPI_OP ("Wait", ARGP_WAIT_OP, ARGI_WAIT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R), -/* 50 */ ACPI_OP ("Reset", ARGP_RESET_OP, ARGI_RESET_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), -/* 51 */ ACPI_OP ("Release", ARGP_RELEASE_OP, ARGI_RELEASE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), -/* 52 */ ACPI_OP ("FromBCD", ARGP_FROM_BCD_OP, ARGI_FROM_BCD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), -/* 53 */ ACPI_OP ("ToBCD", ARGP_TO_BCD_OP, ARGI_TO_BCD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), -/* 54 */ ACPI_OP ("Unload", ARGP_UNLOAD_OP, ARGI_UNLOAD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), -/* 55 */ ACPI_OP ("Revision", ARGP_REVISION_OP, ARGI_REVISION_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), -/* 56 */ ACPI_OP ("Debug", ARGP_DEBUG_OP, ARGI_DEBUG_OP, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), -/* 57 */ ACPI_OP ("Fatal", ARGP_FATAL_OP, ARGI_FATAL_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_0T_0R, AML_FLAGS_EXEC_3A_0T_0R), -/* 58 */ ACPI_OP ("OperationRegion", ARGP_REGION_OP, ARGI_REGION_OP, ACPI_TYPE_REGION, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED | AML_DEFER), -/* 59 */ ACPI_OP ("Field", ARGP_FIELD_OP, ARGI_FIELD_OP, INTERNAL_TYPE_FIELD_DEFN,AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), -/* 5A */ ACPI_OP ("Device", ARGP_DEVICE_OP, ARGI_DEVICE_OP, ACPI_TYPE_DEVICE, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 5B */ ACPI_OP ("Processor", ARGP_PROCESSOR_OP, ARGI_PROCESSOR_OP, ACPI_TYPE_PROCESSOR, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 5C */ ACPI_OP ("PowerResource", ARGP_POWER_RES_OP, ARGI_POWER_RES_OP, ACPI_TYPE_POWER, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 5D */ ACPI_OP ("ThermalZone", ARGP_THERMAL_ZONE_OP, ARGI_THERMAL_ZONE_OP, ACPI_TYPE_THERMAL, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 5E */ ACPI_OP ("IndexField", ARGP_INDEX_FIELD_OP, ARGI_INDEX_FIELD_OP, INTERNAL_TYPE_INDEX_FIELD_DEFN,AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), -/* 5F */ ACPI_OP ("BankField", ARGP_BANK_FIELD_OP, ARGI_BANK_FIELD_OP, INTERNAL_TYPE_BANK_FIELD_DEFN,AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), +/* 46 */ ACPI_OP ("Mutex", ARGP_MUTEX_OP, ARGI_MUTEX_OP, ACPI_TYPE_MUTEX, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 47 */ ACPI_OP ("Event", ARGP_EVENT_OP, ARGI_EVENT_OP, ACPI_TYPE_EVENT, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED ), +/* 48 */ ACPI_OP ("CondRefOf", ARGP_COND_REF_OF_OP, ARGI_COND_REF_OF_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 49 */ ACPI_OP ("CreateField", ARGP_CREATE_FIELD_OP, ARGI_CREATE_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_FIELD | AML_CREATE), +/* 4A */ ACPI_OP ("Load", ARGP_LOAD_OP, ARGI_LOAD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_0R, AML_FLAGS_EXEC_1A_1T_0R), +/* 4B */ ACPI_OP ("Stall", ARGP_STALL_OP, ARGI_STALL_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 4C */ ACPI_OP ("Sleep", ARGP_SLEEP_OP, ARGI_SLEEP_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 4D */ ACPI_OP ("Acquire", ARGP_ACQUIRE_OP, ARGI_ACQUIRE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R), +/* 4E */ ACPI_OP ("Signal", ARGP_SIGNAL_OP, ARGI_SIGNAL_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 4F */ ACPI_OP ("Wait", ARGP_WAIT_OP, ARGI_WAIT_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R), +/* 50 */ ACPI_OP ("Reset", ARGP_RESET_OP, ARGI_RESET_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 51 */ ACPI_OP ("Release", ARGP_RELEASE_OP, ARGI_RELEASE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 52 */ ACPI_OP ("FromBCD", ARGP_FROM_BCD_OP, ARGI_FROM_BCD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), +/* 53 */ ACPI_OP ("ToBCD", ARGP_TO_BCD_OP, ARGI_TO_BCD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), +/* 54 */ ACPI_OP ("Unload", ARGP_UNLOAD_OP, ARGI_UNLOAD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 55 */ ACPI_OP ("Revision", ARGP_REVISION_OP, ARGI_REVISION_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 56 */ ACPI_OP ("Debug", ARGP_DEBUG_OP, ARGI_DEBUG_OP, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 57 */ ACPI_OP ("Fatal", ARGP_FATAL_OP, ARGI_FATAL_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_0T_0R, AML_FLAGS_EXEC_3A_0T_0R), +/* 58 */ ACPI_OP ("OperationRegion", ARGP_REGION_OP, ARGI_REGION_OP, ACPI_TYPE_REGION, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED | AML_DEFER), +/* 59 */ ACPI_OP ("Field", ARGP_FIELD_OP, ARGI_FIELD_OP, ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), +/* 5A */ ACPI_OP ("Device", ARGP_DEVICE_OP, ARGI_DEVICE_OP, ACPI_TYPE_DEVICE, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5B */ ACPI_OP ("Processor", ARGP_PROCESSOR_OP, ARGI_PROCESSOR_OP, ACPI_TYPE_PROCESSOR, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5C */ ACPI_OP ("PowerResource", ARGP_POWER_RES_OP, ARGI_POWER_RES_OP, ACPI_TYPE_POWER, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5D */ ACPI_OP ("ThermalZone", ARGP_THERMAL_ZONE_OP, ARGI_THERMAL_ZONE_OP, ACPI_TYPE_THERMAL, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5E */ ACPI_OP ("IndexField", ARGP_INDEX_FIELD_OP, ARGI_INDEX_FIELD_OP, ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), +/* 5F */ ACPI_OP ("BankField", ARGP_BANK_FIELD_OP, ARGI_BANK_FIELD_OP, ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), /* Internal opcodes that map to invalid AML opcodes */ -/* 60 */ ACPI_OP ("LNotEqual", ARGP_LNOTEQUAL_OP, ARGI_LNOTEQUAL_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS | AML_CONSTANT), -/* 61 */ ACPI_OP ("LLessEqual", ARGP_LLESSEQUAL_OP, ARGI_LLESSEQUAL_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS | AML_CONSTANT), -/* 62 */ ACPI_OP ("LGreaterEqual", ARGP_LGREATEREQUAL_OP, ARGI_LGREATEREQUAL_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS | AML_CONSTANT), -/* 63 */ ACPI_OP ("-NamePath-", ARGP_NAMEPATH_OP, ARGI_NAMEPATH_OP, INTERNAL_TYPE_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_NSOBJECT | AML_NSNODE ), -/* 64 */ ACPI_OP ("-MethodCall-", ARGP_METHODCALL_OP, ARGI_METHODCALL_OP, ACPI_TYPE_METHOD, AML_CLASS_METHOD_CALL, AML_TYPE_METHOD_CALL, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE), -/* 65 */ ACPI_OP ("-ByteList-", ARGP_BYTELIST_OP, ARGI_BYTELIST_OP, ACPI_TYPE_ANY, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), -/* 66 */ ACPI_OP ("-ReservedField-", ARGP_RESERVEDFIELD_OP, ARGI_RESERVEDFIELD_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), -/* 67 */ ACPI_OP ("-NamedField-", ARGP_NAMEDFIELD_OP, ARGI_NAMEDFIELD_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED ), -/* 68 */ ACPI_OP ("-AccessField-", ARGP_ACCESSFIELD_OP, ARGI_ACCESSFIELD_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), -/* 69 */ ACPI_OP ("-StaticString", ARGP_STATICSTRING_OP, ARGI_STATICSTRING_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), -/* 6A */ ACPI_OP ("-Return Value-", ARG_NONE, ARG_NONE, ACPI_TYPE_ANY, AML_CLASS_RETURN_VALUE, AML_TYPE_RETURN, AML_HAS_ARGS | AML_HAS_RETVAL), -/* 6B */ ACPI_OP ("-UNKNOWN_OP-", ARG_NONE, ARG_NONE, INTERNAL_TYPE_INVALID, AML_CLASS_UNKNOWN, AML_TYPE_BOGUS, AML_HAS_ARGS), -/* 6C */ ACPI_OP ("-ASCII_ONLY-", ARG_NONE, ARG_NONE, ACPI_TYPE_ANY, AML_CLASS_ASCII, AML_TYPE_BOGUS, AML_HAS_ARGS), -/* 6D */ ACPI_OP ("-PREFIX_ONLY-", ARG_NONE, ARG_NONE, ACPI_TYPE_ANY, AML_CLASS_PREFIX, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 60 */ ACPI_OP ("LNotEqual", ARGP_LNOTEQUAL_OP, ARGI_LNOTEQUAL_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS | AML_CONSTANT), +/* 61 */ ACPI_OP ("LLessEqual", ARGP_LLESSEQUAL_OP, ARGI_LLESSEQUAL_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS | AML_CONSTANT), +/* 62 */ ACPI_OP ("LGreaterEqual", ARGP_LGREATEREQUAL_OP, ARGI_LGREATEREQUAL_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS | AML_CONSTANT), +/* 63 */ ACPI_OP ("-NamePath-", ARGP_NAMEPATH_OP, ARGI_NAMEPATH_OP, ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_NSOBJECT | AML_NSNODE ), +/* 64 */ ACPI_OP ("-MethodCall-", ARGP_METHODCALL_OP, ARGI_METHODCALL_OP, ACPI_TYPE_METHOD, AML_CLASS_METHOD_CALL, AML_TYPE_METHOD_CALL, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE), +/* 65 */ ACPI_OP ("-ByteList-", ARGP_BYTELIST_OP, ARGI_BYTELIST_OP, ACPI_TYPE_ANY, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 66 */ ACPI_OP ("-ReservedField-", ARGP_RESERVEDFIELD_OP, ARGI_RESERVEDFIELD_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), +/* 67 */ ACPI_OP ("-NamedField-", ARGP_NAMEDFIELD_OP, ARGI_NAMEDFIELD_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED ), +/* 68 */ ACPI_OP ("-AccessField-", ARGP_ACCESSFIELD_OP, ARGI_ACCESSFIELD_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), +/* 69 */ ACPI_OP ("-StaticString", ARGP_STATICSTRING_OP, ARGI_STATICSTRING_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), +/* 6A */ ACPI_OP ("-Return Value-", ARG_NONE, ARG_NONE, ACPI_TYPE_ANY, AML_CLASS_RETURN_VALUE, AML_TYPE_RETURN, AML_HAS_ARGS | AML_HAS_RETVAL), +/* 6B */ ACPI_OP ("-UNKNOWN_OP-", ARG_NONE, ARG_NONE, ACPI_TYPE_INVALID, AML_CLASS_UNKNOWN, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 6C */ ACPI_OP ("-ASCII_ONLY-", ARG_NONE, ARG_NONE, ACPI_TYPE_ANY, AML_CLASS_ASCII, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 6D */ ACPI_OP ("-PREFIX_ONLY-", ARG_NONE, ARG_NONE, ACPI_TYPE_ANY, AML_CLASS_PREFIX, AML_TYPE_BOGUS, AML_HAS_ARGS), /* ACPI 2.0 opcodes */ -/* 6E */ ACPI_OP ("QwordConst", ARGP_QWORD_OP, ARGI_QWORD_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_CONSTANT), -/* 6F */ ACPI_OP ("Package /*Var*/", ARGP_VAR_PACKAGE_OP, ARGI_VAR_PACKAGE_OP, ACPI_TYPE_PACKAGE, AML_CLASS_CREATE, AML_TYPE_CREATE_OBJECT, AML_HAS_ARGS | AML_DEFER), -/* 70 */ ACPI_OP ("ConcatenateResTemplate", ARGP_CONCAT_RES_OP, ARGI_CONCAT_RES_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT), -/* 71 */ ACPI_OP ("Mod", ARGP_MOD_OP, ARGI_MOD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT), -/* 72 */ ACPI_OP ("CreateQWordField", ARGP_CREATE_QWORD_FIELD_OP,ARGI_CREATE_QWORD_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), -/* 73 */ ACPI_OP ("ToBuffer", ARGP_TO_BUFFER_OP, ARGI_TO_BUFFER_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), -/* 74 */ ACPI_OP ("ToDecimalString", ARGP_TO_DEC_STR_OP, ARGI_TO_DEC_STR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), -/* 75 */ ACPI_OP ("ToHexString", ARGP_TO_HEX_STR_OP, ARGI_TO_HEX_STR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), -/* 76 */ ACPI_OP ("ToInteger", ARGP_TO_INTEGER_OP, ARGI_TO_INTEGER_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), -/* 77 */ ACPI_OP ("ToString", ARGP_TO_STRING_OP, ARGI_TO_STRING_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT), -/* 78 */ ACPI_OP ("CopyObject", ARGP_COPY_OP, ARGI_COPY_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), -/* 79 */ ACPI_OP ("Mid", ARGP_MID_OP, ARGI_MID_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_1T_1R, AML_FLAGS_EXEC_3A_1T_1R | AML_CONSTANT), -/* 7A */ ACPI_OP ("Continue", ARGP_CONTINUE_OP, ARGI_CONTINUE_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), -/* 7B */ ACPI_OP ("LoadTable", ARGP_LOAD_TABLE_OP, ARGI_LOAD_TABLE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R), -/* 7C */ ACPI_OP ("DataTableRegion", ARGP_DATA_REGION_OP, ARGI_DATA_REGION_OP, ACPI_TYPE_REGION, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), -/* 7D */ ACPI_OP ("[EvalSubTree]", ARGP_SCOPE_OP, ARGI_SCOPE_OP, INTERNAL_TYPE_SCOPE, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE) +/* 6E */ ACPI_OP ("QwordConst", ARGP_QWORD_OP, ARGI_QWORD_OP, ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_CONSTANT), +/* 6F */ ACPI_OP ("Package /*Var*/", ARGP_VAR_PACKAGE_OP, ARGI_VAR_PACKAGE_OP, ACPI_TYPE_PACKAGE, AML_CLASS_CREATE, AML_TYPE_CREATE_OBJECT, AML_HAS_ARGS | AML_DEFER), +/* 70 */ ACPI_OP ("ConcatenateResTemplate", ARGP_CONCAT_RES_OP, ARGI_CONCAT_RES_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT), +/* 71 */ ACPI_OP ("Mod", ARGP_MOD_OP, ARGI_MOD_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT), +/* 72 */ ACPI_OP ("CreateQWordField", ARGP_CREATE_QWORD_FIELD_OP,ARGI_CREATE_QWORD_FIELD_OP, ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 73 */ ACPI_OP ("ToBuffer", ARGP_TO_BUFFER_OP, ARGI_TO_BUFFER_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), +/* 74 */ ACPI_OP ("ToDecimalString", ARGP_TO_DEC_STR_OP, ARGI_TO_DEC_STR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), +/* 75 */ ACPI_OP ("ToHexString", ARGP_TO_HEX_STR_OP, ARGI_TO_HEX_STR_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), +/* 76 */ ACPI_OP ("ToInteger", ARGP_TO_INTEGER_OP, ARGI_TO_INTEGER_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT), +/* 77 */ ACPI_OP ("ToString", ARGP_TO_STRING_OP, ARGI_TO_STRING_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT), +/* 78 */ ACPI_OP ("CopyObject", ARGP_COPY_OP, ARGI_COPY_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 79 */ ACPI_OP ("Mid", ARGP_MID_OP, ARGI_MID_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_1T_1R, AML_FLAGS_EXEC_3A_1T_1R | AML_CONSTANT), +/* 7A */ ACPI_OP ("Continue", ARGP_CONTINUE_OP, ARGI_CONTINUE_OP, ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 7B */ ACPI_OP ("LoadTable", ARGP_LOAD_TABLE_OP, ARGI_LOAD_TABLE_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R), +/* 7C */ ACPI_OP ("DataTableRegion", ARGP_DATA_REGION_OP, ARGI_DATA_REGION_OP, ACPI_TYPE_REGION, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 7D */ ACPI_OP ("[EvalSubTree]", ARGP_SCOPE_OP, ARGI_SCOPE_OP, ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE) /*! [End] no source code translation !*/ }; diff -Nru a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c --- a/drivers/acpi/pci_irq.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/pci_irq.c Mon Oct 28 16:32:36 2002 @@ -229,7 +229,7 @@ PCI Interrupt Routing Support -------------------------------------------------------------------------- */ -static int +int acpi_pci_irq_lookup ( int segment, int bus, @@ -285,8 +285,9 @@ * Attempt to derive an IRQ for this device from a parent bridge's * PCI interrupt routing entry (a.k.a. the "bridge swizzle"). */ - while (!irq && (bridge = bridge->bus->self)) { + while (!irq && bridge->bus->self) { pin = (pin + PCI_SLOT(bridge->devfn)) % 4; + bridge = bridge->bus->self; irq = acpi_pci_irq_lookup(0, bridge->bus->number, PCI_SLOT(bridge->devfn), pin); } diff -Nru a/drivers/acpi/power.c b/drivers/acpi/power.c --- a/drivers/acpi/power.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/power.c Mon Oct 28 16:32:37 2002 @@ -217,7 +217,7 @@ static int -acpi_power_off ( +acpi_power_off_device ( acpi_handle handle) { int result = 0; @@ -225,7 +225,7 @@ struct acpi_device *device = NULL; struct acpi_power_resource *resource = NULL; - ACPI_FUNCTION_TRACE("acpi_power_off"); + ACPI_FUNCTION_TRACE("acpi_power_off_device"); result = acpi_power_get_context(handle, &resource); if (result) @@ -358,7 +358,7 @@ * Then we dereference all power resources used in the current list. */ for (i=0; icount; i++) { - result = acpi_power_off(cl->handles[i]); + result = acpi_power_off_device(cl->handles[i]); if (result) goto end; } diff -Nru a/drivers/acpi/processor.c b/drivers/acpi/processor.c --- a/drivers/acpi/processor.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/processor.c Mon Oct 28 16:32:37 2002 @@ -43,6 +43,10 @@ #include "acpi_bus.h" #include "acpi_drivers.h" +#ifdef CONFIG_ACPI_PROCESSOR_PERF +#include +#endif + #define ACPI_PROCESSOR_COMPONENT 0x01000000 #define ACPI_PROCESSOR_CLASS "processor" #define ACPI_PROCESSOR_DRIVER_NAME "ACPI Processor Driver" @@ -224,6 +228,11 @@ static struct acpi_processor_errata errata; static void (*pm_idle_save)(void) = NULL; +#ifdef CONFIG_ACPI_PROCESSOR_PERF +static unsigned int cpufreq_usage_count = 0; +static struct cpufreq_driver *acpi_cpufreq_driver; +#endif + /* -------------------------------------------------------------------------- Errata Handling @@ -830,7 +839,7 @@ /* -------------------------------------------------------------------------- Performance Management -------------------------------------------------------------------------- */ - +#ifdef CONFIG_ACPI_PROCESSOR_PERF static int acpi_processor_get_platform_limit ( struct acpi_processor* pr) @@ -1037,6 +1046,7 @@ u16 port = 0; u8 value = 0; int i = 0; + struct cpufreq_freqs cpufreq_freqs; ACPI_FUNCTION_TRACE("acpi_processor_set_performance"); @@ -1068,6 +1078,14 @@ ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Transitioning from P%d to P%d\n", pr->performance.state, state)); + /* cpufreq frequency struct */ + cpufreq_freqs.cpu = pr->id; + cpufreq_freqs.old = pr->performance.states[pr->performance.state].core_frequency; + cpufreq_freqs.new = pr->performance.states[state].core_frequency; + + /* notify cpufreq */ + cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE); + /* * First we write the target state's 'control' value to the * control_register. @@ -1101,7 +1119,15 @@ udelay(10); } + /* notify cpufreq */ + cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE); + if (value != pr->performance.states[state].status) { + unsigned int tmp = cpufreq_freqs.new; + cpufreq_freqs.new = cpufreq_freqs.old; + cpufreq_freqs.old = tmp; + cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE); + cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE); ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Transition failed\n")); return_VALUE(-ENODEV); } @@ -1155,6 +1181,23 @@ return_VALUE(0); } +#else + + +static int +acpi_processor_get_performance_info ( + struct acpi_processor *pr) +{ + ACPI_FUNCTION_TRACE("acpi_processor_get_performance_info_dummy"); + if (!pr) + return_VALUE(-EINVAL); + pr->flags.performance = 0; + return_VALUE(0); +} +#endif + + + /* -------------------------------------------------------------------------- @@ -1400,17 +1443,24 @@ if (!pr->flags.limit) return_VALUE(-ENODEV); +#ifdef CONFIG_ACPI_PROCESSOR_PERF if (pr->flags.performance) { px = pr->performance.platform_limit; if (pr->limit.user.px > px) px = pr->limit.user.px; if (pr->limit.thermal.px > px) px = pr->limit.thermal.px; - - result = acpi_processor_set_performance(pr, px); + { + struct cpufreq_policy policy; + policy.cpu = pr->id; + cpufreq_get_policy(&policy, pr->id); + policy.max = pr->performance.states[px].core_frequency * 1000; + result = cpufreq_set_policy(&policy); + } if (result) goto end; } +#endif if (pr->flags.throttling) { if (pr->limit.user.tx > tx) @@ -1481,9 +1531,6 @@ px = pr->limit.thermal.px; tx = pr->limit.thermal.tx; - px = pr->limit.thermal.px; - tx = pr->limit.thermal.tx; - switch (type) { case ACPI_PROCESSOR_LIMIT_NONE: @@ -1562,6 +1609,271 @@ return_VALUE(0); } +/* -------------------------------------------------------------------------- + cpufreq interface + -------------------------------------------------------------------------- */ +#ifdef CONFIG_ACPI_PROCESSOR_PERF +static void +acpi_cpufreq_setpolicy ( + struct cpufreq_policy *policy) +{ + unsigned int cpu = 0; + unsigned int i = 0; + struct acpi_processor *pr = NULL; + unsigned int next_state = 0; + unsigned int result = 0; + + ACPI_FUNCTION_TRACE("acpi_cpufreq_setpolicy"); + + if (!policy) + return_VOID; + + /* get a present, initialized CPU */ + if (policy->cpu == CPUFREQ_ALL_CPUS) + { + for (i=0; icpu; + pr = processors[cpu]; + if (!pr) + return_VOID; + } + + /* select appropriate P-State */ + if (policy->policy == CPUFREQ_POLICY_POWERSAVE) + { + for (i=(pr->performance.state_count - 1); i>= pr->limit.state.px; i--) + { + unsigned int state_freq = pr->performance.states[i].core_frequency * 1000; + if ((policy->min <= state_freq) && + (policy->max >= state_freq)) + { + next_state = i; + break; + } + } + } else { + for (i=pr->limit.state.px; i < pr->performance.state_count; i++) + { + unsigned int state_freq = pr->performance.states[i].core_frequency * 1000; + if ((policy->min <= state_freq) && + (policy->max >= state_freq)) + { + next_state = i; + break; + } + } + } + + /* set one or all CPUs to the new state */ + if (policy->cpu == CPUFREQ_ALL_CPUS) { + for (i=0; icpu == CPUFREQ_ALL_CPUS) + { + for (i=0; icpu; + pr = processors[cpu]; + if (!pr) + return_VOID; + } + + /* first check if min and max are within valid limits */ + cpufreq_verify_within_limits( + policy, + pr->performance.states[pr->performance.state_count - 1].core_frequency * 1000, + pr->performance.states[pr->limit.state.px].core_frequency * 1000); + + /* now check if at least one value is within this limit */ + for (i=pr->limit.state.px; i < pr->performance.state_count; i++) + { + unsigned int state_freq = pr->performance.states[i].core_frequency * 1000; + if ((policy->min <= state_freq) && + (policy->max >= state_freq)) + number_states++; + if (state_freq > policy->max) + next_larger_state = i; + } + + if (number_states) + return_VOID; + + /* round up now */ + policy->max = pr->performance.states[next_larger_state].core_frequency * 1000; + + return_VOID; +} + +static int +acpi_cpufreq_init ( + struct acpi_processor *pr) +{ + int result = 0; + int i = 0; + int current_state = 0; + struct cpufreq_driver *driver; + + ACPI_FUNCTION_TRACE("acpi_cpufreq_init"); + + if (cpufreq_usage_count) { + if (pr->flags.performance == 1) + cpufreq_usage_count++; + return_VALUE(0); + } + + /* test if it works */ + current_state = pr->performance.state; + + if (current_state == pr->limit.state.px) { + result = acpi_processor_set_performance(pr, (pr->performance.state_count - 1)); + if (result) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Disabled P-States due to failure while switching.\n")); + pr->flags.performance = 0; + return_VALUE(-ENODEV); + } + } + + result = acpi_processor_set_performance(pr, pr->limit.state.px); + if (result) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Disabled P-States due to failure while switching.\n")); + pr->flags.performance = 0; + return_VALUE(-ENODEV); + } + + if (current_state != 0) { + result = acpi_processor_set_performance(pr, current_state); + if (result) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Disabled P-States due to failure while switching.\n")); + pr->flags.performance = 0; + return_VALUE(-ENODEV); + } + } + + /* initialization of main "cpufreq" code*/ + driver = kmalloc(sizeof(struct cpufreq_driver) + + NR_CPUS * sizeof(struct cpufreq_policy), GFP_KERNEL); + if (!driver) + return_VALUE(-ENOMEM); + + driver->policy = (struct cpufreq_policy *) (driver + 1); + +#ifdef CONFIG_CPU_FREQ_24_API + driver->cpu_min_freq = pr->performance.states[pr->performance.state_count - 1].core_frequency * 1000; + for (i=0;icpu_cur_freq[0] = pr->performance.states[current_state].core_frequency * 1000; +#endif + + driver->verify = &acpi_cpufreq_verify; + driver->setpolicy = &acpi_cpufreq_setpolicy; + + for (i=0;ipolicy[i].cpu = pr->id; + driver->policy[i].min = pr->performance.states[pr->performance.state_count - 1].core_frequency * 1000; + driver->policy[i].max = pr->performance.states[pr->limit.state.px].core_frequency * 1000; + driver->policy[i].max_cpu_freq = pr->performance.states[0].core_frequency * 1000; + driver->policy[i].policy = ( pr->performance.states[current_state].core_frequency * 1000 == driver->policy[i].max) ? + CPUFREQ_POLICY_PERFORMANCE : CPUFREQ_POLICY_POWERSAVE; + } + + acpi_cpufreq_driver = driver; + result = cpufreq_register(driver); + if (result) { + kfree(driver); + acpi_cpufreq_driver = NULL; + return_VALUE(result); + } + + cpufreq_usage_count++; + + return_VALUE(0); +} + +static int +acpi_cpufreq_exit ( + struct acpi_processor *pr) +{ + int result = 0; + + ACPI_FUNCTION_TRACE("acpi_cpufreq_exit"); + + if (!pr) + return_VALUE(-EINVAL); + + if (pr->flags.performance) + cpufreq_usage_count--; + + if (!cpufreq_usage_count) { + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "Removing cpufreq driver\n")); + result = cpufreq_unregister(); + } + + return_VALUE(result); +} +#else +static int +acpi_cpufreq_init ( + struct acpi_processor *pr) +{ + ACPI_FUNCTION_TRACE("acpi_cpufreq_init_dummy"); + return_VALUE(0); +} + + +static int +acpi_cpufreq_exit ( + struct acpi_processor *pr) +{ + ACPI_FUNCTION_TRACE("acpi_cpufreq_exit_dummy"); + return_VALUE(0); +} +#endif /* -------------------------------------------------------------------------- FS Interface (/proc) @@ -1688,7 +2000,7 @@ return_VALUE(len); } - +#ifdef CONFIG_ACPI_PROCESSOR_PERF static int acpi_processor_read_performance ( char *page, @@ -1739,7 +2051,6 @@ return_VALUE(len); } - static int acpi_processor_write_performance ( struct file *file, @@ -1750,6 +2061,8 @@ int result = 0; struct acpi_processor *pr = (struct acpi_processor *) data; char state_string[12] = {'\0'}; + unsigned int new_state = 0; + struct cpufreq_policy policy; ACPI_FUNCTION_TRACE("acpi_processor_write_performance"); @@ -1760,14 +2073,20 @@ return_VALUE(-EFAULT); state_string[count] = '\0'; + new_state = simple_strtoul(state_string, NULL, 0); - result = acpi_processor_set_performance(pr, - simple_strtoul(state_string, NULL, 0)); + cpufreq_get_policy(&policy, pr->id); + + policy.cpu = pr->id; + policy.max = pr->performance.states[new_state].core_frequency * 1000; + + result = cpufreq_set_policy(&policy); if (result) return_VALUE(result); return_VALUE(count); } +#endif static int @@ -2005,6 +2324,7 @@ entry->data = acpi_driver_data(device); } +#ifdef CONFIG_ACPI_PROCESSOR_PERF /* 'performance' [R/W] */ entry = create_proc_entry(ACPI_PROCESSOR_FILE_PERFORMANCE, S_IFREG|S_IRUGO|S_IWUSR, acpi_device_dir(device)); @@ -2017,6 +2337,7 @@ entry->write_proc = acpi_processor_write_performance; entry->data = acpi_driver_data(device); } +#endif /* 'throttling' [R/W] */ entry = create_proc_entry(ACPI_PROCESSOR_FILE_THROTTLING, @@ -2139,6 +2460,7 @@ acpi_processor_get_power_info(pr); acpi_processor_get_performance_info(pr); + acpi_cpufreq_init(pr); acpi_processor_get_throttling_info(pr); acpi_processor_get_limit_info(pr); @@ -2166,9 +2488,15 @@ switch (event) { case ACPI_PROCESSOR_NOTIFY_PERFORMANCE: +#ifdef CONFIG_ACPI_PROCESSOR_PERF result = acpi_processor_get_platform_limit(pr); if (!result) acpi_processor_apply_limit(pr); +#else + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, + "Please use kernel with Processor Performance States support included!\n")); + result = 0; +#endif acpi_bus_generate_event(device, event, pr->performance.platform_limit); @@ -2288,6 +2616,7 @@ return_VALUE(-ENODEV); } + acpi_cpufreq_exit(pr); acpi_processor_remove_fs(device); processors[pr->id] = NULL; diff -Nru a/drivers/acpi/resources/rscalc.c b/drivers/acpi/resources/rscalc.c --- a/drivers/acpi/resources/rscalc.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/resources/rscalc.c Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: rscalc - Calculate stream and list lengths - * $Revision: 43 $ + * $Revision: 44 $ * ******************************************************************************/ @@ -771,7 +771,7 @@ for (table_index = 0; table_index < 4 && !name_found; table_index++) { if ((ACPI_TYPE_STRING == ACPI_GET_OBJECT_TYPE (*sub_object_list)) || - ((INTERNAL_TYPE_REFERENCE == ACPI_GET_OBJECT_TYPE (*sub_object_list)) && + ((ACPI_TYPE_LOCAL_REFERENCE == ACPI_GET_OBJECT_TYPE (*sub_object_list)) && ((*sub_object_list)->reference.opcode == AML_INT_NAMEPATH_OP))) { name_found = TRUE; } diff -Nru a/drivers/acpi/resources/rscreate.c b/drivers/acpi/resources/rscreate.c --- a/drivers/acpi/resources/rscreate.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/resources/rscreate.c Mon Oct 28 16:32:36 2002 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: rscreate - Create resource lists/tables - * $Revision: 58 $ + * $Revision: 61 $ * ******************************************************************************/ @@ -66,7 +66,8 @@ ACPI_FUNCTION_TRACE ("Rs_create_resource_list"); - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Byte_stream_buffer = %p\n", byte_stream_buffer)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Byte_stream_buffer = %p\n", + byte_stream_buffer)); /* * Params already validated, so we don't re-validate here @@ -135,13 +136,13 @@ acpi_buffer *output_buffer) { u8 *buffer; - acpi_operand_object **top_object_list = NULL; - acpi_operand_object **sub_object_list = NULL; - acpi_operand_object *package_element = NULL; + acpi_operand_object **top_object_list; + acpi_operand_object **sub_object_list; + acpi_operand_object *obj_desc; ACPI_SIZE buffer_size_needed = 0; - u32 number_of_elements = 0; - u32 index = 0; - acpi_pci_routing_table *user_prt = NULL; + u32 number_of_elements; + u32 index; + acpi_pci_routing_table *user_prt; acpi_namespace_node *node; acpi_status status; acpi_buffer path_buffer; @@ -161,7 +162,8 @@ return_ACPI_STATUS (status); } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Buffer_size_needed = %X\n", (u32) buffer_size_needed)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Buffer_size_needed = %X\n", + (u32) buffer_size_needed)); /* Validate/Allocate/Clear caller buffer */ @@ -171,7 +173,8 @@ } /* - * Loop through the ACPI_INTERNAL_OBJECTS - Each object should contain an + * Loop through the ACPI_INTERNAL_OBJECTS - Each object + * should be a package that in turn contains an * acpi_integer Address, a u8 Pin, a Name and a u8 Source_index. */ top_object_list = package_object->package.elements; @@ -194,81 +197,98 @@ * The minus four is to subtract the size of the u8 Source[4] member * because it is added below. */ - user_prt->length = (sizeof (acpi_pci_routing_table) -4); + user_prt->length = (sizeof (acpi_pci_routing_table) - 4); /* - * Dereference the sub-package + * Each element of the top-level package must also be a package */ - package_element = *top_object_list; + if (ACPI_GET_OBJECT_TYPE (*top_object_list) != ACPI_TYPE_PACKAGE) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "(PRT[%X]) Need sub-package, found %s\n", + index, acpi_ut_get_object_type_name (*top_object_list))); + return_ACPI_STATUS (AE_AML_OPERAND_TYPE); + } + + /* Each sub-package must be of length 4 */ + + if ((*top_object_list)->package.count != 4) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "(PRT[%X]) Need package of length 4, found length %d\n", + index, (*top_object_list)->package.count)); + return_ACPI_STATUS (AE_AML_PACKAGE_LIMIT); + } /* + * Dereference the sub-package. * The Sub_object_list will now point to an array of the four IRQ - * elements: Address, Pin, Source and Source_index + * elements: [Address, Pin, Source, Source_index] */ - sub_object_list = package_element->package.elements; + sub_object_list = (*top_object_list)->package.elements; /* - * 1) First subobject: Dereference the Address + * 1) First subobject: Dereference the PRT.Address */ - if (ACPI_GET_OBJECT_TYPE (*sub_object_list) == ACPI_TYPE_INTEGER) { - user_prt->address = (*sub_object_list)->integer.value; + obj_desc = sub_object_list[0]; + if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_INTEGER) { + user_prt->address = obj_desc->integer.value; } else { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need Integer, found %s\n", - acpi_ut_get_object_type_name (*sub_object_list))); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "(PRT[%X].Address) Need Integer, found %s\n", + index, acpi_ut_get_object_type_name (obj_desc))); return_ACPI_STATUS (AE_BAD_DATA); } /* - * 2) Second subobject: Dereference the Pin + * 2) Second subobject: Dereference the PRT.Pin */ - sub_object_list++; - - if (ACPI_GET_OBJECT_TYPE (*sub_object_list) == ACPI_TYPE_INTEGER) { - user_prt->pin = (u32) (*sub_object_list)->integer.value; + obj_desc = sub_object_list[1]; + if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_INTEGER) { + user_prt->pin = (u32) obj_desc->integer.value; } else { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need Integer, found %s\n", - acpi_ut_get_object_type_name (*sub_object_list))); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "(PRT[%X].Pin) Need Integer, found %s\n", + index, acpi_ut_get_object_type_name (obj_desc))); return_ACPI_STATUS (AE_BAD_DATA); } /* - * 3) Third subobject: Dereference the Source Name + * 3) Third subobject: Dereference the PRT.Source_name */ - sub_object_list++; - - switch (ACPI_GET_OBJECT_TYPE (*sub_object_list)) { - case INTERNAL_TYPE_REFERENCE: - - if ((*sub_object_list)->reference.opcode != AML_INT_NAMEPATH_OP) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need name, found reference op %X\n", - (*sub_object_list)->reference.opcode)); + obj_desc = sub_object_list[2]; + switch (ACPI_GET_OBJECT_TYPE (obj_desc)) { + case ACPI_TYPE_LOCAL_REFERENCE: + + if (obj_desc->reference.opcode != AML_INT_NAMEPATH_OP) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "(PRT[%X].Source) Need name, found reference op %X\n", + index, obj_desc->reference.opcode)); return_ACPI_STATUS (AE_BAD_DATA); } - node = (*sub_object_list)->reference.node; + node = obj_desc->reference.node; /* Use *remaining* length of the buffer as max for pathname */ path_buffer.length = output_buffer->length - - (u32) ((u8 *) user_prt->source - (u8 *) output_buffer->pointer); + (u32) ((u8 *) user_prt->source - + (u8 *) output_buffer->pointer); path_buffer.pointer = user_prt->source; status = acpi_ns_handle_to_pathname ((acpi_handle) node, &path_buffer); - user_prt->length += ACPI_STRLEN (user_prt->source) + 1; /* include null terminator */ + user_prt->length += (u32) ACPI_STRLEN (user_prt->source) + 1; /* include null terminator */ break; case ACPI_TYPE_STRING: - ACPI_STRCPY (user_prt->source, - (*sub_object_list)->string.pointer); + ACPI_STRCPY (user_prt->source, obj_desc->string.pointer); /* Add to the Length field the length of the string */ - user_prt->length += (*sub_object_list)->string.length; + user_prt->length += obj_desc->string.length; break; @@ -285,8 +305,9 @@ default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need Integer, found %s\n", - acpi_ut_get_object_type_name (*sub_object_list))); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "(PRT[%X].Source) Need Ref/String/Integer, found %s\n", + index, acpi_ut_get_object_type_name (obj_desc))); return_ACPI_STATUS (AE_BAD_DATA); } @@ -295,20 +316,20 @@ user_prt->length = ACPI_ROUND_UP_TO_64_bITS (user_prt->length); /* - * 4) Fourth subobject: Dereference the Source Index + * 4) Fourth subobject: Dereference the PRT.Source_index */ - sub_object_list++; - - if (ACPI_GET_OBJECT_TYPE (*sub_object_list) == ACPI_TYPE_INTEGER) { - user_prt->source_index = (u32) (*sub_object_list)->integer.value; + obj_desc = sub_object_list[3]; + if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_INTEGER) { + user_prt->source_index = (u32) obj_desc->integer.value; } else { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Need Integer, found %s\n", - acpi_ut_get_object_type_name (*sub_object_list))); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "(PRT[%X].Source_index) Need Integer, found %s\n", + index, acpi_ut_get_object_type_name (obj_desc))); return_ACPI_STATUS (AE_BAD_DATA); } - /* Point to the next acpi_operand_object */ + /* Point to the next acpi_operand_object in the top level package */ top_object_list++; } @@ -349,7 +370,8 @@ ACPI_FUNCTION_TRACE ("Rs_create_byte_stream"); - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Linked_list_buffer = %p\n", linked_list_buffer)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Linked_list_buffer = %p\n", + linked_list_buffer)); /* * Params already validated, so we don't re-validate here diff -Nru a/drivers/acpi/tables/tbconvrt.c b/drivers/acpi/tables/tbconvrt.c --- a/drivers/acpi/tables/tbconvrt.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/tables/tbconvrt.c Mon Oct 28 16:32:36 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbconvrt - ACPI Table conversion utilities - * $Revision: 43 $ + * $Revision: 44 $ * *****************************************************************************/ @@ -137,7 +137,6 @@ /* Point the table descriptor to the new table */ table_info->pointer = (acpi_table_header *) new_table; - table_info->base_pointer = (acpi_table_header *) new_table; table_info->length = table_size; table_info->allocation = ACPI_MEM_ALLOCATED; @@ -385,7 +384,6 @@ /* Install the new table */ table_desc->pointer = (acpi_table_header *) acpi_gbl_FADT; - table_desc->base_pointer = acpi_gbl_FADT; table_desc->allocation = ACPI_MEM_ALLOCATED; table_desc->length = sizeof (fadt_descriptor_rev2); diff -Nru a/drivers/acpi/tables/tbget.c b/drivers/acpi/tables/tbget.c --- a/drivers/acpi/tables/tbget.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/tables/tbget.c Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbget - ACPI Table get* routines - * $Revision: 80 $ + * $Revision: 81 $ * *****************************************************************************/ @@ -386,7 +386,6 @@ table_info->pointer = full_table; table_info->length = (ACPI_SIZE) header->length; table_info->allocation = allocation; - table_info->base_pointer = full_table; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Found table [%4.4s] at %8.8X%8.8X, mapped/copied to %p\n", diff -Nru a/drivers/acpi/tables/tbgetall.c b/drivers/acpi/tables/tbgetall.c --- a/drivers/acpi/tables/tbgetall.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/tables/tbgetall.c Mon Oct 28 16:32:36 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbgetall - Get all required ACPI tables - * $Revision: 2 $ + * $Revision: 3 $ * *****************************************************************************/ @@ -218,7 +218,13 @@ * Get the tables needed by this subsystem (FADT and any SSDTs). * NOTE: All other tables are completely ignored at this time. */ - acpi_tb_get_primary_table (&address, &table_info); + status = acpi_tb_get_primary_table (&address, &table_info); + if ((status != AE_OK) && (status != AE_TABLE_NOT_SUPPORTED)) { + ACPI_REPORT_WARNING (("%s, while getting table at %8.8X%8.8X\n", + acpi_format_exception (status), + ACPI_HIDWORD (address.pointer.value), + ACPI_LODWORD (address.pointer.value))); + } } /* We must have a FADT to continue */ diff -Nru a/drivers/acpi/tables/tbinstal.c b/drivers/acpi/tables/tbinstal.c --- a/drivers/acpi/tables/tbinstal.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/tables/tbinstal.c Mon Oct 28 16:32:36 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbinstal - ACPI table installation and removal - * $Revision: 63 $ + * $Revision: 64 $ * *****************************************************************************/ @@ -286,7 +286,6 @@ table_desc->type = table_info->type; table_desc->pointer = table_info->pointer; - table_desc->base_pointer = table_info->base_pointer; table_desc->length = table_info->length; table_desc->allocation = table_info->allocation; table_desc->aml_start = (u8 *) (table_desc->pointer + 1), @@ -480,12 +479,12 @@ case ACPI_MEM_ALLOCATED: - ACPI_MEM_FREE (table_desc->base_pointer); + ACPI_MEM_FREE (table_desc->pointer); break; case ACPI_MEM_MAPPED: - acpi_os_unmap_memory (table_desc->base_pointer, table_desc->length); + acpi_os_unmap_memory (table_desc->pointer, table_desc->length); break; default: diff -Nru a/drivers/acpi/tables/tbrsdt.c b/drivers/acpi/tables/tbrsdt.c --- a/drivers/acpi/tables/tbrsdt.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/tables/tbrsdt.c Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbrsdt - ACPI RSDT table utilities - * $Revision: 3 $ + * $Revision: 4 $ * *****************************************************************************/ @@ -108,7 +108,6 @@ table_info.pointer = ACPI_CAST_PTR (acpi_table_header, rsdp); table_info.length = sizeof (RSDP_DESCRIPTOR); table_info.allocation = ACPI_MEM_MAPPED; - table_info.base_pointer = rsdp; /* Save the table pointers and allocation info */ diff -Nru a/drivers/acpi/utilities/utcopy.c b/drivers/acpi/utilities/utcopy.c --- a/drivers/acpi/utilities/utcopy.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/utilities/utcopy.c Mon Oct 28 16:32:36 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utcopy - Internal to external object translation utilities - * $Revision: 104 $ + * $Revision: 105 $ * *****************************************************************************/ @@ -113,7 +113,7 @@ break; - case INTERNAL_TYPE_REFERENCE: + case ACPI_TYPE_LOCAL_REFERENCE: /* * This is an object reference. Attempt to dereference it. diff -Nru a/drivers/acpi/utilities/utdelete.c b/drivers/acpi/utilities/utdelete.c --- a/drivers/acpi/utilities/utdelete.c Mon Oct 28 16:32:36 2002 +++ b/drivers/acpi/utilities/utdelete.c Mon Oct 28 16:32:36 2002 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: utdelete - object deletion and reference count utilities - * $Revision: 91 $ + * $Revision: 92 $ * ******************************************************************************/ @@ -417,7 +417,7 @@ break; - case INTERNAL_TYPE_ADDRESS_HANDLER: + case ACPI_TYPE_LOCAL_ADDRESS_HANDLER: /* Must walk list of address handlers */ @@ -462,7 +462,7 @@ break; - case INTERNAL_TYPE_REGION_FIELD: + case ACPI_TYPE_LOCAL_REGION_FIELD: status = acpi_ut_create_update_state_and_push ( object->field.region_obj, action, &state_list); @@ -472,7 +472,7 @@ break; - case INTERNAL_TYPE_BANK_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: status = acpi_ut_create_update_state_and_push ( object->bank_field.bank_obj, action, &state_list); @@ -488,7 +488,7 @@ break; - case INTERNAL_TYPE_INDEX_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: status = acpi_ut_create_update_state_and_push ( object->index_field.index_obj, action, &state_list); @@ -505,7 +505,7 @@ case ACPI_TYPE_REGION: - case INTERNAL_TYPE_REFERENCE: + case ACPI_TYPE_LOCAL_REFERENCE: default: /* No subobjects */ diff -Nru a/drivers/acpi/utilities/utglobal.c b/drivers/acpi/utilities/utglobal.c --- a/drivers/acpi/utilities/utglobal.c Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/utilities/utglobal.c Mon Oct 28 16:32:35 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utglobal - Global variables for the ACPI subsystem - * $Revision: 171 $ + * $Revision: 172 $ * *****************************************************************************/ @@ -176,11 +176,11 @@ */ const acpi_predefined_names acpi_gbl_pre_defined_names[] = -{ {"_GPE", INTERNAL_TYPE_SCOPE, NULL}, - {"_PR_", INTERNAL_TYPE_SCOPE, NULL}, +{ {"_GPE", ACPI_TYPE_LOCAL_SCOPE, NULL}, + {"_PR_", ACPI_TYPE_LOCAL_SCOPE, NULL}, {"_SB_", ACPI_TYPE_DEVICE, NULL}, - {"_SI_", INTERNAL_TYPE_SCOPE, NULL}, - {"_TZ_", INTERNAL_TYPE_SCOPE, NULL}, + {"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL}, + {"_TZ_", ACPI_TYPE_LOCAL_SCOPE, NULL}, {"_REV", ACPI_TYPE_INTEGER, "2"}, {"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME}, {"_GL_", ACPI_TYPE_MUTEX, "0"}, @@ -225,17 +225,10 @@ ACPI_NS_NORMAL, /* 23 Address Handler */ ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL, /* 24 Resource Desc */ ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL, /* 25 Resource Field */ - ACPI_NS_NORMAL, /* 26 Def_field_defn */ - ACPI_NS_NORMAL, /* 27 Bank_field_defn */ - ACPI_NS_NORMAL, /* 28 Index_field_defn */ - ACPI_NS_NORMAL, /* 29 If */ - ACPI_NS_NORMAL, /* 30 Else */ - ACPI_NS_NORMAL, /* 31 While */ - ACPI_NS_NEWSCOPE, /* 32 Scope */ - ACPI_NS_LOCAL, /* 33 Def_any */ - ACPI_NS_NORMAL, /* 34 Extra */ - ACPI_NS_NORMAL, /* 35 Data */ - ACPI_NS_NORMAL /* 36 Invalid */ + ACPI_NS_NEWSCOPE, /* 26 Scope */ + ACPI_NS_NORMAL, /* 27 Extra */ + ACPI_NS_NORMAL, /* 28 Data */ + ACPI_NS_NORMAL /* 29 Invalid */ }; @@ -481,17 +474,10 @@ /* 23 */ "Addr_handler", /* 24 */ "Resource_desc", /* 25 */ "Resource_fld", - /* 26 */ "Region_fld_dfn", - /* 27 */ "Bank_fld_dfn", - /* 28 */ "Index_fld_dfn", - /* 29 */ "If", - /* 30 */ "Else", - /* 31 */ "While", - /* 32 */ "Scope", - /* 33 */ "Def_any", - /* 34 */ "Extra", - /* 35 */ "Data", - /* 36 */ "Invalid" + /* 26 */ "Scope", + /* 27 */ "Extra", + /* 28 */ "Data", + /* 39 */ "Invalid" }; @@ -500,7 +486,7 @@ acpi_object_type type) { - if (type > INTERNAL_TYPE_INVALID) + if (type > ACPI_TYPE_INVALID) { return ((NATIVE_CHAR *) acpi_gbl_bad_type); } @@ -563,7 +549,7 @@ * * FUNCTION: Acpi_ut_valid_object_type * - * PARAMETERS: None. + * PARAMETERS: Type - Object type to be validated * * RETURN: TRUE if valid object type * @@ -576,13 +562,11 @@ acpi_object_type type) { - if (type > ACPI_TYPE_MAX) + if (type > ACPI_TYPE_LOCAL_MAX) { - if ((type < INTERNAL_TYPE_BEGIN) || - (type > INTERNAL_TYPE_MAX)) - { - return (FALSE); - } + /* Note: Assumes all TYPEs are contiguous (external/local) */ + + return (FALSE); } return (TRUE); @@ -767,7 +751,7 @@ acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME; acpi_gbl_root_node_struct.descriptor = ACPI_DESC_TYPE_NAMED; - acpi_gbl_root_node_struct.type = ACPI_TYPE_ANY; + acpi_gbl_root_node_struct.type = ACPI_TYPE_DEVICE; acpi_gbl_root_node_struct.child = NULL; acpi_gbl_root_node_struct.peer = NULL; acpi_gbl_root_node_struct.object = NULL; diff -Nru a/drivers/acpi/utilities/utmisc.c b/drivers/acpi/utilities/utmisc.c --- a/drivers/acpi/utilities/utmisc.c Mon Oct 28 16:32:35 2002 +++ b/drivers/acpi/utilities/utmisc.c Mon Oct 28 16:32:35 2002 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: utmisc - common utility procedures - * $Revision: 84 $ + * $Revision: 85 $ * ******************************************************************************/ @@ -30,6 +30,98 @@ #define _COMPONENT ACPI_UTILITIES ACPI_MODULE_NAME ("utmisc") + + +/******************************************************************************* + * + * FUNCTION: Acpi_ut_print_string + * + * PARAMETERS: String - Null terminated ASCII string + * + * RETURN: None + * + * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape + * sequences. + * + ******************************************************************************/ + +void +acpi_ut_print_string ( + char *string, + u8 max_length) +{ + u32 i; + + + if (!string) { + acpi_os_printf ("<\"NULL STRING PTR\">"); + return; + } + + acpi_os_printf ("\""); + for (i = 0; string[i] && (i < max_length); i++) { + /* Escape sequences */ + + switch (string[i]) { + case 0x07: + acpi_os_printf ("\\a"); /* BELL */ + break; + + case 0x08: + acpi_os_printf ("\\b"); /* BACKSPACE */ + break; + + case 0x0C: + acpi_os_printf ("\\f"); /* FORMFEED */ + break; + + case 0x0A: + acpi_os_printf ("\\n"); /* LINEFEED */ + break; + + case 0x0D: + acpi_os_printf ("\\r"); /* CARRIAGE RETURN*/ + break; + + case 0x09: + acpi_os_printf ("\\t"); /* HORIZONTAL TAB */ + break; + + case 0x0B: + acpi_os_printf ("\\v"); /* VERTICAL TAB */ + break; + + case '\'': /* Single Quote */ + case '\"': /* Double Quote */ + case '\\': /* Backslash */ + acpi_os_printf ("\\%c", (int) string[i]); + break; + + default: + + /* Check for printable character or hex escape */ + + if (ACPI_IS_PRINT (string[i])) + { + /* This is a normal character */ + + acpi_os_printf ("%c", (int) string[i]); + } + else + { + /* All others will be Hex escapes */ + + acpi_os_printf ("\\x%2.2X", (s32) string[i]); + } + break; + } + } + acpi_os_printf ("\""); + + if (i == max_length && string[i]) { + acpi_os_printf ("..."); + } +} /******************************************************************************* diff -Nru a/drivers/acpi/utilities/utobject.c b/drivers/acpi/utilities/utobject.c --- a/drivers/acpi/utilities/utobject.c Mon Oct 28 16:32:37 2002 +++ b/drivers/acpi/utilities/utobject.c Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utobject - ACPI object create/delete/size/cache routines - * $Revision: 76 $ + * $Revision: 77 $ * *****************************************************************************/ @@ -87,7 +87,7 @@ return_PTR (NULL); } - second_object->common.type = INTERNAL_TYPE_EXTRA; + second_object->common.type = ACPI_TYPE_LOCAL_EXTRA; second_object->common.reference_count = 1; /* Link the second object to the first */ @@ -352,7 +352,7 @@ break; - case INTERNAL_TYPE_REFERENCE: + case ACPI_TYPE_LOCAL_REFERENCE: switch (internal_object->reference.opcode) { case AML_INT_NAMEPATH_OP: diff -Nru a/drivers/atm/Makefile b/drivers/atm/Makefile --- a/drivers/atm/Makefile Mon Oct 28 16:32:35 2002 +++ b/drivers/atm/Makefile Mon Oct 28 16:32:35 2002 @@ -40,7 +40,7 @@ fore_200e-objs += fore200e_pca_fw.o # guess the target endianess to choose the right PCA-200E firmware image ifeq ($(CONFIG_ATM_FORE200E_PCA_DEFAULT_FW),y) - CONFIG_ATM_FORE200E_PCA_FW = $(shell if test -n "`$(CC) -E -dM $(src)/../../include/asm/byteorder.h | grep ' __LITTLE_ENDIAN '`"; then echo pca200e.bin; else echo pca200e_ecd.bin2; fi) + CONFIG_ATM_FORE200E_PCA_FW = $(shell if test -n "`$(CC) -E -dM $(src)/../../include/asm/byteorder.h | grep ' __LITTLE_ENDIAN '`"; then echo $(obj)/pca200e.bin; else echo $(obj)/pca200e_ecd.bin2; fi) endif endif diff -Nru a/drivers/atm/firestream.c b/drivers/atm/firestream.c --- a/drivers/atm/firestream.c Mon Oct 28 16:32:35 2002 +++ b/drivers/atm/firestream.c Mon Oct 28 16:32:35 2002 @@ -760,6 +760,7 @@ default: /* Here we get the tx purge inhibit command ... */ /* Action, I believe, is "don't do anything". -- REW */ + ; } write_fs (dev, Q_RP(q->offset), Q_INCWRAP); diff -Nru a/drivers/atm/iphase.c b/drivers/atm/iphase.c --- a/drivers/atm/iphase.c Mon Oct 28 16:32:38 2002 +++ b/drivers/atm/iphase.c Mon Oct 28 16:32:38 2002 @@ -118,7 +118,7 @@ } static int ia_enque_rtn_q (IARTN_Q *que, struct desc_tbl_t data) { - IARTN_Q *entry = kmalloc(sizeof(*entry), GFP_KERNEL); + IARTN_Q *entry = kmalloc(sizeof(*entry), GFP_ATOMIC); if (!entry) return -1; entry->data = data; entry->next = NULL; @@ -202,8 +202,7 @@ ltimeout = dev->desc_tbl[i].iavcc->ltimeout; delta = jiffies - dev->desc_tbl[i].timestamp; if (delta >= ltimeout) { - IF_ABR(printk("RECOVER run!! desc_tbl %d = %d delta = %ld, - time = %ld\n", i,dev->desc_tbl[i].timestamp, delta, jiffies);) + IF_ABR(printk("RECOVER run!! desc_tbl %d = %d delta = %ld, time = %ld\n", i,dev->desc_tbl[i].timestamp, delta, jiffies);) if (dev->ffL.tcq_rd == dev->ffL.tcq_st) dev->ffL.tcq_rd = dev->ffL.tcq_ed; else @@ -624,6 +623,7 @@ struct ia_vcc *iavcc; static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb); num_desc = ia_avail_descs(iadev); + while (num_desc && (skb = skb_dequeue(&iadev->tx_backlog))) { if (!(vcc = ATM_SKB(skb)->vcc)) { dev_kfree_skb_any(skb); @@ -643,6 +643,7 @@ } return 0; } + void ia_tx_poll (IADEV *iadev) { struct atm_vcc *vcc = NULL; struct sk_buff *skb = NULL, *skb1 = NULL; @@ -1086,6 +1087,7 @@ int len; struct sk_buff *skb; u_int buf_addr, dma_addr; + iadev = INPH_IA_DEV(dev); if (iadev->rfL.pcq_rd == (readw(iadev->reass_reg+PCQ_WR_PTR)&0xffff)) { @@ -1171,7 +1173,8 @@ /* Build the DLE structure */ wr_ptr = iadev->rx_dle_q.write; - wr_ptr->sys_pkt_addr = virt_to_bus(skb->data); + wr_ptr->sys_pkt_addr = pci_map_single(iadev->pci, skb->data, + len, PCI_DMA_FROMDEVICE); wr_ptr->local_pkt_addr = buf_addr; wr_ptr->bytes = len; /* We don't know this do we ?? */ wr_ptr->mode = DMA_INT_ENABLE; @@ -1290,6 +1293,9 @@ struct cpcs_trailer *trailer; u_short length; struct ia_vcc *ia_vcc; + + pci_unmap_single(iadev->pci, iadev->rx_dle_q.write->sys_pkt_addr, + len, PCI_DMA_FROMDEVICE); /* no VCC related housekeeping done as yet. lets see */ vcc = ATM_SKB(skb)->vcc; if (!vcc) { @@ -1401,7 +1407,7 @@ IADEV *iadev; struct rx_buf_desc *buf_desc_ptr; unsigned long rx_pkt_start = 0; - u32 *odle_addr, *dle_addr; + void *dle_addr; struct abr_vc_table *abr_vc_table; u16 *vc_table; u16 *reass_table; @@ -1412,25 +1418,14 @@ iadev = INPH_IA_DEV(dev); // spin_lock_init(&iadev->rx_lock); - /* I need to initialize the DLEs somewhere. Lets see what I - need to do for this, hmmm... - - allocate memory for 256 DLEs. make sure that it starts - on a 4k byte address boundary. Program the start address - in Receive List address register. ..... to do for TX also - To make sure that it is a 4k byte boundary - allocate 8k and find - 4k byte boundary within. - ( (addr + (4k-1)) & ~(4k-1) ) - */ - /* allocate 8k bytes */ - odle_addr = kmalloc(2*sizeof(struct dle)*DLE_ENTRIES, GFP_KERNEL); - if (!odle_addr) - { - printk(KERN_ERR DEV_LABEL "can't allocate DLEs\n"); - return -ENOMEM; - } - /* find 4k byte boundary within the 8k allocated */ - dle_addr = (u32*)( ((u32)odle_addr+(4096-1)) & ~(4096-1) ); + /* Allocate 4k bytes - more aligned than needed (4k boundary) */ + dle_addr = pci_alloc_consistent(iadev->pci, DLE_TOTAL_SIZE, + &iadev->rx_dle_dma); + if (!dle_addr) { + printk(KERN_ERR DEV_LABEL "can't allocate DLEs\n"); + goto err_out; + } iadev->rx_dle_q.start = (struct dle*)dle_addr; iadev->rx_dle_q.read = iadev->rx_dle_q.start; iadev->rx_dle_q.write = iadev->rx_dle_q.start; @@ -1439,7 +1434,8 @@ DLE that can be used. */ /* write the upper 20 bits of the start address to rx list address register */ - writel(virt_to_bus(dle_addr) & 0xfffff000, iadev->dma+IPHASE5575_RX_LIST_ADDR); + writel(iadev->rx_dle_dma & 0xfffff000, + iadev->dma + IPHASE5575_RX_LIST_ADDR); IF_INIT(printk("Tx Dle list addr: 0x%08x value: 0x%0x\n", (u32)(iadev->dma+IPHASE5575_TX_LIST_ADDR), *(u32*)(iadev->dma+IPHASE5575_TX_LIST_ADDR)); @@ -1613,8 +1609,7 @@ { printk(KERN_ERR DEV_LABEL "itf %d couldn't get free page\n", dev->number); - kfree(odle_addr); - return -ENOMEM; + goto err_free_dle; } memset(iadev->rx_open, 0, 4*iadev->num_vc); iadev->rxing = 1; @@ -1622,6 +1617,12 @@ /* Mode Register */ writew(R_ONLINE, iadev->reass_reg+MODE_REG); return 0; + +err_free_dle: + pci_free_consistent(iadev->pci, DLE_TOTAL_SIZE, iadev->rx_dle_q.start, + iadev->rx_dle_dma); +err_out: + return -ENOMEM; } @@ -1686,6 +1687,12 @@ /* free the DMAed skb */ skb = skb_dequeue(&iadev->tx_dma_q); if (!skb) break; + + /* Revenge of the 2 dle (skb + trailer) used in ia_pkt_tx() */ + if (!((dle - iadev->tx_dle_q.start)%(2*sizeof(struct dle)))) { + pci_unmap_single(iadev->pci, dle->sys_pkt_addr, skb->len, + PCI_DMA_TODEVICE); + } vcc = ATM_SKB(skb)->vcc; if (!vcc) { printk("tx_dle_intr: vcc is null\n"); @@ -1878,7 +1885,7 @@ IADEV *iadev; struct tx_buf_desc *buf_desc_ptr; unsigned int tx_pkt_start; - u32 *dle_addr; + void *dle_addr; int i; u_short tcq_st_adr; u_short *tcq_start; @@ -1894,24 +1901,22 @@ IF_INIT(printk("Tx MASK REG: 0x%0x\n", readw(iadev->seg_reg+SEG_MASK_REG));) - /*---------- Initializing Transmit DLEs ----------*/ - /* allocating 8k memory for transmit DLEs */ - dle_addr = kmalloc(2*sizeof(struct dle)*DLE_ENTRIES, GFP_KERNEL); - if (!dle_addr) - { - printk(KERN_ERR DEV_LABEL "can't allocate TX DLEs\n"); - return -ENOMEM; - } - - /* find 4k byte boundary within the 8k allocated */ - dle_addr = (u32*)(((u32)dle_addr+(4096-1)) & ~(4096-1)); + + /* Allocate 4k (boundary aligned) bytes */ + dle_addr = pci_alloc_consistent(iadev->pci, DLE_TOTAL_SIZE, + &iadev->tx_dle_dma); + if (!dle_addr) { + printk(KERN_ERR DEV_LABEL "can't allocate DLEs\n"); + goto err_out; + } iadev->tx_dle_q.start = (struct dle*)dle_addr; iadev->tx_dle_q.read = iadev->tx_dle_q.start; iadev->tx_dle_q.write = iadev->tx_dle_q.start; iadev->tx_dle_q.end = (struct dle*)((u32)dle_addr+sizeof(struct dle)*DLE_ENTRIES); /* write the upper 20 bits of the start address to tx list address register */ - writel(virt_to_bus(dle_addr) & 0xfffff000, iadev->dma+IPHASE5575_TX_LIST_ADDR); + writel(iadev->tx_dle_dma & 0xfffff000, + iadev->dma + IPHASE5575_TX_LIST_ADDR); writew(0xffff, iadev->seg_reg+SEG_MASK_REG); writew(0, iadev->seg_reg+MODE_REG_0); writew(RESET_SEG, iadev->seg_reg+SEG_COMMAND_REG); @@ -1955,26 +1960,29 @@ buf_desc_ptr++; tx_pkt_start += iadev->tx_buf_sz; } - iadev->tx_buf = kmalloc(iadev->num_tx_desc*sizeof(caddr_t), GFP_KERNEL); + iadev->tx_buf = kmalloc(iadev->num_tx_desc*sizeof(struct cpcs_trailer_desc), GFP_KERNEL); if (!iadev->tx_buf) { printk(KERN_ERR DEV_LABEL " couldn't get mem\n"); - return -EAGAIN; + goto err_free_dle; } for (i= 0; i< iadev->num_tx_desc; i++) { + struct cpcs_trailer *cpcs; - iadev->tx_buf[i] = kmalloc(sizeof(struct cpcs_trailer), - GFP_KERNEL|GFP_DMA); - if(!iadev->tx_buf[i]) { + cpcs = kmalloc(sizeof(*cpcs), GFP_KERNEL|GFP_DMA); + if(!cpcs) { printk(KERN_ERR DEV_LABEL " couldn't get freepage\n"); - return -EAGAIN; + goto err_free_tx_bufs; } + iadev->tx_buf[i].cpcs = cpcs; + iadev->tx_buf[i].dma_addr = pci_map_single(iadev->pci, + cpcs, sizeof(*cpcs), PCI_DMA_TODEVICE); } iadev->desc_tbl = kmalloc(iadev->num_tx_desc * sizeof(struct desc_tbl_t), GFP_KERNEL); if (!iadev->desc_tbl) { printk(KERN_ERR DEV_LABEL " couldn't get mem\n"); - return -EAGAIN; + goto err_free_all_tx_bufs; } /* Communication Queues base address */ @@ -2103,7 +2111,7 @@ iadev->testTable = kmalloc(sizeof(long)*iadev->num_vc, GFP_KERNEL); if (!iadev->testTable) { printk("Get freepage failed\n"); - return -EAGAIN; + goto err_free_desc_tbl; } for(i=0; inum_vc; i++) { @@ -2112,7 +2120,7 @@ iadev->testTable[i] = kmalloc(sizeof(struct testTable_t), GFP_KERNEL); if (!iadev->testTable[i]) - return -ENOMEM; + goto err_free_test_tables; iadev->testTable[i]->lastTime = 0; iadev->testTable[i]->fract = 0; iadev->testTable[i]->vc_status = VC_UBR; @@ -2163,7 +2171,30 @@ iadev->tx_pkt_cnt = 0; iadev->rate_limit = iadev->LineRate / 3; - return 0; + return 0; + +err_free_test_tables: + while (--i >= 0) + kfree(iadev->testTable[i]); + kfree(iadev->testTable); +err_free_desc_tbl: + kfree(iadev->desc_tbl); +err_free_all_tx_bufs: + i = iadev->num_tx_desc; +err_free_tx_bufs: + while (--i >= 0) { + struct cpcs_trailer_desc *desc = iadev->tx_buf + i; + + pci_unmap_single(iadev->pci, desc->dma_addr, + sizeof(*desc->cpcs), PCI_DMA_TODEVICE); + kfree(desc->cpcs); + } + kfree(iadev->tx_buf); +err_free_dle: + pci_free_consistent(iadev->pci, DLE_TOTAL_SIZE, iadev->tx_dle_q.start, + iadev->tx_dle_dma); +err_out: + return -ENOMEM; } static void ia_int(int irq, void *dev_id, struct pt_regs *regs) @@ -2421,10 +2452,37 @@ return readl(INPH_IA_DEV(dev)->phy+addr); } +static void ia_free_tx(IADEV *iadev) +{ + int i; + + kfree(iadev->desc_tbl); + for (i = 0; i < iadev->num_vc; i++) + kfree(iadev->testTable[i]); + kfree(iadev->testTable); + for (i = 0; i < iadev->num_tx_desc; i++) { + struct cpcs_trailer_desc *desc = iadev->tx_buf + i; + + pci_unmap_single(iadev->pci, desc->dma_addr, + sizeof(*desc->cpcs), PCI_DMA_TODEVICE); + kfree(desc->cpcs); + } + kfree(iadev->tx_buf); + pci_free_consistent(iadev->pci, DLE_TOTAL_SIZE, iadev->tx_dle_q.start, + iadev->tx_dle_dma); +} + +static void ia_free_rx(IADEV *iadev) +{ + kfree(iadev->rx_open); + pci_free_consistent(iadev->pci, DLE_TOTAL_SIZE, iadev->rx_dle_q.start, + iadev->rx_dle_dma); +} + static int __init ia_start(struct atm_dev *dev) { IADEV *iadev; - int error = 1; + int error; unsigned char phy; u32 ctrl_reg; IF_EVENT(printk(">ia_start\n");) @@ -2432,7 +2490,8 @@ if (request_irq(iadev->irq, &ia_int, SA_SHIRQ, DEV_LABEL, dev)) { printk(KERN_ERR DEV_LABEL "(itf %d): IRQ%d is already in use\n", dev->number, iadev->irq); - return -EAGAIN; + error = -EAGAIN; + goto err_out; } /* @@@ should release IRQ on error */ /* enabling memory + master */ @@ -2442,8 +2501,8 @@ { printk(KERN_ERR DEV_LABEL "(itf %d): can't enable memory+" "master (0x%x)\n",dev->number, error); - free_irq(iadev->irq, dev); - return -EIO; + error = -EIO; + goto err_free_irq; } udelay(10); @@ -2477,15 +2536,11 @@ ia_hw_type(iadev); error = tx_init(dev); - if (error) { - free_irq(iadev->irq, dev); - return error; - } + if (error) + goto err_free_irq; error = rx_init(dev); - if (error) { - free_irq(iadev->irq, dev); - return error; - } + if (error) + goto err_free_tx; ctrl_reg = readl(iadev->reg+IPHASE5575_BUS_CONTROL_REG); writel(ctrl_reg | CTRL_FE_RST, iadev->reg+IPHASE5575_BUS_CONTROL_REG); @@ -2498,35 +2553,38 @@ else printk("IA: utopia,rev.%0x\n",phy);) - if (iadev->phy_type & FE_25MBIT_PHY) { + if (iadev->phy_type & FE_25MBIT_PHY) ia_mb25_init(iadev); - return 0; - } - if (iadev->phy_type & (FE_DS3_PHY | FE_E3_PHY)) { + else if (iadev->phy_type & (FE_DS3_PHY | FE_E3_PHY)) ia_suni_pm7345_init(iadev); - return 0; - } - - error = suni_init(dev); - if (error) { - free_irq(iadev->irq, dev); - return error; - } - - /* Enable interrupt on loss of signal SUNI_RSOP_CIE 0x10 - SUNI_RSOP_CIE_LOSE - 0x04 - */ - ia_phy_put(dev, ia_phy_get(dev,0x10) | 0x04, 0x10); -#if 0 - error = dev->phy->start(dev); - if (error) { - free_irq(iadev->irq, dev); - return error; - } + else { + error = suni_init(dev); + if (error) + goto err_free_rx; + /* + * Enable interrupt on loss of signal + * SUNI_RSOP_CIE - 0x10 + * SUNI_RSOP_CIE_LOSE - 0x04 + */ + ia_phy_put(dev, ia_phy_get(dev, 0x10) | 0x04, 0x10); +#ifndef MODULE + error = dev->phy->start(dev); + if (error) + goto err_free_rx; #endif - /* Get iadev->carrier_detect status */ - IaFrontEndIntr(iadev); - return 0; + /* Get iadev->carrier_detect status */ + IaFrontEndIntr(iadev); + } + return 0; + +err_free_rx: + ia_free_rx(iadev); +err_free_tx: + ia_free_tx(iadev); +err_free_irq: + free_irq(iadev->irq, dev); +err_out: + return error; } static void ia_close(struct atm_vcc *vcc) @@ -2835,10 +2893,10 @@ struct tx_buf_desc *buf_desc_ptr; int desc; int comp_code; - unsigned int addr; int total_len, pad, last; struct cpcs_trailer *trailer; struct ia_vcc *iavcc; + iadev = INPH_IA_DEV(vcc->dev); iavcc = INPH_IA_VCC(vcc); if (!iavcc->txing) { @@ -2923,13 +2981,9 @@ IF_TX(printk("ia packet len:%d padding:%d\n", total_len, pad);) /* Put the packet in a tx buffer */ - if (!iadev->tx_buf[desc-1]) - printk("couldn't get free page\n"); - + trailer = iadev->tx_buf[desc-1].cpcs; IF_TX(printk("Sent: skb = 0x%x skb->data: 0x%x len: %d, desc: %d\n", (u32)skb, (u32)skb->data, skb->len, desc);) - addr = virt_to_bus(skb->data); - trailer = (struct cpcs_trailer*)iadev->tx_buf[desc-1]; trailer->control = 0; /*big endian*/ trailer->length = ((skb->len & 0xff) << 8) | ((skb->len & 0xff00) >> 8); @@ -2945,6 +2999,7 @@ buf_desc_ptr = (struct tx_buf_desc *)(iadev->seg_ram+TX_DESC_BASE); buf_desc_ptr += desc; /* points to the corresponding entry */ buf_desc_ptr->desc_mode = AAL5 | EOM_EN | APP_CRC32 | CMPL_INT; + /* Huh ? p.115 of users guide describes this as a read-only register */ writew(TRANSMIT_DONE, iadev->seg_reg+SEG_INTR_STATUS_REG); buf_desc_ptr->vc_index = vcc->vci; buf_desc_ptr->bytes = total_len; @@ -2955,7 +3010,8 @@ /* Build the DLE structure */ wr_ptr = iadev->tx_dle_q.write; memset((caddr_t)wr_ptr, 0, sizeof(*wr_ptr)); - wr_ptr->sys_pkt_addr = addr; + wr_ptr->sys_pkt_addr = pci_map_single(iadev->pci, skb->data, + skb->len, PCI_DMA_TODEVICE); wr_ptr->local_pkt_addr = (buf_desc_ptr->buf_start_hi << 16) | buf_desc_ptr->buf_start_lo; /* wr_ptr->bytes = swap(total_len); didn't seem to affect ?? */ @@ -2973,7 +3029,7 @@ wr_ptr = iadev->tx_dle_q.start; /* Build trailer dle */ - wr_ptr->sys_pkt_addr = virt_to_bus(iadev->tx_buf[desc-1]); + wr_ptr->sys_pkt_addr = iadev->tx_buf[desc-1].dma_addr; wr_ptr->local_pkt_addr = ((buf_desc_ptr->buf_start_hi << 16) | buf_desc_ptr->buf_start_lo) + total_len - sizeof(struct cpcs_trailer); @@ -3124,128 +3180,130 @@ .owner = THIS_MODULE, }; - -static int __init ia_detect(void) +static int __devinit ia_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) { struct atm_dev *dev; IADEV *iadev; unsigned long flags; - int index = 0; - struct pci_dev *prev_dev; - if (!pci_present()) { - printk(KERN_ERR DEV_LABEL " driver but no PCI BIOS ?\n"); - return 0; - } + int ret; + iadev = kmalloc(sizeof(*iadev), GFP_KERNEL); - if (!iadev) return -ENOMEM; - memset((char*)iadev, 0, sizeof(*iadev)); - prev_dev = NULL; - while((iadev->pci = pci_find_device(PCI_VENDOR_ID_IPHASE, - PCI_DEVICE_ID_IPHASE_5575, prev_dev))) { - IF_INIT(printk("ia detected at bus:%d dev: %d function:%d\n", - iadev->pci->bus->number, PCI_SLOT(iadev->pci->devfn), - PCI_FUNC(iadev->pci->devfn));) - if (pci_enable_device(iadev->pci)) break; - dev = atm_dev_register(DEV_LABEL, &ops, -1, NULL); - if (!dev) break; - IF_INIT(printk(DEV_LABEL "registered at (itf :%d)\n", - dev->number);) - INPH_IA_DEV(dev) = iadev; - // TODO: multi_board using ia_boards logic in cleanup_module - ia_dev[index] = iadev; - _ia_dev[index] = dev; - IF_INIT(printk("dev_id = 0x%x iadev->LineRate = %d \n", - (u32)dev, iadev->LineRate);) - iadev_count++; - spin_lock_init(&iadev->misc_lock); - spin_lock_irqsave(&iadev->misc_lock, flags); - if (ia_init(dev) || ia_start(dev)) { - atm_dev_deregister(dev); - IF_INIT(printk("IA register failed!\n");) - ia_dev[index] = NULL; - _ia_dev[index] = NULL; - iadev_count--; - spin_unlock_irqrestore(&iadev->misc_lock, flags); - return -EINVAL; - } - spin_unlock_irqrestore(&iadev->misc_lock, flags); - IF_EVENT(printk("iadev_count = %d\n", iadev_count);) - prev_dev = iadev->pci; - iadev->next_board = ia_boards; - ia_boards = dev; - iadev = kmalloc(sizeof(*iadev), GFP_KERNEL); - if (!iadev) break; - memset((char*)iadev, 0, sizeof(*iadev)); - index++; - dev = NULL; - } - return index; -} - + if (!iadev) { + ret = -ENOMEM; + goto err_out; + } + memset(iadev, 0, sizeof(*iadev)); + iadev->pci = pdev; + + IF_INIT(printk("ia detected at bus:%d dev: %d function:%d\n", + pdev->bus->number, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn));) + if (pci_enable_device(pdev)) { + ret = -ENODEV; + goto err_out_free_iadev; + } + dev = atm_dev_register(DEV_LABEL, &ops, -1, NULL); + if (!dev) { + ret = -ENOMEM; + goto err_out_disable_dev; + } + INPH_IA_DEV(dev) = iadev; + IF_INIT(printk(DEV_LABEL "registered at (itf :%d)\n", dev->number);) + IF_INIT(printk("dev_id = 0x%x iadev->LineRate = %d \n", (u32)dev, + iadev->LineRate);) + + ia_dev[iadev_count] = iadev; + _ia_dev[iadev_count] = dev; + iadev_count++; + spin_lock_init(&iadev->misc_lock); + /* First fixes first. I don't want to think about this now. */ + spin_lock_irqsave(&iadev->misc_lock, flags); + if (ia_init(dev) || ia_start(dev)) { + IF_INIT(printk("IA register failed!\n");) + iadev_count--; + ia_dev[iadev_count] = NULL; + _ia_dev[iadev_count] = NULL; + spin_unlock_irqrestore(&iadev->misc_lock, flags); + ret = -EINVAL; + goto err_out_deregister_dev; + } + spin_unlock_irqrestore(&iadev->misc_lock, flags); + IF_EVENT(printk("iadev_count = %d\n", iadev_count);) + + iadev->next_board = ia_boards; + ia_boards = dev; + + pci_set_drvdata(pdev, dev); + + return 0; + +err_out_deregister_dev: + atm_dev_deregister(dev); +err_out_disable_dev: + pci_disable_device(pdev); +err_out_free_iadev: + kfree(iadev); +err_out: + return ret; +} + +static void __devexit ia_remove_one(struct pci_dev *pdev) +{ + struct atm_dev *dev = pci_get_drvdata(pdev); + IADEV *iadev = INPH_IA_DEV(dev); + + ia_phy_put(dev, ia_phy_get(dev,0x10) & ~(0x4), 0x10); + udelay(1); + + /* De-register device */ + free_irq(iadev->irq, dev); + iadev_count--; + ia_dev[iadev_count] = NULL; + _ia_dev[iadev_count] = NULL; + atm_dev_deregister(dev); + IF_EVENT(printk("iav deregistered at (itf:%d)\n", dev->number);) + + iounmap((void *) iadev->base); + pci_disable_device(pdev); + + ia_free_rx(iadev); + ia_free_tx(iadev); + + kfree(iadev); +} + +static struct pci_device_id ia_pci_tbl[] __devinitdata = { + { PCI_VENDOR_ID_IPHASE, 0x0008, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_IPHASE, 0x0009, PCI_ANY_ID, PCI_ANY_ID, }, + { 0,} +}; +MODULE_DEVICE_TABLE(pci, ia_pci_tbl); + +static struct pci_driver ia_driver = { + .name = DEV_LABEL, + .id_table = ia_pci_tbl, + .probe = ia_init_one, + .remove = ia_remove_one, +}; + static int __init ia_module_init(void) -{ - IF_EVENT(printk(">ia init_module\n");) - if (!ia_detect()) { +{ + int ret; + + ret = pci_module_init(&ia_driver); + if (ret >= 0) { + ia_timer.expires = jiffies + 3*HZ; + add_timer(&ia_timer); + } else printk(KERN_ERR DEV_LABEL ": no adapter found\n"); - return -ENXIO; - } - ia_timer.expires = jiffies + 3*HZ; - add_timer(&ia_timer); - - return 0; -} - - + return ret; +} + static void __exit ia_module_exit(void) -{ - struct atm_dev *dev; - IADEV *iadev; - unsigned short command; - int i, j= 0; - - IF_EVENT(printk(">ia cleanup_module\n");) - if (MOD_IN_USE) - printk("ia: module in use\n"); +{ + pci_unregister_driver(&ia_driver); + del_timer(&ia_timer); - while(ia_dev[j]) - { - dev = ia_boards; - iadev = INPH_IA_DEV(dev); - ia_boards = iadev->next_board; - - /* disable interrupt of lost signal */ - ia_phy_put(dev, ia_phy_get(dev,0x10) & ~(0x4), 0x10); - udelay(1); - - /* De-register device */ - atm_dev_deregister(dev); - IF_EVENT(printk("iav deregistered at (itf:%d)\n", dev->number);) - for (i= 0; i< iadev->num_tx_desc; i++) - kfree(iadev->tx_buf[i]); - kfree(iadev->tx_buf); - /* Disable memory mapping and busmastering */ - if (pci_read_config_word(iadev->pci, - PCI_COMMAND, &command) != 0) - { - printk("ia: can't read PCI_COMMAND.\n"); - } - command &= ~(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); - if (pci_write_config_word(iadev->pci, - PCI_COMMAND, command) != 0) - { - printk("ia: can't write PCI_COMMAND.\n"); - } - free_irq(iadev->irq, dev); - iounmap((void *) iadev->base); - kfree(iadev); - j++; - } - /* and voila whatever we tried seems to work. I don't know if it will - fix suni errors though. Really doubt that. */ - for (i = 0; i<8; i++) { - ia_dev[i] = NULL; - _ia_dev[i] = NULL; - } } module_init(ia_module_init); diff -Nru a/drivers/atm/iphase.h b/drivers/atm/iphase.h --- a/drivers/atm/iphase.h Mon Oct 28 16:32:36 2002 +++ b/drivers/atm/iphase.h Mon Oct 28 16:32:36 2002 @@ -200,7 +200,13 @@ u_short length; u_int crc32; }; - + +struct cpcs_trailer_desc +{ + struct cpcs_trailer *cpcs; + dma_addr_t dma_addr; +}; + struct ia_vcc { int rxing; @@ -272,6 +278,7 @@ #define DLE_ENTRIES 256 #define DMA_INT_ENABLE 0x0002 /* use for both Tx and Rx */ #define TX_DLE_PSI 0x0001 +#define DLE_TOTAL_SIZE (sizeof(struct dle)*DLE_ENTRIES) /* Descriptor List Entries (DLE) */ struct dle @@ -1017,7 +1024,7 @@ struct wait_queue *close_wait; struct wait_queue *timeout_wait; #endif - caddr_t *tx_buf; + struct cpcs_trailer_desc *tx_buf; u16 num_tx_desc, tx_buf_sz, rate_limit; u32 tx_cell_cnt, tx_pkt_cnt; u32 MAIN_VC_TABLE_ADDR, EXT_VC_TABLE_ADDR, ABR_SCHED_TABLE_ADDR; @@ -1063,7 +1070,9 @@ struct desc_tbl_t *desc_tbl; u_short host_tcq_wr; struct testTable_t **testTable; -} IADEV; + dma_addr_t tx_dle_dma; + dma_addr_t rx_dle_dma; +} IADEV; #define INPH_IA_DEV(d) ((IADEV *) (d)->dev_data) diff -Nru a/drivers/atm/lanai.c b/drivers/atm/lanai.c --- a/drivers/atm/lanai.c Mon Oct 28 16:32:36 2002 +++ b/drivers/atm/lanai.c Mon Oct 28 16:32:36 2002 @@ -2108,8 +2108,7 @@ } result = pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &w); if (result != PCIBIOS_SUCCESSFUL) { - printk(KERN_ERR DEV_LABEL "(itf %d): can't read "" - PCI_SUBSYSTEM_ID: %d\n", lanai->number, result); + printk(KERN_ERR DEV_LABEL "(itf %d): can't read PCI_SUBSYSTEM_ID: %d\n", lanai->number, result); return -EINVAL; } if ((result = check_board_id_and_rev("PCI", w, NULL)) != 0) diff -Nru a/drivers/atm/zatm.c b/drivers/atm/zatm.c --- a/drivers/atm/zatm.c Mon Oct 28 16:32:36 2002 +++ b/drivers/atm/zatm.c Mon Oct 28 16:32:36 2002 @@ -1260,13 +1260,13 @@ /* don't handle RD */ if (reason & uPD98401_INT_SPE) printk(KERN_ALERT DEV_LABEL "(itf %d): system parity " - "error at 0x%08x\n",dev->number,zin(ADDR)); + "error at 0x%08lx\n",dev->number,zin(ADDR)); if (reason & uPD98401_INT_CPE) printk(KERN_ALERT DEV_LABEL "(itf %d): control memory " - "parity error at 0x%08x\n",dev->number,zin(ADDR)); + "parity error at 0x%08lx\n",dev->number,zin(ADDR)); if (reason & uPD98401_INT_SBE) { printk(KERN_ALERT DEV_LABEL "(itf %d): system bus " - "error at 0x%08x\n",dev->number,zin(ADDR)); + "error at 0x%08lx\n",dev->number,zin(ADDR)); event_dump(); } /* don't handle IND */ @@ -1448,7 +1448,7 @@ } while (t0 > t1 || t1 > t2); /* loop if wrapping ... */ zatm_dev->khz = t2-2*t1+t0; - printk(KERN_NOTICE DEV_LABEL "(itf %d): uPD98401 %d.%d at %d.%03d " + printk(KERN_NOTICE DEV_LABEL "(itf %d): uPD98401 %ld.%ld at %d.%03d " "MHz\n",dev->number, (zin(VER) & uPD98401_MAJOR) >> uPD98401_MAJOR_SHIFT, zin(VER) & uPD98401_MINOR,zatm_dev->khz/1000,zatm_dev->khz % 1000); diff -Nru a/drivers/base/base.h b/drivers/base/base.h --- a/drivers/base/base.h Mon Oct 28 16:32:36 2002 +++ b/drivers/base/base.h Mon Oct 28 16:32:36 2002 @@ -54,8 +54,13 @@ #ifdef CONFIG_HOTPLUG extern int dev_hotplug(struct device *dev, const char *action); +extern int class_hotplug(struct device *dev, const char *action); #else static inline int dev_hotplug(struct device *dev, const char *action) +{ + return 0; +} +static int class_hotplug(struct device *dev, const char *action) { return 0; } diff -Nru a/drivers/base/class.c b/drivers/base/class.c --- a/drivers/base/class.c Mon Oct 28 16:32:38 2002 +++ b/drivers/base/class.c Mon Oct 28 16:32:38 2002 @@ -84,7 +84,8 @@ interface_add(cls,dev); } - /* notify userspace (call /sbin/hotplug) here */ + /* notify userspace (call /sbin/hotplug) */ + class_hotplug (dev, "add"); up_write(&cls->rwsem); if (error) @@ -106,6 +107,10 @@ cls->name,dev->name); interface_remove(cls,dev); unenum_device(cls,dev); + + /* notify userspace (call /sbin/hotplug) */ + class_hotplug (dev, "remove"); + if (cls->remove_device) cls->remove_device(dev); up_write(&cls->rwsem); diff -Nru a/drivers/base/hotplug.c b/drivers/base/hotplug.c --- a/drivers/base/hotplug.c Mon Oct 28 16:32:35 2002 +++ b/drivers/base/hotplug.c Mon Oct 28 16:32:35 2002 @@ -22,15 +22,21 @@ /* * hotplugging invokes what /proc/sys/kernel/hotplug says (normally - * /sbin/hotplug) when devices get added or removed. + * /sbin/hotplug) when devices or classes get added or removed. * * This invokes a user mode policy agent, typically helping to load driver * or other modules, configure the device, and more. Drivers can provide * a MODULE_DEVICE_TABLE to help with module loading subtasks. + * + * See the documentation at http://linux-hotplug.sf.net for more info. + * */ + #define BUFFER_SIZE 1024 /* should be enough memory for the env */ #define NUM_ENVP 32 /* number of env pointers */ -int dev_hotplug (struct device *dev, const char *action) + +static int do_hotplug (struct device *dev, char *argv1, const char *action, + int (* hotplug) (struct device *, char **, int, char *, int)) { char *argv [3], **envp, *buffer, *scratch; char *dev_path; @@ -39,11 +45,6 @@ int dev_length; pr_debug ("%s\n", __FUNCTION__); - if (!dev) - return -ENODEV; - - if (!dev->bus) - return -ENODEV; if (!hotplug_path [0]) return -ENODEV; @@ -82,9 +83,8 @@ strcpy (dev_path, "root"); fill_devpath (dev, dev_path, dev_length); - /* only one standardized param to hotplug command: the bus name */ argv [0] = hotplug_path; - argv [1] = dev->bus->name; + argv [1] = argv1; argv [2] = 0; /* minimal command environment */ @@ -99,11 +99,10 @@ envp [i++] = scratch; scratch += sprintf (scratch, "DEVPATH=%s", dev_path) + 1; - if (dev->bus->hotplug) { + if (hotplug) { /* have the bus specific function add its stuff */ - retval = dev->bus->hotplug (dev, &envp[i], NUM_ENVP - i, - scratch, - BUFFER_SIZE - (scratch - buffer)); + retval = hotplug (dev, &envp[i], NUM_ENVP - i, scratch, + BUFFER_SIZE - (scratch - buffer)); if (retval) { pr_debug ("%s - hotplug() returned %d\n", __FUNCTION__, retval); @@ -123,4 +122,43 @@ kfree (buffer); kfree (envp); return retval; +} + + +/* + * dev_hotplug - called when any device is added or removed from a bus + */ +int dev_hotplug (struct device *dev, const char *action) +{ + pr_debug ("%s\n", __FUNCTION__); + if (!dev) + return -ENODEV; + + if (!dev->bus) + return -ENODEV; + + return do_hotplug (dev, dev->bus->name, action, dev->bus->hotplug); +} + + +/* + * class_hotplug - called when a class is added or removed from a device + */ +int class_hotplug (struct device *dev, const char *action) +{ + struct device_class * cls; + + pr_debug ("%s\n", __FUNCTION__); + + if (!dev) + return -ENODEV; + + if (!dev->bus) + return -ENODEV; + + cls = get_devclass(dev->driver->devclass); + if (!cls) + return -ENODEV; + + return do_hotplug (dev, cls->name, action, cls->hotplug); } diff -Nru a/drivers/block/deadline-iosched.c b/drivers/block/deadline-iosched.c --- a/drivers/block/deadline-iosched.c Mon Oct 28 16:32:37 2002 +++ b/drivers/block/deadline-iosched.c Mon Oct 28 16:32:37 2002 @@ -118,6 +118,8 @@ while ((entry = next) != hash_list) { next = entry->next; + prefetch(next); + drq = list_entry_hash(entry); BUG_ON(!drq->hash_valid_count); @@ -191,6 +193,8 @@ while ((entry = entry->prev) != sort_list) { __rq = list_entry_rq(entry); + prefetch(entry->prev); + BUG_ON(__rq->flags & REQ_STARTED); if (!(__rq->flags & REQ_CMD)) @@ -297,6 +301,8 @@ do { struct list_head *nxt = rq->queuelist.next; int this_rq_cost; + + prefetch(nxt); /* * take it off the sort and fifo list, move diff -Nru a/drivers/block/elevator.c b/drivers/block/elevator.c --- a/drivers/block/elevator.c Mon Oct 28 16:32:37 2002 +++ b/drivers/block/elevator.c Mon Oct 28 16:32:37 2002 @@ -272,13 +272,27 @@ e->elevator_merge_req_fn(q, rq, next); } -/* - * add_request and next_request are required to be supported, naturally - */ -void __elv_add_request(request_queue_t *q, struct request *rq, - struct list_head *insert_here) +void __elv_add_request(request_queue_t *q, struct request *rq, int at_end, + int plug) { - q->elevator.elevator_add_req_fn(q, rq, insert_here); + struct list_head *insert = &q->queue_head; + + if (at_end) + insert = insert->prev; + if (plug) + blk_plug_device(q); + + q->elevator.elevator_add_req_fn(q, rq, insert); +} + +void elv_add_request(request_queue_t *q, struct request *rq, int at_end, + int plug) +{ + unsigned long flags; + + spin_lock_irqsave(q->queue_lock, flags); + __elv_add_request(q, rq, at_end, plug); + spin_unlock_irqrestore(q->queue_lock, flags); } static inline struct request *__elv_next_request(request_queue_t *q) @@ -289,8 +303,14 @@ struct request *elv_next_request(request_queue_t *q) { struct request *rq; + int ret; while ((rq = __elv_next_request(q))) { + /* + * just mark as started even if we don't start it, a request + * that has been delayed should not be passed by new incoming + * requests + */ rq->flags |= REQ_STARTED; if (&rq->queuelist == q->last_merge) @@ -299,20 +319,22 @@ if ((rq->flags & REQ_DONTPREP) || !q->prep_rq_fn) break; - /* - * all ok, break and return it - */ - if (!q->prep_rq_fn(q, rq)) + ret = q->prep_rq_fn(q, rq); + if (ret == BLKPREP_OK) { break; - - /* - * prep said no-go, kill it - */ - blkdev_dequeue_request(rq); - if (end_that_request_first(rq, 0, rq->nr_sectors)) - BUG(); - - end_that_request_last(rq); + } else if (ret == BLKPREP_DEFER) { + rq = NULL; + break; + } else if (ret == BLKPREP_KILL) { + blkdev_dequeue_request(rq); + rq->flags |= REQ_QUIET; + while (end_that_request_first(rq, 0, rq->nr_sectors)) + ; + end_that_request_last(rq); + } else { + printk("%s: bad return=%d\n", __FUNCTION__, ret); + break; + } } return rq; @@ -322,6 +344,16 @@ { elevator_t *e = &q->elevator; + /* + * the main clearing point for q->last_merge is on retrieval of + * request by driver (it calls elv_next_request()), but it _can_ + * also happen here if a request is added to the queue but later + * deleted without ever being given to driver (merged with another + * request). + */ + if (&rq->queuelist == q->last_merge) + q->last_merge = NULL; + if (e->elevator_remove_req_fn) e->elevator_remove_req_fn(q, rq); } @@ -357,6 +389,7 @@ EXPORT_SYMBOL(elevator_noop); +EXPORT_SYMBOL(elv_add_request); EXPORT_SYMBOL(__elv_add_request); EXPORT_SYMBOL(elv_next_request); EXPORT_SYMBOL(elv_remove_request); diff -Nru a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c --- a/drivers/block/ll_rw_blk.c Mon Oct 28 16:32:35 2002 +++ b/drivers/block/ll_rw_blk.c Mon Oct 28 16:32:35 2002 @@ -242,6 +242,7 @@ q->backing_dev_info.state = 0; blk_queue_max_sectors(q, MAX_SECTORS); blk_queue_hardsect_size(q, 512); + blk_queue_dma_alignment(q, 511); /* * by default assume old behaviour and bounce for any highmem page @@ -408,6 +409,21 @@ q->seg_boundary_mask = mask; } +/** + * blk_queue_dma_alignment - set dma length and memory alignment + * @q: the request queue for the device + * @dma_mask: alignment mask + * + * description: + * set required memory and length aligment for direct dma transactions. + * this is used when buiding direct io requests for the queue. + * + **/ +void blk_queue_dma_alignment(request_queue_t *q, int mask) +{ + q->dma_alignment = mask; +} + void blk_queue_assign_lock(request_queue_t *q, spinlock_t *lock) { spin_lock_init(lock); @@ -549,7 +565,7 @@ return; } - list_del(&rq->queuelist); + list_del_init(&rq->queuelist); rq->flags &= ~REQ_QUEUED; rq->tag = -1; @@ -633,13 +649,13 @@ if (rq->tag == -1) { printk("bad tag found on list\n"); - list_del(&rq->queuelist); + list_del_init(&rq->queuelist); rq->flags &= ~REQ_QUEUED; } else blk_queue_end_tag(q, rq); rq->flags &= ~REQ_STARTED; - elv_add_request(q, rq, 0); + __elv_add_request(q, rq, 0, 0); } } @@ -655,14 +671,19 @@ "REQ_PC", "REQ_BLOCK_PC", "REQ_SENSE", + "REQ_FAILED", + "REQ_QUIET", "REQ_SPECIAL" + "REQ_DRIVE_CMD", + "REQ_DRIVE_TASK", + "REQ_DRIVE_TASKFILE", }; void blk_dump_rq_flags(struct request *rq, char *msg) { int bit; - printk("%s: dev %02x:%02x: ", msg, major(rq->rq_dev), minor(rq->rq_dev)); + printk("%s: dev %02x:%02x: flags = ", msg, major(rq->rq_dev), minor(rq->rq_dev)); bit = 0; do { if (rq->flags & (1 << bit)) @@ -670,10 +691,17 @@ bit++; } while (bit < __REQ_NR_BITS); - printk("sector %llu, nr/cnr %lu/%u\n", (unsigned long long)rq->sector, + printk("\nsector %llu, nr/cnr %lu/%u\n", (unsigned long long)rq->sector, rq->nr_sectors, rq->current_nr_sectors); - printk("bio %p, biotail %p\n", rq->bio, rq->biotail); + printk("bio %p, biotail %p, buffer %p, data %p, len %u\n", rq->bio, rq->biotail, rq->buffer, rq->data, rq->data_len); + + if (rq->flags & (REQ_BLOCK_PC | REQ_PC)) { + printk("cdb: "); + for (bit = 0; bit < sizeof(rq->cmd); bit++) + printk("%02x ", rq->cmd[bit]); + printk("\n"); + } } void blk_recount_segments(request_queue_t *q, struct bio *bio) @@ -1104,7 +1132,7 @@ while (!list_empty(head)) { rq = list_entry(head->next, struct request, queuelist); - list_del(&rq->queuelist); + list_del_init(&rq->queuelist); kmem_cache_free(request_cachep, rq); i++; } @@ -1264,13 +1292,20 @@ if (!list_empty(&rl->free)) { rq = blkdev_free_rq(&rl->free); - list_del(&rq->queuelist); + list_del_init(&rq->queuelist); + rq->ref_count = 1; rl->count--; if (rl->count < queue_congestion_on_threshold()) set_queue_congested(q, rw); rq->flags = 0; rq->rq_status = RQ_ACTIVE; + rq->errors = 0; rq->special = NULL; + rq->buffer = NULL; + rq->data = NULL; + rq->sense = NULL; + rq->waiting = NULL; + rq->bio = rq->biotail = NULL; rq->q = q; rq->rl = rl; } @@ -1386,7 +1421,7 @@ if (blk_rq_tagged(rq)) blk_queue_end_tag(q, rq); - _elv_add_request(q, rq, !at_head, 0); + __elv_add_request(q, rq, !at_head, 0); q->request_fn(q); spin_unlock_irqrestore(q->queue_lock, flags); } @@ -1466,26 +1501,22 @@ * elevator indicated where it wants this request to be * inserted at elevator_merge time */ - __elv_add_request(q, req, insert_here); + __elv_add_request_pos(q, req, insert_here); } -/* - * Must be called with queue lock held and interrupts disabled - */ -void blk_put_request(struct request *req) +void __blk_put_request(request_queue_t *q, struct request *req) { struct request_list *rl = req->rl; - request_queue_t *q = req->q; + + if (unlikely(--req->ref_count)) + return; + if (unlikely(!q)) + return; req->rq_status = RQ_INACTIVE; req->q = NULL; req->rl = NULL; - if (q) { - if (q->last_merge == &req->queuelist) - q->last_merge = NULL; - } - /* * Request may not have originated from ll_rw_blk. if not, * it didn't come out of our reserved rq pools @@ -1493,6 +1524,8 @@ if (rl) { int rw = 0; + BUG_ON(!list_empty(&req->queuelist)); + list_add(&req->queuelist, &rl->free); if (rl == &q->rq[WRITE]) @@ -1510,6 +1543,23 @@ } } +void blk_put_request(struct request *req) +{ + request_queue_t *q = req->q; + + /* + * if req->q isn't set, this request didnt originate from the + * block layer, so it's safe to just disregard it + */ + if (q) { + unsigned long flags; + + spin_lock_irqsave(q->queue_lock, flags); + __blk_put_request(q, req); + spin_unlock_irqrestore(q->queue_lock, flags); + } +} + /** * blk_congestion_wait - wait for a queue to become uncongested * @rw: READ or WRITE @@ -1568,7 +1618,7 @@ elv_merge_requests(q, req, next); blkdev_dequeue_request(next); - blk_put_request(next); + __blk_put_request(q, next); } } @@ -1761,7 +1811,7 @@ add_request(q, req, insert_here); out: if (freereq) - blk_put_request(freereq); + __blk_put_request(q, freereq); spin_unlock_irq(q->queue_lock); return 0; @@ -1891,7 +1941,6 @@ { int count = bio_sectors(bio); - BUG_ON(!bio->bi_end_io); BIO_BUG_ON(!bio->bi_size); BIO_BUG_ON(!bio->bi_io_vec); bio->bi_rw = rw; @@ -1908,6 +1957,9 @@ struct bio *bio; int nr_phys_segs, nr_hw_segs; + if (!rq->bio) + return; + rq->buffer = bio_data(rq->bio); nr_phys_segs = nr_hw_segs = 0; @@ -1925,7 +1977,7 @@ inline void blk_recalc_rq_sectors(struct request *rq, int nsect) { - if (rq->bio) { + if (blk_fs_request(rq)) { rq->hard_sector += nsect; rq->nr_sectors = rq->hard_nr_sectors -= nsect; rq->sector = rq->hard_sector; @@ -1944,27 +1996,19 @@ } } -/** - * end_that_request_first - end I/O on one buffer. - * @req: the request being processed - * @uptodate: 0 for I/O error - * @nr_sectors: number of sectors to end I/O on - * - * Description: - * Ends I/O on a number of sectors attached to @req, and sets it up - * for the next range of segments (if any) in the cluster. - * - * Return: - * 0 - we are done with this request, call end_that_request_last() - * 1 - still buffers pending for this request - **/ - -int end_that_request_first(struct request *req, int uptodate, int nr_sectors) +static int __end_that_request_first(struct request *req, int uptodate, + int nr_bytes) { - int total_nsect = 0, error = 0; + int total_bytes, bio_nbytes, error = 0, next_idx = 0; struct bio *bio; - req->errors = 0; + /* + * for a REQ_BLOCK_PC request, we want to carry any eventual + * sense key with us all the way through + */ + if (!blk_pc_request(req)) + req->errors = 0; + if (!uptodate) { error = -EIO; if (!(req->flags & REQ_QUIET)) @@ -1973,56 +2017,56 @@ (unsigned long long)req->sector); } + total_bytes = bio_nbytes = 0; while ((bio = req->bio)) { - int new_bio = 0, nsect; + int nbytes; - if (unlikely(bio->bi_idx >= bio->bi_vcnt)) { - printk("%s: bio idx %d >= vcnt %d\n", __FUNCTION__, + if (nr_bytes >= bio->bi_size) { + req->bio = bio->bi_next; + nbytes = bio->bi_size; + bio_endio(bio, nbytes, error); + next_idx = 0; + bio_nbytes = 0; + } else { + int idx = bio->bi_idx + next_idx; + + if (unlikely(bio->bi_idx >= bio->bi_vcnt)) { + blk_dump_rq_flags(req, "__end_that"); + printk("%s: bio idx %d >= vcnt %d\n", + __FUNCTION__, bio->bi_idx, bio->bi_vcnt); - break; - } + break; + } - BIO_BUG_ON(bio_iovec(bio)->bv_len > bio->bi_size); + nbytes = bio_iovec_idx(bio, idx)->bv_len; + BIO_BUG_ON(nbytes > bio->bi_size); - /* - * not a complete bvec done - */ - nsect = bio_iovec(bio)->bv_len >> 9; - if (unlikely(nsect > nr_sectors)) { - int partial = nr_sectors << 9; - - bio_iovec(bio)->bv_offset += partial; - bio_iovec(bio)->bv_len -= partial; - bio_endio(bio, partial, error); - total_nsect += nr_sectors; - break; - } + /* + * not a complete bvec done + */ + if (unlikely(nbytes > nr_bytes)) { + bio_iovec(bio)->bv_offset += nr_bytes; + bio_iovec(bio)->bv_len -= nr_bytes; + bio_nbytes += nr_bytes; + total_bytes += nr_bytes; + break; + } - /* - * we are ending the last part of the bio, advance req pointer - */ - if ((nsect << 9) >= bio->bi_size) { - req->bio = bio->bi_next; - new_bio = 1; + /* + * advance to the next vector + */ + next_idx++; + bio_nbytes += nbytes; } - bio_endio(bio, nsect << 9, error); - - total_nsect += nsect; - nr_sectors -= nsect; - - /* - * if we didn't advance the req->bio pointer, advance bi_idx - * to indicate we are now on the next bio_vec - */ - if (!new_bio) - bio->bi_idx++; + total_bytes += nbytes; + nr_bytes -= nbytes; if ((bio = req->bio)) { /* * end more in this run, or just return 'not-done' */ - if (unlikely(nr_sectors <= 0)) + if (unlikely(nr_bytes <= 0)) break; } } @@ -2036,17 +2080,64 @@ /* * if the request wasn't completed, update state */ - blk_recalc_rq_sectors(req, total_nsect); + if (bio_nbytes) { + bio_endio(bio, bio_nbytes, error); + req->bio->bi_idx += next_idx; + } + + blk_recalc_rq_sectors(req, total_bytes >> 9); blk_recalc_rq_segments(req); return 1; } +/** + * end_that_request_first - end I/O on a request + * @req: the request being processed + * @uptodate: 0 for I/O error + * @nr_sectors: number of sectors to end I/O on + * + * Description: + * Ends I/O on a number of sectors attached to @req, and sets it up + * for the next range of segments (if any) in the cluster. + * + * Return: + * 0 - we are done with this request, call end_that_request_last() + * 1 - still buffers pending for this request + **/ +int end_that_request_first(struct request *req, int uptodate, int nr_sectors) +{ + return __end_that_request_first(req, uptodate, nr_sectors << 9); +} + +/** + * end_that_request_chunk - end I/O on a request + * @req: the request being processed + * @uptodate: 0 for I/O error + * @nr_bytes: number of bytes to complete + * + * Description: + * Ends I/O on a number of bytes attached to @req, and sets it up + * for the next range of segments (if any). Like end_that_request_first(), + * but deals with bytes instead of sectors. + * + * Return: + * 0 - we are done with this request, call end_that_request_last() + * 1 - still buffers pending for this request + **/ +int end_that_request_chunk(struct request *req, int uptodate, int nr_bytes) +{ + return __end_that_request_first(req, uptodate, nr_bytes); +} + +/* + * queue lock must be held + */ void end_that_request_last(struct request *req) { if (req->waiting) complete(req->waiting); - blk_put_request(req); + __blk_put_request(req->q, req); } int __init blk_dev_init(void) @@ -2092,6 +2183,7 @@ }; EXPORT_SYMBOL(end_that_request_first); +EXPORT_SYMBOL(end_that_request_chunk); EXPORT_SYMBOL(end_that_request_last); EXPORT_SYMBOL(blk_init_queue); EXPORT_SYMBOL(bdev_get_queue); @@ -2112,6 +2204,7 @@ EXPORT_SYMBOL(blk_queue_max_segment_size); EXPORT_SYMBOL(blk_queue_hardsect_size); EXPORT_SYMBOL(blk_queue_segment_boundary); +EXPORT_SYMBOL(blk_queue_dma_alignment); EXPORT_SYMBOL(blk_rq_map_sg); EXPORT_SYMBOL(blk_nohighio); EXPORT_SYMBOL(blk_dump_rq_flags); diff -Nru a/drivers/block/scsi_ioctl.c b/drivers/block/scsi_ioctl.c --- a/drivers/block/scsi_ioctl.c Mon Oct 28 16:32:38 2002 +++ b/drivers/block/scsi_ioctl.c Mon Oct 28 16:32:38 2002 @@ -29,25 +29,36 @@ #include #include #include +#include +#include "../scsi/scsi.h" #include +#include #include -int blk_do_rq(request_queue_t *q, struct request *rq) +#define BLK_DEFAULT_TIMEOUT (60 * HZ) + +int blk_do_rq(request_queue_t *q, struct block_device *bdev, struct request *rq) { DECLARE_COMPLETION(wait); int err = 0; + rq->rq_dev = to_kdev_t(bdev->bd_dev); + rq->rq_disk = bdev->bd_disk; + + /* + * we need an extra reference to the request, so we can look at + * it after io completion + */ + rq->ref_count++; + rq->flags |= REQ_NOMERGE; rq->waiting = &wait; - elv_add_request(q, rq, 1); + elv_add_request(q, rq, 1, 1); generic_unplug_device(q); wait_for_completion(&wait); - /* - * for now, never retry anything - */ if (rq->errors) err = -EIO; @@ -74,42 +85,52 @@ static int sg_get_timeout(request_queue_t *q) { - return HZ; + return q->sg_timeout; } static int sg_set_timeout(request_queue_t *q, int *p) { - int timeout; - int error = get_user(timeout, p); - return error; -} + int timeout, err = get_user(timeout, p); + + if (!err) + q->sg_timeout = timeout; -static int reserved_size = 0; + return err; +} static int sg_get_reserved_size(request_queue_t *q, int *p) { - return put_user(reserved_size, p); + return put_user(q->sg_reserved_size, p); } static int sg_set_reserved_size(request_queue_t *q, int *p) { - int size; - int error = get_user(size, p); - if (!error) - reserved_size = size; - return error; + int size, err = get_user(size, p); + + if (!err) + q->sg_reserved_size = size; + + return err; } +/* + * will always return that we are ATAPI even for a real SCSI drive, I'm not + * so sure this is worth doing anything about (why would you care??) + */ static int sg_emulated_host(request_queue_t *q, int *p) { return put_user(1, p); } -static int sg_io(request_queue_t *q, struct sg_io_hdr *uptr) +static int sg_io(request_queue_t *q, struct block_device *bdev, + struct sg_io_hdr *uptr) { - int err; + unsigned long uaddr, start_time; + int err, reading, writing, nr_sectors; struct sg_io_hdr hdr; struct request *rq; + struct bio *bio; + char sense[24]; void *buffer; if (!access_ok(VERIFY_WRITE, uptr, sizeof(*uptr))) @@ -117,47 +138,260 @@ if (copy_from_user(&hdr, uptr, sizeof(*uptr))) return -EFAULT; - if ( hdr.cmd_len > sizeof(rq->cmd) ) + if (hdr.interface_id != 'S') + return -EINVAL; + if (hdr.cmd_len > sizeof(rq->cmd)) + return -EINVAL; + if (!access_ok(VERIFY_READ, hdr.cmdp, hdr.cmd_len)) + return -EFAULT; + + if (hdr.dxfer_len > 65536) return -EINVAL; + /* + * we'll do that later + */ + if (hdr.iovec_count) + return -EOPNOTSUPP; + + nr_sectors = 0; + reading = writing = 0; buffer = NULL; + bio = NULL; if (hdr.dxfer_len) { unsigned int bytes = (hdr.dxfer_len + 511) & ~511; switch (hdr.dxfer_direction) { default: return -EINVAL; + case SG_DXFER_TO_FROM_DEV: + reading = 1; + /* fall through */ case SG_DXFER_TO_DEV: + writing = 1; + break; case SG_DXFER_FROM_DEV: - case SG_DXFER_TO_FROM_DEV: + reading = 1; break; } - buffer = kmalloc(bytes, GFP_USER); - if (!buffer) - return -ENOMEM; - if (hdr.dxfer_direction == SG_DXFER_TO_DEV || - hdr.dxfer_direction == SG_DXFER_TO_FROM_DEV) - copy_from_user(buffer, hdr.dxferp, hdr.dxfer_len); + + uaddr = (unsigned long) hdr.dxferp; + if (writing && !access_ok(VERIFY_WRITE, uaddr, bytes)) + return -EFAULT; + else if (reading && !access_ok(VERIFY_READ, uaddr, bytes)) + return -EFAULT; + + /* + * first try to map it into a bio. reading from device will + * be a write to vm. + */ + bio = bio_map_user(bdev, uaddr, hdr.dxfer_len, reading); + if (bio) { + if (writing) + bio->bi_rw |= (1 << BIO_RW); + + nr_sectors = (bio->bi_size + 511) >> 9; + + if (bio->bi_size < hdr.dxfer_len) { + bio_endio(bio, bio->bi_size, 0); + bio_unmap_user(bio, 0); + bio = NULL; + } + } + + /* + * if bio setup failed, fall back to slow approach + */ + if (!bio) { + buffer = kmalloc(bytes, q->bounce_gfp | GFP_USER); + if (!buffer) + return -ENOMEM; + + nr_sectors = bytes >> 9; + if (writing) + copy_from_user(buffer,hdr.dxferp,hdr.dxfer_len); + else + memset(buffer, 0, hdr.dxfer_len); + } } rq = blk_get_request(q, WRITE, __GFP_WAIT); - rq->timeout = 60*HZ; - rq->data = buffer; - rq->data_len = hdr.dxfer_len; - rq->flags = REQ_BLOCK_PC; - memset(rq->cmd, 0, sizeof(rq->cmd)); + + /* + * fill in request structure + */ copy_from_user(rq->cmd, hdr.cmdp, hdr.cmd_len); - err = blk_do_rq(q, rq); + if (sizeof(rq->cmd) != hdr.cmd_len) + memset(rq->cmd + hdr.cmd_len, 0, sizeof(rq->cmd) - hdr.cmd_len); + + memset(sense, 0, sizeof(sense)); + rq->sense = sense; + rq->sense_len = 0; + + rq->flags |= REQ_BLOCK_PC; + if (writing) + rq->flags |= REQ_RW; + + rq->hard_nr_sectors = rq->nr_sectors = nr_sectors; + rq->hard_cur_sectors = rq->current_nr_sectors = nr_sectors; + + if (bio) { + /* + * subtle -- if bio_map_user() ended up bouncing a bio, it + * would normally disappear when its bi_end_io is run. + * however, we need it for the unmap, so grab an extra + * reference to it + */ + bio_get(bio); + + rq->nr_phys_segments = bio_phys_segments(q, bio); + rq->nr_hw_segments = bio_hw_segments(q, bio); + rq->current_nr_sectors = bio_cur_sectors(bio); + rq->hard_cur_sectors = rq->current_nr_sectors; + rq->buffer = bio_data(bio); + } + + rq->data_len = hdr.dxfer_len; + rq->data = buffer; + + rq->timeout = hdr.timeout; + if (!rq->timeout) + rq->timeout = q->sg_timeout; + if (!rq->timeout) + rq->timeout = BLK_DEFAULT_TIMEOUT; + + rq->bio = rq->biotail = bio; + + start_time = jiffies; + + /* + * return -EIO if we didn't transfer all data, caller can look at + * residual count to find out how much did succeed + */ + err = blk_do_rq(q, bdev, rq); + if (rq->data_len > 0) + err = -EIO; + + if (bio) { + bio_unmap_user(bio, reading); + bio_put(bio); + } + + hdr.status = rq->errors; + hdr.resid = rq->data_len; + hdr.duration = (jiffies - start_time) * (1000 / HZ); + + if (rq->sense_len && hdr.sbp) { + if (!copy_to_user(hdr.sbp,rq->sense, rq->sense_len)) + hdr.sb_len_wr = rq->sense_len; + } blk_put_request(rq); copy_to_user(uptr, &hdr, sizeof(*uptr)); + if (buffer) { - if (hdr.dxfer_direction == SG_DXFER_FROM_DEV || - hdr.dxfer_direction == SG_DXFER_TO_FROM_DEV) + if (reading) copy_to_user(hdr.dxferp, buffer, hdr.dxfer_len); + kfree(buffer); } + + return err; +} + +#define FORMAT_UNIT_TIMEOUT (2 * 60 * 60 * HZ) +#define START_STOP_TIMEOUT (60 * HZ) +#define MOVE_MEDIUM_TIMEOUT (5 * 60 * HZ) +#define READ_ELEMENT_STATUS_TIMEOUT (5 * 60 * HZ) +#define READ_DEFECT_DATA_TIMEOUT (60 * HZ ) + +static int sg_scsi_ioctl(request_queue_t *q, struct block_device *bdev, + Scsi_Ioctl_Command *sic) +{ + struct request *rq; + int err, in_len, out_len, bytes, opcode, cmdlen; + char *buffer = NULL, sense[24]; + + /* + * get in an out lengths, verify they don't exceed a page worth of data + */ + if (get_user(in_len, &sic->inlen)) + return -EFAULT; + if (get_user(out_len, &sic->outlen)) + return -EFAULT; + if (in_len > PAGE_SIZE || out_len > PAGE_SIZE) + return -EINVAL; + if (get_user(opcode, sic->data)) + return -EFAULT; + + bytes = max(in_len, out_len); + if (bytes) { + buffer = kmalloc(bytes, q->bounce_gfp | GFP_USER); + if (!buffer) + return -ENOMEM; + + memset(buffer, 0, bytes); + } + + rq = blk_get_request(q, WRITE, __GFP_WAIT); + + cmdlen = COMMAND_SIZE(opcode); + + /* + * get command and data to send to device, if any + */ + err = -EFAULT; + if (copy_from_user(rq->cmd, sic->data, cmdlen)) + goto error; + + if (copy_from_user(buffer, sic->data + cmdlen, in_len)) + goto error; + + switch (opcode) { + case FORMAT_UNIT: + rq->timeout = FORMAT_UNIT_TIMEOUT; + break; + case START_STOP: + rq->timeout = START_STOP_TIMEOUT; + break; + case MOVE_MEDIUM: + rq->timeout = MOVE_MEDIUM_TIMEOUT; + break; + case READ_ELEMENT_STATUS: + rq->timeout = READ_ELEMENT_STATUS_TIMEOUT; + break; + case READ_DEFECT_DATA: + rq->timeout = READ_DEFECT_DATA_TIMEOUT; + break; + default: + rq->timeout = BLK_DEFAULT_TIMEOUT; + break; + } + + memset(sense, 0, sizeof(sense)); + rq->sense = sense; + rq->sense_len = 0; + + rq->data = buffer; + rq->data_len = bytes; + rq->flags |= REQ_BLOCK_PC; + if (in_len) + rq->flags |= REQ_RW; + + err = blk_do_rq(q, bdev, rq); + if (err) { + if (rq->sense_len) + if (copy_to_user(sic->data, rq->sense, rq->sense_len)) + err = -EFAULT; + } else { + if (copy_to_user(sic->data, buffer, out_len)) + err = -EFAULT; + } + +error: + kfree(buffer); + blk_put_request(rq); return err; } @@ -172,6 +406,9 @@ return -ENXIO; switch (cmd) { + /* + * new sgv3 interface + */ case SG_GET_VERSION_NUM: return sg_get_version((int *) arg); case SCSI_IOCTL_GET_IDLUN: @@ -189,7 +426,25 @@ case SG_EMULATED_HOST: return sg_emulated_host(q, (int *) arg); case SG_IO: - return sg_io(q, (struct sg_io_hdr *) arg); + err = bd_claim(bdev, current); + if (err) + break; + err = sg_io(q, bdev, (struct sg_io_hdr *) arg); + bd_release(bdev); + break; + /* + * old junk scsi send command ioctl + */ + case SCSI_IOCTL_SEND_COMMAND: + if (!arg) + return -EINVAL; + + err = bd_claim(bdev, current); + if (err) + break; + err = sg_scsi_ioctl(q, bdev, (Scsi_Ioctl_Command *)arg); + bd_release(bdev); + break; case CDROMCLOSETRAY: close = 1; case CDROMEJECT: @@ -197,11 +452,11 @@ rq->flags = REQ_BLOCK_PC; rq->data = NULL; rq->data_len = 0; - rq->timeout = 60*HZ; + rq->timeout = BLK_DEFAULT_TIMEOUT; memset(rq->cmd, 0, sizeof(rq->cmd)); rq->cmd[0] = GPCMD_START_STOP_UNIT; rq->cmd[4] = 0x02 + (close != 0); - err = blk_do_rq(q, rq); + err = blk_do_rq(q, bdev, rq); blk_put_request(rq); break; default: diff -Nru a/drivers/block/umem.c b/drivers/block/umem.c --- a/drivers/block/umem.c Mon Oct 28 16:32:38 2002 +++ b/drivers/block/umem.c Mon Oct 28 16:32:38 2002 @@ -548,12 +548,7 @@ return_bio = bio->bi_next; bio->bi_next = NULL; - /* should use bio_endio(), however already cleared - * BIO_UPTODATE. so set bio->bi_size = 0 manually to indicate - * completely done - */ - bio->bi_size = 0; - bio->bi_end_io(bio, bytes, 0); + bio_endio(bio, bio->bi_size, 0); } } @@ -1041,7 +1036,7 @@ spin_lock_init(&card->lock); - dev->driver_data = card; + pci_set_drvdata(dev, card); if (pci_write_cmd != 0x0F) /* If not Memory Write & Invalidate */ pci_write_cmd = 0x07; /* then Memory Write command */ @@ -1100,7 +1095,7 @@ */ static void mm_pci_remove(struct pci_dev *dev) { - struct cardinfo *card = dev->driver_data; + struct cardinfo *card = pci_get_drvdata(dev); tasklet_kill(&card->tasklet); iounmap(card->csr_remap); diff -Nru a/drivers/block/xd.h b/drivers/block/xd.h --- a/drivers/block/xd.h Mon Oct 28 16:32:36 2002 +++ b/drivers/block/xd.h Mon Oct 28 16:32:36 2002 @@ -109,7 +109,6 @@ static u_char xd_detect (u_char *controller, unsigned int *address); static u_char xd_initdrives (void (*init_drive)(u_char drive)); -static int xd_open (struct inode *inode,struct file *file); static void do_xd_request (request_queue_t * q); static int xd_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg); static int xd_readwrite (u_char operation,u_char drive,char *buffer,u_int block,u_int count); diff -Nru a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c --- a/drivers/bluetooth/bluecard_cs.c Mon Oct 28 16:32:36 2002 +++ b/drivers/bluetooth/bluecard_cs.c Mon Oct 28 16:32:36 2002 @@ -456,27 +456,27 @@ if (info->rx_count == 0) { int dlen; - hci_event_hdr *eh; - hci_acl_hdr *ah; - hci_sco_hdr *sh; + struct hci_event_hdr *eh; + struct hci_acl_hdr *ah; + struct hci_sco_hdr *sh; switch (info->rx_state) { case RECV_WAIT_EVENT_HEADER: - eh = (hci_event_hdr *)(info->rx_skb->data); + eh = (struct hci_event_hdr *)(info->rx_skb->data); info->rx_state = RECV_WAIT_DATA; info->rx_count = eh->plen; break; case RECV_WAIT_ACL_HEADER: - ah = (hci_acl_hdr *)(info->rx_skb->data); + ah = (struct hci_acl_hdr *)(info->rx_skb->data); dlen = __le16_to_cpu(ah->dlen); info->rx_state = RECV_WAIT_DATA; info->rx_count = dlen; break; case RECV_WAIT_SCO_HEADER: - sh = (hci_sco_hdr *)(info->rx_skb->data); + sh = (struct hci_sco_hdr *)(info->rx_skb->data); info->rx_state = RECV_WAIT_DATA; info->rx_count = sh->dlen; break; diff -Nru a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c --- a/drivers/bluetooth/bt3c_cs.c Mon Oct 28 16:32:38 2002 +++ b/drivers/bluetooth/bt3c_cs.c Mon Oct 28 16:32:38 2002 @@ -318,27 +318,27 @@ if (info->rx_count == 0) { int dlen; - hci_event_hdr *eh; - hci_acl_hdr *ah; - hci_sco_hdr *sh; + struct hci_event_hdr *eh; + struct hci_acl_hdr *ah; + struct hci_sco_hdr *sh; switch (info->rx_state) { case RECV_WAIT_EVENT_HEADER: - eh = (hci_event_hdr *)(info->rx_skb->data); + eh = (struct hci_event_hdr *)(info->rx_skb->data); info->rx_state = RECV_WAIT_DATA; info->rx_count = eh->plen; break; case RECV_WAIT_ACL_HEADER: - ah = (hci_acl_hdr *)(info->rx_skb->data); + ah = (struct hci_acl_hdr *)(info->rx_skb->data); dlen = __le16_to_cpu(ah->dlen); info->rx_state = RECV_WAIT_DATA; info->rx_count = dlen; break; case RECV_WAIT_SCO_HEADER: - sh = (hci_sco_hdr *)(info->rx_skb->data); + sh = (struct hci_sco_hdr *)(info->rx_skb->data); info->rx_state = RECV_WAIT_DATA; info->rx_count = sh->dlen; break; diff -Nru a/drivers/bluetooth/hci_usb.c b/drivers/bluetooth/hci_usb.c --- a/drivers/bluetooth/hci_usb.c Mon Oct 28 16:32:37 2002 +++ b/drivers/bluetooth/hci_usb.c Mon Oct 28 16:32:37 2002 @@ -438,16 +438,34 @@ __u8 *data = urb->transfer_buffer; int count = urb->actual_length; int len = HCI_EVENT_HDR_SIZE; + int status; BT_DBG("%s urb %p count %d", husb->hdev.name, urb, count); if (!test_bit(HCI_RUNNING, &husb->hdev.flags)) return; - if (urb->status || !count) { + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + BT_DBG("%s urb shutting down with status: %d", + husb->hdev.name, urb->status); + return; + default: + BT_ERR("%s nonzero urb status received: %d", + husb->hdev.name, urb->status); + goto exit; + } + + if (!count) { BT_DBG("%s intr status %d, count %d", husb->hdev.name, urb->status, count); - return; + goto exit; } read_lock(&husb->completion_lock); @@ -499,12 +517,18 @@ done: read_unlock(&husb->completion_lock); - return; + goto exit; bad_len: BT_ERR("%s bad frame len %d expected %d", husb->hdev.name, count, len); husb->hdev.stat.err_rx++; read_unlock(&husb->completion_lock); + +exit: + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + BT_ERR ("%s usb_submit_urb failed with result %d", + husb->hdev.name, status); } static void hci_usb_tx_complete(struct urb *urb) diff -Nru a/drivers/cdrom/gscd.c b/drivers/cdrom/gscd.c --- a/drivers/cdrom/gscd.c Mon Oct 28 16:32:35 2002 +++ b/drivers/cdrom/gscd.c Mon Oct 28 16:32:35 2002 @@ -268,7 +268,7 @@ goto out; if (req->cmd != READ) { - printk("GSCD: bad cmd %d\n", req->cmd); + printk("GSCD: bad cmd %d\n", rq_data_dir(req)); end_request(req, 0); goto repeat; } diff -Nru a/drivers/char/Makefile b/drivers/char/Makefile --- a/drivers/char/Makefile Mon Oct 28 16:32:38 2002 +++ b/drivers/char/Makefile Mon Oct 28 16:32:38 2002 @@ -110,7 +110,7 @@ include $(TOPDIR)/Rules.make $(obj)/consolemap_deftbl.c: $(src)/$(FONTMAPFILE) - $(call do_cmd,CONMK $(echo_target),$(objtree)/scripts/conmakehash $< > $@) + $(call do_cmd,CONMK $@,$(objtree)/scripts/conmakehash $< > $@) $(obj)/defkeymap.o: $(obj)/defkeymap.c diff -Nru a/drivers/char/dz.c b/drivers/char/dz.c --- a/drivers/char/dz.c Mon Oct 28 16:32:35 2002 +++ b/drivers/char/dz.c Mon Oct 28 16:32:35 2002 @@ -34,7 +34,6 @@ #include #include #include -#include #include #include #include diff -Nru a/drivers/char/i810-tco.c b/drivers/char/i810-tco.c --- a/drivers/char/i810-tco.c Mon Oct 28 16:32:35 2002 +++ b/drivers/char/i810-tco.c Mon Oct 28 16:32:35 2002 @@ -244,9 +244,9 @@ int options, retval = -EINVAL; static struct watchdog_info ident = { - options: WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING, - firmware_version: 0, - identity: "i810 TCO timer", + .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING, + .firmware_version = 0, + .identity = "i810 TCO timer", }; switch (cmd) { default: @@ -371,17 +371,17 @@ } static struct file_operations i810tco_fops = { - owner: THIS_MODULE, - write: i810tco_write, - ioctl: i810tco_ioctl, - open: i810tco_open, - release: i810tco_release, + .owner = THIS_MODULE, + .write = i810tco_write, + .ioctl = i810tco_ioctl, + .open = i810tco_open, + .release = i810tco_release, }; static struct miscdevice i810tco_miscdev = { - minor: WATCHDOG_MINOR, - name: "watchdog", - fops: &i810tco_fops, + .minor = WATCHDOG_MINOR, + .name = "watchdog", + .fops = &i810tco_fops, }; static int __init watchdog_init (void) diff -Nru a/drivers/char/ip2/i2lib.c b/drivers/char/ip2/i2lib.c --- a/drivers/char/ip2/i2lib.c Mon Oct 28 16:32:38 2002 +++ b/drivers/char/ip2/i2lib.c Mon Oct 28 16:32:38 2002 @@ -84,8 +84,8 @@ static void serviceOutgoingFifo(i2eBordStrPtr); // Functions defined in ip2.c as part of interrupt handling -static void do_input(i2ChanStrPtr); -static void do_status(i2ChanStrPtr); +static void do_input(void *); +static void do_status(void *); //*************** //* Debug Data * @@ -333,10 +333,8 @@ pCh->ClosingWaitTime = 30*HZ; // Initialize task queue objects - pCh->tqueue_input.routine = (void(*)(void*)) do_input; - pCh->tqueue_input.data = pCh; - pCh->tqueue_status.routine = (void(*)(void*)) do_status; - pCh->tqueue_status.data = pCh; + INIT_WORK(&pCh->tqueue_input, do_input, pCh); + INIT_WORK(&pCh->tqueue_status, do_status, pCh); #ifdef IP2DEBUG_TRACE pCh->trace = ip2trace; diff -Nru a/drivers/char/ip2main.c b/drivers/char/ip2main.c --- a/drivers/char/ip2main.c Mon Oct 28 16:32:38 2002 +++ b/drivers/char/ip2main.c Mon Oct 28 16:32:38 2002 @@ -281,8 +281,8 @@ static void ip2_interrupt(int irq, void *dev_id, struct pt_regs * regs); static void ip2_poll(unsigned long arg); static inline void service_all_boards(void); -static inline void do_input(i2ChanStrPtr pCh); -static inline void do_status(i2ChanStrPtr pCh); +static void do_input(void *p); +static void do_status(void *p); static void ip2_wait_until_sent(PTTY,int); @@ -1422,9 +1422,9 @@ ip2trace (ITRC_NO_PORT, ITRC_INTR, ITRC_RETURN, 0 ); } -static inline void -do_input( i2ChanStrPtr pCh ) +static void do_input(void *p) { + i2ChanStrPtr pCh = p; unsigned long flags; ip2trace(CHANN, ITRC_INPUT, 21, 0 ); @@ -1445,8 +1445,7 @@ } // code duplicated from n_tty (ldisc) -static inline void -isig(int sig, struct tty_struct *tty, int flush) +static inline void isig(int sig, struct tty_struct *tty, int flush) { if (tty->pgrp > 0) kill_pg(tty->pgrp, sig, 1); @@ -1457,9 +1456,9 @@ } } -static inline void -do_status( i2ChanStrPtr pCh ) +static void do_status(void *p) { + i2ChanStrPtr pCh = p; int status; status = i2GetStatus( pCh, (I2_BRK|I2_PAR|I2_FRA|I2_OVR) ); diff -Nru a/drivers/char/istallion.c b/drivers/char/istallion.c --- a/drivers/char/istallion.c Mon Oct 28 16:32:37 2002 +++ b/drivers/char/istallion.c Mon Oct 28 16:32:37 2002 @@ -3371,8 +3371,7 @@ portp->baud_base = STL_BAUDBASE; portp->close_delay = STL_CLOSEDELAY; portp->closing_wait = 30 * HZ; - portp->tqhangup.routine = stli_dohangup; - portp->tqhangup.data = portp; + INIT_WORK(&portp->tqhangup, stli_dohangup, portp); init_waitqueue_head(&portp->open_wait); init_waitqueue_head(&portp->close_wait); init_waitqueue_head(&portp->raw_wait); diff -Nru a/drivers/char/specialix.c b/drivers/char/specialix.c --- a/drivers/char/specialix.c Mon Oct 28 16:32:37 2002 +++ b/drivers/char/specialix.c Mon Oct 28 16:32:37 2002 @@ -90,7 +90,6 @@ #include #include #include -#include #include #include diff -Nru a/drivers/char/stallion.c b/drivers/char/stallion.c --- a/drivers/char/stallion.c Mon Oct 28 16:32:36 2002 +++ b/drivers/char/stallion.c Mon Oct 28 16:32:36 2002 @@ -2343,8 +2343,7 @@ portp->closing_wait = 30 * HZ; portp->normaltermios = stl_deftermios; portp->callouttermios = stl_deftermios; - portp->tqueue.routine = stl_offintr; - portp->tqueue.data = portp; + INIT_WORK(&portp->tqueue, stl_offintr, portp); init_waitqueue_head(&portp->open_wait); init_waitqueue_head(&portp->close_wait); portp->stats.brd = portp->brdnr; @@ -4128,7 +4127,7 @@ (test_bit(ASYI_TXLOW, &portp->istate) == 0))) { set_bit(ASYI_TXLOW, &portp->istate); MOD_INC_USE_COUNT; - if (schedule_task(&portp->tqueue) == 0) + if (schedule_work(&portp->tqueue) == 0) MOD_DEC_USE_COUNT; } diff -Nru a/drivers/char/tpqic02.c b/drivers/char/tpqic02.c --- a/drivers/char/tpqic02.c Mon Oct 28 16:32:36 2002 +++ b/drivers/char/tpqic02.c Mon Oct 28 16:32:36 2002 @@ -116,26 +116,28 @@ * card+drive info if runtime configuration has been selected. */ -static struct mtconfiginfo qic02_tape_dynconf = /* user settable */ -{ 0, 0, BOGUS_IRQ, 0, 0, TPQD_DEFAULT_FLAGS, }; +static struct mtconfiginfo qic02_tape_dynconf = { + /* user settable */ + 0, 0, BOGUS_IRQ, 0, 0, TPQD_DEFAULT_FLAGS, +}; static struct qic02_ccb qic02_tape_ccb; /* private stuff */ #else -unsigned long qic02_tape_debug = TPQD_DEFAULT_FLAGS; +static unsigned long qic02_tape_debug = TPQD_DEFAULT_FLAGS; # if ((QIC02_TAPE_IFC!=WANGTEK) && (QIC02_TAPE_IFC!=ARCHIVE) && (QIC02_TAPE_IFC!=MOUNTAIN)) # error No valid interface card specified # endif #endif /* CONFIG_QIC02_DYNCONF */ -static volatile int ctlbits; /* control reg bits for tape interface */ +static int ctlbits; /* control reg bits for tape interface */ static wait_queue_head_t qic02_tape_transfer; /* sync rw with interrupts */ -static volatile struct mtget ioctl_status; /* current generic status */ +static struct mtget ioctl_status; /* current generic status */ -static volatile struct tpstatus tperror; /* last drive status */ +static struct tpstatus tperror; /* last drive status */ static char rcs_revision[] = "$Revision: 1.10 $"; static char rcs_date[] = "$Date: 1997/01/26 07:13:20 $"; @@ -145,32 +147,34 @@ * Some variables need `volatile' because they may be modified * by an interrupt. */ -static volatile flag status_dead = YES; /* device is legally dead until proven alive */ +static flag status_dead = YES; /* device is legally dead until proven alive */ static flag status_zombie = YES; /* it's `zombie' until irq/dma allocated */ -static volatile flag status_bytes_wr = NO; /* write FM at close or not */ -static volatile flag status_bytes_rd = NO; /* (rd|wr) used for rewinding */ +static flag status_bytes_wr = NO; /* write FM at close or not */ +static flag status_bytes_rd = NO; /* (rd|wr) used for rewinding */ static volatile unsigned long status_cmd_pending; /* cmd in progress */ -static volatile flag status_expect_int = NO; /* ready for interrupts */ -static volatile flag status_timer_on = NO; /* using time-out */ -static volatile int status_error; /* int handler may detect error */ -static volatile flag status_eof_detected = NO; /* end of file */ -static volatile flag status_eom_detected = NO; /* end of recorded media */ -static volatile flag status_eot_detected = NO; /* end of tape */ -static volatile flag doing_read = NO; -static volatile flag doing_write = NO; +static flag status_expect_int = NO; /* ready for interrupts */ +static flag status_timer_on = NO; /* using time-out */ +static int status_error; /* int handler may detect error */ +static flag status_eof_detected = NO; /* end of file */ +static flag status_eom_detected = NO; /* end of recorded media */ +static flag status_eot_detected = NO; /* end of tape */ +static flag doing_read = NO; +static flag doing_write = NO; -static volatile unsigned long dma_bytes_todo; -static volatile unsigned long dma_bytes_done; +static unsigned long dma_bytes_todo; +static unsigned long dma_bytes_done; static volatile unsigned dma_mode; /* !=0 also means DMA in use */ static flag need_rewind = YES; static kdev_t current_tape_dev; static int extra_blocks_left = BLOCKS_BEYOND_EW; - static struct timer_list tp_timer; +static unsigned long tape_open; /* Guard open one only */ +static DECLARE_MUTEX(tape_op); /* Serialize tape operations */ + /* return_*_eof: * NO: not at EOF, * YES: tell app EOF was reached (return 0). @@ -183,6 +187,7 @@ * move on to the next file. * */ + static flag return_read_eof = NO; /* set to signal app EOF was reached */ static flag return_write_eof = NO; static flag reported_read_eof = NO; /* set when we've done that */ @@ -248,70 +253,34 @@ const char *msg; /* EXC_nr attribute should match with tpqic02.h */ } exception_list[] = { - { - 0, 0, "Unknown exception status code", /* extra: 0 */ }, - { - ~(0), TP_ST0 | TP_CNI | TP_USL | TP_WRP, - "Drive not online" /* 1 */ }, - /* Drive presence goes before cartridge presence. */ - { - ~(TP_WRP | TP_USL), TP_ST0 | TP_CNI, + { 0, 0, "Unknown exception status code", /* extra: 0 */ }, + { ~(0), TP_ST0 | TP_CNI | TP_USL | TP_WRP, "Drive not online" /* 1 */ }, /* Drive presence goes before cartridge presence. */ + { ~(TP_WRP | TP_USL), TP_ST0 | TP_CNI, /* My Wangtek 5150EQ sometimes reports a status code * of 0x00e0, which is not a valid exception code, but * I think it should be recognized as "NO CARTRIDGE". */ - "Cartridge not in place" /* 2 */ }, - { - (unsigned short) ~(TP_ST1 | TP_BOM), (TP_ST0 | TP_WRP), - "Write protected cartridge" /* 3 */ }, - { - (unsigned short) ~(TP_ST1 | TP_EOR), (TP_ST0 | TP_EOM), - "End of media" /* 4 */ }, - { - ~TP_WRP, TP_ST0 | TP_UDA | TP_ST1 | TP_BOM, - "Read or Write abort. Rewind tape." /* 5 */ }, - { - ~TP_WRP, TP_ST0 | TP_UDA, - "Read error. Bad block transferred." /* 6 */ }, - { - ~TP_WRP, TP_ST0 | TP_UDA | TP_BNL, - "Read error. Filler block transferred." /* 7 */ }, - { - ~TP_WRP, TP_ST0 | TP_UDA | TP_BNL | TP_ST1 | TP_NDT, - "Read error. No data detected." /* 8 */ }, - { - ~TP_WRP, - TP_ST0 | TP_EOM | TP_UDA | TP_BNL | TP_ST1 | - TP_NDT, "Read error. No data detected. EOM." /* 9 */ }, - { - ~(TP_WRP | TP_MBD | TP_PAR | TP_EOR), - TP_ST0 | TP_UDA | TP_BNL | TP_ST1 | TP_NDT | - TP_BOM, - "Read error. No data detected. BOM." /* 10 */ }, - { - ~(TP_WRP | TP_EOM), TP_ST0 | TP_FIL, + "Cartridge not in place" /* 2 */ }, + { (unsigned short) ~(TP_ST1 | TP_BOM), (TP_ST0 | TP_WRP), "Write protected cartridge" /* 3 */ }, + { (unsigned short) ~(TP_ST1 | TP_EOR), (TP_ST0 | TP_EOM), "End of media" /* 4 */ }, + { ~TP_WRP, TP_ST0 | TP_UDA | TP_ST1 | TP_BOM, "Read or Write abort. Rewind tape." /* 5 */ }, + { ~TP_WRP, TP_ST0 | TP_UDA, "Read error. Bad block transferred." /* 6 */ }, + { ~TP_WRP, TP_ST0 | TP_UDA | TP_BNL, "Read error. Filler block transferred." /* 7 */ }, + { ~TP_WRP, TP_ST0 | TP_UDA | TP_BNL | TP_ST1 | TP_NDT, "Read error. No data detected." /* 8 */ }, + { ~TP_WRP, TP_ST0 | TP_EOM | TP_UDA | TP_BNL | TP_ST1 | TP_NDT, "Read error. No data detected. EOM." /* 9 */ }, + { ~(TP_WRP | TP_MBD | TP_PAR | TP_EOR), TP_ST0 | TP_UDA | TP_BNL | TP_ST1 | TP_NDT | TP_BOM, "Read error. No data detected. BOM." /* 10 */ }, + { ~(TP_WRP | TP_EOM), TP_ST0 | TP_FIL, /* Status 0x0089 (EOM & FM) is viewed as an FM, * because it can only happen during a read. * EOM is checked separately for an FM condition. */ - "File mark detected" /* 11 */ }, - { - ~(TP_ST0 | TP_CNI | TP_USL | TP_WRP | TP_BOM), - TP_ST1 | TP_ILL, "Illegal command" /* 12 */ }, - { - ~(TP_ST0 | TP_CNI | TP_USL | TP_WRP | TP_BOM), - TP_ST1 | TP_POR, "Reset occurred" /* 13 */ }, - { - ~TP_WRP, TP_ST0 | TP_FIL | TP_MBD, /* NOTE: ST1 not set! */ - "Marginal block detected" /* 14 */ }, - { - ~(TP_ST0 | TP_WRP | TP_EOM | TP_UDA | TP_BNL | TP_FIL | - TP_NDT), TP_ST1 | TP_EOR, - /********** Is the extra TP_NDT really needed Eddy? **********/ - "End of recorded media" /* extra: 15 */ }, + "File mark detected" /* 11 */ }, + { ~(TP_ST0 | TP_CNI | TP_USL | TP_WRP | TP_BOM), TP_ST1 | TP_ILL, "Illegal command" /* 12 */ }, + { ~(TP_ST0 | TP_CNI | TP_USL | TP_WRP | TP_BOM), TP_ST1 | TP_POR, "Reset occurred" /* 13 */ }, + { ~TP_WRP, TP_ST0 | TP_FIL | TP_MBD, /* NOTE: ST1 not set! */ "Marginal block detected" /* 14 */ }, + { ~(TP_ST0 | TP_WRP | TP_EOM | TP_UDA | TP_BNL | TP_FIL | TP_NDT), TP_ST1 | TP_EOR, /********** Is the extra TP_NDT really needed Eddy? **********/ "End of recorded media" /* extra: 15 */ }, /* 15 is returned when SEEKEOD completes successfully */ - { - ~(TP_WRP | TP_ST0), TP_ST1 | TP_BOM, "Beginning of media" /* extra: 16 */ } + { ~(TP_WRP | TP_ST0), TP_ST1 | TP_BOM, "Beginning of media" /* extra: 16 */ } }; #define NR_OF_EXC (sizeof(exception_list)/sizeof(struct exception_list_type)) @@ -333,24 +302,12 @@ } /* tpqputs */ -/* Perform byte order swapping for a 16-bit word. - * - * [FIXME] This should probably be in include/asm/ - * ([FIXME] i486 can do this faster) - */ -static inline void byte_swap_w(volatile unsigned short *w) -{ - int t = *w; - *w = (t >> 8) | ((t & 0xff) << 8); -} - - - /* Init control register bits on interface card. * For Archive, interrupts must be enabled explicitly. * Wangtek interface card requires ONLINE to be set, Archive SC402/SC499R * cards keep it active all the time. */ + static void ifc_init(void) { if (QIC02_TAPE_IFC == WANGTEK) { /* || (QIC02_TAPE_IFC == EVEREX) */ @@ -374,10 +331,8 @@ tpqputs(TPQD_ALWAYS, "Oops -- report_qic_exception"); n = 0; } - if (TPQDBG(SENSE_TEXT) || n == 0) { - printk(TPQIC02_NAME ": sense: %s\n", - exception_list[n].msg); - } + if (TPQDBG(SENSE_TEXT) || n == 0) + printk(TPQIC02_NAME ": sense: %s\n", exception_list[n].msg); } /* report_qic_exception */ @@ -395,9 +350,7 @@ return i; } } - printk(TPQIC02_NAME - ": decode_qic_exception_nr: exception(%x) not recognized\n", - s); + printk(TPQIC02_NAME ": decode_qic_exception_nr: exception(%x) not recognized\n", s); return 0; } /* decode_qic_exception_nr */ @@ -477,15 +430,13 @@ /* KLUDGE FOR G++ BUG */ { int stat = inb_p(QIC02_STAT_PORT); - status_dead = - ((stat & QIC02_STAT_RESETMASK) != QIC02_STAT_RESETVAL); + status_dead = ((stat & QIC02_STAT_RESETMASK) != QIC02_STAT_RESETVAL); } /* if successful, inb(STAT) returned RESETVAL */ - if (status_dead == YES) { + if (status_dead == YES) printk(TPQIC02_NAME ": reset failed!\n"); - } else if (verbose) { + else if (verbose) printk(TPQIC02_NAME ": reset successful\n"); - } return (status_dead == YES) ? TE_DEAD : TE_OK; } /* tape_reset */ @@ -528,11 +479,10 @@ * it could be *much* longer! */ while ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) && (--i > 0)) - /*skip */ ; + udelay(1); /* wait for ready */ if (i == 0) { - tpqputs(TPQD_ALWAYS, - "timed out waiting for ready in notify_cmd"); + tpqputs(TPQD_ALWAYS, "timed out waiting for ready in notify_cmd"); status_dead = YES; return TE_TIM; } @@ -541,7 +491,7 @@ i = TAPE_NOTIFY_TIMEOUT; /* according to the specs this one should never time-out */ while (((inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) == 0) && (--i > 0)) - /*skip */ ; + udelay(1); /* wait for not ready */ if (i == 0) { tpqputs(TPQD_ALWAYS, "timed out waiting for !ready in notify_cmd"); @@ -568,7 +518,7 @@ */ spin_t = 50; while (((stat = inb_p(QIC02_STAT_PORT) & QIC02_STAT_MASK) == QIC02_STAT_MASK) && (--spin_t > 0)) - /*SKIP*/; + udelay(1); if ((stat & QIC02_STAT_READY) == 0) return TE_OK; /* covers 99.99% of all calls */ @@ -580,9 +530,11 @@ spin_t += jiffies; /* FIXME...*/ - while (((stat = inb_p(QIC02_STAT_PORT) & QIC02_STAT_MASK) == QIC02_STAT_MASK) - && time_before(jiffies, spin_t)) - schedule(); /* don't waste all the CPU time */ + while (((stat = inb_p(QIC02_STAT_PORT) & QIC02_STAT_MASK) == QIC02_STAT_MASK) && time_before(jiffies, spin_t)) + { + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(1); /* don't waste all the CPU time */ + } if ((stat & QIC02_STAT_READY) == 0) return TE_OK; @@ -611,8 +563,7 @@ } if ((stat & QIC02_STAT_EXCEPTION) == 0) { - tpqputs(TPQD_ALWAYS, - "exception detected after waiting_for_ready"); + tpqputs(TPQD_ALWAYS, "exception detected after waiting_for_ready"); return TE_EX; } else { return TE_OK; @@ -627,7 +578,6 @@ int i, stat; for (i = 0; i < size; i++) { - stat = wait_for_ready(TIM_S); if (stat != TE_OK) return stat; @@ -700,9 +650,12 @@ * de-schedule immediately, we waste a lot of time because a * task switch is much longer than we usually have to wait here. */ - n = 1000; /* 500 is not enough on a 486/33 */ + n = 700; while ((n > 0) && ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_MASK) == QIC02_STAT_MASK)) + { + udelay(1); n--; /* wait for ready or exception or timeout */ + } if (n == 0) { /* n (above) should be chosen such that on your machine * you rarely ever see the message below, and it should @@ -711,7 +664,10 @@ /* FIXME */ tpqputs(TPQD_ALWAYS, "waiting looong in rdstatus() -- drive dead?"); while ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_MASK) == QIC02_STAT_MASK) - schedule(); + { + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(1); + } tpqputs(TPQD_ALWAYS, "finished waiting in rdstatus()"); } @@ -737,12 +693,12 @@ *q = inb_p(QIC02_DATA_PORT); /* read status byte */ if (TP_DIAGS(current_tape_dev)) - printk("[%1d]=0x%x ", q - stp, - (unsigned) (*q) & 0xff); + printk("[%1d]=0x%x ", q - stp, (unsigned) (*q) & 0xff); outb_p(ctlbits | QIC02_CTL_REQUEST, QIC02_CTL_PORT); /* set request */ - while ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) == 0); /* wait for not ready */ + while ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) == 0) + cpu_relax(); /* wait for not ready */ udelay(22); /* delay >20 usec */ @@ -754,7 +710,7 @@ * My drive doesn't seem to need it here yet, but others do? */ while (inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) - /*skip */ ; + cpu_relax(); /* wait for ready */ if (TP_DIAGS(current_tape_dev)) @@ -772,13 +728,8 @@ static int get_status(volatile struct tpstatus *stp) { int stat = rdstatus((char *) stp, TPSTATSIZE, QCMD_RD_STAT); -#if defined(__i386__) || defined (__x86_64__) - byte_swap_w(&(stp->dec)); - byte_swap_w(&(stp->urc)); -#else -#warning Undefined architecture - /* should probably swap status bytes #definition */ -#endif + stp->dec = be16_to_cpu(stp->dec); + stp->urc = be16_to_cpu(stp->urc); return stat; } /* get_status */ @@ -823,8 +774,7 @@ static void finish_rw(int cmd); if (TPQDBG(SENSE_TEXT)) - printk(TPQIC02_NAME ": tp_sense(ignore=0x%x) enter\n", - ignore); + printk(TPQIC02_NAME ": tp_sense(ignore=0x%x) enter\n", ignore); /* sense() is not allowed during a read or write cycle */ if (doing_write == YES) @@ -842,11 +792,8 @@ if (err & (TP_ST0 | TP_ST1)) printk(TPQIC02_NAME ": tp_sense: status: %x, error count: %d, underruns: %d\n", tperror.exs, tperror.dec, tperror.urc); - else if ((tperror.dec != 0) || (tperror.urc != 0) - || TPQDBG(SENSE_CNTS)) - printk(TPQIC02_NAME - ": tp_sense: no hard errors, soft error count: %d, underruns: %d\n", - tperror.dec, tperror.urc); + else if ((tperror.dec != 0) || (tperror.urc != 0) || TPQDBG(SENSE_CNTS)) + printk(TPQIC02_NAME ": tp_sense: no hard errors, soft error count: %d, underruns: %d\n", tperror.dec, tperror.urc); /* Set generic status. HP-UX defines these, but some extra would * be useful. Problem is to remain compatible. [Do we want to be @@ -909,9 +856,7 @@ stat = inb(QIC02_STAT_PORT) & QIC02_STAT_MASK; if (TPQDBG(REWIND)) - printk(TPQIC02_NAME - ": Waiting for (re-)wind to finish: stat=0x%x\n", - stat); + printk(TPQIC02_NAME ": Waiting for (re-)wind to finish: stat=0x%x\n", stat); stat = wait_for_ready(timeout); @@ -946,13 +891,13 @@ stat = TE_OK; } if (stat != TE_OK) { - printk(TPQIC02_NAME ": ll_do_qic_cmd(%x, %ld) failed\n", - cmd, (long) timeout); + printk(TPQIC02_NAME ": ll_do_qic_cmd(%x, %ld) failed\n", cmd, (long) timeout); return -EIO; } #if OBSOLETE /* wait for ready since it may not be active immediately after reading status */ - while ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) != 0); + while ((inb_p(QIC02_STAT_PORT) & QIC02_STAT_READY) != 0) + cpu_relax(); #endif stat = send_qic02_cmd(cmd, timeout, 0); /* (checks for exceptions) */ @@ -982,21 +927,16 @@ /* sense() will set eof/eom as required */ if (stat == TE_EX) { if (tp_sense(TP_WRP | TP_BOM | TP_EOM | TP_FIL) != TE_OK) { - printk(TPQIC02_NAME - ": Exception persist in ll_do_qic_cmd[1](%x, %ld)", - cmd, (long) timeout); + printk(TPQIC02_NAME ": Exception persist in ll_do_qic_cmd[1](%x, %ld)", cmd, (long) timeout); status_dead = YES; return -ENXIO; /* if rdstatus fails too, we're in trouble */ } } else if (stat != TE_OK) { - printk(TPQIC02_NAME - ": ll_do_qic_cmd: send_qic02_cmd failed, stat = 0x%x\n", - stat); + printk(TPQIC02_NAME ": ll_do_qic_cmd: send_qic02_cmd failed, stat = 0x%x\n", stat); return -EIO; /*** -EIO is probably not always appropriate */ } - if (timeout == TIM_R) stat = wait_for_rewind(timeout); else @@ -1007,18 +947,14 @@ TP_EOR | TP_NDT | TP_UDA | TP_BNL | TP_WRP | TP_BOM | TP_EOM | TP_FIL : TP_WRP | TP_BOM | TP_EOM | TP_FIL)) != TE_OK) { - printk(TPQIC02_NAME - ": Exception persist in ll_do_qic_cmd[2](%x, %ld)\n", - cmd, (long) timeout); + printk(TPQIC02_NAME ": Exception persist in ll_do_qic_cmd[2](%x, %ld)\n", cmd, (long) timeout); if (cmd != QCMD_RD_FM) status_dead = YES; return -ENXIO; /* if rdstatus fails too, we're in trouble */ } } else if (stat != TE_OK) { - printk(TPQIC02_NAME - ": ll_do_qic_cmd %x: wait failed, stat == 0x%x\n", - cmd, stat); + printk(TPQIC02_NAME ": ll_do_qic_cmd %x: wait failed, stat == 0x%x\n", cmd, stat); return -EIO; } return 0; @@ -1052,30 +988,30 @@ static void terminate_read(int cmd) { - if (doing_read == YES) { - doing_read = NO; - if (cmd != QCMD_RD_FM) { - /* if the command is a RFM, there is no need to do this - * because a RFM will legally terminate the read-cycle. - */ - tpqputs(TPQD_ALWAYS, "terminating pending read-cycle"); + if (doing_read != YES) + return; + + doing_read = NO; + + if (cmd == QCMD_RD_FM) + return; + + /* if the command is a RFM, there is no need to do this + * because a RFM will legally terminate the read-cycle. + */ + tpqputs(TPQD_ALWAYS, "terminating pending read-cycle"); - /* I'm not too sure about this part -- hhb */ - if (QIC02_TAPE_IFC == MOUNTAIN) { - /* Mountain reference says can terminate by de-asserting online */ - ctlbits &= ~MTN_QIC02_CTL_ONLINE; - } - - if (tp_sense(TP_FIL | TP_EOM | TP_WRP) != TE_OK) { - tpqputs(TPQD_ALWAYS, - "finish_rw[read1]: ignore the 2 lines above"); - if (is_exception()) { - if (tp_sense - (TP_ILL | TP_FIL | TP_EOM | - TP_WRP) != TE_OK) - tpqputs(TPQD_ALWAYS,"finish_rw[read2]: read cycle error"); - } - } + /* I'm not too sure about this part -- hhb */ + if (QIC02_TAPE_IFC == MOUNTAIN) { + /* Mountain reference says can terminate by de-asserting online */ + ctlbits &= ~MTN_QIC02_CTL_ONLINE; + } + + if (tp_sense(TP_FIL | TP_EOM | TP_WRP) != TE_OK) { + tpqputs(TPQD_ALWAYS, "finish_rw[read1]: ignore the 2 lines above"); + if (is_exception()) { + if (tp_sense(TP_ILL | TP_FIL | TP_EOM | TP_WRP) != TE_OK) + tpqputs(TPQD_ALWAYS,"finish_rw[read2]: read cycle error"); } } } /* terminate_read */ @@ -1085,23 +1021,23 @@ { int stat; - if (doing_write == YES) { - doing_write = NO; - /* Finish writing by appending a FileMark at the end. */ - if (cmd != QCMD_WRT_FM) { - /* finish off write cycle */ - stat = ll_do_qic_cmd(QCMD_WRT_FM, TIM_M); - if (stat != TE_OK) - tpqputs(TPQD_ALWAYS, - "Couldn't finish write cycle properly"); - (void) tp_sense(0); - } - /* If there is an EOF token waiting to be returned to - * the (writing) application, discard it now. - * We could be at EOT, so don't reset return_write_eof. - */ - reported_write_eof = YES; + if (doing_write != YES) + return; + + doing_write = NO; + /* Finish writing by appending a FileMark at the end. */ + if (cmd != QCMD_WRT_FM) { + /* finish off write cycle */ + stat = ll_do_qic_cmd(QCMD_WRT_FM, TIM_M); + if (stat != TE_OK) + tpqputs(TPQD_ALWAYS, "Couldn't finish write cycle properly"); + (void) tp_sense(0); } + /* If there is an EOF token waiting to be returned to + * the (writing) application, discard it now. + * We could be at EOT, so don't reset return_write_eof. + */ + reported_write_eof = YES; } /* terminate_write */ @@ -1109,8 +1045,7 @@ static void finish_rw(int cmd) { if (wait_for_ready(TIM_S) != TE_OK) { - tpqputs(TPQD_ALWAYS, - "error: drive not ready in finish_rw() !"); + tpqputs(TPQD_ALWAYS, "error: drive not ready in finish_rw() !"); return; } terminate_read(cmd); @@ -1172,8 +1107,7 @@ case MTBSF: if (TP_HAVE_BSF) { - tpqputs(TPQD_IOCTLS, - "MTBSF backward searching filemark -- optional command"); + tpqputs(TPQD_IOCTLS, "MTBSF backward searching filemark -- optional command"); if ((mode_access == WRITE) && status_bytes_wr) return -EACCES; stat = do_qic_cmd(QCMD_RD_FM_BCK, TIM_F); @@ -1243,7 +1177,7 @@ case MTNOP: tpqputs(TPQD_IOCTLS, "MTNOP setting status only"); - /********** should do `read position' for drives that support it **********/ + /********** should do `read position' for drives that support it **********/ return (tp_sense(-1) == TE_OK) ? 0 : -EIO; /**** check return codes ****/ case MTRETEN: @@ -1377,12 +1311,7 @@ /* dma_transfer(): This routine is called for every 512 bytes to be read * from/written to the tape controller. Speed is important here! * (There must be enough time left for the hd controller!) - * When other devices use DMA they must ensure they use un-interruptible - * double byte accesses to the DMA controller. Floppy.c is ok. - * Must have interrupts disabled when this function is invoked, - * otherwise, the double-byte transfers to the DMA controller will not - * be atomic. That could lead to nasty problems when they are interrupted - * by other DMA interrupt-routines. + * The dma lock protects the DMA controller * * This routine merely does the least possible to keep * the transfers going: @@ -1407,8 +1336,7 @@ flags = claim_dma_lock(); clear_dma_ff(QIC02_TAPE_DMA); set_dma_mode(QIC02_TAPE_DMA, dma_mode); - set_dma_addr(QIC02_TAPE_DMA, - isa_virt_to_bus(buffaddr) + dma_bytes_done); + set_dma_addr(QIC02_TAPE_DMA, isa_virt_to_bus(buffaddr) + dma_bytes_done); set_dma_count(QIC02_TAPE_DMA, TAPE_BLKSIZE); /* start tape DMA controller */ @@ -1452,13 +1380,12 @@ /* assume 'bytes_todo'>0 */ { int stat; - unsigned long flags; tpqputs(TPQD_DEBUG, "start_dma() enter"); TPQDEB( {printk(TPQIC02_NAME ": doing_read==%d, doing_write==%d\n", doing_read, doing_write);}) - dma_bytes_done = 0; + dma_bytes_done = 0; dma_bytes_todo = bytes_todo; status_error = NO; /* dma_mode!=0 indicates that the dma controller is in use */ @@ -1484,17 +1411,14 @@ /* TP_CNI should now be handled in open(). -Hennus */ #endif - stat = - tp_sense(((mode == - WRITE) ? 0 : TP_WRP) | TP_BOM | TP_FIL); + stat = tp_sense(((mode == WRITE) ? 0 : TP_WRP) | TP_BOM | TP_FIL); if (stat != TE_OK) return stat; #if OBSOLETE /************* not needed iff rd_status() would wait for ready!!!!!! **********/ if (wait_for_ready(TIM_S) != TE_OK) { /*** not sure this is needed ***/ - tpqputs(TPQD_ALWAYS, - "wait_for_ready failed in start_dma"); + tpqputs(TPQD_ALWAYS, "wait_for_ready failed in start_dma"); return -EIO; } #endif @@ -1507,11 +1431,9 @@ /* Tell the controller the data direction */ /* r/w, timeout medium, check exceptions, sets status_cmd_pending. */ - stat = send_qic02_cmd((mode == WRITE) - ? QCMD_WRT_DATA : QCMD_RD_DATA, TIM_M, 0); + stat = send_qic02_cmd((mode == WRITE) ? QCMD_WRT_DATA : QCMD_RD_DATA, TIM_M, 0); if (stat != TE_OK) { - printk(TPQIC02_NAME ": start_dma: init %s failed\n", - (mode == WRITE) ? "write" : "read"); + printk(TPQIC02_NAME ": start_dma: init %s failed\n", (mode == WRITE) ? "write" : "read"); (void) tp_sense(0); return stat; } @@ -1529,10 +1451,8 @@ doing_write = YES; break; default: - printk(TPQIC02_NAME - ": requested unknown mode %d\n", mode); - panic(TPQIC02_NAME - ": invalid mode in start_dma()"); + printk(TPQIC02_NAME ": requested unknown mode %d\n", mode); + panic(TPQIC02_NAME ": invalid mode in start_dma()"); } } else if (is_exception()) { @@ -1541,8 +1461,7 @@ * * ******** this also affects EOF/EOT handling! ************ */ - tpqputs(TPQD_ALWAYS, - "detected exception in start_dma() while transfer in progress"); + tpqputs(TPQD_ALWAYS, "detected exception in start_dma() while transfer in progress"); status_error = YES; return TE_END; } @@ -1557,10 +1476,7 @@ /* initiate first data block read from/write to the tape controller */ - save_flags(flags); - cli(); dma_transfer(); - restore_flags(flags); TPQPUTS("start_dma() end"); return TE_OK; @@ -1594,7 +1510,6 @@ else if (QIC02_TAPE_IFC == ARCHIVE) outb_p(0, AR_RESET_DMA_PORT); else { /* QIC02_TAPE_IFC == MOUNTAIN */ - /* Clear control bits, de-select ONLINE during tp_sense */ ctlbits &= ~MTN_QIC02_CTL_ONLINE; } @@ -1605,7 +1520,6 @@ stat = tp_sense((dma_mode == READ) ? TP_WRP : 0); /* no return here -- got to clean up first! */ } else { /* if (QIC02_TAPE_IFC == MOUNTAIN) */ - outb_p(ctlbits, QIC02_CTL_PORT); } @@ -1718,8 +1632,7 @@ * - something went wrong * So don't continue with the next block. */ - tpqputs(TPQD_ALWAYS, - "isr: exception on tape controller"); + tpqputs(TPQD_ALWAYS, "isr: exception on tape controller"); printk(" status %02x\n", stat); status_error = TE_EX; @@ -1740,16 +1653,14 @@ */ if (QIC02_TAPE_IFC == WANGTEK) /* I think this is a drive-dependency, not IFC -- hhb */ if (stat & QIC02_STAT_READY) { /* not ready */ - tpqputs(TPQD_ALWAYS, - "isr: ? Tape controller not ready"); + tpqputs(TPQD_ALWAYS, "isr: ? Tape controller not ready"); r = 1; } flags = claim_dma_lock(); if ((i = get_dma_residue(QIC02_TAPE_DMA)) != 0) { - printk(TPQIC02_NAME ": dma_residue == %x !!!\n", - i); + printk(TPQIC02_NAME ": dma_residue == %x !!!\n", i); r = 1; /* big trouble, but can't do much about it... */ } @@ -1774,8 +1685,7 @@ dma_transfer(); } } else { - printk(TPQIC02_NAME ": Unexpected interrupt, stat == %x\n", - inb(QIC02_STAT_PORT)); + printk(TPQIC02_NAME ": Unexpected interrupt, stat == %x\n", inb(QIC02_STAT_PORT)); } } /* qic02_tape_interrupt */ @@ -1812,10 +1722,8 @@ * request would return the EOF flag for the previous file. */ -static ssize_t qic02_tape_read(struct file *filp, char *buf, size_t count, - loff_t * ppos) +static ssize_t qic02_tape_read(struct file *filp, char *buf, size_t count, loff_t * ppos) { - int err; kdev_t dev = filp->f_dentry->d_inode->i_rdev; unsigned short flags = filp->f_flags; unsigned long bytes_todo, bytes_done, total_bytes_done = 0; @@ -1827,11 +1735,8 @@ } if (TP_DIAGS(current_tape_dev)) - /* can't print a ``long long'' (for filp->f_pos), so chop it */ - printk(TPQIC02_NAME - ": request READ, minor=%x, buf=%p, count=%lx" - ", pos=%lx, flags=%x\n", minor(dev), buf, - (long) count, (unsigned long) filp->f_pos, flags); + printk(TPQIC02_NAME ": request READ, minor=%x, buf=%p, count=%lx, pos=%Lx, flags=%x\n", minor(dev), buf, + (long) count, filp->f_pos, flags); if (count % TAPE_BLKSIZE) { /* Only allow mod 512 bytes at a time. */ tpqputs(TPQD_BLKSZ, "Wrong block size"); @@ -1858,10 +1763,7 @@ /* Must ensure that user program sees exactly one EOF token (==0) */ if (return_read_eof == YES) { if (TPQDBG(DEBUG)) { - printk - ("read: return_read_eof==%d, reported_read_eof==%d, total_bytes_done==%lu\n", - return_read_eof, reported_read_eof, - total_bytes_done); + printk("read: return_read_eof==%d, reported_read_eof==%d, total_bytes_done==%lu\n", return_read_eof, reported_read_eof, total_bytes_done); } if (reported_read_eof == NO) { @@ -1897,7 +1799,6 @@ } } - /*****************************/ if (bytes_todo == 0) { return total_bytes_done; } @@ -1905,9 +1806,7 @@ if (bytes_todo > 0) { /* start reading data */ if (is_exception()) { -/****************************************/ - tpqputs(TPQD_DMAX, - "is_exception() before start_dma()!"); + tpqputs(TPQD_DMAX, "is_exception() before start_dma()!"); } /****************************************************************** @@ -1919,12 +1818,11 @@ stat = start_dma(READ, bytes_todo); if (stat == TE_OK) { /* Wait for transfer to complete, interrupt should wake us */ - while (dma_mode != 0) { - sleep_on(&qic02_tape_transfer); - } - if (status_error) { + + wait_event(qic02_tape_transfer, dma_mode != 0); + + if (status_error) return_read_eof = YES; - } } else if (stat != TE_END) { /* should do sense() on error here */ @@ -1938,8 +1836,7 @@ } end_dma(&bytes_done); if (bytes_done > bytes_todo) { - tpqputs(TPQD_ALWAYS, - "read: Oops, read more bytes than requested"); + tpqputs(TPQD_ALWAYS, "read: Oops, read more bytes than requested"); return -EIO; } /* copy buffer to user-space in one go */ @@ -1949,15 +1846,12 @@ } #if 1 /* Checks Ton's patch below */ - if ((return_read_eof == NO) - && (status_eof_detected == YES)) { - printk(TPQIC02_NAME - ": read(): return_read_eof=%d, status_eof_detected=YES. return_read_eof:=YES\n", + if ((return_read_eof == NO) && (status_eof_detected == YES)) { + printk(TPQIC02_NAME ": read(): return_read_eof=%d, status_eof_detected=YES. return_read_eof:=YES\n", return_read_eof); } #endif - if ((bytes_todo != bytes_done) - || (status_eof_detected == YES)) { + if ((bytes_todo != bytes_done) || (status_eof_detected == YES)) { /* EOF or EOM detected. return EOF next time. */ return_read_eof = YES; } @@ -2006,10 +1900,8 @@ * tape device again. The driver will detect an exception status in (No Cartridge) * and force a rewind. After that tar may continue writing. */ -static ssize_t qic02_tape_write(struct file *filp, const char *buf, - size_t count, loff_t * ppos) +static ssize_t qic02_tape_write(struct file *filp, const char *buf, size_t count, loff_t * ppos) { - int err; kdev_t dev = filp->f_dentry->d_inode->i_rdev; unsigned short flags = filp->f_flags; unsigned long bytes_todo, bytes_done, total_bytes_done = 0; @@ -2020,11 +1912,8 @@ } if (TP_DIAGS(current_tape_dev)) { - /* can't print a ``long long'' (for filp->f_pos), so chop it */ - printk(TPQIC02_NAME ": request WRITE, minor=%x, buf=%p" - ", count=%lx, pos=%lx, flags=%x\n", - minor(dev), buf, - (long) count, (unsigned long) filp->f_pos, flags); + printk(TPQIC02_NAME ": request WRITE, minor=%x, buf=%p, count=%lx, pos=%Lx, flags=%x\n", + minor(dev), buf, (long) count, filp->f_pos, flags); } if (count % TAPE_BLKSIZE) { /* only allow mod 512 bytes at a time */ @@ -2063,8 +1952,7 @@ if (reported_write_eof == NO) { if (bytes_todo > 0) { - tpqputs(TPQD_ALWAYS, - "partial write"); + tpqputs(TPQD_ALWAYS, "partial write"); /* partial write signals EOF to user program */ } reported_write_eof = YES; @@ -2091,22 +1979,18 @@ ***** fail and write() will return ENXIO error *****/ if (start_dma(WRITE, bytes_todo) != TE_OK) { - tpqputs(TPQD_ALWAYS, - "write: start_dma() failed"); + tpqputs(TPQD_ALWAYS, "write: start_dma() failed"); /* should do sense() on error here */ return -ENXIO; /*********** FIXTHIS **************/ } /* Wait for write to complete, interrupt should wake us. */ - while ((status_error == 0) && (dma_mode != 0)) { - sleep_on(&qic02_tape_transfer); - } + wait_event(qic02_tape_transfer, (status_error == 0 && dma_mode != 0)); end_dma(&bytes_done); if (bytes_done > bytes_todo) { - tpqputs(TPQD_ALWAYS, - "write: Oops, wrote more bytes than requested"); + tpqputs(TPQD_ALWAYS, "write: Oops, wrote more bytes than requested"); return -EIO; } /* If the dma-transfer was aborted because of an exception, @@ -2123,13 +2007,11 @@ */ if (status_error) { if (status_eom_detected == YES) { - tpqputs(TPQD_ALWAYS, - "write: EW detected"); + tpqputs(TPQD_ALWAYS, "write: EW detected"); return_write_eof = YES; } else { /* probably EXC_RWA */ - tpqputs(TPQD_ALWAYS, - "write: dma: error in writing"); + tpqputs(TPQD_ALWAYS, "write: dma: error in writing"); return -EIO; } } @@ -2193,8 +2075,7 @@ if (TP_DIAGS(dev)) { - printk("qic02_tape_open: dev=%s, flags=%x ", - kdevname(dev), flags); + printk("qic02_tape_open: dev=%s, flags=%x ", kdevname(dev), flags); } if (minor(dev) == 255) { /* special case for resetting */ @@ -2210,11 +2091,9 @@ return 0; } - /* Only one at a time from here on... */ - if (file_count(filp) > 1) { /* filp->f_count==1 for the first open() */ + if(test_and_set_bit(0, &tape_open)) return -EBUSY; - } - + if (status_zombie == YES) { /* no irq/dma/port stuff allocated yet, no reset done * yet, so return until MTSETCONFIG has been done. @@ -2256,13 +2135,13 @@ if (s == TE_OK) { /* Try to clear cartridge-changed status for Archive-2150L */ if ((tperror.exs & TP_ST0) && (tperror.exs & TP_CNI)) { - s = tp_sense(TP_WRP | TP_EOM | TP_BOM | TP_CNI | - TP_EOR); + s = tp_sense(TP_WRP | TP_EOM | TP_BOM | TP_CNI | TP_EOR); } } if (s != TE_OK) { tpqputs(TPQD_ALWAYS, "open: sense() failed"); + clear_bit(0, &tape_open); return -EIO; } @@ -2272,6 +2151,7 @@ */ if ((tperror.exs & TP_ST0) && (tperror.exs & TP_CNI)) { tpqputs(TPQD_ALWAYS, "No tape present."); + clear_bit(0, &tape_open); return -EIO; } @@ -2280,15 +2160,13 @@ */ /* not allowed to do QCMD_DENS_* unless tape is rewound */ - if ((TP_DENS(dev) != 0) - && (TP_DENS(current_tape_dev) != TP_DENS(dev))) { + if ((TP_DENS(dev) != 0) && (TP_DENS(current_tape_dev) != TP_DENS(dev))) { /* force rewind if minor bits have changed, * i.e. user wants to use tape in different format. * [assuming single drive operation] */ if (TP_HAVE_DENS) { - tpqputs(TPQD_REWIND, - "Density minor bits have changed. Forcing rewind."); + tpqputs(TPQD_REWIND, "Density minor bits have changed. Forcing rewind."); need_rewind = YES; } } else { @@ -2318,8 +2196,7 @@ } else { status_dead = NO; if (tp_sense(~(TP_ST1 | TP_ILL)) != TE_OK) { - tpqputs(TPQD_ALWAYS, - "open: tp_sense() failed\n"); + tpqputs(TPQD_ALWAYS, "open: tp_sense() failed\n"); status_dead = YES; /* try reset next time */ return -EIO; } @@ -2343,12 +2220,10 @@ dens = TP_DENS(dev); } - if (dens < sizeof(format_names) / sizeof(char *)) { - printk(TPQIC02_NAME ": format: %s%s\n", - (dens != 0) ? "QIC-" : "", format_names[dens]); - } else { + if (dens < sizeof(format_names) / sizeof(char *)) + printk(TPQIC02_NAME ": format: %s%s\n", (dens != 0) ? "QIC-" : "", format_names[dens]); + else tpqputs(TPQD_REWIND, "Wait for retensioning..."); - } switch (TP_DENS(dev)) { case 0: /* Minor 0 is for drives without set-density support */ @@ -2406,12 +2281,12 @@ /* Rewind only if minor number requires it AND * read/writes have been done. ************* IS THIS CORRECT?????????? */ - if ((TP_REWCLOSE(dev)) - && (status_bytes_rd | status_bytes_wr)) { + if ((TP_REWCLOSE(dev)) && (status_bytes_rd | status_bytes_wr)) { tpqputs(TPQD_REWIND, "release: Doing rewind..."); (void) do_qic_cmd(QCMD_REWIND, TIM_R); } } + clear_bit(0, &tape_open); return 0; } /* qic02_tape_release */ @@ -2512,47 +2387,32 @@ /* ioctl allows user programs to rewind the tape and stuff like that */ -static int qic02_tape_ioctl(struct inode *inode, struct file *filp, - unsigned int iocmd, unsigned long ioarg) +static int qic02_tape_ioctl(struct inode *inode, struct file *filp, unsigned int iocmd, unsigned long ioarg) { int error; - int dev_maj = major(inode->i_rdev); int c; struct mtop operation; unsigned char blk_addr[6]; struct mtpos ioctl_tell; - if (TP_DIAGS(current_tape_dev)) { - printk(TPQIC02_NAME ": ioctl(%4x, %4x, %4lx)\n", dev_maj, - iocmd, ioarg); - } + if (TP_DIAGS(current_tape_dev)) + printk(TPQIC02_NAME ": ioctl(%4x, %4lx)\n", iocmd, ioarg); - if (!inode || !ioarg) { + if (!inode) return -EINVAL; - } /* check iocmd first */ - if (dev_maj != QIC02_TAPE_MAJOR) { - printk(TPQIC02_NAME ": Oops! Wrong device?\n"); - /* A panic() would be appropriate here */ - return -ENODEV; - } - c = _IOC_NR(iocmd); #ifdef CONFIG_QIC02_DYNCONF if (c == _IOC_NR(MTIOCGETCONFIG)) { CHECK_IOC_SIZE(mtconfiginfo); - if (copy_to_user - ((char *) ioarg, (char *) &qic02_tape_dynconf, - sizeof(qic02_tape_dynconf))) { + if (copy_to_user((char *) ioarg, (char *) &qic02_tape_dynconf, sizeof(qic02_tape_dynconf))) return -EFAULT; - } return 0; - } else if (c == _IOC_NR(MTIOCSETCONFIG)) { /* One should always do a MTIOCGETCONFIG first, then update * user-settings, then write back with MTIOCSETCONFIG. @@ -2562,24 +2422,19 @@ CHECK_IOC_SIZE(mtconfiginfo); - if (!capable(CAP_SYS_ADMIN)) { + if (!capable(CAP_SYS_RAWIO)) return -EPERM; - } - if ((doing_read != NO) || (doing_write != NO)) { + if (doing_read != NO || doing_write != NO) return -EBUSY; - } - if (status_zombie == NO) { + if (status_zombie == NO) qic02_release_resources(); /* and go zombie */ - } /* copy struct from user space to kernel space */ - if (copy_from_user - ((char *) &qic02_tape_dynconf, (char *) ioarg, - sizeof(qic02_tape_dynconf))) { + if (copy_from_user((char *) &qic02_tape_dynconf, (char *) ioarg, sizeof(qic02_tape_dynconf))) return -EFAULT; - } + return update_ifc_masks(qic02_tape_dynconf.ifc_type); } if (status_zombie == YES) { @@ -2591,11 +2446,8 @@ CHECK_IOC_SIZE(mtop); /* copy mtop struct from user space to kernel space */ - if (copy_from_user - ((char *) &operation, (char *) ioarg, - sizeof(operation))) { + if (copy_from_user((char *) &operation, (char *) ioarg, sizeof(operation))) return -EFAULT; - } /* ---note: mt_count is signed, negative seeks must be * --- translated to seeks in opposite direction! @@ -2605,42 +2457,32 @@ * --- tape at the beginning of the current file. */ - if (TP_DIAGS(current_tape_dev)) { - printk("OP op=%4x, count=%4x\n", operation.mt_op, - operation.mt_count); - } + if (TP_DIAGS(current_tape_dev)) + printk("OP op=%4x, count=%4x\n", operation.mt_op, operation.mt_count); - if (operation.mt_count < 0) { - tpqputs(TPQD_ALWAYS, - "Warning: negative mt_count ignored"); - } + if (operation.mt_count < 0) + tpqputs(TPQD_ALWAYS, "Warning: negative mt_count ignored"); ioctl_status.mt_resid = operation.mt_count; if (operation.mt_op == MTSEEK) { - if (!TP_HAVE_SEEK) { + if (!TP_HAVE_SEEK) return -ENOTTY; - } - seek_addr_buf[0] = - (operation.mt_count >> 16) & 0xff; - seek_addr_buf[1] = - (operation.mt_count >> 8) & 0xff; + seek_addr_buf[0] = (operation.mt_count >> 16) & 0xff; + seek_addr_buf[1] = (operation.mt_count >> 8) & 0xff; seek_addr_buf[2] = (operation.mt_count) & 0xff; - if (operation.mt_count >> 24) { + if (operation.mt_count >> 24) return -EINVAL; - } - if ((error = do_ioctl_cmd(operation.mt_op)) != 0) { + + if ((error = do_ioctl_cmd(operation.mt_op)) != 0) return error; - } ioctl_status.mt_resid = 0; } else { while (operation.mt_count > 0) { operation.mt_count--; - if ((error = - do_ioctl_cmd(operation.mt_op)) != 0) { + if ((error = do_ioctl_cmd(operation.mt_op)) != 0) return error; - } ioctl_status.mt_resid = operation.mt_count; } @@ -2648,9 +2490,8 @@ return 0; } else if (c == _IOC_NR(MTIOCGET)) { - if (TP_DIAGS(current_tape_dev)) { + if (TP_DIAGS(current_tape_dev)) printk("GET "); - } CHECK_IOC_SIZE(mtget); @@ -2660,55 +2501,75 @@ */ /* copy results to user space */ - if (copy_to_user - ((char *) ioarg, (char *) &ioctl_status, - sizeof(ioctl_status))) { + if (copy_to_user((char *) ioarg, (char *) &ioctl_status, sizeof(ioctl_status))) return -EFAULT; - } return 0; } else if (TP_HAVE_TELL && (c == _IOC_NR(MTIOCPOS))) { - if (TP_DIAGS(current_tape_dev)) { + if (TP_DIAGS(current_tape_dev)) printk("POS "); - } CHECK_IOC_SIZE(mtpos); tpqputs(TPQD_IOCTLS, "MTTELL reading block address"); - if ((doing_read == YES) || (doing_write == YES)) { + if (doing_read == YES || doing_write == YES) finish_rw(AR_QCMDV_TELL_BLK); - } - c = rdstatus((char *) blk_addr, sizeof(blk_addr), - AR_QCMDV_TELL_BLK); - if (c != TE_OK) { + c = rdstatus((char *) blk_addr, sizeof(blk_addr), AR_QCMDV_TELL_BLK); + if (c != TE_OK) return -EIO; - } - ioctl_tell.mt_blkno = - (blk_addr[3] << 16) | (blk_addr[4] << 8) | blk_addr[5]; + ioctl_tell.mt_blkno = (blk_addr[3] << 16) | (blk_addr[4] << 8) | blk_addr[5]; /* copy results to user space */ - if (copy_to_user - ((char *) ioarg, (char *) &ioctl_tell, - sizeof(ioctl_tell))) { + if (copy_to_user((char *) ioarg, (char *) &ioctl_tell, sizeof(ioctl_tell))) return -EFAULT; - } return 0; - } else { + } else return -ENOTTY; /* Other cmds not supported. */ - } } /* qic02_tape_ioctl */ +static ssize_t qic02_do_tape_read(struct file *filp, char *buf, size_t count, loff_t * ppos) +{ + int err; + + down(&tape_op); + err = qic02_tape_read(filp, buf, count, ppos); + up(&tape_op); + + return err; +} + +static ssize_t qic02_do_tape_write(struct file *filp, const char *buf, size_t count, loff_t * ppos) +{ + int err; + + down(&tape_op); + err = qic02_tape_write(filp, buf, count, ppos); + up(&tape_op); + + return err; +} + +static int qic02_do_tape_ioctl(struct inode *inode, struct file *filp, unsigned int iocmd, unsigned long ioarg) +{ + int err; + + down(&tape_op); + err = qic02_tape_ioctl(inode, filp, iocmd, ioarg); + up(&tape_op); + + return err; +} /* These are (most) of the interface functions: */ static struct file_operations qic02_tape_fops = { owner:THIS_MODULE, llseek:no_llseek, - read:qic02_tape_read, - write:qic02_tape_write, - ioctl:qic02_tape_ioctl, + read:qic02_do_tape_read, + write:qic02_do_tape_write, + ioctl:qic02_do_tape_ioctl, open:qic02_tape_open, release:qic02_tape_release, }; @@ -2719,10 +2580,8 @@ free_irq(QIC02_TAPE_IRQ, NULL); free_dma(QIC02_TAPE_DMA); release_region(QIC02_TAPE_PORT, QIC02_TAPE_PORT_RANGE); - if (buffaddr) { - free_pages((unsigned long) buffaddr, - get_order(TPQBUF_SIZE)); - } + if (buffaddr) + free_pages((unsigned long) buffaddr, get_order(TPQBUF_SIZE)); buffaddr = 0; /* Better to cause a panic than overwite someone else */ status_zombie = YES; } /* qic02_release_resources */ @@ -2733,49 +2592,35 @@ /* First perform some checks. If one of them fails, * the tape driver will not be registered to the system. */ - if (QIC02_TAPE_IRQ > 16) { - tpqputs(TPQD_ALWAYS, "Bogus interrupt number."); - return -ENXIO; - } /* for DYNCONF, allocating IO, DMA and IRQ should not be done until * the config parameters have been set using MTSETCONFIG. */ /* Grab the IO region. */ - if (!request_region(QIC02_TAPE_PORT, QIC02_TAPE_PORT_RANGE, - TPQIC02_NAME)) { - printk(TPQIC02_NAME - ": IO space at 0x%x [%d ports] already reserved\n", + if (!request_region(QIC02_TAPE_PORT, QIC02_TAPE_PORT_RANGE, TPQIC02_NAME)) { + printk(TPQIC02_NAME ": IO space at 0x%x [%d ports] already reserved\n", QIC02_TAPE_PORT, QIC02_TAPE_PORT_RANGE); return -ENXIO; } /* get IRQ */ - if (request_irq - (QIC02_TAPE_IRQ, qic02_tape_interrupt, SA_INTERRUPT, "QIC-02", - NULL)) { - printk(TPQIC02_NAME - ": can't allocate IRQ%d for QIC-02 tape\n", - QIC02_TAPE_IRQ); + if (request_irq(QIC02_TAPE_IRQ, qic02_tape_interrupt, SA_INTERRUPT, "QIC-02", NULL)) { + printk(TPQIC02_NAME ": can't allocate IRQ%d for QIC-02 tape\n", QIC02_TAPE_IRQ); release_region(QIC02_TAPE_PORT, QIC02_TAPE_PORT_RANGE); return -EBUSY; } /* After IRQ, allocate DMA channel */ if (request_dma(QIC02_TAPE_DMA, "QIC-02")) { - printk(TPQIC02_NAME - ": can't allocate DMA%d for QIC-02 tape\n", - QIC02_TAPE_DMA); + printk(TPQIC02_NAME ": can't allocate DMA%d for QIC-02 tape\n", QIC02_TAPE_DMA); free_irq(QIC02_TAPE_IRQ, NULL); release_region(QIC02_TAPE_PORT, QIC02_TAPE_PORT_RANGE); return -EBUSY; } /* Setup the page-address for the dma transfer. */ - buffaddr = - (void *) __get_dma_pages(GFP_KERNEL, get_order(TPQBUF_SIZE)); - + buffaddr = (void *) __get_dma_pages(GFP_KERNEL, get_order(TPQBUF_SIZE)); if (!buffaddr) { qic02_release_resources(); return -EBUSY; /* Not ideal, EAGAIN perhaps? */ @@ -2783,8 +2628,7 @@ memset(buffaddr, 0, TPQBUF_SIZE); - printk(TPQIC02_NAME - ": Settings: IRQ %d, DMA %d, IO 0x%x, IFC %s\n", + printk(TPQIC02_NAME ": Settings: IRQ %d, DMA %d, IO 0x%x, IFC %s\n", QIC02_TAPE_IRQ, QIC02_TAPE_DMA, ((QIC02_TAPE_IFC == ARCHIVE) || (QIC02_TAPE_IFC == MOUNTAIN)) ? @@ -2794,11 +2638,9 @@ ARCHIVE) ? "Archive" : "Wangtek")); - if (tape_reset(0) != TE_OK - || tp_sense(TP_WRP | TP_POR | TP_CNI) != TE_OK) { + if (tape_reset(0) != TE_OK || tp_sense(TP_WRP | TP_POR | TP_CNI) != TE_OK) { /* No drive detected, so vanish */ - tpqputs(TPQD_ALWAYS, - "No drive detected -- releasing IO/IRQ/DMA."); + tpqputs(TPQD_ALWAYS, "No drive detected -- releasing IO/IRQ/DMA."); status_dead = YES; qic02_release_resources(); return -EIO; @@ -2812,13 +2654,11 @@ int __init qic02_tape_init(void) { if (TPSTATSIZE != 6) { - printk(TPQIC02_NAME - ": internal error: tpstatus struct incorrect!\n"); + printk(TPQIC02_NAME ": internal error: tpstatus struct incorrect!\n"); return -ENODEV; } if ((TPQBUF_SIZE < 512) || (TPQBUF_SIZE >= 0x10000)) { - printk(TPQIC02_NAME - ": internal error: DMA buffer size out of range\n"); + printk(TPQIC02_NAME ": internal error: DMA buffer size out of range\n"); return -ENODEV; } @@ -2837,19 +2677,16 @@ # error # endif rcs_revision, rcs_date); - if (qic02_get_resources()) { + if (qic02_get_resources()) return -ENODEV; - } #else - printk(TPQIC02_NAME ": Runtime config, %s, %s\n", - rcs_revision, rcs_date); + printk(TPQIC02_NAME ": Runtime config, %s, %s\n", rcs_revision, rcs_date); #endif printk(TPQIC02_NAME ": DMA buffers: %u blocks\n", NR_BLK_BUF); /* If we got this far, install driver functions */ - if (register_chrdev - (QIC02_TAPE_MAJOR, TPQIC02_NAME, &qic02_tape_fops)) { - printk(TPQIC02_NAME ": Unable to get chrdev major %d\n", - QIC02_TAPE_MAJOR); + if (register_chrdev(QIC02_TAPE_MAJOR, TPQIC02_NAME, &qic02_tape_fops)) + { + printk(TPQIC02_NAME ": Unable to get chrdev major %d\n", QIC02_TAPE_MAJOR); #ifndef CONFIG_QIC02_DYNCONF qic02_release_resources(); #endif @@ -2894,11 +2731,9 @@ tp_timer.function = qic02_tape_times_out; #ifndef CONFIG_QIC02_DYNCONF - if (tape_reset(0) != TE_OK - || tp_sense(TP_WRP | TP_POR | TP_CNI) != TE_OK) { + if (tape_reset(0) != TE_OK || tp_sense(TP_WRP | TP_POR | TP_CNI) != TE_OK) { /* No drive detected, so vanish */ - tpqputs(TPQD_ALWAYS, - "No drive detected -- driver going on vacation..."); + tpqputs(TPQD_ALWAYS, "No drive detected -- driver going on vacation..."); qic02_release_resources(); status_dead = YES; return -ENODEV; @@ -2927,10 +2762,10 @@ void cleanup_module(void) { - if (status_zombie == NO) { - qic02_release_resources(); - } unregister_chrdev(QIC02_TAPE_MAJOR, TPQIC02_NAME); + if (status_zombie == NO) + qic02_release_resources(); + devfs_find_and_unregister(NULL, "ntpqic11", QIC02_TAPE_MAJOR, 2, DEVFS_SPECIAL_CHR, 0); devfs_find_and_unregister(NULL, "tpqic11", QIC02_TAPE_MAJOR, 3, diff -Nru a/drivers/char/vme_scc.c b/drivers/char/vme_scc.c --- a/drivers/char/vme_scc.c Mon Oct 28 16:32:35 2002 +++ b/drivers/char/vme_scc.c Mon Oct 28 16:32:35 2002 @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include diff -Nru a/drivers/ide/Config.in b/drivers/ide/Config.in --- a/drivers/ide/Config.in Mon Oct 28 16:32:35 2002 +++ b/drivers/ide/Config.in Mon Oct 28 16:32:35 2002 @@ -99,12 +99,12 @@ if [ "$CONFIG_SIBYTE_SWARM" = "y" ]; then bool ' SWARM onboard IDE support' CONFIG_BLK_DEV_IDE_SWARM fi - if [ "$CONFIG_ARCH_ACORN" = "y" ]; then - dep_bool ' ICS IDE interface support' CONFIG_BLK_DEV_IDE_ICSIDE $CONFIG_ARCH_ACORN - dep_bool ' ICS DMA support' CONFIG_BLK_DEV_IDEDMA_ICS $CONFIG_BLK_DEV_IDE_ICSIDE - dep_bool ' Use ICS DMA by default' CONFIG_IDEDMA_ICS_AUTO $CONFIG_BLK_DEV_IDEDMA_ICS + if [ "$CONFIG_ARM" = "y" ]; then + dep_tristate ' ICS IDE interface support' CONFIG_BLK_DEV_IDE_ICSIDE $CONFIG_ARCH_ACORN + dep_mbool ' ICS DMA support' CONFIG_BLK_DEV_IDEDMA_ICS $CONFIG_BLK_DEV_IDE_ICSIDE + dep_mbool ' Use ICS DMA by default' CONFIG_IDEDMA_ICS_AUTO $CONFIG_BLK_DEV_IDEDMA_ICS define_bool CONFIG_BLK_DEV_IDEDMA $CONFIG_BLK_DEV_IDEDMA_ICS - dep_bool ' RapIDE interface support' CONFIG_BLK_DEV_IDE_RAPIDE $CONFIG_ARCH_ACORN + dep_tristate ' RapIDE interface support' CONFIG_BLK_DEV_IDE_RAPIDE $CONFIG_ARCH_ACORN fi if [ "$CONFIG_AMIGA" = "y" ]; then dep_bool ' Amiga Gayle IDE interface support' CONFIG_BLK_DEV_GAYLE $CONFIG_AMIGA diff -Nru a/drivers/ide/arm/icside.c b/drivers/ide/arm/icside.c --- a/drivers/ide/arm/icside.c Mon Oct 28 16:32:37 2002 +++ b/drivers/ide/arm/icside.c Mon Oct 28 16:32:37 2002 @@ -1,7 +1,7 @@ /* * linux/drivers/ide/icside.c * - * Copyright (c) 1996,1997 Russell King. + * Copyright (c) 1996-2002 Russell King. * * Changelog: * 08-Jun-1996 RMK Created @@ -20,25 +20,13 @@ #include #include #include +#include #include #include #include #include -#include "ide-noise.h" - -/* - * FIXME: We want to drop the the MACRO CRAP! - * - * ec->iops->in{b/w/l} - * ec->iops->in{b/w/l}_p - * ec->iops->out{b/w/l} - * ec->iops->out{b/w/l}_p - * - * the new core supports clean MMIO calls and other goodies - */ - /* * Maximum number of interfaces per card */ @@ -86,10 +74,10 @@ ICS_ARCIN_V6_IDESTEPPING }; -static const card_ids icside_cids[] = { - { MANU_ICS, PROD_ICS_IDE }, - { MANU_ICS2, PROD_ICS2_IDE }, - { 0xffff, 0xffff } +struct icside_state { + unsigned int channel; + unsigned int enabled; + unsigned int irq_port; }; typedef enum { @@ -133,10 +121,21 @@ */ static void icside_irqenable_arcin_v6 (struct expansion_card *ec, int irqnr) { - unsigned int ide_base_port = (unsigned int)ec->irq_data; + struct icside_state *state = ec->irq_data; + unsigned int base = state->irq_port; + + state->enabled = 1; - outb(0, ide_base_port + ICS_ARCIN_V6_INTROFFSET_1); - outb(0, ide_base_port + ICS_ARCIN_V6_INTROFFSET_2); + switch (state->channel) { + case 0: + outb(0, base + ICS_ARCIN_V6_INTROFFSET_1); + inb(base + ICS_ARCIN_V6_INTROFFSET_2); + break; + case 1: + outb(0, base + ICS_ARCIN_V6_INTROFFSET_2); + inb(base + ICS_ARCIN_V6_INTROFFSET_1); + break; + } } /* Prototype: icside_irqdisable_arcin_v6 (struct expansion_card *ec, int irqnr) @@ -144,10 +143,12 @@ */ static void icside_irqdisable_arcin_v6 (struct expansion_card *ec, int irqnr) { - unsigned int ide_base_port = (unsigned int)ec->irq_data; + struct icside_state *state = ec->irq_data; + + state->enabled = 0; - inb(ide_base_port + ICS_ARCIN_V6_INTROFFSET_1); - inb(ide_base_port + ICS_ARCIN_V6_INTROFFSET_2); + inb (state->irq_port + ICS_ARCIN_V6_INTROFFSET_1); + inb (state->irq_port + ICS_ARCIN_V6_INTROFFSET_2); } /* Prototype: icside_irqprobe(struct expansion_card *ec) @@ -155,10 +156,10 @@ */ static int icside_irqpending_arcin_v6(struct expansion_card *ec) { - unsigned int ide_base_port = (unsigned int)ec->irq_data; + struct icside_state *state = ec->irq_data; - return inb(ide_base_port + ICS_ARCIN_V6_INTRSTAT_1) & 1 || - inb(ide_base_port + ICS_ARCIN_V6_INTRSTAT_2) & 1; + return inb(state->irq_port + ICS_ARCIN_V6_INTRSTAT_1) & 1 || + inb(state->irq_port + ICS_ARCIN_V6_INTRSTAT_2) & 1; } static const expansioncard_ops_t icside_ops_arcin_v6 = { @@ -221,6 +222,39 @@ return iftype; } +/* + * Handle routing of interrupts. This is called before + * we write the command to the drive. + */ +static void icside_maskproc(ide_drive_t *drive, int mask) +{ + ide_hwif_t *hwif = HWIF(drive); + struct icside_state *state = hwif->hw.priv; + unsigned long flags; + + local_irq_save(flags); + + state->channel = hwif->channel; + + if (state->enabled && !mask) { + switch (hwif->channel) { + case 0: + outb(0, state->irq_port + ICS_ARCIN_V6_INTROFFSET_1); + inb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_2); + break; + case 1: + outb(0, state->irq_port + ICS_ARCIN_V6_INTROFFSET_2); + inb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_1); + break; + } + } else { + inb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_2); + inb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_1); + } + + local_irq_restore(flags); +} + #ifdef CONFIG_BLK_DEV_IDEDMA_ICS /* * SG-DMA support. @@ -234,125 +268,119 @@ #define NR_ENTRIES 256 #define TABLE_SIZE (NR_ENTRIES * 8) -static int ide_build_sglist(ide_hwif_t *hwif, struct request *rq) +static void ide_build_sglist(ide_drive_t *drive, struct request *rq) { - struct buffer_head *bh; + ide_hwif_t *hwif = drive->hwif; struct scatterlist *sg = hwif->sg_table; - int nents = 0; + int nents; - if (rq->cmd == READ) - hwif->sg_dma_direction = PCI_DMA_FROMDEVICE; - else - hwif->sg_dma_direction = PCI_DMA_TODEVICE; - bh = rq->bh; - do { - unsigned char *virt_addr = bh->b_data; - unsigned int size = bh->b_size; - - while ((bh = bh->b_reqnext) != NULL) { - if ((virt_addr + size) != (unsigned char *)bh->b_data) - break; - size += bh->b_size; - } - memset(&sg[nents], 0, sizeof(*sg)); - sg[nents].address = virt_addr; - sg[nents].length = size; - nents++; - } while (bh != NULL); + BUG_ON(hwif->sg_dma_active); - return pci_map_sg(NULL, sg, nents, hwif->sg_dma_direction); -} + if (rq->flags & REQ_DRIVE_TASKFILE) { + ide_task_t *args = rq->special; -static int -icside_build_dmatable(ide_drive_t *drive, int reading) -{ - return HWIF(drive)->sg_nents = ide_build_sglist(HWIF(drive), HWGROUP(drive)->rq); -} + if (args->command_type == IDE_DRIVE_TASK_RAW_WRITE) + hwif->sg_dma_direction = PCI_DMA_TODEVICE; + else + hwif->sg_dma_direction = PCI_DMA_FROMDEVICE; -/* Teardown mappings after DMA has completed. */ -static void icside_destroy_dmatable(ide_drive_t *drive) -{ - struct scatterlist *sg = HWIF(drive)->sg_table; - int nents = HWIF(drive)->sg_nents; + memset(sg, 0, sizeof(*sg)); + sg->page = virt_to_page(rq->buffer); + sg->offset = ((unsigned long)rq->buffer) & ~PAGE_MASK; + sg->length = rq->nr_sectors * SECTOR_SIZE; + nents = 1; + } else { + nents = blk_rq_map_sg(&drive->queue, rq, sg); + + if (rq_data_dir(rq) == READ) + hwif->sg_dma_direction = PCI_DMA_FROMDEVICE; + else + hwif->sg_dma_direction = PCI_DMA_TODEVICE; + } + + nents = pci_map_sg(NULL, sg, nents, hwif->sg_dma_direction); - pci_unmap_sg(NULL, sg, nents, HWIF(drive)->sg_dma_direction); + hwif->sg_nents = nents; } -static int -icside_config_if(ide_drive_t *drive, int xfer_mode) + +/* + * Configure the IOMD to give the appropriate timings for the transfer + * mode being requested. We take the advice of the ATA standards, and + * calculate the cycle time based on the transfer mode, and the EIDE + * MW DMA specs that the drive provides in the IDENTIFY command. + * + * We have the following IOMD DMA modes to choose from: + * + * Type Active Recovery Cycle + * A 250 (250) 312 (550) 562 (800) + * B 187 250 437 + * C 125 (125) 125 (375) 250 (500) + * D 62 125 187 + * + * (figures in brackets are actual measured timings) + * + * However, we also need to take care of the read/write active and + * recovery timings: + * + * Read Write + * Mode Active -- Recovery -- Cycle IOMD type + * MW0 215 50 215 480 A + * MW1 80 50 50 150 C + * MW2 70 25 25 120 C + */ +static int icside_set_speed(ide_drive_t *drive, u8 xfer_mode) { - int func = ide_dma_off; + int on = 0, cycle_time = 0, use_dma_info = 0; + + /* + * Limit the transfer speed to MW_DMA_2. + */ + if (xfer_mode > XFER_MW_DMA_2) + xfer_mode = XFER_MW_DMA_2; switch (xfer_mode) { case XFER_MW_DMA_2: - /* - * The cycle time is limited to 250ns by the r/w - * pulse width (90ns), however we should still - * have a maximum burst transfer rate of 8MB/s. - */ - drive->drive_data = 250; + cycle_time = 250; + use_dma_info = 1; break; case XFER_MW_DMA_1: - drive->drive_data = 250; + cycle_time = 250; + use_dma_info = 1; break; case XFER_MW_DMA_0: - drive->drive_data = 480; + cycle_time = 480; break; - default: - drive->drive_data = 0; + case XFER_SW_DMA_2: + case XFER_SW_DMA_1: + case XFER_SW_DMA_0: + cycle_time = 480; break; } - if (!drive->init_speed) - drive->init_speed = (u8) xfer_mode; + /* + * If we're going to be doing MW_DMA_1 or MW_DMA_2, we should + * take care to note the values in the ID... + */ + if (use_dma_info && drive->id->eide_dma_time > cycle_time) + cycle_time = drive->id->eide_dma_time; - if (drive->drive_data && - ide_config_drive_speed(drive, (u8) xfer_mode) == 0) - func = ide_dma_on; + drive->drive_data = cycle_time; + + if (cycle_time && ide_config_drive_speed(drive, xfer_mode) == 0) + on = 1; else drive->drive_data = 480; printk("%s: %s selected (peak %dMB/s)\n", drive->name, ide_xfer_verbose(xfer_mode), 2000 / drive->drive_data); - drive->current_speed = (u8) xfer_mode; - - return func; -} - -static int -icside_set_speed(ide_drive_t *drive, u8 speed) -{ - return icside_config_if(drive, speed); -} - -/* - * dma_intr() is the handler for disk read/write DMA interrupts - */ -static ide_startstop_t icside_dmaintr(ide_drive_t *drive) -{ - u8 dma_stat = HWIF(drive)->ide_dma_end(drive); - /* get drive status */ - u8 stat = HWIF(drive)->INB(IDE_STATUS_REG); - int i; + drive->current_speed = xfer_mode; - if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) { - if (!dma_stat) { - struct request *rq = HWGROUP(drive)->rq; - rq = HWGROUP(drive)->rq; - for (i = rq->nr_sectors; i > 0;) { - i -= rq->current_nr_sectors; - DRIVER(drive)->end_request(drive, 1); - } - return ide_stopped; - } - printk("%s: dma_intr: bad DMA status (dma_stat=%x)\n", - drive->name, dma_stat); - } - return DRIVER(drive)->error(drive, "dma_intr", stat); + return on; } /* @@ -361,16 +389,16 @@ * This should be defined in one place only. */ struct drive_list_entry { - char * id_model; - char * id_firmware; + const char * id_model; + const char * id_firmware; }; -static struct drive_list_entry drive_whitelist [] = { +static const struct drive_list_entry drive_whitelist [] = { { "Micropolis 2112A", "ALL" }, { "CONNER CTMA 4000", "ALL" }, { "CONNER CTT8000-A", "ALL" }, { "ST34342A", "ALL" }, - { NULL, 0 } + { NULL, NULL } }; static struct drive_list_entry drive_blacklist [] = { @@ -407,10 +435,11 @@ { "PLEXTOR CD-R PX-W8432T", "ALL" }, { "ATAPI CD-ROM DRIVE 40X MAXIMUM", "ALL" }, { "_NEC DV5800A", "ALL" }, - { NULL, 0 } + { NULL, NULL } }; -static int in_drive_list(struct hd_driveid *id, struct drive_list_entry * drive_table) +static int +in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table) { for ( ; drive_table->id_model ; drive_table++) if ((!strcmp(drive_table->id_model, id->model)) && @@ -420,41 +449,52 @@ return 0; } -/* - * For both Blacklisted and Whitelisted drives. - * This is setup to be called as an extern for future support - * to other special driver code. - */ -int check_drive_good_lists (ide_drive_t *drive) +static int icside_dma_host_off(ide_drive_t *drive) { - struct hd_driveid *id = drive->id; - return in_drive_list(id, drive_whitelist); + return 0; } -int check_drive_bad_lists (ide_drive_t *drive) +static int icside_dma_off_quietly(ide_drive_t *drive) { - struct hd_driveid *id = drive->id; - int blacklist = in_drive_list(id, drive_blacklist); - if (blacklist) - printk("%s: Disabling DMA for %s\n", drive->name, id->model); - return(blacklist); + drive->using_dma = 0; + return icside_dma_host_off(drive); +} + +static int icside_dma_off(ide_drive_t *drive) +{ + printk("%s: DMA disabled\n", drive->name); + return icside_dma_off_quietly(drive); +} + +static int icside_dma_host_on(ide_drive_t *drive) +{ + return 0; +} + +static int icside_dma_on(ide_drive_t *drive) +{ + drive->using_dma = 1; + return icside_dma_host_on(drive); } -int icside_dma_check(ide_drive_t *drive) +static int icside_dma_check(ide_drive_t *drive) { struct hd_driveid *id = drive->id; ide_hwif_t *hwif = HWIF(drive); - int autodma = hwif->autodma; int xfer_mode = XFER_PIO_2; + int on; - if (!id || !(id->capability & 1) || !autodma) - return hwif->ide_dma_off_quietly(drive); + if (!id || !(id->capability & 1) || !hwif->autodma) + goto out; /* * Consult the list of known "bad" drives */ - if (check_drive_bad_lists(drive)) - return hwif->ide_dma_off(drive); + if (in_drive_list(id, drive_blacklist)) { + printk("%s: Disabling DMA for %s (blacklisted)\n", + drive->name, id->model); + goto out; + } /* * Enable DMA on any drive that has multiword DMA @@ -473,192 +513,249 @@ /* * Consult the list of known "good" drives */ - if (check_drive_good_lists(drive)) { + if (in_drive_list(id, drive_whitelist)) { if (id->eide_dma_time > 150) goto out; xfer_mode = XFER_MW_DMA_1; } out: - if (icside_config_if(drive, xfer_mode)) - return hwif->ide_dma_on(drive); - return hwif->ide_dma_off(drive); -} + on = icside_set_speed(drive, xfer_mode); -int icside_dma_verbose(ide_drive_t *drive) -{ - printk(", DMA"); - return 1; + if (on) + return icside_dma_on(drive); + else + return icside_dma_off_quietly(drive); } -int icside_dma_test_irq(ide_drive_t *drive) +static int icside_dma_end(ide_drive_t *drive) { ide_hwif_t *hwif = HWIF(drive); - return inb((unsigned long)hwif->hw.priv) & 1; -} -int icside_dma_host_off(ide_drive_t *drive) -{ - return 0; -} + drive->waiting_for_dma = 0; -int icside_dma_off_quietly(ide_drive_t *drive) -{ - drive->using_dma = 0; - return icside_dma_host_off(drive); -} + disable_dma(hwif->hw.dma); -int icside_dma_off(ide_drive_t *drive) -{ - printk("%s: DMA disabled\n", drive->name); - return icside_dma_off_quietly(drive); -} + /* Teardown mappings after DMA has completed. */ + pci_unmap_sg(NULL, hwif->sg_table, hwif->sg_nents, + hwif->sg_dma_direction); -int icside_dma_host_on(ide_drive_t *drive) -{ - return 0; -} + hwif->sg_dma_active = 0; -int icside_dma_on(ide_drive_t *drive) -{ - drive->using_dma = 1; - return icside_dma_host_on(drive); + return get_dma_residue(hwif->hw.dma) != 0; } -int icside_dma_begin(ide_drive_t *drive) +static int icside_dma_begin(ide_drive_t *drive) { ide_hwif_t *hwif = HWIF(drive); + /* We can not enable DMA on both channels simultaneously. */ + BUG_ON(dma_channel_active(hwif->hw.dma)); enable_dma(hwif->hw.dma); return 0; } -int icside_dma_end(ide_drive_t *drive) +static int icside_dma_count(ide_drive_t *drive) { - ide_hwif_t *hwif = HWIF(drive); - - drive->waiting_for_dma = 0; - disable_dma(hwif->hw.dma); - icside_destroy_dmatable(drive); - return get_dma_residue(hwif->hw.dma) != 0; + return icside_dma_begin(drive); } -int icside_dma_count (ide_drive_t *drive) +/* + * dma_intr() is the handler for disk read/write DMA interrupts + */ +static ide_startstop_t icside_dmaintr(ide_drive_t *drive) { - return icside_dma_begin(drive); + unsigned int stat; + int dma_stat; + + dma_stat = icside_dma_end(drive); + stat = HWIF(drive)->INB(IDE_STATUS_REG); + if (OK_STAT(stat, DRIVE_READY, drive->bad_wstat | DRQ_STAT)) { + if (!dma_stat) { + struct request *rq = HWGROUP(drive)->rq; + int i; + + for (i = rq->nr_sectors; i > 0; ) { + i -= rq->current_nr_sectors; + DRIVER(drive)->end_request(drive, 1, rq->nr_sectors); + } + + return ide_stopped; + } + printk(KERN_ERR "%s: bad DMA status (dma_stat=%x)\n", + drive->name, dma_stat); + } + + return DRIVER(drive)->error(drive, __FUNCTION__, stat); } -int icside_dma_read(ide_drive_t *drive) +static int +icside_dma_common(ide_drive_t *drive, struct request *rq, + unsigned int dma_mode) { - ide_hwif_t *hwif = HWIF(drive); -// ide_task_t *args = HWGROUP(drive)->rq->special; - int count = 0; - u8 lba48 = (drive->addressing == 1) ? 1 : 0; - task_ioreg_t command = WIN_NOP; + ide_hwif_t *hwif = HWIF(drive); - count = icside_build_dmatable(drive, 1); - if (!count) - return 1; - disable_dma(hwif->hw.dma); + /* + * We can not enable DMA on both channels. + */ + BUG_ON(hwif->sg_dma_active); + BUG_ON(dma_channel_active(hwif->hw.dma)); + + ide_build_sglist(drive, rq); - /* Route the DMA signals to - * to the correct interface. + /* + * Ensure that we have the right interrupt routed. + */ + icside_maskproc(drive, 0); + + /* + * Route the DMA signals to the correct interface. */ - HWIF(drive)->OUTB(hwif->select_data, hwif->config_data); + outb(hwif->select_data, hwif->config_data); - /* Select the correct timing - * for this drive + /* + * Select the correct timing for this drive. */ set_dma_speed(hwif->hw.dma, drive->drive_data); - set_dma_sg(hwif->hw.dma, HWIF(drive)->sg_table, count); - set_dma_mode(hwif->hw.dma, DMA_MODE_READ); + /* + * Tell the DMA engine about the SG table and + * data direction. + */ + set_dma_sg(hwif->hw.dma, hwif->sg_table, hwif->sg_nents); + set_dma_mode(hwif->hw.dma, dma_mode); + + return 0; +} + +static int icside_dma_read(ide_drive_t *drive) +{ + struct request *rq = HWGROUP(drive)->rq; + task_ioreg_t cmd = WIN_NOP; + + if (icside_dma_common(drive, rq, DMA_MODE_READ)) + return 1; drive->waiting_for_dma = 1; + if (drive->media != ide_disk) return 0; - if (HWGROUP(drive)->handler != NULL) /* paranoia check */ - BUG(); - ide_set_handler(drive, &icside_dmaintr, WAIT_CMD, NULL); + BUG_ON(HWGROUP(drive)->handler != NULL); + + ide_set_handler(drive, icside_dmaintr, 2*WAIT_CMD, NULL); + /* * FIX ME to use only ACB ide_task_t args Struct */ #if 0 { - ide_task_t *args = HWGROUP(drive)->rq->special; + ide_task_t *args = rq->special; command = args->tfRegister[IDE_COMMAND_OFFSET]; } #else - command = (lba48) ? WIN_READDMA_EXT : WIN_READDMA; - if (HWGROUP(drive)->rq->flags & REQ_DRIVE_TASKFILE) { - ide_task_t *args = HWGROUP(drive)->rq->special; - command = args->tfRegister[IDE_COMMAND_OFFSET]; + if (rq->flags & REQ_DRIVE_TASKFILE) { + ide_task_t *args = rq->special; + cmd = args->tfRegister[IDE_COMMAND_OFFSET]; + } else if (drive->addressing == 1) { + cmd = WIN_READDMA_EXT; + } else { + cmd = WIN_READDMA; } #endif /* issue cmd to drive */ - HWIF(drive)->OUTB(command, IDE_COMMAND_REG); + HWIF(drive)->OUTB(cmd, IDE_COMMAND_REG); - return icside_dma_count(drive); + return icside_dma_begin(drive); } int icside_dma_write(ide_drive_t *drive) { - ide_hwif_t *hwif = HWIF(drive); -// ide_task_t *args = HWGROUP(drive)->rq->special; - int count = 0; - u8 lba48 = (drive->addressing == 1) ? 1 : 0; - task_ioreg_t command = WIN_NOP; + struct request *rq = HWGROUP(drive)->rq; + task_ioreg_t cmd = WIN_NOP; - count = icside_build_dmatable(drive, 0); - if (!count) + if (icside_dma_common(drive, rq, DMA_MODE_WRITE)) return 1; - disable_dma(hwif->hw.dma); - - /* Route the DMA signals to - * to the correct interface. - */ - HWIF(drive)->OUTB(hwif->select_data, hwif->config_data); - - /* Select the correct timing - * for this drive - */ - set_dma_speed(hwif->hw.dma, drive->drive_data); - - set_dma_sg(hwif->hw.dma, HWIF(drive)->sg_table, count); - set_dma_mode(hwif->hw.dma, DMA_MODE_WRITE); drive->waiting_for_dma = 1; + if (drive->media != ide_disk) return 0; - if (HWGROUP(drive)->handler != NULL) - BUG(); - ide_set_handler(drive, &icside_dmaintr, WAIT_CMD, NULL); + BUG_ON(HWGROUP(drive)->handler != NULL); + + ide_set_handler(drive, icside_dmaintr, 2*WAIT_CMD, NULL); + /* * FIX ME to use only ACB ide_task_t args Struct */ #if 0 { - ide_task_t *args = HWGROUP(drive)->rq->special; + ide_task_t *args = rq->special; command = args->tfRegister[IDE_COMMAND_OFFSET]; } #else - command = (lba48) ? WIN_WRITEDMA_EXT : WIN_WRITEDMA; - if (HWGROUP(drive)->rq->flags & REQ_DRIVE_TASKFILE) { - ide_task_t *args = HWGROUP(drive)->rq->special; - command = args->tfRegister[IDE_COMMAND_OFFSET]; + if (rq->flags & REQ_DRIVE_TASKFILE) { + ide_task_t *args = rq->special; + cmd = args->tfRegister[IDE_COMMAND_OFFSET]; + } else if (drive->addressing == 1) { + cmd = WIN_WRITEDMA_EXT; + } else { + cmd = WIN_WRITEDMA; } #endif /* issue cmd to drive */ - HWIF(drive)->OUTB(command, IDE_COMMAND_REG); + HWIF(drive)->OUTB(cmd, IDE_COMMAND_REG); - return icside_dma_count(drive); + return icside_dma_begin(drive); } -static int -icside_setup_dma(ide_hwif_t *hwif, int autodma) +static int icside_dma_test_irq(ide_drive_t *drive) +{ + ide_hwif_t *hwif = HWIF(drive); + struct icside_state *state = hwif->hw.priv; + + return inb(state->irq_port + + (hwif->channel ? + ICS_ARCIN_V6_INTRSTAT_2 : + ICS_ARCIN_V6_INTRSTAT_1)) & 1; +} + +static int icside_dma_verbose(ide_drive_t *drive) +{ + printk(", %s (peak %dMB/s)", + ide_xfer_verbose(drive->current_speed), + 2000 / drive->drive_data); + return 1; +} + +static int icside_dma_timeout(ide_drive_t *drive) { + printk(KERN_ERR "%s: DMA timeout occured: ", drive->name); + + if (icside_dma_test_irq(drive)) + return 0; + + ide_dump_status(drive, "DMA timeout", + HWIF(drive)->INB(IDE_STATUS_REG)); + + return icside_dma_end(drive); +} + +static int icside_dma_lostirq(ide_drive_t *drive) +{ + printk(KERN_ERR "%s: IRQ lost\n", drive->name); + return 1; +} + +static int icside_setup_dma(ide_hwif_t *hwif) +{ + int autodma = 0; + +#ifdef CONFIG_IDEDMA_ICS_AUTO + autodma = 1; +#endif + printk(" %s: SG-DMA", hwif->name); hwif->sg_table = kmalloc(sizeof(struct scatterlist) * NR_ENTRIES, @@ -666,40 +763,50 @@ if (!hwif->sg_table) goto failed; - hwif->dmatable_cpu = NULL; - hwif->dmatable_dma = 0; - hwif->speedproc = icside_set_speed; - hwif->autodma = autodma; + hwif->dmatable_cpu = NULL; + hwif->dmatable_dma = 0; + hwif->speedproc = icside_set_speed; + hwif->autodma = autodma; - hwif->ide_dma_check = icside_dma_check; - hwif->ide_dma_host_off = icside_dma_host_off; + hwif->ide_dma_check = icside_dma_check; + hwif->ide_dma_host_off = icside_dma_host_off; hwif->ide_dma_off_quietly = icside_dma_off_quietly; - hwif->ide_dma_off = icside_dma_off; - hwif->ide_dma_host_on = icside_dma_host_on; - hwif->ide_dma_on = icside_dma_on; - hwif->ide_dma_read = icside_dma_read; - hwif->ide_dma_write = icside_dma_write; - hwif->ide_dma_count = icside_dma_count; - hwif->ide_dma_begin = icside_dma_begin; - hwif->ide_dma_end = icside_dma_end; - hwif->ide_dma_verbose = icside_dma_verbose; - hwif->ide_dma_bad_drive = check_drive_bad_lists; - hwif->ide_dma_good_drive = check_drive_good_lists; - hwif->ide_dma_test_irq = icside_dma_test_irq; + hwif->ide_dma_off = icside_dma_off; + hwif->ide_dma_host_on = icside_dma_host_on; + hwif->ide_dma_on = icside_dma_on; + hwif->ide_dma_read = icside_dma_read; + hwif->ide_dma_write = icside_dma_write; + hwif->ide_dma_count = icside_dma_count; + hwif->ide_dma_begin = icside_dma_begin; + hwif->ide_dma_end = icside_dma_end; + hwif->ide_dma_test_irq = icside_dma_test_irq; + hwif->ide_dma_verbose = icside_dma_verbose; + hwif->ide_dma_timeout = icside_dma_timeout; + hwif->ide_dma_lostirq = icside_dma_lostirq; - printk(" capable%s\n", autodma ? - ", auto-enable" : ""); + hwif->drives[0].autodma = autodma; + hwif->drives[1].autodma = autodma; + + printk(" capable%s\n", autodma ? ", auto-enable" : ""); return 1; failed: - printk(" -- ERROR, unable to allocate DMA table\n"); + printk(" disabled, unable to allocate DMA table\n"); return 0; } + +int ide_release_dma(ide_hwif_t *hwif) +{ + if (hwif->sg_table) { + kfree(hwif->sg_table); + hwif->sg_table = NULL; + } + return 1; +} #endif -static ide_hwif_t * -icside_find_hwif(unsigned long dataport) +static ide_hwif_t *icside_find_hwif(unsigned long dataport) { ide_hwif_t *hwif; int index; @@ -716,7 +823,7 @@ goto found; } - return NULL; + hwif = NULL; found: return hwif; } @@ -750,7 +857,7 @@ return hwif; } -static int __init icside_register_v5(struct expansion_card *ec, int autodma) +static int __init icside_register_v5(struct expansion_card *ec) { unsigned long slot_port; ide_hwif_t *hwif; @@ -769,14 +876,15 @@ hwif = icside_setup(slot_port, &icside_cardinfo_v5, ec->irq); - return hwif ? 0 : -1; + return hwif ? 0 : -ENODEV; } -static int __init icside_register_v6(struct expansion_card *ec, int autodma) +static int __init icside_register_v6(struct expansion_card *ec) { unsigned long slot_port, port; + struct icside_state *state; ide_hwif_t *hwif, *mate; - int sel = 0; + unsigned int sel = 0; slot_port = ecard_address(ec, ECARD_IOC, ECARD_FAST); port = ecard_address(ec, ECARD_EASI, ECARD_FAST); @@ -788,88 +896,128 @@ outb(sel, slot_port); - ec->irq_data = (void *)port; - ec->ops = (expansioncard_ops_t *)&icside_ops_arcin_v6; - /* * Be on the safe side - disable interrupts */ inb(port + ICS_ARCIN_V6_INTROFFSET_1); inb(port + ICS_ARCIN_V6_INTROFFSET_2); + /* + * Find and register the interfaces. + */ hwif = icside_setup(port, &icside_cardinfo_v6_1, ec->irq); mate = icside_setup(port, &icside_cardinfo_v6_2, ec->irq); + if (!hwif || !mate) + return -ENODEV; + + state = kmalloc(sizeof(struct icside_state), GFP_KERNEL); + if (!state) + return -ENOMEM; + + state->channel = 0; + state->enabled = 0; + state->irq_port = port; + + ec->irq_data = state; + ec->ops = (expansioncard_ops_t *)&icside_ops_arcin_v6; + + hwif->maskproc = icside_maskproc; + hwif->channel = 0; + hwif->hw.priv = state; + hwif->mate = mate; + hwif->serialized = 1; + hwif->config_data = slot_port; + hwif->select_data = sel; + hwif->hw.dma = ec->dma; + + mate->maskproc = icside_maskproc; + mate->channel = 1; + mate->hw.priv = state; + mate->mate = hwif; + mate->serialized = 1; + mate->config_data = slot_port; + mate->select_data = sel | 1; + mate->hw.dma = ec->dma; + #ifdef CONFIG_BLK_DEV_IDEDMA_ICS - if (ec->dma != NO_DMA) { - if (request_dma(ec->dma, hwif->name)) - goto no_dma; - - if (hwif) { - hwif->config_data = slot_port; - hwif->select_data = sel; - hwif->hw.dma = ec->dma; - hwif->hw.priv = (void *) - (port + ICS_ARCIN_V6_INTRSTAT_1); - hwif->channel = 0; - icside_setup_dma(hwif, autodma); - hwif->drives[0].autodma = autodma; - hwif->drives[1].autodma = autodma; - } - if (mate) { - mate->config_data = slot_port; - mate->select_data = sel | 1; - mate->hw.dma = ec->dma; - mate->hw.priv = (void *) - (port + ICS_ARCIN_V6_INTRSTAT_2); - mate->channel = 1; - icside_setup_dma(mate, autodma); - mate->drives[0].autodma = autodma; - mate->drives[1].autodma = autodma; - } + if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) { + icside_setup_dma(hwif); + icside_setup_dma(mate); } -no_dma: #endif - return hwif || mate ? 0 : -1; + return 0; } -int __init icside_init(void) +static int __devinit +icside_probe(struct expansion_card *ec, const struct ecard_id *id) { - int autodma = 0; + int result; -#ifdef CONFIG_IDEDMA_ICS_AUTO - autodma = 1; -#endif + ecard_claim(ec); - ecard_startfind (); + switch (icside_identifyif(ec)) { + case ics_if_arcin_v5: + result = icside_register_v5(ec); + break; - do { - struct expansion_card *ec; - int result; + case ics_if_arcin_v6: + result = icside_register_v6(ec); + break; - ec = ecard_find(0, icside_cids); - if (ec == NULL) - break; + default: + result = -ENODEV; + break; + } - ecard_claim(ec); + if (result) + ecard_release(ec); + /* + * this locks the driver in-core - remove this + * comment and the two lines below when we can + * safely remove interfaces. + */ + else + MOD_INC_USE_COUNT; - switch (icside_identifyif(ec)) { - case ics_if_arcin_v5: - result = icside_register_v5(ec, autodma); - break; + return result; +} - case ics_if_arcin_v6: - result = icside_register_v6(ec, autodma); - break; +static void __devexit +icside_remove(struct expansion_card *ec) +{ + /* need to do more */ + ecard_release(ec); +} - default: - result = -1; - break; - } +static const struct ecard_id icside_ids[] = { + { MANU_ICS, PROD_ICS_IDE }, + { MANU_ICS2, PROD_ICS2_IDE }, + { 0xffff, 0xffff } +}; - if (result) - ecard_release(ec); - } while (1); +static struct ecard_driver icside_driver = { + .probe = icside_probe, + .remove = __devexit_p(icside_remove), + .id_table = icside_ids, + .drv = { + .name = "icside", + }, +}; - return 0; +static int __init icside_init(void) +{ + return ecard_register_driver(&icside_driver); } + +static void __exit icside_exit(void) +{ + ecard_remove_driver(&icside_driver); +} + +MODULE_AUTHOR("Russell King "); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("ICS IDE driver"); + +module_init(icside_init); +module_exit(icside_exit); diff -Nru a/drivers/ide/arm/rapide.c b/drivers/ide/arm/rapide.c --- a/drivers/ide/arm/rapide.c Mon Oct 28 16:32:37 2002 +++ b/drivers/ide/arm/rapide.c Mon Oct 28 16:32:37 2002 @@ -1,11 +1,7 @@ /* * linux/drivers/ide/rapide.c * - * Copyright (c) 1996-1998 Russell King. - * - * Changelog: - * 08-06-1996 RMK Created - * 13-04-1998 RMK Added manufacturer and product IDs + * Copyright (c) 1996-2002 Russell King. */ #include @@ -17,20 +13,14 @@ #include -static card_ids __init rapide_cids[] = { - { MANU_YELLOWSTONE, PROD_YELLOWSTONE_RAPIDE32 }, - { 0xffff, 0xffff } -}; - -static struct expansion_card *ec[MAX_ECARDS]; -static int result[MAX_ECARDS]; - -static inline int rapide_register(struct expansion_card *ec) +static int __devinit +rapide_probe(struct expansion_card *ec, const struct ecard_id *id) { unsigned long port = ecard_address (ec, ECARD_MEMC, 0); hw_regs_t hw; + int i, ret; - int i; + ecard_claim(ec); memset(&hw, 0, sizeof(hw)); @@ -41,54 +31,53 @@ hw.io_ports[IDE_CONTROL_OFFSET] = port + 0x206; hw.irq = ec->irq; - return ide_register_hw(&hw, NULL); -} + ret = ide_register_hw(&hw, NULL); -int __init rapide_init(void) -{ - int i; - - for (i = 0; i < MAX_ECARDS; i++) - ec[i] = NULL; - - ecard_startfind(); + if (ret) + ecard_release(ec); + /* + * this locks the driver in-core - remove this + * comment and the two lines below when we can + * safely remove interfaces. + */ + else + MOD_INC_USE_COUNT; - for (i = 0; ; i++) { - if ((ec[i] = ecard_find(0, rapide_cids)) == NULL) - break; + return ret; +} - ecard_claim(ec[i]); - result[i] = rapide_register(ec[i]); - } - for (i = 0; i < MAX_ECARDS; i++) - if (ec[i] && result[i] < 0) { - ecard_release(ec[i]); - ec[i] = NULL; - } - return 0; +static void __devexit rapide_remove(struct expansion_card *ec) +{ + /* need to do more */ + ecard_release(ec); } -#ifdef MODULE -MODULE_LICENSE("GPL"); +static struct ecard_id rapide_ids[] = { + { MANU_YELLOWSTONE, PROD_YELLOWSTONE_RAPIDE32 }, + { 0xffff, 0xffff } +}; -int init_module (void) +static struct ecard_driver rapide_driver = { + .probe = rapide_probe, + .remove = __devexit_p(rapide_remove), + .id_table = rapide_ids, + .drv = { + .name = "rapide", + }, +}; + +static int __init rapide_init(void) { - return rapide_init(); + return ecard_register_driver(&rapide_driver); } -void cleanup_module (void) +static void __exit rapide_exit(void) { - int i; - - for (i = 0; i < MAX_ECARDS; i++) - if (ec[i]) { - unsigned long port; - port = ecard_address(ec[i], ECARD_MEMC, 0); - - ide_unregister_port(port, ec[i]->irq, 16); - ecard_release(ec[i]); - ec[i] = NULL; - } + ecard_remove_driver(&rapide_driver); } -#endif +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Yellowstone RAPIDE driver"); + +module_init(rapide_init); +module_exit(rapide_exit); diff -Nru a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c --- a/drivers/ide/ide-cd.c Mon Oct 28 16:32:36 2002 +++ b/drivers/ide/ide-cd.c Mon Oct 28 16:32:36 2002 @@ -608,7 +608,7 @@ if (drive == NULL || (rq = HWGROUP(drive)->rq) == NULL) return ide_stopped; /* retry only "normal" I/O: */ - if ((rq->flags & REQ_DRIVE_CMD) || (rq->flags & REQ_DRIVE_TASK)) { + if (rq->flags & (REQ_DRIVE_CMD | REQ_DRIVE_TASK)) { rq->errors = 1; ide_end_drive_cmd(drive, stat, err); return ide_stopped; @@ -638,12 +638,16 @@ static void cdrom_end_request (ide_drive_t *drive, int uptodate) { struct request *rq = HWGROUP(drive)->rq; + int nsectors = rq->hard_cur_sectors; if ((rq->flags & REQ_SENSE) && uptodate) { - /* For REQ_SENSE, "rq->buffer" points to the original failed request */ - struct request *failed = (struct request *) rq->buffer; + /* + * For REQ_SENSE, "rq->buffer" points to the original failed + * request + */ + struct request *failed = (struct request *) rq->buffer; struct cdrom_info *info = drive->driver_data; - void * sense = &info->sense_data; + void *sense = &info->sense_data; if (failed && failed->sense) sense = failed->sense; @@ -651,28 +655,27 @@ cdrom_analyze_sense_data(drive, failed, sense); } - if (blk_fs_request(rq) && !rq->current_nr_sectors) + if (!rq->current_nr_sectors && blk_fs_request(rq)) uptodate = 1; + if (!nsectors) + nsectors = 1; - ide_end_request(drive, uptodate, rq->hard_cur_sectors); + ide_end_request(drive, uptodate, nsectors); } -/* Handle differences between SCSI and ATAPI packet commands */ -static int pre_transform_command(struct request *); -static void post_transform_command(struct request *); - /* Returns 0 if the request should be continued. Returns 1 if the request was ended. */ -static int cdrom_decode_status (ide_startstop_t *startstop, ide_drive_t *drive, - int good_stat, int *stat_ret) +static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret) { struct request *rq = HWGROUP(drive)->rq; int stat, err, sense_key; /* Check for errors. */ - *stat_ret = stat = HWIF(drive)->INB(IDE_STATUS_REG); + stat = HWIF(drive)->INB(IDE_STATUS_REG); + if (stat_ret) + *stat_ret = stat; - if (OK_STAT (stat, good_stat, BAD_R_STAT)) + if (OK_STAT(stat, good_stat, BAD_R_STAT)) return 0; /* Get the IDE error register. */ @@ -681,7 +684,6 @@ if (rq == NULL) { printk("%s: missing rq in cdrom_decode_status\n", drive->name); - *startstop = ide_stopped; return 1; } @@ -692,16 +694,19 @@ rq->flags |= REQ_FAILED; cdrom_end_request(drive, 0); - *startstop = DRIVER(drive)->error(drive, "request sense failure", stat); + DRIVER(drive)->error(drive, "request sense failure", stat); return 1; } else if (rq->flags & (REQ_PC | REQ_BLOCK_PC)) { /* All other functions, except for READ. */ struct completion *wait = NULL; - /* Fix up any SCSI command differences.. */ - if (rq->flags & REQ_BLOCK_PC) - post_transform_command(rq); + /* + * if we have an error, pass back CHECK_CONDITION as the + * scsi status byte + */ + if ((rq->flags & REQ_BLOCK_PC) && !rq->errors) + rq->errors = CHECK_CONDITION; /* Check for tray open. */ if (sense_key == NOT_READY) { @@ -763,7 +768,7 @@ } else if ((err & ~ABRT_ERR) != 0) { /* Go to the default handler for other errors. */ - *startstop = DRIVER(drive)->error(drive, "cdrom_decode_status", stat); + DRIVER(drive)->error(drive, "cdrom_decode_status",stat); return 1; } else if (sense_key == MEDIUM_ERROR) { /* No point in re-trying a zillion times on a bad @@ -779,11 +784,12 @@ queue a request sense command. */ if ((stat & ERR_STAT) != 0) cdrom_queue_request_sense(drive, NULL, NULL, NULL); - } else - blk_dump_rq_flags(rq, "ide-cd bad flags"); + } else { + blk_dump_rq_flags(rq, "ide-cd: bad rq"); + cdrom_end_request(drive, 0); + } /* Retry, or handle the next request. */ - *startstop = ide_stopped; return 1; } @@ -848,7 +854,7 @@ HWIF(drive)->OUTB(xferlen >> 8 , IDE_BCOUNTH_REG); if (IDE_CONTROL_REG) HWIF(drive)->OUTB(drive->ctl, IDE_CONTROL_REG); - + if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) { if (HWGROUP(drive)->handler != NULL) BUG(); @@ -876,20 +882,16 @@ struct request *rq, ide_handler_t *handler) { - unsigned char *cmd_buf = rq->cmd; - int cmd_len = sizeof(rq->cmd); - unsigned int timeout = rq->timeout; struct cdrom_info *info = drive->driver_data; ide_startstop_t startstop; if (CDROM_CONFIG_FLAGS(drive)->drq_interrupt) { /* Here we should have been called after receiving an interrupt from the device. DRQ should how be set. */ - int stat_dum; /* Check for errors. */ - if (cdrom_decode_status(&startstop, drive, DRQ_STAT, &stat_dum)) - return startstop; + if (cdrom_decode_status(drive, DRQ_STAT, NULL)) + return ide_stopped; } else { /* Otherwise, we must wait for DRQ to get set. */ if (ide_wait_stat(&startstop, drive, DRQ_STAT, @@ -901,10 +903,10 @@ BUG(); /* Arm the interrupt handler. */ - ide_set_handler(drive, handler, timeout, cdrom_timer_expiry); + ide_set_handler(drive, handler, rq->timeout, cdrom_timer_expiry); /* Send the command to the device. */ - HWIF(drive)->atapi_output_bytes(drive, cmd_buf, cmd_len); + HWIF(drive)->atapi_output_bytes(drive, rq->cmd, sizeof(rq->cmd)); /* Start the DMA if need be */ if (info->dma) @@ -970,14 +972,12 @@ static inline int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason) { - ireason &= 3; - if (ireason == 2) return 0; - - if (ireason == 0) { + if (ireason == 2) + return 0; + else if (ireason == 0) { /* Whoops... The drive is expecting to receive data from us! */ - printk ("%s: cdrom_read_intr: " - "Drive wants to transfer data the wrong way!\n", - drive->name); + printk("%s: read_intr: Drive wants to transfer data the " + "wrong way!\n", drive->name); /* Throw some data at the drive so it doesn't hang and quit this request. */ @@ -994,8 +994,8 @@ return 0; } else { /* Drive wants a command packet, or invalid ireason... */ - printk ("%s: cdrom_read_intr: bad interrupt reason %d\n", - drive->name, ireason); + printk("%s: read_intr: bad interrupt reason %x\n", drive->name, + ireason); } cdrom_end_request(drive, 0); @@ -1012,20 +1012,21 @@ struct cdrom_info *info = drive->driver_data; u8 lowcyl = 0, highcyl = 0; int dma = info->dma, dma_error = 0; - ide_startstop_t startstop; struct request *rq = HWGROUP(drive)->rq; - /* Check for errors. */ + /* + * handle dma case + */ if (dma) { info->dma = 0; if ((dma_error = HWIF(drive)->ide_dma_end(drive))) HWIF(drive)->ide_dma_off(drive); } - if (cdrom_decode_status (&startstop, drive, 0, &stat)) - return startstop; - + if (cdrom_decode_status(drive, 0, &stat)) + return ide_stopped; + if (dma) { if (!dma_error) { ide_end_request(drive, 1, rq->nr_sectors); @@ -1035,7 +1036,7 @@ } /* Read the interrupt reason and the transfer length. */ - ireason = HWIF(drive)->INB(IDE_IREASON_REG); + ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3; lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG); highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG); @@ -1080,7 +1081,7 @@ /* First, figure out if we need to bit-bucket any of the leading sectors. */ - nskip = MIN((int)(rq->current_nr_sectors - bio_sectors(rq->bio)), sectors_to_transfer); + nskip = MIN((int)(rq->current_nr_sectors - bio_cur_sectors(rq->bio)), sectors_to_transfer); while (nskip > 0) { /* We need to throw away a sector. */ @@ -1180,7 +1181,7 @@ represent the number of sectors to skip at the start of a transfer will fail. I think that this will never happen, but let's be paranoid and check. */ - if (rq->current_nr_sectors < bio_sectors(rq->bio) && + if (rq->current_nr_sectors < bio_cur_sectors(rq->bio) && (rq->sector % SECTORS_PER_FRAME) != 0) { printk("%s: cdrom_read_from_buffer: buffer botch (%ld)\n", drive->name, (long)rq->sector); @@ -1218,7 +1219,7 @@ nskip = (sector % SECTORS_PER_FRAME); if (nskip > 0) { /* Sanity check... */ - if (rq->current_nr_sectors != bio_sectors(rq->bio) && + if (rq->current_nr_sectors != bio_cur_sectors(rq->bio) && (rq->sector % CD_FRAMESIZE != 0)) { printk ("%s: cdrom_start_read_continuation: buffer botch (%u)\n", drive->name, rq->current_nr_sectors); @@ -1257,10 +1258,9 @@ struct cdrom_info *info = drive->driver_data; int stat; static int retry = 10; - ide_startstop_t startstop; - if (cdrom_decode_status (&startstop, drive, 0, &stat)) - return startstop; + if (cdrom_decode_status(drive, 0, &stat)) + return ide_stopped; CDROM_CONFIG_FLAGS(drive)->seeking = 1; if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) { @@ -1318,7 +1318,7 @@ rq->nr_sectors += n; rq->sector -= n; } - rq->hard_cur_sectors = rq->current_nr_sectors = bio_sectors(rq->bio); + rq->hard_cur_sectors = rq->current_nr_sectors = bio_cur_sectors(rq->bio); rq->hard_nr_sectors = rq->nr_sectors; rq->hard_sector = rq->sector; rq->q->prep_rq_fn(rq->q, rq); @@ -1353,6 +1353,7 @@ info->dma = 0; info->cmd = READ; + /* Start sending the read request to the drive. */ return cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation); } @@ -1361,21 +1362,17 @@ * Execute all other packet commands. */ -/* Forward declarations. */ -static int cdrom_lockdoor(ide_drive_t *drive, int lockflag, - struct request_sense *sense); - /* Interrupt routine for packet command completion. */ static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive) { - int ireason, len, stat, thislen; + int ireason, len, thislen; struct request *rq = HWGROUP(drive)->rq; - ide_startstop_t startstop; u8 lowcyl = 0, highcyl = 0; + int stat; /* Check for errors. */ - if (cdrom_decode_status(&startstop, drive, 0, &stat)) - return startstop; + if (cdrom_decode_status(drive, 0, &stat)) + return ide_stopped; /* Read the interrupt reason and the transfer length. */ ireason = HWIF(drive)->INB(IDE_IREASON_REG); @@ -1420,8 +1417,10 @@ /* The drive wants to be written to. */ if ((ireason & 3) == 0) { - if (!rq->data) + if (!rq->data) { + blk_dump_rq_flags(rq, "cdrom_pc_intr, write"); goto confused; + } /* Transfer the data. */ HWIF(drive)->atapi_output_bytes(drive, rq->data, thislen); @@ -1440,8 +1439,10 @@ /* Same drill for reading. */ else if ((ireason & 3) == 2) { - if (!rq->data) + if (!rq->data) { + blk_dump_rq_flags(rq, "cdrom_pc_intr, write"); goto confused; + } /* Transfer the data. */ HWIF(drive)->atapi_input_bytes(drive, rq->data, thislen); @@ -1456,6 +1457,8 @@ /* Keep count of how much data we've moved. */ rq->data += thislen; rq->data_len -= thislen; + if (rq->cmd[0] == GPCMD_REQUEST_SENSE) + rq->sense_len++; } else { confused: printk ("%s: cdrom_pc_intr: The drive " @@ -1472,7 +1475,6 @@ return ide_started; } - static ide_startstop_t cdrom_do_pc_continuation (ide_drive_t *drive) { struct request *rq = HWGROUP(drive)->rq; @@ -1570,39 +1572,202 @@ { /* Two notes about IDE interrupt reason here - 0 means that * the drive wants to receive data from us, 2 means that - * the drive is expecting data from us. + * the drive is expecting to transfer data to us. */ - ireason &= 3; - - if (ireason == 2) { + if (ireason == 0) + return 0; + else if (ireason == 2) { /* Whoops... The drive wants to send data. */ - printk("%s: cdrom_write_intr: wrong transfer direction!\n", - drive->name); + printk("%s: write_intr: wrong transfer direction!\n", + drive->name); - /* Throw some data at the drive so it doesn't hang - and quit this request. */ while (len > 0) { int dum = 0; - HWIF(drive)->atapi_output_bytes(drive, &dum, sizeof(dum)); + HWIF(drive)->atapi_input_bytes(drive, &dum, sizeof(dum)); len -= sizeof(dum); } } else { /* Drive wants a command packet, or invalid ireason... */ - printk("%s: cdrom_write_intr: bad interrupt reason %d\n", - drive->name, ireason); + printk("%s: write_intr: bad interrupt reason %x\n", + drive->name, ireason); } cdrom_end_request(drive, 0); return 1; } +static void post_transform_command(struct request *req) +{ + char *ibuf = req->buffer; + u8 *c = req->cmd; + + if (!blk_pc_request(req)) + return; + + /* + * set ansi-revision and response data as atapi + */ + if (c[0] == GPCMD_INQUIRY) { + ibuf[2] |= 2; + ibuf[3] = (ibuf[3] & 0xf0) | 2; + } +} + +typedef void (xfer_func_t)(ide_drive_t *, void *, u32); + +/* + * best way to deal with dma that is not sector aligned right now... note + * that in this path we are not using ->data or ->buffer at all. this irs + * can replace cdrom_pc_intr, cdrom_read_intr, and cdrom_write_intr in the + * future. + */ +static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) +{ + struct cdrom_info *info = drive->driver_data; + struct request *rq = HWGROUP(drive)->rq; + int dma_error, dma, stat, ireason, len, thislen; + u8 lowcyl, highcyl; + xfer_func_t *xferfunc; + unsigned long flags; + + /* Check for errors. */ + dma_error = 0; + dma = info->dma; + if (dma) { + info->dma = 0; + if ((dma_error = HWIF(drive)->ide_dma_end(drive))) { + printk("ide-cd: dma error\n"); + HWIF(drive)->ide_dma_off(drive); + } + } + + if (cdrom_decode_status(drive, 0, &stat)) { + end_that_request_chunk(rq, 1, rq->data_len); + return ide_stopped; + } + + /* + * using dma, transfer is complete now + */ + if (dma) { + if (dma_error) + return DRIVER(drive)->error(drive, "dma error", stat); + + end_that_request_chunk(rq, 1, rq->data_len); + rq->data_len = 0; + goto end_request; + } + + /* + * ok we fall to pio :/ + */ + ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3; + lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG); + highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG); + + len = lowcyl + (256 * highcyl); + thislen = rq->data_len; + if (thislen > len) + thislen = len; + + /* + * If DRQ is clear, the command has completed. + */ + if ((stat & DRQ_STAT) == 0) { + if (rq->data_len) + printk("%s: %u residual after xfer\n", __FUNCTION__, rq->data_len); + goto end_request; + } + + /* + * check which way to transfer data + */ + if (rq_data_dir(rq) == WRITE) { + /* + * write to drive + */ + if (cdrom_write_check_ireason(drive, len, ireason)) + return ide_stopped; + + xferfunc = HWIF(drive)->atapi_output_bytes; + } else { + /* + * read from drive + */ + if (cdrom_read_check_ireason(drive, len, ireason)) + return ide_stopped; + + xferfunc = HWIF(drive)->atapi_input_bytes; + } + + /* + * transfer data + */ + while (thislen > 0) { + int blen = blen = rq->data_len; + char *ptr = rq->data; + + /* + * bio backed? + */ + if (rq->bio) { + ptr = bio_data(rq->bio); + blen = bio_iovec(rq->bio)->bv_len; + } + + if (blen > thislen) + blen = thislen; + + xferfunc(drive, ptr, blen); + + thislen -= blen; + len -= blen; + rq->data_len -= blen; + + if (rq->bio) + end_that_request_chunk(rq, 1, blen); + else + rq->data += blen; + } + + /* + * pad, if necessary + */ + if (len) { + printk("%s: padding %u bytes\n", drive->name, len); + + while (len) { + int pad = 0; + + xferfunc(drive, &pad, sizeof(pad)); + len -= sizeof(pad); + } + } + + if (HWGROUP(drive)->handler != NULL) + BUG(); + + ide_set_handler(drive, cdrom_newpc_intr, rq->timeout, NULL); + return ide_started; + +end_request: + if (!rq->data_len) + post_transform_command(rq); + + spin_lock_irqsave(&ide_lock, flags); + blkdev_dequeue_request(rq); + end_that_request_last(rq); + HWGROUP(drive)->rq = NULL; + spin_unlock_irqrestore(&ide_lock, flags); + return ide_stopped; +} + static ide_startstop_t cdrom_write_intr(ide_drive_t *drive) { int stat, ireason, len, sectors_to_transfer, uptodate; struct cdrom_info *info = drive->driver_data; int dma_error = 0, dma = info->dma; u8 lowcyl = 0, highcyl = 0; - ide_startstop_t startstop; struct request *rq = HWGROUP(drive)->rq; @@ -1615,11 +1780,11 @@ } } - if (cdrom_decode_status(&startstop, drive, 0, &stat)) { + if (cdrom_decode_status(drive, 0, &stat)) { printk("ide-cd: write_intr decode_status bad\n"); - return startstop; + return ide_stopped; } - + /* * using dma, transfer is complete now */ @@ -1654,9 +1819,8 @@ } /* Check that the drive is expecting to do the same thing we are. */ - if (ireason & 3) - if (cdrom_write_check_ireason(drive, len, ireason)) - return ide_stopped; + if (cdrom_write_check_ireason(drive, len, ireason)) + return ide_stopped; sectors_to_transfer = len / SECTOR_SIZE; @@ -1704,10 +1868,6 @@ static ide_startstop_t cdrom_start_write_cont(ide_drive_t *drive) { struct request *rq = HWGROUP(drive)->rq; - unsigned nframes, frame; - - nframes = rq->nr_sectors >> 2; - frame = rq->sector >> 2; #if 0 /* the immediate bit */ rq->cmd[1] = 1 << 3; @@ -1748,56 +1908,40 @@ return cdrom_start_packet_command(drive, 32768, cdrom_start_write_cont); } -/* - * Most of the SCSI commands are supported directly by ATAPI devices. - * This transform handles the few exceptions. - */ -static int pre_transform_command(struct request *req) +static ide_startstop_t cdrom_do_newpc_cont(ide_drive_t *drive) { - u8 *c = req->cmd; - /* Transform 6-byte read/write commands to the 10-byte version. */ - if (c[0] == READ_6 || c[0] == WRITE_6) { - c[8] = c[4]; - c[5] = c[3]; - c[4] = c[2]; - c[3] = c[1] & 0x1f; - c[2] = 0; - c[1] &= 0xe0; - c[0] += (READ_10 - READ_6); - return 0; - } + struct request *rq = HWGROUP(drive)->rq; - /* These also need fixup, not done yet */ - if (c[0] == MODE_SENSE || c[0] == MODE_SELECT) - return -EINVAL; + if (!rq->timeout) + rq->timeout = WAIT_CMD; - return 0; -} - -static void post_transform_command(struct request *req) -{ + return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr); } static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq) { - ide_startstop_t startstop; - struct cdrom_info *info; - - if (pre_transform_command(rq) < 0) { - cdrom_end_request(drive, 0); - return ide_stopped; - } + struct cdrom_info *info = drive->driver_data; rq->flags |= REQ_QUIET; - info = drive->driver_data; info->dma = 0; info->cmd = 0; - /* Start sending the command to the drive. */ - startstop = cdrom_start_packet_command(drive, rq->data_len, cdrom_do_pc_continuation); + /* + * sg request + */ + if (rq->bio) { + if (rq->data_len & 3) { + printk("%s: block pc not aligned, len=%d\n", drive->name, rq->data_len); + cdrom_end_request(drive, 0); + return ide_stopped; + } + info->dma = drive->using_dma; + info->cmd = rq_data_dir(rq); + } - return startstop; + /* Start sending the command to the drive. */ + return cdrom_start_packet_command(drive, rq->data_len, cdrom_do_newpc_cont); } /**************************************************************************** @@ -2314,7 +2458,7 @@ req.sense = cgc->sense; cgc->stat = cdrom_queue_packet_command(drive, &req); if (!cgc->stat) - cgc->buflen -= req.data_len; + cgc->buflen = req.data_len; return cgc->stat; } @@ -2451,7 +2595,7 @@ int ret; cdrom_prepare_request(&req); - req.flags = REQ_SPECIAL; + req.flags = REQ_SPECIAL | REQ_QUIET; ret = ide_do_drive_cmd(drive, &req, ide_wait); /* @@ -2828,15 +2972,12 @@ /* * standard prep_rq_fn that builds 10 byte cmds */ -static int ll_10byte_cmd_build(request_queue_t *q, struct request *rq) +static int ide_cdrom_prep_fs(request_queue_t *q, struct request *rq) { int hard_sect = queue_hardsect_size(q); long block = (long)rq->hard_sector / (hard_sect >> 9); unsigned long blocks = rq->hard_nr_sectors / (hard_sect >> 9); - if (!(rq->flags & REQ_CMD)) - return 0; - BUG_ON(sizeof(rq->hard_sector) > 4 && (rq->hard_sector >> 32)); if (rq->hard_nr_sectors != rq->nr_sectors) { @@ -2863,6 +3004,50 @@ */ rq->cmd[7] = (blocks >> 8) & 0xff; rq->cmd[8] = blocks & 0xff; + return BLKPREP_OK; +} + +/* + * Most of the SCSI commands are supported directly by ATAPI devices. + * This transform handles the few exceptions. + */ +static int ide_cdrom_prep_pc(struct request *rq) +{ + u8 *c = rq->cmd; + + /* + * Transform 6-byte read/write commands to the 10-byte version + */ + if (c[0] == READ_6 || c[0] == WRITE_6) { + c[8] = c[4]; + c[5] = c[3]; + c[4] = c[2]; + c[3] = c[1] & 0x1f; + c[2] = 0; + c[1] &= 0xe0; + c[0] += (READ_10 - READ_6); + return BLKPREP_OK; + } + + /* + * it's silly to pretend we understand 6-byte sense commands, just + * reject with ILLEGAL_REQUEST and the caller should take the + * appropriate action + */ + if (c[0] == MODE_SENSE || c[0] == MODE_SELECT) { + rq->errors = ILLEGAL_REQUEST; + return BLKPREP_KILL; + } + + return BLKPREP_OK; +} + +static int ide_cdrom_prep_fn(request_queue_t *q, struct request *rq) +{ + if (rq->flags & REQ_CMD) + return ide_cdrom_prep_fs(q, rq); + else if (rq->flags & REQ_BLOCK_PC) + return ide_cdrom_prep_pc(rq); return 0; } @@ -2880,7 +3065,8 @@ set_device_ro(mk_kdev(drive->disk->major, drive->disk->first_minor), 1); blk_queue_hardsect_size(&drive->queue, CD_FRAMESIZE); - blk_queue_prep_rq(&drive->queue, ll_10byte_cmd_build); + blk_queue_prep_rq(&drive->queue, ide_cdrom_prep_fn); + blk_queue_dma_alignment(&drive->queue, 3); drive->special.all = 0; drive->ready_stat = 0; diff -Nru a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c --- a/drivers/ide/ide-disk.c Mon Oct 28 16:32:36 2002 +++ b/drivers/ide/ide-disk.c Mon Oct 28 16:32:36 2002 @@ -1610,56 +1610,6 @@ #endif } -static int idedisk_suspend(struct device *dev, u32 state, u32 level) -{ - ide_drive_t *drive = dev->driver_data; - - printk("Suspending device %p\n", dev->driver_data); - - /* I hope that every freeze operation from the upper levels have - * already been done... - */ - - if (level != SUSPEND_SAVE_STATE) - return 0; - BUG_ON(in_interrupt()); - - printk("Waiting for commands to finish\n"); - - /* wait until all commands are finished */ - /* FIXME: waiting for spinlocks should be done instead. */ - if (!(HWGROUP(drive))) - printk("No hwgroup?\n"); - while (HWGROUP(drive)->handler) - yield(); - - /* set the drive to standby */ - printk(KERN_INFO "suspending: %s ", drive->name); - if (drive->driver) { - if (drive->driver->standby) - drive->driver->standby(drive); - } - drive->blocked = 1; - - while (HWGROUP(drive)->handler) - yield(); - - return 0; -} - -static int idedisk_resume(struct device *dev, u32 level) -{ - ide_drive_t *drive = dev->driver_data; - - if (level != RESUME_RESTORE_STATE) - return 0; - if (!drive->blocked) - panic("ide: Resume but not suspended?\n"); - - drive->blocked = 0; - return 0; -} - /* This is just a hook for the overall driver tree. */ diff -Nru a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c --- a/drivers/ide/ide-floppy.c Mon Oct 28 16:32:37 2002 +++ b/drivers/ide/ide-floppy.c Mon Oct 28 16:32:37 2002 @@ -1238,6 +1238,21 @@ set_bit(PC_DMA_RECOMMENDED, &pc->flags); } +static int +idefloppy_blockpc_cmd(idefloppy_floppy_t *floppy, idefloppy_pc_t *pc, struct request *rq) +{ + /* + * just support eject for now, it would not be hard to make the + * REQ_BLOCK_PC support fully-featured + */ + if (rq->cmd[0] != IDEFLOPPY_START_STOP_CMD) + return 1; + + idefloppy_init_pc(pc); + memcpy(pc->c, rq->cmd, sizeof(pc->c)); + return 0; +} + /* * idefloppy_do_request is our request handling function. */ @@ -1280,6 +1295,12 @@ idefloppy_create_rw_cmd(floppy, pc, rq, block); } else if (rq->flags & REQ_SPECIAL) { pc = (idefloppy_pc_t *) rq->buffer; + } else if (rq->flags & REQ_BLOCK_PC) { + pc = idefloppy_next_pc_storage(drive); + if (idefloppy_blockpc_cmd(floppy, pc, rq)) { + idefloppy_do_end_request(drive, 0, 0); + return ide_stopped; + } } else { blk_dump_rq_flags(rq, "ide-floppy: unsupported command in queue"); diff -Nru a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c --- a/drivers/ide/ide-probe.c Mon Oct 28 16:32:37 2002 +++ b/drivers/ide/ide-probe.c Mon Oct 28 16:32:37 2002 @@ -166,6 +166,7 @@ printk("cdrom or floppy?, assuming "); if (drive->media != ide_cdrom) { printk ("FLOPPY"); + drive->removable = 1; break; } } diff -Nru a/drivers/ide/ide.c b/drivers/ide/ide.c --- a/drivers/ide/ide.c Mon Oct 28 16:32:36 2002 +++ b/drivers/ide/ide.c Mon Oct 28 16:32:36 2002 @@ -878,13 +878,12 @@ { ide_startstop_t startstop; unsigned long block; - ide_hwif_t *hwif = HWIF(drive); BUG_ON(!(rq->flags & REQ_STARTED)); #ifdef DEBUG printk("%s: start_request: current=0x%08lx\n", - hwif->name, (unsigned long) rq); + HWIF(drive)->name, (unsigned long) rq); #endif /* bail early if we've exceeded max_failures */ @@ -910,7 +909,7 @@ block = 1; /* redirect MBR access to EZ-Drive partn table */ #if (DISK_RECOVERY_TIME > 0) - while ((read_timer() - hwif->last_time) < DISK_RECOVERY_TIME); + while ((read_timer() - HWIF(drive)->last_time) < DISK_RECOVERY_TIME); #endif SELECT_DRIVE(drive); @@ -1128,9 +1127,15 @@ break; } + /* + * we know that the queue isn't empty, but this can happen + * if the q->prep_rq_fn() decides to kill a request + */ rq = elv_next_request(&drive->queue); - if (!rq) + if (!rq) { + hwgroup->busy = !!ata_pending_commands(drive); break; + } if (!rq->bio && ata_pending_commands(drive)) break; @@ -1515,10 +1520,8 @@ { unsigned long flags; ide_hwgroup_t *hwgroup = HWGROUP(drive); - unsigned int major = HWIF(drive)->major; - request_queue_t *q = &drive->queue; - struct list_head *queue_head = &q->queue_head; DECLARE_COMPLETION(wait); + int insert_end = 1, err; #ifdef CONFIG_BLK_DEV_PDC4030 if (HWIF(drive)->chipset == ide_pdc4030 && rq->buffer != NULL) @@ -1540,29 +1543,35 @@ } rq->rq_disk = drive->disk; - if (action == ide_wait) + + /* + * we need to hold an extra reference to request for safe inspection + * after completion + */ + if (action == ide_wait) { + rq->ref_count++; rq->waiting = &wait; + } + spin_lock_irqsave(&ide_lock, flags); - if (blk_queue_empty(q) || action == ide_preempt) { - if (action == ide_preempt) - hwgroup->rq = NULL; - } else { - if (action == ide_wait || action == ide_end) { - queue_head = queue_head->prev; - } else - queue_head = queue_head->next; + if (action == ide_preempt) { + hwgroup->rq = NULL; + insert_end = 0; } - q->elevator.elevator_add_req_fn(q, rq, queue_head); + __elv_add_request(&drive->queue, rq, insert_end, 0); ide_do_request(hwgroup, 0); spin_unlock_irqrestore(&ide_lock, flags); + + err = 0; if (action == ide_wait) { - /* wait for it to be serviced */ wait_for_completion(&wait); - /* return -EIO if errors */ - return rq->errors ? -EIO : 0; + if (rq->errors) + err = -EIO; + + blk_put_request(rq); } - return 0; + return err; } EXPORT_SYMBOL(ide_do_drive_cmd); @@ -3369,7 +3378,7 @@ list_del_init(&drive->list); ata_attach(drive); } - driver->gen_driver.name = driver->name; + driver->gen_driver.name = (char *) driver->name; driver->gen_driver.bus = &ide_bus_type; driver->gen_driver.remove = ide_drive_remove; return driver_register(&driver->gen_driver); diff -Nru a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c --- a/drivers/ide/pci/hpt366.c Mon Oct 28 16:32:37 2002 +++ b/drivers/ide/pci/hpt366.c Mon Oct 28 16:32:37 2002 @@ -316,7 +316,7 @@ #endif reg2 = pci_bus_clock_list(speed, - (struct chipset_bus_clock_list_entry *) dev->driver_data); + (struct chipset_bus_clock_list_entry *) pci_get_drvdata(dev)); /* * Disable on-chip PIO FIFO/buffer * (to avoid problems handling I/O errors later) @@ -369,7 +369,7 @@ list_conf = pci_bus_clock_list(speed, (struct chipset_bus_clock_list_entry *) - dev->driver_data); + pci_get_drvdata(dev)); pci_read_config_dword(dev, drive_pci, &drive_conf); list_conf = (list_conf & ~conf_mask) | (drive_conf & conf_mask); @@ -401,7 +401,7 @@ list_conf = pci_bus_clock_list(speed, (struct chipset_bus_clock_list_entry *) - dev->driver_data); + pci_get_drvdata(dev)); pci_read_config_dword(dev, drive_pci, &drive_conf); list_conf = (list_conf & ~conf_mask) | (drive_conf & conf_mask); if (speed < XFER_MW_DMA_0) @@ -841,7 +841,7 @@ * don't like to use the PLL because it will cause glitches * on PRST/SRST when the HPT state engine gets reset. */ - if (dev->driver_data) + if (pci_get_drvdata(dev)) goto init_hpt37X_done; /* @@ -923,7 +923,7 @@ break; } - if (!dev->driver_data) + if (!pci_get_drvdata(dev)) { printk(KERN_ERR "hpt366: unknown bus timing.\n"); return -EOPNOTSUPP; diff -Nru a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c --- a/drivers/ide/pci/siimage.c Mon Oct 28 16:32:36 2002 +++ b/drivers/ide/pci/siimage.c Mon Oct 28 16:32:36 2002 @@ -30,8 +30,8 @@ static char * print_siimage_get_info (char *buf, struct pci_dev *dev, int index) { char *p = buf; - u8 mmio = (dev->driver_data != NULL) ? 1 : 0; - u32 bmdma = (mmio) ? ((u32) dev->driver_data) : + u8 mmio = (pci_get_drvdata(dev) != NULL) ? 1 : 0; + u32 bmdma = (mmio) ? ((u32) pci_get_drvdata(dev)) : (pci_resource_start(dev, 4)); p += sprintf(p, "\nController: %d\n", index); @@ -769,14 +769,14 @@ if ((dev->device == PCI_DEVICE_ID_SII_3112) && (!(class_rev))) hwif->rqsize = 16; - if (dev->driver_data == NULL) + if (pci_get_drvdata(dev) == NULL) return; init_mmio_iops_siimage(hwif); } static unsigned int __init ata66_siimage (ide_hwif_t *hwif) { - if (hwif->pci_dev->driver_data == NULL) { + if (pci_get_drvdata(hwif->pci_dev) == NULL) { u8 ata66 = 0; pci_read_config_byte(hwif->pci_dev, SELREG(0), &ata66); return (ata66 & 0x01) ? 1 : 0; diff -Nru a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c --- a/drivers/ide/pci/sis5513.c Mon Oct 28 16:32:37 2002 +++ b/drivers/ide/pci/sis5513.c Mon Oct 28 16:32:37 2002 @@ -10,7 +10,7 @@ * * SiS Taiwan : for direct support and hardware. * Daniela Engert : for initial ATA100 advices and numerous others. - * John Fremlin, Manfred Spraul : + * John Fremlin, Manfred Spraul, Dave Morgan : * for checking code correctness, providing patches. * * @@ -244,6 +244,14 @@ /* * Printing configuration */ +/* Used for chipset type printing at boot time */ +static char* chipset_capability[] = { + "ATA", "ATA 16", + "ATA 33", "ATA 66", + "ATA 100", "ATA 100", + "ATA 133", "ATA 133" +}; + #if defined(DISPLAY_SIS_TIMINGS) && defined(CONFIG_PROC_FS) #include #include @@ -284,13 +292,6 @@ "11 CLK", "12 CLK", "13 CLK", "14 CLK", "15 CLK", "16 CLK" -}; - -static char* chipset_capability[] = { - "ATA", "ATA 16", - "ATA 33", "ATA 66", - "ATA 100", "ATA 100", - "ATA 133", "ATA 133" }; /* Generic add master or slave info function */ diff -Nru a/drivers/ieee1394/ieee1394_types.h b/drivers/ieee1394/ieee1394_types.h --- a/drivers/ieee1394/ieee1394_types.h Mon Oct 28 16:32:37 2002 +++ b/drivers/ieee1394/ieee1394_types.h Mon Oct 28 16:32:37 2002 @@ -7,6 +7,7 @@ #include #include #include +#include #include diff -Nru a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c --- a/drivers/ieee1394/sbp2.c Mon Oct 28 16:32:35 2002 +++ b/drivers/ieee1394/sbp2.c Mon Oct 28 16:32:35 2002 @@ -1512,7 +1512,7 @@ * physical dma in hardware). Mostly just here for debugging... */ static int sbp2_handle_physdma_write(struct hpsb_host *host, int nodeid, int destid, quadlet_t *data, - u64 addr, unsigned int length) + u64 addr, unsigned int length, u16 flags) { /* @@ -1528,7 +1528,7 @@ * physical dma in hardware). Mostly just here for debugging... */ static int sbp2_handle_physdma_read(struct hpsb_host *host, int nodeid, quadlet_t *data, - u64 addr, unsigned int length) + u64 addr, unsigned int length, u16 flags) { /* diff -Nru a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c --- a/drivers/input/joystick/iforce/iforce-usb.c Mon Oct 28 16:32:37 2002 +++ b/drivers/input/joystick/iforce/iforce-usb.c Mon Oct 28 16:32:37 2002 @@ -77,9 +77,32 @@ static void iforce_usb_irq(struct urb *urb) { struct iforce *iforce = urb->context; - if (urb->status) return; + int status; + + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", + __FUNCTION__, urb->status); + return; + default: + dbg("%s - urb has status of: %d", __FUNCTION__, urb->status); + goto exit; + } + iforce_process_packet(iforce, (iforce->data[0] << 8) | (urb->actual_length - 1), iforce->data + 1); + +exit: + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, status); } static void iforce_usb_out(struct urb *urb) diff -Nru a/drivers/isdn/Makefile b/drivers/isdn/Makefile --- a/drivers/isdn/Makefile Mon Oct 28 16:32:38 2002 +++ b/drivers/isdn/Makefile Mon Oct 28 16:32:38 2002 @@ -15,7 +15,3 @@ obj-$(CONFIG_ISDN_DRV_EICON) += eicon/ obj-$(CONFIG_HYSDN) += hysdn/ obj-$(CONFIG_ISDN_DRV_TPAM) += tpam/ - -# The global Rules.make. - -include $(TOPDIR)/Rules.make diff -Nru a/drivers/isdn/act2000/Makefile b/drivers/isdn/act2000/Makefile --- a/drivers/isdn/act2000/Makefile Mon Oct 28 16:32:37 2002 +++ b/drivers/isdn/act2000/Makefile Mon Oct 28 16:32:37 2002 @@ -7,5 +7,3 @@ # Multipart objects. act2000-objs := module.o capi.o act2000_isa.o - -include $(TOPDIR)/Rules.make diff -Nru a/drivers/isdn/capi/Makefile b/drivers/isdn/capi/Makefile --- a/drivers/isdn/capi/Makefile Mon Oct 28 16:32:36 2002 +++ b/drivers/isdn/capi/Makefile Mon Oct 28 16:32:36 2002 @@ -18,7 +18,3 @@ kernelcapi-y := kcapi.o capiutil.o capilib.o kernelcapi-$(CONFIG_PROC_FS) += kcapi_proc.o kernelcapi-objs := $(kernelcapi-y) - -# The global Rules.make. - -include $(TOPDIR)/Rules.make diff -Nru a/drivers/isdn/divert/Makefile b/drivers/isdn/divert/Makefile --- a/drivers/isdn/divert/Makefile Mon Oct 28 16:32:37 2002 +++ b/drivers/isdn/divert/Makefile Mon Oct 28 16:32:37 2002 @@ -7,10 +7,3 @@ # Multipart objects. dss1_divert-objs := isdn_divert.o divert_procfs.o divert_init.o - -include $(TOPDIR)/Rules.make - - - - - diff -Nru a/drivers/isdn/eicon/Makefile b/drivers/isdn/eicon/Makefile --- a/drivers/isdn/eicon/Makefile Mon Oct 28 16:32:36 2002 +++ b/drivers/isdn/eicon/Makefile Mon Oct 28 16:32:36 2002 @@ -23,5 +23,3 @@ linsys.o linio.o eicon-objs += $(eicon-objs-y) - -include $(TOPDIR)/Rules.make diff -Nru a/drivers/isdn/hardware/Makefile b/drivers/isdn/hardware/Makefile --- a/drivers/isdn/hardware/Makefile Mon Oct 28 16:32:36 2002 +++ b/drivers/isdn/hardware/Makefile Mon Oct 28 16:32:36 2002 @@ -4,7 +4,3 @@ obj-$(CONFIG_CAPI_AVM) += avm/ obj-$(CONFIG_CAPI_EICON) += eicon/ - -# The global Rules.make. - -include $(TOPDIR)/Rules.make diff -Nru a/drivers/isdn/hardware/avm/Makefile b/drivers/isdn/hardware/avm/Makefile --- a/drivers/isdn/hardware/avm/Makefile Mon Oct 28 16:32:36 2002 +++ b/drivers/isdn/hardware/avm/Makefile Mon Oct 28 16:32:36 2002 @@ -13,7 +13,3 @@ obj-$(CONFIG_ISDN_DRV_AVMB1_T1ISA) += t1isa.o b1.o obj-$(CONFIG_ISDN_DRV_AVMB1_T1PCI) += t1pci.o b1.o b1dma.o obj-$(CONFIG_ISDN_DRV_AVMB1_C4) += c4.o b1.o - -# The global Rules.make. - -include $(TOPDIR)/Rules.make diff -Nru a/drivers/isdn/hardware/eicon/Makefile b/drivers/isdn/hardware/eicon/Makefile --- a/drivers/isdn/hardware/eicon/Makefile Mon Oct 28 16:32:37 2002 +++ b/drivers/isdn/hardware/eicon/Makefile Mon Oct 28 16:32:37 2002 @@ -26,6 +26,3 @@ obj-$(CONFIG_ISDN_DIVAS_MAINT) += diva_mnt.o obj-$(CONFIG_ISDN_DIVAS_USERIDI) += diva_idi.o obj-$(CONFIG_ISDN_DIVAS_DIVACAPI) += divacapi.o - -include $(TOPDIR)/Rules.make - diff -Nru a/drivers/isdn/hardware/eicon/capifunc.c b/drivers/isdn/hardware/eicon/capifunc.c --- a/drivers/isdn/hardware/eicon/capifunc.c Mon Oct 28 16:32:36 2002 +++ b/drivers/isdn/hardware/eicon/capifunc.c Mon Oct 28 16:32:36 2002 @@ -173,7 +173,7 @@ } diva_os_leave_spin_lock (&ll_lock, &old_irql, "find free id"); return(num); -next_id: +next_id:; } diva_os_leave_spin_lock (&ll_lock, &old_irql, "find free id"); return(999); diff -Nru a/drivers/isdn/hisax/Makefile b/drivers/isdn/hisax/Makefile --- a/drivers/isdn/hisax/Makefile Mon Oct 28 16:32:36 2002 +++ b/drivers/isdn/hisax/Makefile Mon Oct 28 16:32:36 2002 @@ -65,5 +65,3 @@ CERT := $(shell cd $(src); md5sum -c md5sums.asc > /dev/null 2> /dev/null ;echo $$?) CFLAGS_cert.o := -DCERTIFICATION=$(CERT) - -include $(TOPDIR)/Rules.make diff -Nru a/drivers/isdn/hisax/st5481_usb.c b/drivers/isdn/hisax/st5481_usb.c --- a/drivers/isdn/hisax/st5481_usb.c Mon Oct 28 16:32:37 2002 +++ b/drivers/isdn/hisax/st5481_usb.c Mon Oct 28 16:32:37 2002 @@ -182,21 +182,28 @@ u_char irqbyte; struct st5481_adapter *adapter = urb->context; int j; + int status; - if (urb->status < 0) { - if (urb->status != -ENOENT) { - WARN("urb status %d",urb->status); - urb->actual_length = 0; - } else { - DBG(1,"urb killed"); - return; // Give up - } + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + DBG(1, "urb shutting down with status: %d", urb->status); + return; + default: + WARN("nonzero urb status received: %d", urb->status); + goto exit; } + DBG_PACKET(1, data, INT_PKT_SIZE); if (urb->actual_length == 0) { - return; + goto exit; } irqbyte = data[MPINT]; @@ -221,6 +228,11 @@ adapter->bcs[j].b_out.flow_event |= data[FFINT_B1 + j]; urb->actual_length = 0; + +exit: + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + WARN("usb_submit_urb failed with result %d", status); } /* ====================================================================== diff -Nru a/drivers/isdn/hysdn/Makefile b/drivers/isdn/hysdn/Makefile --- a/drivers/isdn/hysdn/Makefile Mon Oct 28 16:32:38 2002 +++ b/drivers/isdn/hysdn/Makefile Mon Oct 28 16:32:38 2002 @@ -14,5 +14,3 @@ hysdn-objs-$(CONFIG_HYSDN_CAPI) += hycapi.o hysdn-objs += $(hysdn-objs-y) - -include $(TOPDIR)/Rules.make diff -Nru a/drivers/isdn/i4l/Makefile b/drivers/isdn/i4l/Makefile --- a/drivers/isdn/i4l/Makefile Mon Oct 28 16:32:36 2002 +++ b/drivers/isdn/i4l/Makefile Mon Oct 28 16:32:36 2002 @@ -25,5 +25,3 @@ isdn-objs-$(CONFIG_ISDN_TTY_FAX) += isdn_ttyfax.o isdn-objs += $(isdn-objs-y) - -include $(TOPDIR)/Rules.make diff -Nru a/drivers/isdn/icn/Makefile b/drivers/isdn/icn/Makefile --- a/drivers/isdn/icn/Makefile Mon Oct 28 16:32:36 2002 +++ b/drivers/isdn/icn/Makefile Mon Oct 28 16:32:36 2002 @@ -3,5 +3,3 @@ # Each configuration option enables a list of files. obj-$(CONFIG_ISDN_DRV_ICN) += icn.o - -include $(TOPDIR)/Rules.make diff -Nru a/drivers/isdn/isdnloop/Makefile b/drivers/isdn/isdnloop/Makefile --- a/drivers/isdn/isdnloop/Makefile Mon Oct 28 16:32:35 2002 +++ b/drivers/isdn/isdnloop/Makefile Mon Oct 28 16:32:35 2002 @@ -5,6 +5,3 @@ # Each configuration option enables a list of files. obj-$(CONFIG_ISDN_DRV_LOOP) += isdnloop.o - -include $(TOPDIR)/Rules.make - diff -Nru a/drivers/isdn/pcbit/Makefile b/drivers/isdn/pcbit/Makefile --- a/drivers/isdn/pcbit/Makefile Mon Oct 28 16:32:37 2002 +++ b/drivers/isdn/pcbit/Makefile Mon Oct 28 16:32:37 2002 @@ -7,5 +7,3 @@ # Multipart objects. pcbit-objs := module.o edss1.o drv.o layer2.o capi.o callbacks.o - -include $(TOPDIR)/Rules.make diff -Nru a/drivers/isdn/sc/Makefile b/drivers/isdn/sc/Makefile --- a/drivers/isdn/sc/Makefile Mon Oct 28 16:32:36 2002 +++ b/drivers/isdn/sc/Makefile Mon Oct 28 16:32:36 2002 @@ -8,5 +8,3 @@ sc-objs := shmem.o init.o debug.o packet.o command.o event.o \ ioctl.o interrupt.o message.o timer.o - -include $(TOPDIR)/Rules.make diff -Nru a/drivers/isdn/tpam/Makefile b/drivers/isdn/tpam/Makefile --- a/drivers/isdn/tpam/Makefile Mon Oct 28 16:32:35 2002 +++ b/drivers/isdn/tpam/Makefile Mon Oct 28 16:32:35 2002 @@ -8,5 +8,3 @@ tpam-objs := tpam_main.o tpam_nco.o tpam_memory.o tpam_commands.o \ tpam_queues.o tpam_hdlc.o tpam_crcpc.o - -include $(TOPDIR)/Rules.make diff -Nru a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c --- a/drivers/macintosh/adb.c Mon Oct 28 16:32:38 2002 +++ b/drivers/macintosh/adb.c Mon Oct 28 16:32:38 2002 @@ -35,7 +35,6 @@ #include #include #include -#include #include #ifdef CONFIG_PPC #include diff -Nru a/drivers/md/Config.help b/drivers/md/Config.help --- a/drivers/md/Config.help Mon Oct 28 16:32:36 2002 +++ b/drivers/md/Config.help Mon Oct 28 16:32:36 2002 @@ -122,3 +122,15 @@ If unsure, say N. +CONFIG_BLK_DEV_DM + Device-mapper is a low level volume manager. It works by allowing + people to specify mappings for ranges of logical sectors. Various + mapping types are available, in addition people may write their own + modules containing custom mappings if they wish. + + Higher level volume managers such as LVM2 use this driver. + + If you want to compile this as a module, say M here and read + . The module will be called dm-mod.o. + + If unsure, say N. diff -Nru a/drivers/md/Config.in b/drivers/md/Config.in --- a/drivers/md/Config.in Mon Oct 28 16:32:37 2002 +++ b/drivers/md/Config.in Mon Oct 28 16:32:37 2002 @@ -14,5 +14,6 @@ dep_tristate ' Multipath I/O support' CONFIG_MD_MULTIPATH $CONFIG_BLK_DEV_MD dep_tristate ' Logical volume manager (LVM) support' CONFIG_BLK_DEV_LVM $CONFIG_MD +dep_tristate ' Device mapper support' CONFIG_BLK_DEV_DM $CONFIG_MD endmenu diff -Nru a/drivers/md/Makefile b/drivers/md/Makefile --- a/drivers/md/Makefile Mon Oct 28 16:32:35 2002 +++ b/drivers/md/Makefile Mon Oct 28 16:32:35 2002 @@ -2,8 +2,10 @@ # Makefile for the kernel software RAID and LVM drivers. # -export-objs := md.o xor.o +export-objs := md.o xor.o dm-table.o dm-target.o lvm-mod-objs := lvm.o lvm-snap.o lvm-fs.o +dm-mod-objs := dm.o dm-table.o dm-target.o dm-linear.o dm-stripe.o \ + dm-ioctl.o # Note: link order is important. All raid personalities # and xor.o must come before md.o, as they each initialise @@ -17,6 +19,7 @@ obj-$(CONFIG_MD_MULTIPATH) += multipath.o obj-$(CONFIG_BLK_DEV_MD) += md.o obj-$(CONFIG_BLK_DEV_LVM) += lvm-mod.o +obj-$(CONFIG_BLK_DEV_DM) += dm-mod.o include $(TOPDIR)/Rules.make diff -Nru a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/md/dm-ioctl.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,1129 @@ +/* + * Copyright (C) 2001, 2002 Sistina Software (UK) Limited. + * + * This file is released under the GPL. + */ + +#include "dm.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DM_DRIVER_EMAIL "dm@uk.sistina.com" + +/*----------------------------------------------------------------- + * The ioctl interface needs to be able to look up devices by + * name or uuid. + *---------------------------------------------------------------*/ +struct hash_cell { + struct list_head name_list; + struct list_head uuid_list; + + char *name; + char *uuid; + struct mapped_device *md; + + /* I hate devfs */ + devfs_handle_t devfs_entry; +}; + +#define NUM_BUCKETS 64 +#define MASK_BUCKETS (NUM_BUCKETS - 1) +static struct list_head _name_buckets[NUM_BUCKETS]; +static struct list_head _uuid_buckets[NUM_BUCKETS]; + +static devfs_handle_t _dev_dir; +void dm_hash_remove_all(void); + +/* + * Guards access to all three tables. + */ +static DECLARE_RWSEM(_hash_lock); + +static void init_buckets(struct list_head *buckets) +{ + unsigned int i; + + for (i = 0; i < NUM_BUCKETS; i++) + INIT_LIST_HEAD(buckets + i); +} + +int dm_hash_init(void) +{ + init_buckets(_name_buckets); + init_buckets(_uuid_buckets); + _dev_dir = devfs_mk_dir(0, DM_DIR, NULL); + return 0; +} + +void dm_hash_exit(void) +{ + dm_hash_remove_all(); + devfs_unregister(_dev_dir); +} + +/*----------------------------------------------------------------- + * Hash function: + * We're not really concerned with the str hash function being + * fast since it's only used by the ioctl interface. + *---------------------------------------------------------------*/ +static unsigned int hash_str(const char *str) +{ + const unsigned int hash_mult = 2654435387U; + unsigned int h = 0; + + while (*str) + h = (h + (unsigned int) *str++) * hash_mult; + + return h & MASK_BUCKETS; +} + +/*----------------------------------------------------------------- + * Code for looking up a device by name + *---------------------------------------------------------------*/ +static struct hash_cell *__get_name_cell(const char *str) +{ + struct list_head *tmp; + struct hash_cell *hc; + unsigned int h = hash_str(str); + + list_for_each (tmp, _name_buckets + h) { + hc = list_entry(tmp, struct hash_cell, name_list); + if (!strcmp(hc->name, str)) + return hc; + } + + return NULL; +} + +static struct hash_cell *__get_uuid_cell(const char *str) +{ + struct list_head *tmp; + struct hash_cell *hc; + unsigned int h = hash_str(str); + + list_for_each (tmp, _uuid_buckets + h) { + hc = list_entry(tmp, struct hash_cell, uuid_list); + if (!strcmp(hc->uuid, str)) + return hc; + } + + return NULL; +} + +/*----------------------------------------------------------------- + * Inserting, removing and renaming a device. + *---------------------------------------------------------------*/ +static inline char *kstrdup(const char *str) +{ + char *r = kmalloc(strlen(str) + 1, GFP_KERNEL); + if (r) + strcpy(r, str); + return r; +} + +static struct hash_cell *alloc_cell(const char *name, const char *uuid, + struct mapped_device *md) +{ + struct hash_cell *hc; + + hc = kmalloc(sizeof(*hc), GFP_KERNEL); + if (!hc) + return NULL; + + hc->name = kstrdup(name); + if (!hc->name) { + kfree(hc); + return NULL; + } + + if (!uuid) + hc->uuid = NULL; + + else { + hc->uuid = kstrdup(uuid); + if (!hc->uuid) { + kfree(hc->name); + kfree(hc); + return NULL; + } + } + + INIT_LIST_HEAD(&hc->name_list); + INIT_LIST_HEAD(&hc->uuid_list); + hc->md = md; + return hc; +} + +static void free_cell(struct hash_cell *hc) +{ + if (hc) { + kfree(hc->name); + kfree(hc->uuid); + kfree(hc); + } +} + +/* + * devfs stuff. + */ +static int register_with_devfs(struct hash_cell *hc) +{ + kdev_t dev = dm_kdev(hc->md); + hc->devfs_entry = + devfs_register(_dev_dir, hc->name, DEVFS_FL_CURRENT_OWNER, + major(dev), minor(dev), + S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP, + &dm_blk_dops, NULL); + + return 0; +} + +static int unregister_with_devfs(struct hash_cell *hc) +{ + devfs_unregister(hc->devfs_entry); + return 0; +} + +/* + * The kdev_t and uuid of a device can never change once it is + * initially inserted. + */ +int dm_hash_insert(const char *name, const char *uuid, struct mapped_device *md) +{ + struct hash_cell *cell; + + /* + * Allocate the new cells. + */ + cell = alloc_cell(name, uuid, md); + if (!cell) + return -ENOMEM; + + /* + * Insert the cell into all three hash tables. + */ + down_write(&_hash_lock); + if (__get_name_cell(name)) + goto bad; + + list_add(&cell->name_list, _name_buckets + hash_str(name)); + + if (uuid) { + if (__get_uuid_cell(uuid)) { + list_del(&cell->name_list); + goto bad; + } + list_add(&cell->uuid_list, _uuid_buckets + hash_str(uuid)); + } + register_with_devfs(cell); + dm_get(md); + up_write(&_hash_lock); + + return 0; + + bad: + up_write(&_hash_lock); + free_cell(cell); + return -EBUSY; +} + +void __hash_remove(struct hash_cell *hc) +{ + /* remove from the dev hash */ + list_del(&hc->uuid_list); + list_del(&hc->name_list); + unregister_with_devfs(hc); + dm_put(hc->md); +} + +void dm_hash_remove_all(void) +{ + int i; + struct hash_cell *hc; + struct list_head *tmp, *n; + + down_write(&_hash_lock); + for (i = 0; i < NUM_BUCKETS; i++) { + list_for_each_safe (tmp, n, _name_buckets + i) { + hc = list_entry(tmp, struct hash_cell, name_list); + __hash_remove(hc); + } + } + up_write(&_hash_lock); +} + +int dm_hash_rename(const char *old, const char *new) +{ + char *new_name, *old_name; + struct hash_cell *hc; + + /* + * duplicate new. + */ + new_name = kstrdup(new); + if (!new_name) + return -ENOMEM; + + down_write(&_hash_lock); + + /* + * Is new free ? + */ + hc = __get_name_cell(new); + if (hc) { + DMWARN("asked to rename to an already existing name %s -> %s", + old, new); + up_write(&_hash_lock); + return -EBUSY; + } + + /* + * Is there such a device as 'old' ? + */ + hc = __get_name_cell(old); + if (!hc) { + DMWARN("asked to rename a non existent device %s -> %s", + old, new); + up_write(&_hash_lock); + return -ENXIO; + } + + /* + * rename and move the name cell. + */ + list_del(&hc->name_list); + old_name = hc->name; + hc->name = new_name; + list_add(&hc->name_list, _name_buckets + hash_str(new_name)); + + /* rename the device node in devfs */ + unregister_with_devfs(hc); + register_with_devfs(hc); + + up_write(&_hash_lock); + kfree(old_name); + return 0; +} + + +/*----------------------------------------------------------------- + * Implementation of the ioctl commands + *---------------------------------------------------------------*/ + +/* + * All the ioctl commands get dispatched to functions with this + * prototype. + */ +typedef int (*ioctl_fn)(struct dm_ioctl *param, struct dm_ioctl *user); + +/* + * Check a string doesn't overrun the chunk of + * memory we copied from userland. + */ +static int valid_str(char *str, void *begin, void *end) +{ + while (((void *) str >= begin) && ((void *) str < end)) + if (!*str++) + return 0; + + return -EINVAL; +} + +static int next_target(struct dm_target_spec *last, uint32_t next, + void *begin, void *end, + struct dm_target_spec **spec, char **params) +{ + *spec = (struct dm_target_spec *) + ((unsigned char *) last + next); + *params = (char *) (*spec + 1); + + if (*spec < (last + 1) || ((void *) *spec > end)) + return -EINVAL; + + return valid_str(*params, begin, end); +} + +static int populate_table(struct dm_table *table, struct dm_ioctl *args) +{ + int i = 0, r, first = 1; + struct dm_target_spec *spec; + char *params; + void *begin, *end; + + if (!args->target_count) { + DMWARN("populate_table: no targets specified"); + return -EINVAL; + } + + begin = (void *) args; + end = begin + args->data_size; + + for (i = 0; i < args->target_count; i++) { + + if (first) + r = next_target((struct dm_target_spec *) args, + args->data_start, + begin, end, &spec, ¶ms); + else + r = next_target(spec, spec->next, begin, end, + &spec, ¶ms); + + if (r) { + DMWARN("unable to find target"); + return -EINVAL; + } + + r = dm_table_add_target(table, spec->target_type, + spec->sector_start, spec->length, + params); + if (r) { + DMWARN("internal error adding target to table"); + return -EINVAL; + } + + first = 0; + } + + return dm_table_complete(table); +} + +/* + * Round up the ptr to the next 'align' boundary. Obviously + * 'align' must be a power of 2. + */ +static inline void *align_ptr(void *ptr, unsigned int align) +{ + align--; + return (void *) (((unsigned long) (ptr + align)) & ~align); +} + +/* + * Copies a dm_ioctl and an optional additional payload to + * userland. + */ +static int results_to_user(struct dm_ioctl *user, struct dm_ioctl *param, + void *data, uint32_t len) +{ + int r; + void *ptr = NULL; + + if (data) { + ptr = align_ptr(user + 1, sizeof(unsigned long)); + param->data_start = ptr - (void *) user; + } + + /* + * The version number has already been filled in, so we + * just copy later fields. + */ + r = copy_to_user(&user->data_size, ¶m->data_size, + sizeof(*param) - sizeof(param->version)); + if (r) + return -EFAULT; + + if (data) { + if (param->data_start + len > param->data_size) + return -ENOSPC; + + if (copy_to_user(ptr, data, len)) + r = -EFAULT; + } + + return r; +} + +/* + * Fills in a dm_ioctl structure, ready for sending back to + * userland. + */ +static int __info(struct mapped_device *md, struct dm_ioctl *param) +{ + struct dm_table *table; + struct block_device *bdev; + + param->flags = DM_EXISTS_FLAG; + if (dm_suspended(md)) + param->flags |= DM_SUSPEND_FLAG; + + param->dev = kdev_t_to_nr(dm_kdev(md)); + bdev = bdget(param->dev); + if (!bdev) + return -ENXIO; + + if (bdev_read_only(bdev)) + param->flags |= DM_READONLY_FLAG; + + param->open_count = bdev->bd_openers; + bdput(bdev); + + table = dm_get_table(md); + param->target_count = dm_table_get_num_targets(table); + dm_table_put(table); + + return 0; +} + +/* + * Always use UUID for lookups if it's present, otherwise use name. + */ +static inline struct mapped_device *find_device(struct dm_ioctl *param) +{ + struct hash_cell *hc; + struct mapped_device *md = NULL; + + down_read(&_hash_lock); + hc = *param->uuid ? __get_uuid_cell(param->uuid) : + __get_name_cell(param->name); + if (hc) { + md = hc->md; + + /* + * Sneakily write in both the name and the uuid + * while we have the cell. + */ + strncpy(param->name, hc->name, sizeof(param->name)); + if (hc->uuid) + strncpy(param->uuid, hc->uuid, sizeof(param->uuid) - 1); + else + param->uuid[0] = '\0'; + + dm_get(md); + } + up_read(&_hash_lock); + + return md; +} + +#define ALIGNMENT sizeof(int) +static void *_align(void *ptr, unsigned int a) +{ + register unsigned long align = --a; + + return (void *) (((unsigned long) ptr + align) & ~align); +} + +/* + * Copies device info back to user space, used by + * the create and info ioctls. + */ +static int info(struct dm_ioctl *param, struct dm_ioctl *user) +{ + struct mapped_device *md; + + param->flags = 0; + + md = find_device(param); + if (!md) + /* + * Device not found - returns cleared exists flag. + */ + goto out; + + __info(md, param); + dm_put(md); + + out: + return results_to_user(user, param, NULL, 0); +} + +static inline int get_mode(struct dm_ioctl *param) +{ + int mode = FMODE_READ | FMODE_WRITE; + + if (param->flags & DM_READONLY_FLAG) + mode = FMODE_READ; + + return mode; +} + +static int check_name(const char *name) +{ + if (strchr(name, '/')) { + DMWARN("invalid device name"); + return -EINVAL; + } + + return 0; +} + +static int create(struct dm_ioctl *param, struct dm_ioctl *user) +{ + int r; + struct dm_table *t; + struct mapped_device *md; + int minor; + + r = check_name(param->name); + if (r) + return r; + + r = dm_table_create(&t, get_mode(param)); + if (r) + return r; + + r = populate_table(t, param); + if (r) { + dm_table_put(t); + return r; + } + + minor = (param->flags & DM_PERSISTENT_DEV_FLAG) ? + minor(to_kdev_t(param->dev)) : -1; + + r = dm_create(minor, t, &md); + if (r) { + dm_table_put(t); + return r; + } + dm_table_put(t); /* md will have grabbed its own reference */ + + set_device_ro(dm_kdev(md), (param->flags & DM_READONLY_FLAG)); + r = dm_hash_insert(param->name, *param->uuid ? param->uuid : NULL, md); + dm_put(md); + + return r ? r : info(param, user); +} + +/* + * Build up the status struct for each target + */ +static int __status(struct mapped_device *md, struct dm_ioctl *param, + char *outbuf, int *len) +{ + int i, num_targets; + struct dm_target_spec *spec; + char *outptr; + status_type_t type; + struct dm_table *table = dm_get_table(md); + + if (param->flags & DM_STATUS_TABLE_FLAG) + type = STATUSTYPE_TABLE; + else + type = STATUSTYPE_INFO; + + outptr = outbuf; + + /* Get all the target info */ + num_targets = dm_table_get_num_targets(table); + for (i = 0; i < num_targets; i++) { + struct dm_target *ti = dm_table_get_target(table, i); + + if (outptr - outbuf + + sizeof(struct dm_target_spec) > param->data_size) { + dm_table_put(table); + return -ENOMEM; + } + + spec = (struct dm_target_spec *) outptr; + + spec->status = 0; + spec->sector_start = ti->begin; + spec->length = ti->len; + strncpy(spec->target_type, ti->type->name, + sizeof(spec->target_type)); + + outptr += sizeof(struct dm_target_spec); + + /* Get the status/table string from the target driver */ + if (ti->type->status) + ti->type->status(ti, type, outptr, + outbuf + param->data_size - outptr); + else + outptr[0] = '\0'; + + outptr += strlen(outptr) + 1; + _align(outptr, ALIGNMENT); + spec->next = outptr - outbuf; + } + + param->target_count = num_targets; + *len = outptr - outbuf; + dm_table_put(table); + + return 0; +} + +/* + * Return the status of a device as a text string for each + * target. + */ +static int get_status(struct dm_ioctl *param, struct dm_ioctl *user) +{ + struct mapped_device *md; + int len = 0; + int ret; + char *outbuf = NULL; + + md = find_device(param); + if (!md) + /* + * Device not found - returns cleared exists flag. + */ + goto out; + + /* We haven't a clue how long the resultant data will be so + just allocate as much as userland has allowed us and make sure + we don't overun it */ + outbuf = kmalloc(param->data_size, GFP_KERNEL); + if (!outbuf) + goto out; + /* + * Get the status of all targets + */ + __status(md, param, outbuf, &len); + + /* + * Setup the basic dm_ioctl structure. + */ + __info(md, param); + + out: + if (md) + dm_put(md); + + ret = results_to_user(user, param, outbuf, len); + + if (outbuf) + kfree(outbuf); + + return ret; +} + +/* + * Wait for a device to report an event + */ +static int wait_device_event(struct dm_ioctl *param, struct dm_ioctl *user) +{ + struct mapped_device *md; + struct dm_table *table; + DECLARE_WAITQUEUE(wq, current); + + md = find_device(param); + if (!md) + /* + * Device not found - returns cleared exists flag. + */ + goto out; + + /* + * Setup the basic dm_ioctl structure. + */ + __info(md, param); + + /* + * Wait for a notification event + */ + set_current_state(TASK_INTERRUPTIBLE); + table = dm_get_table(md); + dm_table_add_wait_queue(table, &wq); + dm_table_put(table); + dm_put(md); + + yield(); + set_current_state(TASK_RUNNING); + + out: + return results_to_user(user, param, NULL, 0); +} + +/* + * Retrieves a list of devices used by a particular dm device. + */ +static int dep(struct dm_ioctl *param, struct dm_ioctl *user) +{ + int count, r; + struct mapped_device *md; + struct list_head *tmp; + size_t len = 0; + struct dm_target_deps *deps = NULL; + struct dm_table *table; + + md = find_device(param); + if (!md) + goto out; + table = dm_get_table(md); + + /* + * Setup the basic dm_ioctl structure. + */ + __info(md, param); + + /* + * Count the devices. + */ + count = 0; + list_for_each(tmp, dm_table_get_devices(table)) + count++; + + /* + * Allocate a kernel space version of the dm_target_status + * struct. + */ + if (array_too_big(sizeof(*deps), sizeof(*deps->dev), count)) { + dm_table_put(table); + dm_put(md); + return -ENOMEM; + } + + len = sizeof(*deps) + (sizeof(*deps->dev) * count); + deps = kmalloc(len, GFP_KERNEL); + if (!deps) { + dm_table_put(table); + dm_put(md); + return -ENOMEM; + } + + /* + * Fill in the devices. + */ + deps->count = count; + count = 0; + list_for_each(tmp, dm_table_get_devices(table)) { + struct dm_dev *dd = list_entry(tmp, struct dm_dev, list); + deps->dev[count++] = dd->bdev->bd_dev; + } + dm_table_put(table); + dm_put(md); + + out: + r = results_to_user(user, param, deps, len); + + kfree(deps); + return r; +} + +static int remove(struct dm_ioctl *param, struct dm_ioctl *user) +{ + struct hash_cell *hc; + + down_write(&_hash_lock); + hc = *param->uuid ? __get_uuid_cell(param->uuid) : + __get_name_cell(param->name); + if (!hc) { + DMWARN("device doesn't appear to be in the dev hash table."); + up_write(&_hash_lock); + return -EINVAL; + } + + __hash_remove(hc); + up_write(&_hash_lock); + return 0; +} + +static int remove_all(struct dm_ioctl *param, struct dm_ioctl *user) +{ + dm_hash_remove_all(); + return 0; +} + +static int suspend(struct dm_ioctl *param, struct dm_ioctl *user) +{ + int r; + struct mapped_device *md; + + md = find_device(param); + if (!md) + return -ENXIO; + + if (param->flags & DM_SUSPEND_FLAG) + r = dm_suspend(md); + else + r = dm_resume(md); + + dm_put(md); + return r; +} + +static int reload(struct dm_ioctl *param, struct dm_ioctl *user) +{ + int r; + struct mapped_device *md; + struct dm_table *t; + + r = dm_table_create(&t, get_mode(param)); + if (r) + return r; + + r = populate_table(t, param); + if (r) { + dm_table_put(t); + return r; + } + + md = find_device(param); + if (!md) { + dm_table_put(t); + return -ENXIO; + } + + r = dm_swap_table(md, t); + if (r) { + dm_put(md); + dm_table_put(t); + return r; + } + + set_device_ro(dm_kdev(md), (param->flags & DM_READONLY_FLAG)); + dm_put(md); + + r = info(param, user); + return r; +} + +static int rename(struct dm_ioctl *param, struct dm_ioctl *user) +{ + int r; + char *new_name = (char *) param + param->data_start; + + if (valid_str(new_name, (void *) param, + (void *) param + param->data_size)) { + DMWARN("Invalid new logical volume name supplied."); + return -EINVAL; + } + + r = check_name(new_name); + if (r) + return r; + + return dm_hash_rename(param->name, new_name); +} + + +/*----------------------------------------------------------------- + * Implementation of open/close/ioctl on the special char + * device. + *---------------------------------------------------------------*/ +static ioctl_fn lookup_ioctl(unsigned int cmd) +{ + static struct { + int cmd; + ioctl_fn fn; + } _ioctls[] = { + {DM_VERSION_CMD, NULL}, /* version is dealt with elsewhere */ + {DM_REMOVE_ALL_CMD, remove_all}, + {DM_DEV_CREATE_CMD, create}, + {DM_DEV_REMOVE_CMD, remove}, + {DM_DEV_RELOAD_CMD, reload}, + {DM_DEV_RENAME_CMD, rename}, + {DM_DEV_SUSPEND_CMD, suspend}, + {DM_DEV_DEPS_CMD, dep}, + {DM_DEV_STATUS_CMD, info}, + {DM_TARGET_STATUS_CMD, get_status}, + {DM_TARGET_WAIT_CMD, wait_device_event}, + }; + + return (cmd >= ARRAY_SIZE(_ioctls)) ? NULL : _ioctls[cmd].fn; +} + +/* + * As well as checking the version compatibility this always + * copies the kernel interface version out. + */ +static int check_version(int cmd, struct dm_ioctl *user) +{ + uint32_t version[3]; + int r = 0; + + if (copy_from_user(version, user->version, sizeof(version))) + return -EFAULT; + + if ((DM_VERSION_MAJOR != version[0]) || + (DM_VERSION_MINOR < version[1])) { + DMWARN("ioctl interface mismatch: " + "kernel(%u.%u.%u), user(%u.%u.%u), cmd(%d)", + DM_VERSION_MAJOR, DM_VERSION_MINOR, + DM_VERSION_PATCHLEVEL, + version[0], version[1], version[2], cmd); + r = -EINVAL; + } + + /* + * Fill in the kernel version. + */ + version[0] = DM_VERSION_MAJOR; + version[1] = DM_VERSION_MINOR; + version[2] = DM_VERSION_PATCHLEVEL; + if (copy_to_user(user->version, version, sizeof(version))) + return -EFAULT; + + return r; +} + +static void free_params(struct dm_ioctl *param) +{ + vfree(param); +} + +static int copy_params(struct dm_ioctl *user, struct dm_ioctl **param) +{ + struct dm_ioctl tmp, *dmi; + + if (copy_from_user(&tmp, user, sizeof(tmp))) + return -EFAULT; + + if (tmp.data_size < sizeof(tmp)) + return -EINVAL; + + dmi = (struct dm_ioctl *) vmalloc(tmp.data_size); + if (!dmi) + return -ENOMEM; + + if (copy_from_user(dmi, user, tmp.data_size)) { + vfree(dmi); + return -EFAULT; + } + + *param = dmi; + return 0; +} + +static int validate_params(uint cmd, struct dm_ioctl *param) +{ + /* Unless creating, either name of uuid but not both */ + if (cmd != DM_DEV_CREATE_CMD) { + if ((!*param->uuid && !*param->name) || + (*param->uuid && *param->name)) { + DMWARN("one of name or uuid must be supplied"); + return -EINVAL; + } + } + + /* Ensure strings are terminated */ + param->name[DM_NAME_LEN - 1] = '\0'; + param->uuid[DM_UUID_LEN - 1] = '\0'; + + return 0; +} + +static int ctl_ioctl(struct inode *inode, struct file *file, + uint command, ulong u) +{ + int r = 0, cmd; + struct dm_ioctl *param; + struct dm_ioctl *user = (struct dm_ioctl *) u; + ioctl_fn fn = NULL; + + /* only root can play with this */ + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + + if (_IOC_TYPE(command) != DM_IOCTL) + return -ENOTTY; + + cmd = _IOC_NR(command); + + /* + * Check the interface version passed in. This also + * writes out the kernels interface version. + */ + r = check_version(cmd, user); + if (r) + return r; + + /* + * Nothing more to do for the version command. + */ + if (cmd == DM_VERSION_CMD) + return 0; + + fn = lookup_ioctl(cmd); + if (!fn) { + DMWARN("dm_ctl_ioctl: unknown command 0x%x", command); + return -ENOTTY; + } + + /* + * Copy the parameters into kernel space. + */ + r = copy_params(user, ¶m); + if (r) + return r; + + r = validate_params(cmd, param); + if (r) { + free_params(param); + return r; + } + + r = fn(param, user); + free_params(param); + return r; +} + +static struct file_operations _ctl_fops = { + .ioctl = ctl_ioctl, + .owner = THIS_MODULE, +}; + +static devfs_handle_t _ctl_handle; + +static struct miscdevice _dm_misc = { + .minor = MISC_DYNAMIC_MINOR, + .name = DM_NAME, + .fops = &_ctl_fops +}; + +/* + * Create misc character device and link to DM_DIR/control. + */ +int __init dm_interface_init(void) +{ + int r; + char rname[64]; + + r = dm_hash_init(); + if (r) + return r; + + r = misc_register(&_dm_misc); + if (r) { + DMERR("misc_register failed for control device"); + dm_hash_exit(); + return r; + } + + r = devfs_generate_path(_dm_misc.devfs_handle, rname + 3, + sizeof rname - 3); + if (r == -ENOSYS) + return 0; /* devfs not present */ + + if (r < 0) { + DMERR("devfs_generate_path failed for control device"); + goto failed; + } + + strncpy(rname + r, "../", 3); + r = devfs_mk_symlink(NULL, DM_DIR "/control", + DEVFS_FL_DEFAULT, rname + r, &_ctl_handle, NULL); + if (r) { + DMERR("devfs_mk_symlink failed for control device"); + goto failed; + } + devfs_auto_unregister(_dm_misc.devfs_handle, _ctl_handle); + + DMINFO("%d.%d.%d%s initialised: %s", DM_VERSION_MAJOR, + DM_VERSION_MINOR, DM_VERSION_PATCHLEVEL, DM_VERSION_EXTRA, + DM_DRIVER_EMAIL); + return 0; + + failed: + dm_hash_exit(); + misc_deregister(&_dm_misc); + return r; +} + +void dm_interface_exit(void) +{ + dm_hash_exit(); + + if (misc_deregister(&_dm_misc) < 0) + DMERR("misc_deregister failed for control device"); +} diff -Nru a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/md/dm-linear.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2001 Sistina Software (UK) Limited. + * + * This file is released under the GPL. + */ + +#include "dm.h" + +#include +#include +#include +#include +#include + +/* + * Linear: maps a linear range of a device. + */ +struct linear_c { + struct dm_dev *dev; + sector_t start; +}; + +/* + * Construct a linear mapping: + */ +static int linear_ctr(struct dm_target *ti, int argc, char **argv) +{ + struct linear_c *lc; + + if (argc != 2) { + ti->error = "dm-linear: Not enough arguments"; + return -EINVAL; + } + + lc = kmalloc(sizeof(*lc), GFP_KERNEL); + if (lc == NULL) { + ti->error = "dm-linear: Cannot allocate linear context"; + return -ENOMEM; + } + + if (sscanf(argv[1], SECTOR_FORMAT, &lc->start) != 1) { + ti->error = "dm-linear: Invalid device sector"; + goto bad; + } + + if (dm_get_device(ti, argv[0], ti->begin, ti->len, + dm_table_get_mode(ti->table), &lc->dev)) { + ti->error = "dm-linear: Device lookup failed"; + goto bad; + } + + ti->private = lc; + return 0; + + bad: + kfree(lc); + return -EINVAL; +} + +static void linear_dtr(struct dm_target *ti) +{ + struct linear_c *lc = (struct linear_c *) ti->private; + + dm_put_device(ti, lc->dev); + kfree(lc); +} + +static int linear_map(struct dm_target *ti, struct bio *bio) +{ + struct linear_c *lc = (struct linear_c *) ti->private; + + bio->bi_bdev = lc->dev->bdev; + bio->bi_sector = lc->start + (bio->bi_sector - ti->begin); + + return 1; +} + +static int linear_status(struct dm_target *ti, status_type_t type, + char *result, int maxlen) +{ + struct linear_c *lc = (struct linear_c *) ti->private; + + switch (type) { + case STATUSTYPE_INFO: + result[0] = '\0'; + break; + + case STATUSTYPE_TABLE: + snprintf(result, maxlen, "%s " SECTOR_FORMAT, + kdevname(to_kdev_t(lc->dev->bdev->bd_dev)), lc->start); + break; + } + return 0; +} + +static struct target_type linear_target = { + .name = "linear", + .module = THIS_MODULE, + .ctr = linear_ctr, + .dtr = linear_dtr, + .map = linear_map, + .status = linear_status, +}; + +int __init dm_linear_init(void) +{ + int r = dm_register_target(&linear_target); + + if (r < 0) + DMERR("linear: register failed %d", r); + + return r; +} + +void dm_linear_exit(void) +{ + int r = dm_unregister_target(&linear_target); + + if (r < 0) + DMERR("linear: unregister failed %d", r); +} diff -Nru a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/md/dm-stripe.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2001 Sistina Software (UK) Limited. + * + * This file is released under the GPL. + */ + +#include "dm.h" + +#include +#include +#include +#include +#include + +struct stripe { + struct dm_dev *dev; + sector_t physical_start; +}; + +struct stripe_c { + uint32_t stripes; + + /* The size of this target / num. stripes */ + uint32_t stripe_width; + + /* stripe chunk size */ + uint32_t chunk_shift; + sector_t chunk_mask; + + struct stripe stripe[0]; +}; + +static inline struct stripe_c *alloc_context(int stripes) +{ + size_t len; + + if (array_too_big(sizeof(struct stripe_c), sizeof(struct stripe), + stripes)) + return NULL; + + len = sizeof(struct stripe_c) + (sizeof(struct stripe) * stripes); + + return kmalloc(len, GFP_KERNEL); +} + +/* + * Parse a single pair + */ +static int get_stripe(struct dm_target *ti, struct stripe_c *sc, + int stripe, char **argv) +{ + sector_t start; + + if (sscanf(argv[1], SECTOR_FORMAT, &start) != 1) + return -EINVAL; + + if (dm_get_device(ti, argv[0], start, sc->stripe_width, + dm_table_get_mode(ti->table), + &sc->stripe[stripe].dev)) + return -ENXIO; + + sc->stripe[stripe].physical_start = start; + return 0; +} + +/* + * FIXME: Nasty function, only present because we can't link + * against __moddi3 and __divdi3. + * + * returns a == b * n + */ +static int multiple(sector_t a, sector_t b, sector_t *n) +{ + sector_t acc, prev, i; + + *n = 0; + while (a >= b) { + for (acc = b, prev = 0, i = 1; + acc <= a; + prev = acc, acc <<= 1, i <<= 1) + ; + + a -= prev; + *n += i >> 1; + } + + return a == 0; +} + +/* + * Construct a striped mapping. + * [ ]+ + */ +static int stripe_ctr(struct dm_target *ti, int argc, char **argv) +{ + struct stripe_c *sc; + sector_t width; + uint32_t stripes; + uint32_t chunk_size; + char *end; + int r, i; + + if (argc < 2) { + ti->error = "dm-stripe: Not enough arguments"; + return -EINVAL; + } + + stripes = simple_strtoul(argv[0], &end, 10); + if (*end) { + ti->error = "dm-stripe: Invalid stripe count"; + return -EINVAL; + } + + chunk_size = simple_strtoul(argv[1], &end, 10); + if (*end) { + ti->error = "dm-stripe: Invalid chunk_size"; + return -EINVAL; + } + + if (!multiple(ti->len, stripes, &width)) { + ti->error = "dm-stripe: Target length not divisable by " + "number of stripes"; + return -EINVAL; + } + + sc = alloc_context(stripes); + if (!sc) { + ti->error = "dm-stripe: Memory allocation for striped context " + "failed"; + return -ENOMEM; + } + + sc->stripes = stripes; + sc->stripe_width = width; + ti->split_io = chunk_size; + + /* + * chunk_size is a power of two + */ + if (!chunk_size || (chunk_size & (chunk_size - 1))) { + ti->error = "dm-stripe: Invalid chunk size"; + kfree(sc); + return -EINVAL; + } + + sc->chunk_mask = ((sector_t) chunk_size) - 1; + for (sc->chunk_shift = 0; chunk_size; sc->chunk_shift++) + chunk_size >>= 1; + sc->chunk_shift--; + + /* + * Get the stripe destinations. + */ + for (i = 0; i < stripes; i++) { + if (argc < 2) { + ti->error = "dm-stripe: Not enough destinations " + "specified"; + kfree(sc); + return -EINVAL; + } + + argv += 2; + + r = get_stripe(ti, sc, i, argv); + if (r < 0) { + ti->error = "dm-stripe: Couldn't parse stripe " + "destination"; + while (i--) + dm_put_device(ti, sc->stripe[i].dev); + kfree(sc); + return r; + } + } + + ti->private = sc; + return 0; +} + +static void stripe_dtr(struct dm_target *ti) +{ + unsigned int i; + struct stripe_c *sc = (struct stripe_c *) ti->private; + + for (i = 0; i < sc->stripes; i++) + dm_put_device(ti, sc->stripe[i].dev); + + kfree(sc); +} + +static int stripe_map(struct dm_target *ti, struct bio *bio) +{ + struct stripe_c *sc = (struct stripe_c *) ti->private; + + sector_t offset = bio->bi_sector - ti->begin; + uint32_t chunk = (uint32_t) (offset >> sc->chunk_shift); + uint32_t stripe = chunk % sc->stripes; /* 32bit modulus */ + chunk = chunk / sc->stripes; + + bio->bi_bdev = sc->stripe[stripe].dev->bdev; + bio->bi_sector = sc->stripe[stripe].physical_start + + (chunk << sc->chunk_shift) + (offset & sc->chunk_mask); + return 1; +} + +static int stripe_status(struct dm_target *ti, + status_type_t type, char *result, int maxlen) +{ + struct stripe_c *sc = (struct stripe_c *) ti->private; + int offset; + int i; + + switch (type) { + case STATUSTYPE_INFO: + result[0] = '\0'; + break; + + case STATUSTYPE_TABLE: + offset = snprintf(result, maxlen, "%d " SECTOR_FORMAT, + sc->stripes, sc->chunk_mask + 1); + for (i = 0; i < sc->stripes; i++) { + offset += + snprintf(result + offset, maxlen - offset, + " %s " SECTOR_FORMAT, + kdevname(to_kdev_t(sc->stripe[i].dev->bdev->bd_dev)), + sc->stripe[i].physical_start); + } + break; + } + return 0; +} + +static struct target_type stripe_target = { + .name = "striped", + .module = THIS_MODULE, + .ctr = stripe_ctr, + .dtr = stripe_dtr, + .map = stripe_map, + .status = stripe_status, +}; + +int __init dm_stripe_init(void) +{ + int r; + + r = dm_register_target(&stripe_target); + if (r < 0) + DMWARN("striped target registration failed"); + + return r; +} + +void dm_stripe_exit(void) +{ + if (dm_unregister_target(&stripe_target)) + DMWARN("striped target unregistration failed"); + + return; +} diff -Nru a/drivers/md/dm-table.c b/drivers/md/dm-table.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/md/dm-table.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,736 @@ +/* + * Copyright (C) 2001 Sistina Software (UK) Limited. + * + * This file is released under the GPL. + */ + +#include "dm.h" + +#include +#include +#include +#include +#include +#include +#include + +#define MAX_DEPTH 16 +#define NODE_SIZE L1_CACHE_BYTES +#define KEYS_PER_NODE (NODE_SIZE / sizeof(sector_t)) +#define CHILDREN_PER_NODE (KEYS_PER_NODE + 1) + +struct dm_table { + atomic_t holders; + + /* btree table */ + int depth; + int counts[MAX_DEPTH]; /* in nodes */ + sector_t *index[MAX_DEPTH]; + + int num_targets; + int num_allocated; + sector_t *highs; + struct dm_target *targets; + + /* + * Indicates the rw permissions for the new logical + * device. This should be a combination of FMODE_READ + * and FMODE_WRITE. + */ + int mode; + + /* a list of devices used by this table */ + struct list_head devices; + + /* + * These are optimistic limits taken from all the + * targets, some targets will need smaller limits. + */ + struct io_restrictions limits; + + /* + * A waitqueue for processes waiting for something + * interesting to happen to this table. + */ + wait_queue_head_t eventq; +}; + +/* + * Ceiling(n / size) + */ +static inline unsigned long div_up(unsigned long n, unsigned long size) +{ + return dm_round_up(n, size) / size; +} + +/* + * Similar to ceiling(log_size(n)) + */ +static unsigned int int_log(unsigned long n, unsigned long base) +{ + int result = 0; + + while (n > 1) { + n = div_up(n, base); + result++; + } + + return result; +} + +#define __HIGH(l, r) if (*(l) < (r)) *(l) = (r) +#define __LOW(l, r) if (*(l) < (r)) *(l) = (r) + +/* + * Combine two io_restrictions, always taking the lower value. + */ + +static void combine_restrictions_low(struct io_restrictions *lhs, + struct io_restrictions *rhs) +{ + __LOW(&lhs->max_sectors, rhs->max_sectors); + __LOW(&lhs->max_phys_segments, rhs->max_phys_segments); + __LOW(&lhs->max_hw_segments, rhs->max_hw_segments); + __HIGH(&lhs->hardsect_size, rhs->hardsect_size); + __LOW(&lhs->max_segment_size, rhs->max_segment_size); + __LOW(&lhs->seg_boundary_mask, rhs->seg_boundary_mask); +} + +/* + * Calculate the index of the child node of the n'th node k'th key. + */ +static inline int get_child(int n, int k) +{ + return (n * CHILDREN_PER_NODE) + k; +} + +/* + * Return the n'th node of level l from table t. + */ +static inline sector_t *get_node(struct dm_table *t, int l, int n) +{ + return t->index[l] + (n * KEYS_PER_NODE); +} + +/* + * Return the highest key that you could lookup from the n'th + * node on level l of the btree. + */ +static sector_t high(struct dm_table *t, int l, int n) +{ + for (; l < t->depth - 1; l++) + n = get_child(n, CHILDREN_PER_NODE - 1); + + if (n >= t->counts[l]) + return (sector_t) - 1; + + return get_node(t, l, n)[KEYS_PER_NODE - 1]; +} + +/* + * Fills in a level of the btree based on the highs of the level + * below it. + */ +static int setup_btree_index(int l, struct dm_table *t) +{ + int n, k; + sector_t *node; + + for (n = 0; n < t->counts[l]; n++) { + node = get_node(t, l, n); + + for (k = 0; k < KEYS_PER_NODE; k++) + node[k] = high(t, l + 1, get_child(n, k)); + } + + return 0; +} + +/* + * highs, and targets are managed as dynamic arrays during a + * table load. + */ +static int alloc_targets(struct dm_table *t, int num) +{ + sector_t *n_highs; + struct dm_target *n_targets; + int n = t->num_targets; + + /* + * Allocate both the target array and offset array at once. + */ + n_highs = (sector_t *) vcalloc(sizeof(struct dm_target) + + sizeof(sector_t), + num); + if (!n_highs) + return -ENOMEM; + + n_targets = (struct dm_target *) (n_highs + num); + + if (n) { + memcpy(n_highs, t->highs, sizeof(*n_highs) * n); + memcpy(n_targets, t->targets, sizeof(*n_targets) * n); + } + + memset(n_highs + n, -1, sizeof(*n_highs) * (num - n)); + vfree(t->highs); + + t->num_allocated = num; + t->highs = n_highs; + t->targets = n_targets; + + return 0; +} + +int dm_table_create(struct dm_table **result, int mode) +{ + struct dm_table *t = kmalloc(sizeof(*t), GFP_NOIO); + + if (!t) + return -ENOMEM; + + memset(t, 0, sizeof(*t)); + INIT_LIST_HEAD(&t->devices); + atomic_set(&t->holders, 1); + + /* allocate a single nodes worth of targets to begin with */ + if (alloc_targets(t, KEYS_PER_NODE)) { + kfree(t); + t = NULL; + return -ENOMEM; + } + + init_waitqueue_head(&t->eventq); + t->mode = mode; + *result = t; + return 0; +} + +static void free_devices(struct list_head *devices) +{ + struct list_head *tmp, *next; + + for (tmp = devices->next; tmp != devices; tmp = next) { + struct dm_dev *dd = list_entry(tmp, struct dm_dev, list); + next = tmp->next; + kfree(dd); + } +} + +void table_destroy(struct dm_table *t) +{ + int i; + + DMWARN("destroying table"); + + /* destroying the table counts as an event */ + dm_table_event(t); + + /* free the indexes (see dm_table_complete) */ + if (t->depth >= 2) + vfree(t->index[t->depth - 2]); + + /* free the targets */ + for (i = 0; i < t->num_targets; i++) { + struct dm_target *tgt = &t->targets[i]; + + dm_put_target_type(t->targets[i].type); + + if (tgt->type->dtr) + tgt->type->dtr(tgt); + } + + vfree(t->highs); + + /* free the device list */ + if (t->devices.next != &t->devices) { + DMWARN("devices still present during destroy: " + "dm_table_remove_device calls missing"); + + free_devices(&t->devices); + } + + kfree(t); +} + +void dm_table_get(struct dm_table *t) +{ + atomic_inc(&t->holders); +} + +void dm_table_put(struct dm_table *t) +{ + if (atomic_dec_and_test(&t->holders)) + table_destroy(t); +} + +/* + * Checks to see if we need to extend highs or targets. + */ +static inline int check_space(struct dm_table *t) +{ + if (t->num_targets >= t->num_allocated) + return alloc_targets(t, t->num_allocated * 2); + + return 0; +} + +/* + * Convert a device path to a dev_t. + */ +static int lookup_device(const char *path, dev_t *dev) +{ + int r; + struct nameidata nd; + struct inode *inode; + + if ((r = path_lookup(path, LOOKUP_FOLLOW, &nd))) + return r; + + inode = nd.dentry->d_inode; + if (!inode) { + r = -ENOENT; + goto out; + } + + if (!S_ISBLK(inode->i_mode)) { + r = -EINVAL; + goto out; + } + + *dev = kdev_t_to_nr(inode->i_rdev); + + out: + path_release(&nd); + return r; +} + +/* + * See if we've already got a device in the list. + */ +static struct dm_dev *find_device(struct list_head *l, dev_t dev) +{ + struct list_head *tmp; + + list_for_each(tmp, l) { + struct dm_dev *dd = list_entry(tmp, struct dm_dev, list); + if (dd->bdev->bd_dev == dev) + return dd; + } + + return NULL; +} + +/* + * Open a device so we can use it as a map destination. + */ +static int open_dev(struct dm_dev *d, dev_t dev) +{ + static char *_claim_ptr = "I belong to device-mapper"; + + int r; + + if (d->bdev) + BUG(); + + d->bdev = bdget(dev); + if (!d->bdev) + return -ENOMEM; + + r = blkdev_get(d->bdev, d->mode, 0, BDEV_RAW); + if (!r) + return r; + + r = bd_claim(d->bdev, _claim_ptr); + if (r) { + blkdev_put(d->bdev, BDEV_RAW); + d->bdev = NULL; + } + + return r; +} + +/* + * Close a device that we've been using. + */ +static void close_dev(struct dm_dev *d) +{ + if (!d->bdev) + return; + + bd_release(d->bdev); + blkdev_put(d->bdev, BDEV_RAW); + d->bdev = NULL; +} + +/* + * If possible (ie. blk_size[major] is set), this checks an area + * of a destination device is valid. + */ +static int check_device_area(struct dm_dev *dd, sector_t start, sector_t len) +{ + sector_t dev_size; + dev_size = dd->bdev->bd_inode->i_size; + return ((start < dev_size) && (len <= (dev_size - start))); +} + +/* + * This upgrades the mode on an already open dm_dev. Being + * careful to leave things as they were if we fail to reopen the + * device. + */ +static int upgrade_mode(struct dm_dev *dd, int new_mode) +{ + int r; + struct dm_dev dd_copy; + dev_t dev = dd->bdev->bd_dev; + + memcpy(&dd_copy, dd, sizeof(dd_copy)); + + dd->mode |= new_mode; + dd->bdev = NULL; + r = open_dev(dd, dev); + if (!r) + close_dev(&dd_copy); + else + memcpy(dd, &dd_copy, sizeof(dd_copy)); + + return r; +} + +/* + * Add a device to the list, or just increment the usage count if + * it's already present. + */ +static int __table_get_device(struct dm_table *t, struct dm_target *ti, + const char *path, sector_t start, sector_t len, + int mode, struct dm_dev **result) +{ + int r; + dev_t dev; + struct dm_dev *dd; + int major, minor; + + if (!t) + BUG(); + + if (sscanf(path, "%x:%x", &major, &minor) == 2) { + /* Extract the major/minor numbers */ + dev = MKDEV(major, minor); + } else { + /* convert the path to a device */ + if ((r = lookup_device(path, &dev))) + return r; + } + + dd = find_device(&t->devices, dev); + if (!dd) { + dd = kmalloc(sizeof(*dd), GFP_KERNEL); + if (!dd) + return -ENOMEM; + + dd->mode = mode; + dd->bdev = NULL; + + if ((r = open_dev(dd, dev))) { + kfree(dd); + return r; + } + + atomic_set(&dd->count, 0); + list_add(&dd->list, &t->devices); + + } else if (dd->mode != (mode | dd->mode)) { + r = upgrade_mode(dd, mode); + if (r) + return r; + } + atomic_inc(&dd->count); + + if (!check_device_area(dd, start, len)) { + DMWARN("device %s too small for target", path); + dm_put_device(ti, dd); + return -EINVAL; + } + + *result = dd; + + return 0; +} + + +int dm_get_device(struct dm_target *ti, const char *path, sector_t start, + sector_t len, int mode, struct dm_dev **result) +{ + int r = __table_get_device(ti->table, ti, path, + start, len, mode, result); + if (!r) { + request_queue_t *q = bdev_get_queue((*result)->bdev); + struct io_restrictions *rs = &ti->limits; + + /* combine the device limits low */ + __LOW(&rs->max_sectors, q->max_sectors); + __LOW(&rs->max_phys_segments, q->max_phys_segments); + __LOW(&rs->max_hw_segments, q->max_hw_segments); + __HIGH(&rs->hardsect_size, q->hardsect_size); + __LOW(&rs->max_segment_size, q->max_segment_size); + __LOW(&rs->seg_boundary_mask, q->seg_boundary_mask); + } + + return r; +} + +/* + * Decrement a devices use count and remove it if neccessary. + */ +void dm_put_device(struct dm_target *ti, struct dm_dev *dd) +{ + if (atomic_dec_and_test(&dd->count)) { + close_dev(dd); + list_del(&dd->list); + kfree(dd); + } +} + +/* + * Checks to see if the target joins onto the end of the table. + */ +static int adjoin(struct dm_table *table, struct dm_target *ti) +{ + struct dm_target *prev; + + if (!table->num_targets) + return !ti->begin; + + prev = &table->targets[table->num_targets - 1]; + return (ti->begin == (prev->begin + prev->len)); +} + +/* + * Destructively splits up the argument list to pass to ctr. + */ +static int split_args(int max, int *argc, char **argv, char *input) +{ + char *start, *end = input, *out; + *argc = 0; + + while (1) { + start = end; + + /* Skip whitespace */ + while (*start && isspace(*start)) + start++; + + if (!*start) + break; /* success, we hit the end */ + + /* 'out' is used to remove any back-quotes */ + end = out = start; + while (*end) { + /* Everything apart from '\0' can be quoted */ + if (*end == '\\' && *(end + 1)) { + *out++ = *(end + 1); + end += 2; + continue; + } + + if (isspace(*end)) + break; /* end of token */ + + *out++ = *end++; + } + + /* have we already filled the array ? */ + if ((*argc + 1) > max) + return -EINVAL; + + /* we know this is whitespace */ + if (*end) + end++; + + /* terminate the string and put it in the array */ + *out = '\0'; + argv[*argc] = start; + (*argc)++; + } + + return 0; +} + +int dm_table_add_target(struct dm_table *t, const char *type, + sector_t start, sector_t len, char *params) +{ + int r, argc; + char *argv[32]; + struct target_type *tt; + struct dm_target *tgt; + + if ((r = check_space(t))) + return r; + + tgt = t->targets + t->num_targets; + memset(tgt, 0, sizeof(*tgt)); + + tt = dm_get_target_type(type); + if (!tt) { + tgt->error = "unknown target type"; + return -EINVAL; + } + + tgt->table = t; + tgt->type = tt; + tgt->begin = start; + tgt->len = len; + tgt->error = "Unknown error"; + + /* + * Does this target adjoin the previous one ? + */ + if (!adjoin(t, tgt)) { + DMERR("Gap in table"); + dm_put_target_type(tt); + return -EINVAL; + } + + r = split_args(ARRAY_SIZE(argv), &argc, argv, params); + if (r) { + tgt->error = "couldn't split parameters"; + dm_put_target_type(tt); + return r; + } + + r = tt->ctr(tgt, argc, argv); + if (r) { + dm_put_target_type(tt); + return r; + } + + t->highs[t->num_targets++] = tgt->begin + tgt->len - 1; + + /* FIXME: the plan is to combine high here and then have + * the merge fn apply the target level restrictions. */ + combine_restrictions_low(&t->limits, &tgt->limits); + return 0; +} + +static int setup_indexes(struct dm_table *t) +{ + int i, total = 0; + sector_t *indexes; + + /* allocate the space for *all* the indexes */ + for (i = t->depth - 2; i >= 0; i--) { + t->counts[i] = div_up(t->counts[i + 1], CHILDREN_PER_NODE); + total += t->counts[i]; + } + + indexes = (sector_t *) vcalloc(total, (unsigned long) NODE_SIZE); + if (!indexes) + return -ENOMEM; + + /* set up internal nodes, bottom-up */ + for (i = t->depth - 2, total = 0; i >= 0; i--) { + t->index[i] = indexes; + indexes += (KEYS_PER_NODE * t->counts[i]); + setup_btree_index(i, t); + } + + return 0; +} + +/* + * Builds the btree to index the map. + */ +int dm_table_complete(struct dm_table *t) +{ + int leaf_nodes, r = 0; + + /* how many indexes will the btree have ? */ + leaf_nodes = div_up(t->num_targets, KEYS_PER_NODE); + t->depth = 1 + int_log(leaf_nodes, CHILDREN_PER_NODE); + + /* leaf layer has already been set up */ + t->counts[t->depth - 1] = leaf_nodes; + t->index[t->depth - 1] = t->highs; + + if (t->depth >= 2) + r = setup_indexes(t); + + return r; +} + +void dm_table_event(struct dm_table *t) +{ + wake_up_interruptible(&t->eventq); +} + +sector_t dm_table_get_size(struct dm_table *t) +{ + return t->num_targets ? (t->highs[t->num_targets - 1] + 1) : 0; +} + +struct dm_target *dm_table_get_target(struct dm_table *t, int index) +{ + if (index > t->num_targets) + return NULL; + + return t->targets + index; +} + +/* + * Search the btree for the correct target. + */ +struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector) +{ + int l, n = 0, k = 0; + sector_t *node; + + for (l = 0; l < t->depth; l++) { + n = get_child(n, k); + node = get_node(t, l, n); + + for (k = 0; k < KEYS_PER_NODE; k++) + if (node[k] >= sector) + break; + } + + return &t->targets[(KEYS_PER_NODE * n) + k]; +} + +void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q) +{ + /* + * Make sure we obey the optimistic sub devices + * restrictions. + */ + q->max_sectors = t->limits.max_sectors; + q->max_phys_segments = t->limits.max_phys_segments; + q->max_hw_segments = t->limits.max_hw_segments; + q->hardsect_size = t->limits.hardsect_size; + q->max_segment_size = t->limits.max_segment_size; + q->seg_boundary_mask = t->limits.seg_boundary_mask; +} + +unsigned int dm_table_get_num_targets(struct dm_table *t) +{ + return t->num_targets; +} + +struct list_head *dm_table_get_devices(struct dm_table *t) +{ + return &t->devices; +} + +int dm_table_get_mode(struct dm_table *t) +{ + return t->mode; +} + +void dm_table_add_wait_queue(struct dm_table *t, wait_queue_t *wq) +{ + add_wait_queue(&t->eventq, wq); +} + +EXPORT_SYMBOL(dm_get_device); +EXPORT_SYMBOL(dm_put_device); +EXPORT_SYMBOL(dm_table_event); diff -Nru a/drivers/md/dm-target.c b/drivers/md/dm-target.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/md/dm-target.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2001 Sistina Software (UK) Limited + * + * This file is released under the GPL. + */ + +#include "dm.h" + +#include +#include +#include +#include + +struct tt_internal { + struct target_type tt; + + struct list_head list; + long use; +}; + +static LIST_HEAD(_targets); +static rwlock_t _lock = RW_LOCK_UNLOCKED; + +#define DM_MOD_NAME_SIZE 32 + +static inline struct tt_internal *__find_target_type(const char *name) +{ + struct list_head *tih; + struct tt_internal *ti; + + list_for_each(tih, &_targets) { + ti = list_entry(tih, struct tt_internal, list); + + if (!strcmp(name, ti->tt.name)) + return ti; + } + + return NULL; +} + +static struct tt_internal *get_target_type(const char *name) +{ + struct tt_internal *ti; + + read_lock(&_lock); + ti = __find_target_type(name); + + if (ti) { + if (ti->use == 0 && ti->tt.module) + __MOD_INC_USE_COUNT(ti->tt.module); + ti->use++; + } + read_unlock(&_lock); + + return ti; +} + +static void load_module(const char *name) +{ + char module_name[DM_MOD_NAME_SIZE] = "dm-"; + + /* Length check for strcat() below */ + if (strlen(name) > (DM_MOD_NAME_SIZE - 4)) + return; + + strcat(module_name, name); + request_module(module_name); + + return; +} + +struct target_type *dm_get_target_type(const char *name) +{ + struct tt_internal *ti = get_target_type(name); + + if (!ti) { + load_module(name); + ti = get_target_type(name); + } + + return ti ? &ti->tt : NULL; +} + +void dm_put_target_type(struct target_type *t) +{ + struct tt_internal *ti = (struct tt_internal *) t; + + read_lock(&_lock); + if (--ti->use == 0 && ti->tt.module) + __MOD_DEC_USE_COUNT(ti->tt.module); + + if (ti->use < 0) + BUG(); + read_unlock(&_lock); + + return; +} + +static struct tt_internal *alloc_target(struct target_type *t) +{ + struct tt_internal *ti = kmalloc(sizeof(*ti), GFP_KERNEL); + + if (ti) { + memset(ti, 0, sizeof(*ti)); + ti->tt = *t; + } + + return ti; +} + +int dm_register_target(struct target_type *t) +{ + int rv = 0; + struct tt_internal *ti = alloc_target(t); + + if (!ti) + return -ENOMEM; + + write_lock(&_lock); + if (__find_target_type(t->name)) + rv = -EEXIST; + else + list_add(&ti->list, &_targets); + + write_unlock(&_lock); + return rv; +} + +int dm_unregister_target(struct target_type *t) +{ + struct tt_internal *ti; + + write_lock(&_lock); + if (!(ti = __find_target_type(t->name))) { + write_unlock(&_lock); + return -EINVAL; + } + + if (ti->use) { + write_unlock(&_lock); + return -ETXTBSY; + } + + list_del(&ti->list); + kfree(ti); + + write_unlock(&_lock); + return 0; +} + +/* + * io-err: always fails an io, useful for bringing + * up LVs that have holes in them. + */ +static int io_err_ctr(struct dm_target *ti, int argc, char **args) +{ + return 0; +} + +static void io_err_dtr(struct dm_target *ti) +{ + /* empty */ + return; +} + +static int io_err_map(struct dm_target *ti, struct bio *bio) +{ + bio_io_error(bio, 0); + return 0; +} + +static struct target_type error_target = { + .name = "error", + .ctr = io_err_ctr, + .dtr = io_err_dtr, + .map = io_err_map, +}; + +int dm_target_init(void) +{ + return dm_register_target(&error_target); +} + +void dm_target_exit(void) +{ + if (dm_unregister_target(&error_target)) + DMWARN("error target unregistration failed"); +} + +EXPORT_SYMBOL(dm_register_target); +EXPORT_SYMBOL(dm_unregister_target); diff -Nru a/drivers/md/dm.c b/drivers/md/dm.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/md/dm.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,796 @@ +/* + * Copyright (C) 2001, 2002 Sistina Software (UK) Limited. + * + * This file is released under the GPL. + */ + +#include "dm.h" + +#include +#include +#include +#include +#include +#include +#include + +static const char *_name = DM_NAME; +#define MAX_DEVICES 256 +#define SECTOR_SHIFT 9 + +static int major = 0; +static int _major = 0; + +struct dm_io { + struct mapped_device *md; + int error; + struct bio *bio; + atomic_t io_count; +}; + +struct deferred_io { + struct bio *bio; + struct deferred_io *next; +}; + +/* + * Bits for the md->flags field. + */ +#define DMF_BLOCK_IO 0 +#define DMF_SUSPENDED 1 + +struct mapped_device { + struct rw_semaphore lock; + + kdev_t kdev; + atomic_t holders; + + unsigned long flags; + + request_queue_t queue; + struct gendisk *disk; + + /* + * A list of ios that arrived while we were suspended. + */ + atomic_t pending; + wait_queue_head_t wait; + struct deferred_io *deferred; + + /* + * The current mapping. + */ + struct dm_table *map; +}; + +#define MIN_IOS 256 +static kmem_cache_t *_io_cache; +static mempool_t *_io_pool; + +static __init int local_init(void) +{ + int r; + + /* allocate a slab for the dm_ios */ + _io_cache = kmem_cache_create("dm io", + sizeof(struct dm_io), 0, 0, NULL, NULL); + if (!_io_cache) + return -ENOMEM; + + _io_pool = mempool_create(MIN_IOS, mempool_alloc_slab, + mempool_free_slab, _io_cache); + if (!_io_pool) { + kmem_cache_destroy(_io_cache); + return -ENOMEM; + } + + _major = major; + r = register_blkdev(_major, _name, &dm_blk_dops); + if (r < 0) { + DMERR("register_blkdev failed"); + mempool_destroy(_io_pool); + kmem_cache_destroy(_io_cache); + return r; + } + + if (!_major) + _major = r; + + return 0; +} + +static void local_exit(void) +{ + mempool_destroy(_io_pool); + kmem_cache_destroy(_io_cache); + + if (unregister_blkdev(_major, _name) < 0) + DMERR("devfs_unregister_blkdev failed"); + + _major = 0; + + DMINFO("cleaned up"); +} + +/* + * We have a lot of init/exit functions, so it seems easier to + * store them in an array. The disposable macro 'xx' + * expands a prefix into a pair of function names. + */ +static struct { + int (*init) (void); + void (*exit) (void); + +} _inits[] = { +#define xx(n) {n ## _init, n ## _exit}, + xx(local) + xx(dm_target) + xx(dm_linear) + xx(dm_stripe) + xx(dm_interface) +#undef xx +}; + +static int __init dm_init(void) +{ + const int count = ARRAY_SIZE(_inits); + + int r, i; + + for (i = 0; i < count; i++) { + r = _inits[i].init(); + if (r) + goto bad; + } + + return 0; + + bad: + while (i--) + _inits[i].exit(); + + return r; +} + +static void __exit dm_exit(void) +{ + int i = ARRAY_SIZE(_inits); + + while (i--) + _inits[i].exit(); +} + +/* + * Block device functions + */ +static int dm_blk_open(struct inode *inode, struct file *file) +{ + struct mapped_device *md; + + md = inode->i_bdev->bd_disk->private_data; + dm_get(md); + return 0; +} + +static int dm_blk_close(struct inode *inode, struct file *file) +{ + struct mapped_device *md; + + md = inode->i_bdev->bd_disk->private_data; + dm_put(md); + return 0; +} + +static inline struct dm_io *alloc_io(void) +{ + return mempool_alloc(_io_pool, GFP_NOIO); +} + +static inline void free_io(struct dm_io *io) +{ + mempool_free(io, _io_pool); +} + +static inline struct deferred_io *alloc_deferred(void) +{ + return kmalloc(sizeof(struct deferred_io), GFP_NOIO); +} + +static inline void free_deferred(struct deferred_io *di) +{ + kfree(di); +} + +/* + * Add the bio to the list of deferred io. + */ +static int queue_io(struct mapped_device *md, struct bio *bio) +{ + struct deferred_io *di; + + di = alloc_deferred(); + if (!di) + return -ENOMEM; + + down_write(&md->lock); + + if (!test_bit(DMF_SUSPENDED, &md->flags)) { + up_write(&md->lock); + free_deferred(di); + return 1; + } + + di->bio = bio; + di->next = md->deferred; + md->deferred = di; + + up_write(&md->lock); + return 0; /* deferred successfully */ +} + +/*----------------------------------------------------------------- + * CRUD START: + * A more elegant soln is in the works that uses the queue + * merge fn, unfortunately there are a couple of changes to + * the block layer that I want to make for this. So in the + * interests of getting something for people to use I give + * you this clearly demarcated crap. + *---------------------------------------------------------------*/ + +/* + * Decrements the number of outstanding ios that a bio has been + * cloned into, completing the original io if necc. + */ +static inline void dec_pending(struct dm_io *io, int error) +{ + static spinlock_t _uptodate_lock = SPIN_LOCK_UNLOCKED; + unsigned long flags; + + spin_lock_irqsave(&_uptodate_lock, flags); + if (error) + io->error = error; + spin_unlock_irqrestore(&_uptodate_lock, flags); + + if (atomic_dec_and_test(&io->io_count)) { + if (atomic_dec_and_test(&io->md->pending)) + /* nudge anyone waiting on suspend queue */ + wake_up(&io->md->wait); + + bio_endio(io->bio, io->error ? 0 : io->bio->bi_size, io->error); + free_io(io); + } +} + +static int clone_endio(struct bio *bio, unsigned int done, int error) +{ + struct dm_io *io = bio->bi_private; + + /* + * Only call dec_pending if the clone has completely + * finished. If a partial io errors I'm assuming it won't + * be requeued. FIXME: check this. + */ + if (error || !bio->bi_size) { + dec_pending(io, error); + bio_put(bio); + } + + return 0; +} + + +static sector_t max_io_len(struct mapped_device *md, + sector_t sector, struct dm_target *ti) +{ + sector_t len = ti->len; + + /* FIXME: obey io_restrictions ! */ + + /* + * Does the target need to split even further ? + */ + if (ti->split_io) { + sector_t boundary; + sector_t offset = sector - ti->begin; + boundary = dm_round_up(offset + 1, ti->split_io) - offset; + + if (len > boundary) + len = boundary; + } + + return len; +} + +static void __map_bio(struct dm_target *ti, struct bio *clone) +{ + struct dm_io *io = clone->bi_private; + int r; + + /* + * Sanity checks. + */ + if (!clone->bi_size) + BUG(); + + /* + * Map the clone. If r == 0 we don't need to do + * anything, the target has assumed ownership of + * this io. + */ + atomic_inc(&io->md->pending); + atomic_inc(&io->io_count); + r = ti->type->map(ti, clone); + if (r > 0) + /* the bio has been remapped so dispatch it */ + generic_make_request(clone); + + else if (r < 0) + /* error the io and bail out */ + dec_pending(io, -EIO); +} + +struct clone_info { + struct mapped_device *md; + struct bio *bio; + struct dm_io *io; + sector_t sector; + sector_t sector_count; + unsigned short idx; +}; + +/* + * Issues a little bio that just does the back end of a split page. + */ +static void __split_page(struct clone_info *ci, unsigned int len) +{ + struct dm_target *ti = dm_table_find_target(ci->md->map, ci->sector); + struct bio *clone, *bio = ci->bio; + struct bio_vec *bv = bio->bi_io_vec + (bio->bi_vcnt - 1); + + DMWARN("splitting page"); + + if (len > ci->sector_count) + len = ci->sector_count; + + clone = bio_alloc(GFP_NOIO, 1); + memcpy(clone->bi_io_vec, bv, sizeof(*bv)); + + clone->bi_sector = ci->sector; + clone->bi_bdev = bio->bi_bdev; + clone->bi_flags = bio->bi_flags | (1 << BIO_SEG_VALID); + clone->bi_rw = bio->bi_rw; + clone->bi_size = len << SECTOR_SHIFT; + clone->bi_end_io = clone_endio; + clone->bi_private = ci->io; + + ci->sector += len; + ci->sector_count -= len; + + __map_bio(ti, clone); +} + +static void __clone_and_map(struct clone_info *ci) +{ + struct bio *clone, *bio = ci->bio; + struct dm_target *ti = dm_table_find_target(ci->md->map, ci->sector); + sector_t len = max_io_len(ci->md, bio->bi_sector, ti); + + /* shorter than current target ? */ + if (ci->sector_count < len) + len = ci->sector_count; + + /* create the clone */ + clone = bio_clone(ci->bio, GFP_NOIO); + clone->bi_sector = ci->sector; + clone->bi_idx = ci->idx; + clone->bi_size = len << SECTOR_SHIFT; + clone->bi_end_io = clone_endio; + clone->bi_private = ci->io; + + /* adjust the remaining io */ + ci->sector += len; + ci->sector_count -= len; + __map_bio(ti, clone); + + /* + * If we are not performing all remaining io in this + * clone then we need to calculate ci->idx for the next + * time round. + */ + if (ci->sector_count) { + while (len) { + struct bio_vec *bv = clone->bi_io_vec + ci->idx; + sector_t bv_len = bv->bv_len >> SECTOR_SHIFT; + if (bv_len <= len) + len -= bv_len; + + else { + __split_page(ci, bv_len - len); + len = 0; + } + ci->idx++; + } + } +} + +/* + * Split the bio into several clones. + */ +static void __split_bio(struct mapped_device *md, struct bio *bio) +{ + struct clone_info ci; + + ci.md = md; + ci.bio = bio; + ci.io = alloc_io(); + ci.io->error = 0; + atomic_set(&ci.io->io_count, 1); + ci.io->bio = bio; + ci.io->md = md; + ci.sector = bio->bi_sector; + ci.sector_count = bio_sectors(bio); + ci.idx = 0; + + while (ci.sector_count) + __clone_and_map(&ci); + + /* drop the extra reference count */ + dec_pending(ci.io, 0); +} +/*----------------------------------------------------------------- + * CRUD END + *---------------------------------------------------------------*/ + + +/* + * The request function that just remaps the bio built up by + * dm_merge_bvec. + */ +static int dm_request(request_queue_t *q, struct bio *bio) +{ + int r; + struct mapped_device *md = q->queuedata; + + down_read(&md->lock); + + /* + * If we're suspended we have to queue + * this io for later. + */ + while (test_bit(DMF_BLOCK_IO, &md->flags)) { + up_read(&md->lock); + + if (bio_rw(bio) == READA) { + bio_io_error(bio, 0); + return 0; + } + + r = queue_io(md, bio); + if (r < 0) { + bio_io_error(bio, 0); + return 0; + + } else if (r == 0) + return 0; /* deferred successfully */ + + /* + * We're in a while loop, because someone could suspend + * before we get to the following read lock. + */ + down_read(&md->lock); + } + + __split_bio(md, bio); + up_read(&md->lock); + return 0; +} + +/* + * See if the device with a specific minor # is free. + */ +static int specific_dev(int minor, struct mapped_device *md) +{ + struct gendisk *disk; + int part; + + if (minor >= MAX_DEVICES) { + DMWARN("request for a mapped_device beyond MAX_DEVICES (%d)", + MAX_DEVICES); + return -EINVAL; + } + + disk = get_gendisk(MKDEV(_major, minor), &part); + if (disk) { + put_disk(disk); + return -EBUSY; + } + + return minor; +} + +static int any_old_dev(struct mapped_device *md) +{ + int i; + + for (i = 0; i < MAX_DEVICES; i++) + if (specific_dev(i, md) >= 0) { + DMWARN("allocating minor = %d", i); + return i; + } + + return -EBUSY; +} + +/* + * Allocate and initialise a blank device with a given minor. + */ +static struct mapped_device *alloc_dev(int minor) +{ + struct mapped_device *md = kmalloc(sizeof(*md), GFP_KERNEL); + + if (!md) { + DMWARN("unable to allocate device, out of memory."); + return NULL; + } + + /* get a minor number for the dev */ + minor = (minor < 0) ? any_old_dev(md) : specific_dev(minor, md); + if (minor < 0) { + kfree(md); + return NULL; + } + + memset(md, 0, sizeof(*md)); + init_rwsem(&md->lock); + md->kdev = mk_kdev(_major, minor); + atomic_set(&md->holders, 1); + + md->queue.queuedata = md; + blk_queue_make_request(&md->queue, dm_request); + + md->disk = alloc_disk(1); + if (!md->disk) { + kfree(md); + return NULL; + } + + md->disk->major = _major; + md->disk->first_minor = minor; + md->disk->fops = &dm_blk_dops; + md->disk->queue = &md->queue; + md->disk->private_data = md; + sprintf(md->disk->disk_name, "dm-%d", minor); + add_disk(md->disk); + + atomic_set(&md->pending, 0); + init_waitqueue_head(&md->wait); + return md; +} + +static void free_dev(struct mapped_device *md) +{ + del_gendisk(md->disk); + put_disk(md->disk); + kfree(md); +} + +/* + * Bind a table to the device. + */ +static int __bind(struct mapped_device *md, struct dm_table *t) +{ + request_queue_t *q = &md->queue; + sector_t size; + md->map = t; + + size = dm_table_get_size(t); + set_capacity(md->disk, size); + if (size == 0) + return 0; + + dm_table_get(t); + dm_table_set_restrictions(t, q); + return 0; +} + +static void __unbind(struct mapped_device *md) +{ + dm_table_put(md->map); + md->map = NULL; + set_capacity(md->disk, 0); +} + +/* + * Constructor for a new device. + */ +int dm_create(int minor, struct dm_table *table, struct mapped_device **result) +{ + int r; + struct mapped_device *md; + + md = alloc_dev(minor); + if (!md) + return -ENXIO; + + r = __bind(md, table); + if (r) { + free_dev(md); + return r; + } + + *result = md; + return 0; +} + +void dm_get(struct mapped_device *md) +{ + atomic_inc(&md->holders); +} + +void dm_put(struct mapped_device *md) +{ + if (atomic_dec_and_test(&md->holders)) { + DMWARN("destroying md"); + __unbind(md); + free_dev(md); + } +} + +/* + * Requeue the deferred bios by calling generic_make_request. + */ +static void flush_deferred_io(struct deferred_io *c) +{ + struct deferred_io *n; + + while (c) { + n = c->next; + generic_make_request(c->bio); + free_deferred(c); + c = n; + } +} + +/* + * Swap in a new table (destroying old one). + */ +int dm_swap_table(struct mapped_device *md, struct dm_table *table) +{ + int r; + + down_write(&md->lock); + + /* device must be suspended */ + if (!test_bit(DMF_SUSPENDED, &md->flags)) { + up_write(&md->lock); + return -EPERM; + } + + __unbind(md); + r = __bind(md, table); + if (r) + return r; + + up_write(&md->lock); + return 0; +} + +/* + * We need to be able to change a mapping table under a mounted + * filesystem. For example we might want to move some data in + * the background. Before the table can be swapped with + * dm_bind_table, dm_suspend must be called to flush any in + * flight bios and ensure that any further io gets deferred. + */ +int dm_suspend(struct mapped_device *md) +{ + DECLARE_WAITQUEUE(wait, current); + + down_write(&md->lock); + + /* + * First we set the BLOCK_IO flag so no more ios will be + * mapped. + */ + if (test_bit(DMF_BLOCK_IO, &md->flags)) { + up_write(&md->lock); + return -EINVAL; + } + + set_bit(DMF_BLOCK_IO, &md->flags); + up_write(&md->lock); + + /* + * Then we wait for the already mapped ios to + * complete. + */ + down_read(&md->lock); + + add_wait_queue(&md->wait, &wait); + while (1) { + set_current_state(TASK_INTERRUPTIBLE); + + if (!atomic_read(&md->pending)) + break; + + yield(); + } + + current->state = TASK_RUNNING; + remove_wait_queue(&md->wait, &wait); + up_read(&md->lock); + + /* set_bit is atomic */ + set_bit(DMF_SUSPENDED, &md->flags); + + return 0; +} + +int dm_resume(struct mapped_device *md) +{ + struct deferred_io *def; + + down_write(&md->lock); + if (!test_bit(DMF_SUSPENDED, &md->flags) || + !dm_table_get_size(md->map)) { + up_write(&md->lock); + return -EINVAL; + } + + clear_bit(DMF_SUSPENDED, &md->flags); + clear_bit(DMF_BLOCK_IO, &md->flags); + def = md->deferred; + md->deferred = NULL; + up_write(&md->lock); + + flush_deferred_io(def); + blk_run_queues(); + + return 0; +} + +kdev_t dm_kdev(struct mapped_device *md) +{ + kdev_t dev; + + down_read(&md->lock); + dev = md->kdev; + up_read(&md->lock); + + return dev; +} + +struct dm_table *dm_get_table(struct mapped_device *md) +{ + struct dm_table *t; + + down_read(&md->lock); + t = md->map; + dm_table_get(t); + up_read(&md->lock); + + return t; +} + +int dm_suspended(struct mapped_device *md) +{ + return test_bit(DMF_SUSPENDED, &md->flags); +} + +struct block_device_operations dm_blk_dops = { + .open = dm_blk_open, + .release = dm_blk_close, + .owner = THIS_MODULE +}; + +/* + * module hooks + */ +module_init(dm_init); +module_exit(dm_exit); + +MODULE_PARM(major, "i"); +MODULE_PARM_DESC(major, "The major number of the device mapper"); +MODULE_DESCRIPTION(DM_NAME " driver"); +MODULE_AUTHOR("Joe Thornber "); +MODULE_LICENSE("GPL"); diff -Nru a/drivers/md/dm.h b/drivers/md/dm.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/md/dm.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,148 @@ +/* + * Internal header file for device mapper + * + * Copyright (C) 2001, 2002 Sistina Software + * + * This file is released under the LGPL. + */ + +#ifndef DM_INTERNAL_H +#define DM_INTERNAL_H + +#include +#include +#include +#include + +#define DM_NAME "device-mapper" +#define DMWARN(f, x...) printk(KERN_WARNING DM_NAME ": " f "\n" , ## x) +#define DMERR(f, x...) printk(KERN_ERR DM_NAME ": " f "\n" , ## x) +#define DMINFO(f, x...) printk(KERN_INFO DM_NAME ": " f "\n" , ## x) + +/* + * FIXME: I think this should be with the definition of sector_t + * in types.h. + */ +#ifdef CONFIG_LBD +#define SECTOR_FORMAT "%Lu" +#else +#define SECTOR_FORMAT "%lu" +#endif + +extern struct block_device_operations dm_blk_dops; + +/* + * List of devices that a metadevice uses and should open/close. + */ +struct dm_dev { + struct list_head list; + + atomic_t count; + int mode; + struct block_device *bdev; +}; + +struct dm_table; +struct mapped_device; + +/*----------------------------------------------------------------- + * Functions for manipulating a struct mapped_device. + * Drop the reference with dm_put when you finish with the object. + *---------------------------------------------------------------*/ +int dm_create(int minor, struct dm_table *table, struct mapped_device **md); + +/* + * Reference counting for md. + */ +void dm_get(struct mapped_device *md); +void dm_put(struct mapped_device *md); + +/* + * A device can still be used while suspended, but I/O is deferred. + */ +int dm_suspend(struct mapped_device *md); +int dm_resume(struct mapped_device *md); + +/* + * The device must be suspended before calling this method. + */ +int dm_swap_table(struct mapped_device *md, struct dm_table *t); + +/* + * Drop a reference on the table when you've finished with the + * result. + */ +struct dm_table *dm_get_table(struct mapped_device *md); + +/* + * Info functions. + */ +kdev_t dm_kdev(struct mapped_device *md); +int dm_suspended(struct mapped_device *md); + +/*----------------------------------------------------------------- + * Functions for manipulating a table. Tables are also reference + * counted. + *---------------------------------------------------------------*/ +int dm_table_create(struct dm_table **result, int mode); + +void dm_table_get(struct dm_table *t); +void dm_table_put(struct dm_table *t); + +int dm_table_add_target(struct dm_table *t, const char *type, + sector_t start, sector_t len, char *params); +int dm_table_complete(struct dm_table *t); +void dm_table_event(struct dm_table *t); +sector_t dm_table_get_size(struct dm_table *t); +struct dm_target *dm_table_get_target(struct dm_table *t, int index); +struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector); +void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q); +unsigned int dm_table_get_num_targets(struct dm_table *t); +struct list_head *dm_table_get_devices(struct dm_table *t); +int dm_table_get_mode(struct dm_table *t); +void dm_table_add_wait_queue(struct dm_table *t, wait_queue_t *wq); + +/*----------------------------------------------------------------- + * A registry of target types. + *---------------------------------------------------------------*/ +int dm_target_init(void); +void dm_target_exit(void); +struct target_type *dm_get_target_type(const char *name); +void dm_put_target_type(struct target_type *t); + + +/*----------------------------------------------------------------- + * Useful inlines. + *---------------------------------------------------------------*/ +static inline int array_too_big(unsigned long fixed, unsigned long obj, + unsigned long num) +{ + return (num > (ULONG_MAX - fixed) / obj); +} + +/* + * ceiling(n / size) * size + */ +static inline unsigned long dm_round_up(unsigned long n, unsigned long size) +{ + unsigned long r = n % size; + return n + (r ? (size - r) : 0); +} + +/* + * The device-mapper can be driven through one of two interfaces; + * ioctl or filesystem, depending which patch you have applied. + */ +int dm_interface_init(void); +void dm_interface_exit(void); + +/* + * Targets for linear and striped mappings + */ +int dm_linear_init(void); +void dm_linear_exit(void); + +int dm_stripe_init(void); +void dm_stripe_exit(void); + +#endif diff -Nru a/drivers/md/linear.c b/drivers/md/linear.c --- a/drivers/md/linear.c Mon Oct 28 16:32:36 2002 +++ b/drivers/md/linear.c Mon Oct 28 16:32:36 2002 @@ -52,19 +52,21 @@ * @bio: the buffer head that's been built up so far * @biovec: the request that could be merged to it. * - * Return 1 if the merge is not permitted (because the - * result would cross a device boundary), 0 otherwise. + * Return amount of bytes we can take at this offset */ static int linear_mergeable_bvec(request_queue_t *q, struct bio *bio, struct bio_vec *biovec) { mddev_t *mddev = q->queuedata; - dev_info_t *dev0, *dev1; + dev_info_t *dev0; + int maxsectors, bio_sectors = (bio->bi_size + biovec->bv_len) >> 9; dev0 = which_dev(mddev, bio->bi_sector); - dev1 = which_dev(mddev, bio->bi_sector + - ((bio->bi_size + biovec->bv_len - 1) >> 9)); + maxsectors = (dev0->size << 1) - (bio->bi_sector - (dev0->offset<<1)); - return dev0 != dev1; + if (bio_sectors <= maxsectors) + return biovec->bv_len; + + return (maxsectors << 9) - bio->bi_size; } static int linear_run (mddev_t *mddev) diff -Nru a/drivers/md/raid0.c b/drivers/md/raid0.c --- a/drivers/md/raid0.c Mon Oct 28 16:32:37 2002 +++ b/drivers/md/raid0.c Mon Oct 28 16:32:37 2002 @@ -168,8 +168,7 @@ * @bio: the buffer head that's been built up so far * @biovec: the request that could be merged to it. * - * Return 1 if the merge is not permitted (because the - * result would cross a chunk boundary), 0 otherwise. + * Return amount of bytes we can accept at this offset */ static int raid0_mergeable_bvec(request_queue_t *q, struct bio *bio, struct bio_vec *biovec) { @@ -182,7 +181,7 @@ block = bio->bi_sector >> 1; bio_sz = (bio->bi_size + biovec->bv_len) >> 10; - return chunk_size < ((block & (chunk_size - 1)) + bio_sz); + return (chunk_size - ((block & (chunk_size - 1)) + bio_sz)) << 10; } static int raid0_run (mddev_t *mddev) diff -Nru a/drivers/media/Config.in b/drivers/media/Config.in --- a/drivers/media/Config.in Mon Oct 28 16:32:36 2002 +++ b/drivers/media/Config.in Mon Oct 28 16:32:36 2002 @@ -8,6 +8,7 @@ if [ "$CONFIG_VIDEO_DEV" != "n" ]; then source drivers/media/video/Config.in source drivers/media/radio/Config.in + source drivers/media/dvb/Config.in fi endmenu diff -Nru a/drivers/media/Makefile b/drivers/media/Makefile --- a/drivers/media/Makefile Mon Oct 28 16:32:37 2002 +++ b/drivers/media/Makefile Mon Oct 28 16:32:37 2002 @@ -2,6 +2,6 @@ # Makefile for the kernel multimedia device drivers. # -obj-y := video/ radio/ +obj-y := video/ radio/ dvb/ include $(TOPDIR)/Rules.make diff -Nru a/drivers/media/dvb/Config.help b/drivers/media/dvb/Config.help --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/Config.help Mon Oct 28 16:32:38 2002 @@ -0,0 +1,21 @@ +CONFIG_DVB + Support Digital Video Broadcasting hardware. Enable this if you + own a DVB adapter and want to use it or if you compile Linux for + a digital SetTopBox. + + API specs and user tools and are available for example from + . + + Please report problems regarding this driver to the LinuxDVB + mailing list. + + You might want add the following lines to your /etc/modules.conf: + + alias char-major-250 dvb + alias dvb dvb-ttpci + below dvb-ttpci alps_bsru6 alps_bsrv2 \ + grundig_29504-401 grundig_29504-491 \ + ves1820 + + If unsure say N. + diff -Nru a/drivers/media/dvb/Config.in b/drivers/media/dvb/Config.in --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/Config.in Mon Oct 28 16:32:38 2002 @@ -0,0 +1,17 @@ +# +# Multimedia device configuration +# +mainmenu_option next_comment +comment 'Digital Video Broadcasting Devices' + +bool 'DVB For Linux' CONFIG_DVB + +if [ "$CONFIG_DVB" != "n" ]; then + source drivers/media/dvb/dvb-core/Config.in + source drivers/media/dvb/frontends/Config.in + + comment 'Supported DVB Adapters' + source drivers/media/dvb/av7110/Config.in +fi + +endmenu diff -Nru a/drivers/media/dvb/Makefile b/drivers/media/dvb/Makefile --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/Makefile Mon Oct 28 16:32:38 2002 @@ -0,0 +1,7 @@ +# +# Makefile for the kernel multimedia device drivers. +# + +obj-y := dvb-core/ frontends/ av7110/ + +include $(TOPDIR)/Rules.make diff -Nru a/drivers/media/dvb/av7110/Config.help b/drivers/media/dvb/av7110/Config.help --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/av7110/Config.help Mon Oct 28 16:32:38 2002 @@ -0,0 +1,21 @@ +CONFIG_DVB_AV7110 + Support for SAA7146 and AV7110 based DVB cards as produced + by Fujitsu-Siemens, Technotrend, Hauppauge and others. + + Simple cards like so called Budget- or Nova-PCI cards are + supported as well as fullfeatured cards with onboard MPEG2 + decoder. + + Say Y if you own such a card and want to use it. + + +CONFIG_DVB_AV7110_OSD + The AV7110 firmware provides some code to generate an OnScreenDisplay + on the video output. This is kind of nonstandard and not guaranteed to + be maintained. + + Anyway, some popular DVB software like VDR uses this OSD to render + its menus, so say Y if you want to use this software. + + All other people say N. + diff -Nru a/drivers/media/dvb/av7110/Config.in b/drivers/media/dvb/av7110/Config.in --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/av7110/Config.in Mon Oct 28 16:32:38 2002 @@ -0,0 +1,6 @@ +dep_tristate ' SAA7146 based AV7110 and Nova/budget cards' CONFIG_DVB_AV7110 $CONFIG_VIDEO_DEV $CONFIG_DVB_CORE + +if [ "$CONFIG_DVB_AV7110" != "n" ]; then + bool ' AV7110 OSD support' CONFIG_DVB_AV7110_OSD +fi + diff -Nru a/drivers/media/dvb/av7110/Makefile b/drivers/media/dvb/av7110/Makefile --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/av7110/Makefile Mon Oct 28 16:32:38 2002 @@ -0,0 +1,10 @@ +# +# Makefile for the kernel AV7110 DVB device driver +# + +dvb-ttpci-objs := saa7146_core.o saa7146_v4l.o av7110.o av7110_ir.o + +obj-$(CONFIG_DVB_AV7110) += dvb-ttpci.o + +include $(TOPDIR)/Rules.make + diff -Nru a/drivers/media/dvb/av7110/av7110.c b/drivers/media/dvb/av7110/av7110.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/av7110/av7110.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,4830 @@ +/* + * av7110.c: driver for the SAA7146 based AV110 cards (like the Fujitsu-Siemens DVB) + * and Nova/Budget DVB cards + * + * Copyright (C) 1999-2002 Ralph Metzler + * & Marcus Metzler for convergence integrated media GmbH + * + * originally based on code by: + * Copyright (C) 1998,1999 Christian Theiss + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Or, point your browser to http://www.gnu.org/copyleft/gpl.html + * + * + * the project's page is at http://www.linuxtv.org/dvb/ + */ + +#define NEW_CI 1 + +#define __KERNEL_SYSCALLS__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include "../dvb-core/dvb_i2c.h" +#include "../dvb-core/dvb_frontend.h" +#include "av7110.h" + +#include "saa7146_core.h" +#include "saa7146_v4l.h" +#include "saa7146_defs.h" + + +static int AV_StartPlay(av7110_t *av7110, int av); +static void restart_feeds(av7110_t *av7110); +static int bootarm(av7110_t *av7110); +static inline int i2c_writereg(av7110_t *av7110, u8 id, u8 reg, u8 val); +static inline u8 i2c_readreg(av7110_t *av7110, u8 id, u8 reg); +static int outcom(av7110_t *av7110, int type, int com, int num, ...); +static void SetMode(av7110_t *av7110, int mode); + +void pes_to_ts(u8 const *buf, long int length, u16 pid, p2t_t *p); +void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, dvb_demux_feed_t *feed); + +static u32 vidmem = 0; +static u32 vidlow = 0; + +static int av7110_debug = 0; +#define dprintk if (av7110_debug) printk + +static int vidmode=CVBS_RGB_OUT; +static int init_vpid; +static int init_apid; +static int pids_off; +static int adac=DVB_ADAC_TI; + +#define saacomm(x,y) av7110->saa->command(av7110->saa->i2c_bus, (x), (y)) + + +/**************************************************************************** + * General helper functions + ****************************************************************************/ + +static inline void ddelay(int i) +{ + current->state=TASK_INTERRUPTIBLE; + schedule_timeout((HZ*i)/100); +} + + +/**************************************************************************** + * GPIO and DEBI functions + ****************************************************************************/ + +#define saaread(adr) saa7146_read(saamem,(adr)) +#define saawrite(dat,adr) saa7146_write(saamem,(adr),(dat)) + +inline static void +setgpio(av7110_t *av7110, int port, u32 data) +{ + void *saamem=av7110->saa_mem; + u32 val; + + val=saaread(GPIO_CTRL); + val&=~(0xff << (8*(port))); + val|=(data)<<(8*(port)); + saawrite(val, GPIO_CTRL); +} + +/* This DEBI code is based on the Stradis driver + by Nathan Laredo */ + +static +int wait_for_debi_done(av7110_t *av7110) +{ + void *saamem=av7110->saa_mem; + int start; + + /* wait for registers to be programmed */ + start = jiffies; + while (1) { + if (saaread(MC2) & 2) + break; + if (jiffies-start > HZ/20) { + printk ("%s: timed out while waiting for registers " + "getting programmed\n", __FUNCTION__); + return -ETIMEDOUT; + } + } + + /* wait for transfer to complete */ + start = jiffies; + while (1) { + if (!(saaread(PSR) & SPCI_DEBI_S)) + break; + saaread(MC2); + if (jiffies-start > HZ/4) { + printk ("%s: timed out while waiting for transfer " + "completion\n", __FUNCTION__); + return -ETIMEDOUT; + } + } + + return 0; +} + +static int debiwrite(av7110_t *av7110, u32 config, + int addr, u32 val, int count) +{ + void *saamem=av7110->saa_mem; + u32 cmd; + + if (count <= 0 || count > 32764) + return -1; + if (wait_for_debi_done(av7110) < 0) + return -1; + saawrite(config, DEBI_CONFIG); + if (count <= 4) /* immediate transfer */ + saawrite(val, DEBI_AD); + else /* block transfer */ + saawrite(av7110->debi_bus, DEBI_AD); + saawrite((cmd = (count << 17) | (addr & 0xffff)), DEBI_COMMAND); + saawrite((2 << 16) | 2, MC2); + return 0; +} + +static u32 debiread(av7110_t *av7110, u32 config, int addr, int count) +{ + void *saamem=av7110->saa_mem; + u32 result = 0; + + if (count > 32764 || count <= 0) + return 0; + if (wait_for_debi_done(av7110) < 0) + return 0; + saawrite(av7110->debi_bus, DEBI_AD); + saawrite((count << 17) | 0x10000 | (addr & 0xffff), + DEBI_COMMAND); + + saawrite(config, DEBI_CONFIG); + saawrite((2 << 16) | 2, MC2); + if (count > 4) + return count; + wait_for_debi_done(av7110); + result = saaread(DEBI_AD); + result &= (0xffffffffUL >> ((4-count)*8)); + return result; +} + +/* DEBI during interrupt */ + +static inline void +iwdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count) +{ + if (count>4 && val) + memcpy(av7110->debi_virt, (char *) val, count); + debiwrite(av7110, config, addr, val, count); +} + +static inline u32 +irdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count) +{ + u32 res; + + res=debiread(av7110, config, addr, count); + if (count<=4) + memcpy(av7110->debi_virt, (char *) &res, count); + return res; +} + +/* DEBI outside interrupts, only for count<=4! */ + +static inline void +wdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count) +{ + unsigned long flags; + + spin_lock_irqsave(&av7110->debilock, flags); + debiwrite(av7110, config, addr, val, count); + spin_unlock_irqrestore(&av7110->debilock, flags); +} + +static inline u32 +rdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count) +{ + unsigned long flags; + u32 res; + + spin_lock_irqsave(&av7110->debilock, flags); + res=debiread(av7110, config, addr, count); + spin_unlock_irqrestore(&av7110->debilock, flags); + return res; +} + + +static inline char +chtrans(char c) +{ + if (c<32 || c>126) + c=0x20; + return c; +} + + +/* handle mailbox registers of the dual ported RAM */ + +static inline void +ARM_ResetMailBox(av7110_t *av7110) +{ + unsigned long flags; + + spin_lock_irqsave(&av7110->debilock, flags); + debiread(av7110, DEBINOSWAP, IRQ_RX, 2); + //printk("dvb: IRQ_RX=%d\n", debiread(av7110, DEBINOSWAP, IRQ_RX, 2)); + debiwrite(av7110, DEBINOSWAP, IRQ_RX, 0, 2); + spin_unlock_irqrestore(&av7110->debilock, flags); +} + +static inline void +ARM_ClearMailBox(av7110_t *av7110) +{ + iwdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2); +} + +static inline void +ARM_ClearIrq(av7110_t *av7110) +{ + irdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2); +} + +static void +reset_arm(av7110_t *av7110) +{ + setgpio(av7110, RESET_LINE, GPIO_OUTLO); + + /* Disable DEBI and GPIO irq */ + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) & ~(MASK_19 | MASK_03)); + saa7146_write(av7110->saa_mem, ISR, (MASK_19 | MASK_03)); + + mdelay(800); + setgpio(av7110, RESET_LINE, GPIO_OUTHI); + mdelay(800); + + ARM_ResetMailBox(av7110); + + saa7146_write(av7110->saa_mem, ISR, (MASK_19 | MASK_03)); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_03 ); + + av7110->arm_ready=1; + printk("av7110: ARM RESET\n"); +} + +static void +recover_arm(av7110_t *av7110) +{ + if (current->files) + bootarm(av7110); + else { + printk("OOPS, no current->files\n"); + reset_arm(av7110); + } + ddelay(10); + restart_feeds(av7110); +} + +static void +arm_error(av7110_t *av7110) +{ + av7110->arm_errors++; + av7110->arm_ready=0; + recover_arm(av7110); +} + +static int arm_thread(void *data) +{ + av7110_t *av7110 = data; + u16 newloops; + + lock_kernel(); +#if 0 + daemonize(); +#else + exit_mm(current); + current->session=current->pgrp=1; +#endif + sigfillset(¤t->blocked); + strcpy(current->comm, "arm_mon"); + av7110->arm_thread = current; + unlock_kernel(); + + while (!av7110->arm_rmmod && !signal_pending(current)) { + interruptible_sleep_on_timeout(&av7110->arm_wait, 5*HZ); + + if (!av7110->arm_ready) + continue; + + if (down_interruptible(&av7110->dcomlock)) + break; + + newloops=rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2); + up(&av7110->dcomlock); + + if (newloops==av7110->arm_loops) { + printk("av7110%d: ARM crashed!\n", + av7110->saa->dvb_adapter->num); + + arm_error(av7110); + + if (down_interruptible(&av7110->dcomlock)) + break; + + newloops=rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2)-1; + up(&av7110->dcomlock); + } + av7110->arm_loops=newloops; + } + + av7110->arm_thread = NULL; + return 0; +} + + +static int +record_cb(pes2ts_t *p2t, u8 *buf, size_t len) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) p2t->priv; + + if (!(dvbdmxfeed->ts_type & TS_PACKET)) + return 0; + if (buf[3]==0xe0) // video PES do not have a length in TS + buf[4]=buf[5]=0; + if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY) + return dvbdmxfeed->cb.ts(buf, len, 0, 0, + &dvbdmxfeed->feed.ts, DMX_OK); + else + return pes2ts(p2t, buf, len); +} + +static int +pes2ts_cb(void *priv, unsigned char *data) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) priv; + + dvbdmxfeed->cb.ts(data, 188, 0, 0, + &dvbdmxfeed->feed.ts, + DMX_OK); + return 0; +} + +static int +AV_StartRecord(av7110_t *av7110, int av, + dvb_demux_feed_t *dvbdmxfeed) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + + if (av7110->playing||(av7110->rec_mode&av)) + return -EBUSY; + outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0); + dvbdmx->recording=1; + av7110->rec_mode|=av; + + switch (av7110->rec_mode) { + case RP_AUDIO: + pes2ts_init(&av7110->p2t[0], dvbdmx->pesfilter[0]->pid, + pes2ts_cb, (void *)dvbdmx->pesfilter[0]); + outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); + break; + case RP_VIDEO: + pes2ts_init(&av7110->p2t[1], dvbdmx->pesfilter[1]->pid, + pes2ts_cb, (void *)dvbdmx->pesfilter[1]); + outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); + break; + case RP_AV: + pes2ts_init(&av7110->p2t[0], dvbdmx->pesfilter[0]->pid, + pes2ts_cb, (void *)dvbdmx->pesfilter[0]); + pes2ts_init(&av7110->p2t[1], dvbdmx->pesfilter[1]->pid, + pes2ts_cb, (void *)dvbdmx->pesfilter[1]); + outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AV_PES, 0); + break; + } + return 0; +} + +static int +AV_StartPlay(av7110_t *av7110, int av) +{ + if (av7110->rec_mode) + return -EBUSY; + if (av7110->playing&av) + return -EBUSY; + + outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0); + + if (av7110->playing == RP_NONE) { + reset_ipack(&av7110->ipack[0]); + reset_ipack(&av7110->ipack[1]); + } + + av7110->playing|=av; + switch (av7110->playing) { + case RP_AUDIO: + outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); + break; + case RP_VIDEO: + outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); + av7110->sinfo=0; + break; + case RP_AV: + av7110->sinfo=0; + outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AV_PES, 0); + break; + } + return av7110->playing; +} + +static void +AV_Stop(av7110_t *av7110, int av) +{ + if (!(av7110->playing&av) && !(av7110->rec_mode&av)) + return; + + outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0); + if (av7110->playing) { + av7110->playing&=~av; + switch (av7110->playing) { + case RP_AUDIO: + outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); + break; + case RP_VIDEO: + outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); + break; + case RP_NONE: + SetMode(av7110, av7110->vidmode); + break; + } + } else { + av7110->rec_mode&=~av; + switch (av7110->rec_mode) { + case RP_AUDIO: + outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); + break; + case RP_VIDEO: + outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); + break; + case RP_NONE: + break; + } + } +} + +/**************************************************************************** + * Buffer handling + ****************************************************************************/ + +static inline void +ring_buffer_flush(ring_buffer_t *rbuf) +{ + spin_lock_irq(&rbuf->lock); + rbuf->pwrite=rbuf->pread; + spin_unlock_irq(&rbuf->lock); + wake_up(&rbuf->queue); +} + +static inline void +ring_buffer_init(ring_buffer_t *rbuf, u8 *data, int len) +{ + rbuf->pread=rbuf->pwrite=0; + rbuf->data=data; + rbuf->size=len; + init_waitqueue_head(&rbuf->queue); + spin_lock_init(&(rbuf->lock)); + rbuf->lock=SPIN_LOCK_UNLOCKED; + sema_init(&(rbuf->sema), 1); +} + +static inline +int ring_buffer_empty(ring_buffer_t *rbuf) +{ + return (rbuf->pread==rbuf->pwrite); +} + +static inline +int ring_buffer_free(ring_buffer_t *rbuf) +{ + int free; + + free=rbuf->pread - rbuf->pwrite; + if (free<=0) + free+=rbuf->size; + return free; +} + +static inline +int ring_buffer_avail(ring_buffer_t *rbuf) +{ + int avail; + + avail=rbuf->pwrite - rbuf->pread; + if (avail<0) + avail+=rbuf->size; + return avail; +} + +#if 0 +static void +ring_buffer_block(ring_buffer_t *rbuf, unsigned long count) +{ + if (ring_buffer_free(rbuf)>=count) + return; + while (!wait_event_interruptible(rbuf->queue, + (ring_buffer_free(rbuf)>=count))); +} +#endif + +static long +ring_buffer_write(ring_buffer_t *rbuf, + const char *buf, unsigned long count, + int nonblock, int usermem) +{ + unsigned long todo = count; + int free, split; + + while (todo > 0) { + if (ring_buffer_free(rbuf)<=2048) { + if (nonblock) + return count-todo; + if (wait_event_interruptible(rbuf->queue, + (ring_buffer_free(rbuf)>2048))) + return count-todo; + } + dprintk ("function: %s pread=%08x pwrite=%08x\n", __FUNCTION__, + rbuf->pread, rbuf->pwrite); + //mdelay(2); + free = rbuf->pread - rbuf->pwrite; + split=rbuf->size; + if (free<=0) { + free+=rbuf->size; + split-=rbuf->pwrite; + } + if (free > todo) + free = todo; + + if (split < free) { + if (!usermem) + memcpy(rbuf->data+rbuf->pwrite, buf, split); + else + if (copy_from_user(rbuf->data+rbuf->pwrite, + buf, split)) + return -EFAULT; + buf += split; + todo -= split; + free -= split; + rbuf->pwrite = 0; + } + if (!usermem) + memcpy(rbuf->data+rbuf->pwrite, buf, free); + else + if (copy_from_user(rbuf->data+rbuf->pwrite, buf, free)) + return -EFAULT; + rbuf->pwrite = (rbuf->pwrite + free)%rbuf->size; + todo -= free; + buf += free; + } + + return count-todo; +} + +#if 0 +static void +ring_buffer_put(ring_buffer_t *db, u8 *buf, int len) +{ + int split, fsize; + + fsize=db->pread - db->pwrite; + if (fsize <= 0) { + fsize+=db->size; + split=db->size-db->pwrite; + } else + split=0; + if (len>=fsize) { + dprintk("buffer overflow\n"); + return; + } + if (split>=len) + split=0; + if (split) { + memcpy(db->data + db->pwrite, buf, split); + len-=split; + db->pwrite=0; + } + memcpy(db->data + db->pwrite, split + buf, len); + db->pwrite=(db->pwrite+len)%db->size; +} +#endif + + +/**************************************************************************** + * TT budget / WinTV Nova + ****************************************************************************/ + +static int +TTBStop(av7110_t *av7110) +{ + if (--av7110->feeding) + return av7110->feeding; + saa7146_write(av7110->saa_mem, MC1, MASK_20); // DMA3 off + saa7146_write(av7110->saa_mem, MC1, MASK_28); // RPS0 off + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) & ~MASK_10 ); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER)& ~MASK_07); + return 0; +} + +#define TS_WIDTH (4*188) +#define TS_HEIGHT (1024/4) +static int +TTBStart(av7110_t *av7110) +{ + struct saa7146 *saa=av7110->saa; + + //printk ("function : %s\n", __FUNCTION__); + if (av7110->feeding) + return ++av7110->feeding; + + saa7146_write(saa->mem, MC1, MASK_20); // DMA3 off + + memset(saa->grabbing, 0x00, TS_HEIGHT*TS_WIDTH); + + saa7146_write(saa->mem, PCI_BT_V1, 0x001c0000); + + av7110->tsf=0; + av7110->ttbp=0; + saa7146_write(saa->mem, DD1_INIT, 0x02000680); + saa7146_write(saa->mem, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); + + saa7146_write(saa->mem, BRS_CTRL, 0x60000000); + saa7146_write(saa->mem, MC2, (MASK_08 | MASK_24)); + mdelay(10); + + saa7146_write(saa->mem, BASE_ODD3, 0); + saa7146_write(saa->mem, BASE_EVEN3, TS_WIDTH*TS_HEIGHT/2); + saa7146_write(saa->mem, PROT_ADDR3, TS_WIDTH*TS_HEIGHT); + saa7146_write(saa->mem, BASE_PAGE3, virt_to_bus(saa->page_table[0])|ME1|0xb0); + saa7146_write(saa->mem, PITCH3, TS_WIDTH); + + saa7146_write(saa->mem, NUM_LINE_BYTE3, ((TS_HEIGHT/2)<<16)|TS_WIDTH); + saa7146_write(saa->mem, MC2, (MASK_04 | MASK_20)); + + // VPE + saa7146_write(saa->mem, IER, saa7146_read(saa->mem, IER)|MASK_10); + + saa7146_write(saa->mem, MC1, (MASK_04 | MASK_20)); // DMA3 on + + // FIDB + saa7146_write(saa->mem, IER, saa7146_read(saa->mem, IER)|MASK_07); + + return ++av7110->feeding; +} + +/** + * Hack! we save the last av7110 ptr. This should be ok, since + * you rarely will use more then one IR control. + * + * If we want to support multiple controls we would have to do much more... + */ +void av7110_setup_irc_config (av7110_t *av7110, u32 ir_config) +{ + static av7110_t *last; + + if (!av7110) + av7110 = last; + else + last = av7110; + + outcom(av7110, COMTYPE_PIDFILTER, SetIR, 1, ir_config); +} + +static void (*irc_handler)(u32); + +void av7110_register_irc_handler(void (*func)(u32)) +{ + //dprintk("registering %08x\n",func); + irc_handler = func; +} + +void av7110_unregister_irc_handler(void (*func)(u32)) +{ + //dprintk("unregistering %08x\n",func); + irc_handler = NULL; +} + +void run_handlers(unsigned long ircom) +{ + if (irc_handler != NULL) + (*irc_handler)((u32) ircom); +} + +DECLARE_TASKLET(irtask,run_handlers,0); + +void IR_handle(av7110_t *av7110, u32 ircom) +{ + dprintk("av7110: ircommand = %08x\n", ircom); + irtask.data = (unsigned long) ircom; + tasklet_schedule(&irtask); +} + +/**************************************************************************** + * IRQ handling + ****************************************************************************/ + +void CI_handle(av7110_t *av7110, u8 *data, u16 len) +{ + //CI_out(av7110, data, len); + + if (len<3) + return; + switch (data[0]) { + case CI_MSG_CI_INFO: + if (data[2]!=1 && data[2]!=2) + break; + switch (data[1]) { + case 0: + av7110->ci_slot[data[2]-1].flags=0; + break; + case 1: + av7110->ci_slot[data[2]-1].flags|=CA_CI_MODULE_PRESENT; + break; + case 2: + av7110->ci_slot[data[2]-1].flags|=CA_CI_MODULE_READY; + break; + } + break; + case CI_SWITCH_PRG_REPLY: + //av7110->ci_stat=data[1]; + break; + default: + break; + } + +} + +static inline int +DvbDmxFilterCallback(u8 * buffer1, size_t buffer1_len, + u8 * buffer2, size_t buffer2_len, + dvb_demux_filter_t *dvbdmxfilter, + dmx_success_t success, + av7110_t *av7110) +{ + if (!dvbdmxfilter->feed->demux->dmx.frontend) + return 0; + if (dvbdmxfilter->feed->demux->dmx.frontend->source==DMX_MEMORY_FE) + return 0; + + switch(dvbdmxfilter->type) { + case DMX_TYPE_SEC: + if ((((buffer1[1]<<8)|buffer1[2])&0xfff)+3!=buffer1_len) + return 0; + if (dvbdmxfilter->doneq) { + dmx_section_filter_t *filter=&dvbdmxfilter->filter; + int i; + u8 xor, neq=0; + + for (i=0; ifilter_value[i]^buffer1[i]; + neq|=dvbdmxfilter->maskandnotmode[i]&xor; + } + if (!neq) + return 0; + } + return dvbdmxfilter->feed->cb.sec(buffer1, buffer1_len, + buffer2, buffer2_len, + &dvbdmxfilter->filter, + DMX_OK); + case DMX_TYPE_TS: + if (!(dvbdmxfilter->feed->ts_type & TS_PACKET)) + return 0; + if (dvbdmxfilter->feed->ts_type & TS_PAYLOAD_ONLY) + return dvbdmxfilter->feed->cb.ts(buffer1, buffer1_len, + buffer2, buffer2_len, + &dvbdmxfilter->feed->feed.ts, + DMX_OK); + else + pes_to_ts(buffer1, buffer1_len, + dvbdmxfilter->feed->pid, + &av7110->p2t_filter[dvbdmxfilter->index]); + default: + return 0; + } +} + + +u8 pshead[0x26] = { + 0x00, 0x00, 0x01, 0xba, 0x5f, 0xff, 0xfe, 0xe6, + 0xc4, 0x01, 0x01, 0x89, 0xc3, 0xf8, 0x00, 0x00, + 0x01, 0xbb, 0x00, 0x12, 0x80, 0xc4, 0xe1, 0x00, + 0xe1, 0xff, 0xb9, 0xe0, 0xe8, 0xb8, 0xc0, 0x20, + 0xbd, 0xe0, 0x44, 0xbf, 0xe0, 0x02, +}; + + +static void vpeirq (unsigned long data) +{ + //printk("vpeirq %08x\n", saa7146_read(av7110->saa_mem, PCI_VDP3)); +} + +#if 0 +static void fidbirq(struct saa7146* saa, void *data) +{ + av7110_t *av7110=(av7110_t *) data; + u8 *mem; + + mem=(av7110->tsf ? TS_HEIGHT*TS_WIDTH/2 :0)+(u8 *)av7110->saa->grabbing; + + // FIXME: think of something better without busy waiting + if (av7110->tsf) + while (saa7146_read(av7110->saa_mem, PCI_VDP3)>0x20000); + else + while (saa7146_read(av7110->saa_mem, PCI_VDP3)<0x17800); + + av7110->tsf^=1; + saa7146_write(av7110->saa_mem, DD1_INIT, 0x02000600|(av7110->tsf ? 0x40:0x80)); + saa7146_write(av7110->saa_mem, MC2, + (MASK_09 | MASK_25 | MASK_10 | MASK_26)); + + // FIXME: use bottom half or tasklet + if (av7110->feeding && mem[0]==0x47) + DvbDmxSWFilterPackets(&av7110->demux, mem, 512); +} +#else +static +void fidbirq (unsigned long data) +{ + struct av7110_s *av7110 = (struct av7110_s*) data; + u8 *mem=(u8 *)(av7110->saa->grabbing); + int num; + u32 dmapos; + + dmapos=saa7146_read(av7110->saa_mem, PCI_VDP3); + dmapos-=(dmapos%188); + + if (av7110->tsf) { + mem+=av7110->ttbp; + if (dmapos<0x20000) { + num=1024-av7110->ttbp/188; + av7110->ttbp=0; + } else { + num=(dmapos - av7110->ttbp)/188; + av7110->ttbp=dmapos; + } + } else { + if (av7110->ttbp>1000*188 && av7110->ttbp<1024*188) { + if (av7110->feeding) + DvbDmxSWFilterPackets(&av7110->demux, + mem+av7110->ttbp, + 1024- av7110->ttbp / 188); + } + num=dmapos/188; + av7110->ttbp=dmapos; + } + + av7110->tsf^=1; + saa7146_write(av7110->saa_mem, DD1_INIT, 0x02000600|(av7110->tsf ? 0x40:0x80)); + saa7146_write(av7110->saa_mem, MC2, + (MASK_09 | MASK_25 | MASK_10 | MASK_26)); + + // FIXME: use bottom half or tasklet + if (av7110->feeding && mem[0]==0x47) + DvbDmxSWFilterPackets(&av7110->demux, mem, num); +} +#endif + +//#define DEBUG_TIMING +inline static void +print_time(char *s) +{ +#ifdef DEBUG_TIMING + struct timeval tv; + do_gettimeofday(&tv); + printk("%s: %d.%d\n", s, (int)tv.tv_sec, (int)tv.tv_usec); +#endif +} + +static void +ci_get_data(ring_buffer_t *cibuf, u8 *data, int len) +{ + int free, split=0, pread=cibuf->pread; + + free=pread-cibuf->pwrite; + if (free<=0) + free+=cibuf->size; + if (free<=len+2) + return; + cibuf->data[cibuf->pwrite]=(len>>8); + cibuf->data[(cibuf->pwrite+1)%cibuf->size]=(len&0xff); + cibuf->pwrite=(cibuf->pwrite+2)%cibuf->size; + + if (pread<=cibuf->pwrite) + split=cibuf->size-cibuf->pwrite; + if (split && splitdata + cibuf->pwrite, data, split); + memcpy(cibuf->data, data+split, len-split); + } else + memcpy(cibuf->data + cibuf->pwrite, data, len); + cibuf->pwrite=(cibuf->pwrite+len)%cibuf->size; + + wake_up_interruptible(&cibuf->queue); +} + +static +void debiirq (unsigned long data) +{ + struct av7110_s *av7110 = (struct av7110_s*) data; + int type=av7110->debitype; + int handle=(type>>8)&0x1f; + + print_time("debi"); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) & ~MASK_19 ); + saa7146_write(av7110->saa_mem, ISR, MASK_19 ); + + if (type==-1) { + printk("DEBI irq oops\n"); + ARM_ClearMailBox(av7110); + ARM_ClearIrq(av7110); + return; + } + av7110->debitype=-1; + + switch (type&0xff) { + + case DATA_TS_RECORD: + DvbDmxSWFilterPackets(&av7110->demux, + (const u8 *)av7110->debi_virt, + av7110->debilen/188); + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + break; + + case DATA_PES_RECORD: + if (av7110->demux.recording) + record_cb(&av7110->p2t[handle], + (u8 *)av7110->debi_virt, + av7110->debilen); + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + return; + + case DATA_IPMPE: + case DATA_FSECTION: + case DATA_PIPING: + if (av7110->handle2filter[handle]) + DvbDmxFilterCallback((u8 *)av7110->debi_virt, + av7110->debilen, 0, 0, + av7110->handle2filter[handle], + DMX_OK, av7110); + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + return; + + case DATA_CI_GET: + { + u8 *data=av7110->debi_virt; + + if ((data[0]<2) && data[2]==0xff) { + int flags=0; + if (data[5]>0) + flags|=CA_CI_MODULE_PRESENT; + if (data[5]>5) + flags|=CA_CI_MODULE_READY; + av7110->ci_slot[data[0]].flags=flags; + } else + ci_get_data(&av7110->ci_rbuffer, + av7110->debi_virt, + av7110->debilen); + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + return; + } + + case DATA_COMMON_INTERFACE: + CI_handle(av7110, (u8 *)av7110->debi_virt, av7110->debilen); +#if 0 + { + int i; + + printk("av7110%d: ", av7110->num); + printk("%02x ", *(u8 *)av7110->debi_virt); + printk("%02x ", *(1+(u8 *)av7110->debi_virt)); + for (i=2; idebilen; i++) + printk("%02x ", (*(i+(unsigned char *)av7110->debi_virt))); + for (i=2; idebilen; i++) + printk("%c", chtrans(*(i+(unsigned char *)av7110->debi_virt))); + + printk("\n"); + } +#endif + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + return; + + case DATA_DEBUG_MESSAGE: + ((s8*)av7110->debi_virt)[Reserved_SIZE-1]=0; + printk("%s\n", (s8 *)av7110->debi_virt); + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + return; + + case DATA_CI_PUT: + case DATA_MPEG_PLAY: + case DATA_BMP_LOAD: + spin_lock(&av7110->debilock); + iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); + return; + default: + break; + } + spin_lock(&av7110->debilock); + ARM_ClearMailBox(av7110); + spin_unlock(&av7110->debilock); +} + +static int +pes_play(void *dest, ring_buffer_t *buf, int dlen) +{ + int len, split=0; + u32 sync; + u16 blen; + + dprintk ("function : %s\n", __FUNCTION__); + if (!dlen) { + wake_up(&buf->queue); + return -1; + } + while (1) { + if ((len=ring_buffer_avail(buf)) < 6) + return -1; + sync=(buf->data[buf->pread])<<24; + sync|=(buf->data[(buf->pread+1)%buf->size]<<16); + sync|=(buf->data[(buf->pread+2)%buf->size]<<8); + sync|=buf->data[(buf->pread+3)%buf->size]; + + if (((sync&~0x1f)==0x000001e0) || + ((sync&~0x1f)==0x000001c0) || + (sync==0x000001bd)) + break; + printk("resync\n"); + buf->pread=(buf->pread+1)%buf->size; + } + blen=(buf->data[(buf->pread+4)%buf->size]<<8); + blen|=buf->data[(buf->pread+5)%buf->size]; + blen+=6; + if (len dlen) { + printk("buffer empty\n"); + wake_up(&buf->queue); + return -1; + } +/* if (blen>2048) { + buf->pread=(buf->pread+blen)%buf->size; + printk("packet too large\n"); + return -1; + } +*/ + len=blen; + if (buf->pread + len > buf->size) + split=buf->size-buf->pread; + if (split>0) { + memcpy(dest, buf->data+buf->pread, split); + buf->pread=0; + len-=split; + } + memcpy(split + dest, + buf->data + buf->pread, len); + buf->pread = (buf->pread +len)%buf->size; + + dprintk ("function: %s pread=%08x pwrite=%08x\n", __FUNCTION__, + buf->pread, buf->pwrite); + wake_up(&buf->queue); + return blen; +} + +static +void gpioirq (unsigned long data) +{ + struct av7110_s *av7110 = (struct av7110_s*) data; + u32 rxbuf, txbuf; + int len; + + //printk("GPIO0 irq\n"); + + if (av7110->debitype !=-1) + printk("GPIO0 irq oops\n"); + + spin_lock(&av7110->debilock); + + ARM_ClearIrq(av7110); + + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) & ~MASK_19 ); + saa7146_write(av7110->saa_mem, ISR, MASK_19 ); + + av7110->debitype = irdebi(av7110, DEBINOSWAP, IRQ_STATE, 0, 2); + av7110->debilen = irdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2); + av7110->debibuf = 0; + rxbuf=irdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + txbuf=irdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2); + len=(av7110->debilen+3)&(~3); + + dprintk("GPIO0 irq %d %d\n", av7110->debitype, av7110->debilen); + print_time("gpio"); + + dprintk("GPIO0 irq %02x\n", av7110->debitype&0xff); + switch (av7110->debitype&0xff) { + + case DATA_TS_PLAY: + case DATA_PES_PLAY: + break; + + case DATA_CI_PUT: + { + int avail, split=0, pwrite; + ring_buffer_t *cibuf=&av7110->ci_wbuffer; + + pwrite=cibuf->pwrite; + avail=pwrite-cibuf->pread; + if (avail<0) + avail+=cibuf->size; + if (avail<=2) { + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2); + break; + } + len=(cibuf->data[cibuf->pread]<<8); + len|=cibuf->data[(cibuf->pread+1)%cibuf->size]; + if (availpread=(cibuf->pread+2)%cibuf->size; + + if (pwritepread) + split=cibuf->size-cibuf->pread; + if (split && splitdebi_virt, cibuf->data+cibuf->pread, split); + memcpy(av7110->debi_virt+split, cibuf->data, todo); + } else + memcpy(av7110->debi_virt, cibuf->data+cibuf->pread, len); + cibuf->pread=(cibuf->pread+len)%cibuf->size; + wake_up(&cibuf->queue); + iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2); + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2); + wait_for_debi_done(av7110); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_19 ); + if (len<5) len=5; /* we want a real DEBI DMA */ + iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3); + spin_unlock(&av7110->debilock); + return; + } + + case DATA_MPEG_PLAY: + if (!av7110->playing) { + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2); + break; + } + len=0; + if (av7110->debitype&0x100) { + spin_lock(&av7110->aout.lock); + len=pes_play(av7110->debi_virt, &av7110->aout, 2048); + spin_unlock(&av7110->aout.lock); + } + if (len<=0 && (av7110->debitype&0x200) + &&av7110->videostate.play_state!=VIDEO_FREEZED) { + spin_lock(&av7110->avout.lock); + len=pes_play(av7110->debi_virt, &av7110->avout, 2048); + spin_unlock(&av7110->avout.lock); + } + if (len<=0) { + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2); + break; + } + dprintk("GPIO0 PES_PLAY len=%04x\n", len); + iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2); + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2); + wait_for_debi_done(av7110); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_19 ); + + iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3); + spin_unlock(&av7110->debilock); + return; + + case DATA_BMP_LOAD: + len=av7110->debilen; + if (!len) { + av7110->bmp_state=BMP_LOADED; + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2); + iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2); + wake_up(&av7110->bmpq); + break; + } + if (len>av7110->bmplen) + len=av7110->bmplen; + if (len>2*1024) + len=2*1024; + iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2); + iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2); + memcpy(av7110->debi_virt, av7110->bmpbuf+av7110->bmpp, len); + av7110->bmpp+=len; + av7110->bmplen-=len; + wait_for_debi_done(av7110); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_19 ); + if (len<5) len=5; /* we want a real DEBI DMA */ + iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3); + spin_unlock(&av7110->debilock); + return; + + case DATA_CI_GET: + case DATA_COMMON_INTERFACE: + case DATA_FSECTION: + case DATA_IPMPE: + case DATA_PIPING: + if (!len || len>4*1024) { + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + break; + } /* yes, fall through */ + case DATA_TS_RECORD: + case DATA_PES_RECORD: + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_19); + irdebi(av7110, DEBISWAB, DPRAM_BASE+rxbuf, 0, len); + spin_unlock(&av7110->debilock); + return; + + case DATA_DEBUG_MESSAGE: + if (!len || len>0xff) { + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + break; + } + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_19); + irdebi(av7110, DEBISWAB, Reserved, 0, len); + spin_unlock(&av7110->debilock); + return; + + case DATA_IRCOMMAND: + IR_handle(av7110, + swahw32(irdebi(av7110, DEBINOSWAP, Reserved, 0, 4))); + iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2); + break; + + default: + printk("gpioirq unknown type=%d len=%d\n", + av7110->debitype, av7110->debilen); + break; + } + ARM_ClearMailBox(av7110); + av7110->debitype=-1; + spin_unlock(&av7110->debilock); + dprintk("GPIO0 irq exit 0\n"); +} + + +/**************************************************************************** + * DEBI command polling + ****************************************************************************/ + + +static int OutCommand(av7110_t *av7110, u16* buf, int length) +{ + int i; + u32 start; + + if (!av7110->arm_ready) + return -1; + + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2 ) ) + { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_FREE) { + printk("outcommand error 1\n"); + //arm_error(av7110); + return -1; + } + } + +#ifndef _NOHANDSHAKE + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) + { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_SHAKE) { + printk("outcommand error 2\n"); + //arm_error(av7110); + return -1; + } + } +#endif + + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2) & OSDQFull ) + { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_OSD) + { + printk("outcommand error 3\n"); + //arm_error(av7110); + return -1; + } + } + for (i=2; iarm_ready) + return -1; + + if (down_interruptible(&av7110->dcomlock)) + return -ERESTARTSYS; + + ret=OutCommand(av7110, buf, length); + up(&av7110->dcomlock); + return ret; +} + + +static int outcom(av7110_t *av7110, int type, int com, int num, ...) +{ + va_list args; + u16 buf[num+2]; + int i; + + buf[0]=(( type << 8 ) | com); + buf[1]=num; + + if (num) { + va_start(args, num); + for (i=0; iarm_ready) + return -1; + + if (down_interruptible(&av7110->dcomlock)) + return -ERESTARTSYS; + + if ((err = OutCommand(av7110, Buff, length)) < 0) { + up(&av7110->dcomlock); + return err; + } + + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2) ) + { +#ifdef _NOHANDSHAKE + ddelay(1); +#endif + if ((jiffies - start) > ARM_WAIT_FREE) { + printk("commandrequest error 1\n"); + up(&av7110->dcomlock); + //arm_error(av7110); + return -1; + } + } + +#ifndef _NOHANDSHAKE + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_SHAKE) { + printk("commandrequest error 2\n"); + up(&av7110->dcomlock); + //arm_error(av7110); + return -1; + } + } +#endif + + for (i=0; idcomlock); + return 0; +} + + +static inline int +RequestParameter(av7110_t *av7110, u16 tag, u16* Buff, s16 length) +{ + return CommandRequest(av7110, &tag, 0, Buff, length); +} + + +/**************************************************************************** + * Firmware commands + ****************************************************************************/ + + +inline static int +SendDAC(av7110_t *av7110, u8 addr, u8 data) +{ + return outcom(av7110, COMTYPE_AUDIODAC, AudioDAC, 2, addr, data); +} + +static int +SetVolume(av7110_t *av7110, int volleft, int volright) +{ + int err; + + switch (av7110->adac_type) { + case DVB_ADAC_TI: + volleft=(volleft*256)/946; + volright=(volright*256)/946; + if (volleft > 0x45) + volleft=0x45; + if (volright > 0x45) + volright=0x45; + err=SendDAC(av7110, 3, 0x80 + volleft); + if (err) + return err; + return SendDAC(av7110, 4, volright); + + case DVB_ADAC_CRYSTAL: + volleft=127-volleft/2; + volright=127-volright/2; + i2c_writereg(av7110, 0x20, 0x03, volleft); + i2c_writereg(av7110, 0x20, 0x04, volright); + return 0; + } + return 0; +} + +#ifdef CONFIG_DVB_AV7110_OSD + +inline static int ResetBlend(av7110_t *av7110, u8 windownr) +{ + return outcom(av7110, COMTYPE_OSD, SetNonBlend, 1, windownr); +} + +inline static int SetColorBlend(av7110_t *av7110, u8 windownr) +{ + return outcom(av7110, COMTYPE_OSD, SetCBlend, 1, windownr); +} + +inline static int SetWindowBlend(av7110_t *av7110, u8 windownr, u8 blending) +{ + return outcom(av7110, COMTYPE_OSD, SetWBlend, 2, windownr, blending); +} + +inline static int SetBlend_(av7110_t *av7110, u8 windownr, + OSDPALTYPE colordepth, u16 index, u8 blending) +{ + return outcom(av7110, COMTYPE_OSD, SetBlend, 4, + windownr, colordepth, index, blending); +} + +inline static int SetColor_(av7110_t *av7110, u8 windownr, + OSDPALTYPE colordepth, u16 index, u16 colorhi, u16 colorlo) +{ + return outcom(av7110, COMTYPE_OSD, SetColor, 5, + windownr, colordepth, index, colorhi, colorlo); +} + +inline static int BringToTop(av7110_t *av7110, u8 windownr) +{ + return outcom(av7110, COMTYPE_OSD, WTop, 1, windownr); +} + +inline static int SetFont(av7110_t *av7110, u8 windownr, u8 fontsize, + u16 colorfg, u16 colorbg) +{ + return outcom(av7110, COMTYPE_OSD, Set_Font, 4, + windownr, fontsize, colorfg, colorbg); +} + +static int FlushText(av7110_t *av7110) +{ + u32 start; + + if (down_interruptible(&av7110->dcomlock)) + return -ERESTARTSYS; + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_OSD) { + printk("outtext error\n"); + up(&av7110->dcomlock); + //arm_error(av7110); + return -1; + } + } + up(&av7110->dcomlock); + return 0; +} + +static int WriteText(av7110_t *av7110, u8 win, u16 x, u16 y, u8* buf) +{ + int i, ret; + u32 start; + int length=strlen(buf)+1; + u16 cbuf[5] = { (COMTYPE_OSD<<8) + DText, 3, win, x, y }; + + if (down_interruptible(&av7110->dcomlock)) + return -ERESTARTSYS; + + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_OSD) { + printk("outtext error\n"); + up(&av7110->dcomlock); + //arm_error(av7110); + return -1; + } + } +#ifndef _NOHANDSHAKE + start = jiffies; + while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) { + ddelay(1); + if ((jiffies - start) > ARM_WAIT_SHAKE) { + printk("outtext error\n"); + up(&av7110->dcomlock); + //arm_error(av7110); + return -1; + } + } +#endif + for (i=0; idcomlock); + return ret; +} + +inline static int DrawLine(av7110_t *av7110, u8 windownr, + u16 x, u16 y, u16 dx, u16 dy, u16 color) +{ + return outcom(av7110, COMTYPE_OSD, DLine, 6, + windownr, x, y, dx, dy, color); +} + +inline static int DrawBlock(av7110_t *av7110, u8 windownr, + u16 x, u16 y, u16 dx, u16 dy, u16 color) +{ + return outcom(av7110, COMTYPE_OSD, DBox, 6, + windownr, x, y, dx, dy, color); +} + +inline static int HideWindow(av7110_t *av7110, u8 windownr) +{ + return outcom(av7110, COMTYPE_OSD, WHide, 1, windownr); +} + +inline static int MoveWindowRel(av7110_t *av7110, u8 windownr, u16 x, u16 y) +{ + return outcom(av7110, COMTYPE_OSD, WMoveD, 3, windownr, x, y); +} + +inline static int MoveWindowAbs(av7110_t *av7110, u8 windownr, u16 x, u16 y) +{ + return outcom(av7110, COMTYPE_OSD, WMoveA, 3, windownr, x, y); +} + +inline static int DestroyOSDWindow(av7110_t *av7110, u8 windownr) +{ + return outcom(av7110, COMTYPE_OSD, WDestroy, 1, windownr); +} + +#if 0 +static void DestroyOSDWindows(av7110_t *av7110) +{ + int i; + + for (i=1; i<7; i++) + outcom(av7110, COMTYPE_OSD, WDestroy, 1, i); +} +#endif + +static inline int +CreateOSDWindow(av7110_t *av7110, u8 windownr, + DISPTYPE disptype, u16 width, u16 height) +{ + return outcom(av7110, COMTYPE_OSD, WCreate, 4, + windownr, disptype, width, height); +} + + +static OSDPALTYPE bpp2pal[8]={Pal1Bit, Pal2Bit, 0, Pal4Bit, 0, 0, 0, Pal8Bit}; +static DISPTYPE bpp2bit[8]={BITMAP1, BITMAP2, 0, BITMAP4, 0, 0, 0, BITMAP8}; + +static inline int +LoadBitmap(av7110_t *av7110, u16 format, u16 dx, u16 dy, int inc, u8* data) +{ + int bpp; + int i; + int d, delta; + u8 c; + DECLARE_WAITQUEUE(wait, current); + + if (av7110->bmp_state==BMP_LOADING) { + add_wait_queue(&av7110->bmpq, &wait); + while (1) { + set_current_state(TASK_INTERRUPTIBLE); + if (av7110->bmp_state!=BMP_LOADING + || signal_pending(current)) + break; + schedule(); + } + current->state=TASK_RUNNING; + remove_wait_queue(&av7110->bmpq, &wait); + } + if (av7110->bmp_state==BMP_LOADING) + return -1; + av7110->bmp_state=BMP_LOADING; + if (format==BITMAP8) { bpp=8; delta = 1; } + else if (format==BITMAP4) { bpp=4; delta = 2; } + else if (format==BITMAP2) { bpp=2; delta = 4; } + else if (format==BITMAP1) { bpp=1; delta = 8; } + else { + av7110->bmp_state=BMP_NONE; + return -1; + } + av7110->bmplen= ((dx*dy*bpp+7)&~7)/8; + av7110->bmpp=0; + if (av7110->bmplen>32768) { + av7110->bmp_state=BMP_NONE; + return -1; + } + for (i=0; ibmpbuf+1024+i*dx, data+i*inc, dx)) { + av7110->bmp_state=BMP_NONE; + return -1; + } + } + if (format != BITMAP8) { + for (i=0; ibmpbuf)[1024+i*delta+delta-1]; + for (d=delta-2; d>=0; d--) { + c |= (((u8 *)av7110->bmpbuf)[1024+i*delta+d] + << ((delta-d-1)*bpp)); + ((u8 *)av7110->bmpbuf)[1024+i] = c; + } + } + } + av7110->bmplen+=1024; + return outcom(av7110, COMTYPE_OSD, LoadBmp, 3, format, dx, dy); +} + +static int +BlitBitmap(av7110_t *av7110, u16 win, u16 x, u16 y, u16 trans) +{ + DECLARE_WAITQUEUE(wait, current); + + if (av7110->bmp_state==BMP_NONE) + return -1; + if (av7110->bmp_state==BMP_LOADING) { + add_wait_queue(&av7110->bmpq, &wait); + while (1) { + set_current_state(TASK_INTERRUPTIBLE); + if (av7110->bmp_state!=BMP_LOADING + || signal_pending(current)) + break; + schedule(); + } + current->state=TASK_RUNNING; + remove_wait_queue(&av7110->bmpq, &wait); + } + if (av7110->bmp_state==BMP_LOADED) + return outcom(av7110, COMTYPE_OSD, BlitBmp, 4, win, x, y, trans); + return -1; +} + +static inline int +ReleaseBitmap(av7110_t *av7110) +{ + if (av7110->bmp_state!=BMP_LOADED) + return -1; + av7110->bmp_state=BMP_NONE; + return outcom(av7110, COMTYPE_OSD, ReleaseBmp, 0); +} + +static u32 RGB2YUV(u16 R, u16 G, u16 B) +{ + u16 y, u, v; + u16 Y, Cr, Cb; + + y = R * 77 + G * 150 + B * 29; // Luma=0.299R+0.587G+0.114B 0..65535 + u = 2048+B * 8 -(y>>5); // Cr 0..4095 + v = 2048+R * 8 -(y>>5); // Cb 0..4095 + + Y=y/256; + Cb=u/16; + Cr=v/16; + + return Cr|(Cb<<16)|(Y<<8); +} + +static void +OSDSetColor(av7110_t *av7110, u8 color, u8 r, u8 g, u8 b, u8 blend) +{ + u16 ch, cl; + u32 yuv; + + yuv=blend ? RGB2YUV(r,g,b) : 0; + cl=(yuv&0xffff); + ch=((yuv>>16)&0xffff); + SetColor_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]], + color, ch, cl); + SetBlend_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]], + color, ((blend>>4)&0x0f)); +} + +static int +OSDSetBlock(av7110_t *av7110, int x0, int y0, int x1, int y1, int inc, u8 *data) +{ + uint w, h, bpp, bpl, size, lpb, bnum, brest; + int i; + + w=x1-x0+1; h=y1-y0+1; + if (inc<=0) + inc=w; + if (w<=0 || w>720 || h<=0 || h>576) + return -1; + bpp=av7110->osdbpp[av7110->osdwin]+1; + bpl=((w*bpp+7)&~7)/8; + size=h*bpl; + lpb=(32*1024)/bpl; + bnum=size/(lpb*bpl); + brest=size-bnum*lpb*bpl; + + for (i=0; iosdbpp[av7110->osdwin]], w, lpb, inc, data); + BlitBitmap(av7110, av7110->osdwin, x0, y0+i*lpb, 0); + data+=lpb*inc; + } + if (brest) { + LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], w, brest/bpl, inc, data); + BlitBitmap(av7110, av7110->osdwin, x0, y0+bnum*lpb, 0); + } + ReleaseBitmap(av7110); + return 0; +} + +static int +OSD_DrawCommand(av7110_t *av7110, osd_cmd_t *dc) +{ + switch (dc->cmd) { + case OSD_Close: + DestroyOSDWindow(av7110, av7110->osdwin); + return 0; + case OSD_Open: + av7110->osdbpp[av7110->osdwin]=(dc->color-1)&7; + CreateOSDWindow(av7110, av7110->osdwin, bpp2bit[av7110->osdbpp[av7110->osdwin]], + dc->x1-dc->x0+1, dc->y1-dc->y0+1); + if (!dc->data) { + MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0); + SetColorBlend(av7110, av7110->osdwin); + } + return 0; + case OSD_Show: + MoveWindowRel(av7110, av7110->osdwin, 0, 0); + return 0; + case OSD_Hide: + HideWindow(av7110, av7110->osdwin); + return 0; + case OSD_Clear: + DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, 0); + return 0; + case OSD_Fill: + DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, dc->color); + return 0; + case OSD_SetColor: + OSDSetColor(av7110, dc->color, dc->x0, dc->y0, dc->x1, dc->y1); + return 0; + case OSD_SetPalette: + { + int i, len=dc->x0-dc->color+1; + u8 *colors=(u8 *)dc->data; + + for (i=0; icolor+i, + colors[i*4] , colors[i*4+1], + colors[i*4+2], colors[i*4+3]); + return 0; + } + case OSD_SetTrans: + return 0; + case OSD_SetPixel: + DrawLine(av7110, av7110->osdwin, + dc->x0, dc->y0, 0, 0, + dc->color); + return 0; + case OSD_GetPixel: + return 0; + + case OSD_SetRow: + dc->y1=dc->y0; + case OSD_SetBlock: + OSDSetBlock(av7110, dc->x0, dc->y0, dc->x1, dc->y1, dc->color, dc->data); + return 0; + + case OSD_FillRow: + DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0, + dc->x1-dc->x0+1, dc->y1, + dc->color); + return 0; + case OSD_FillBlock: + DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0, + dc->x1-dc->x0+1, dc->y1-dc->y0+1, + dc->color); + return 0; + case OSD_Line: + DrawLine(av7110, av7110->osdwin, + dc->x0, dc->y0, dc->x1-dc->x0, dc->y1-dc->y0, + dc->color); + return 0; + case OSD_Query: + return 0; + case OSD_Test: + return 0; + case OSD_Text: + { + char textbuf[240]; + + if (strncpy_from_user(textbuf, dc->data, 240)<0) + return -EFAULT; + textbuf[239]=0; + if (dc->x1>3) + dc->x1=3; + SetFont(av7110, av7110->osdwin, dc->x1, + (u16) (dc->color&0xffff), (u16) (dc->color>>16)); + FlushText(av7110); + WriteText(av7110, av7110->osdwin, dc->x0, dc->y0, textbuf); + return 0; + } + case OSD_SetWindow: + if (dc->x0<1 || dc->x0>7) + return -EINVAL; + av7110->osdwin=dc->x0; + return 0; + case OSD_MoveWindow: + MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0); + SetColorBlend(av7110, av7110->osdwin); + return 0; + default: + return -EINVAL; + } +} +#endif /* CONFIG_DVB_AV7110_OSD */ + + +/* get version of the firmware ROM, RTSL, video ucode and ARM application */ + +static void +firmversion(av7110_t *av7110) +{ + u16 buf[20]; + + u16 tag = ((COMTYPE_REQUEST << 8) + ReqVersion); + + RequestParameter(av7110, tag, buf, 16); + + av7110->arm_fw=(buf[0] << 16) + buf[1]; + av7110->arm_rtsl=(buf[2] << 16) + buf[3]; + av7110->arm_vid=(buf[4] << 16) + buf[5]; + av7110->arm_app=(buf[6] << 16) + buf[7]; + av7110->avtype=(buf[8] << 16) + buf[9]; + + printk ("av7110 (%d): AV711%d - firm %08x, rtsl %08x, vid %08x, app %08x\n", + av7110->saa->dvb_adapter->num, av7110->avtype, av7110->arm_fw, + av7110->arm_rtsl, av7110->arm_vid, av7110->arm_app); + + return; +} + +static int +waitdebi(av7110_t *av7110, int adr, int state) +{ + int k; + + for (k=0; k<100; k++, udelay(500)) { + if (irdebi(av7110, DEBINOSWAP, adr, 0, 2) == state) + return 0; + } + return -1; +} + + +static int +load_dram(av7110_t *av7110, u32 *data, int len) +{ + int i; + int blocks, rest; + u32 base, bootblock=BOOT_BLOCK; + + blocks=len/BOOT_MAX_SIZE; + rest=len % BOOT_MAX_SIZE; + base=DRAM_START_CODE; + + for (i=0; i 0) { + if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) + return -1; + if (rest>4) + iwdebi(av7110, DEBISWAB, bootblock, i*(BOOT_MAX_SIZE)+(u32)data, rest); + else + iwdebi(av7110, DEBISWAB, bootblock, i*(BOOT_MAX_SIZE)-4+(u32)data, rest+4); + + iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4); + iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, rest, 2); + iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); + } + if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) + return -1; + iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, 0, 2); + iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); + if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BOOT_COMPLETE) < 0) + return -1; + return 0; +} + + +static u8 +bootcode[] = { + 0xea, 0x00, 0x00, 0x0e, 0xe1, 0xb0, 0xf0, 0x0e, /* 0x0000 */ + 0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x04, + 0xe2, 0x5e, 0xf0, 0x08, 0xe2, 0x5e, 0xf0, 0x04, + 0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x04, + 0x2c, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x00, 0xa5, 0xa5, 0x5a, 0x5a, + 0x00, 0x1f, 0x15, 0x55, 0x00, 0x00, 0x00, 0x09, + 0xe5, 0x9f, 0xd0, 0x5c, 0xe5, 0x9f, 0x40, 0x54, /* 0x0040 */ + 0xe3, 0xa0, 0x00, 0x00, 0xe5, 0x84, 0x00, 0x00, + 0xe5, 0x84, 0x00, 0x04, 0xe1, 0xd4, 0x10, 0xb0, + 0xe3, 0x51, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xfc, + 0xe1, 0xa0, 0x10, 0x0d, 0xe5, 0x94, 0x30, 0x04, + 0xe1, 0xd4, 0x20, 0xb2, 0xe2, 0x82, 0x20, 0x3f, + 0xe1, 0xb0, 0x23, 0x22, 0x03, 0xa0, 0x00, 0x02, + 0xe1, 0xc4, 0x00, 0xb0, 0x0a, 0xff, 0xff, 0xf4, + 0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0, /* 0x0080 */ + 0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0, + 0xe2, 0x52, 0x20, 0x01, 0x1a, 0xff, 0xff, 0xf9, + 0xe2, 0x2d, 0xdb, 0x05, 0xea, 0xff, 0xff, 0xec, + 0x2c, 0x00, 0x03, 0xf8, 0x2c, 0x00, 0x04, 0x00, +}; + +#include "av7110_firm.h" + +static int +bootarm(av7110_t *av7110) +{ + u32 ret; + int i; + + setgpio(av7110, RESET_LINE, GPIO_OUTLO); + + /* Disable DEBI and GPIO irq */ + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) & + ~(MASK_19 | MASK_03)); + saa7146_write(av7110->saa_mem, ISR, (MASK_19 | MASK_03)); + + /* enable DEBI */ + saa7146_write(av7110->saa_mem, MC1, 0x08800880); + saa7146_write(av7110->saa_mem, DD1_STREAM_B, 0x00000000); + saa7146_write(av7110->saa_mem, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); + + /* test DEBI */ + iwdebi(av7110, DEBISWAP, DPRAM_BASE, 0x76543210, 4); + if ((ret=irdebi(av7110, DEBINOSWAP, DPRAM_BASE, 0, 4))!=0x10325476) { + printk("dvb: debi test in bootarm() failed: " + "%08x != %08x\n", ret, 0x10325476);; + return -1; + } + for (i=0; i<8192; i+=4) + iwdebi(av7110, DEBISWAP, DPRAM_BASE+i, 0x00, 4); + dprintk("bootarm: debi test OK\n");; + + /* boot */ + dprintk("bootarm: load boot code\n"); + + setgpio(av7110, ARM_IRQ_LINE, GPIO_IRQLO); + //setgpio(av7110, DEBI_DONE_LINE, GPIO_INPUT); + //setgpio(av7110, 3, GPIO_INPUT); + + iwdebi(av7110, DEBISWAB, DPRAM_BASE, (u32) bootcode, sizeof(bootcode)); + iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); + + wait_for_debi_done(av7110); + setgpio(av7110, RESET_LINE, GPIO_OUTHI); + current->state=TASK_INTERRUPTIBLE; + schedule_timeout(HZ); + + dprintk("bootarm: load dram code\n"); + + if (load_dram(av7110, (u32 *)Root, sizeof(Root))<0) + return -1; + + setgpio(av7110, RESET_LINE, GPIO_OUTLO); + mdelay(1); + + dprintk("bootarm: load dpram code\n"); + + iwdebi(av7110, DEBISWAB, DPRAM_BASE, (u32) Dpram, sizeof(Dpram)); + + wait_for_debi_done(av7110); + + setgpio(av7110, RESET_LINE, GPIO_OUTHI); + mdelay(800); + + //ARM_ClearIrq(av7110); + ARM_ResetMailBox(av7110); + saa7146_write(av7110->saa_mem, ISR, (MASK_19 | MASK_03)); + saa7146_write(av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) | MASK_03 ); + + av7110->arm_errors=0; + av7110->arm_ready=1; + return 0; +} + +static inline int +SetPIDs(av7110_t *av7110, u16 vpid, u16 apid, u16 ttpid, + u16 subpid, u16 pcrpid) +{ + if (vpid == 0x1fff || apid == 0x1fff || + ttpid == 0x1fff || subpid == 0x1fff || pcrpid == 0x1fff) + vpid = apid = ttpid = subpid = pcrpid = 0; + + return outcom(av7110, COMTYPE_PIDFILTER, MultiPID, 5, + pcrpid, vpid, apid, ttpid, subpid); +} + +static void +ChangePIDs(av7110_t *av7110, u16 vpid, u16 apid, u16 ttpid, + u16 subpid, u16 pcrpid) +{ + if (down_interruptible(&av7110->pid_mutex)) + return; + + if (!(vpid&0x8000)) av7110->pids[DMX_PES_VIDEO]=vpid; + if (!(apid&0x8000)) av7110->pids[DMX_PES_AUDIO]=apid; + if (!(ttpid&0x8000)) av7110->pids[DMX_PES_TELETEXT]=ttpid; + if (!(pcrpid&0x8000)) av7110->pids[DMX_PES_PCR]=pcrpid; + + av7110->pids[DMX_PES_SUBTITLE]=0; + + if (av7110->fe_synced) + SetPIDs(av7110, vpid, apid, ttpid, subpid, pcrpid); + + up(&av7110->pid_mutex); +} + + +static void +SetMode(av7110_t *av7110, int mode) +{ + outcom(av7110, COMTYPE_ENCODER, LoadVidCode, 1, mode); + + if (!av7110->playing) { + ChangePIDs(av7110, av7110->pids[DMX_PES_VIDEO], + av7110->pids[DMX_PES_AUDIO], + av7110->pids[DMX_PES_TELETEXT], + 0, av7110->pids[DMX_PES_PCR]); + outcom(av7110, COMTYPE_PIDFILTER, Scan, 0); + } +} + +inline static void +TestMode(av7110_t *av7110, int mode) +{ + outcom(av7110, COMTYPE_ENCODER, SetTestMode, 1, mode); +} + +inline static void +VidMode(av7110_t *av7110, int mode) +{ + outcom(av7110, COMTYPE_ENCODER, SetVidMode, 1, mode); +} + + +static int inline +vidcom(av7110_t *av7110, u32 com, u32 arg) +{ + return outcom(av7110, 0x80, 0x02, 4, + (com>>16), (com&0xffff), + (arg>>16), (arg&0xffff)); +} + +static int inline +audcom(av7110_t *av7110, u32 com) +{ + return outcom(av7110, 0x80, 0x03, 4, + (com>>16), (com&0xffff)); +} + +inline static void +Set22K(av7110_t *av7110, int state) +{ + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) + outcom(av7110, COMTYPE_AUDIODAC, (state ? ON22K : OFF22K), 0); + if (av7110->saa->card_type==DVB_CARD_TT_BUDGET) + setgpio(av7110, 3, (state ? GPIO_OUTHI : GPIO_OUTLO)); +} + + +/* Diseqc functions only for TT Budget card */ +/* taken from the Skyvision DVB driver by + Ralph Metzler */ + + +inline static void +DiseqcSendBit(av7110_t *av7110, int data) +{ + setgpio(av7110, 3, GPIO_OUTHI); + udelay(data ? 500 : 1000); + setgpio(av7110, 3, GPIO_OUTLO); + udelay(data ? 1000 : 500); +} + +static void +DiseqcSendByte(av7110_t *av7110, int data) +{ + int i, par=1, d; + + for (i=7; i>=0; i--) + { + d=(data>>i)&1; + par^=d; + DiseqcSendBit(av7110, d); + } + DiseqcSendBit(av7110, par); +} + +inline static int +SendDiSEqCMsg(av7110_t *av7110, int len, u8 *msg, int burst) +{ + int i; + + switch (av7110->saa->card_type) { + case DVB_CARD_TT_SIEMENS: + { + u16 buf[18] = { ((COMTYPE_AUDIODAC << 8) + SendDiSEqC), + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + if (len>10) + len=10; + buf[1] = len+2; + buf[2] = len; + + if (burst!=-1) + buf[3]=burst ? 0x01 : 0x00; + + else + buf[3]=0xffff; + + for (i=0; isaa->i2c_bus; + struct i2c_msg msgs; + + msgs.flags=0; + msgs.addr=id/2; + msgs.len=2; + msgs.buf=msg; + return i2c->xfer (i2c, &msgs, 1); +} + +static inline int +msp_writereg(av7110_t *av7110, u8 dev, u16 reg, u16 val) +{ + u8 msg[5]={ dev, reg>>8, reg&0xff, val>>8 , val&0xff }; + struct dvb_i2c_bus *i2c = av7110->saa->i2c_bus; + struct i2c_msg msgs; + + msgs.flags=0; + msgs.addr=0x40; + msgs.len=5; + msgs.buf=msg; + return i2c->xfer(i2c, &msgs, 1); +} + +static inline u8 +i2c_readreg(av7110_t *av7110, u8 id, u8 reg) +{ + struct dvb_i2c_bus *i2c = av7110->saa->i2c_bus; + u8 mm1[] = {0x00}; + u8 mm2[] = {0x00}; + struct i2c_msg msgs[2]; + + msgs[0].flags=0; + msgs[1].flags=I2C_M_RD; + msgs[0].addr=msgs[1].addr=id/2; + mm1[0]=reg; + msgs[0].len=1; msgs[1].len=1; + msgs[0].buf=mm1; msgs[1].buf=mm2; + i2c->xfer(i2c, msgs, 2); + + return mm2[0]; +} + + +/**************************************************************************** + * I/O buffer management and control + ****************************************************************************/ + +static int sw2mode[16] = { + VIDEO_MODE_PAL, VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_PAL, + VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_PAL, VIDEO_MODE_NTSC, + VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, + VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, +}; + +static void +get_video_format(av7110_t *av7110, u8 *buf, int count) +{ + int i; + int hsize,vsize; + int sw; + u8 *p; + + if (av7110->sinfo) + return; + for (i=7; i> 4) | (p[0] << 4); + vsize = ((p[1] &0x0F) << 8) | (p[2]); + sw = (p[3]&0x0F); + SetMode(av7110, sw2mode[sw]); + dprintk("dvb: playback %dx%d fr=%d\n", hsize, vsize, sw); + av7110->sinfo=1; + break; + } +} + +static void +play_video_cb(u8 *buf, int count, void *priv) +{ + av7110_t *av7110=(av7110_t *) priv; + + if ((buf[3]&0xe0)==0xe0) { + get_video_format(av7110, buf, count); + ring_buffer_write(&av7110->avout, buf, count, 0, 0); + } else + ring_buffer_write(&av7110->aout, buf, count, 0, 0); +} + +static void +play_audio_cb(u8 *buf, int count, void *priv) +{ + av7110_t *av7110=(av7110_t *) priv; + + ring_buffer_write(&av7110->aout, buf, count, 0, 0); +} + +#define FREE_COND (ring_buffer_free(&av7110->avout)>=20*1024 && ring_buffer_free(&av7110->aout)>=20*1024) + +static ssize_t +dvb_play(av7110_t *av7110, const u8 *buf, + unsigned long count, int nonblock, int type, int umem) +{ + unsigned long todo = count, n; + + if (!av7110->kbuf[type]) + return -ENOBUFS; + + if (nonblock && !FREE_COND) + return -EWOULDBLOCK; + + while (todo>0) { + if (!FREE_COND) { + if (nonblock) + return count-todo; + if (wait_event_interruptible(av7110->avout.queue, + FREE_COND)) + return count-todo; + } + n=todo; + if (n>IPACKS*2) + n=IPACKS*2; + if (umem) { + if (copy_from_user(av7110->kbuf[type], buf, n)) + return -EFAULT; + instant_repack(av7110->kbuf[type], n, &av7110->ipack[type]); + } else + instant_repack((u8 *)buf, n, &av7110->ipack[type]); + todo -= n; + buf += n; + } + return count-todo; +} + +static ssize_t +dvb_aplay(av7110_t *av7110, const u8 *buf, + unsigned long count, int nonblock, int type) +{ + unsigned long todo = count, n; + + if (!av7110->kbuf[type]) + return -ENOBUFS; + if (nonblock && ring_buffer_free(&av7110->aout)<20*1024) + return -EWOULDBLOCK; + + while (todo>0) { + if (ring_buffer_free(&av7110->aout)<20*1024) { + if (nonblock) + return count-todo; + if (wait_event_interruptible(av7110->aout.queue, + (ring_buffer_free(&av7110->aout)>= + 20*1024))) + return count-todo; + } + n=todo; + if (n>IPACKS*2) + n=IPACKS*2; + if (copy_from_user(av7110->kbuf[type], buf, n)) + return -EFAULT; + instant_repack(av7110->kbuf[type], n, &av7110->ipack[type]); +// memcpy(dvb->kbuf[type], buf, n); + todo -= n; + buf += n; + } + return count-todo; +} + +void init_p2t(p2t_t *p, dvb_demux_feed_t *feed) +{ + memset(p->pes,0,TS_SIZE); + p->counter = 0; + p->pos = 0; + p->frags = 0; + if (feed) p->feed = feed; +} + +void clear_p2t(p2t_t *p) +{ + memset(p->pes,0,TS_SIZE); +// p->counter = 0; + p->pos = 0; + p->frags = 0; +} + + +long int find_pes_header(u8 const *buf, long int length, int *frags) +{ + int c = 0; + int found = 0; + + *frags = 0; + + while (c < length-3 && !found) { + if (buf[c] == 0x00 && buf[c+1] == 0x00 && + buf[c+2] == 0x01) { + switch ( buf[c+3] ) { + + case PROG_STREAM_MAP: + case PRIVATE_STREAM2: + case PROG_STREAM_DIR: + case ECM_STREAM : + case EMM_STREAM : + case PADDING_STREAM : + case DSM_CC_STREAM : + case ISO13522_STREAM: + case PRIVATE_STREAM1: + case AUDIO_STREAM_S ... AUDIO_STREAM_E: + case VIDEO_STREAM_S ... VIDEO_STREAM_E: + found = 1; + break; + + default: + c++; + break; + } + } else c++; + } + if (c == length-3 && !found){ + if (buf[length-1] == 0x00) *frags = 1; + if (buf[length-2] == 0x00 && + buf[length-1] == 0x00) *frags = 2; + if (buf[length-3] == 0x00 && + buf[length-2] == 0x00 && + buf[length-1] == 0x01) *frags = 3; + return -1; + } + + return c; +} + +void pes_to_ts( u8 const *buf, long int length, u16 pid, p2t_t *p) +{ + int c,c2,l,add; + int check,rest; + + c = 0; + c2 = 0; + if (p->frags){ + check = 0; + switch(p->frags){ + case 1: + if ( buf[c] == 0x00 && buf[c+1] == 0x01 ){ + check = 1; + c += 2; + } + break; + case 2: + if ( buf[c] == 0x01 ){ + check = 1; + c++; + } + break; + case 3: + check = 1; + } + if(check){ + switch ( buf[c] ) { + + case PROG_STREAM_MAP: + case PRIVATE_STREAM2: + case PROG_STREAM_DIR: + case ECM_STREAM : + case EMM_STREAM : + case PADDING_STREAM : + case DSM_CC_STREAM : + case ISO13522_STREAM: + case PRIVATE_STREAM1: + case AUDIO_STREAM_S ... AUDIO_STREAM_E: + case VIDEO_STREAM_S ... VIDEO_STREAM_E: + p->pes[0] = 0x00; + p->pes[1] = 0x00; + p->pes[2] = 0x01; + p->pes[3] = buf[c]; + p->pos=4; + memcpy(p->pes+p->pos,buf+c,(TS_SIZE-4)-p->pos); + c += (TS_SIZE-4)-p->pos; + p_to_t(p->pes,(TS_SIZE-4),pid,&p->counter, + p->feed); + clear_p2t(p); + break; + + default: + c=0; + break; + } + } + p->frags = 0; + } + + if (p->pos){ + c2 = find_pes_header(buf+c,length-c,&p->frags); + if (c2 >= 0 && c2 < (TS_SIZE-4)-p->pos){ + l = c2+c; + } else l = (TS_SIZE-4)-p->pos; + memcpy(p->pes+p->pos,buf,l); + c += l; + p->pos += l; + p_to_t(p->pes,p->pos,pid,&p->counter, p->feed); + clear_p2t(p); + } + + add = 0; + while (c < length){ + c2 = find_pes_header(buf+c+add,length-c-add,&p->frags); + if (c2 >= 0) { + c2 += c+add; + if (c2 > c){ + p_to_t(buf+c,c2-c,pid,&p->counter, + p->feed); + c = c2; + clear_p2t(p); + add = 0; + } else add = 1; + } else { + l = length-c; + rest = l % (TS_SIZE-4); + l -= rest; + p_to_t(buf+c,l,pid,&p->counter, + p->feed); + memcpy(p->pes,buf+c+l,rest); + p->pos = rest; + c = length; + } + } +} + + +int write_ts_header2(u16 pid, u8 *counter, int pes_start, u8 *buf, u8 length) +{ + int i; + int c = 0; + int fill; + u8 tshead[4] = { 0x47, 0x00, 0x00, 0x10}; + + + fill = (TS_SIZE-4)-length; + if (pes_start) tshead[1] = 0x40; + if (fill) tshead[3] = 0x30; + tshead[1] |= (u8)((pid & 0x1F00) >> 8); + tshead[2] |= (u8)(pid & 0x00FF); + tshead[3] |= ((*counter)++ & 0x0F) ; + memcpy(buf,tshead,4); + c+=4; + + + if (fill){ + buf[4] = fill-1; + c++; + if (fill >1){ + buf[5] = 0x00; + c++; + } + for ( i = 6; i < fill+4; i++){ + buf[i] = 0xFF; + c++; + } + } + + return c; +} + + +void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, + dvb_demux_feed_t *feed) +{ + + int l, pes_start; + u8 obuf[TS_SIZE]; + long int c = 0; + + pes_start = 0; + if ( length > 3 && + buf[0] == 0x00 && buf[1] == 0x00 && buf[2] == 0x01 ) + switch (buf[3]){ + case PROG_STREAM_MAP: + case PRIVATE_STREAM2: + case PROG_STREAM_DIR: + case ECM_STREAM : + case EMM_STREAM : + case PADDING_STREAM : + case DSM_CC_STREAM : + case ISO13522_STREAM: + case PRIVATE_STREAM1: + case AUDIO_STREAM_S ... AUDIO_STREAM_E: + case VIDEO_STREAM_S ... VIDEO_STREAM_E: + pes_start = 1; + break; + + default: + break; + } + + while ( c < length ){ + memset(obuf,0,TS_SIZE); + if (length - c >= (TS_SIZE-4)){ + l = write_ts_header2(pid, counter, pes_start + , obuf, (TS_SIZE-4)); + memcpy(obuf+l, buf+c, TS_SIZE-l); + c += TS_SIZE-l; + } else { + l = write_ts_header2(pid, counter, pes_start + , obuf, length-c); + memcpy(obuf+l, buf+c, TS_SIZE-l); + c = length; + } + feed->cb.ts(obuf, 188, 0, 0, &feed->feed.ts, DMX_OK); + pes_start = 0; + } +} + + +/**************************************************************************** + * V4L SECTION + ****************************************************************************/ + +static int dvb_do_ioctl (struct inode *inode, struct file *file, + unsigned int cmd, void *arg) +{ + struct video_device *dev = video_devdata (file); + av7110_t *av7110 = dev->priv; + + switch (cmd) { + case VIDIOCGCAP: + { + struct video_capability *b = arg; + + dprintk(KERN_ERR "dvb: VIDIOCGCAP called\n"); + + strcpy(b->name, &dev->name[0]); + + b->type = av7110->video.type; + + b->channels = 1; + b->audios = 2; + b->maxwidth = 768; + b->maxheight = 576; + b->minwidth = 32; + b->minheight = 32; + + return 0; + } + + case VIDIOCGCHAN: + { + static const + struct video_channel dvb_chan = { 0, "DVB", 1, 3, 1, 1 }; + struct video_channel *v = arg; + + dprintk(KERN_ERR "dvb: VIDIOCGCHAN called\n"); + + memcpy(v, &dvb_chan, sizeof(struct video_channel)); + + return 0; + + } + + case VIDIOCSCHAN: + { + struct video_channel *v = arg; + + dprintk(KERN_ERR "dvb: VIDIOCSCHAN called\n"); + + if (v->channel>0) + return -EINVAL; + + if (v->norm > 1) + return -EOPNOTSUPP; + + av7110->vidmode = v->norm; + SetMode(av7110, v->norm); + av7110->saa->mode = v->norm; + return 0; + } + + case VIDIOCGTUNER: + { + struct video_tuner *v = arg; + + dprintk(KERN_ERR "dvb: VIDIOCGTUNER called\n"); + + /* only channel 0 has a tuner */ + if(!v->tuner) + return -EINVAL; + + /* fill the structure */ + strcpy(v->name, "DVB"); + v->rangelow = 0x00000000; + v->rangehigh = 0xffffffff; + + v->flags= VIDEO_TUNER_PAL | VIDEO_TUNER_NTSC; + v->mode = av7110->vidmode; + + /* fixme: fill in signal strength here */ + v->signal = 0xffff; + + return 0; + } + + case VIDIOCSTUNER: + { + struct video_tuner *v = arg; + + dprintk(KERN_ERR "dvb: VIDIOCSTUNER called\n"); + + /* only channel 0 has a tuner */ + if (!v->tuner) + return -EINVAL; + + /* check if format is supported */ + if(v->mode != VIDEO_MODE_PAL && v->mode != VIDEO_MODE_NTSC + /* && v->mode != VIDEO_MODE_SECAM */ ) + return -EOPNOTSUPP; + + av7110->vidmode = v->mode; + SetMode(av7110, v->mode); + + return 0; + } + + case VIDIOCGPICT: + { + struct video_picture *p = arg; + + dprintk(KERN_ERR "dvb: VIDIOCGPICT called\n"); + + saacomm(SAA7146_V4L_GPICT, p); + + dprintk("dvb: VIDIOCGPICT called: b:%d c:%d s:%d d:%d p:%d\n", + p->brightness, p->contrast, p->colour, + p->depth, p->palette); + + return 0; + } + + case VIDIOCSPICT: + { + struct video_picture *p = arg; + + dprintk("dvb: VIDIOCSPICT called: b:%d c:%d s:%d d:%d p:%d\n", + p->brightness, p->contrast, p->colour, + p->depth, p->palette); + + switch (p->palette) { + case VIDEO_PALETTE_RGB555: + case VIDEO_PALETTE_RGB565: + case VIDEO_PALETTE_RGB24: + case VIDEO_PALETTE_RGB32: + case VIDEO_PALETTE_UYVY: + case VIDEO_PALETTE_YUV422P: + case VIDEO_PALETTE_YUV420P: + case VIDEO_PALETTE_YUV411P: + break; + default: + return -EINVAL; + } + + saacomm(SAA7146_V4L_SPICT, p); + + return 0; + + } + + case VIDIOCSWIN: + { + struct video_window *w = arg; + + dprintk("dvb: VIDIOCSWIN called: " + "clips: %d, x:%d, y:%d, h:%d, w:%d\n", + w->clipcount, w->x, w->y, w->height, w->width); + + saacomm(SAA7146_V4L_SWIN, w); + + return 0; + } + + case VIDIOCGWIN: + { + dprintk(KERN_ERR "dvb: VIDIOCGWIN called\n"); + return 0; + } + + case VIDIOCCAPTURE: + { + int *v = arg; + + dprintk("dvb: VIDIOCCAPTURE called, mode:%d (0=disable)\n", *v); + + saacomm(SAA7146_V4L_CCAPTURE, v); + + return 0; + } + + case VIDIOCGFBUF: + { + struct video_buffer *b = arg; + + dprintk(KERN_ERR "dvb: VIDIOCGFBUF called\n"); + + saacomm(SAA7146_V4L_GFBUF, b); + + return 0; + + } + + case VIDIOCSFBUF: + { + struct video_buffer *b = arg; + u32 vid = (vidmem << 16) | vidlow; + + /* see if vidmem-override is requested */ + if (vidmem) { + printk ("dvb: video-memory-override. (0x%08x)\n", vid); + b->base = (void*) vid; + } + + saacomm(SAA7146_V4L_SFBUF, b); + + dprintk(KERN_ERR "dvb: VIDIOCSFBUF called\n"); + + return 0; + } + + /* Video key event - to dev 255 is to all - + * cuts capture on all DMA windows with this key (0xFFFFFFFF == all) + */ + case VIDIOCKEY: + { + dprintk(KERN_ERR "dvb: VIDIOCKEY called\n"); + return 0; + } + + case VIDIOCGAUDIO: + { + struct video_audio *v = arg; + + v->flags = VIDEO_AUDIO_MUTABLE; + /* let's auto-detect */ + return 0; + } + + case VIDIOCSAUDIO: + { + //struct video_audio *v; + return 0; + } + + case VIDIOCSYNC: + { + int i = 0; + int *frame = (int*) arg; + + dprintk ("dvb: VIDIOCSYNC called - frame: %d\n", *frame); + + /* simply pass the requested frame-number to the corresponding + saa7146-function ... */ + i = saacomm(SAA7146_V4L_CSYNC, frame); + + dprintk ("dvb: VIDIOCSYNC done - frame: %d\n", *frame); + + return i; + } + + case VIDIOCMCAPTURE: + { + struct video_mmap *vm = arg; + int i = 0; + + dprintk(KERN_ERR "dvb: VIDIOCMCAPTURE called: fr:%d," + "fmt:%d, w:%d, h:%d\n", + vm->frame, vm->format, vm->width, vm->height); + + switch (vm->format) { + case VIDEO_PALETTE_YUV422P: + case VIDEO_PALETTE_YUV420P: + case VIDEO_PALETTE_YUV411P: + return -EINVAL; + } + + /* simply pass the structure for the requested frame-number + to the corresponding saa7146-function ... */ + i = saacomm(SAA7146_V4L_CMCAPTURE, vm); + + return i; + } + + case VIDIOCGMBUF: + { + struct video_mbuf *mbuf = arg; + dprintk(KERN_ERR "dvb: VIDIOCGMBUF called\n"); + saacomm(SAA7146_V4L_GMBUF, mbuf); + return 0; + + } + + case VIDIOCGUNIT: + { + /*struct video_unit vu;*/ + dprintk(KERN_ERR "dvb: VIDIOCGUNIT called\n"); + return 0; + } + + case VIDIOCGCAPTURE: + { + dprintk(KERN_ERR "dvb: VIDIOCGCAPTURE called\n"); + return 0; + } + case VIDIOCSCAPTURE: + { + dprintk(KERN_ERR "dvb: VIDIOCSCAPTURE called\n"); + return 0; + } + + default: + return -ENOIOCTLCMD; + } + + return 0; +} + + +static int dvb_ioctl (struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + return video_usercopy(inode, file, cmd, arg, dvb_do_ioctl); +} + + +static int dvb_mmap(struct file* file, struct vm_area_struct *vma) +{ + struct video_device *dev = video_devdata (file); + av7110_t *av7110 = dev->priv; + + dprintk(KERN_ERR "av7110: dvb_mmap called, adr:%08lx, size:0x%08lx\n", + vma->vm_start, vma->vm_end - vma->vm_start); + + if (saacomm(SAA7146_DO_MMAP, vma)) { + printk(KERN_ERR "av7110: dvb_mmap failed!\n"); + return -1; + } + + return 0; +} + + +static unsigned int dvb_audio_poll(struct file *file, poll_table *wait) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + unsigned int mask=0; + + if (av7110->playing) { + if (ring_buffer_free(&av7110->aout)>20*1024) + return (POLLOUT | POLLWRNORM); + + poll_wait(file, &av7110->aout.queue, wait); + + if (ring_buffer_free(&av7110->aout)>20*1024) + mask |= (POLLOUT | POLLWRNORM); + } else /* if not playing: may play if asked for */ + mask = (POLLOUT | POLLWRNORM); + + return mask; +} + + +static struct file_operations dvb_fops = { + ioctl: dvb_ioctl, + mmap: dvb_mmap, + llseek: no_llseek +}; + + +/* template for video_device-structure */ +static struct video_device dvb_template = { + owner: THIS_MODULE, + name: "DVB Board", + type: VID_TYPE_TUNER | + VID_TYPE_CAPTURE | + VID_TYPE_OVERLAY | + VID_TYPE_CLIPPING | + VID_TYPE_FRAMERAM | + VID_TYPE_SCALES, + hardware: VID_HARDWARE_SAA7146, + fops: &dvb_fops +}; + + +static int vid_register(av7110_t *av7110) +{ + memcpy( &av7110->video, &dvb_template, sizeof(struct video_device)); + + av7110->video.priv = av7110; + + if (video_register_device(&av7110->video, VFL_TYPE_GRABBER, -1)) { + printk(KERN_ERR "dvb: can't register videodevice\n"); + return -1; + } + + return 0; +} + +static inline int vid_unregister(av7110_t *av7110) +{ + if (av7110->video.minor != -1) + video_unregister_device(&av7110->video); + + return 0; +} + +/**************************************************************************** + * END OF V4L SECTION + ****************************************************************************/ + + +/**************************************************************************** + * DVB API SECTION + ****************************************************************************/ + + +/****************************************************************************** + * hardware filter functions + ******************************************************************************/ + +static int +StartHWFilter(dvb_demux_filter_t *dvbdmxfilter) +{ + dvb_demux_feed_t *dvbdmxfeed=dvbdmxfilter->feed; + av7110_t *av7110=(av7110_t *) dvbdmxfeed->demux->priv; + u16 buf[20]; + int ret, i; + u16 handle; +// u16 mode=0x0320; + u16 mode=0xb96a; + + if (dvbdmxfilter->type==DMX_TYPE_SEC) { + buf[4]=(dvbdmxfilter->filter.filter_value[0]<<8)| + dvbdmxfilter->maskandmode[0]; + for (i=3; i<18; i++) + buf[i+4-2]=(dvbdmxfilter->filter.filter_value[i]<<8)| + dvbdmxfilter->maskandmode[i]; + mode=4; + } else + if ((dvbdmxfeed->ts_type & TS_PACKET) && + !(dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)) + init_p2t(&av7110->p2t_filter[dvbdmxfilter->index], dvbdmxfeed); + + buf[0] = (COMTYPE_PID_FILTER << 8) + AddPIDFilter; + buf[1] = 16; + buf[2] = dvbdmxfeed->pid; + buf[3] = mode; + + ret=CommandRequest(av7110, buf, 20, &handle, 1); + if (ret<0) + return ret; + + av7110->handle2filter[handle]=dvbdmxfilter; + dvbdmxfilter->hw_handle=handle; + + return ret; +} + +static int +StopHWFilter(dvb_demux_filter_t *dvbdmxfilter) +{ + av7110_t *av7110=(av7110_t *) dvbdmxfilter->feed->demux->priv; + u16 buf[3]; + u16 answ[2]; + int ret; + u16 handle; + + handle=dvbdmxfilter->hw_handle; + if (handle>32) { + dprintk("dvb: StopHWFilter tried to stop invalid filter %d.\n", + handle); + dprintk("dvb: filter type = %d\n", dvbdmxfilter->type); + return 0; + } + + av7110->handle2filter[handle]=NULL; + + buf[0] = (COMTYPE_PID_FILTER << 8) + DelPIDFilter; + buf[1] = 1; + buf[2] = handle; + ret=CommandRequest(av7110, buf, 3, answ, 2); + + if (answ[1] != handle) { + dprintk("dvb: filter %d shutdown error :%d\n", handle, answ[1]); + ret=-1; + } + return ret; +} + + +static int +dvb_write_to_decoder(dvb_demux_feed_t *dvbdmxfeed, u8 *buf, size_t count) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + av7110_t *av7110=(av7110_t *) dvbdmx->priv; + ipack *ipack=&av7110->ipack[dvbdmxfeed->pes_type]; + + switch (dvbdmxfeed->pes_type) { + case 0: + if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY) { + return -EINVAL; + } + break; + case 1: + if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY) { + return -EINVAL; + } + break; + default: + return -1; + } + + if (!(buf[3]&0x10)) { // no payload? + return -1; + } + if (buf[1]&0x40) + send_ipack_rest(ipack); + + if (buf[3]&0x20) { // adaptation field? + count-=buf[4]+1; + buf+=buf[4]+1; + if (!count) { + return 0; + } + } + + instant_repack(buf+4, count-4, &av7110->ipack[dvbdmxfeed->pes_type]); + return 0; +} + +static void +dvb_feed_start_pid(dvb_demux_feed_t *dvbdmxfeed) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + av7110_t *av7110=(av7110_t *) dvbdmx->priv; + u16 *pid=dvbdmx->pids, npids[5]; + int i; + + npids[0]=npids[1]=npids[2]=npids[3]=0xffff; + npids[4]=0xffff; + i=dvbdmxfeed->pes_type; + npids[i]=(pid[i]&0x8000) ? 0 : pid[i]; + if ((i==2) && npids[i] && (dvbdmxfeed->ts_type & TS_PACKET)) { + npids[i]=0; + ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]); + StartHWFilter(dvbdmxfeed->filter); + return; + } + if (dvbdmxfeed->pes_type<=2) + ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]); + + if (dvbdmxfeed->pes_type<2 && npids[0]) + if (av7110->fe_synced) + outcom(av7110, COMTYPE_PIDFILTER, Scan, 0); + + if ((dvbdmxfeed->ts_type & TS_PACKET)) { + if (dvbdmxfeed->pes_type == 0 && + !(dvbdmx->pids[0]&0x8000)) + AV_StartRecord(av7110, RP_AUDIO, + dvbdmxfeed); + if (dvbdmxfeed->pes_type == 1 && + !(dvbdmx->pids[1]&0x8000)) + AV_StartRecord(av7110, RP_VIDEO, + dvbdmxfeed); + } +} + +static void +dvb_feed_stop_pid(dvb_demux_feed_t *dvbdmxfeed) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + av7110_t *av7110=(av7110_t *) dvbdmx->priv; + u16 *pid=dvbdmx->pids, npids[5]; + int i; + + if (dvbdmxfeed->pes_type<=1) { + AV_Stop(av7110, dvbdmxfeed->pes_type ? + RP_VIDEO : RP_AUDIO); + if (!av7110->rec_mode) + dvbdmx->recording=0; + if (!av7110->playing) + dvbdmx->playing=0; + } + npids[0]=npids[1]=npids[2]=npids[3]=0xffff; + npids[4]=0xffff; + i=dvbdmxfeed->pes_type; + switch (i) { + case 2: //teletext + if (dvbdmxfeed->ts_type & TS_PACKET) + StopHWFilter(dvbdmxfeed->filter); + npids[2]=0; + break; + case 0: + case 1: + case 4: + if (!pids_off) + return; + npids[i]=(pid[i]&0x8000) ? 0 : pid[i]; + break; + } + ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]); +} + +static int +dvb_start_feed(dvb_demux_feed_t *dvbdmxfeed) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + av7110_t *av7110=(av7110_t *) dvbdmx->priv; + + if (!dvbdmx->dmx.frontend) + return -EINVAL; + + if (av7110->saa->card_type>=DVB_CARD_TT_BUDGET) + return TTBStart(av7110); + + if (dvbdmxfeed->pid>0x1fff) + return -1; + + if (dvbdmxfeed->type == DMX_TYPE_TS) { + if ((dvbdmxfeed->ts_type & TS_DECODER) + && (dvbdmxfeed->pes_typedmx.frontend->source) { + case DMX_MEMORY_FE: + if (dvbdmxfeed->ts_type & TS_DECODER) + if (dvbdmxfeed->pes_type<2 && + !(dvbdmx->pids[0]&0x8000) && + !(dvbdmx->pids[1]&0x8000)) { + ring_buffer_flush(&av7110->avout); + ring_buffer_flush(&av7110->aout); + AV_StartPlay(av7110,RP_AV); + dvbdmx->playing=1; + } + break; + default: + dvb_feed_start_pid(dvbdmxfeed); + break; + } + } else + if ((dvbdmxfeed->ts_type & TS_PACKET) && + (dvbdmx->dmx.frontend->source!=DMX_MEMORY_FE)) + StartHWFilter(dvbdmxfeed->filter); + } + + if (dvbdmxfeed->type == DMX_TYPE_SEC) { + int i; + + for (i=0; ifilternum; i++) { + if (dvbdmx->filter[i].state!=DMX_STATE_READY) + continue; + if (dvbdmx->filter[i].type!=DMX_TYPE_SEC) + continue; + if (dvbdmx->filter[i].filter.parent!=&dvbdmxfeed->feed.sec) + continue; + dvbdmx->filter[i].state=DMX_STATE_GO; + if (dvbdmx->dmx.frontend->source!=DMX_MEMORY_FE) + StartHWFilter(&dvbdmx->filter[i]); + } + } + return 0; +} + + +static int +dvb_stop_feed(dvb_demux_feed_t *dvbdmxfeed) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + av7110_t *av7110=(av7110_t *) dvbdmx->priv; + + if (av7110->saa->card_type>=DVB_CARD_TT_BUDGET) + return TTBStop(av7110); + + if (dvbdmxfeed->type == DMX_TYPE_TS) { + if (dvbdmxfeed->ts_type & TS_DECODER) { + if (dvbdmxfeed->pes_type>=DMX_TS_PES_OTHER || + !dvbdmx->pesfilter[dvbdmxfeed->pes_type]) + return -EINVAL; + dvbdmx->pids[dvbdmxfeed->pes_type]|=0x8000; + dvbdmx->pesfilter[dvbdmxfeed->pes_type]=0; + } + if (dvbdmxfeed->ts_type & TS_DECODER && + (dvbdmxfeed->pes_typets_type & TS_PACKET) && + (dvbdmx->dmx.frontend->source!=DMX_MEMORY_FE)) + StopHWFilter(dvbdmxfeed->filter); + } + + if (dvbdmxfeed->type == DMX_TYPE_SEC) { + int i; + + for (i=0; ifilternum; i++) + if (dvbdmx->filter[i].state==DMX_STATE_GO && + dvbdmx->filter[i].filter.parent==&dvbdmxfeed->feed.sec) { + dvbdmx->filter[i].state=DMX_STATE_READY; + if (dvbdmx->dmx.frontend->source!=DMX_MEMORY_FE) + StopHWFilter(&dvbdmx->filter[i]); + } + } + return 0; +} + + +static void +restart_feeds(av7110_t *av7110) +{ + dvb_demux_t *dvbdmx=&av7110->demux; + dvb_demux_feed_t *feed; + int mode; + int i; + + mode=av7110->playing; + av7110->playing=0; + av7110->rec_mode=0; + + for (i=0; ifilternum; i++) { + feed=&dvbdmx->feed[i]; + if (feed->state==DMX_STATE_GO) + dvb_start_feed(feed); + } + + if (mode) + AV_StartPlay(av7110, mode); +} + +/****************************************************************************** + * SEC device file operations + ******************************************************************************/ + +static +int av7110_diseqc_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg) +{ + av7110_t *av7110 = fe->before_after_data; + + switch (cmd) { + case FE_SET_TONE: + switch ((fe_sec_tone_mode_t) arg) { + case SEC_TONE_ON: + Set22K (av7110, 1); + break; + case SEC_TONE_OFF: + Set22K (av7110, 0); + break; + default: + return -EINVAL; + }; + break; + + case FE_DISEQC_SEND_MASTER_CMD: + { + struct dvb_diseqc_master_cmd *cmd = arg; + + SendDiSEqCMsg (av7110, cmd->msg_len, cmd->msg, 0); + break; + } + + case FE_DISEQC_SEND_BURST: + SendDiSEqCMsg (av7110, 0, NULL, (int) arg); + break; + + default: + return -EOPNOTSUPP; + }; + + return 0; +} + +/****************************************************************************** + * CI link layer file ops (FIXME: move this to separate module later) + ******************************************************************************/ + +int ci_ll_init(ring_buffer_t *cirbuf, ring_buffer_t *ciwbuf, int size) +{ + ring_buffer_init(cirbuf, vmalloc(size), size); + ring_buffer_init(ciwbuf, vmalloc(size), size); + return 0; +} + +void ci_ll_flush(ring_buffer_t *cirbuf, ring_buffer_t *ciwbuf) +{ + ring_buffer_flush(cirbuf); + ring_buffer_flush(ciwbuf); +} + +void ci_ll_release(ring_buffer_t *cirbuf, ring_buffer_t *ciwbuf) +{ + vfree(cirbuf->data); + cirbuf->data=0; + vfree(ciwbuf->data); + ciwbuf->data=0; +} + + +int ci_ll_reset(ring_buffer_t *cibuf, struct file *file, + int slots, ca_slot_info_t *slot) +{ + int i; + + if (ring_buffer_free(cibuf)<8) + return -EBUSY; + for (i=0; i<2; i++) + if (slots&(1<data[cibuf->pwrite]=0x00; + cibuf->data[(cibuf->pwrite+1)%cibuf->size]=0x06; + cibuf->data[(cibuf->pwrite+2)%cibuf->size]=i; + cibuf->data[(cibuf->pwrite+3)%cibuf->size]=0x00; + cibuf->data[(cibuf->pwrite+4)%cibuf->size]=0xff; + cibuf->data[(cibuf->pwrite+5)%cibuf->size]=0x02; + cibuf->data[(cibuf->pwrite+6)%cibuf->size]=0x00; + cibuf->data[(cibuf->pwrite+7)%cibuf->size]=0x00; + cibuf->pwrite=(cibuf->pwrite+8)%cibuf->size; + slot[i].flags=0; + } + return 0; +} + +static ssize_t +ci_ll_write(ring_buffer_t *cibuf, struct file *file, const char *buf, size_t count, loff_t *ppos) +{ + int free, split; + int32_t pread; + int non_blocking=file->f_flags&O_NONBLOCK; + + if (count>2048) + return -EINVAL; + pread=cibuf->pread; + free=pread-cibuf->pwrite; + if (free<=0) + free+=cibuf->size; + if (count+2>=free) { + if (non_blocking) + return -EWOULDBLOCK; + if (wait_event_interruptible(cibuf->queue, + (ring_buffer_free(cibuf)>count+2))) + return 0; + } + cibuf->data[cibuf->pwrite]=(count>>8); + cibuf->data[(cibuf->pwrite+1)%cibuf->size]=(count&0xff); + cibuf->pwrite=(cibuf->pwrite+2)%cibuf->size; + + if (pread>cibuf->pwrite) + split=0; + else + split=cibuf->size-cibuf->pwrite; + if (split && splitdata + cibuf->pwrite, buf, split)) + return -EFAULT; + if (copy_from_user(cibuf->data, buf+split, count-split)) + return -EFAULT; + } else + if (copy_from_user(cibuf->data + cibuf->pwrite, buf, count)) + return -EFAULT; + cibuf->pwrite=(cibuf->pwrite+count)%cibuf->size; + return count; +} + +static ssize_t +ci_ll_read(ring_buffer_t *cibuf, struct file *file, char *buf, size_t count, loff_t *ppos) +{ + int split=0, avail, pwrite; + int non_blocking=file->f_flags&O_NONBLOCK; + + if (!cibuf->data || !count) + return 0; + if (non_blocking && (ring_buffer_empty(cibuf))) + return -EWOULDBLOCK; + if (wait_event_interruptible(cibuf->queue, + !ring_buffer_empty(cibuf))) + return 0; + pwrite=cibuf->pwrite; + avail=pwrite - cibuf->pread; + if (avail<0) + avail+=cibuf->size; + if (avail<4) + return 0; + count=(cibuf->data[cibuf->pread]<<8); + count|=cibuf->data[(cibuf->pread+1)%cibuf->size]; + if (availpread=(cibuf->pread+2)%cibuf->size; + + if (pwritepread) + split=cibuf->size-cibuf->pread; + if (split && splitdata+cibuf->pread, split)) + return -EFAULT; + if (copy_to_user(buf+split, cibuf->data, count-split)) + return -EFAULT; + } else + if (copy_to_user(buf, cibuf->data+cibuf->pread, count)) + return -EFAULT; + cibuf->pread=(cibuf->pread + count)%cibuf->size; + return count; +} + +static int +dvb_ca_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + int err=dvb_generic_open(inode, file); + + if (err<0) + return err; + ci_ll_flush(&av7110->ci_rbuffer, &av7110->ci_wbuffer); + return 0; +} + +static unsigned +int dvb_ca_poll(struct file *file, poll_table *wait) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + unsigned int mask=0; + + ring_buffer_t *rbuf=&av7110->ci_rbuffer; + ring_buffer_t *wbuf=&av7110->ci_wbuffer; + + if (!ring_buffer_empty(rbuf)) + mask|=POLLIN; + if (ring_buffer_avail(wbuf)>1024) + mask|=POLLOUT; + if (mask) + return mask; + + poll_wait(file, &rbuf->queue, wait); + + if (!ring_buffer_empty(rbuf)) + mask|=POLLIN; + if (ring_buffer_avail(wbuf)>1024) + mask|=POLLOUT; + + return mask; +} + +static int +dvb_ca_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + unsigned long arg=(unsigned long) parg; + + switch (cmd) { + case CA_RESET: +#ifdef NEW_CI + + return ci_ll_reset(&av7110->ci_wbuffer, file, arg, &av7110->ci_slot[0]); +#endif + break; + + case CA_GET_CAP: + { + ca_cap_t cap; + + cap.slot_num=2; +#ifdef NEW_CI + cap.slot_type=CA_CI_LINK; +#else + cap.slot_type=CA_CI; +#endif + cap.descr_num=16; + cap.descr_type=CA_ECD; + memcpy(parg, &cap, sizeof(cap)); + } + break; + + case CA_GET_SLOT_INFO: + { + ca_slot_info_t *info=(ca_slot_info_t *)parg; + + if (info->num>1) + return -EINVAL; +#ifdef NEW_CI + av7110->ci_slot[info->num].type = CA_CI_LINK; +#else + av7110->ci_slot[info->num].type = CA_CI; +#endif + memcpy(info, &av7110->ci_slot[info->num], sizeof(ca_slot_info_t)); + } + break; + + case CA_GET_MSG: + break; + + case CA_SEND_MSG: + break; + + case CA_GET_DESCR_INFO: + { + ca_descr_info_t info; + + info.num=16; + info.type=CA_ECD; + memcpy (parg, &info, sizeof (info)); + } + break; + + case CA_SET_DESCR: + { + ca_descr_t *descr=(ca_descr_t*) parg; + + if (descr->index>=16) + return -EINVAL; + if (descr->parity>1) + return -EINVAL; + outcom(av7110, COMTYPE_PIDFILTER, SetDescr, 5, + (descr->index<<8)|descr->parity, + (descr->cw[0]<<8)|descr->cw[1], + (descr->cw[2]<<8)|descr->cw[3], + (descr->cw[4]<<8)|descr->cw[5], + (descr->cw[6]<<8)|descr->cw[7]); + } + break; + + default: + return -EINVAL; + } + return 0; +} + +static ssize_t +dvb_ca_write(struct file *file, const char *buf, + size_t count, loff_t *ppos) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + return ci_ll_write(&av7110->ci_wbuffer, file, buf, count, ppos); +} + +static ssize_t +dvb_ca_read(struct file *file, char *buf, size_t count, loff_t *ppos) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + return ci_ll_read(&av7110->ci_rbuffer, file, buf, count, ppos); + +} + + + +/****************************************************************************** + * DVB device file operations + ******************************************************************************/ + +static unsigned int dvb_video_poll(struct file *file, poll_table *wait) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + unsigned int mask=0; + + if (av7110->playing) { + if (FREE_COND) + return (POLLOUT | POLLWRNORM); + + poll_wait(file, &av7110->avout.queue, wait); + + if (FREE_COND) + mask |= (POLLOUT | POLLWRNORM); + } else /* if not playing: may play if asked for */ + mask = (POLLOUT | POLLWRNORM); + + return mask; +} + +static ssize_t +dvb_video_write(struct file *file, const char *buf, + size_t count, loff_t *ppos) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + if (av7110->videostate.stream_source!=VIDEO_SOURCE_MEMORY) + return -EPERM; + + return dvb_play(av7110, buf, count, file->f_flags&O_NONBLOCK, 1, 1); +} + +static ssize_t +dvb_audio_write(struct file *file, const char *buf, + size_t count, loff_t *ppos) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + if (av7110->audiostate.stream_source!=AUDIO_SOURCE_MEMORY) { + printk(KERN_ERR "not audio source memory\n"); + return -EPERM; + } + return dvb_aplay(av7110, buf, count, file->f_flags&O_NONBLOCK, 0); +} + +u8 iframe_header[] = { 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00 }; + +#define MIN_IFRAME 400000 + +static void +play_iframe(av7110_t *av7110, u8 *buf, unsigned int len, int nonblock) +{ + int i, n=1; + + if (!(av7110->playing&RP_VIDEO)) { + AV_StartPlay(av7110, RP_VIDEO); + n=MIN_IFRAME/len+1; + } + + dvb_play(av7110, iframe_header, sizeof(iframe_header), 0, 1, 0); + + for (i=0; iipack[1]); +} + + +static int +dvb_video_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + unsigned long arg=(unsigned long) parg; + int ret=0; + + if (((file->f_flags&O_ACCMODE)==O_RDONLY) && + (cmd!=VIDEO_GET_STATUS)) + return -EPERM; + + switch (cmd) { + case VIDEO_STOP: + av7110->videostate.play_state=VIDEO_STOPPED; + if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY) + AV_Stop(av7110, RP_VIDEO); + else + vidcom(av7110, 0x000e, + av7110->videostate.video_blank ? 0 : 1); + av7110->trickmode=TRICK_NONE; + break; + + case VIDEO_PLAY: + av7110->trickmode=TRICK_NONE; + if (av7110->videostate.play_state==VIDEO_FREEZED) { + av7110->videostate.play_state=VIDEO_PLAYING; + vidcom(av7110, 0x000d, 0); + } + + if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY) { + if (av7110->playing==RP_AV) { + outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0); + av7110->playing&=~RP_VIDEO; + } + AV_StartPlay(av7110,RP_VIDEO); + vidcom(av7110, 0x000d, 0); + } else { + //AV_Stop(av7110, RP_VIDEO); + vidcom(av7110, 0x000d, 0); + } + av7110->videostate.play_state=VIDEO_PLAYING; + break; + + case VIDEO_FREEZE: + av7110->videostate.play_state=VIDEO_FREEZED; + if (av7110->playing&RP_VIDEO) + outcom(av7110, COMTYPE_REC_PLAY, __Pause, 0); + else + vidcom(av7110, 0x0102, 1); + av7110->trickmode=TRICK_FREEZE; + break; + + case VIDEO_CONTINUE: + if (av7110->playing&RP_VIDEO) + outcom(av7110, COMTYPE_REC_PLAY, __Continue, 0); + vidcom(av7110, 0x000d, 0); + av7110->videostate.play_state=VIDEO_PLAYING; + av7110->trickmode=TRICK_NONE; + break; + + case VIDEO_SELECT_SOURCE: + av7110->videostate.stream_source=(video_stream_source_t) arg; + break; + + case VIDEO_SET_BLANK: + av7110->videostate.video_blank=(int) arg; + break; + + case VIDEO_GET_STATUS: + memcpy(parg, &av7110->videostate, sizeof(struct video_status)); + break; + + case VIDEO_GET_EVENT: + //FIXME: write firmware support for this + ret=-EOPNOTSUPP; + + case VIDEO_SET_DISPLAY_FORMAT: + { + video_displayformat_t format=(video_displayformat_t) arg; + u16 val=0; + + switch(format) { + case VIDEO_PAN_SCAN: + val=VID_PAN_SCAN_PREF; + break; + + case VIDEO_LETTER_BOX: + val=VID_VC_AND_PS_PREF; + break; + + case VIDEO_CENTER_CUT_OUT: + val=VID_CENTRE_CUT_PREF; + break; + + default: + ret=-EINVAL; + break; + } + if (ret<0) + break; + av7110->videostate.video_format=format; + ret=outcom(av7110, COMTYPE_ENCODER, SetPanScanType, + 1, (u16) val); + break; + } + + case VIDEO_SET_FORMAT: + if (arg>1) { + ret=-EINVAL; + break; + } + av7110->display_ar=arg; + ret=outcom(av7110, COMTYPE_ENCODER, SetMonitorType, + 1, (u16) arg); + break; + + case VIDEO_STILLPICTURE: + { + struct video_still_picture *pic= + (struct video_still_picture *) parg; + ring_buffer_flush(&av7110->avout); + play_iframe(av7110, pic->iFrame, pic->size, + file->f_flags&O_NONBLOCK); + break; + } + + case VIDEO_FAST_FORWARD: + //note: arg is ignored by firmware + if (av7110->playing&RP_VIDEO) + outcom(av7110, COMTYPE_REC_PLAY, + __Scan_I, 2, AV_PES, 0); + else + vidcom(av7110, 0x16, arg); + av7110->trickmode=TRICK_FAST; + av7110->videostate.play_state=VIDEO_PLAYING; + break; + + case VIDEO_SLOWMOTION: + if (av7110->playing&RP_VIDEO) { + outcom(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0); + vidcom(av7110, 0x22, arg); + } else { + vidcom(av7110, 0x0d, 0); + vidcom(av7110, 0x0e, 0); + vidcom(av7110, 0x22, arg); + } + av7110->trickmode=TRICK_SLOW; + av7110->videostate.play_state=VIDEO_PLAYING; + break; + + case VIDEO_GET_CAPABILITIES: + *(int *)parg=VIDEO_CAP_MPEG1| + VIDEO_CAP_MPEG2| + VIDEO_CAP_SYS| + VIDEO_CAP_PROG; + break; + + case VIDEO_CLEAR_BUFFER: + ring_buffer_flush(&av7110->avout); + reset_ipack(&av7110->ipack[1]); + + if (av7110->playing==RP_AV) { + outcom(av7110, COMTYPE_REC_PLAY, + __Play, 2, AV_PES, 0); + if (av7110->trickmode==TRICK_FAST) + outcom(av7110, COMTYPE_REC_PLAY, + __Scan_I, 2, AV_PES, 0); + if (av7110->trickmode==TRICK_SLOW) { + outcom(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0); + vidcom(av7110, 0x22, arg); + } + if (av7110->trickmode==TRICK_FREEZE) + vidcom(av7110, 0x000e, 1); + } + break; + + case VIDEO_SET_STREAMTYPE: + + break; + + default: + ret=-ENOIOCTLCMD; + break; + } + return ret; +} + +static int +dvb_audio_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + unsigned long arg=(unsigned long) parg; + int ret=0; + + if (((file->f_flags&O_ACCMODE)==O_RDONLY) && + (cmd!=AUDIO_GET_STATUS)) + return -EPERM; + + switch (cmd) { + case AUDIO_STOP: + if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY) + AV_Stop(av7110, RP_AUDIO); + else + audcom(av7110, 1); + av7110->audiostate.play_state=AUDIO_STOPPED; + break; + + case AUDIO_PLAY: + if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY) + AV_StartPlay(av7110, RP_AUDIO); + audcom(av7110, 2); + av7110->audiostate.play_state=AUDIO_PLAYING; + break; + + case AUDIO_PAUSE: + audcom(av7110, 1); + av7110->audiostate.play_state=AUDIO_PAUSED; + break; + + case AUDIO_CONTINUE: + if (av7110->audiostate.play_state==AUDIO_PAUSED) { + av7110->audiostate.play_state=AUDIO_PLAYING; + audcom(av7110, 0x12); + } + break; + + case AUDIO_SELECT_SOURCE: + av7110->audiostate.stream_source=(audio_stream_source_t) arg; + break; + + case AUDIO_SET_MUTE: + { + audcom(av7110, arg ? 1 : 2); + av7110->audiostate.mute_state=(int) arg; + break; + } + + case AUDIO_SET_AV_SYNC: + av7110->audiostate.AV_sync_state=(int) arg; + audcom(av7110, arg ? 0x0f : 0x0e); + break; + + case AUDIO_SET_BYPASS_MODE: + ret=-EINVAL; + break; + + case AUDIO_CHANNEL_SELECT: + av7110->audiostate.channel_select=(audio_channel_select_t) arg; + + switch(av7110->audiostate.channel_select) { + case AUDIO_STEREO: + audcom(av7110, 0x80); + break; + + case AUDIO_MONO_LEFT: + audcom(av7110, 0x100); + break; + + case AUDIO_MONO_RIGHT: + audcom(av7110, 0x200); + break; + + default: + ret=-EINVAL; + break; + } + break; + + case AUDIO_GET_STATUS: + memcpy(parg, &av7110->audiostate, sizeof(struct audio_status)); + break; + + case AUDIO_GET_CAPABILITIES: + *(int *)parg=AUDIO_CAP_LPCM| + AUDIO_CAP_MP1| + AUDIO_CAP_MP2; + break; + + case AUDIO_CLEAR_BUFFER: + ring_buffer_flush(&av7110->aout); + reset_ipack(&av7110->ipack[0]); + if (av7110->playing==RP_AV) + outcom(av7110, COMTYPE_REC_PLAY, + __Play, 2, AV_PES, 0); + break; + case AUDIO_SET_ID: + + break; + case AUDIO_SET_MIXER: + { + struct audio_mixer *amix=(struct audio_mixer *)parg; + + SetVolume(av7110, amix->volume_left, amix->volume_right); + break; + } + case AUDIO_SET_STREAMTYPE: + break; + default: + ret=-ENOIOCTLCMD; + break; + } + return ret; +} + +static int +dvb_osd_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + +#ifdef CONFIG_DVB_AV7110_OSD + if (cmd==OSD_SEND_CMD) + return OSD_DrawCommand(av7110, (osd_cmd_t *)parg); +#endif + return -EINVAL; +} + +static int dvb_video_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + int err; + + if ((err=dvb_generic_open(inode, file))<0) + return err; + ring_buffer_flush(&av7110->aout); + ring_buffer_flush(&av7110->avout); + av7110->video_blank=1; + av7110->audiostate.AV_sync_state=1; + av7110->videostate.stream_source=VIDEO_SOURCE_DEMUX; + return 0; +} + +static int dvb_video_release(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + AV_Stop(av7110, RP_VIDEO); + return dvb_generic_release(inode, file); +} + +static int dvb_audio_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + int err=dvb_generic_open(inode, file); + + if (err<0) + return err; + ring_buffer_flush(&av7110->aout); + av7110->audiostate.stream_source=AUDIO_SOURCE_DEMUX; + return 0; +} + +static int dvb_audio_release(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + av7110_t *av7110=(av7110_t *) dvbdev->priv; + + AV_Stop(av7110, RP_AUDIO); + return dvb_generic_release(inode, file); +} + + + +/****************************************************************************** + * driver registration + ******************************************************************************/ + +static struct file_operations dvb_video_fops = { + owner: THIS_MODULE, + read: 0, + write: dvb_video_write, + ioctl: dvb_generic_ioctl, + open: dvb_video_open, + release: dvb_video_release, + poll: dvb_video_poll, +}; + +static dvb_device_t dvbdev_video = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_video_fops, + kernel_ioctl: dvb_video_ioctl, +}; + +static struct file_operations dvb_audio_fops = { + owner: THIS_MODULE, + read: 0, + write: dvb_audio_write, + ioctl: dvb_generic_ioctl, + open: dvb_audio_open, + release: dvb_audio_release, + poll: dvb_audio_poll, +}; + +static dvb_device_t dvbdev_audio = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_audio_fops, + kernel_ioctl: dvb_audio_ioctl, +}; + +static struct file_operations dvb_ca_fops = { + owner: THIS_MODULE, + read: dvb_ca_read, + write: dvb_ca_write, + ioctl: dvb_generic_ioctl, + open: dvb_ca_open, + release: dvb_generic_release, + poll: dvb_ca_poll, +}; + +static dvb_device_t dvbdev_ca = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_ca_fops, + kernel_ioctl: dvb_ca_ioctl, +}; + +static struct file_operations dvb_osd_fops = { + owner: THIS_MODULE, + read: 0, + write: 0, + ioctl: dvb_generic_ioctl, + open: dvb_generic_open, + release: dvb_generic_release, + poll: 0, +}; + +static dvb_device_t dvbdev_osd = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_osd_fops, + kernel_ioctl: dvb_osd_ioctl, +}; + + +static +void av7110_before_after_tune (fe_status_t s, void *data) +{ + struct av7110_s *av7110 = data; + + av7110->fe_synced = (s & FE_HAS_LOCK) ? 1 : 0; + + if (av7110->playing) + return; + + if (down_interruptible(&av7110->pid_mutex)) + return; + + if (av7110->fe_synced) { + SetPIDs(av7110, av7110->pids[DMX_PES_VIDEO], + av7110->pids[DMX_PES_AUDIO], + av7110->pids[DMX_PES_TELETEXT], 0, + av7110->pids[DMX_PES_PCR]); + outcom(av7110, COMTYPE_PIDFILTER, Scan, 0); + } else + SetPIDs(av7110, 0, 0, 0, 0, 0); + + up(&av7110->pid_mutex); +} + + +static int +dvb_register(av7110_t *av7110) +{ + int ret, i; + dmx_frontend_t *dvbfront=&av7110->hw_frontend; + dvb_demux_t *dvbdemux=&av7110->demux; + + if (av7110->registered) + return -1; + + av7110->registered=1; + + av7110->dvb_adapter = av7110->saa->dvb_adapter; + + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) + dvb_add_frontend_notifier (av7110->dvb_adapter, + av7110_before_after_tune, av7110); + /** + * init DiSEqC stuff + */ + if (av7110->saa->card_type==DVB_CARD_TT_BUDGET || + av7110->saa->card_type==DVB_CARD_TT_SIEMENS) + dvb_add_frontend_ioctls (av7110->dvb_adapter, + av7110_diseqc_ioctl, NULL, av7110); + + av7110->audiostate.AV_sync_state=0; + av7110->audiostate.mute_state=0; + av7110->audiostate.play_state=AUDIO_STOPPED; + av7110->audiostate.stream_source=AUDIO_SOURCE_DEMUX; + av7110->audiostate.channel_select=AUDIO_STEREO; + av7110->audiostate.bypass_mode=0; + + av7110->videostate.video_blank=0; + av7110->videostate.play_state=VIDEO_STOPPED; + av7110->videostate.stream_source=VIDEO_SOURCE_DEMUX; + av7110->videostate.video_format=VIDEO_FORMAT_4_3; + av7110->videostate.display_format=VIDEO_CENTER_CUT_OUT; + av7110->display_ar=VIDEO_FORMAT_4_3; + + memcpy(av7110->demux_id, "demux0_0", 9); + av7110->demux_id[7]=av7110->saa->dvb_adapter->num+0x30; + dvbdemux->priv=(void *) av7110; + + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) { + for (i=0; i<32; i++) + av7110->handle2filter[i]=NULL; + + dvbdemux->filternum=32; + dvbdemux->feednum=32; + dvbdemux->start_feed=dvb_start_feed; + dvbdemux->stop_feed=dvb_stop_feed; + dvbdemux->write_to_decoder=dvb_write_to_decoder; + + dvbdemux->dmx.vendor="TI"; + dvbdemux->dmx.model="AV7110"; + dvbdemux->dmx.id=av7110->demux_id; + dvbdemux->dmx.capabilities=(DMX_TS_FILTERING| + DMX_SECTION_FILTERING| + DMX_MEMORY_BASED_FILTERING); + + DvbDmxInit(&av7110->demux); + + + dvbfront->id="hw_frontend"; + dvbfront->vendor="VLSI"; + dvbfront->model="DVB Frontend"; + dvbfront->source=DMX_FRONTEND_0; + + av7110->dmxdev.filternum=32; + av7110->dmxdev.demux=&dvbdemux->dmx; + av7110->dmxdev.capabilities=0; + + DmxDevInit(&av7110->dmxdev, av7110->dvb_adapter); + } + + if (av7110->saa->card_type>=DVB_CARD_TT_BUDGET) { + dvbdemux->filternum=256; + dvbdemux->feednum=256; + dvbdemux->start_feed=dvb_start_feed; + dvbdemux->stop_feed=dvb_stop_feed; + dvbdemux->write_to_decoder=0; + + dvbdemux->dmx.vendor="CIM"; + dvbdemux->dmx.model="sw"; + dvbdemux->dmx.id=av7110->demux_id; + dvbdemux->dmx.capabilities=(DMX_TS_FILTERING| + DMX_SECTION_FILTERING| + DMX_MEMORY_BASED_FILTERING); + + DvbDmxInit(&av7110->demux); + + dvbfront->id="hw_frontend"; + dvbfront->vendor="VLSI"; + dvbfront->model="DVB Frontend"; + dvbfront->source=DMX_FRONTEND_0; + + av7110->dmxdev.filternum=256; + av7110->dmxdev.demux=&dvbdemux->dmx; + av7110->dmxdev.capabilities=0; + + DmxDevInit(&av7110->dmxdev, av7110->dvb_adapter); + } + + ret=dvbdemux->dmx.add_frontend(&dvbdemux->dmx, + &av7110->hw_frontend); + if (ret<0) + return ret; + + av7110->mem_frontend.id="mem_frontend"; + av7110->mem_frontend.vendor="memory"; + av7110->mem_frontend.model="sw"; + av7110->mem_frontend.source=DMX_MEMORY_FE; + ret=dvbdemux->dmx.add_frontend(&dvbdemux->dmx, + &av7110->mem_frontend); + if (ret<0) + return ret; + + ret=dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, + &av7110->hw_frontend); + if (ret<0) + return ret; + + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) { + dvb_register_device(av7110->dvb_adapter, &av7110->video_dev, + &dvbdev_video, av7110, DVB_DEVICE_VIDEO); + dvb_register_device(av7110->dvb_adapter, &av7110->audio_dev, + &dvbdev_audio, av7110, DVB_DEVICE_AUDIO); + dvb_register_device(av7110->dvb_adapter, &av7110->osd_dev, + &dvbdev_osd, av7110, DVB_DEVICE_OSD); + dvb_register_device(av7110->dvb_adapter, &av7110->ca_dev, + &dvbdev_ca, av7110, DVB_DEVICE_CA); + vid_register(av7110); +#ifdef USE_DVB_DSP + dvb->dsp_dev = dvb_register_dsp(dvb_audio_open, + dvb_audio_release, + dvb_audio_ioctl, + dvb_audio_write, + av7110->audio_dev); +#endif + } + + av7110->dvb_net.card_num=av7110->saa->dvb_adapter->num; + dvb_net_init(av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx); + + return 0; +} + + +static void +dvb_unregister(av7110_t *av7110) +{ + dvb_demux_t *dvbdemux=&av7110->demux; + + if (!av7110->registered) + return; + + dvb_net_release(&av7110->dvb_net); + + dvbdemux->dmx.close(&dvbdemux->dmx); + dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->hw_frontend); + dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->mem_frontend); + + DmxDevRelease(&av7110->dmxdev); + DvbDmxRelease(&av7110->demux); + + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) + dvb_remove_frontend_notifier (av7110->dvb_adapter, + av7110_before_after_tune); + + dvb_remove_frontend_ioctls (av7110->dvb_adapter, + av7110_diseqc_ioctl, NULL); + + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) { + vid_unregister(av7110); + dvb_unregister_device(av7110->audio_dev); + dvb_unregister_device(av7110->video_dev); + dvb_unregister_device(av7110->osd_dev); + dvb_unregister_device(av7110->ca_dev); +#ifdef USE_DVB_DSP + dvb_unregister_dsp(av7110->dsp_dev); +#endif + } +} + +/**************************************************************************** + * INITIALIZATION + ****************************************************************************/ + +static +int av7110_attach (struct saa7146 *saa, void **av7110_ptr) +{ + struct av7110_s *av7110; + + if (!(av7110 = kmalloc (sizeof (struct av7110_s), GFP_KERNEL))) { + printk ("%s: out of memory!\n", __FUNCTION__); + return -ENOMEM; + } + + *av7110_ptr = av7110; + + memset(av7110, 0, sizeof(av7110_t)); + + tasklet_init (&av7110->debi_tasklet, debiirq, (unsigned long) av7110); + tasklet_init (&av7110->gpio_tasklet, gpioirq, (unsigned long) av7110); + tasklet_init (&av7110->vpe_tasklet, vpeirq, (unsigned long) av7110); + tasklet_init (&av7110->fidb_tasklet, fidbirq, (unsigned long) av7110); + + sema_init(&av7110->pid_mutex, 1); + + /* locks for data transfers from/to AV7110 */ + spin_lock_init (&av7110->debilock); + sema_init(&av7110->dcomlock, 1); + av7110->debilock=SPIN_LOCK_UNLOCKED; + av7110->debitype=-1; + + av7110->saa=(struct saa7146 *) saa; + av7110->saa_mem=av7110->saa->mem; + + /* default ADAC type */ + av7110->adac_type = adac; + + /* default OSD window */ + av7110->osdwin=1; + + /* ARM "watchdog" */ + init_waitqueue_head(&av7110->arm_wait); + av7110->arm_thread=0; + + av7110->vidmode=VIDEO_MODE_PAL; + + init_ipack(&av7110->ipack[0], IPACKS, play_audio_cb); + av7110->ipack[0].data=(void *) av7110; + init_ipack(&av7110->ipack[1], IPACKS, play_video_cb); + av7110->ipack[1].data=(void *) av7110; + + + /* allocate and init buffers */ + + av7110->debi_virt=pci_alloc_consistent(av7110->saa->device, 8192, + &av7110->debi_bus); + if (!av7110->debi_virt) + return -1; + + av7110->iobuf=vmalloc(AVOUTLEN+AOUTLEN+BMPLEN+4*IPACKS); + if (!av7110->iobuf) + return -1; + + ring_buffer_init(&av7110->avout, av7110->iobuf, AVOUTLEN); + ring_buffer_init(&av7110->aout, av7110->iobuf+AVOUTLEN, AOUTLEN); + + /* init BMP buffer */ + av7110->bmpbuf=av7110->iobuf+AVOUTLEN+AOUTLEN; + init_waitqueue_head(&av7110->bmpq); + + av7110->kbuf[0]=(u8 *)(av7110->iobuf+AVOUTLEN+AOUTLEN+BMPLEN); + av7110->kbuf[1]=av7110->kbuf[0]+2*IPACKS; + + /* CI link layer buffers */ + ci_ll_init(&av7110->ci_rbuffer, &av7110->ci_wbuffer, 8192); + + /* handle different card types */ + + /* load firmware into AV7110 cards */ + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) { + bootarm(av7110); + firmversion(av7110); + if ((av7110->arm_app&0xffff)<0x2502) { + printk("av7110: Warning, firmware version is too old. System might be unstable!!!\n"); + } + kernel_thread(arm_thread, (void *) av7110, 0); + } else { + saa7146_write(av7110->saa_mem, DD1_INIT, 0x02000600); + saa7146_write(av7110->saa_mem, MC2, + (MASK_09 | MASK_25 | MASK_10 | MASK_26)); + setgpio(av7110, 2, GPIO_OUTHI); /* frontend power on */ + } + + SetVolume(av7110, 0xff, 0xff); + + if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) { + VidMode(av7110, vidmode); + + /* remaining inits according to card and frontend type */ + + if (i2c_writereg(av7110, 0x20, 0x00, 0x00)==1) { + dprintk("av7110%d: Crystal audio DAC detected\n", + av7110->saa->dvb_adapter->num); + av7110->adac_type = DVB_ADAC_CRYSTAL; + i2c_writereg(av7110, 0x20, 0x01, 0xd2); + i2c_writereg(av7110, 0x20, 0x02, 0x49); + i2c_writereg(av7110, 0x20, 0x03, 0x00); + i2c_writereg(av7110, 0x20, 0x04, 0x00); + } + + /** + * some special handling for the Siemens DVB-C card... + */ + if (av7110->saa->device->subsystem_vendor == 0x110a) { + if (i2c_writereg(av7110, 0x80, 0x0, 0x80)==1) { + i2c_writereg(av7110, 0x80, 0x0, 0); + printk("av7110: DVB-C analog module detected, " + "initializing MSP3400\n"); + ddelay(10); + msp_writereg(av7110, 0x12, 0x0013, 0x0c00); + msp_writereg(av7110, 0x12, 0x0000, 0x7f00); // loudspeaker + headphone + msp_writereg(av7110, 0x12, 0x0008, 0x0220); // loudspeaker source + msp_writereg(av7110, 0x12, 0x0004, 0x7f00); // loudspeaker volume + msp_writereg(av7110, 0x12, 0x000a, 0x0220); // SCART 1 source + msp_writereg(av7110, 0x12, 0x0007, 0x7f00); // SCART 1 volume + msp_writereg(av7110, 0x12, 0x000d, 0x4800); // prescale SCART + } + + // switch DVB SCART on + outcom(av7110, COMTYPE_AUDIODAC, MainSwitch, 1, 0); + outcom(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 1); + + //setgpio(av7110, 1, GPIO_OUTHI); // RGB on, SCART pin 16 + //setgpio(av7110, 3, GPIO_OUTLO); // SCARTpin 8 + av7110->adac_type = DVB_ADAC_NONE; + } + } + + if (init_vpid != 0 || init_apid != 0) + ChangePIDs(av7110, init_vpid, init_apid, 0, 0, 0); + + av7110_setup_irc_config (av7110, 0); + dvb_register(av7110); + + return 0; +} + + +static +int av7110_detach (struct saa7146 *saa, void** av7110_ptr) +{ + struct av7110_s *av7110 = *av7110_ptr; + + av7110->arm_rmmod=1; + wake_up_interruptible(&av7110->arm_wait); + + while (av7110->arm_thread) + ddelay(1); + + dvb_unregister(av7110); + + saa7146_write (av7110->saa_mem, IER, + saa7146_read(av7110->saa_mem, IER) & ~(MASK_19 | MASK_03)); + + saa7146_write(av7110->saa_mem, ISR,(MASK_19 | MASK_03)); + + ci_ll_release(&av7110->ci_rbuffer, &av7110->ci_wbuffer); + free_ipack(&av7110->ipack[0]); + free_ipack(&av7110->ipack[1]); + vfree(av7110->iobuf); + pci_free_consistent(av7110->saa->device, 8192, av7110->debi_virt, + av7110->debi_bus); + + kfree (av7110); + *av7110_ptr = NULL; + + return 0; +} + + +static +void av7110_irq(struct saa7146 *saa, u32 isr, void *data) +{ + struct av7110_s *av7110 = (struct av7110_s*) data; + + if (isr & MASK_19) + tasklet_schedule (&av7110->debi_tasklet); + + if (isr & MASK_03) + tasklet_schedule (&av7110->gpio_tasklet); + + if (isr & MASK_10) + tasklet_schedule (&av7110->vpe_tasklet); + + if (isr & MASK_07) + tasklet_schedule (&av7110->fidb_tasklet); +} + + +static +int av7110_command(struct saa7146 *saa, void *p, unsigned int cmd, void *arg) +{ + switch(cmd) { + case SAA7146_SUSPEND: + printk("dvb_suspend()\n"); + break; + case SAA7146_RESUME: + printk("dvb_resume()\n"); + break; + default: + return -ENOIOCTLCMD; + } + return 0; +} + + +static +void av7110_inc_use(struct saa7146* adap) +{ + MOD_INC_USE_COUNT; +} + + +static +void av7110_dec_use(struct saa7146* adap) +{ + MOD_DEC_USE_COUNT; +} + + +static struct saa7146_extension av7110_extension = { + "dvb extension\0", + MASK_07|MASK_10|MASK_19|MASK_03|MASK_27, + av7110_irq, + av7110_command, + av7110_attach, + av7110_detach, + av7110_inc_use, + av7110_dec_use +}; + + +int __init av7110_init(void) +{ + int result = 0; + + if ((result = saa7146_add_extension(&av7110_extension))) { + printk("%s: saa7146_add_extension() failed!\n", + __FUNCTION__); + return result; + } + + return result; +} + + +void __exit av7110_exit(void) +{ + if (saa7146_del_extension(&av7110_extension)) + printk(KERN_ERR "dvb: extension deregistration failed.\n"); +} + +//MODULE_DESCRIPTION("driver for the SAA7146 based AV110 PCI DVB cards by " +// "Siemens, Technotrend, Hauppauge"); +//MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, others"); +//MODULE_LICENSE("GPL"); + +MODULE_PARM(av7110_debug,"i"); +MODULE_PARM(vidmem,"l"); +MODULE_PARM(vidlow,"l"); +MODULE_PARM(vidmode,"i"); +MODULE_PARM(init_vpid,"i"); +MODULE_PARM(init_apid,"i"); +MODULE_PARM(pids_off,"i"); +MODULE_PARM(adac,"i"); + +/* + * Local variables: + * c-indent-level: 8 + * c-brace-imaginary-offset: 0 + * c-brace-offset: -8 + * c-argdecl-indent: 8 + * c-label-offset: -8 + * c-continued-statement-offset: 8 + * c-continued-brace-offset: 0 + * indent-tabs-mode: nil + * tab-width: 8 + * End: + */ + diff -Nru a/drivers/media/dvb/av7110/av7110.h b/drivers/media/dvb/av7110/av7110.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/av7110/av7110.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,743 @@ +#ifndef _AV7110_H_ +#define _AV7110_H_ + +#define DVB_FIRM_PATH "/lib/DVB/" + +#include +#include +#include +#include + +#ifdef CONFIG_DEVFS_FS +#include +#endif + +/* DEBI transfer mode defs */ + +#define DEBINOSWAP 0x000e0000 +#define DEBISWAB 0x001e0000 +#define DEBISWAP 0x002e0000 + +#define ARM_WAIT_FREE (HZ) +#define ARM_WAIT_SHAKE (HZ/5) +#define ARM_WAIT_OSD (HZ) + +#if LINUX_VERSION_CODE < 0x020300 +#define net_device device +#define DECLARE_MUTEX(foo) struct semaphore foo = MUTEX +#define DECLARE_MUTEX_LOCKED(foo) struct semaphore foo = MUTEX_LOCKED +#define WAIT_QUEUE struct wait_queue* +#define init_waitqueue_head(wq) *(wq) = NULL; +#define DECLARE_WAITQUEUE(wait, current) struct wait_queue wait = { current, NULL } +#define set_current_state(state_value) \ + do { current->state = state_value; } while (0) +#define list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +#else + +#define WAIT_QUEUE wait_queue_head_t + +#endif + +#include +#include +#include +#include +#include +#include + +#include "../dvb-core/dvbdev.h" +#include "../dvb-core/demux.h" +#include "../dvb-core/dvb_demux.h" +#include "../dvb-core/dmxdev.h" +#include "../dvb-core/dvb_filter.h" +#include "../dvb-core/dvb_net.h" + + +typedef enum BOOTSTATES +{ + BOOTSTATE_BUFFER_EMPTY = 0, + BOOTSTATE_BUFFER_FULL = 1, + BOOTSTATE_BOOT_COMPLETE = 2 +} BOOTSTATES; + +typedef enum GPIO_MODE +{ + GPIO_INPUT = 0x00, + GPIO_IRQHI = 0x10, + GPIO_IRQLO = 0x20, + GPIO_IRQHL = 0x30, + GPIO_OUTLO = 0x40, + GPIO_OUTHI = 0x50 +} GPIO_MODE; + +typedef enum +{ RP_None, + AudioPES, + AudioMp2, + AudioPCM, + VideoPES, + AV_PES +} TYPE_REC_PLAY_FORMAT; + +typedef struct PARAMSTRUCT +{ + unsigned int wCommand; + int error; + unsigned long pdwData[100]; +} PARAMSTRUCT, *PPARAMSTRUCT; + +typedef enum OSDPALTYPE +{ + NoPalet = 0, /* No palette */ + Pal1Bit = 2, /* 2 colors for 1 Bit Palette */ + Pal2Bit = 4, /* 4 colors for 2 bit palette */ + Pal4Bit = 16, /* 16 colors for 4 bit palette */ + Pal8Bit = 256 /* 256 colors for 16 bit palette */ +} OSDPALTYPE, *POSDPALTYPE; + +typedef enum { + BITMAP1, /* 1 bit bitmap */ + BITMAP2, /* 2 bit bitmap */ + BITMAP4, /* 4 bit bitmap */ + BITMAP8, /* 8 bit bitmap */ + BITMAP1HR, /* 1 Bit bitmap half resolution */ + BITMAP2HR, /* 2 bit bitmap half resolution */ + BITMAP4HR, /* 4 bit bitmap half resolution */ + BITMAP8HR, /* 8 bit bitmap half resolution */ + YCRCB422, /* 4:2:2 YCRCB Graphic Display */ + YCRCB444, /* 4:4:4 YCRCB Graphic Display */ + YCRCB444HR, /* 4:4:4 YCRCB graphic half resolution */ + VIDEOTSIZE, /* True Size Normal MPEG Video Display */ + VIDEOHSIZE, /* MPEG Video Display Half Resolution */ + VIDEOQSIZE, /* MPEG Video Display Quarter Resolution */ + VIDEODSIZE, /* MPEG Video Display Double Resolution */ + VIDEOTHSIZE, /* True Size MPEG Video Display Half Resolution */ + VIDEOTQSIZE, /* True Size MPEG Video Display Quarter Resolution*/ + VIDEOTDSIZE, /* True Size MPEG Video Display Double Resolution */ + VIDEONSIZE, /* Full Size MPEG Video Display */ + CURSOR /* Cursor */ +} DISPTYPE; /* Window display type */ + +// switch defines +#define SB_GPIO 3 +#define SB_OFF GPIO_OUTLO //SlowBlank aus (TV-Mode) +#define SB_ON GPIO_INPUT //SlowBlank an (AV-Mode) +#define SB_WIDE GPIO_OUTHI //SlowBlank 6V (16/9-Mode) nicht realisiert + +#define FB_GPIO 1 +#define FB_OFF GPIO_LO //FastBlank aus (CVBS-Mode) +#define FB_ON GPIO_OUTHI //FastBlank an (RGB-Mode) +#define FB_LOOP GPIO_INPUT //FastBlank der PC-Grafik durchschleifen + +typedef enum VIDEOOUTPUTMODE +{ + NO_OUT = 0, //disable analog Output + CVBS_RGB_OUT = 1, + CVBS_YC_OUT = 2, + YC_OUT = 3 +} VIDEOOUTPUTMODE, *PVIDEOOUTPUTMODE; + + +#define GPMQFull 0x0001 //Main Message Queue Full +#define GPMQOver 0x0002 //Main Message Queue Overflow +#define HPQFull 0x0004 //High Priority Msg Queue Full +#define HPQOver 0x0008 +#define OSDQFull 0x0010 //OSD Queue Full +#define OSDQOver 0x0020 + +#define SECTION_EIT 0x01 +#define SECTION_SINGLE 0x00 +#define SECTION_CYCLE 0x02 +#define SECTION_CONTINUOS 0x04 +#define SECTION_MODE 0x06 +#define SECTION_IPMPE 0x0C // bis zu 4k groß +#define SECTION_HIGH_SPEED 0x1C // vergrößerter Puffer für High Speed Filter +#define DATA_PIPING_FLAG 0x20 // für Data Piping Filter + +#define PBUFSIZE_NONE 0x0000 +#define PBUFSIZE_1P 0x0100 +#define PBUFSIZE_2P 0x0200 +#define PBUFSIZE_1K 0x0300 +#define PBUFSIZE_2K 0x0400 +#define PBUFSIZE_4K 0x0500 +#define PBUFSIZE_8K 0x0600 +#define PBUFSIZE_16K 0x0700 +#define PBUFSIZE_32K 0x0800 + +typedef enum { + WCreate, + WDestroy, + WMoveD, + WMoveA, + WHide, + WTop, + DBox, + DLine, + DText, + Set_Font, + SetColor, + SetBlend, + SetWBlend, + SetCBlend, + SetNonBlend, + LoadBmp, + BlitBmp, + ReleaseBmp, + SetWTrans, + SetWNoTrans +} OSDCOM; + +typedef enum { + MultiPID, + VideoPID, + AudioPID, + InitFilt, + FiltError, + NewVersion, + CacheError, + AddPIDFilter, + DelPIDFilter, + Scan, + SetDescr, + SetIR +} PIDCOM; + +typedef enum { + SelAudChannels +} MPEGCOM; + +typedef enum { + AudioDAC, + CabADAC, + ON22K, + OFF22K, + MainSwitch, + ADSwitch, + SendDiSEqC, + SetRegister +} AUDCOM; + +typedef enum { + AudioState, + AudioBuffState, + VideoState1, + VideoState2, + VideoState3, + CrashCounter, + ReqVersion, + ReqVCXO, + ReqRegister +} REQCOM; + +typedef enum { + SetVidMode, + SetTestMode, + LoadVidCode, + SetMonitorType, + SetPanScanType, + SetFreezeMode +} ENC; + +typedef enum { + __Record, + __Stop, + __Play, + __Pause, + __Slow, + __FF_IP, + __Scan_I, + __Continue +} REC_PLAY; + +typedef enum { + COMTYPE_NOCOM, + COMTYPE_PIDFILTER, + COMTYPE_MPEGDECODER, + COMTYPE_OSD, + COMTYPE_BMP, + COMTYPE_ENCODER, + COMTYPE_AUDIODAC, + COMTYPE_REQUEST, + COMTYPE_SYSTEM, + COMTYPE_REC_PLAY, + COMTYPE_COMMON_IF, + COMTYPE_PID_FILTER, + COMTYPE_PES, + COMTYPE_TS, + COMTYPE_VIDEO, + COMTYPE_AUDIO, + COMTYPE_CI_LL, +} COMTYPE; + +typedef enum { + AV7110_VIDEO_FREEZE, + AV7110_VIDEO_CONTINUE +} VIDEOCOM; + +typedef enum { + DVB_AUDIO_PAUSE, +} AUDIOCOM; + + +#define VID_NONE_PREF 0x00 /* No aspect ration processing preferred */ +#define VID_PAN_SCAN_PREF 0x01 /* Pan and Scan Display preferred */ +#define VID_VERT_COMP_PREF 0x02 /* Vertical compression display preferred */ +#define VID_VC_AND_PS_PREF 0x03 /* PanScan and vertical Compression if allowed */ +#define VID_CENTRE_CUT_PREF 0x05 /* PanScan with zero vector */ + +#define DATA_NONE 0x00 +#define DATA_FSECTION 0x01 +#define DATA_IPMPE 0x02 +#define DATA_MPEG_RECORD 0x03 +#define DATA_DEBUG_MESSAGE 0x04 +#define DATA_COMMON_INTERFACE 0x05 +#define DATA_MPEG_PLAY 0x06 +#define DATA_BMP_LOAD 0x07 +#define DATA_IRCOMMAND 0x08 +#define DATA_PIPING 0x09 +#define DATA_STREAMING 0x0a +#define DATA_CI_GET 0x0b +#define DATA_CI_PUT 0x0c + +#define DATA_PES_RECORD 0x10 +#define DATA_PES_PLAY 0x11 +#define DATA_TS_RECORD 0x12 +#define DATA_TS_PLAY 0x13 + +#define CI_CMD_ERROR 0x00 +#define CI_CMD_ACK 0x01 +#define CI_CMD_SYSTEM_READY 0x02 +#define CI_CMD_KEYPRESS 0x03 +#define CI_CMD_ON_TUNED 0x04 +#define CI_CMD_ON_SWITCH_PROGRAM 0x05 +#define CI_CMD_SECTION_ARRIVED 0x06 +#define CI_CMD_SECTION_TIMEOUT 0x07 +#define CI_CMD_TIME 0x08 +#define CI_CMD_ENTER_MENU 0x09 +#define CI_CMD_FAST_PSI 0x0a +#define CI_CMD_GET_SLOT_INFO 0x0b + +#define CI_MSG_NONE 0x00 +#define CI_MSG_CI_INFO 0x01 +#define CI_MSG_MENU 0x02 +#define CI_MSG_LIST 0x03 +#define CI_MSG_TEXT 0x04 +#define CI_MSG_REQUEST_INPUT 0x05 +#define CI_MSG_INPUT_COMPLETE 0x06 +#define CI_MSG_LIST_MORE 0x07 +#define CI_MSG_MENU_MORE 0x08 +#define CI_MSG_CLOSE_MMI_IMM 0x09 +#define CI_MSG_SECTION_REQUEST 0x0a +#define CI_MSG_CLOSE_FILTER 0x0b +#define CI_PSI_COMPLETE 0x0c +#define CI_MODULE_READY 0x0d +#define CI_SWITCH_PRG_REPLY 0x0e +#define CI_MSG_TEXT_MORE 0x0f + +#define CI_MSG_CA_PMT 0xe0 +#define CI_MSG_ERROR 0xf0 + +typedef struct ring_buffer_s { + u8 *data; + int size; + int pread; + int pwrite; + + WAIT_QUEUE queue; + spinlock_t lock; + struct semaphore sema; + + int error; +} ring_buffer_t; + + +#define PROG_STREAM_MAP 0xBC +#define PRIVATE_STREAM1 0xBD +#define PADDING_STREAM 0xBE +#define PRIVATE_STREAM2 0xBF +#define AUDIO_STREAM_S 0xC0 +#define AUDIO_STREAM_E 0xDF +#define VIDEO_STREAM_S 0xE0 +#define VIDEO_STREAM_E 0xEF +#define ECM_STREAM 0xF0 +#define EMM_STREAM 0xF1 +#define DSM_CC_STREAM 0xF2 +#define ISO13522_STREAM 0xF3 +#define PROG_STREAM_DIR 0xFF + +#define PTS_DTS_FLAGS 0xC0 + +//pts_dts flags +#define PTS_ONLY 0x80 +#define PTS_DTS 0xC0 +#define TS_SIZE 188 +#define TRANS_ERROR 0x80 +#define PAY_START 0x40 +#define TRANS_PRIO 0x20 +#define PID_MASK_HI 0x1F +//flags +#define TRANS_SCRMBL1 0x80 +#define TRANS_SCRMBL2 0x40 +#define ADAPT_FIELD 0x20 +#define PAYLOAD 0x10 +#define COUNT_MASK 0x0F + +// adaptation flags +#define DISCON_IND 0x80 +#define RAND_ACC_IND 0x40 +#define ES_PRI_IND 0x20 +#define PCR_FLAG 0x10 +#define OPCR_FLAG 0x08 +#define SPLICE_FLAG 0x04 +#define TRANS_PRIV 0x02 +#define ADAP_EXT_FLAG 0x01 + +// adaptation extension flags +#define LTW_FLAG 0x80 +#define PIECE_RATE 0x40 +#define SEAM_SPLICE 0x20 + +#define MAX_PLENGTH 0xFFFF +#define MAX_VID_PES 0x1FFF + +typedef struct section_s { + int id; + int length; + int found; + u8 payload[4096+3]; +} section_t; + + +#define MY_STATE_PES_START 1 +#define MY_STATE_PES_STARTED 2 +#define MY_STATE_FULL 4 + +#define MASKL DMX_MAX_FILTER_SIZE +#define MAXFILT 32 + +struct dvb_filter { + int state; + int flags; + int type; + u8 ts_state; + + u16 pid; + u8 value[MASKL]; + u8 mask[MASKL]; +}; + + +enum {AV_PES_STREAM, PS_STREAM, TS_STREAM, PES_STREAM}; + +typedef struct ps_packet_s{ + u8 scr[6]; + u8 mux_rate[3]; + u8 stuff_length; + u8 data[20]; + u8 sheader_llength[2]; + int sheader_length; + u8 rate_bound[3]; + u8 audio_bound; + u8 video_bound; + u8 reserved; + int npes; + int mpeg; +} ps_packet_t; + +typedef struct a2p_s{ + int type; + int found; + int length; + int headr; + u8 cid; + u8 flags; + u8 abuf[MAX_PLENGTH]; + int alength; + u8 vbuf[MAX_PLENGTH]; + int vlength; + int plength; + u8 last_av_pts[4]; + u8 av_pts[4]; + u8 scr[4]; + u16 count0; + u16 count1; + u16 pidv; + u16 pida; + u16 countv; + u16 counta; + void *dataA; + void *dataV; + void (*write_cb)(u8 const *buf, long int count, + void *data); +} a2p_t; + + +typedef struct p2t_s { + u8 pes[TS_SIZE]; + u8 counter; + long int pos; + int frags; + dvb_demux_feed_t *feed; +} p2t_t; + + +/* place to store all the necessary device information */ +typedef struct av7110_s { + + /* devices */ + + struct dvb_device dvb_dev; + dvb_net_t dvb_net; + struct video_device video; + + struct saa7146 *saa; + + struct tasklet_struct debi_tasklet; + struct tasklet_struct gpio_tasklet; + struct tasklet_struct vpe_tasklet; + struct tasklet_struct fidb_tasklet; + + int adac_type; /* audio DAC type */ +#define DVB_ADAC_TI 0 +#define DVB_ADAC_CRYSTAL 1 +#define DVB_ADAC_NONE -1 + + + /* buffers */ + + void *iobuf; /* memory for all buffers */ + ring_buffer_t avout; /* buffer for video or A/V mux */ +#define AVOUTLEN (128*1024) + ring_buffer_t aout; /* buffer for audio */ +#define AOUTLEN (64*1024) + void *bmpbuf; +#define BMPLEN (8*32768+1024) + + /* bitmap buffers and states */ + + int bmpp; + int bmplen; + int bmp_win; + u16 bmp_x, bmp_y; + int bmp_trans; + int bmp_state; +#define BMP_NONE 0 +#define BMP_LOADING 1 +#define BMP_LOADINGS 2 +#define BMP_LOADED 3 + WAIT_QUEUE bmpq; + + + /* DEBI and polled command interface */ + + spinlock_t debilock; + struct semaphore dcomlock; + int debitype; + int debilen; + int debibuf; + + + /* Recording and playback flags */ + + int rec_mode; + int playing; +#define RP_NONE 0 +#define RP_VIDEO 1 +#define RP_AUDIO 2 +#define RP_AV 3 + + + /* OSD */ + + int osdwin; /* currently active window */ + u16 osdbpp[8]; + + + /* CA */ + + ca_slot_info_t ci_slot[2]; + + int vidmode; + dmxdev_t dmxdev; + dvb_demux_t demux; + char demux_id[16]; + + dmx_frontend_t hw_frontend; + dmx_frontend_t mem_frontend; + + int fe_synced; + struct semaphore pid_mutex; + + int video_blank; + struct video_status videostate; + int display_ar; + int trickmode; +#define TRICK_NONE 0 +#define TRICK_FAST 1 +#define TRICK_SLOW 2 +#define TRICK_FREEZE 3 + struct audio_status audiostate; + + dvb_demux_filter_t *handle2filter[32]; + p2t_t p2t_filter[MAXFILT]; + pes2ts_t p2t[2]; + struct ipack_s ipack[2]; + u8 *kbuf[2]; + + int sinfo; + int shsize; + int swsize; + + int tsf; + u32 ttbp; + int feeding; + + int arm_errors; + int registered; + + + /* AV711X */ + + u32 arm_fw; + u32 arm_rtsl; + u32 arm_vid; + u32 arm_app; + u32 avtype; + int arm_ready; + struct task_struct *arm_thread; + WAIT_QUEUE arm_wait; + u16 arm_loops; + int arm_rmmod; + + void *saa_mem; + void *debi_virt; + dma_addr_t debi_bus; + + u16 pids[DMX_PES_OTHER]; + + ring_buffer_t ci_rbuffer; + ring_buffer_t ci_wbuffer; + + + dvb_adapter_t *dvb_adapter; + dvb_device_t *video_dev; + dvb_device_t *audio_dev; + dvb_device_t *ca_dev; + dvb_device_t *osd_dev; + + int dsp_dev; +} av7110_t; + + +#define DPRAM_BASE 0x4000 + +#define BOOT_STATE (DPRAM_BASE + 0x3F8) +#define BOOT_SIZE (DPRAM_BASE + 0x3FA) +#define BOOT_BASE (DPRAM_BASE + 0x3FC) +#define BOOT_BLOCK (DPRAM_BASE + 0x400) +#define BOOT_MAX_SIZE 0xc00 + +#define IRQ_STATE (DPRAM_BASE + 0x0F4) +#define IRQ_STATE_EXT (DPRAM_BASE + 0x0F6) +#define MSGSTATE (DPRAM_BASE + 0x0F8) +#define FILT_STATE (DPRAM_BASE + 0x0FA) +#define COMMAND (DPRAM_BASE + 0x0FC) +#define COM_BUFF (DPRAM_BASE + 0x100) +#define COM_BUFF_SIZE 0x20 + +#define BUFF1_BASE (DPRAM_BASE + 0x120) +#define BUFF1_SIZE 0xE0 + +#define DATA_BUFF_BASE (DPRAM_BASE + 0x200) +#define DATA_BUFF_SIZE 0x1C00 + +/* new buffers */ + +#define DATA_BUFF0_BASE (DPRAM_BASE + 0x200) +#define DATA_BUFF0_SIZE 0x0800 + +#define DATA_BUFF1_BASE (DATA_BUFF0_BASE+DATA_BUFF0_SIZE) +#define DATA_BUFF1_SIZE 0x0800 + +#define DATA_BUFF2_BASE (DATA_BUFF1_BASE+DATA_BUFF1_SIZE) +#define DATA_BUFF2_SIZE 0x0800 + +#define Reserved (DPRAM_BASE + 0x1E00) +#define Reserved_SIZE 0x1C0 + +#define DEBUG_WINDOW (DPRAM_BASE + 0x1FC0) +#define DBG_LOOP_CNT (DEBUG_WINDOW + 0x00) +#define DBG_SEC_CNT (DEBUG_WINDOW + 0x02) +#define DBG_AVRP_BUFF (DEBUG_WINDOW + 0x04) +#define DBG_AVRP_PEAK (DEBUG_WINDOW + 0x06) +#define DBG_MSG_CNT (DEBUG_WINDOW + 0x08) +#define DBG_CODE_REG (DEBUG_WINDOW + 0x0a) +#define DBG_TTX_Q (DEBUG_WINDOW + 0x0c) +#define DBG_AUD_EN (DEBUG_WINDOW + 0x0e) +#define DBG_WRONG_COM (DEBUG_WINDOW + 0x10) +#define DBG_ARR_OVFL (DEBUG_WINDOW + 0x12) +#define DBG_BUFF_OVFL (DEBUG_WINDOW + 0x14) +#define DBG_OVFL_CNT (DEBUG_WINDOW + 0x16) +#define DBG_SEC_OVFL (DEBUG_WINDOW + 0x18) + +#define STATUS_BASE (DPRAM_BASE + 0x1FC0) +#define STATUS_SCR (STATUS_BASE + 0x00) +#define STATUS_MODES (STATUS_BASE + 0x04) +#define STATUS_LOOPS (STATUS_BASE + 0x08) + +#define RX_TYPE (DPRAM_BASE + 0x1FE8) +#define RX_LEN (DPRAM_BASE + 0x1FEA) +#define TX_TYPE (DPRAM_BASE + 0x1FEC) +#define TX_LEN (DPRAM_BASE + 0x1FEE) + +#define RX_BUFF (DPRAM_BASE + 0x1FF4) +#define TX_BUFF (DPRAM_BASE + 0x1FF6) + +#define HANDSHAKE_REG (DPRAM_BASE + 0x1FF8) +#define COM_IF_LOCK (DPRAM_BASE + 0x1FFA) + +#define IRQ_RX (DPRAM_BASE + 0x1FFC) +#define IRQ_TX (DPRAM_BASE + 0x1FFE) + +#define DRAM_START_CODE 0x2e000404 +#define DRAM_MAX_CODE_SIZE 0x00100000 + +#define RESET_LINE 2 +#define DEBI_DONE_LINE 1 +#define ARM_IRQ_LINE 0 + +#define DAC_CS 0x8000 +#define DAC_CDS 0x0000 + + +extern unsigned char *av7110_dpram_addr, *av7110_root_addr; +extern int av7110_dpram_len, av7110_root_len; + +extern void av7110_register_irc_handler(void (*func)(u32)); +extern void av7110_unregister_irc_handler(void (*func)(u32)); +extern void av7110_setup_irc_config (av7110_t *av7110, u32 ir_config); + +extern int av7110_init (void); +extern int av7110_ir_init (void); + +extern void av7110_exit (void); +extern void av7110_ir_exit (void); + + +#endif /* _AV7110_H_ */ + +/* + * Local variables: + * c-indent-level: 8 + * c-brace-imaginary-offset: 0 + * c-brace-offset: -8 + * c-argdecl-indent: 8 + * c-label-offset: -8 + * c-continued-statement-offset: 8 + * c-continued-brace-offset: 0 + * indent-tabs-mode: nil + * tab-width: 8 + * End: + */ diff -Nru a/drivers/media/dvb/av7110/av7110_firm.h b/drivers/media/dvb/av7110/av7110_firm.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/av7110/av7110_firm.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,31852 @@ + +#include + +u8 Dpram [] __initdata = { + 0xe5, 0x9f, 0xf0, 0x1c, 0xe1, 0xb0, 0xf0, 0x0e, + 0xe5, 0x9f, 0xf0, 0x18, 0xe2, 0x5e, 0xf0, 0x04, + 0xe2, 0x5e, 0xf0, 0x08, 0xe1, 0xa0, 0x00, 0x00, + 0xea, 0x00, 0x00, 0x06, 0xe2, 0x5e, 0xf0, 0x04, + 0x2c, 0x00, 0x00, 0xe8, 0x2e, 0x02, 0xcb, 0x40, + 0x2e, 0x02, 0x39, 0xb4, 0xa5, 0xa5, 0x5a, 0x5a, + 0x00, 0x1f, 0x15, 0x55, 0x00, 0x00, 0x00, 0x09, + 0xe9, 0x2d, 0x5f, 0xff, 0xe1, 0x4f, 0x00, 0x00, + 0xe9, 0x2d, 0x00, 0x01, 0xe2, 0x8f, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x10, 0x21, 0xff, 0x48, 0x25, + 0x68, 0x00, 0x40, 0x52, 0x42, 0x08, 0xd1, 0x0b, + 0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x07, + 0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x03, + 0x0a, 0x00, 0x42, 0x08, 0xd0, 0x29, 0x32, 0x20, + 0x21, 0x0f, 0x42, 0x08, 0xd1, 0x01, 0x32, 0x10, + 0x09, 0x00, 0x21, 0x01, 0x42, 0x08, 0xd1, 0x08, + 0x1d, 0x12, 0x21, 0x02, 0x42, 0x08, 0xd1, 0x04, + 0x1d, 0x12, 0x21, 0x04, 0x42, 0x08, 0xd1, 0x00, + 0x1d, 0x12, 0x48, 0x13, 0x68, 0x00, 0xb4, 0x01, + 0x08, 0x90, 0x21, 0x01, 0x40, 0x81, 0x48, 0x0f, + 0x60, 0x01, 0x48, 0x0d, 0x58, 0x82, 0x48, 0x01, + 0x46, 0x86, 0x47, 0x10, 0x2c, 0x00, 0x00, 0xb1, + 0xbc, 0x02, 0x48, 0x0b, 0x68, 0x02, 0x23, 0x20, + 0x05, 0x1b, 0x40, 0x1a, 0x43, 0x99, 0x43, 0x11, + 0x60, 0x01, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe8, 0xbd, 0x00, 0x01, 0xe1, 0x69, 0xf0, 0x00, + 0xe8, 0xbd, 0x5f, 0xff, 0xe2, 0x5e, 0xf0, 0x04, + 0x2e, 0x08, 0x3b, 0xa4, 0x66, 0x00, 0x00, 0x14, + 0x66, 0x00, 0x00, 0x18, 0x66, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x0c, 0x2e, 0x02, 0xcc, 0x48, + 0x2c, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + + +u8 Root [] __initdata = { + 0xb4, 0x90, 0x49, 0x18, 0x1c, 0x0b, 0x4a, 0x18, + 0x1a, 0x50, 0x4f, 0x18, 0x1a, 0x79, 0x10, 0x8f, + 0x21, 0x00, 0x2f, 0x00, 0xdd, 0x04, 0xcb, 0x10, + 0xc2, 0x10, 0x31, 0x01, 0x42, 0xb9, 0xdb, 0xfa, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, + 0x49, 0x13, 0x18, 0x08, 0x49, 0x13, 0x60, 0x08, + 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x02, 0x36, 0x7c, + 0x9e, 0x00, 0x0a, 0x00, 0x2e, 0x02, 0x37, 0x7c, + 0x2e, 0x02, 0x36, 0xcc, 0x2e, 0x02, 0x38, 0x9c, + 0x2e, 0x02, 0x37, 0x04, 0x2e, 0x02, 0x38, 0xa0, + 0x2e, 0x02, 0x37, 0x20, 0x2e, 0x02, 0x38, 0xa4, + 0x2e, 0x02, 0x36, 0xcc, 0x2e, 0x02, 0x38, 0xa8, + 0x2e, 0x02, 0x36, 0xe8, 0x2e, 0x02, 0x38, 0xac, + 0x2e, 0x02, 0x37, 0x20, 0x2e, 0x02, 0x38, 0xb0, + 0x2e, 0x02, 0x37, 0x04, 0x2e, 0x02, 0x38, 0xb4, + 0x2e, 0x02, 0x36, 0x7c, 0x2e, 0x02, 0x38, 0xb8, + 0xb5, 0xf0, 0x1c, 0x0c, 0x1c, 0x15, 0x1c, 0x07, + 0xb0, 0x82, 0x2a, 0x00, 0xd1, 0x03, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x0e, 0x38, + 0x06, 0x00, 0x21, 0x0b, 0x06, 0x89, 0x4b, 0x43, + 0x93, 0x01, 0x42, 0x88, 0xd1, 0x32, 0x08, 0x78, + 0xd3, 0x05, 0x1e, 0x78, 0x88, 0x00, 0x70, 0x20, + 0x34, 0x01, 0x3d, 0x01, 0x37, 0x01, 0x08, 0xb8, + 0xd3, 0x0f, 0x2d, 0x02, 0xdb, 0x0d, 0x08, 0x60, + 0xd3, 0x06, 0x88, 0x39, 0x0a, 0x09, 0x70, 0x21, + 0x88, 0x38, 0x70, 0x60, 0x34, 0x02, 0xe0, 0x02, + 0x88, 0x38, 0x80, 0x20, 0x34, 0x02, 0x3d, 0x02, + 0x37, 0x02, 0x07, 0xae, 0x0f, 0xb6, 0x1b, 0xad, + 0xd0, 0x08, 0x9b, 0x01, 0x68, 0x1b, 0x1c, 0x38, + 0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x1d, 0xfe, 0x6a, + 0x19, 0x7f, 0x19, 0x64, 0x2e, 0x00, 0xd0, 0x54, + 0x68, 0x38, 0x90, 0x00, 0x46, 0x6f, 0x78, 0x38, + 0x70, 0x20, 0x34, 0x01, 0x37, 0x01, 0x3e, 0x01, + 0xd1, 0xf9, 0xe0, 0x4a, 0x0e, 0x20, 0x06, 0x00, + 0x42, 0x88, 0xd1, 0x3f, 0xe0, 0x14, 0x08, 0x60, + 0xd3, 0x08, 0x1e, 0x60, 0x88, 0x01, 0x23, 0xff, + 0x02, 0x1b, 0x40, 0x19, 0x78, 0x3a, 0x43, 0x11, + 0x80, 0x01, 0xe0, 0x06, 0x88, 0x21, 0x06, 0x09, + 0x0e, 0x09, 0x78, 0x3a, 0x02, 0x12, 0x43, 0x11, + 0x80, 0x21, 0x34, 0x01, 0x3d, 0x01, 0x37, 0x01, + 0x07, 0xb8, 0xd0, 0x01, 0x2d, 0x00, 0xdc, 0xe6, + 0x07, 0xae, 0x0f, 0xb6, 0x1b, 0xad, 0xd0, 0x06, + 0x9b, 0x01, 0x68, 0x1b, 0x1c, 0x38, 0x1c, 0x21, + 0x1c, 0x2a, 0xf0, 0x1d, 0xfe, 0x33, 0x19, 0x7f, + 0x19, 0x64, 0x2e, 0x00, 0xd0, 0x1d, 0x08, 0x60, + 0xd3, 0x08, 0x1e, 0x60, 0x88, 0x01, 0x23, 0xff, + 0x02, 0x1b, 0x40, 0x19, 0x78, 0x3a, 0x43, 0x11, + 0x80, 0x01, 0xe0, 0x06, 0x88, 0x21, 0x06, 0x09, + 0x0e, 0x09, 0x78, 0x3a, 0x02, 0x12, 0x43, 0x11, + 0x80, 0x21, 0x34, 0x01, 0x37, 0x01, 0x3e, 0x01, + 0xd1, 0xe9, 0xe0, 0x06, 0x9b, 0x01, 0x68, 0x1b, + 0x1c, 0x38, 0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x1d, + 0xfe, 0x11, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x48, + 0xb5, 0x00, 0x20, 0x03, 0xf0, 0x03, 0xfb, 0x98, + 0x48, 0x03, 0x89, 0x02, 0x8a, 0x01, 0x89, 0x80, + 0xf0, 0x05, 0xff, 0xc2, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x00, 0x00, 0xb5, 0xf0, 0x4f, 0x10, + 0x89, 0x3c, 0x89, 0xbe, 0x8a, 0x3d, 0x23, 0x04, + 0x43, 0xdb, 0x68, 0x78, 0x40, 0x18, 0x0c, 0x1a, + 0x60, 0x78, 0xb4, 0x04, 0x1c, 0x13, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x14, + 0x20, 0x01, 0x60, 0x78, 0xb0, 0x01, 0x4a, 0x07, + 0xb4, 0x04, 0x1c, 0x20, 0x1c, 0x31, 0x1c, 0x2a, + 0x4b, 0x04, 0xf0, 0x00, 0xf8, 0x09, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0xf0, 0x9f, 0x05, 0x04, 0x04, 0x0c, 0x24, + 0x04, 0x0d, 0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36, + 0x04, 0x18, 0x0c, 0x00, 0xb0, 0x82, 0x90, 0x00, + 0x04, 0x38, 0x0c, 0x00, 0xb0, 0x81, 0x49, 0xa9, + 0x4f, 0xa9, 0x42, 0x8d, 0xd1, 0x00, 0x89, 0xbd, + 0x42, 0x8e, 0xd1, 0x00, 0x8a, 0x3e, 0x4a, 0xa7, + 0x42, 0x95, 0xd1, 0x02, 0x89, 0xbd, 0x08, 0xd3, + 0x81, 0xbb, 0x4b, 0xa4, 0x42, 0x9e, 0xd1, 0x02, + 0x8a, 0x3e, 0x08, 0xdb, 0x82, 0x3b, 0x9a, 0x01, + 0x42, 0x8a, 0xd1, 0x01, 0x8a, 0xba, 0x92, 0x01, + 0xa0, 0x9f, 0x22, 0x2d, 0x21, 0x00, 0xf0, 0x06, + 0xf8, 0x69, 0xa0, 0x9f, 0x22, 0x37, 0x21, 0x00, + 0xf0, 0x06, 0xf8, 0x64, 0x22, 0x3c, 0x21, 0x00, + 0x1c, 0x28, 0xf0, 0x06, 0xf8, 0x97, 0xa0, 0x9c, + 0x22, 0x41, 0x21, 0x00, 0xf0, 0x06, 0xf8, 0x5a, + 0x22, 0x46, 0x21, 0x00, 0x1c, 0x30, 0xf0, 0x06, + 0xf8, 0x8d, 0xa0, 0x99, 0x22, 0x37, 0x21, 0x01, + 0xf0, 0x06, 0xf8, 0x50, 0x22, 0x3e, 0x21, 0x01, + 0x1c, 0x20, 0xf0, 0x06, 0xf8, 0x83, 0xa0, 0x96, + 0x22, 0x37, 0x21, 0x02, 0xf0, 0x06, 0xf8, 0x46, + 0x22, 0x3e, 0x21, 0x02, 0x98, 0x01, 0xf0, 0x06, + 0xf8, 0x79, 0x8a, 0xbb, 0x99, 0x01, 0x42, 0x99, + 0xd0, 0x20, 0x68, 0x38, 0x90, 0x02, 0x28, 0x00, + 0xd0, 0x1a, 0x2b, 0x00, 0xd0, 0x0a, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x1c, 0xb4, 0x07, 0x1c, 0x19, + 0x23, 0x10, 0x22, 0x1d, 0x98, 0x05, 0xf0, 0x0f, + 0xfe, 0x75, 0xb0, 0x03, 0x98, 0x01, 0x28, 0x00, + 0xd0, 0x0a, 0x22, 0x01, 0x21, 0x00, 0x20, 0x1c, + 0xb4, 0x07, 0x99, 0x04, 0x23, 0x10, 0x22, 0x1d, + 0x68, 0x38, 0xf0, 0x0f, 0xfe, 0x67, 0xb0, 0x03, + 0x98, 0x01, 0x82, 0xb8, 0x4b, 0x80, 0x42, 0x9c, + 0xd0, 0x46, 0xdc, 0x37, 0x2c, 0x00, 0xd0, 0x3d, + 0x3b, 0x02, 0x42, 0x9c, 0xd0, 0x38, 0x4b, 0x7d, + 0x42, 0x9c, 0xd1, 0x00, 0x1c, 0x34, 0xa0, 0x7c, + 0x22, 0x42, 0x21, 0x01, 0xf0, 0x06, 0xf8, 0x0a, + 0x22, 0x43, 0x21, 0x01, 0x1c, 0x20, 0xf0, 0x06, + 0xf8, 0x3d, 0xa0, 0x78, 0x22, 0x47, 0x21, 0x01, + 0xf0, 0x06, 0xf8, 0x00, 0x22, 0x00, 0xb4, 0x04, + 0x23, 0x00, 0x49, 0x64, 0x20, 0x1c, 0xf0, 0x0f, + 0xff, 0xdf, 0x89, 0xb8, 0xb0, 0x01, 0x42, 0x85, + 0xd1, 0x02, 0x89, 0x38, 0x42, 0x84, 0xd0, 0x44, + 0x81, 0xbd, 0x20, 0x1f, 0xf0, 0x10, 0xfb, 0x18, + 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, + 0x21, 0x02, 0x20, 0x1f, 0xf0, 0x10, 0xf9, 0x90, + 0x2d, 0x00, 0xd0, 0x33, 0x2d, 0x01, 0xd1, 0x11, + 0x25, 0x00, 0xe0, 0x32, 0x4b, 0x57, 0x42, 0x9c, + 0xd0, 0x04, 0x33, 0x01, 0x42, 0x9c, 0xd1, 0xca, + 0x89, 0x3c, 0xe7, 0xc8, 0x2d, 0x00, 0xd0, 0x01, + 0x1c, 0x2c, 0xe7, 0xc4, 0x1c, 0x34, 0xe7, 0xc2, + 0x1c, 0x2c, 0xe7, 0xc0, 0x42, 0xac, 0xd1, 0x01, + 0x20, 0x80, 0xe0, 0x00, 0x20, 0x00, 0x22, 0x00, + 0xb4, 0x04, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02, + 0x43, 0x02, 0x23, 0x01, 0x20, 0x1f, 0x1c, 0x29, + 0xf0, 0x0f, 0xff, 0xa6, 0x23, 0x01, 0x02, 0x9b, + 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, 0xb0, 0x01, + 0xf0, 0x10, 0xf9, 0x62, 0x21, 0x00, 0x20, 0x1f, + 0xf0, 0x10, 0xfe, 0x54, 0x20, 0x01, 0xf0, 0x13, + 0xfa, 0x43, 0xe0, 0x02, 0x20, 0x00, 0xf0, 0x13, + 0xfa, 0x3f, 0x8a, 0x38, 0x42, 0x86, 0xd1, 0x02, + 0x89, 0x39, 0x42, 0x8c, 0xd0, 0x52, 0x28, 0x00, + 0xd0, 0x0d, 0x20, 0x03, 0xf0, 0x13, 0xfb, 0x96, + 0x20, 0x1e, 0xf0, 0x10, 0xfb, 0x93, 0x23, 0x03, + 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, + 0x20, 0x1e, 0xf0, 0x10, 0xf9, 0x41, 0x82, 0x3e, + 0x2e, 0x00, 0xd0, 0x3f, 0x42, 0xb4, 0xd1, 0x02, + 0x20, 0x80, 0x90, 0x00, 0xe0, 0x01, 0x20, 0x00, + 0x90, 0x00, 0xf0, 0x23, 0xf8, 0x8d, 0x23, 0x01, + 0x04, 0x1b, 0x43, 0x18, 0xf0, 0x23, 0xf8, 0x8c, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x14, 0xf8, 0x74, + 0x20, 0xff, 0x49, 0x37, 0x68, 0x09, 0x70, 0x08, + 0x49, 0x36, 0x48, 0x37, 0x23, 0x1e, 0x22, 0x10, + 0xf0, 0x14, 0xf9, 0xa8, 0x48, 0x35, 0x68, 0x00, + 0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, + 0xf0, 0x23, 0xf8, 0x72, 0x4b, 0x32, 0x40, 0x18, + 0xf0, 0x23, 0xf8, 0x72, 0x22, 0x00, 0xb4, 0x04, + 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02, + 0x43, 0x02, 0x23, 0x02, 0x20, 0x1e, 0x1c, 0x31, + 0xf0, 0x0f, 0xff, 0x46, 0x23, 0x01, 0x02, 0x9b, + 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, 0xb0, 0x01, + 0xf0, 0x10, 0xf9, 0x02, 0x21, 0x00, 0x20, 0x1e, + 0xf0, 0x10, 0xfd, 0xf4, 0x42, 0xac, 0xd0, 0x18, + 0x42, 0xb4, 0xd0, 0x16, 0x2c, 0x00, 0xd0, 0x14, + 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, + 0x20, 0x1c, 0xf0, 0x10, 0xf8, 0xf1, 0x22, 0x00, + 0xb4, 0x04, 0x23, 0x00, 0x22, 0x82, 0x20, 0x1c, + 0x1c, 0x21, 0xf0, 0x0f, 0xff, 0x25, 0xb0, 0x01, + 0xa0, 0x1a, 0x22, 0x47, 0x21, 0x01, 0xf0, 0x05, + 0xff, 0x39, 0x81, 0x3c, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, + 0x53, 0x49, 0x44, 0x3a, 0x00, 0x00, 0x00, 0x00, + 0x56, 0x50, 0x49, 0x44, 0x3a, 0x00, 0x00, 0x00, + 0x41, 0x50, 0x49, 0x44, 0x3a, 0x00, 0x00, 0x00, + 0x50, 0x43, 0x52, 0x50, 0x49, 0x44, 0x3a, 0x00, + 0x54, 0x58, 0x54, 0x50, 0x49, 0x44, 0x3a, 0x00, + 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0xff, 0xfc, + 0x2f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0x98, 0x2e, 0x08, 0x48, 0x10, + 0x2e, 0x08, 0x05, 0xb4, 0x2e, 0x08, 0x9b, 0xc4, + 0xff, 0xfe, 0xff, 0xff, 0x2a, 0x00, 0x00, 0x00, + 0xb5, 0x00, 0x22, 0x00, 0xb4, 0x04, 0x04, 0x01, + 0x0c, 0x09, 0x23, 0x00, 0x4a, 0x03, 0x1e, 0x50, + 0xf7, 0xff, 0xfe, 0x66, 0xb0, 0x01, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0x00, 0x22, 0x00, 0xb4, 0x04, 0x04, 0x02, + 0x0c, 0x12, 0x23, 0x00, 0x49, 0x03, 0x1e, 0x48, + 0xf7, 0xff, 0xfe, 0x56, 0xb0, 0x01, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x08, + 0x28, 0x01, 0xd0, 0x0b, 0x28, 0x02, 0xd1, 0x02, + 0x02, 0x00, 0xf0, 0x13, 0xfa, 0xcf, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x80, 0xf0, 0x13, 0xfa, 0xca, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0xff, 0x30, 0x01, + 0xf0, 0x13, 0xfa, 0xc4, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xb0, 0x27, 0x00, 0x4c, 0x1b, 0x20, 0x01, + 0x04, 0x80, 0x21, 0x00, 0x22, 0x00, 0xc4, 0x86, + 0xc4, 0x84, 0x3c, 0x14, 0xf0, 0x05, 0xf8, 0x9c, + 0x61, 0x60, 0x28, 0x00, 0xd0, 0x06, 0x21, 0x01, + 0x04, 0x89, 0x61, 0xe1, 0x18, 0x41, 0x62, 0x20, + 0x61, 0xa1, 0xe0, 0x02, 0x61, 0xe7, 0x61, 0xa7, + 0x62, 0x27, 0x68, 0x21, 0x00, 0xc9, 0x4a, 0x10, + 0x18, 0x89, 0x60, 0x48, 0x20, 0x00, 0x49, 0x0f, + 0x4d, 0x0f, 0x00, 0x42, 0x52, 0x8d, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x1d, 0xdb, 0xf8, + 0x20, 0x00, 0x1c, 0x39, 0x4c, 0x0b, 0x4f, 0x0c, + 0x4b, 0x0c, 0x00, 0x42, 0x52, 0xa5, 0x00, 0x82, + 0x50, 0xb9, 0x50, 0x99, 0x30, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf5, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x00, 0x1c, + 0x2e, 0x08, 0x3c, 0x20, 0x2e, 0x08, 0x49, 0xa8, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0xe0, + 0x2e, 0x08, 0x4a, 0x98, 0x2e, 0x08, 0x4b, 0x18, + 0xb4, 0xf0, 0xb0, 0x81, 0x49, 0x25, 0xc9, 0x0c, + 0x39, 0x08, 0x1a, 0xd2, 0x60, 0x8a, 0xd5, 0x02, + 0x32, 0xff, 0x32, 0x01, 0x60, 0x8a, 0x6a, 0x0a, + 0x62, 0x8a, 0x68, 0x8f, 0x2f, 0xfe, 0xdb, 0x03, + 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0x47, 0x70, + 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x4c, 0x1b, + 0x69, 0xa6, 0x69, 0x64, 0x2f, 0x3e, 0xdb, 0x24, + 0x00, 0xdb, 0x4f, 0x19, 0x19, 0xdb, 0x68, 0x5b, + 0x62, 0x4b, 0x93, 0x00, 0x1a, 0x9f, 0x4b, 0x15, + 0x69, 0xdd, 0x2f, 0x00, 0xdc, 0x00, 0x19, 0x7f, + 0x23, 0x01, 0x03, 0x1b, 0x18, 0xc3, 0x42, 0xbb, + 0xdd, 0x0f, 0x18, 0x17, 0x42, 0xb7, 0xdb, 0x09, + 0x9a, 0x00, 0x1b, 0x12, 0x2a, 0x00, 0xdc, 0x00, + 0x19, 0x52, 0x42, 0x93, 0xdd, 0x11, 0x18, 0x20, + 0x62, 0x08, 0xe0, 0x0e, 0x62, 0x0f, 0x1c, 0x14, + 0xe0, 0x0b, 0x18, 0x10, 0x62, 0x08, 0x1c, 0x14, + 0xe0, 0x07, 0x18, 0x12, 0x42, 0xb2, 0xdb, 0x00, + 0x62, 0x0c, 0x6a, 0x0a, 0x18, 0x10, 0x62, 0x08, + 0x1c, 0x14, 0x1c, 0x20, 0xb0, 0x01, 0xbc, 0xf0, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x1c, + 0x2e, 0x08, 0x3c, 0x20, 0x48, 0x03, 0x6a, 0x81, + 0x62, 0x01, 0x69, 0x01, 0x31, 0x01, 0x61, 0x01, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x1c, + 0xb5, 0xf7, 0x04, 0x05, 0x0c, 0x2d, 0x04, 0x0e, + 0x0c, 0x36, 0xb0, 0x81, 0x23, 0x01, 0x03, 0x1b, + 0x98, 0x03, 0x42, 0x9e, 0xdd, 0x05, 0x20, 0xff, + 0xb0, 0x01, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x4f, 0x24, 0x68, 0xb9, 0x29, 0xff, + 0xdb, 0x02, 0x20, 0xff, 0xb0, 0x01, 0xe7, 0xf4, + 0x00, 0x69, 0x19, 0x49, 0x00, 0x89, 0x4a, 0x20, + 0x18, 0x8c, 0x89, 0x21, 0x29, 0x01, 0xd0, 0x02, + 0x20, 0xff, 0xb0, 0x01, 0xe7, 0xe9, 0x79, 0x81, + 0x91, 0x00, 0x88, 0xa0, 0x08, 0x40, 0x07, 0x80, + 0xd1, 0x02, 0x1c, 0x28, 0xf0, 0x05, 0xfa, 0xf4, + 0x88, 0xa0, 0x23, 0x06, 0x40, 0x18, 0x28, 0x02, + 0xd1, 0x09, 0x88, 0xe0, 0x99, 0x00, 0x42, 0x88, + 0xd1, 0x05, 0x1c, 0x28, 0xf0, 0x05, 0xfa, 0xe8, + 0x20, 0xff, 0xb0, 0x01, 0xe7, 0xd1, 0x88, 0xe0, + 0x4b, 0x10, 0x42, 0x98, 0xd1, 0x01, 0x99, 0x00, + 0x80, 0xe1, 0x68, 0x39, 0x00, 0xc8, 0x4a, 0x0e, + 0x52, 0x15, 0x18, 0x80, 0x80, 0x46, 0x9a, 0x03, + 0x31, 0x01, 0x60, 0x42, 0x20, 0x00, 0x23, 0xff, + 0x60, 0x39, 0x33, 0x01, 0x42, 0x99, 0xd1, 0x00, + 0x60, 0x38, 0x68, 0xb9, 0x31, 0x01, 0x60, 0xb9, + 0x68, 0xfb, 0x42, 0x99, 0xdd, 0x00, 0x60, 0xf9, + 0xb0, 0x01, 0xe7, 0xb2, 0x2e, 0x08, 0x00, 0x1c, + 0x2e, 0x08, 0x48, 0x28, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x3c, 0x20, 0xb5, 0xf0, 0x26, 0xff, + 0xb0, 0x83, 0x49, 0x3b, 0x91, 0x01, 0x48, 0x3b, + 0x8e, 0x80, 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x4f, 0x38, + 0xcf, 0x05, 0x3f, 0x08, 0x1a, 0x80, 0x60, 0xb8, + 0x1c, 0x01, 0xd5, 0x02, 0x1d, 0xc8, 0x30, 0xf9, + 0x60, 0xb8, 0x68, 0xb8, 0x28, 0x00, 0xd1, 0x03, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0xd0, 0x49, 0x30, 0x5a, 0x0d, 0x18, 0x40, + 0x88, 0x44, 0x68, 0x40, 0x90, 0x00, 0x00, 0xa8, + 0x49, 0x2d, 0x58, 0x09, 0x91, 0x02, 0x29, 0x00, + 0xd0, 0x08, 0x49, 0x2c, 0x58, 0x0b, 0x99, 0x00, + 0x9e, 0x02, 0x1c, 0x28, 0x1c, 0x22, 0xf0, 0x1d, + 0xfa, 0xdb, 0x26, 0x00, 0x48, 0x28, 0x78, 0x00, + 0x28, 0x00, 0xd0, 0x09, 0x1c, 0x28, 0xf0, 0x0d, + 0xfa, 0xc3, 0x28, 0xff, 0xd1, 0x04, 0x98, 0x00, + 0x1c, 0x21, 0xf0, 0x0d, 0xfa, 0x3f, 0x26, 0x00, + 0x2e, 0x00, 0xd0, 0x29, 0x06, 0xed, 0x0e, 0xed, + 0x1c, 0xe0, 0x08, 0x82, 0x00, 0x92, 0x98, 0x00, + 0x99, 0x01, 0x6a, 0xfb, 0xf0, 0x1d, 0xfa, 0xba, + 0x00, 0x68, 0x19, 0x40, 0x00, 0x80, 0x49, 0x1b, + 0x18, 0x40, 0x88, 0x80, 0x21, 0x0c, 0x40, 0x01, + 0x29, 0x0c, 0xd1, 0x04, 0x02, 0x29, 0x31, 0x02, + 0x04, 0x09, 0x0c, 0x09, 0xe0, 0x03, 0x02, 0x29, + 0x31, 0x01, 0x04, 0x09, 0x0c, 0x09, 0x08, 0x40, + 0xd3, 0x04, 0x04, 0x08, 0x0c, 0x00, 0x21, 0x01, + 0x03, 0xc9, 0x43, 0x01, 0x48, 0x09, 0x85, 0x01, + 0x85, 0x44, 0x21, 0x01, 0x02, 0x49, 0x86, 0x81, + 0x68, 0x78, 0x28, 0xff, 0xd1, 0x02, 0x20, 0x00, + 0x60, 0x78, 0xe0, 0x01, 0x30, 0x01, 0x60, 0x78, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2c, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x3c, 0x20, + 0x2e, 0x08, 0x4a, 0x98, 0x2e, 0x08, 0x4b, 0x18, + 0x2e, 0x08, 0x1a, 0x94, 0x2e, 0x08, 0x48, 0x28, + 0xb4, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x4f, 0x14, + 0x8e, 0xba, 0x2a, 0x00, 0xd0, 0x03, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0xf0, 0x47, 0x70, 0x1c, 0x05, + 0x4c, 0x10, 0x1d, 0x48, 0xd5, 0x00, 0x30, 0x01, + 0x10, 0x40, 0x04, 0x01, 0x0c, 0x09, 0x20, 0x00, + 0x29, 0x02, 0xdb, 0xf2, 0x29, 0xe0, 0xdc, 0xf0, + 0x22, 0x00, 0x29, 0x00, 0xdd, 0x07, 0x00, 0x53, + 0x5a, 0xee, 0x52, 0xe6, 0x32, 0x01, 0x04, 0x12, + 0x0c, 0x12, 0x42, 0x8a, 0xdb, 0xf7, 0x22, 0x04, + 0x85, 0x3a, 0x00, 0x49, 0x85, 0x79, 0x21, 0x0f, + 0x02, 0x49, 0x86, 0xb9, 0xbc, 0xf0, 0x47, 0x70, + 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1e, 0x00, + 0xb5, 0xb0, 0x27, 0x00, 0x4d, 0x13, 0x8e, 0xa9, + 0x29, 0x00, 0xd0, 0x03, 0x43, 0xf8, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x79, 0x04, 0x09, + 0x0c, 0x09, 0x1c, 0x3a, 0x1c, 0x0f, 0x56, 0x81, + 0x29, 0x00, 0xd1, 0xf7, 0x24, 0x00, 0x2f, 0xfe, + 0xdd, 0x03, 0x27, 0xfe, 0x1d, 0xc1, 0x31, 0xd9, + 0x77, 0xcc, 0x1c, 0x7a, 0x49, 0x08, 0xf7, 0xff, + 0xfb, 0x8f, 0x20, 0x04, 0x85, 0x28, 0x1c, 0xf8, + 0x08, 0x80, 0x00, 0x80, 0x85, 0x68, 0x20, 0x0f, + 0x02, 0x40, 0x86, 0xa8, 0x1c, 0x20, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, + 0x2c, 0x00, 0x1e, 0x00, 0xb5, 0x90, 0x06, 0x04, + 0x0e, 0x24, 0x06, 0x0f, 0x0e, 0x3f, 0xb0, 0x88, + 0xf0, 0x04, 0xfa, 0x1e, 0x28, 0x00, 0xd0, 0x05, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x08, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xab, 0x00, 0x70, 0x1c, + 0x70, 0x5f, 0x46, 0x68, 0x21, 0x20, 0xf0, 0x0a, + 0xfa, 0x6f, 0xb0, 0x08, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0xb4, 0xf0, 0x04, 0x0a, 0x0c, 0x12, + 0x4b, 0x15, 0x8e, 0x9f, 0x2f, 0x00, 0xd0, 0x03, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0x47, 0x70, + 0x07, 0xd7, 0x0f, 0xff, 0x04, 0x09, 0x0c, 0x09, + 0x08, 0x49, 0x2f, 0x00, 0xd0, 0x03, 0x31, 0x03, + 0x04, 0x09, 0x0c, 0x09, 0xe0, 0x02, 0x31, 0x02, + 0x04, 0x09, 0x0c, 0x09, 0x1c, 0x05, 0x4c, 0x0b, + 0x20, 0x00, 0x29, 0x00, 0xdd, 0x07, 0x00, 0x47, + 0x5b, 0xee, 0x53, 0xe6, 0x30, 0x01, 0x04, 0x00, + 0x0c, 0x00, 0x42, 0x88, 0xdb, 0xf7, 0x20, 0x05, + 0x85, 0x18, 0x85, 0x5a, 0x20, 0x01, 0x02, 0x40, + 0x86, 0x98, 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, + 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x02, 0x00, + 0x04, 0x01, 0x0c, 0x09, 0x48, 0x0b, 0x6f, 0xc2, + 0x20, 0x00, 0x43, 0xc0, 0x2a, 0x00, 0xd1, 0x0f, + 0x4a, 0x09, 0x8e, 0xd3, 0x2b, 0x00, 0xd1, 0x0b, + 0x48, 0x08, 0x86, 0xc1, 0x23, 0x07, 0x86, 0x83, + 0x85, 0x93, 0x85, 0xd1, 0x20, 0x09, 0x02, 0x40, + 0x86, 0xd0, 0x20, 0x01, 0x87, 0x90, 0x20, 0x00, + 0x47, 0x70, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0x80, + 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xc0, + 0xb5, 0x80, 0x1c, 0x01, 0x4a, 0x0d, 0x8e, 0xd3, + 0x20, 0x00, 0x43, 0xc0, 0x2b, 0x00, 0xd1, 0x12, + 0x8d, 0x93, 0x2b, 0x07, 0xd1, 0x0f, 0x8d, 0xd7, + 0x20, 0x00, 0x85, 0x90, 0x2f, 0x00, 0xd0, 0x0a, + 0x23, 0x01, 0x02, 0xdb, 0x42, 0x9f, 0xdc, 0x06, + 0x1c, 0x3a, 0x48, 0x05, 0x4b, 0x05, 0x6a, 0xdb, + 0xf0, 0x1d, 0xf9, 0x98, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, + 0x2c, 0x00, 0x12, 0x00, 0x2e, 0x08, 0x00, 0x1c, + 0xb5, 0xf0, 0xb0, 0x83, 0x49, 0x62, 0x8e, 0x88, + 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x4e, 0x5f, 0x78, 0x30, + 0x49, 0x5f, 0x91, 0x02, 0x78, 0x09, 0x42, 0x88, + 0xd1, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x00, 0x4d, 0x5b, 0x4b, 0x5c, + 0x93, 0x01, 0x1d, 0xd9, 0x31, 0x19, 0x7d, 0x0a, + 0x00, 0x53, 0x18, 0x9b, 0x01, 0x1b, 0x19, 0x5b, + 0x78, 0xdc, 0x1c, 0x1f, 0x79, 0x1b, 0x42, 0x9c, + 0xd1, 0x04, 0x79, 0x7b, 0x07, 0xdb, 0x0f, 0xdb, + 0x2b, 0x01, 0xd1, 0x06, 0x7d, 0x0b, 0x93, 0x00, + 0x32, 0x01, 0x07, 0x52, 0x0f, 0x52, 0x75, 0x0a, + 0xe0, 0x08, 0x32, 0x01, 0x07, 0x52, 0x0f, 0x52, + 0x75, 0x0a, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, + 0x28, 0x08, 0xdb, 0xe0, 0x28, 0x08, 0xd1, 0x03, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x00, 0x00, 0x43, 0x18, 0x18, 0x01, 0x00, + 0x19, 0x47, 0x78, 0xf8, 0x00, 0xc0, 0x19, 0xc0, + 0x89, 0x84, 0x23, 0x01, 0x03, 0x1b, 0x42, 0x9c, + 0xdd, 0x00, 0x1c, 0x1c, 0x68, 0x81, 0x89, 0xc0, + 0x18, 0x08, 0x1c, 0xe1, 0x08, 0x8a, 0x00, 0x92, + 0x49, 0x3e, 0x9b, 0x01, 0x6a, 0xdb, 0xf0, 0x1d, + 0xf9, 0x35, 0x88, 0x38, 0x02, 0x00, 0x30, 0x09, + 0x49, 0x35, 0x85, 0x08, 0x85, 0x4c, 0x20, 0x01, + 0x02, 0x40, 0x86, 0x88, 0x78, 0xf8, 0x00, 0xc0, + 0x19, 0xc0, 0x89, 0xc1, 0x19, 0x09, 0x81, 0xc1, + 0x78, 0xf8, 0x00, 0xc0, 0x19, 0xc0, 0x89, 0x81, + 0x1b, 0x09, 0x81, 0x81, 0x78, 0xf8, 0x00, 0xc0, + 0x19, 0xc0, 0x89, 0x81, 0x29, 0x00, 0xd1, 0x4f, + 0x24, 0x00, 0x81, 0xc4, 0x78, 0xf9, 0x6a, 0xb8, + 0x18, 0x40, 0x73, 0x04, 0x78, 0xf8, 0x30, 0x01, + 0x07, 0x80, 0x0f, 0x80, 0x70, 0xf8, 0x78, 0x30, + 0x30, 0x01, 0x70, 0x30, 0x78, 0xf8, 0x79, 0x39, + 0x42, 0x88, 0xd1, 0x3d, 0x79, 0x78, 0x21, 0x02, + 0x40, 0x01, 0x29, 0x02, 0xd1, 0x1e, 0x70, 0xfc, + 0x71, 0x3c, 0x71, 0x7c, 0x49, 0x22, 0x80, 0x39, + 0x6a, 0xb8, 0x68, 0x00, 0xf0, 0x04, 0xfd, 0xb6, + 0x6a, 0xb8, 0xf0, 0x04, 0xfd, 0xb3, 0x20, 0x00, + 0x49, 0x1d, 0x00, 0x42, 0x18, 0x12, 0x01, 0x12, + 0x5a, 0xaa, 0x42, 0x8a, 0xd1, 0x04, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf4, + 0x28, 0x08, 0xd1, 0x1d, 0x70, 0x34, 0x99, 0x02, + 0x70, 0x0c, 0xe0, 0x19, 0x07, 0xc0, 0x0f, 0xc0, + 0x28, 0x01, 0xd1, 0x15, 0x70, 0xfc, 0x71, 0x3c, + 0x21, 0x06, 0x1d, 0xf8, 0x30, 0x19, 0x73, 0x41, + 0x6a, 0xb9, 0x72, 0x0c, 0x79, 0x79, 0x08, 0x49, + 0x00, 0x49, 0x71, 0x79, 0x22, 0x04, 0x7b, 0x01, + 0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85, + 0x6a, 0xbb, 0xf0, 0x0f, 0xfd, 0xc3, 0xb0, 0x02, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x03, 0xc0, + 0x2e, 0x08, 0x03, 0xbc, 0x2e, 0x08, 0x45, 0x18, + 0x2e, 0x08, 0x00, 0x1c, 0x2c, 0x00, 0x02, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x4f, 0x0b, + 0x68, 0x38, 0x28, 0x00, 0xd1, 0x0f, 0x20, 0x2f, + 0x02, 0x80, 0xf0, 0x04, 0xfd, 0x91, 0x60, 0x38, + 0x20, 0x00, 0x49, 0x07, 0x60, 0x08, 0x49, 0x07, + 0x60, 0x08, 0x49, 0x07, 0x60, 0x08, 0x20, 0x2f, + 0x02, 0x80, 0x49, 0x06, 0x60, 0x08, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0xcb, 0x04, + 0x2e, 0x02, 0xcb, 0x0c, 0x2e, 0x02, 0xcb, 0x08, + 0x2e, 0x02, 0xcb, 0x10, 0x2e, 0x02, 0xcb, 0x14, + 0xb5, 0x80, 0x4f, 0x04, 0x68, 0x38, 0xf0, 0x04, + 0xfd, 0x7d, 0x20, 0x00, 0x60, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0xcb, 0x04, + 0xb5, 0xf0, 0xb0, 0x82, 0x4a, 0x33, 0x8e, 0x90, + 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x48, 0x30, 0x68, 0x01, + 0x4e, 0x30, 0x68, 0x30, 0x1a, 0x09, 0xd1, 0x03, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x29, 0x00, 0xda, 0x02, 0x23, 0x2f, 0x02, 0x9b, + 0x18, 0xc9, 0x23, 0x2f, 0x01, 0x1b, 0x42, 0x99, + 0xda, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x4a, 0x24, 0x8e, 0xd2, 0x2a, 0x00, + 0xd0, 0x06, 0x4b, 0x25, 0x42, 0x99, 0xda, 0x03, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1f, 0xcf, 0x3f, 0xff, 0x3f, 0x72, 0x4b, 0x21, + 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 0x21, 0x2f, + 0x02, 0x89, 0x1a, 0x0c, 0x4d, 0x1e, 0x49, 0x1f, + 0x91, 0x01, 0x42, 0xa7, 0xdd, 0x14, 0x1b, 0x3a, + 0x92, 0x00, 0x99, 0x01, 0x68, 0x09, 0x18, 0x08, + 0x1c, 0x22, 0x49, 0x1b, 0x6b, 0x2b, 0xf0, 0x1d, + 0xf8, 0x45, 0x4b, 0x19, 0x18, 0xe1, 0x98, 0x01, + 0x9a, 0x00, 0x68, 0x00, 0x6b, 0x2b, 0xf0, 0x1d, + 0xf8, 0x3d, 0x9a, 0x00, 0x60, 0x32, 0xe0, 0x0e, + 0x99, 0x01, 0x68, 0x09, 0x18, 0x08, 0x1c, 0x3a, + 0x49, 0x11, 0x6b, 0x2b, 0xf0, 0x1d, 0xf8, 0x32, + 0x68, 0x30, 0x19, 0xc1, 0x20, 0x2f, 0x02, 0x80, + 0xf0, 0x1d, 0xf8, 0x36, 0x60, 0x31, 0x20, 0x12, + 0x4a, 0x04, 0x85, 0x10, 0x85, 0x57, 0x20, 0x01, + 0x02, 0x40, 0x86, 0x90, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x02, 0xcb, 0x0c, 0x2e, 0x02, 0xcb, 0x08, + 0x00, 0x00, 0x0a, 0x48, 0x00, 0x00, 0x0f, 0x6c, + 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x02, 0xcb, 0x04, + 0x2c, 0x00, 0x02, 0x00, 0x2a, 0x00, 0xd0, 0x05, + 0x78, 0x03, 0x70, 0x0b, 0x30, 0x01, 0x31, 0x01, + 0x3a, 0x01, 0xd1, 0xf9, 0x47, 0x70, 0xb5, 0xf3, + 0xb0, 0x83, 0x98, 0x03, 0x78, 0x40, 0x00, 0x80, + 0x1c, 0x0f, 0x49, 0x3d, 0x58, 0x08, 0x28, 0x00, + 0xd1, 0x05, 0x20, 0xb0, 0xb0, 0x03, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x03, + 0x88, 0x45, 0x30, 0x04, 0xc8, 0x41, 0x1d, 0xf2, + 0x32, 0xb9, 0x1a, 0x14, 0x23, 0x01, 0x03, 0x1b, + 0x42, 0x9d, 0xdd, 0x03, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x03, 0xe7, 0xec, 0x19, 0x79, 0x91, 0x00, + 0x4b, 0x30, 0x93, 0x02, 0x2c, 0xbc, 0xdc, 0x01, + 0x2c, 0x00, 0xda, 0x07, 0x9b, 0x02, 0x68, 0x18, + 0x30, 0x01, 0x60, 0x18, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x03, 0xe7, 0xdc, 0x42, 0xac, 0xdb, 0x06, + 0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a, + 0xf0, 0x1c, 0xff, 0xd0, 0xe0, 0x44, 0x2d, 0x00, + 0xdd, 0x42, 0x4b, 0x25, 0x93, 0x01, 0x99, 0x00, + 0x42, 0x8f, 0xd9, 0x07, 0x9b, 0x02, 0x68, 0x18, + 0x30, 0x01, 0x60, 0x18, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x03, 0xe7, 0xc4, 0x42, 0xa5, 0xdd, 0x07, + 0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x22, + 0xf0, 0x1c, 0xff, 0xb8, 0x68, 0x36, 0xe0, 0x05, + 0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a, + 0xf0, 0x1c, 0xff, 0xb0, 0x19, 0x3f, 0x1b, 0x2d, + 0x79, 0xb0, 0x19, 0x80, 0x9a, 0x03, 0x78, 0x52, + 0x00, 0xd3, 0x1a, 0x9a, 0x00, 0x92, 0x9b, 0x01, + 0x68, 0x1b, 0x18, 0xd2, 0x78, 0x92, 0x06, 0xd2, + 0x0e, 0xd2, 0x1d, 0x31, 0x2a, 0x12, 0xd1, 0x06, + 0x78, 0xca, 0x0a, 0x12, 0xd2, 0x03, 0x78, 0x89, + 0x29, 0x09, 0xd1, 0x00, 0x38, 0x01, 0x1d, 0xf1, + 0x31, 0xb9, 0x1a, 0x0c, 0x2c, 0xbc, 0xdc, 0x01, + 0x2c, 0x00, 0xda, 0x03, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x03, 0xe7, 0x90, 0x2d, 0x00, 0xdc, 0xbe, + 0x20, 0x00, 0xb0, 0x03, 0xe7, 0x8b, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x00, 0x58, + 0x2e, 0x08, 0x9b, 0x30, 0xb4, 0xf0, 0x68, 0x42, + 0x68, 0x84, 0x1d, 0xe1, 0x31, 0xb7, 0x1c, 0x16, + 0xb0, 0x81, 0x42, 0x91, 0xd9, 0x09, 0x78, 0x51, + 0x07, 0x09, 0x0f, 0x09, 0x02, 0x09, 0x78, 0x92, + 0x43, 0x11, 0x31, 0x03, 0x04, 0x09, 0x0c, 0x09, + 0xe0, 0x5b, 0x68, 0x21, 0x79, 0x8b, 0x93, 0x00, + 0x1d, 0x0f, 0x18, 0x59, 0x78, 0x45, 0x00, 0xeb, + 0x1b, 0x5b, 0x00, 0x9b, 0x4d, 0x2b, 0x68, 0x2d, + 0x19, 0x5b, 0x78, 0x9b, 0x06, 0xdb, 0x0e, 0xdb, + 0x2b, 0x12, 0xd1, 0x31, 0x1d, 0xe3, 0x33, 0xb9, + 0x1b, 0x9b, 0x06, 0x1d, 0x0e, 0x2d, 0x78, 0xfe, + 0x0a, 0x33, 0xd2, 0x29, 0x2d, 0x0e, 0xda, 0x27, + 0x9b, 0x00, 0x2b, 0x09, 0xdd, 0x06, 0x79, 0x3b, + 0x18, 0xfb, 0x33, 0x05, 0x42, 0x8b, 0xd0, 0x1f, + 0x39, 0x01, 0xe0, 0x1d, 0x9b, 0x00, 0x2b, 0x09, + 0xd1, 0x1a, 0x79, 0x3b, 0x2b, 0x00, 0xd0, 0x01, + 0x39, 0x01, 0xe0, 0x15, 0x39, 0x01, 0x1d, 0xe3, + 0x33, 0xb8, 0x42, 0x93, 0xd9, 0x09, 0x78, 0x53, + 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, 0x04, 0x1b, + 0x0c, 0x1b, 0x33, 0x03, 0x04, 0x1b, 0x0c, 0x1b, + 0xe0, 0x03, 0x78, 0x4b, 0x33, 0x03, 0x04, 0x1b, + 0x0c, 0x1b, 0x42, 0x9d, 0xda, 0x00, 0x31, 0x01, + 0x1d, 0xe3, 0x33, 0xb8, 0x42, 0x93, 0xd9, 0x0b, + 0x78, 0x52, 0x07, 0x12, 0x0f, 0x12, 0x02, 0x12, + 0x04, 0x12, 0x0c, 0x12, 0x78, 0x09, 0x18, 0x51, + 0x31, 0x03, 0x04, 0x09, 0x0c, 0x09, 0xe0, 0x08, + 0x78, 0x0a, 0x07, 0x12, 0x0f, 0x12, 0x02, 0x12, + 0x78, 0x49, 0x43, 0x11, 0x31, 0x03, 0x04, 0x09, + 0x0c, 0x09, 0x80, 0x41, 0xb0, 0x01, 0xbc, 0xf0, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x30, + 0x4a, 0x02, 0xc2, 0x03, 0x3a, 0x08, 0x20, 0x00, + 0x60, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x44, 0x20, + 0x48, 0x01, 0x68, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x44, 0x20, 0x48, 0x01, 0x68, 0x80, + 0x08, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x44, 0x20, + 0x48, 0x02, 0x68, 0x81, 0x08, 0xc9, 0x68, 0x00, + 0x18, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x44, 0x20, + 0xb4, 0xf0, 0x1c, 0x03, 0x20, 0x00, 0xb0, 0x82, + 0x49, 0x53, 0x91, 0x01, 0x68, 0x89, 0x18, 0xcf, + 0x97, 0x00, 0x08, 0xca, 0x07, 0x4c, 0x0f, 0x64, + 0x49, 0x4f, 0x68, 0x09, 0xd1, 0x32, 0x1c, 0x1f, + 0xd5, 0x04, 0x42, 0x7f, 0x07, 0x7f, 0x0f, 0x7f, + 0x42, 0x7f, 0xe0, 0x01, 0x07, 0x7f, 0x0f, 0x7f, + 0x2f, 0x00, 0xd1, 0x27, 0x2b, 0x10, 0xd0, 0x16, + 0xdc, 0x05, 0x2b, 0x00, 0xd0, 0x5a, 0x2b, 0x08, + 0xd1, 0x59, 0x5c, 0x88, 0xe0, 0x81, 0x2b, 0x18, + 0xd0, 0x13, 0x2b, 0x20, 0xd1, 0x53, 0x5c, 0x88, + 0x06, 0x00, 0x18, 0x89, 0x78, 0x4a, 0x04, 0x12, + 0x18, 0x80, 0x78, 0x8a, 0x02, 0x12, 0x18, 0x80, + 0x78, 0xc9, 0x18, 0x40, 0xe0, 0x71, 0x5c, 0x88, + 0x02, 0x00, 0x18, 0x89, 0x78, 0x49, 0x18, 0x40, + 0xe0, 0x6b, 0x5c, 0x88, 0x04, 0x00, 0x18, 0x89, + 0x78, 0x4a, 0x02, 0x12, 0x18, 0x80, 0x78, 0x89, + 0x18, 0x40, 0xe0, 0x62, 0x2b, 0x00, 0xd1, 0x03, + 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x9f, 0x00, 0x08, 0xfd, 0x07, 0x7f, 0x0f, 0x7f, + 0x2b, 0x20, 0xdc, 0x56, 0x1a, 0xae, 0x4d, 0x2f, + 0x2e, 0x05, 0xd2, 0x52, 0xa3, 0x01, 0x5d, 0x9b, + 0x00, 0x5b, 0x44, 0x9f, 0x02, 0x09, 0x14, 0x25, + 0x38, 0x00, 0x5c, 0x88, 0x5d, 0x29, 0x40, 0x08, + 0x21, 0x08, 0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x44, + 0x1c, 0x50, 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, + 0x02, 0x12, 0x5c, 0x08, 0x18, 0x80, 0x21, 0x08, + 0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x39, 0x1c, 0x50, + 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 0x02, 0x12, + 0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, 0x02, 0x00, + 0x5c, 0xc9, 0x18, 0x08, 0x21, 0x08, 0x1b, 0xc9, + 0x40, 0xc8, 0xe0, 0x2a, 0xe0, 0x29, 0xe0, 0x28, + 0x1c, 0x50, 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, + 0x02, 0x12, 0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, + 0x02, 0x00, 0x1c, 0x5a, 0x5c, 0xcb, 0x18, 0x18, + 0x02, 0x00, 0x5c, 0x89, 0x18, 0x08, 0x21, 0x08, + 0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x15, 0x1c, 0x50, + 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 0x02, 0x12, + 0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, 0x02, 0x00, + 0x1c, 0x5a, 0x5c, 0xcb, 0x18, 0x18, 0x02, 0x03, + 0x1c, 0x50, 0x5c, 0x8a, 0x18, 0xd2, 0x40, 0xba, + 0x5c, 0x08, 0x21, 0x08, 0x1b, 0xc9, 0x40, 0xc8, + 0x18, 0x80, 0x99, 0x01, 0x9f, 0x00, 0x60, 0x8f, + 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x44, 0x20, 0x2e, 0x08, 0x00, 0x60, + 0xb5, 0xb0, 0x1c, 0x07, 0x20, 0x00, 0x24, 0x00, + 0x2f, 0x00, 0xdd, 0x09, 0x00, 0x85, 0x18, 0x2d, + 0x00, 0x6d, 0x20, 0x04, 0xf7, 0xff, 0xff, 0x44, + 0x19, 0x40, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf5, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x47, 0x70, 0xb5, 0xb0, 0x1c, 0x0c, 0x1c, 0x05, + 0x1c, 0x17, 0xb0, 0x90, 0xf0, 0x22, 0xfa, 0x20, + 0x49, 0x25, 0x20, 0x0c, 0xf0, 0x22, 0xf9, 0xe8, + 0xf0, 0x22, 0xf9, 0xde, 0x4b, 0x23, 0x40, 0x18, + 0xf0, 0x22, 0xf9, 0xde, 0xf0, 0x22, 0xfa, 0x4a, + 0x20, 0x10, 0x90, 0x0a, 0x20, 0xff, 0x90, 0x0b, + 0xa8, 0x0f, 0x90, 0x0c, 0x20, 0x0c, 0x90, 0x0d, + 0x48, 0x1d, 0x90, 0x0e, 0xa8, 0x0a, 0xf0, 0x14, + 0xfb, 0xa5, 0xab, 0x07, 0x70, 0x1d, 0x94, 0x08, + 0x72, 0x1f, 0x24, 0x00, 0xab, 0x09, 0x70, 0x5c, + 0x27, 0x00, 0x4d, 0x18, 0xf0, 0x14, 0xfc, 0x06, + 0x28, 0x00, 0xd0, 0x02, 0x37, 0x01, 0x42, 0xaf, + 0xdb, 0xf8, 0x20, 0x01, 0xa9, 0x07, 0xf0, 0x14, + 0xfc, 0x07, 0xf0, 0x14, 0xfb, 0xfb, 0x28, 0x00, + 0xd1, 0xfb, 0x94, 0x0b, 0xa8, 0x0a, 0xf0, 0x14, + 0xfb, 0x89, 0xf0, 0x22, 0xf9, 0xe9, 0x21, 0x00, + 0x20, 0x0c, 0xf0, 0x22, 0xf9, 0xb1, 0xf0, 0x22, + 0xf9, 0xa7, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, + 0xf0, 0x22, 0xf9, 0xa6, 0xf0, 0x22, 0xfa, 0x12, + 0x46, 0x68, 0xf0, 0x14, 0xfb, 0xc3, 0x98, 0x04, + 0xb0, 0x10, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x00, 0x15, 0xa5, 0xff, 0xff, 0xf7, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x27, 0x10, + 0xb5, 0xff, 0x9e, 0x09, 0x1c, 0x04, 0x1c, 0x0d, + 0x1c, 0x17, 0xb0, 0x93, 0xf0, 0x22, 0xf9, 0xc4, + 0x49, 0x31, 0x20, 0x0c, 0xf0, 0x22, 0xf9, 0x8c, + 0xf0, 0x22, 0xf9, 0x82, 0x4b, 0x2f, 0x40, 0x18, + 0xf0, 0x22, 0xf9, 0x82, 0xf0, 0x22, 0xf9, 0xee, + 0x20, 0x10, 0x90, 0x0d, 0x20, 0xff, 0x90, 0x0e, + 0xa8, 0x12, 0x90, 0x0f, 0x20, 0x0c, 0x90, 0x10, + 0x48, 0x29, 0x90, 0x11, 0xa8, 0x0d, 0xf0, 0x14, + 0xfb, 0x49, 0xab, 0x07, 0x70, 0x1c, 0x95, 0x08, + 0x72, 0x1f, 0x20, 0xff, 0xab, 0x09, 0x70, 0x58, + 0x1c, 0x60, 0x71, 0x18, 0x9b, 0x16, 0x93, 0x0b, + 0xab, 0x0c, 0x70, 0x1e, 0x20, 0xff, 0x70, 0x58, + 0x24, 0x00, 0x4d, 0x20, 0xf0, 0x14, 0xfb, 0xa2, + 0x28, 0x00, 0xd0, 0x02, 0x34, 0x01, 0x42, 0xac, + 0xdb, 0xf8, 0x2f, 0x00, 0xd1, 0x04, 0x20, 0x01, + 0xa9, 0x0a, 0xf0, 0x14, 0xfb, 0xa1, 0xe0, 0x03, + 0x20, 0x02, 0xa9, 0x07, 0xf0, 0x14, 0xfb, 0x9c, + 0xf0, 0x14, 0xfb, 0x90, 0x28, 0x00, 0xd1, 0xfb, + 0x27, 0x00, 0x97, 0x0e, 0xa8, 0x0d, 0xf0, 0x14, + 0xfb, 0x1d, 0xf0, 0x22, 0xf9, 0x7d, 0x21, 0x00, + 0x20, 0x0c, 0xf0, 0x22, 0xf9, 0x45, 0xf0, 0x22, + 0xf9, 0x3b, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, + 0xf0, 0x22, 0xf9, 0x3a, 0xf0, 0x22, 0xf9, 0xa6, + 0x46, 0x68, 0xf0, 0x14, 0xfb, 0x57, 0x98, 0x01, + 0x0a, 0x80, 0xd2, 0x05, 0x20, 0x01, 0xb0, 0x13, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0xb0, 0x13, 0xe7, 0xf8, 0x00, 0x00, + 0x2e, 0x00, 0x15, 0xa5, 0xff, 0xff, 0xf7, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x27, 0x10, + 0x1c, 0x01, 0x48, 0x04, 0x61, 0xc1, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x01, 0x48, 0x02, 0x60, 0x01, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x68, + 0x6e, 0x00, 0x17, 0x00, 0xb5, 0xb0, 0x4f, 0x41, + 0x69, 0x38, 0x4c, 0x41, 0x28, 0x00, 0xd0, 0x07, + 0x20, 0x03, 0x60, 0x20, 0x69, 0x38, 0x38, 0x01, + 0x61, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x02, 0x69, 0x78, 0x28, 0x00, 0xd0, 0x04, + 0x60, 0x21, 0x69, 0x78, 0x38, 0x01, 0x61, 0x78, + 0xd1, 0xf3, 0x68, 0xf8, 0x28, 0x00, 0xd0, 0x20, + 0x38, 0x01, 0x60, 0xf8, 0x4a, 0x35, 0xd0, 0x08, + 0x68, 0xbb, 0x18, 0xd2, 0x3a, 0x20, 0x7f, 0xd2, + 0x1e, 0x45, 0x40, 0xea, 0x07, 0xd2, 0x0f, 0xd2, + 0xe0, 0x09, 0x68, 0xbb, 0x18, 0xd2, 0x3a, 0x20, + 0x7f, 0xd2, 0x4b, 0x2f, 0x5c, 0x9a, 0x23, 0x01, + 0x40, 0x5a, 0x06, 0x12, 0x0e, 0x12, 0x23, 0x01, + 0x2a, 0x00, 0xd0, 0x02, 0x61, 0x79, 0x61, 0x3b, + 0xe0, 0x01, 0x61, 0x39, 0x61, 0x7b, 0x28, 0x00, + 0xd1, 0xcf, 0x68, 0xb8, 0x30, 0x01, 0x60, 0xb8, + 0x23, 0x09, 0x68, 0x7a, 0x1c, 0x01, 0x42, 0x90, + 0xdc, 0x03, 0x60, 0xfb, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x20, 0x1c, 0x55, 0x42, 0x8d, + 0xd1, 0x03, 0x61, 0x78, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x95, 0x42, 0x8d, 0xd1, 0x0d, + 0x7e, 0x3d, 0x2d, 0xff, 0xd0, 0x0a, 0x2d, 0x00, + 0xd0, 0x03, 0x60, 0xfb, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x19, 0x61, 0x38, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x32, 0x03, 0x42, 0x8a, + 0xd1, 0x04, 0x20, 0x22, 0x61, 0x78, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x69, 0xf9, 0x60, 0x21, + 0x68, 0x79, 0x68, 0xba, 0x31, 0x04, 0x42, 0x91, + 0xd1, 0x0a, 0x69, 0xf9, 0x29, 0x00, 0xd0, 0x03, + 0x61, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x61, 0x78, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0xf0, 0x03, 0xff, 0xca, 0x20, 0x00, 0x60, 0x38, + 0x69, 0xf8, 0x60, 0x20, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x68, + 0x6e, 0x00, 0x17, 0x00, 0x2e, 0x08, 0x44, 0x2c, + 0x2e, 0x08, 0x00, 0x68, 0xb5, 0xb0, 0x04, 0x0b, + 0x0c, 0x1b, 0x04, 0x14, 0x0c, 0x24, 0x49, 0x14, + 0x68, 0x0a, 0x2a, 0x00, 0xd0, 0x02, 0x68, 0x0a, + 0x2a, 0x00, 0xd1, 0xfc, 0x22, 0x01, 0x60, 0x0a, + 0x2b, 0x0a, 0xdd, 0x00, 0x23, 0x0a, 0x22, 0x00, + 0x4f, 0x0e, 0x2b, 0x00, 0xdd, 0x05, 0x00, 0x55, + 0x5b, 0x45, 0x54, 0xbd, 0x32, 0x01, 0x42, 0x9a, + 0xdb, 0xf9, 0x76, 0x0c, 0x20, 0xff, 0x18, 0xfa, + 0x70, 0x50, 0x20, 0x00, 0x60, 0x4b, 0x22, 0x20, + 0x61, 0x08, 0x61, 0x4a, 0x60, 0x88, 0x60, 0xc8, + 0x49, 0x05, 0x20, 0x32, 0xf0, 0x03, 0xff, 0x66, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x01, 0x68, 0x2e, 0x08, 0x44, 0x2c, + 0x2e, 0x00, 0x17, 0x61, 0xb5, 0x80, 0x04, 0x01, + 0x0c, 0x09, 0x20, 0x00, 0x22, 0x00, 0xb0, 0x88, + 0x00, 0x47, 0x46, 0x6b, 0x53, 0xda, 0x30, 0x01, + 0x04, 0x00, 0x14, 0x00, 0x28, 0x10, 0xdb, 0xf7, + 0x22, 0x80, 0x00, 0x43, 0x46, 0x68, 0x52, 0xc2, + 0x46, 0x6a, 0x1c, 0x08, 0x21, 0x05, 0xf0, 0x04, + 0xfa, 0x33, 0x49, 0x06, 0x80, 0x88, 0x00, 0x42, + 0x18, 0x12, 0x00, 0x92, 0x4b, 0x04, 0x5a, 0x9a, + 0x81, 0x0a, 0xb0, 0x08, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x88, + 0x2e, 0x08, 0x48, 0x28, 0xb5, 0x80, 0xb0, 0xb2, + 0x46, 0x68, 0xf0, 0x15, 0xf8, 0x99, 0xaf, 0x16, + 0xcf, 0x83, 0x9a, 0x19, 0xf0, 0x00, 0xf9, 0xd2, + 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0xed, 0xb0, 0x32, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, + 0x06, 0x00, 0x0e, 0x00, 0x06, 0x09, 0x0e, 0x09, + 0xf0, 0x0f, 0xfd, 0x7a, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x09, + 0x0e, 0x09, 0x4b, 0x05, 0x68, 0x1b, 0x06, 0x1b, + 0x0e, 0x1b, 0x2b, 0x30, 0xd3, 0x01, 0xf0, 0x0f, + 0xfd, 0x6b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xbc, 0xb5, 0xf0, 0x25, 0x00, + 0x4e, 0x1a, 0x4c, 0x1b, 0x4f, 0x1b, 0x68, 0x30, + 0x68, 0x00, 0x00, 0x40, 0x0a, 0x40, 0x02, 0x40, + 0x21, 0x19, 0x06, 0x89, 0x6a, 0x89, 0x4b, 0x18, + 0x40, 0x19, 0x0a, 0x49, 0x43, 0x08, 0x49, 0x17, + 0x64, 0x08, 0xf0, 0x01, 0xfc, 0x63, 0xf0, 0x02, + 0xf9, 0x3b, 0x68, 0x38, 0x30, 0x01, 0x60, 0x38, + 0x48, 0x13, 0x88, 0x01, 0x31, 0x01, 0x80, 0x01, + 0x20, 0x0c, 0x68, 0x21, 0xf0, 0x1c, 0xfc, 0x42, + 0x29, 0x00, 0xd1, 0x01, 0xf7, 0xff, 0xff, 0xae, + 0x20, 0x32, 0x68, 0x21, 0xf0, 0x1c, 0xfc, 0x3a, + 0x4b, 0x0c, 0x42, 0x98, 0xd9, 0x01, 0x49, 0x0c, + 0x60, 0xf9, 0x42, 0x85, 0xd0, 0xd3, 0x1c, 0x05, + 0xf0, 0x00, 0xfe, 0x40, 0x20, 0x00, 0x60, 0x38, + 0xe7, 0xcd, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xa4, + 0x2e, 0x08, 0x05, 0xbc, 0x2e, 0x08, 0x01, 0x88, + 0x00, 0x03, 0xfe, 0x00, 0x2c, 0x00, 0x1f, 0x80, + 0x2c, 0x00, 0x1f, 0xc8, 0x00, 0x00, 0x05, 0x46, + 0x2e, 0x00, 0x19, 0x65, 0xb5, 0xf0, 0x27, 0x00, + 0xb0, 0x94, 0x46, 0x68, 0x4c, 0x2f, 0xcc, 0x6e, + 0xc0, 0x6e, 0xcc, 0x6e, 0xc0, 0x6e, 0x23, 0x28, + 0x22, 0x41, 0x00, 0xd2, 0x21, 0x00, 0x20, 0x01, + 0xf0, 0x0d, 0xfd, 0xda, 0x22, 0xff, 0x21, 0x64, + 0x20, 0x01, 0x32, 0xf5, 0xf0, 0x0d, 0xfe, 0x9c, + 0x20, 0x00, 0x46, 0x69, 0x5c, 0x09, 0x40, 0x41, + 0x23, 0x35, 0x40, 0x59, 0xaa, 0x0a, 0x54, 0x11, + 0x30, 0x01, 0x28, 0x25, 0xdb, 0xf5, 0x24, 0x00, + 0xa9, 0x0a, 0x54, 0x0c, 0x22, 0x00, 0x20, 0x01, + 0x1c, 0x23, 0xf0, 0x0e, 0xf8, 0xfa, 0x4e, 0x1e, + 0x4d, 0x1e, 0x4c, 0x1f, 0xf0, 0x03, 0xff, 0x6e, + 0xf0, 0x03, 0xff, 0x6c, 0x28, 0x28, 0xd9, 0x10, + 0x42, 0xb0, 0xd3, 0x0e, 0x69, 0xe9, 0x08, 0xc9, + 0xd3, 0x0b, 0x4b, 0x1a, 0x18, 0xc1, 0x20, 0x1e, + 0xf0, 0x1c, 0xfb, 0xe0, 0x21, 0x64, 0x1d, 0xc2, + 0x32, 0xff, 0x32, 0xee, 0x20, 0x01, 0xf0, 0x0d, + 0xfe, 0x6f, 0xf0, 0x01, 0xfb, 0xeb, 0xf0, 0x02, + 0xf8, 0xc3, 0xf0, 0x03, 0xff, 0x53, 0x1c, 0x01, + 0x20, 0x7d, 0x00, 0xc0, 0xf0, 0x1c, 0xfb, 0xce, + 0x1c, 0x01, 0x48, 0x0f, 0x88, 0x02, 0x32, 0x01, + 0x80, 0x02, 0x42, 0xb9, 0xd0, 0xd6, 0x2f, 0x04, + 0xd3, 0x06, 0x20, 0x01, 0xf0, 0x0d, 0xfd, 0x78, + 0xb0, 0x14, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x0f, 0xf0, 0x00, 0xfd, 0xcb, 0x20, 0x00, + 0x60, 0x20, 0xe7, 0xc7, 0x2e, 0x02, 0xcc, 0x74, + 0x00, 0x00, 0x0b, 0xb8, 0x72, 0x00, 0x01, 0x00, + 0x2e, 0x08, 0x01, 0x88, 0xff, 0xff, 0xf4, 0x48, + 0x2c, 0x00, 0x1f, 0xc8, 0xb5, 0x80, 0x27, 0x00, + 0x48, 0x08, 0x81, 0x07, 0x48, 0x08, 0x49, 0x09, + 0x60, 0xc8, 0xf0, 0x03, 0xfd, 0x43, 0xf7, 0xff, + 0xff, 0x85, 0xf0, 0x00, 0xf8, 0xd3, 0xf7, 0xff, + 0xff, 0x39, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x00, 0x19, 0x53, 0x2e, 0x08, 0x01, 0x88, + 0x47, 0x70, 0xb5, 0xf0, 0x4d, 0x29, 0x68, 0x01, + 0x31, 0x03, 0x10, 0x89, 0x1e, 0xcb, 0x68, 0x41, + 0x10, 0x89, 0x68, 0x82, 0x10, 0x92, 0x00, 0x89, + 0x30, 0x0c, 0x18, 0x0c, 0x21, 0x03, 0x05, 0x89, + 0x27, 0x35, 0x06, 0x7f, 0x60, 0x39, 0x49, 0x22, + 0x68, 0x0e, 0x08, 0xb6, 0x00, 0xb6, 0x60, 0x0e, + 0x21, 0x00, 0x2b, 0x00, 0xd9, 0x04, 0xc8, 0x40, + 0xc5, 0x40, 0x31, 0x01, 0x42, 0x99, 0xd3, 0xfa, + 0x23, 0x00, 0x49, 0x1c, 0x65, 0x8b, 0x20, 0x00, + 0x2a, 0x00, 0xd9, 0x04, 0xcc, 0x20, 0x64, 0x8d, + 0x30, 0x01, 0x42, 0x90, 0xd3, 0xfa, 0x48, 0x18, + 0x60, 0x03, 0x60, 0x3b, 0x66, 0x8b, 0x60, 0x3b, + 0x22, 0x01, 0x64, 0xca, 0x21, 0x00, 0x4a, 0x15, + 0x68, 0x03, 0x2b, 0x00, 0xd1, 0x05, 0x33, 0x01, + 0x2b, 0x64, 0xdb, 0xfc, 0x31, 0x01, 0x42, 0x91, + 0xdb, 0xf6, 0x48, 0x11, 0x68, 0x01, 0x23, 0x01, + 0x43, 0x19, 0x60, 0x01, 0x49, 0x0f, 0x20, 0x33, + 0x06, 0x40, 0x65, 0x41, 0x49, 0x0e, 0x65, 0x81, + 0x49, 0x0e, 0x66, 0x81, 0x39, 0x04, 0x66, 0x41, + 0x21, 0x03, 0x67, 0x01, 0x21, 0x00, 0x20, 0x0d, + 0xf0, 0x14, 0xfd, 0x62, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x70, 0x6a, 0x00, 0x00, 0x80, + 0xcc, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x27, 0x10, + 0x6a, 0x00, 0x00, 0x10, 0xcc, 0x00, 0x0f, 0x84, + 0xcc, 0x00, 0x0f, 0x88, 0x98, 0x00, 0x0f, 0x88, + 0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08, + 0xf0, 0x15, 0xf9, 0x9c, 0x48, 0x08, 0x21, 0x40, + 0xf0, 0x14, 0xfe, 0x6c, 0x20, 0x01, 0x21, 0x35, + 0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0, + 0x49, 0x04, 0x63, 0x08, 0x20, 0x00, 0x21, 0x39, + 0x06, 0x49, 0x62, 0xc8, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x02, 0x3b, 0x04, 0x72, 0x00, 0x01, 0x00, + 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x0f, 0xd0, 0x10, + 0x29, 0x01, 0xd0, 0x12, 0x29, 0x02, 0xd0, 0x14, + 0x29, 0x03, 0xd1, 0x01, 0x49, 0x0c, 0x60, 0x01, + 0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00, + 0x21, 0x1e, 0xf0, 0x15, 0xf9, 0xdb, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x01, 0x04, 0x49, 0x60, 0x01, + 0xe7, 0xf2, 0x21, 0x21, 0x03, 0x09, 0x60, 0x01, + 0xe7, 0xee, 0x21, 0x41, 0x03, 0x09, 0x60, 0x01, + 0xe7, 0xea, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x98, + 0x00, 0x08, 0x10, 0x08, 0xb5, 0x00, 0x1c, 0x01, + 0x48, 0x0b, 0xd0, 0x0e, 0x29, 0x01, 0xd0, 0x0f, + 0x29, 0x02, 0xd1, 0x01, 0x21, 0x04, 0x60, 0x41, + 0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00, + 0x21, 0x1e, 0xf0, 0x15, 0xf9, 0xb7, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x01, 0x60, 0x41, 0xe7, 0xf3, + 0x21, 0x02, 0x60, 0x41, 0xe7, 0xf0, 0x00, 0x00, + 0x2e, 0x08, 0x01, 0x98, 0xb5, 0x80, 0x4b, 0x09, + 0x22, 0x0a, 0x21, 0x0a, 0x20, 0x0b, 0xf0, 0x15, + 0xfb, 0xeb, 0x20, 0x0b, 0xf0, 0x15, 0xfd, 0x0d, + 0x4f, 0x05, 0x60, 0x38, 0x00, 0x80, 0xf0, 0x03, + 0xff, 0x2b, 0x60, 0x78, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xc4, + 0x2e, 0x08, 0x01, 0xd4, 0xb5, 0xb0, 0x25, 0x00, + 0x1c, 0x0c, 0x1c, 0x07, 0x2a, 0x08, 0xd2, 0x30, + 0xa3, 0x01, 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, + 0x2c, 0x29, 0x29, 0x03, 0x29, 0x29, 0x03, 0x29, + 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x4d, 0x23, 0x2d, + 0x01, 0x1b, 0x42, 0x9f, 0xd0, 0x13, 0x23, 0x0b, + 0x01, 0x9b, 0x42, 0x9f, 0xd0, 0x0f, 0x23, 0xff, + 0x33, 0xe1, 0x42, 0x9f, 0xd0, 0x0b, 0x23, 0xff, + 0x33, 0x61, 0x42, 0x9f, 0xd0, 0x07, 0x23, 0x21, + 0x01, 0x1b, 0x42, 0x9f, 0xd0, 0x03, 0x23, 0x11, + 0x01, 0x5b, 0x42, 0x9f, 0xd1, 0x08, 0x23, 0x09, + 0x01, 0x9b, 0x42, 0x9c, 0xd0, 0x09, 0x08, 0x5b, + 0x42, 0x9c, 0xd0, 0x06, 0x2c, 0xf0, 0xd0, 0x04, + 0x25, 0x01, 0xe0, 0x02, 0x20, 0x01, 0xf0, 0x00, + 0xf8, 0x27, 0x4f, 0x12, 0x6c, 0x78, 0x42, 0x85, + 0xd0, 0x1c, 0x1d, 0xfb, 0x33, 0x35, 0x2d, 0x00, + 0xd0, 0x12, 0x1f, 0xda, 0x3a, 0x0d, 0x21, 0x03, + 0x1d, 0x10, 0xb4, 0x07, 0x22, 0x0b, 0xb4, 0x04, + 0x1c, 0x19, 0x23, 0x00, 0x22, 0x00, 0x20, 0x00, + 0xf0, 0x0f, 0xff, 0xe4, 0x6a, 0xb8, 0x1c, 0x29, + 0xb0, 0x04, 0xf0, 0x11, 0xf9, 0x33, 0xe0, 0x04, + 0x21, 0x00, 0x6a, 0xb8, 0x1c, 0x1a, 0xf0, 0x10, + 0xfa, 0xe9, 0x64, 0x7d, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x98, + 0xb5, 0xf0, 0x1c, 0x07, 0xb0, 0x81, 0x4d, 0x56, + 0x1d, 0xee, 0x36, 0x19, 0x79, 0x30, 0x42, 0x87, + 0xd1, 0x03, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x24, 0x00, 0x6c, 0x68, 0x28, 0x00, + 0xd0, 0x05, 0x64, 0x6c, 0x4a, 0x4f, 0x21, 0x00, + 0x6a, 0xa8, 0xf0, 0x10, 0xfa, 0xcb, 0x71, 0x37, + 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x14, 0xfc, 0x5c, + 0x20, 0x00, 0xf0, 0x11, 0xff, 0x5d, 0x20, 0x1f, + 0xf0, 0x0e, 0xff, 0xf2, 0x26, 0x03, 0x02, 0x76, + 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0x20, 0x1f, + 0x1c, 0x33, 0xf0, 0x0e, 0xfe, 0x69, 0x20, 0x1e, + 0xf0, 0x0f, 0xf8, 0xb0, 0x22, 0x01, 0x02, 0xd2, + 0x21, 0x02, 0x20, 0x1e, 0x1c, 0x33, 0xf0, 0x0e, + 0xfe, 0x5f, 0x26, 0x1c, 0x1c, 0x39, 0x48, 0x3e, + 0x27, 0x0c, 0x29, 0x06, 0xd2, 0x07, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x03, 0x12, 0x03, 0x21, 0x12, 0x30, 0x48, 0x39, + 0x21, 0x40, 0xf0, 0x14, 0xfd, 0x5b, 0xab, 0x00, + 0x70, 0x1c, 0x20, 0x08, 0x70, 0x58, 0x70, 0x9e, + 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x15, + 0xf8, 0x7d, 0xe0, 0x2b, 0x21, 0x1f, 0x43, 0xc9, + 0xf0, 0x14, 0xfd, 0x4c, 0xab, 0x00, 0x70, 0x1c, + 0x70, 0x5c, 0x70, 0x9f, 0x70, 0xdc, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x15, 0xf8, 0x6e, + 0xe0, 0x1c, 0x21, 0x40, 0xf0, 0x14, 0xfd, 0x3e, + 0xab, 0x00, 0x70, 0x1c, 0x20, 0x10, 0x70, 0x58, + 0x70, 0x9e, 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, + 0x20, 0x08, 0xf0, 0x15, 0xf8, 0x5f, 0xe0, 0x0d, + 0x21, 0x1f, 0x43, 0xc9, 0xf0, 0x14, 0xfd, 0x2e, + 0xab, 0x00, 0x70, 0x1c, 0x70, 0x5c, 0x70, 0x9f, + 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08, + 0xf0, 0x15, 0xf8, 0x50, 0x20, 0x01, 0x21, 0x35, + 0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0, + 0x49, 0x19, 0x63, 0x08, 0x20, 0x39, 0x06, 0x40, + 0x62, 0xc4, 0xcd, 0x03, 0x43, 0x08, 0x22, 0x00, + 0x21, 0x1e, 0xf0, 0x15, 0xf8, 0xa7, 0x48, 0x15, + 0xf0, 0x11, 0xfe, 0x68, 0x20, 0x00, 0xf0, 0x11, + 0xfe, 0xd9, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x68, + 0x20, 0x00, 0xf0, 0x03, 0xfb, 0x15, 0x20, 0x01, + 0xf0, 0x11, 0xfe, 0xde, 0x4a, 0x0e, 0xb4, 0x04, + 0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0d, 0x1e, 0xc8, + 0xf7, 0xfe, 0xfb, 0xae, 0x21, 0x00, 0x20, 0x0d, + 0xb0, 0x01, 0xf0, 0x14, 0xfb, 0xcd, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xd4, + 0x2e, 0x02, 0x81, 0x70, 0x2e, 0x02, 0x3b, 0x04, + 0x72, 0x00, 0x01, 0x00, 0x00, 0x80, 0x10, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, + 0xb5, 0xb0, 0x1c, 0x07, 0x4c, 0x10, 0x6a, 0x20, + 0x42, 0x87, 0xd0, 0x19, 0x20, 0x00, 0x2f, 0x03, + 0xd1, 0x02, 0x21, 0x01, 0x61, 0x61, 0xe0, 0x00, + 0x61, 0x60, 0x21, 0x02, 0x4d, 0x0b, 0x60, 0x29, + 0x71, 0x28, 0x71, 0x68, 0x22, 0x01, 0xb4, 0x04, + 0x7a, 0x23, 0x7c, 0x22, 0x7b, 0x21, 0x20, 0x00, + 0xf0, 0x14, 0xfe, 0x9a, 0x69, 0x61, 0x1c, 0x28, + 0xb0, 0x01, 0xf0, 0x15, 0xff, 0x41, 0x62, 0x27, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xb0, + 0xb5, 0x00, 0x22, 0x02, 0x49, 0x09, 0x60, 0x0a, + 0x22, 0x00, 0x71, 0x0a, 0x71, 0x4a, 0x39, 0x48, + 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd1, 0x00, + 0x72, 0x08, 0x6a, 0x08, 0x62, 0x0a, 0xf7, 0xff, + 0xff, 0xc7, 0xbc, 0x08, 0x47, 0x18, 0x72, 0x0a, + 0xe7, 0xf7, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xe0, + 0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x0b, + 0xd0, 0x02, 0x20, 0x00, 0x73, 0x38, 0xe0, 0x01, + 0x20, 0x01, 0x73, 0x38, 0x22, 0x01, 0xb4, 0x04, + 0x7a, 0x3b, 0x7c, 0x3a, 0x7b, 0x39, 0x20, 0x00, + 0xf0, 0x14, 0xfe, 0x62, 0x69, 0x79, 0xb0, 0x01, + 0x48, 0x03, 0xf0, 0x15, 0xff, 0x09, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x01, 0x98, + 0x2e, 0x08, 0x01, 0xb0, 0xb5, 0x80, 0x06, 0x00, + 0x0e, 0x00, 0x1c, 0x01, 0x4f, 0x08, 0x74, 0x39, + 0x22, 0x01, 0xb4, 0x04, 0x7a, 0x3b, 0x7b, 0x39, + 0x1c, 0x02, 0x20, 0x00, 0xf0, 0x14, 0xfe, 0x48, + 0x69, 0x79, 0xb0, 0x01, 0x48, 0x03, 0xf0, 0x15, + 0xfe, 0xef, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xb0, + 0xb4, 0xb0, 0x21, 0x00, 0x48, 0x08, 0x60, 0x01, + 0x20, 0x00, 0x4c, 0x08, 0x4f, 0x08, 0x4b, 0x09, + 0x4a, 0x09, 0x00, 0x85, 0x51, 0x61, 0x54, 0x39, + 0x54, 0x19, 0x54, 0x11, 0x30, 0x01, 0x28, 0x20, + 0xdb, 0xf7, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x01, 0xe8, 0x2e, 0x08, 0x44, 0x38, + 0x2e, 0x08, 0x44, 0xb8, 0x2e, 0x08, 0x44, 0xf8, + 0x2e, 0x08, 0x44, 0xd8, 0x06, 0x00, 0x0e, 0x00, + 0x21, 0x01, 0x40, 0x81, 0x43, 0xca, 0x49, 0x05, + 0x68, 0x0b, 0x40, 0x1a, 0x60, 0x0a, 0x21, 0x00, + 0x00, 0x82, 0x4b, 0x03, 0x50, 0x99, 0x4a, 0x03, + 0x54, 0x11, 0x47, 0x70, 0x2e, 0x08, 0x01, 0xe8, + 0x2e, 0x08, 0x44, 0x38, 0x2e, 0x08, 0x44, 0xb8, + 0xb5, 0xf0, 0xb0, 0x84, 0x4f, 0x36, 0x68, 0x38, + 0x1d, 0xc1, 0x31, 0x0d, 0x20, 0x00, 0xf0, 0x2a, + 0xfb, 0x93, 0x1c, 0x04, 0x68, 0x38, 0x1d, 0xc1, + 0x31, 0x05, 0x20, 0x00, 0xf0, 0x2a, 0xfb, 0x8c, + 0x1c, 0x05, 0x68, 0x38, 0x1d, 0xc1, 0x31, 0x09, + 0x20, 0x00, 0xf0, 0x2a, 0xfb, 0x85, 0x43, 0x2c, + 0x1c, 0x20, 0x4c, 0x2c, 0x68, 0x21, 0x43, 0x08, + 0x27, 0x00, 0x60, 0x20, 0x1c, 0x05, 0xd0, 0x4a, + 0x48, 0x29, 0x90, 0x03, 0x48, 0x29, 0x90, 0x02, + 0x4a, 0x29, 0x92, 0x01, 0x4e, 0x29, 0x08, 0x68, + 0xd3, 0x3c, 0x98, 0x03, 0x5d, 0xc0, 0x28, 0x00, + 0xd0, 0x32, 0x98, 0x02, 0x5d, 0xc0, 0x28, 0x00, + 0xd0, 0x2a, 0x46, 0x68, 0x1c, 0x39, 0xf0, 0x16, + 0xfb, 0x01, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01, + 0xd1, 0x1b, 0x68, 0x60, 0x30, 0x01, 0x60, 0x60, + 0x5d, 0xf0, 0x28, 0x00, 0xd1, 0x06, 0x20, 0xff, + 0x55, 0xf0, 0x21, 0x00, 0x00, 0xb8, 0x9a, 0x01, + 0x50, 0x11, 0xe0, 0x1f, 0x20, 0x02, 0x1c, 0x39, + 0xf0, 0x00, 0xf8, 0x8e, 0x28, 0x00, 0xd1, 0x19, + 0x21, 0x00, 0x55, 0xf1, 0x20, 0x01, 0x40, 0xb8, + 0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, + 0xe0, 0x10, 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, + 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 0xe0, 0x09, + 0x68, 0x60, 0x30, 0x01, 0x60, 0x60, 0xe0, 0x05, + 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 0x68, 0x21, + 0x40, 0x08, 0x60, 0x20, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0x08, 0x6d, 0xd1, 0xbb, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0x78, 0x2e, 0x08, 0x01, 0xe8, + 0x2e, 0x08, 0x44, 0xd8, 0x2e, 0x08, 0x44, 0xf8, + 0x2e, 0x08, 0x44, 0x38, 0x2e, 0x08, 0x44, 0xb8, + 0xb5, 0xf0, 0x27, 0x00, 0xb0, 0x85, 0x4c, 0x26, + 0x68, 0x25, 0x2d, 0x00, 0xd0, 0x44, 0x4e, 0x25, + 0x48, 0x25, 0x90, 0x04, 0x49, 0x25, 0x91, 0x03, + 0x4a, 0x25, 0x92, 0x02, 0x48, 0x25, 0x90, 0x01, + 0x08, 0x68, 0xd3, 0x34, 0x5d, 0xf0, 0x28, 0x00, + 0xd0, 0x2b, 0x98, 0x04, 0x5d, 0xc0, 0x28, 0x00, + 0xd0, 0x2d, 0x46, 0x68, 0x1c, 0x39, 0xf0, 0x16, + 0xfa, 0x9d, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01, + 0xd1, 0x18, 0x68, 0x60, 0x30, 0x01, 0x60, 0x60, + 0x00, 0xb8, 0x99, 0x03, 0x58, 0x09, 0x69, 0x09, + 0x9a, 0x02, 0x50, 0x11, 0x20, 0x02, 0x1c, 0x39, + 0xf0, 0x00, 0xf8, 0x2e, 0x28, 0x00, 0xd1, 0x16, + 0x21, 0x00, 0x98, 0x01, 0x55, 0xc1, 0x20, 0x01, + 0x40, 0xb8, 0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, + 0x60, 0x20, 0xe0, 0x0c, 0x20, 0x01, 0x40, 0xb8, + 0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, + 0xe0, 0x05, 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, + 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0x08, 0x6d, 0xd1, 0xc3, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x01, 0xe8, 0x2e, 0x08, 0x44, 0xd8, + 0x2e, 0x08, 0x44, 0xf8, 0x2e, 0x08, 0x9b, 0xc8, + 0x2e, 0x08, 0x44, 0x38, 0x2e, 0x08, 0x44, 0xb8, + 0xb4, 0xf0, 0x06, 0x02, 0x0e, 0x12, 0xb0, 0x82, + 0x92, 0x00, 0x06, 0x0c, 0x0e, 0x24, 0x00, 0xa0, + 0xb0, 0x81, 0x49, 0x31, 0x58, 0x09, 0x91, 0x00, + 0x29, 0x00, 0xd1, 0x03, 0x20, 0xb0, 0xb0, 0x03, + 0xbc, 0xf0, 0x47, 0x70, 0x49, 0x2d, 0x68, 0x09, + 0x18, 0x47, 0x00, 0xe1, 0x1b, 0x09, 0x00, 0x89, + 0x4a, 0x2b, 0x68, 0x12, 0x18, 0x89, 0x9a, 0x01, + 0x4d, 0x2a, 0x4b, 0x2b, 0x93, 0x02, 0x2a, 0x01, + 0xd0, 0x28, 0x2a, 0x02, 0xd1, 0x44, 0x4b, 0x29, + 0x58, 0x1a, 0x2a, 0x00, 0xd1, 0x03, 0x20, 0xff, + 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x60, 0x4a, + 0x22, 0x00, 0x50, 0x1a, 0x5c, 0xa8, 0x42, 0xa0, + 0xd1, 0x06, 0x00, 0x90, 0x9b, 0x02, 0x58, 0x18, + 0x78, 0x46, 0x23, 0x80, 0x43, 0x9e, 0x70, 0x46, + 0x1c, 0x50, 0x06, 0x02, 0x0e, 0x12, 0x2a, 0x20, + 0xdb, 0xf0, 0x88, 0x08, 0x4b, 0x1c, 0x40, 0x18, + 0x80, 0x08, 0x98, 0x00, 0x9a, 0x01, 0x70, 0xc2, + 0x68, 0x38, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x38, 0xe0, 0x19, 0x68, 0x38, 0x4b, 0x17, + 0x40, 0x18, 0x60, 0x38, 0x98, 0x00, 0x9a, 0x01, + 0x70, 0xc2, 0x20, 0x00, 0x60, 0x88, 0x70, 0xc8, + 0x60, 0xc8, 0x5c, 0x29, 0x42, 0xa1, 0xd1, 0x06, + 0x00, 0x81, 0x9b, 0x02, 0x58, 0x59, 0x78, 0x4a, + 0x23, 0x80, 0x43, 0x1a, 0x70, 0x4a, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf0, + 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, + 0x20, 0xbc, 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x38, + 0x2e, 0x08, 0x9b, 0x30, 0x2e, 0x08, 0x9d, 0x10, + 0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x44, 0x38, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xb4, 0xf0, 0x78, 0x43, 0x00, 0x9e, 0x49, 0x32, + 0x59, 0x8c, 0x88, 0x42, 0x68, 0x87, 0x68, 0x40, + 0x1d, 0xf9, 0x31, 0xb9, 0x1a, 0x09, 0x42, 0x91, + 0xda, 0x3d, 0x25, 0x00, 0x1c, 0x18, 0x00, 0xdb, + 0x1a, 0x18, 0x00, 0x80, 0x4b, 0x2b, 0x68, 0x1b, + 0x18, 0xc0, 0x78, 0x80, 0x06, 0xc0, 0x0e, 0xc0, + 0x28, 0x12, 0xd1, 0x02, 0x29, 0x0e, 0xda, 0x00, + 0x25, 0x01, 0x2a, 0x00, 0xdd, 0x2b, 0x42, 0x8a, + 0xdd, 0x05, 0x68, 0x3f, 0x2f, 0x00, 0xd1, 0x02, + 0x20, 0xba, 0xbc, 0xf0, 0x47, 0x70, 0x1a, 0x52, + 0x79, 0xb9, 0x23, 0xc0, 0x1a, 0x59, 0x79, 0xfb, + 0x1d, 0x38, 0x08, 0x5b, 0xd3, 0x01, 0x22, 0x00, + 0xe0, 0x16, 0x2d, 0x00, 0xd0, 0x14, 0x42, 0x91, + 0xdb, 0x01, 0x31, 0x01, 0xe0, 0x10, 0x1c, 0x4b, + 0x42, 0x93, 0xd1, 0x0d, 0x78, 0x85, 0x2d, 0x09, + 0xdd, 0x06, 0x79, 0x05, 0x78, 0x80, 0x35, 0x09, + 0x42, 0x85, 0xd0, 0x05, 0x1c, 0x19, 0xe0, 0x03, + 0x78, 0x80, 0x28, 0x09, 0xd1, 0x00, 0x1c, 0x19, + 0x25, 0x00, 0x2a, 0x00, 0xdc, 0xd3, 0x69, 0x21, + 0x20, 0x00, 0x1c, 0x0a, 0x42, 0xb9, 0xd0, 0xd4, + 0x68, 0x0b, 0x42, 0xbb, 0xd0, 0x08, 0x68, 0x09, + 0x29, 0x00, 0xd1, 0x02, 0x20, 0xba, 0xbc, 0xf0, + 0x47, 0x70, 0x68, 0x0b, 0x42, 0xbb, 0xd1, 0xf6, + 0x4b, 0x07, 0x51, 0x9a, 0x60, 0x08, 0x69, 0xa2, + 0x69, 0x23, 0x60, 0x13, 0x61, 0xa1, 0x61, 0x27, + 0x61, 0x67, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x30, + 0x2e, 0x08, 0x44, 0x38, 0xb5, 0xf0, 0x06, 0x07, + 0x0e, 0x3f, 0x04, 0x0c, 0x0c, 0x24, 0x06, 0x15, + 0x0e, 0x2d, 0x00, 0xf8, 0x49, 0x2c, 0x68, 0x09, + 0x18, 0x40, 0x00, 0xb9, 0x4a, 0x2b, 0x68, 0x12, + 0x18, 0x8a, 0x00, 0xf9, 0x1b, 0xc9, 0x00, 0x89, + 0x4b, 0x29, 0x68, 0x1b, 0x18, 0xc9, 0x68, 0x16, + 0x23, 0x01, 0x03, 0x5b, 0x43, 0x9e, 0x60, 0x16, + 0x68, 0x06, 0x23, 0x03, 0x03, 0x9b, 0x43, 0x9e, + 0x60, 0x06, 0x4b, 0x24, 0x42, 0x9c, 0xd0, 0x36, + 0x68, 0x06, 0x23, 0x21, 0x43, 0x9e, 0x60, 0x06, + 0x68, 0x16, 0x23, 0x07, 0x03, 0x5b, 0x40, 0x33, + 0x60, 0x13, 0x23, 0x07, 0x03, 0x5b, 0x43, 0x9c, + 0x1c, 0x23, 0x68, 0x14, 0x43, 0x23, 0x60, 0x13, + 0x22, 0x00, 0x75, 0x0a, 0x88, 0x0c, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x9c, 0x80, 0x0c, 0x07, 0xab, + 0x0f, 0x9b, 0x2b, 0x01, 0xd1, 0x04, 0x88, 0x0c, + 0x23, 0x10, 0x43, 0x23, 0x80, 0x0b, 0xe0, 0x03, + 0x88, 0x0c, 0x23, 0x10, 0x43, 0x9c, 0x80, 0x0c, + 0x68, 0x01, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x19, + 0x60, 0x01, 0x00, 0xf9, 0x4b, 0x0e, 0x68, 0x1b, + 0x18, 0xc9, 0x60, 0x4a, 0x68, 0x01, 0x4b, 0x0d, + 0x43, 0x19, 0x60, 0x01, 0x68, 0x01, 0x60, 0x01, + 0x21, 0x0f, 0x60, 0x41, 0xe0, 0x04, 0x1c, 0x38, + 0xf0, 0x13, 0xfa, 0xb6, 0x28, 0x00, 0xd1, 0x00, + 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x9b, 0x3c, 0x2e, 0x08, 0x9b, 0x38, + 0x2e, 0x08, 0x9b, 0x30, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x9b, 0x40, 0x00, 0x00, 0x20, 0xa0, + 0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x07, + 0xb0, 0x8a, 0x48, 0x58, 0x29, 0x00, 0xd1, 0x0a, + 0x4d, 0x57, 0x69, 0x01, 0x91, 0x04, 0x49, 0x57, + 0x91, 0x03, 0x69, 0x41, 0x91, 0x02, 0x6a, 0x00, + 0x1e, 0x43, 0x93, 0x01, 0xe0, 0x0b, 0x29, 0x20, + 0xd1, 0x15, 0x4d, 0x53, 0x69, 0x81, 0x91, 0x04, + 0x49, 0x52, 0x91, 0x03, 0x69, 0xc1, 0x91, 0x02, + 0x6a, 0x40, 0x1e, 0x43, 0x93, 0x01, 0x24, 0x00, + 0x4b, 0x4f, 0x93, 0x09, 0x4a, 0x4f, 0x92, 0x08, + 0x4b, 0x4f, 0x93, 0x07, 0x4e, 0x4f, 0x96, 0x06, + 0x4a, 0x4f, 0x92, 0x05, 0xe0, 0x7a, 0x20, 0xb3, + 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x04, 0x00, 0x80, 0x19, 0x40, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xc0, 0x68, 0x01, 0x98, 0x04, + 0x00, 0x80, 0x58, 0x28, 0x9a, 0x04, 0x18, 0xaa, + 0x00, 0x5b, 0x18, 0xd2, 0x78, 0x12, 0x92, 0x00, + 0x22, 0x00, 0x9b, 0x04, 0x18, 0xee, 0x23, 0x01, + 0x02, 0xdb, 0x18, 0xf3, 0x70, 0x1a, 0x9a, 0x04, + 0x32, 0x01, 0x92, 0x04, 0x9b, 0x01, 0x40, 0x1a, + 0x92, 0x04, 0x29, 0x00, 0xd0, 0x56, 0xb0, 0x82, + 0x91, 0x01, 0x21, 0x01, 0x9a, 0x02, 0x2a, 0x80, + 0xd1, 0x19, 0x22, 0x00, 0x9b, 0x01, 0x40, 0x0b, + 0xd0, 0x10, 0x9b, 0x0b, 0x5c, 0x9b, 0x2b, 0xff, + 0xd0, 0x0c, 0x9b, 0x0b, 0x5c, 0x9b, 0x93, 0x00, + 0x00, 0x91, 0x9a, 0x0a, 0x58, 0x52, 0x00, 0xa1, + 0x19, 0xc9, 0x61, 0x0a, 0x1c, 0x61, 0x06, 0x0c, + 0x0e, 0x24, 0xe0, 0x1c, 0x00, 0x49, 0x32, 0x01, + 0x2a, 0x10, 0xd3, 0xe7, 0xe0, 0x17, 0x22, 0x00, + 0x9b, 0x01, 0x40, 0x0b, 0xd0, 0x0f, 0x9b, 0x09, + 0x5c, 0x9b, 0x2b, 0xff, 0xd0, 0x0b, 0x93, 0x00, + 0x00, 0x93, 0x9e, 0x08, 0x58, 0xf6, 0x00, 0xa3, + 0x19, 0xdb, 0x61, 0x1e, 0x28, 0x00, 0xd0, 0x02, + 0x1c, 0x63, 0x06, 0x1c, 0x0e, 0x24, 0x00, 0x49, + 0x32, 0x01, 0x2a, 0x20, 0xd3, 0xe8, 0x2c, 0x00, + 0xd0, 0x1b, 0x9b, 0x00, 0x70, 0x7b, 0x60, 0x78, + 0x9b, 0x00, 0x00, 0x99, 0x9a, 0x07, 0x58, 0x52, + 0x69, 0x51, 0xe0, 0x07, 0x68, 0x09, 0x29, 0x00, + 0xd1, 0x04, 0x20, 0xba, 0xb0, 0x0c, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x42, 0x88, 0xd3, 0xf5, + 0x1d, 0xcb, 0x33, 0xb9, 0x42, 0x83, 0xd3, 0xf1, + 0x60, 0xb9, 0x61, 0x51, 0x1c, 0x38, 0xf0, 0x13, + 0xfa, 0xc0, 0xb0, 0x02, 0x98, 0x04, 0x99, 0x02, + 0x42, 0x88, 0xd0, 0x01, 0x2c, 0x00, 0xd0, 0x83, + 0x70, 0x3c, 0x98, 0x04, 0x99, 0x03, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x9e, 0x00, 0x04, 0x80, + 0x2e, 0x08, 0x9d, 0xfc, 0x9e, 0x00, 0x04, 0x90, + 0x2e, 0x08, 0xa6, 0xfc, 0x9e, 0x00, 0x04, 0x98, + 0x2e, 0x08, 0x9d, 0x30, 0x2e, 0x08, 0x9c, 0xd0, + 0x2e, 0x08, 0x9d, 0x10, 0x2e, 0x08, 0x9c, 0x50, + 0x2e, 0x08, 0x9b, 0xc8, 0xb5, 0x00, 0x20, 0xff, + 0x49, 0x03, 0x60, 0x08, 0x20, 0x01, 0x05, 0x00, + 0xf0, 0x21, 0xf9, 0x74, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x01, 0xe8, 0xb5, 0xf0, 0x06, 0x07, + 0x0e, 0x3f, 0x06, 0x0c, 0x0e, 0x24, 0x20, 0x10, + 0x2f, 0x1f, 0xdc, 0x2c, 0x2c, 0x1f, 0xdc, 0x2a, + 0x1c, 0x39, 0x43, 0x21, 0x08, 0x49, 0xd2, 0x26, + 0x49, 0x14, 0x1c, 0x38, 0xf0, 0x21, 0xf9, 0x70, + 0x26, 0x01, 0x1c, 0x35, 0x40, 0xbd, 0x1c, 0x30, + 0x40, 0xa0, 0x1c, 0x04, 0x43, 0x28, 0xf0, 0x21, + 0xf9, 0x5a, 0xf0, 0x21, 0xf9, 0x5d, 0x43, 0xa8, + 0xf0, 0x21, 0xf9, 0x5e, 0xf0, 0x21, 0xf9, 0x58, + 0x43, 0xa0, 0xf0, 0x21, 0xf9, 0x59, 0x1c, 0x38, + 0xf0, 0x15, 0xfc, 0x02, 0x1c, 0x04, 0xd1, 0x07, + 0x21, 0x03, 0x05, 0x09, 0x20, 0x00, 0x1c, 0x3a, + 0x1c, 0x33, 0xf0, 0x16, 0xfa, 0xb3, 0x1c, 0x04, + 0xf7, 0xff, 0xfc, 0x92, 0x1c, 0x20, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x00, 0x2c, 0x0b, + 0xb5, 0xf0, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x0d, + 0x0c, 0x2d, 0x06, 0x16, 0x0e, 0x36, 0x9f, 0x05, + 0x06, 0x38, 0x0e, 0x00, 0x22, 0x00, 0x21, 0x00, + 0xb4, 0x07, 0x21, 0x10, 0x1c, 0x1a, 0xb4, 0x06, + 0x23, 0x10, 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32, + 0xf0, 0x00, 0xf8, 0x54, 0xb0, 0x05, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x06, 0x04, + 0x0e, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x06, 0x16, + 0x0e, 0x36, 0x9f, 0x05, 0x06, 0x38, 0x0e, 0x00, + 0x22, 0x00, 0x21, 0x00, 0xb4, 0x07, 0x21, 0x18, + 0x1c, 0x1a, 0xb4, 0x06, 0x23, 0x11, 0x1c, 0x20, + 0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00, 0xf8, 0x3a, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf0, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x0d, + 0x0c, 0x2d, 0x06, 0x16, 0x0e, 0x36, 0x9f, 0x05, + 0x06, 0x38, 0x0e, 0x00, 0x22, 0x00, 0x21, 0x00, + 0xb4, 0x07, 0x21, 0x20, 0x1c, 0x1a, 0xb4, 0x06, + 0x23, 0x51, 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32, + 0xf0, 0x00, 0xf8, 0x20, 0xb0, 0x05, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x06, 0x03, + 0x0e, 0x1b, 0x04, 0x0d, 0x0c, 0x2d, 0x06, 0x16, + 0x0e, 0x36, 0x9c, 0x09, 0x9f, 0x0a, 0x06, 0x20, + 0x0e, 0x00, 0x22, 0x00, 0x1c, 0x39, 0xb4, 0x07, + 0x21, 0x10, 0x9a, 0x06, 0xb4, 0x06, 0x1c, 0x18, + 0x23, 0x62, 0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00, + 0xf8, 0x05, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9e, 0x09, + 0x9f, 0x0b, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x09, + 0x0c, 0x09, 0xb0, 0x88, 0x91, 0x00, 0x06, 0x15, + 0x0e, 0x2d, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, + 0x06, 0x32, 0x0e, 0x12, 0x92, 0x02, 0x06, 0x38, + 0x0e, 0x00, 0x90, 0x03, 0xb0, 0x82, 0xf0, 0x21, + 0xf8, 0xbf, 0x0d, 0x40, 0xd2, 0x09, 0x20, 0xff, + 0x90, 0x00, 0xf0, 0x21, 0xf8, 0xb9, 0x23, 0x01, + 0x05, 0x1b, 0x43, 0x18, 0xf0, 0x21, 0xf8, 0xb8, + 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x03, + 0x08, 0x40, 0xd3, 0x02, 0x22, 0x12, 0x92, 0x01, + 0xe0, 0x01, 0x22, 0x11, 0x92, 0x01, 0x22, 0x01, + 0x1c, 0x11, 0x40, 0xa9, 0x4b, 0x5f, 0x1c, 0x0f, + 0x68, 0x18, 0x40, 0x07, 0xd0, 0x01, 0x27, 0x11, + 0xe0, 0xa2, 0x27, 0x00, 0x43, 0x08, 0x60, 0x18, + 0x23, 0x1c, 0x98, 0x05, 0x40, 0x18, 0x28, 0x1c, + 0xd1, 0x06, 0x21, 0x01, 0x20, 0x7d, 0x01, 0x00, + 0xf0, 0x15, 0xff, 0x60, 0x1c, 0x06, 0xe0, 0x0d, + 0x98, 0x05, 0x08, 0x40, 0xd3, 0x05, 0x21, 0x01, + 0x20, 0xc8, 0xf0, 0x15, 0xff, 0x57, 0x1c, 0x06, + 0xe0, 0x04, 0x21, 0x01, 0x20, 0x3c, 0xf0, 0x15, + 0xff, 0x51, 0x1c, 0x06, 0x20, 0x34, 0xf0, 0x03, + 0xf9, 0x57, 0x00, 0xaa, 0x92, 0x09, 0x49, 0x4c, + 0x91, 0x08, 0x50, 0x88, 0x00, 0xa1, 0x91, 0x07, + 0x48, 0x4a, 0x90, 0x06, 0x58, 0x40, 0x28, 0x00, + 0xd1, 0x05, 0x00, 0xb0, 0xf0, 0x03, 0xf9, 0x48, + 0x99, 0x07, 0x9a, 0x06, 0x50, 0x50, 0x98, 0x09, + 0x99, 0x08, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x04, + 0x98, 0x06, 0x99, 0x07, 0x58, 0x40, 0x28, 0x00, + 0xd1, 0x01, 0x27, 0x13, 0xe0, 0x64, 0x99, 0x07, + 0x4a, 0x3f, 0x58, 0x51, 0x29, 0x00, 0xd1, 0x3a, + 0x9a, 0x01, 0xb4, 0x04, 0x23, 0x40, 0x1c, 0x31, + 0x1c, 0x22, 0xf0, 0x15, 0xff, 0xaf, 0xb0, 0x01, + 0x1c, 0x07, 0xd1, 0x17, 0x23, 0x03, 0x02, 0x5b, + 0x22, 0x01, 0x02, 0xd2, 0x21, 0x01, 0x1c, 0x20, + 0xf0, 0x0e, 0xf8, 0xf2, 0x22, 0x00, 0xb4, 0x04, + 0x22, 0x02, 0x99, 0x03, 0x9b, 0x02, 0x1c, 0x20, + 0xf0, 0x0d, 0xff, 0x26, 0xb0, 0x01, 0x1c, 0x07, + 0xd1, 0x04, 0x22, 0x01, 0x48, 0x2f, 0x55, 0x02, + 0x48, 0x2f, 0x55, 0x02, 0x2f, 0x00, 0xd1, 0x16, + 0x98, 0x16, 0x28, 0x00, 0xd0, 0x13, 0x21, 0x02, + 0x98, 0x16, 0xf0, 0x15, 0xfe, 0xff, 0x1c, 0x07, + 0x00, 0x80, 0xf0, 0x03, 0xf9, 0x05, 0x99, 0x07, + 0x4a, 0x28, 0x50, 0x50, 0x28, 0x00, 0xd0, 0x05, + 0x1c, 0x39, 0x1c, 0x22, 0xf0, 0x15, 0xff, 0x13, + 0x1c, 0x07, 0xe0, 0x00, 0x27, 0x13, 0x2f, 0x00, + 0xd1, 0x22, 0x98, 0x03, 0x09, 0x80, 0xd3, 0x06, + 0x20, 0x5c, 0xf0, 0x03, 0xf8, 0xf1, 0x28, 0x00, + 0xd1, 0x02, 0x27, 0x13, 0xe0, 0x00, 0x20, 0x00, + 0x1c, 0x02, 0x98, 0x05, 0x99, 0x17, 0xb4, 0x07, + 0x1c, 0x2a, 0xb4, 0x04, 0x98, 0x0d, 0x99, 0x0c, + 0x58, 0x08, 0x99, 0x18, 0x9a, 0x08, 0x9b, 0x07, + 0xf0, 0x00, 0xf9, 0x1c, 0xb0, 0x04, 0x2f, 0x00, + 0xd1, 0x06, 0x98, 0x09, 0x99, 0x08, 0x58, 0x08, + 0x1c, 0x21, 0xf0, 0x12, 0xf9, 0x93, 0x1c, 0x07, + 0x2f, 0x00, 0xd0, 0x03, 0x1c, 0x20, 0x1c, 0x29, + 0xf0, 0x00, 0xf8, 0x20, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0xf0, 0x20, 0xff, 0xf1, 0x4b, 0x0c, + 0x40, 0x18, 0xf0, 0x20, 0xff, 0xf1, 0x1c, 0x38, + 0xb0, 0x0a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xf0, + 0x2e, 0x08, 0x01, 0xf4, 0x2e, 0x08, 0x02, 0x74, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x44, 0xf8, + 0x2e, 0x08, 0x44, 0xd8, 0x2e, 0x08, 0x02, 0xf4, + 0xff, 0xef, 0xff, 0xff, 0xb5, 0xf0, 0x06, 0x07, + 0x0e, 0x3f, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x83, + 0xf0, 0x20, 0xff, 0xce, 0x0d, 0x40, 0xd2, 0x09, + 0x20, 0xff, 0x90, 0x00, 0xf0, 0x20, 0xff, 0xc8, + 0x23, 0x01, 0x05, 0x1b, 0x43, 0x18, 0xf0, 0x20, + 0xff, 0xc7, 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, + 0x24, 0x00, 0x20, 0x01, 0x40, 0xa8, 0x1c, 0x02, + 0x49, 0x3f, 0x1c, 0x13, 0x68, 0x08, 0x40, 0x03, + 0xd0, 0x69, 0x43, 0xd2, 0x40, 0x10, 0x00, 0xae, + 0x60, 0x08, 0x4d, 0x3c, 0x59, 0xa8, 0x28, 0x00, + 0xd0, 0x62, 0x78, 0x81, 0x91, 0x02, 0x08, 0x49, + 0xd3, 0x02, 0x23, 0x12, 0x93, 0x01, 0xe0, 0x01, + 0x23, 0x11, 0x93, 0x01, 0x1c, 0x39, 0xf0, 0x12, + 0xf9, 0xad, 0x1c, 0x04, 0x59, 0xa8, 0x6b, 0x00, + 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x03, 0xf8, 0x96, + 0x59, 0xa8, 0x6a, 0xc0, 0x28, 0x00, 0xd0, 0x01, + 0xf0, 0x03, 0xf8, 0x90, 0x59, 0xa8, 0xf0, 0x03, + 0xf8, 0x8d, 0x20, 0x00, 0x51, 0xa8, 0x00, 0xbd, + 0x48, 0x2b, 0x59, 0x40, 0x78, 0x80, 0x28, 0x00, + 0xd1, 0x40, 0x1c, 0x39, 0xf0, 0x15, 0xfc, 0xd2, + 0x2c, 0x00, 0xd1, 0x2a, 0x98, 0x02, 0x09, 0x80, + 0xd3, 0x0a, 0x21, 0x00, 0x1c, 0x3a, 0x48, 0x25, + 0xf0, 0x15, 0xfe, 0x6d, 0x28, 0x00, 0xd0, 0x03, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x22, 0x00, 0xb4, 0x04, 0x22, 0x02, 0x9b, 0x02, + 0x1c, 0x38, 0x49, 0x1e, 0xf0, 0x0d, 0xfe, 0x54, + 0xb0, 0x01, 0x1c, 0x04, 0xd1, 0x11, 0x9a, 0x01, + 0xb4, 0x04, 0x26, 0x00, 0x21, 0x00, 0x1c, 0x3a, + 0x1c, 0x33, 0x48, 0x18, 0xf0, 0x15, 0xfe, 0xbe, + 0x1c, 0x04, 0xb0, 0x01, 0x48, 0x16, 0x55, 0xc6, + 0x48, 0x16, 0x55, 0xc6, 0x1c, 0x38, 0xf7, 0xff, + 0xfa, 0xc5, 0x4f, 0x15, 0x59, 0x78, 0xf0, 0x03, + 0xf8, 0x51, 0x26, 0x00, 0x51, 0x7e, 0x37, 0x80, + 0x59, 0x78, 0x28, 0x00, 0xd0, 0x04, 0xf0, 0x03, + 0xf8, 0x49, 0x51, 0x7e, 0xe0, 0x02, 0xe0, 0x00, + 0xe0, 0x00, 0x24, 0x12, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0xf0, 0x20, 0xff, 0x45, 0x4b, 0x0b, + 0x40, 0x18, 0xf0, 0x20, 0xff, 0x45, 0x1c, 0x20, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x01, 0xf0, 0x2e, 0x08, 0x01, 0xf4, + 0x2e, 0x08, 0x9b, 0xc8, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x44, 0xf8, 0x2e, 0x08, 0x44, 0xd8, + 0x2e, 0x08, 0x02, 0x74, 0xff, 0xef, 0xff, 0xff, + 0xb5, 0xb0, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x80, + 0x1c, 0x0c, 0x1c, 0x17, 0xb0, 0xad, 0x49, 0x1c, + 0x58, 0x08, 0x90, 0x04, 0x78, 0x81, 0x23, 0x04, + 0x40, 0x19, 0x25, 0x00, 0x29, 0x00, 0xd0, 0x0b, + 0xa9, 0x25, 0xf0, 0x12, 0xfd, 0x6f, 0xab, 0x00, + 0x80, 0x5d, 0xa8, 0x25, 0x90, 0x24, 0x46, 0x68, + 0x21, 0x00, 0xf0, 0x12, 0xfd, 0x8e, 0xe0, 0x0c, + 0x78, 0x00, 0x0a, 0x00, 0xd3, 0x04, 0x20, 0x01, + 0x03, 0x00, 0xab, 0x00, 0x80, 0x58, 0xe0, 0x03, + 0x20, 0x01, 0x02, 0x80, 0xab, 0x00, 0x80, 0x58, + 0x20, 0x00, 0x28, 0x00, 0xd1, 0x0e, 0xa8, 0x00, + 0x88, 0x40, 0x60, 0x38, 0xf0, 0x02, 0xff, 0xd4, + 0x60, 0x20, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x13, + 0xe0, 0x06, 0x1c, 0x01, 0x46, 0x68, 0xf0, 0x12, + 0xfd, 0x70, 0xe0, 0x01, 0x60, 0x25, 0x60, 0x3d, + 0xb0, 0x2d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x01, 0xf4, 0xb4, 0xf0, 0x06, 0x12, + 0x0e, 0x12, 0x06, 0x1b, 0x0e, 0x1b, 0x9c, 0x06, + 0x9f, 0x07, 0x9d, 0x05, 0x9e, 0x04, 0x06, 0x36, + 0x0e, 0x36, 0x06, 0x2d, 0xd0, 0x02, 0x25, 0x80, + 0x70, 0x05, 0xe0, 0x01, 0x25, 0x00, 0x70, 0x05, + 0x25, 0x00, 0x70, 0x45, 0x80, 0x85, 0x72, 0x05, + 0x70, 0xc6, 0x70, 0x83, 0x62, 0xc4, 0x63, 0x07, + 0x27, 0x00, 0x23, 0x00, 0x2a, 0x00, 0xdd, 0x10, + 0x5c, 0xcc, 0x19, 0xc5, 0x73, 0x2c, 0x18, 0xcc, + 0x78, 0x66, 0x1c, 0x7c, 0x06, 0x25, 0x0e, 0x2d, + 0x1c, 0x3c, 0x18, 0x24, 0x77, 0x26, 0x33, 0x02, + 0x06, 0x1b, 0x0e, 0x1b, 0x1c, 0x2f, 0x42, 0x93, + 0xdb, 0xee, 0xbc, 0xf0, 0x47, 0x70, 0xb5, 0xf0, + 0xb0, 0xac, 0x21, 0x00, 0xa8, 0x07, 0xf0, 0x12, + 0xfb, 0xf5, 0xa8, 0x07, 0x78, 0x00, 0x90, 0x06, + 0x28, 0x00, 0xd0, 0x4b, 0x24, 0x00, 0x98, 0x06, + 0x28, 0x00, 0xdd, 0x43, 0xa8, 0x07, 0xf0, 0x12, + 0xff, 0xbc, 0x00, 0xa1, 0xa8, 0x07, 0x18, 0x08, + 0x69, 0x07, 0x78, 0xfe, 0xad, 0x07, 0x88, 0x6d, + 0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12, 0xa8, 0x07, + 0xa9, 0x01, 0xf0, 0x16, 0xfa, 0x0b, 0x78, 0xb8, + 0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, 0x1c, 0x38, + 0xa9, 0x01, 0xf0, 0x16, 0xfa, 0x38, 0xe0, 0x08, + 0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x16, + 0xfa, 0x75, 0xe0, 0x02, 0x20, 0x40, 0xab, 0x00, + 0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, 0x09, 0xc0, + 0xd3, 0x16, 0x1c, 0x28, 0xf7, 0xfd, 0xfe, 0xf8, + 0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x07, 0x1c, 0x39, + 0xf0, 0x12, 0xfe, 0x2e, 0x28, 0x00, 0xd1, 0x09, + 0x1c, 0x30, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfd, + 0xff, 0x47, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, + 0xff, 0x39, 0xe0, 0x01, 0xf7, 0xfd, 0xff, 0x36, + 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0x98, 0x06, + 0x42, 0x84, 0xdb, 0xbb, 0xa8, 0x07, 0xf0, 0x12, + 0xfc, 0x97, 0xe7, 0xaa, 0xf7, 0xff, 0xfa, 0x5c, + 0xb0, 0x2c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf0, 0xb0, 0xad, 0x21, 0x00, 0xa8, 0x08, + 0xf0, 0x12, 0xfb, 0x98, 0x22, 0x05, 0x21, 0x16, + 0x1c, 0x04, 0xf0, 0x03, 0xfd, 0x6a, 0x2c, 0xb2, + 0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, 0xf0, 0x12, + 0xfb, 0x47, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, + 0x28, 0x00, 0xd0, 0x73, 0x25, 0x00, 0x98, 0x06, + 0x28, 0x00, 0xdd, 0x57, 0xa8, 0x08, 0xf0, 0x12, + 0xff, 0x54, 0x00, 0xa9, 0xa8, 0x08, 0x18, 0x08, + 0x69, 0x07, 0x78, 0xf8, 0x90, 0x07, 0xae, 0x08, + 0x88, 0x76, 0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12, + 0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x16, 0xf9, 0xa2, + 0x78, 0xb8, 0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, + 0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x16, 0xf9, 0xcf, + 0xe0, 0x08, 0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, + 0xf0, 0x16, 0xfa, 0x0c, 0xe0, 0x02, 0x20, 0x40, + 0xab, 0x00, 0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, + 0x09, 0xc0, 0xd3, 0x29, 0x78, 0xb8, 0x09, 0x80, + 0xd3, 0x0f, 0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x16, + 0xfb, 0x69, 0x1c, 0x04, 0xa8, 0x00, 0x78, 0x00, + 0x08, 0x80, 0xd2, 0x02, 0x78, 0xb8, 0x08, 0x80, + 0xd3, 0x1a, 0x1c, 0x38, 0xf0, 0x16, 0xfc, 0x70, + 0xe0, 0x16, 0x1c, 0x30, 0xf7, 0xfd, 0xfe, 0x7c, + 0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x08, 0x1c, 0x39, + 0xf0, 0x12, 0xfd, 0xb2, 0x28, 0x00, 0xd1, 0x09, + 0x98, 0x07, 0x1c, 0x31, 0x1c, 0x3a, 0xf7, 0xfd, + 0xfe, 0xcb, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, + 0xfe, 0xbd, 0xe0, 0x01, 0xf7, 0xfd, 0xfe, 0xba, + 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x06, + 0x42, 0x85, 0xdb, 0xa7, 0x98, 0x06, 0x28, 0x00, + 0xd0, 0x08, 0xa8, 0x08, 0xf0, 0x12, 0xfc, 0x18, + 0x2c, 0xb2, 0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, + 0xf0, 0x12, 0xfa, 0xda, 0xf7, 0xff, 0xf9, 0x5c, + 0x21, 0x00, 0xa8, 0x08, 0xf7, 0xff, 0xfb, 0x88, + 0x1c, 0x04, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, + 0x28, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xd1, 0x89, + 0xf7, 0xff, 0xf9, 0xca, 0xb0, 0x2d, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x26, 0x00, + 0x48, 0x28, 0x71, 0x06, 0x70, 0x06, 0x20, 0x00, + 0x4f, 0x27, 0x4a, 0x28, 0x49, 0x28, 0x00, 0x43, + 0x52, 0xd6, 0x52, 0xfe, 0x00, 0x83, 0x50, 0xce, + 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x1d, + 0xdb, 0xf5, 0x28, 0x20, 0xda, 0x08, 0x00, 0x43, + 0x52, 0xd6, 0x00, 0x83, 0x50, 0xce, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf6, + 0x20, 0x01, 0x02, 0x80, 0xf0, 0x20, 0xfd, 0xa3, + 0xf0, 0x20, 0xfd, 0xa6, 0x4b, 0x1b, 0x40, 0x18, + 0xf0, 0x20, 0xfd, 0xa6, 0x49, 0x1a, 0x20, 0x0a, + 0xf0, 0x20, 0xfd, 0xa6, 0x21, 0x00, 0x4f, 0x19, + 0x20, 0xff, 0x4a, 0x19, 0x00, 0x4b, 0x18, 0x5b, + 0x01, 0x1b, 0x52, 0xd7, 0x18, 0x9b, 0x70, 0x98, + 0x70, 0xde, 0x71, 0x1e, 0x1d, 0xdc, 0x34, 0x19, + 0x73, 0x26, 0x71, 0x5e, 0x1c, 0x1d, 0x23, 0x06, + 0x73, 0x63, 0x23, 0x00, 0x00, 0xdc, 0x19, 0x2c, + 0x81, 0xa6, 0x81, 0xe6, 0x33, 0x01, 0x06, 0x1b, + 0x0e, 0x1b, 0x60, 0xa6, 0x2b, 0x04, 0xdb, 0xf5, + 0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x08, + 0xdb, 0xe0, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xbc, + 0x2e, 0x08, 0x4a, 0x60, 0x2e, 0x08, 0x4a, 0x20, + 0x2e, 0x08, 0x46, 0x98, 0xff, 0xff, 0xfb, 0xff, + 0x2e, 0x00, 0x30, 0x45, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x45, 0x18, 0xb5, 0xf0, 0x06, 0x00, + 0x0e, 0x00, 0xb0, 0x83, 0x90, 0x00, 0x04, 0x09, + 0x0c, 0x09, 0x91, 0x01, 0x06, 0x10, 0x0e, 0x00, + 0x04, 0x1c, 0x0c, 0x24, 0x27, 0x00, 0x49, 0x5a, + 0x00, 0x7b, 0x19, 0xdb, 0x01, 0x1b, 0x5a, 0xcd, + 0x4b, 0x58, 0x42, 0x9d, 0xd1, 0x01, 0x1c, 0x3a, + 0xe0, 0x04, 0x1c, 0x7b, 0x06, 0x1f, 0x0e, 0x3f, + 0x2f, 0x08, 0xdb, 0xf1, 0x2f, 0x08, 0xd1, 0x05, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x46, 0x4f, 0x50, + 0x97, 0x02, 0x5b, 0xbb, 0x2b, 0x00, 0xd0, 0x05, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x23, 0x01, 0x9f, 0x02, + 0x53, 0xbb, 0x00, 0x53, 0x18, 0x9a, 0x01, 0x12, + 0x18, 0x57, 0x80, 0x38, 0x20, 0x14, 0xf0, 0x02, + 0xfe, 0x03, 0x1c, 0x01, 0x62, 0xb8, 0x20, 0x00, + 0x29, 0x00, 0xd1, 0x08, 0x49, 0x41, 0x80, 0x39, + 0x9f, 0x02, 0x53, 0xb8, 0x43, 0xc0, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x0d, + 0x21, 0xff, 0x02, 0x09, 0x40, 0x21, 0x12, 0x08, + 0x28, 0x09, 0xd2, 0x1f, 0xa3, 0x01, 0x5c, 0x1b, + 0x00, 0x5b, 0x44, 0x9f, 0x1b, 0x04, 0x06, 0x09, + 0x0c, 0x0f, 0x12, 0x15, 0x18, 0x00, 0x24, 0xb8, + 0xe0, 0x16, 0x24, 0xff, 0x34, 0x71, 0xe0, 0x13, + 0x24, 0x01, 0x02, 0xa4, 0xe0, 0x10, 0x24, 0x01, + 0x02, 0xe4, 0xe0, 0x0d, 0x24, 0x01, 0x03, 0x24, + 0xe0, 0x0a, 0x24, 0x01, 0x03, 0x64, 0xe0, 0x07, + 0x24, 0x01, 0x03, 0xa4, 0xe0, 0x04, 0x24, 0x01, + 0x03, 0xe4, 0xe0, 0x01, 0x24, 0x01, 0x02, 0xa4, + 0x80, 0xac, 0x88, 0xa8, 0x00, 0x80, 0xf0, 0x02, + 0xfd, 0xc7, 0x60, 0x28, 0x28, 0x00, 0xd1, 0x0d, + 0x48, 0x24, 0x80, 0x38, 0x20, 0x00, 0x9f, 0x02, + 0x53, 0xb8, 0x1c, 0x28, 0xf0, 0x02, 0xfd, 0xde, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x00, 0x70, 0xb8, + 0x26, 0x00, 0x88, 0x38, 0x00, 0x80, 0x49, 0x1d, + 0x50, 0x0e, 0x20, 0x00, 0x1c, 0x01, 0x43, 0x61, + 0x68, 0x2a, 0x18, 0x8a, 0x00, 0xc1, 0x19, 0xc9, + 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x60, 0x8a, + 0x28, 0x04, 0xdb, 0xf3, 0x20, 0xb8, 0x1c, 0x21, + 0xf0, 0x1b, 0xf9, 0x30, 0x1d, 0xfc, 0x34, 0x19, + 0x73, 0x20, 0x72, 0x2e, 0x78, 0xb8, 0x23, 0x01, + 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0xf0, 0x0d, + 0xfd, 0x63, 0x22, 0x00, 0xb4, 0x04, 0x78, 0xb8, + 0x23, 0x05, 0x22, 0x02, 0x99, 0x02, 0xf0, 0x0d, + 0xfb, 0x97, 0x22, 0x04, 0x7b, 0x21, 0xb0, 0x01, + 0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85, + 0x6a, 0xbb, 0xf0, 0x0d, 0xfd, 0xdf, 0x1c, 0x30, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x45, 0x18, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x4a, 0x20, 0x2e, 0x08, 0x46, 0x98, + 0xb5, 0xf0, 0xb0, 0x82, 0x46, 0x68, 0xf0, 0x0e, + 0xfb, 0x73, 0x21, 0x00, 0x4f, 0x24, 0x4b, 0x25, + 0x93, 0x01, 0x4a, 0x25, 0x00, 0x48, 0x18, 0x40, + 0x01, 0x00, 0x19, 0xc0, 0x78, 0x84, 0x9d, 0x00, + 0x40, 0xe5, 0x07, 0xeb, 0x0f, 0xdb, 0x2b, 0x01, + 0xd1, 0x31, 0x6a, 0x83, 0x7a, 0x1c, 0x2c, 0xa4, + 0xd0, 0x01, 0x2c, 0xa5, 0xd1, 0x2b, 0x1d, 0xc4, + 0x34, 0x19, 0xe0, 0x0e, 0x79, 0x05, 0x73, 0x65, + 0x88, 0xde, 0x79, 0x05, 0x00, 0xed, 0x18, 0x2d, + 0x81, 0xae, 0x79, 0x05, 0x35, 0x01, 0x07, 0xad, + 0x0f, 0xad, 0x71, 0x05, 0x78, 0x15, 0x35, 0x01, + 0x70, 0x15, 0x7a, 0x9d, 0x7b, 0x66, 0x42, 0xb5, + 0xd0, 0x02, 0x79, 0x45, 0x2d, 0x00, 0xd0, 0xe9, + 0x7a, 0x1b, 0x2b, 0xa5, 0xd1, 0x0f, 0x79, 0x43, + 0x07, 0xdc, 0x0f, 0xe4, 0x2c, 0x01, 0xd0, 0x0a, + 0x1c, 0x1c, 0x23, 0x01, 0x43, 0x23, 0x71, 0x43, + 0x88, 0x00, 0x00, 0x80, 0x9b, 0x01, 0x18, 0xc0, + 0x68, 0x03, 0x33, 0x01, 0x60, 0x03, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0x29, 0x08, 0xdb, 0xbd, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x45, 0x18, 0x2e, 0x08, 0x46, 0x98, + 0x2e, 0x08, 0x03, 0xbc, 0xb5, 0xf0, 0x04, 0x05, + 0x0c, 0x2d, 0x20, 0x00, 0x4c, 0x31, 0x00, 0x42, + 0x18, 0x12, 0x01, 0x12, 0x5a, 0xa2, 0x42, 0xaa, + 0xd1, 0x01, 0x1c, 0x01, 0xe0, 0x04, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf2, + 0x28, 0x08, 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x48, + 0x18, 0x40, 0x01, 0x00, 0x19, 0x07, 0x78, 0xb8, + 0x49, 0x25, 0xf0, 0x0d, 0xfd, 0xab, 0x79, 0x78, + 0x23, 0x02, 0x43, 0x18, 0x71, 0x78, 0x78, 0xbe, + 0x20, 0xff, 0x70, 0xb8, 0x21, 0x00, 0x1d, 0xf8, + 0x30, 0x19, 0x73, 0x01, 0x21, 0x06, 0x73, 0x41, + 0x78, 0xf8, 0x79, 0x39, 0x42, 0x88, 0xd1, 0x11, + 0x79, 0x78, 0x07, 0xc0, 0x0f, 0xc0, 0x28, 0x01, + 0xd0, 0x0c, 0x20, 0x00, 0x70, 0xf8, 0x71, 0x38, + 0x71, 0x78, 0x48, 0x17, 0x80, 0x38, 0x6a, 0xb8, + 0x68, 0x00, 0xf0, 0x02, 0xfc, 0xff, 0x6a, 0xb8, + 0xf0, 0x02, 0xfc, 0xfc, 0x4f, 0x12, 0x00, 0x68, + 0x49, 0x12, 0x52, 0x0f, 0x00, 0x71, 0x4a, 0x12, + 0x52, 0x57, 0x21, 0x00, 0x4a, 0x11, 0x52, 0x11, + 0x1c, 0x30, 0x1c, 0x29, 0xf0, 0x02, 0xff, 0xfa, + 0x20, 0x00, 0x00, 0x41, 0x18, 0x09, 0x01, 0x09, + 0x5a, 0x61, 0x42, 0xb9, 0xd1, 0x04, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf4, + 0x28, 0x08, 0xd1, 0x03, 0x21, 0x00, 0x48, 0x08, + 0x71, 0x01, 0x70, 0x01, 0x20, 0x00, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x45, 0x18, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0xe0, + 0x2e, 0x08, 0x49, 0xa8, 0x2e, 0x08, 0x4a, 0x20, + 0x2e, 0x08, 0x03, 0xbc, 0xb5, 0x80, 0x1c, 0x07, + 0x30, 0x28, 0xf0, 0x02, 0xfc, 0xa5, 0x49, 0x07, + 0x64, 0x88, 0x65, 0x08, 0x65, 0x48, 0x19, 0xc0, + 0x64, 0xc8, 0x20, 0x00, 0x64, 0x08, 0x64, 0x4f, + 0x49, 0x03, 0x84, 0x08, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc4, + 0x2c, 0x00, 0x01, 0x00, 0xb5, 0x80, 0x1c, 0x07, + 0x30, 0x28, 0xf0, 0x02, 0xfc, 0x8d, 0x49, 0x06, + 0x66, 0x08, 0x66, 0x88, 0x66, 0xc8, 0x19, 0xc0, + 0x66, 0x48, 0x20, 0x00, 0x65, 0x88, 0x65, 0xcf, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x03, 0xc4, 0xb4, 0x80, 0x04, 0x09, + 0x0c, 0x09, 0x88, 0x02, 0x42, 0x8a, 0xd0, 0x18, + 0x4a, 0x0d, 0x8f, 0x13, 0x2b, 0x01, 0xd0, 0x04, + 0x23, 0x01, 0x87, 0x13, 0x8f, 0x17, 0x2f, 0x01, + 0xd1, 0xfb, 0x88, 0x03, 0x42, 0x8b, 0xd0, 0x03, + 0x80, 0x01, 0x88, 0x03, 0x42, 0x8b, 0xd1, 0xfb, + 0x8f, 0x11, 0x1c, 0x10, 0x29, 0x00, 0xd0, 0x04, + 0x21, 0x00, 0x87, 0x01, 0x8f, 0x02, 0x2a, 0x00, + 0xd1, 0xfb, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0x80, 0x48, 0x27, + 0x8f, 0x40, 0x28, 0x00, 0xd1, 0x47, 0x4f, 0x26, + 0x88, 0x38, 0x12, 0x00, 0x4a, 0x25, 0x28, 0x06, + 0xd0, 0x21, 0xdc, 0x08, 0x28, 0x06, 0xd2, 0x36, + 0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, + 0x3a, 0x09, 0x09, 0x15, 0x32, 0x09, 0x28, 0x0a, + 0xd0, 0x1b, 0xdc, 0x08, 0x28, 0x07, 0xd0, 0x15, + 0x28, 0x09, 0xd1, 0x28, 0x88, 0x79, 0x88, 0x38, + 0xf0, 0x00, 0xf8, 0xd4, 0xe0, 0x27, 0x28, 0x0b, + 0xd0, 0x1c, 0x28, 0x80, 0xd1, 0x1f, 0xf0, 0x00, + 0xf9, 0x25, 0xe0, 0x20, 0x88, 0x79, 0x88, 0x38, + 0xf0, 0x00, 0xf8, 0x2c, 0xe0, 0x1b, 0xf0, 0x00, + 0xf9, 0x75, 0xe0, 0x18, 0xf0, 0x00, 0xf9, 0xe0, + 0xe0, 0x15, 0x88, 0x38, 0xb0, 0x84, 0xab, 0x00, + 0x80, 0x18, 0x88, 0x78, 0x70, 0x98, 0x92, 0x01, + 0x46, 0x69, 0x20, 0x75, 0xf0, 0x08, 0xf8, 0x04, + 0xb0, 0x04, 0xe0, 0x08, 0x88, 0x79, 0x88, 0x38, + 0xf0, 0x00, 0xfc, 0x50, 0xe0, 0x03, 0x48, 0x08, + 0x8e, 0x81, 0x31, 0x01, 0x86, 0x81, 0x21, 0x00, + 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x8f, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, + 0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x01, 0x00, + 0x2e, 0x08, 0x04, 0x04, 0xb5, 0xf0, 0x04, 0x04, + 0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x17, + 0xf0, 0x20, 0xfb, 0x5e, 0x2d, 0x10, 0xdd, 0x03, + 0x20, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x68, 0x10, 0x40, 0x00, 0x40, 0x04, 0x01, + 0x0c, 0x09, 0x1c, 0x88, 0x00, 0x40, 0x1d, 0x02, + 0x48, 0x1b, 0x6c, 0x03, 0x18, 0x9d, 0x6c, 0x46, + 0x4b, 0x1a, 0x42, 0xb5, 0xdd, 0x08, 0x88, 0x19, + 0x1c, 0x18, 0x23, 0x20, 0x43, 0x19, 0x80, 0x01, + 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x64, 0x05, 0x35, 0x28, 0x42, 0xb5, 0xdd, 0x04, + 0x88, 0x1e, 0x1c, 0x1d, 0x23, 0x10, 0x43, 0x33, + 0x80, 0x2b, 0x6d, 0x03, 0x80, 0x9c, 0x6d, 0x04, + 0x80, 0xe2, 0x23, 0x00, 0x29, 0x00, 0xdd, 0x08, + 0x88, 0x3d, 0x00, 0x5c, 0x6d, 0x06, 0x19, 0xa4, + 0x81, 0x25, 0x33, 0x01, 0x37, 0x02, 0x42, 0x8b, + 0xdb, 0xf6, 0x6d, 0x01, 0x18, 0x8a, 0x6c, 0xc3, + 0x42, 0x9a, 0xd9, 0x00, 0x6c, 0x82, 0x60, 0x0a, + 0x65, 0x02, 0xf0, 0x20, 0xfb, 0x53, 0x20, 0x00, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x03, 0xc4, 0x2c, 0x00, 0x00, 0xf8, + 0xb4, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x08, + 0x0c, 0x00, 0x28, 0x10, 0xdd, 0x02, 0x20, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x30, 0x01, 0x4f, 0x1c, + 0x40, 0x07, 0x1c, 0xb8, 0x00, 0x40, 0x1d, 0x01, + 0x48, 0x1a, 0x6d, 0x83, 0x18, 0x5d, 0x6d, 0xc6, + 0x4b, 0x19, 0x42, 0xb5, 0xdd, 0x07, 0x88, 0x19, + 0x1c, 0x18, 0x23, 0x02, 0x43, 0x19, 0x80, 0x01, + 0x20, 0x01, 0xbc, 0xf0, 0x47, 0x70, 0x65, 0x85, + 0x35, 0x28, 0x42, 0xb5, 0xdd, 0x04, 0x88, 0x1e, + 0x1c, 0x1d, 0x23, 0x01, 0x43, 0x33, 0x80, 0x2b, + 0x6e, 0x83, 0x80, 0x9c, 0x6e, 0x84, 0x80, 0xe1, + 0x23, 0x00, 0x2f, 0x00, 0xdd, 0x08, 0x88, 0x15, + 0x00, 0x5c, 0x6e, 0x86, 0x19, 0xa4, 0x81, 0x25, + 0x32, 0x02, 0x33, 0x01, 0x42, 0xbb, 0xdb, 0xf6, + 0x6e, 0x82, 0x18, 0x51, 0x6e, 0x43, 0x42, 0x99, + 0xd3, 0x00, 0x6e, 0x01, 0x60, 0x11, 0x66, 0x81, + 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xfe, 0x2e, 0x08, 0x03, 0xc4, + 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0xb0, 0x04, 0x04, + 0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x17, + 0xf0, 0x20, 0xfa, 0xc2, 0x1c, 0x20, 0x1c, 0x29, + 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xa9, 0x1c, 0x07, + 0xf0, 0x20, 0xfa, 0xf0, 0x1c, 0x38, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0xb4, 0xf0, 0x04, 0x04, + 0x0c, 0x24, 0x04, 0x09, 0x0c, 0x09, 0x29, 0x08, + 0xdd, 0x02, 0x20, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x00, 0x88, 0x1d, 0xc7, 0x37, 0x01, 0x48, 0x19, + 0x6d, 0x83, 0x19, 0xdd, 0x6d, 0xc6, 0x4b, 0x18, + 0x42, 0xb5, 0xdd, 0x07, 0x88, 0x19, 0x1c, 0x18, + 0x23, 0x02, 0x43, 0x19, 0x80, 0x01, 0x20, 0x01, + 0xbc, 0xf0, 0x47, 0x70, 0x65, 0x85, 0x35, 0x28, + 0x42, 0xb5, 0xdd, 0x04, 0x88, 0x1e, 0x1c, 0x1d, + 0x23, 0x01, 0x43, 0x33, 0x80, 0x2b, 0x6e, 0x83, + 0x80, 0x9c, 0x6e, 0x84, 0x80, 0xe7, 0x23, 0x00, + 0x6e, 0x84, 0x29, 0x00, 0xdd, 0x06, 0xca, 0x40, + 0x00, 0x9d, 0x19, 0x2d, 0x60, 0xae, 0x33, 0x01, + 0x42, 0x8b, 0xdb, 0xf8, 0x6e, 0x81, 0x19, 0xca, + 0x6e, 0x43, 0x42, 0x9a, 0xd3, 0x00, 0x6e, 0x02, + 0x60, 0x0a, 0x66, 0x82, 0x20, 0x00, 0xbc, 0xf0, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc4, + 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x80, 0x48, 0x28, + 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x27, + 0x28, 0x01, 0xd0, 0x13, 0x28, 0x02, 0xd0, 0x1a, + 0x28, 0x03, 0xd1, 0x0c, 0x68, 0x38, 0x88, 0x41, + 0x29, 0x0e, 0xdb, 0x02, 0x88, 0x41, 0x29, 0x0f, + 0xdd, 0x2f, 0x88, 0x01, 0x04, 0x09, 0x88, 0x40, + 0x43, 0x08, 0xf0, 0x10, 0xfd, 0x0f, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x68, 0x38, 0x88, 0x82, + 0x88, 0x41, 0x88, 0x00, 0xf0, 0x13, 0xfb, 0xee, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x38, + 0x88, 0x81, 0x04, 0x09, 0x88, 0xc2, 0x43, 0x11, + 0x88, 0x02, 0x04, 0x12, 0x88, 0x40, 0x43, 0x10, + 0xf0, 0x13, 0xf8, 0x92, 0x68, 0x38, 0x88, 0x41, + 0x29, 0x0e, 0xd1, 0x08, 0x88, 0x81, 0x04, 0x09, + 0x88, 0xc0, 0x43, 0x08, 0xf0, 0x10, 0xfb, 0x8c, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, + 0xf0, 0x10, 0xfb, 0x86, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x88, 0x41, 0x48, 0x08, 0x29, 0x0e, + 0xd1, 0x02, 0x21, 0x00, 0x60, 0x01, 0xe0, 0x01, + 0x21, 0x01, 0x60, 0x01, 0x68, 0x00, 0xf0, 0x00, + 0xfb, 0xb7, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2c, 0x00, 0x00, 0xfc, 0x2e, 0x08, 0x03, 0xc4, + 0x2e, 0x08, 0x04, 0xf8, 0xb5, 0x90, 0x48, 0x31, + 0x88, 0x00, 0x06, 0x04, 0x0e, 0x24, 0x48, 0x30, + 0x22, 0x03, 0x21, 0x02, 0x4f, 0x2f, 0x2c, 0x08, + 0xd2, 0x4f, 0xa3, 0x02, 0x5d, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x4b, 0x10, 0x16, + 0x1c, 0x28, 0x34, 0x3f, 0x68, 0x39, 0x88, 0x49, + 0x06, 0x09, 0x0e, 0x09, 0x88, 0x00, 0x06, 0x00, + 0x0e, 0x00, 0xf0, 0x03, 0xfa, 0x8d, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x03, 0xf7, 0xfe, + 0xf8, 0x9f, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x02, 0xf7, 0xfe, 0xf8, 0x99, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x88, 0x00, 0x4b, 0x1e, + 0x28, 0x00, 0xd0, 0x03, 0x60, 0x1a, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x60, 0x19, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x88, 0x00, 0x4b, 0x19, + 0x28, 0x00, 0xd0, 0x03, 0x60, 0x1a, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x60, 0x19, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x02, 0xfe, 0x4c, + 0x68, 0x39, 0x88, 0x4a, 0x1d, 0x08, 0x88, 0x09, + 0xf7, 0xfe, 0xf9, 0x10, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0x38, 0x88, 0x81, 0x04, 0x09, + 0x88, 0xc2, 0x18, 0x8a, 0x88, 0x01, 0x04, 0x09, + 0x88, 0x40, 0x50, 0x0a, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x1d, 0xf8, 0x30, 0x39, 0x8e, 0x81, + 0x31, 0x01, 0x86, 0x81, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x00, 0xfc, + 0x2c, 0x00, 0x01, 0x00, 0x2e, 0x08, 0x03, 0xc4, + 0x6e, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x12, 0x00, + 0xb5, 0x90, 0xb0, 0x84, 0x48, 0x73, 0x88, 0x00, + 0x06, 0x00, 0x0e, 0x00, 0x4c, 0x72, 0x4f, 0x73, + 0x28, 0x0a, 0xd2, 0x60, 0xa3, 0x01, 0x5c, 0x1b, + 0x00, 0x5b, 0x44, 0x9f, 0x04, 0x0e, 0x16, 0x39, + 0x5d, 0x85, 0x8f, 0xb6, 0xbe, 0xcc, 0xf0, 0x10, + 0xfe, 0xc7, 0x90, 0x03, 0x14, 0x00, 0x68, 0x39, + 0x80, 0x08, 0x98, 0x03, 0x68, 0x39, 0x80, 0x48, + 0xe0, 0xc7, 0x20, 0x1e, 0xa9, 0x03, 0xf0, 0x10, + 0xfd, 0xc9, 0x98, 0x03, 0x68, 0x39, 0x80, 0x08, + 0xe0, 0xbf, 0x1c, 0x20, 0xf0, 0x13, 0xf9, 0xc0, + 0x20, 0x00, 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, + 0x68, 0x3b, 0x52, 0x99, 0x30, 0x01, 0x28, 0x04, + 0xdd, 0xf7, 0x20, 0x07, 0x00, 0x81, 0x58, 0x61, + 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, + 0x87, 0x91, 0x30, 0x01, 0x28, 0x0b, 0xdd, 0xf5, + 0x20, 0x0d, 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, + 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, 0x87, 0x51, + 0x30, 0x01, 0x28, 0x12, 0xdd, 0xf5, 0xe0, 0x9c, + 0x20, 0x13, 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, + 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, 0x83, 0x51, + 0x30, 0x01, 0x28, 0x15, 0xdd, 0xf5, 0x20, 0x00, + 0x00, 0x81, 0x19, 0x09, 0x6d, 0x89, 0x00, 0x42, + 0x68, 0x3b, 0x18, 0xd2, 0x80, 0xd1, 0x30, 0x01, + 0x28, 0x0a, 0xdd, 0xf5, 0x20, 0x00, 0x00, 0x81, + 0x19, 0x09, 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, + 0x68, 0x3b, 0x18, 0xd2, 0x83, 0x91, 0x30, 0x01, + 0x28, 0x01, 0xdd, 0xf4, 0xe0, 0x79, 0xe0, 0x73, + 0x20, 0x02, 0x00, 0x81, 0x19, 0x09, 0x31, 0x80, + 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, + 0x3a, 0x40, 0x87, 0x91, 0x30, 0x01, 0x28, 0x05, + 0xdd, 0xf3, 0x20, 0x09, 0x00, 0x81, 0x19, 0x09, + 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, + 0x18, 0xd2, 0x3a, 0x40, 0x86, 0xd1, 0x30, 0x01, + 0x28, 0x0f, 0xdd, 0xf3, 0x20, 0x11, 0x00, 0x81, + 0x19, 0x09, 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, + 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, 0x86, 0x91, + 0x30, 0x01, 0x28, 0x13, 0xdd, 0xf3, 0xe0, 0x50, + 0x22, 0x00, 0x21, 0x00, 0x20, 0x01, 0x02, 0xc0, + 0xf7, 0xff, 0xfe, 0x48, 0x6f, 0xb8, 0x49, 0x2a, + 0x80, 0x08, 0xe0, 0x46, 0x46, 0x68, 0xf0, 0x15, + 0xff, 0xa7, 0x98, 0x00, 0x0c, 0x00, 0x68, 0x39, + 0x80, 0x08, 0x98, 0x00, 0x68, 0x39, 0x80, 0x48, + 0x98, 0x01, 0x0c, 0x00, 0x68, 0x39, 0x80, 0x88, + 0x98, 0x01, 0x68, 0x39, 0x80, 0xc8, 0x98, 0x02, + 0x0c, 0x00, 0x68, 0x39, 0x81, 0x08, 0x98, 0x02, + 0x68, 0x39, 0x81, 0x48, 0x20, 0x01, 0x68, 0x39, + 0x81, 0x88, 0x48, 0x1c, 0x68, 0x39, 0x81, 0xc8, + 0x48, 0x1b, 0x68, 0x01, 0x14, 0x09, 0x68, 0x3a, + 0x82, 0x11, 0x68, 0x00, 0x68, 0x39, 0x82, 0x48, + 0xe0, 0x1f, 0x20, 0x19, 0x06, 0x80, 0x6b, 0x80, + 0x06, 0x00, 0x0e, 0x00, 0x68, 0x39, 0x80, 0x08, + 0xe0, 0x17, 0x68, 0x38, 0x88, 0x01, 0x04, 0x09, + 0x88, 0x40, 0x18, 0x08, 0x68, 0x00, 0x90, 0x03, + 0x14, 0x00, 0x68, 0x39, 0x80, 0x08, 0x98, 0x03, + 0x68, 0x39, 0x80, 0x48, 0xe0, 0x09, 0x48, 0x0d, + 0x68, 0x00, 0x68, 0x39, 0x80, 0x08, 0xe0, 0x04, + 0x1d, 0xf8, 0x30, 0x39, 0x8e, 0x81, 0x31, 0x01, + 0x86, 0x81, 0xb0, 0x04, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x00, 0xfc, + 0x2e, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x03, 0xc4, + 0x2c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x25, 0x02, + 0x2e, 0x08, 0x05, 0x74, 0x2e, 0x08, 0x00, 0x58, + 0xb5, 0x80, 0x4f, 0x53, 0x6d, 0x78, 0x6d, 0x39, + 0x42, 0x81, 0xd0, 0x59, 0x88, 0x81, 0x06, 0x09, + 0x0e, 0x09, 0x29, 0x12, 0xd2, 0x55, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x09, 0x10, 0x1a, 0x14, 0x20, 0x52, 0x24, 0x2f, + 0x3a, 0x45, 0x56, 0x60, 0x67, 0x6c, 0x70, 0x74, + 0x7a, 0x81, 0x89, 0xc3, 0x89, 0x82, 0x89, 0x41, + 0x89, 0x00, 0xf0, 0x0b, 0xfe, 0x91, 0xe0, 0x72, + 0x89, 0x00, 0xf0, 0x0b, 0xfe, 0x75, 0xe0, 0x6e, + 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x0b, + 0xff, 0x4f, 0xe0, 0x68, 0x89, 0x82, 0x89, 0x41, + 0x89, 0x00, 0xf0, 0x0b, 0xfe, 0xf7, 0xe0, 0x62, + 0x89, 0x00, 0xf0, 0x0b, 0xff, 0x8d, 0xe0, 0x5e, + 0x8a, 0x42, 0x8a, 0x01, 0xb4, 0x06, 0x89, 0xc3, + 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x0c, + 0xf8, 0x11, 0xb0, 0x02, 0xe0, 0x53, 0x8a, 0x42, + 0x8a, 0x01, 0xb4, 0x06, 0x89, 0xc3, 0x89, 0x82, + 0x89, 0x41, 0x89, 0x00, 0xf0, 0x0c, 0xf8, 0x58, + 0xb0, 0x02, 0xe0, 0x48, 0x89, 0x83, 0x89, 0x42, + 0x89, 0x00, 0x49, 0x2e, 0xf0, 0x0c, 0xf9, 0x99, + 0x21, 0x00, 0x48, 0x2c, 0xf7, 0xff, 0xfc, 0x7e, + 0xe0, 0x3d, 0x89, 0xc1, 0x04, 0x0b, 0x14, 0x1b, + 0x89, 0x81, 0x04, 0x0a, 0x14, 0x12, 0x89, 0x41, + 0x89, 0x00, 0xf0, 0x0c, 0xf9, 0xb9, 0xe0, 0x32, + 0xe0, 0x43, 0xe0, 0x30, 0x89, 0x00, 0xf0, 0x0b, + 0xff, 0x6b, 0xe0, 0x2c, 0x89, 0xc1, 0x04, 0x09, + 0x8a, 0x02, 0x18, 0x8b, 0x89, 0x82, 0x89, 0x41, + 0x89, 0x00, 0xf0, 0x0c, 0xf9, 0xf1, 0xe0, 0x22, + 0x89, 0xc3, 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, + 0xf0, 0x0c, 0xfa, 0x1c, 0xe0, 0x1b, 0x89, 0x41, + 0x89, 0x00, 0xf0, 0x0b, 0xff, 0x8d, 0xe0, 0x16, + 0x89, 0x00, 0xf0, 0x0b, 0xff, 0xa7, 0xe0, 0x12, + 0x89, 0x00, 0xf0, 0x0b, 0xff, 0xb7, 0xe0, 0x0e, + 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x0c, + 0xfa, 0x9b, 0xe0, 0x08, 0x89, 0xc3, 0x89, 0x82, + 0x89, 0x41, 0x89, 0x00, 0xf0, 0x0c, 0xfb, 0x34, + 0xe0, 0x01, 0xf0, 0x0c, 0xfb, 0xcb, 0x6d, 0x78, + 0x88, 0xc0, 0x6c, 0x39, 0x1a, 0x08, 0x64, 0x38, + 0x6c, 0x79, 0x1a, 0x08, 0x28, 0x28, 0xdb, 0x05, + 0x48, 0x07, 0x88, 0x01, 0x23, 0x10, 0x43, 0xdb, + 0x40, 0x19, 0x80, 0x01, 0x6d, 0x78, 0x68, 0x00, + 0x65, 0x78, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x03, 0xc4, 0x2c, 0x00, 0x01, 0x20, + 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x80, 0x06, 0x00, + 0x0e, 0x00, 0x06, 0x09, 0x0e, 0x09, 0x89, 0xd7, + 0x23, 0xc7, 0x40, 0x7b, 0x81, 0xd3, 0x4b, 0x06, + 0x6f, 0xdf, 0x37, 0x01, 0x67, 0xdf, 0x2f, 0x28, + 0xda, 0x03, 0x4b, 0x04, 0x68, 0x1b, 0xf0, 0x1a, + 0xfb, 0xf5, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x03, 0xc4, 0x2e, 0x08, 0x01, 0x94, + 0xb5, 0x90, 0x4f, 0x5d, 0x6e, 0xf8, 0x6e, 0xb9, + 0x42, 0x81, 0xd0, 0x5c, 0x88, 0x81, 0x0a, 0x0a, + 0x2a, 0x0a, 0xd2, 0x59, 0xa3, 0x01, 0x5c, 0x9b, + 0x00, 0x5b, 0x44, 0x9f, 0x99, 0x04, 0x3e, 0x99, + 0x99, 0x44, 0x99, 0x99, 0x6c, 0x72, 0x06, 0x09, + 0x0e, 0x09, 0x24, 0x00, 0x29, 0x0c, 0xd2, 0x4b, + 0xa3, 0x01, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, + 0x1e, 0x0a, 0x14, 0x2b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x28, 0x8b, 0x05, 0x68, 0x38, 0x88, 0x00, + 0xf0, 0x03, 0xf8, 0xde, 0xe0, 0x80, 0x22, 0x00, + 0xb4, 0x04, 0x89, 0x01, 0x1c, 0x23, 0x4a, 0x49, + 0x1e, 0x50, 0xf7, 0xfc, 0xfd, 0xe9, 0xb0, 0x01, + 0xe0, 0x76, 0x22, 0x00, 0xb4, 0x04, 0x89, 0x02, + 0x1c, 0x23, 0x49, 0x44, 0x1e, 0x48, 0xf7, 0xfc, + 0xfd, 0xdf, 0xb0, 0x01, 0xe0, 0x6c, 0x8a, 0x02, + 0xb4, 0x04, 0x89, 0xc3, 0x89, 0x82, 0x89, 0x41, + 0x89, 0x00, 0xf7, 0xfc, 0xfd, 0xd5, 0xb0, 0x01, + 0xe0, 0x62, 0xf7, 0xfc, 0xfd, 0x9d, 0xe0, 0x5f, + 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0xea, + 0xe0, 0x5a, 0x06, 0x09, 0xd1, 0x58, 0x89, 0x00, + 0xf7, 0xfc, 0xff, 0x76, 0xe0, 0x54, 0x06, 0x09, + 0x0e, 0x09, 0x29, 0x06, 0xd2, 0x0c, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x03, 0x09, 0x0d, 0x11, 0x15, 0x19, 0x89, 0x00, + 0xf7, 0xfe, 0xf8, 0xaa, 0xe0, 0x44, 0xe0, 0x54, + 0xe0, 0x42, 0x89, 0x00, 0xf7, 0xfe, 0xf8, 0xca, + 0xe0, 0x3e, 0x89, 0x00, 0xf7, 0xfe, 0xf9, 0x58, + 0xe0, 0x3a, 0x89, 0x00, 0xf7, 0xfe, 0xfa, 0x3c, + 0xe0, 0x36, 0x89, 0x00, 0xf7, 0xfe, 0xfa, 0x6e, + 0xe0, 0x32, 0x89, 0x00, 0x06, 0x00, 0x0e, 0x00, + 0xf7, 0xfe, 0xfa, 0x4a, 0xe0, 0x2c, 0x06, 0x08, + 0xd1, 0x2a, 0x6f, 0xb8, 0x30, 0x01, 0x67, 0xb8, + 0xe0, 0x26, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x08, + 0xd2, 0x22, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x0c, 0x08, 0x0f, + 0x12, 0x16, 0x19, 0x1c, 0x89, 0x00, 0xf0, 0x01, + 0xf9, 0x93, 0xe0, 0x15, 0x89, 0x00, 0xf0, 0x01, + 0xf9, 0xbb, 0xe0, 0x11, 0xf0, 0x01, 0xfa, 0x06, + 0xe0, 0x0e, 0xf0, 0x01, 0xfa, 0x5d, 0xe0, 0x0b, + 0x89, 0x00, 0xf0, 0x01, 0xfa, 0xe1, 0xe0, 0x07, + 0xf0, 0x01, 0xfb, 0x1a, 0xe0, 0x04, 0xf0, 0x01, + 0xfb, 0x33, 0xe0, 0x01, 0xf0, 0x01, 0xfa, 0x90, + 0x6e, 0xf8, 0x88, 0xc0, 0x6d, 0xb9, 0x1a, 0x08, + 0x65, 0xb8, 0x6d, 0xf9, 0x1a, 0x08, 0x28, 0x28, + 0xdb, 0x04, 0x48, 0x07, 0x88, 0x01, 0x08, 0x49, + 0x00, 0x49, 0x80, 0x01, 0x6e, 0xf8, 0x68, 0x00, + 0x66, 0xf8, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x03, 0xc4, 0x00, 0x00, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x80, 0x06, 0x00, + 0x0e, 0x00, 0x1c, 0x17, 0x28, 0x03, 0xd0, 0x0b, + 0x28, 0x07, 0xd0, 0x0e, 0x28, 0x08, 0xd1, 0x03, + 0x88, 0x38, 0xf0, 0x02, 0xfa, 0x5d, 0x80, 0x78, + 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0x5e, + 0xe7, 0xf6, 0x88, 0x79, 0x88, 0x38, 0x1d, 0x3a, + 0xf0, 0x02, 0xf8, 0xce, 0x49, 0x01, 0x68, 0x09, + 0x80, 0x08, 0xe7, 0xed, 0x2e, 0x08, 0x03, 0xc4, + 0x48, 0x0d, 0x6f, 0xc0, 0x28, 0x00, 0xd1, 0x0c, + 0x49, 0x0c, 0x60, 0x08, 0x48, 0x0c, 0x8e, 0x83, + 0x49, 0x0c, 0x22, 0x01, 0x2b, 0x00, 0xd0, 0x05, + 0x8d, 0x03, 0x86, 0x8b, 0x8d, 0x43, 0x86, 0xcb, + 0x87, 0x82, 0x47, 0x70, 0x8e, 0xc3, 0x2b, 0x00, + 0xd0, 0xfb, 0x8d, 0x83, 0x86, 0x8b, 0x8d, 0xc3, + 0x86, 0xcb, 0x87, 0x82, 0x47, 0x70, 0x00, 0x00, + 0x2c, 0x00, 0x1f, 0x80, 0x2e, 0x08, 0x04, 0x44, + 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xc0, + 0xb5, 0x00, 0xf0, 0x00, 0xfa, 0x91, 0xf7, 0xfd, + 0xf9, 0x53, 0xf7, 0xfc, 0xff, 0xd7, 0xf7, 0xfd, + 0xfa, 0x53, 0xf0, 0x03, 0xf8, 0xb1, 0xf7, 0xff, + 0xff, 0xcf, 0x48, 0x16, 0x8e, 0x80, 0x28, 0x00, + 0xd1, 0x21, 0x48, 0x15, 0x6f, 0xc0, 0x28, 0x00, + 0xd1, 0x13, 0x48, 0x14, 0x78, 0x00, 0x28, 0x00, + 0xd0, 0x0f, 0xb0, 0x82, 0x46, 0x69, 0xa8, 0x01, + 0xf0, 0x01, 0xfa, 0xd8, 0xa8, 0x01, 0x78, 0x00, + 0x28, 0x32, 0xda, 0x05, 0xa8, 0x00, 0x78, 0x00, + 0x28, 0x32, 0xda, 0x01, 0xf0, 0x07, 0xf9, 0xb0, + 0xb0, 0x02, 0x48, 0x0b, 0x69, 0xc0, 0x08, 0xc0, + 0xd3, 0x07, 0x48, 0x0a, 0x6c, 0x00, 0x28, 0x00, + 0xd0, 0x03, 0xf7, 0xff, 0xfd, 0xfd, 0xbc, 0x08, + 0x47, 0x18, 0xf7, 0xff, 0xfe, 0xc1, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, + 0x2c, 0x00, 0x1f, 0x80, 0x2e, 0x08, 0x1a, 0x94, + 0x72, 0x00, 0x01, 0x00, 0x2e, 0x08, 0x03, 0xc4, + 0xb4, 0x80, 0x02, 0x4f, 0x4b, 0x07, 0x40, 0x3b, + 0x43, 0x1a, 0x23, 0x19, 0x06, 0x9b, 0x62, 0x9a, + 0x0a, 0x49, 0x02, 0x49, 0x08, 0x49, 0x07, 0xc0, + 0x43, 0x08, 0x49, 0x03, 0x68, 0x09, 0x60, 0x08, + 0xbc, 0x80, 0x47, 0x70, 0x00, 0x03, 0xfe, 0x00, + 0x2e, 0x08, 0x9b, 0xa4, 0xb4, 0x90, 0x4b, 0x0c, + 0x68, 0x1f, 0x68, 0x3f, 0x0f, 0xff, 0x60, 0x07, + 0x68, 0x18, 0x68, 0x00, 0x00, 0x40, 0x0a, 0x47, + 0x02, 0x7f, 0x20, 0x19, 0x06, 0x80, 0x6a, 0x84, + 0x4b, 0x06, 0x40, 0x23, 0x0a, 0x5b, 0x43, 0x3b, + 0x60, 0x0b, 0x6a, 0x80, 0x05, 0xc0, 0x0d, 0xc0, + 0x60, 0x10, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xa4, 0x00, 0x03, 0xfe, 0x00, + 0xb5, 0x00, 0x49, 0x1d, 0x62, 0xc8, 0x28, 0x00, + 0xd0, 0x11, 0x28, 0x01, 0xd0, 0x1b, 0x28, 0x02, + 0xd0, 0x25, 0x28, 0x03, 0xd1, 0x09, 0x48, 0x19, + 0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, + 0x22, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0x10, + 0xfd, 0x47, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x13, + 0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, + 0x48, 0x11, 0x68, 0x01, 0x04, 0x03, 0x43, 0x19, + 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x0d, + 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, + 0x48, 0x0b, 0x68, 0x01, 0x4b, 0x0b, 0x40, 0x19, + 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x07, + 0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, + 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x10, + 0xfd, 0x23, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0xc8, 0x6a, 0x00, 0x00, 0x18, + 0x6c, 0x00, 0x00, 0x20, 0xff, 0xdf, 0xff, 0xff, + 0xb5, 0x90, 0x48, 0x11, 0x6c, 0xc1, 0x6c, 0x80, + 0x1a, 0x0f, 0x48, 0x10, 0xd5, 0x01, 0x69, 0x01, + 0x18, 0x7f, 0x69, 0x00, 0x10, 0x80, 0x4c, 0x0e, + 0x42, 0xb8, 0xda, 0x0b, 0x68, 0xe0, 0x28, 0x00, + 0xd1, 0x08, 0x48, 0x0c, 0x68, 0x01, 0x23, 0x02, + 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x20, 0x02, + 0xf0, 0x10, 0xf8, 0xc4, 0x2f, 0x00, 0xd1, 0x04, + 0x20, 0x01, 0x61, 0xe0, 0x6b, 0xa0, 0x30, 0x01, + 0x63, 0xa0, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x48, + 0x2e, 0x08, 0x04, 0xc8, 0x6c, 0x00, 0x00, 0x20, + 0xb5, 0x00, 0x20, 0x03, 0xf0, 0x10, 0xf8, 0xae, + 0x20, 0x1e, 0xf0, 0x0d, 0xf8, 0xab, 0x23, 0x03, + 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, + 0x20, 0x1e, 0xf0, 0x0c, 0xfe, 0x59, 0x22, 0x00, + 0xb4, 0x04, 0x23, 0x02, 0x22, 0x02, 0x49, 0x07, + 0x20, 0x1e, 0xf0, 0x0c, 0xfc, 0x8d, 0x23, 0x01, + 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, + 0xb0, 0x01, 0xf0, 0x0c, 0xfe, 0x49, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, + 0xb5, 0x00, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x12, + 0xfc, 0x23, 0x20, 0x1f, 0xf0, 0x0c, 0xff, 0xbc, + 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, + 0x21, 0x02, 0x20, 0x1f, 0xf0, 0x0c, 0xfe, 0x34, + 0x20, 0x00, 0xf0, 0x0f, 0xff, 0x19, 0x22, 0x00, + 0xb4, 0x04, 0x23, 0x01, 0x22, 0x02, 0x49, 0x07, + 0x20, 0x1f, 0xf0, 0x0c, 0xfc, 0x65, 0x23, 0x01, + 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, + 0xb0, 0x01, 0xf0, 0x0c, 0xfe, 0x21, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, + 0xb5, 0x80, 0x20, 0x0f, 0x02, 0x40, 0x4f, 0x0a, + 0x61, 0x38, 0x49, 0x0a, 0x6c, 0x89, 0x61, 0x79, + 0xf0, 0x01, 0xfe, 0x42, 0x1d, 0xf9, 0x31, 0x79, + 0x61, 0x08, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, + 0x61, 0xf8, 0x62, 0x38, 0x64, 0xf8, 0x20, 0xff, + 0x72, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x48, 0x66, 0x00, 0x00, 0x80, + 0xb5, 0x80, 0x4f, 0x05, 0x69, 0x38, 0x28, 0x00, + 0xd0, 0x03, 0xf0, 0x01, 0xfe, 0x4b, 0x20, 0x00, + 0x61, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0xc8, 0xb5, 0x00, 0x4a, 0x0d, + 0xb4, 0x04, 0x1f, 0x10, 0x1e, 0x51, 0x1c, 0x13, + 0xf7, 0xfc, 0xfb, 0xaa, 0x21, 0x33, 0x06, 0x49, + 0x6d, 0x88, 0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01, + 0x48, 0x07, 0x62, 0x42, 0x6d, 0x49, 0x62, 0xc1, + 0x21, 0x00, 0x65, 0x81, 0x21, 0x01, 0x02, 0xc9, + 0x64, 0x41, 0x21, 0x01, 0x30, 0x60, 0x76, 0x01, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x04, 0x48, 0xb5, 0x00, 0x4a, 0x10, + 0xb4, 0x04, 0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0f, + 0x1e, 0xc8, 0xf7, 0xfc, 0xfb, 0x89, 0x21, 0x33, + 0x06, 0x49, 0x6d, 0x88, 0x6d, 0x4a, 0x1a, 0x82, + 0xb0, 0x01, 0x48, 0x0b, 0x62, 0x42, 0x6d, 0x49, + 0x62, 0xc1, 0x21, 0x00, 0x65, 0x81, 0x21, 0x01, + 0x02, 0xc9, 0x64, 0x41, 0x21, 0x01, 0x30, 0x60, + 0x76, 0x01, 0x48, 0x06, 0x23, 0x02, 0x68, 0x01, + 0x43, 0x19, 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, + 0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x00, 0x04, + 0x48, 0x03, 0x23, 0x02, 0x43, 0xdb, 0x68, 0x01, + 0x40, 0x19, 0x60, 0x01, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x00, 0x04, 0xb5, 0xf0, 0x20, 0x0f, + 0x02, 0x40, 0x4c, 0x11, 0x61, 0x20, 0x20, 0x00, + 0xf7, 0xfc, 0xfc, 0xf6, 0x48, 0x0f, 0xf7, 0xfc, + 0xfc, 0xf3, 0x26, 0x00, 0x1d, 0xe0, 0x30, 0x59, + 0x77, 0x06, 0x25, 0xff, 0x1d, 0xe7, 0x37, 0x79, + 0x70, 0x3d, 0x20, 0x01, 0x63, 0x78, 0x60, 0xe6, + 0x69, 0x78, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x41, + 0x01, 0x40, 0xf0, 0x01, 0xfd, 0xb1, 0x61, 0x78, + 0x69, 0x78, 0x28, 0x00, 0xd0, 0x01, 0x76, 0x3e, + 0x70, 0x3d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x48, 0x00, 0x00, 0x1f, 0xff, + 0xb5, 0x00, 0x20, 0x00, 0xf7, 0xfd, 0xff, 0xdc, + 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x06, + 0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfb, 0x28, + 0x21, 0x00, 0x20, 0x0d, 0xb0, 0x01, 0xf0, 0x12, + 0xfb, 0x47, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x22, 0x00, + 0xb4, 0x04, 0x27, 0x00, 0x1c, 0x3b, 0x4a, 0x17, + 0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfb, 0x14, + 0x22, 0x00, 0xb0, 0x01, 0xb4, 0x04, 0x1c, 0x3b, + 0x4a, 0x12, 0x49, 0x13, 0x20, 0x00, 0xf7, 0xfc, + 0xfb, 0x0b, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x88, + 0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01, 0x48, 0x0f, + 0x62, 0x42, 0x6d, 0x49, 0x63, 0x01, 0x21, 0x01, + 0x02, 0xc9, 0x64, 0x81, 0x21, 0x01, 0x65, 0x87, + 0x30, 0x60, 0x76, 0x01, 0x77, 0x07, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x00, 0xf7, 0xff, 0xfe, 0x28, + 0x20, 0x00, 0xf7, 0xff, 0xfe, 0x59, 0x21, 0x00, + 0x20, 0x0d, 0xf0, 0x12, 0xfb, 0x11, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x1f, 0xfe, 0x2e, 0x08, 0x04, 0x48, + 0xb5, 0xf0, 0x06, 0x05, 0x0e, 0x2d, 0x20, 0x0f, + 0x02, 0x40, 0x4f, 0x2f, 0x26, 0x33, 0x06, 0x76, + 0x61, 0x38, 0x6d, 0xb0, 0x6d, 0x71, 0x1a, 0x40, + 0x62, 0x78, 0x62, 0xb8, 0x20, 0x00, 0x1d, 0xfc, + 0x34, 0x79, 0x60, 0xe0, 0x2d, 0x00, 0xd0, 0x02, + 0x20, 0xff, 0xf7, 0xfd, 0xff, 0x79, 0x22, 0x00, + 0xb4, 0x04, 0x23, 0x00, 0x21, 0x00, 0x20, 0x00, + 0xf7, 0xfc, 0xfa, 0xc6, 0x22, 0x01, 0x21, 0x01, + 0x20, 0x00, 0xb0, 0x01, 0xf0, 0x10, 0xfb, 0x84, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x10, 0xfc, 0x44, + 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x1d, + 0x20, 0x00, 0x1e, 0x51, 0xf7, 0xfc, 0xfa, 0xb4, + 0x20, 0x01, 0x63, 0x60, 0x69, 0x60, 0xb0, 0x01, + 0x28, 0x00, 0xd1, 0x04, 0x20, 0x41, 0x01, 0x40, + 0xf0, 0x01, 0xfd, 0x1a, 0x61, 0x60, 0x69, 0x60, + 0x28, 0x00, 0xd0, 0x03, 0x20, 0x00, 0x76, 0x20, + 0x20, 0xff, 0x70, 0x20, 0x6d, 0x70, 0x63, 0x38, + 0x20, 0x01, 0x02, 0xc0, 0x64, 0xb8, 0x20, 0x00, + 0x26, 0x01, 0x65, 0xb8, 0x1d, 0xf9, 0x31, 0x59, + 0x76, 0x0e, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, + 0xf7, 0xff, 0xfd, 0xc6, 0x21, 0x00, 0x20, 0x0d, + 0xf0, 0x12, 0xfa, 0xb2, 0x20, 0x00, 0x60, 0xf8, + 0x2d, 0x00, 0xd1, 0x02, 0xf7, 0xff, 0xfd, 0xf0, + 0x61, 0xe6, 0x20, 0x00, 0x60, 0xb8, 0x66, 0x38, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0x48, 0x00, 0x00, 0x1f, 0xff, + 0xb5, 0xb0, 0x4f, 0x44, 0x25, 0x00, 0x6d, 0x38, + 0x4c, 0x43, 0x28, 0x05, 0xd2, 0x14, 0xa3, 0x02, + 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x10, 0x03, 0x2e, 0x62, 0x70, 0x00, 0x4d, 0x3f, + 0x68, 0x28, 0x08, 0x41, 0xd2, 0x08, 0x08, 0xc0, + 0xd3, 0x09, 0xf7, 0xff, 0xfe, 0xb3, 0x23, 0x04, + 0x43, 0xdb, 0x68, 0x28, 0x40, 0x18, 0x60, 0x28, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x78, + 0x28, 0x00, 0xd0, 0xf9, 0x28, 0x01, 0xd0, 0x01, + 0x28, 0x05, 0xd1, 0x06, 0xf0, 0x00, 0xf8, 0x6a, + 0x8e, 0xa0, 0x28, 0x00, 0xd1, 0xf0, 0xf0, 0x00, + 0xf9, 0x27, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01, + 0x28, 0x05, 0xd1, 0xe9, 0x8e, 0xa0, 0x28, 0x00, + 0xd1, 0xe6, 0xf0, 0x00, 0xfa, 0x49, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, + 0xd1, 0xde, 0x8d, 0xa0, 0x06, 0x00, 0x0e, 0x00, + 0x28, 0x06, 0xd1, 0x12, 0x48, 0x26, 0x78, 0x00, + 0x28, 0x00, 0xd0, 0x06, 0x6d, 0x78, 0x28, 0x01, + 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00, + 0xfc, 0xc3, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01, + 0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0x2c, + 0x85, 0xa5, 0x8d, 0xa0, 0x28, 0x00, 0xd1, 0xc3, + 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x08, 0x28, 0x04, + 0xd0, 0x0b, 0x28, 0x05, 0xd1, 0xbc, 0xf0, 0x00, + 0xfd, 0xdd, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0xf0, 0x00, 0xfd, 0xb2, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0xf0, 0x00, 0xfd, 0x81, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, + 0xd1, 0xaa, 0x20, 0x06, 0x85, 0xa0, 0x85, 0xe5, + 0x20, 0x09, 0x02, 0x40, 0x86, 0xe0, 0x20, 0x04, + 0x65, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x8e, 0xe0, 0x28, 0x00, 0xd1, 0x9c, 0x8d, 0xa0, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x06, 0xd1, 0x97, + 0x85, 0xa5, 0x65, 0x3d, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x48, + 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x00, 0x04, + 0x2e, 0x08, 0x04, 0xc8, 0xb5, 0xb0, 0x48, 0x46, + 0x6c, 0xc1, 0x4c, 0x46, 0x64, 0x21, 0x69, 0x60, + 0x1a, 0x09, 0x1d, 0xe7, 0x37, 0x79, 0x63, 0xf9, + 0x29, 0x00, 0xda, 0x02, 0x69, 0x22, 0x18, 0x89, + 0x63, 0xf9, 0x23, 0xff, 0x6b, 0xf9, 0x33, 0x01, + 0x42, 0x99, 0xdb, 0x73, 0x22, 0x01, 0x03, 0x12, + 0x42, 0x91, 0xdd, 0x00, 0x63, 0xfa, 0x6b, 0xf9, + 0x08, 0x89, 0x00, 0x89, 0x63, 0xf9, 0x7a, 0x3a, + 0x2a, 0x00, 0xd0, 0x05, 0x23, 0xff, 0x03, 0x5b, + 0x1a, 0xc2, 0x61, 0xe2, 0x22, 0x00, 0x72, 0x3a, + 0x18, 0x42, 0x49, 0x35, 0x25, 0x12, 0x42, 0x8a, + 0xdd, 0x2c, 0x1a, 0x08, 0x64, 0x38, 0xf0, 0x1f, + 0xfb, 0x53, 0x4b, 0x32, 0x40, 0x18, 0xf0, 0x1f, + 0xfb, 0x53, 0x22, 0x00, 0x49, 0x30, 0xb4, 0x06, + 0x69, 0x60, 0x69, 0x39, 0x18, 0x41, 0x23, 0xff, + 0x03, 0x5b, 0x1a, 0xc9, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc0, 0x6c, 0x3a, 0x1c, 0x2b, 0xf0, 0x14, + 0xfc, 0x21, 0x22, 0x00, 0xb0, 0x02, 0x49, 0x28, + 0xb4, 0x06, 0x6b, 0xf8, 0x6c, 0x39, 0x1a, 0x42, + 0x69, 0x39, 0x1c, 0x2b, 0x48, 0x25, 0xf0, 0x14, + 0xfc, 0x15, 0xb0, 0x02, 0xf0, 0x1f, 0xfb, 0x30, + 0x23, 0x01, 0x04, 0x9b, 0x43, 0x18, 0xf0, 0x1f, + 0xfb, 0x2f, 0xe0, 0x1d, 0xf0, 0x1f, 0xfb, 0x28, + 0x4b, 0x1c, 0x40, 0x18, 0xf0, 0x1f, 0xfb, 0x28, + 0x22, 0x00, 0x49, 0x1b, 0xb4, 0x06, 0x69, 0x60, + 0x69, 0x39, 0x18, 0x41, 0x23, 0xff, 0x03, 0x5b, + 0x1a, 0xc9, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, + 0x6b, 0xfa, 0x1c, 0x2b, 0xf0, 0x14, 0xfb, 0xf6, + 0xb0, 0x02, 0xf0, 0x1f, 0xfb, 0x11, 0x23, 0x01, + 0x04, 0x9b, 0x43, 0x18, 0xf0, 0x1f, 0xfb, 0x10, + 0x69, 0x60, 0x6b, 0xf9, 0x18, 0x40, 0x23, 0x0d, + 0x06, 0x9b, 0x1a, 0xc1, 0x61, 0x60, 0x4b, 0x0e, + 0x42, 0x99, 0xd3, 0x02, 0x69, 0x21, 0x1a, 0x40, + 0x61, 0x60, 0x23, 0xff, 0x03, 0x5b, 0x69, 0x60, + 0x1a, 0xc0, 0xe0, 0x00, 0xe0, 0x00, 0x62, 0x20, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x48, + 0x00, 0x1f, 0xfe, 0x00, 0xff, 0xfb, 0xff, 0xff, + 0x9e, 0x00, 0x08, 0x00, 0xcc, 0x1f, 0xe0, 0x00, + 0xcc, 0x1f, 0xfe, 0x00, 0x21, 0x00, 0x23, 0xff, + 0x68, 0x02, 0x33, 0xc1, 0x42, 0x9a, 0xd0, 0x01, + 0x1c, 0x08, 0x47, 0x70, 0x79, 0xc2, 0x0a, 0x12, + 0xd2, 0x01, 0x1c, 0x08, 0x47, 0x70, 0x7a, 0x41, + 0x23, 0x0e, 0x40, 0x19, 0x07, 0x49, 0x7a, 0x82, + 0x05, 0x92, 0x43, 0x11, 0x7a, 0xc2, 0x23, 0xfe, + 0x40, 0x1a, 0x03, 0x92, 0x43, 0x11, 0x7b, 0x02, + 0x01, 0xd2, 0x43, 0x11, 0x7b, 0x40, 0x40, 0x18, + 0x08, 0x40, 0x43, 0x08, 0x49, 0x01, 0x67, 0x08, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x48, + 0xb5, 0xf0, 0xb0, 0x86, 0x4c, 0x8c, 0x6c, 0xe0, + 0x1d, 0xe7, 0x37, 0x79, 0x1d, 0xfd, 0x35, 0x39, + 0x28, 0x00, 0xd0, 0x04, 0x28, 0x01, 0xd0, 0x3a, + 0x28, 0x02, 0xd1, 0x73, 0xe0, 0x74, 0x69, 0xe0, + 0x6a, 0x21, 0x1a, 0x09, 0x63, 0xf9, 0x1c, 0x0a, + 0xd5, 0x02, 0x69, 0x21, 0x18, 0x51, 0x63, 0xf9, + 0x6b, 0xf9, 0x29, 0x04, 0xdb, 0x67, 0x69, 0x3e, + 0x5c, 0x31, 0x06, 0x0a, 0x65, 0x7a, 0x92, 0x05, + 0x1c, 0x41, 0x69, 0x20, 0x90, 0x04, 0xf0, 0x19, + 0xfe, 0xe3, 0x61, 0xe1, 0x5c, 0x70, 0x04, 0x00, + 0x9a, 0x05, 0x18, 0x82, 0x65, 0x7a, 0x92, 0x03, + 0x98, 0x04, 0x31, 0x01, 0xf0, 0x19, 0xfe, 0xd8, + 0x61, 0xe1, 0x5c, 0x70, 0x02, 0x00, 0x9a, 0x03, + 0x18, 0x80, 0x65, 0x78, 0x90, 0x02, 0x98, 0x04, + 0x31, 0x01, 0xf0, 0x19, 0xfe, 0xcd, 0x61, 0xe1, + 0x5c, 0x70, 0x9a, 0x02, 0x18, 0x80, 0x65, 0x78, + 0x98, 0x04, 0x31, 0x01, 0xf0, 0x19, 0xfe, 0xc4, + 0x20, 0x01, 0x64, 0xe0, 0x61, 0xe1, 0x6a, 0x20, + 0x69, 0xe1, 0x1a, 0x40, 0x63, 0xf8, 0x1c, 0x01, + 0xd4, 0x05, 0x48, 0x67, 0x69, 0x06, 0x30, 0x80, + 0x69, 0x02, 0x92, 0x01, 0xe0, 0x03, 0x69, 0x20, + 0x18, 0x08, 0x63, 0xf8, 0xe7, 0xf5, 0x6b, 0xf8, + 0x90, 0x00, 0x28, 0x02, 0xdb, 0x22, 0x6d, 0x78, + 0x09, 0x01, 0x01, 0x09, 0x23, 0xff, 0x33, 0xc1, + 0x42, 0x99, 0xd1, 0x31, 0x9a, 0x01, 0x69, 0xe0, + 0x5c, 0x11, 0x02, 0x09, 0x83, 0x29, 0x1c, 0x41, + 0x1c, 0x30, 0xf0, 0x19, 0xfe, 0x9d, 0x61, 0xe1, + 0x69, 0x38, 0x5c, 0x40, 0x8b, 0x2a, 0x18, 0x80, + 0x83, 0x28, 0x8b, 0x28, 0x30, 0x06, 0x83, 0x28, + 0x19, 0x88, 0x1f, 0x41, 0x1c, 0x30, 0xf0, 0x19, + 0xfe, 0x8f, 0x61, 0xe1, 0x21, 0xff, 0x71, 0x39, + 0x20, 0x02, 0x64, 0xe0, 0x6c, 0xe0, 0x28, 0x02, + 0xd1, 0x00, 0xe0, 0x01, 0xe0, 0x94, 0xe0, 0x93, + 0x6a, 0x20, 0x69, 0xe1, 0x1a, 0x40, 0x63, 0xf8, + 0x1c, 0x01, 0xd5, 0x02, 0x69, 0x20, 0x18, 0x08, + 0x63, 0xf8, 0x79, 0x38, 0x28, 0x00, 0xd0, 0x13, + 0x20, 0x01, 0x02, 0xc0, 0x83, 0xa8, 0xe0, 0x11, + 0x02, 0x01, 0x65, 0x79, 0x9a, 0x01, 0x69, 0xe0, + 0x5c, 0x12, 0x18, 0x51, 0x65, 0x79, 0x1c, 0x41, + 0x1c, 0x30, 0xf0, 0x19, 0xfe, 0x69, 0x61, 0xe1, + 0x98, 0x00, 0x38, 0x01, 0x63, 0xf8, 0xe7, 0xb2, + 0x48, 0x3c, 0x83, 0xa8, 0x8b, 0x28, 0x6b, 0xf9, + 0x42, 0x88, 0xda, 0x01, 0x63, 0xf8, 0xe0, 0x02, + 0x8b, 0xa8, 0x42, 0x81, 0xdb, 0x68, 0x8b, 0xa8, + 0x6b, 0xf9, 0x42, 0x81, 0xdd, 0x00, 0x63, 0xf8, + 0x48, 0x35, 0x21, 0x00, 0x66, 0x78, 0x80, 0x01, + 0x30, 0x02, 0x21, 0xff, 0x31, 0xc1, 0x66, 0x78, + 0x80, 0x01, 0x48, 0x32, 0x66, 0x78, 0x79, 0x39, + 0x29, 0x00, 0xd0, 0x21, 0x21, 0x00, 0x71, 0x39, + 0x69, 0x3b, 0x69, 0x20, 0x18, 0x1a, 0xb4, 0x04, + 0x69, 0xe0, 0x18, 0x18, 0x6b, 0xfa, 0x49, 0x2a, + 0xf0, 0x00, 0xfe, 0xec, 0x6b, 0xf8, 0x38, 0x06, + 0x6e, 0x79, 0x80, 0x08, 0x31, 0x02, 0x66, 0x79, + 0xb0, 0x01, 0x48, 0x25, 0xf7, 0xff, 0xff, 0x02, + 0x8b, 0x28, 0x6b, 0xf9, 0x1a, 0x40, 0x83, 0x28, + 0x69, 0xe0, 0x6b, 0xf9, 0x18, 0x41, 0x69, 0x20, + 0xf0, 0x19, 0xfe, 0x26, 0x61, 0xe1, 0xe0, 0x26, + 0x6b, 0xf9, 0x31, 0x03, 0x80, 0x01, 0x48, 0x1e, + 0x21, 0x01, 0x03, 0xc9, 0x66, 0x78, 0x80, 0x01, + 0x30, 0x02, 0x21, 0xff, 0x66, 0x78, 0x80, 0x01, + 0x48, 0x1a, 0x66, 0x78, 0x69, 0x3b, 0x69, 0x20, + 0x18, 0x1a, 0xb4, 0x04, 0x69, 0xe0, 0x18, 0x18, + 0x6b, 0xfa, 0x49, 0x17, 0xf0, 0x00, 0xfe, 0xbe, + 0x8b, 0x28, 0x6b, 0xf9, 0x1a, 0x40, 0x83, 0x28, + 0x69, 0xe0, 0x6b, 0xfe, 0x19, 0x81, 0x69, 0x20, + 0xb0, 0x01, 0xf0, 0x19, 0xfe, 0x01, 0x1d, 0xf0, + 0x30, 0x02, 0x61, 0xe1, 0x63, 0xf8, 0x8b, 0x28, + 0x28, 0x00, 0xd1, 0x01, 0x21, 0x00, 0x64, 0xe0, + 0x21, 0x10, 0x48, 0x0c, 0x85, 0x01, 0x6b, 0xf9, + 0x85, 0x41, 0x21, 0x01, 0x02, 0x49, 0x86, 0x81, + 0xb0, 0x06, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x48, 0x00, 0x00, 0x07, 0xf7, + 0x2c, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x02, 0x04, + 0x2c, 0x00, 0x02, 0x06, 0x2c, 0x00, 0x02, 0x0a, + 0x2c, 0x00, 0x02, 0x09, 0x2c, 0x00, 0x1f, 0xc0, + 0xb5, 0xf0, 0x20, 0x33, 0x06, 0x40, 0x6e, 0x40, + 0xb0, 0x81, 0x4f, 0x77, 0x63, 0xb8, 0x6a, 0xf9, + 0x1a, 0x40, 0x1d, 0xfc, 0x34, 0x79, 0x63, 0xe0, + 0x28, 0x00, 0xda, 0x02, 0x6a, 0x79, 0x18, 0x40, + 0x63, 0xe0, 0x6b, 0xe0, 0x4b, 0x71, 0x42, 0x98, + 0xdc, 0x03, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x6d, 0xb9, 0x48, 0x6e, 0x1d, 0xc5, + 0x35, 0x59, 0x29, 0x00, 0xd1, 0x16, 0x7e, 0x01, + 0x29, 0x00, 0xd1, 0x13, 0x21, 0x01, 0x75, 0x01, + 0x21, 0x05, 0x84, 0x29, 0x23, 0x0d, 0x06, 0x9b, + 0x6c, 0x79, 0x1a, 0xca, 0x68, 0x52, 0x31, 0x08, + 0x23, 0x05, 0x02, 0x5b, 0x64, 0x79, 0x66, 0xba, + 0x42, 0x99, 0xdb, 0x06, 0x21, 0x01, 0x02, 0xc9, + 0x64, 0x79, 0xe0, 0x02, 0x21, 0x00, 0x75, 0x01, + 0x84, 0x29, 0x8c, 0x29, 0x1c, 0x4a, 0x6a, 0xfb, + 0x1a, 0x9a, 0x07, 0x92, 0x0f, 0x92, 0x18, 0x51, + 0x84, 0x29, 0x7e, 0x01, 0x29, 0x00, 0xd0, 0x03, + 0x21, 0x00, 0x66, 0x39, 0x66, 0x79, 0x76, 0x01, + 0x6c, 0x79, 0x4a, 0x58, 0x69, 0x52, 0x42, 0x91, + 0xd0, 0x26, 0x6e, 0x7a, 0x2a, 0x00, 0xd1, 0x10, + 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc9, 0x68, 0x09, + 0x66, 0x79, 0x1c, 0x0a, 0x6e, 0x3b, 0x18, 0x59, + 0x66, 0x39, 0x4b, 0x51, 0x42, 0x99, 0xdb, 0x04, + 0x32, 0x01, 0x31, 0x01, 0x40, 0x19, 0x66, 0x39, + 0x66, 0x7a, 0x6e, 0x79, 0x6d, 0xba, 0x1a, 0x89, + 0x65, 0x21, 0x91, 0x00, 0x8c, 0x2b, 0x4e, 0x4b, + 0x1a, 0xf3, 0x42, 0x8b, 0xd3, 0x04, 0x63, 0xe1, + 0x21, 0x00, 0x65, 0xb9, 0x66, 0x79, 0xe0, 0x0a, + 0x18, 0xd1, 0x63, 0xe3, 0x65, 0xb9, 0xe0, 0x06, + 0x8c, 0x29, 0x4a, 0x44, 0x1a, 0x51, 0x63, 0xe1, + 0x6d, 0xba, 0x18, 0x51, 0x65, 0xb9, 0x49, 0x42, + 0x66, 0x61, 0x8c, 0x2a, 0x6b, 0xe1, 0x18, 0x89, + 0x31, 0x03, 0x83, 0xa9, 0x22, 0x00, 0x6e, 0x61, + 0x80, 0x0a, 0x31, 0x02, 0x22, 0xff, 0x32, 0xe1, + 0x66, 0x61, 0x80, 0x0a, 0x31, 0x02, 0x66, 0x61, + 0x8b, 0xaa, 0x80, 0x0a, 0x31, 0x02, 0x66, 0x61, + 0x7d, 0x00, 0x28, 0x00, 0xd0, 0x1d, 0x4a, 0x37, + 0x80, 0x0a, 0x1c, 0x88, 0x66, 0x60, 0x8c, 0x29, + 0x02, 0x09, 0x6e, 0xba, 0x0f, 0x52, 0x23, 0x06, + 0x40, 0x1a, 0x43, 0x11, 0x23, 0x21, 0x43, 0x19, + 0x80, 0x01, 0x30, 0x02, 0x66, 0x60, 0x6e, 0xb9, + 0x0b, 0x89, 0x23, 0x01, 0x43, 0x19, 0x80, 0x01, + 0x30, 0x02, 0x66, 0x60, 0x6e, 0xb9, 0x00, 0x49, + 0x43, 0x19, 0x80, 0x01, 0x30, 0x02, 0x66, 0x60, + 0xe0, 0x0b, 0x20, 0x01, 0x03, 0xc0, 0x80, 0x08, + 0x31, 0x02, 0x66, 0x61, 0x8c, 0x28, 0x02, 0x00, + 0x23, 0xff, 0x43, 0x18, 0x80, 0x08, 0x31, 0x02, + 0x66, 0x61, 0x48, 0x23, 0x6e, 0x61, 0x80, 0x08, + 0x31, 0x02, 0x66, 0x61, 0x80, 0x08, 0x31, 0x02, + 0x22, 0x33, 0x06, 0x52, 0x66, 0x61, 0x00, 0x53, + 0x6d, 0x90, 0x18, 0xc2, 0xb4, 0x04, 0x08, 0x5a, + 0x6d, 0x50, 0x18, 0xc6, 0x8c, 0x28, 0x4b, 0x1b, + 0x18, 0xc1, 0x00, 0x53, 0x6a, 0xf8, 0x18, 0xc0, + 0x6b, 0xe2, 0x1c, 0x33, 0xf0, 0x00, 0xfd, 0xb6, + 0x6a, 0xf8, 0x6b, 0xe1, 0x18, 0x40, 0x22, 0x33, + 0x06, 0x52, 0x62, 0xf8, 0x6d, 0x92, 0xb0, 0x01, + 0x42, 0x90, 0xdb, 0x02, 0x6a, 0x79, 0x1a, 0x40, + 0x62, 0xf8, 0x21, 0xff, 0x31, 0x11, 0x48, 0x10, + 0x85, 0x01, 0x8b, 0xa9, 0x31, 0x06, 0x85, 0x41, + 0x21, 0x01, 0x02, 0x49, 0x86, 0x81, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0x48, 0x00, 0x00, 0x0f, 0xee, + 0x2e, 0x08, 0x04, 0xa8, 0xcc, 0x00, 0x0f, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x07, 0xf7, + 0x2c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x2c, 0x00, 0x02, 0x09, + 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0xb0, 0x1c, 0x07, + 0xb0, 0x83, 0x4d, 0x20, 0x6b, 0x28, 0xf7, 0xff, + 0xfa, 0x53, 0x48, 0x1f, 0x6c, 0xc1, 0x6c, 0x80, + 0x1a, 0x08, 0xd5, 0x03, 0x1f, 0xe9, 0x39, 0x79, + 0x69, 0x09, 0x18, 0x40, 0x6e, 0xa9, 0x29, 0x00, + 0xd0, 0x22, 0x29, 0x10, 0xd0, 0x20, 0x29, 0x20, + 0xd0, 0x24, 0x29, 0x30, 0xd1, 0x04, 0x24, 0x2d, + 0x43, 0x44, 0xd5, 0x00, 0x34, 0x3f, 0x11, 0xa4, + 0x46, 0x6a, 0xa8, 0x01, 0xa9, 0x02, 0xf7, 0xff, + 0xfa, 0x19, 0x1b, 0x38, 0x99, 0x02, 0x1a, 0x08, + 0x22, 0x7d, 0x01, 0x52, 0x42, 0x90, 0xdc, 0x01, + 0x42, 0x90, 0xda, 0x05, 0x1a, 0x09, 0x91, 0x02, + 0x22, 0x00, 0x20, 0x00, 0xf7, 0xff, 0xf9, 0xf4, + 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x01, 0x04, 0x1a, 0x24, 0xd5, 0x00, 0x34, 0x1f, + 0x11, 0x64, 0xe7, 0xe1, 0x21, 0x4b, 0x43, 0x41, + 0x20, 0x93, 0xf0, 0x19, 0xfc, 0x91, 0x1c, 0x04, + 0xe7, 0xda, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc8, + 0x66, 0x00, 0x00, 0x80, 0xb5, 0x90, 0x1c, 0x07, + 0xb0, 0x83, 0x4c, 0x18, 0x6f, 0x60, 0x30, 0x01, + 0x46, 0x6a, 0x67, 0x60, 0xa8, 0x01, 0xa9, 0x02, + 0xf7, 0xff, 0xf9, 0xe8, 0x4b, 0x14, 0x18, 0xf9, + 0x98, 0x02, 0x1a, 0x40, 0x4b, 0x13, 0x42, 0x98, + 0xdc, 0x04, 0x42, 0xd8, 0xdb, 0x02, 0x69, 0xe0, + 0x28, 0x01, 0xd1, 0x07, 0x91, 0x02, 0x20, 0x00, + 0x90, 0x01, 0x22, 0x00, 0xf7, 0xff, 0xf9, 0xc0, + 0x20, 0x01, 0x61, 0xe0, 0x69, 0xe0, 0x28, 0x00, + 0xd0, 0x0b, 0x6b, 0x20, 0xf7, 0xff, 0xf9, 0xec, + 0x6f, 0x60, 0x67, 0xa0, 0x48, 0x08, 0x60, 0x07, + 0x6f, 0xe0, 0x30, 0x01, 0x67, 0xe0, 0x20, 0x00, + 0x61, 0xe0, 0xb0, 0x03, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc8, + 0xff, 0xff, 0xec, 0x78, 0x00, 0x02, 0xbf, 0x20, + 0x2e, 0x08, 0x05, 0x48, 0xb4, 0xf0, 0x1c, 0x1c, + 0x23, 0x00, 0x9f, 0x04, 0x60, 0x3b, 0x79, 0x85, + 0x23, 0xc0, 0x40, 0x1d, 0x4b, 0x33, 0x2d, 0x80, + 0xd1, 0x16, 0x25, 0x02, 0x60, 0x9d, 0x79, 0xc5, + 0x0a, 0x2b, 0xd3, 0x06, 0x7a, 0x45, 0x23, 0xe0, + 0x40, 0x2b, 0x2b, 0x20, 0xd1, 0x01, 0x23, 0x09, + 0x60, 0x3b, 0x7a, 0x03, 0x33, 0x09, 0x60, 0x13, + 0x79, 0x02, 0x02, 0x12, 0x79, 0x45, 0x43, 0x2a, + 0x32, 0x06, 0x1a, 0xd2, 0x60, 0x22, 0xe0, 0x25, + 0x25, 0x06, 0x26, 0x01, 0x60, 0x9e, 0x79, 0x83, + 0x2b, 0xff, 0xd1, 0x03, 0x35, 0x01, 0x5d, 0x43, + 0x2b, 0xff, 0xd0, 0xfb, 0x5d, 0x46, 0x23, 0xc0, + 0x40, 0x33, 0x2b, 0x40, 0xd1, 0x00, 0x35, 0x02, + 0x5d, 0x46, 0x09, 0x33, 0x07, 0x9b, 0xd0, 0x08, + 0x60, 0x3d, 0x5d, 0x46, 0x09, 0x73, 0xd3, 0x02, + 0x1d, 0xeb, 0x33, 0x03, 0xe0, 0x02, 0x1d, 0x6b, + 0xe0, 0x00, 0x1c, 0x6b, 0x60, 0x13, 0x79, 0x02, + 0x02, 0x12, 0x79, 0x45, 0x43, 0x2a, 0x32, 0x06, + 0x1a, 0xd2, 0x60, 0x22, 0x68, 0x3a, 0x2a, 0x00, + 0xd0, 0x20, 0x5c, 0x82, 0x23, 0x0e, 0x40, 0x1a, + 0x07, 0x52, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc3, + 0x78, 0x5b, 0x05, 0x9b, 0x43, 0x1a, 0x60, 0x0a, + 0x68, 0x3b, 0x18, 0xc3, 0x78, 0x9c, 0x23, 0xfe, + 0x40, 0x23, 0x03, 0x9b, 0x43, 0x1a, 0x60, 0x0a, + 0x68, 0x3b, 0x18, 0xc3, 0x78, 0xdb, 0x01, 0xdb, + 0x43, 0x1a, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc0, + 0x79, 0x00, 0x23, 0xfe, 0x40, 0x18, 0x08, 0x40, + 0x43, 0x10, 0x60, 0x08, 0x20, 0x00, 0xbc, 0xf0, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x48, + 0xb5, 0xb0, 0xb0, 0x83, 0x48, 0x3f, 0x49, 0x40, + 0x8d, 0xc9, 0x4c, 0x40, 0x63, 0xe1, 0x29, 0x06, + 0xda, 0x03, 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0x01, 0x09, 0x49, 0x01, 0x49, + 0x23, 0xff, 0x33, 0xe1, 0x42, 0x99, 0xd0, 0x03, + 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x46, 0x6a, 0xb4, 0x04, 0xaa, 0x03, 0xab, 0x02, + 0x49, 0x35, 0xf7, 0xff, 0xff, 0x6f, 0xb0, 0x01, + 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, 0x99, 0x01, + 0x18, 0x40, 0x6b, 0xe1, 0x42, 0x88, 0xd0, 0x03, + 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x00, 0x4f, 0x2c, 0x28, 0x00, 0xd0, 0x25, + 0x6e, 0x38, 0x6d, 0xb9, 0x18, 0x40, 0x23, 0x01, + 0x06, 0x1b, 0x66, 0x38, 0x42, 0x98, 0xdb, 0x04, + 0x43, 0xdb, 0x18, 0xc0, 0x66, 0x38, 0x1e, 0x48, + 0x65, 0xb8, 0x23, 0x0d, 0x06, 0x9b, 0x6d, 0xb8, + 0x6c, 0xb9, 0x1a, 0xc9, 0x60, 0x08, 0x6e, 0xe0, + 0x6c, 0xb9, 0x1a, 0xc9, 0x60, 0x48, 0x20, 0x00, + 0x65, 0xb8, 0x6c, 0xb8, 0x30, 0x08, 0x23, 0x05, + 0x02, 0x5b, 0x64, 0xb8, 0x42, 0x98, 0xd1, 0x02, + 0x20, 0x01, 0x02, 0xc0, 0x64, 0xb8, 0x6c, 0xb8, + 0x49, 0x19, 0x61, 0x48, 0x24, 0x33, 0x06, 0x64, + 0x00, 0x63, 0x6d, 0xa0, 0x18, 0xc2, 0xb4, 0x04, + 0x6d, 0x60, 0x18, 0xc5, 0x6e, 0x60, 0x18, 0xc1, + 0x98, 0x03, 0x4b, 0x0e, 0x18, 0xc0, 0x9a, 0x02, + 0x1c, 0x2b, 0xf0, 0x00, 0xfc, 0x53, 0xb0, 0x01, + 0x6d, 0xb8, 0x99, 0x01, 0x18, 0x40, 0x65, 0xb8, + 0x48, 0x0e, 0x68, 0x02, 0x18, 0x51, 0x60, 0x01, + 0x6e, 0x60, 0x6d, 0xa1, 0x42, 0x88, 0xdb, 0x04, + 0x48, 0x0a, 0x68, 0x01, 0x6a, 0x7a, 0x1a, 0x89, + 0x60, 0x01, 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x12, 0x00, + 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x04, 0xc8, + 0x2e, 0x08, 0x05, 0x34, 0x2e, 0x08, 0x04, 0x48, + 0xcc, 0x00, 0x0f, 0x00, 0x66, 0x00, 0x00, 0x64, + 0xb5, 0xf0, 0xb0, 0x83, 0x4e, 0x65, 0x25, 0x00, + 0x4f, 0x65, 0x6a, 0xf8, 0xf7, 0xff, 0xf8, 0xcc, + 0x48, 0x64, 0x8d, 0xc0, 0x63, 0xf8, 0x28, 0x0a, + 0xda, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0x34, 0x09, 0x60, 0x01, 0x40, + 0x23, 0xff, 0x33, 0xc1, 0x42, 0x98, 0xd0, 0x07, + 0x23, 0xff, 0x33, 0xbe, 0x42, 0x9c, 0xd0, 0x03, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x46, 0x6a, 0xb4, 0x04, 0xaa, 0x03, 0xab, 0x02, + 0x49, 0x57, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xd6, + 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, + 0x99, 0x01, 0x18, 0x41, 0x6b, 0xfa, 0x42, 0x91, + 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x01, 0x1c, 0x22, 0x4c, 0x4d, + 0x23, 0xff, 0x33, 0xbe, 0x42, 0x9a, 0xd1, 0x3c, + 0x5c, 0x30, 0x28, 0xa0, 0xd0, 0x03, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xe0, + 0x28, 0x00, 0xd1, 0x1b, 0x20, 0x02, 0x63, 0x78, + 0x60, 0xe1, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0f, + 0xf9, 0x4f, 0x20, 0x00, 0xf7, 0xfb, 0xfe, 0xb8, + 0x98, 0x02, 0x4b, 0x3c, 0x18, 0xc0, 0x79, 0x40, + 0x23, 0x30, 0x40, 0x18, 0x66, 0xb8, 0xd0, 0x16, + 0x28, 0x10, 0xd0, 0x14, 0x28, 0x20, 0xd0, 0x17, + 0x28, 0x30, 0xd1, 0x03, 0x21, 0x20, 0x20, 0x1e, + 0xf0, 0x0f, 0xfc, 0x69, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x2b, 0x6d, 0x60, 0x28, 0x05, 0xd1, 0x28, + 0x68, 0xf8, 0x28, 0x00, 0xd1, 0x25, 0x6f, 0x38, + 0xf7, 0xff, 0xfe, 0x08, 0xe0, 0x21, 0x21, 0x02, + 0x20, 0x1e, 0xf0, 0x0f, 0xfc, 0x58, 0xe7, 0xed, + 0x21, 0x08, 0x20, 0x1e, 0xf0, 0x0f, 0xfc, 0x53, + 0xe7, 0xe8, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x08, + 0x20, 0x00, 0x63, 0x79, 0x21, 0x00, 0x60, 0xe0, + 0xf0, 0x0f, 0xf9, 0x1a, 0x20, 0x02, 0xf0, 0x0f, + 0xf9, 0x6d, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x08, + 0x6d, 0x60, 0x28, 0x05, 0xd1, 0x05, 0x68, 0xf8, + 0x28, 0x00, 0xd1, 0x02, 0x6f, 0x38, 0xf7, 0xff, + 0xfe, 0x2d, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x01, + 0x98, 0x02, 0x1d, 0xc5, 0x6b, 0xf8, 0x1b, 0x42, + 0x63, 0xfa, 0x7e, 0x39, 0x69, 0x78, 0x18, 0x41, + 0x4b, 0x16, 0x18, 0xe8, 0xf7, 0xfb, 0xfb, 0xfc, + 0x7e, 0x38, 0x6b, 0xf9, 0x18, 0x40, 0x07, 0x81, + 0x0f, 0x89, 0x76, 0x39, 0x1a, 0x44, 0x20, 0x01, + 0x06, 0x00, 0x49, 0x15, 0x60, 0x08, 0xf0, 0x1e, + 0xfe, 0x53, 0x4b, 0x14, 0x40, 0x18, 0xf0, 0x1e, + 0xfe, 0x53, 0x22, 0x04, 0x49, 0x10, 0xb4, 0x06, + 0x23, 0x12, 0x21, 0x1e, 0x69, 0x78, 0x1c, 0x22, + 0xf0, 0x13, 0xff, 0x28, 0xb0, 0x02, 0xf0, 0x1e, + 0xfe, 0x43, 0x23, 0x01, 0x04, 0x9b, 0x43, 0x18, + 0xf0, 0x1e, 0xfe, 0x42, 0x69, 0x78, 0x59, 0x01, + 0x60, 0x01, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x12, 0x00, + 0x2e, 0x08, 0x04, 0xc8, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x08, 0x05, 0x38, 0x2e, 0x08, 0x04, 0x48, + 0x9e, 0x00, 0x08, 0x00, 0xff, 0xfb, 0xff, 0xff, + 0x20, 0x33, 0x06, 0x40, 0x6e, 0x81, 0x6e, 0x40, + 0x1a, 0x09, 0x48, 0x0f, 0x63, 0xc1, 0x29, 0x00, + 0xdc, 0x04, 0x1f, 0xc2, 0x3a, 0x79, 0x6a, 0x52, + 0x18, 0x89, 0x63, 0xc1, 0x6b, 0xc1, 0x08, 0x89, + 0x00, 0x89, 0x23, 0x01, 0x02, 0xdb, 0x63, 0xc1, + 0x42, 0x99, 0xdd, 0x0b, 0x4a, 0x07, 0x42, 0x91, + 0xdd, 0x00, 0x63, 0xc2, 0x4a, 0x06, 0x49, 0x07, + 0x85, 0x8a, 0x6b, 0xc0, 0x85, 0xc8, 0x20, 0x09, + 0x02, 0x40, 0x86, 0xc8, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0xc8, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x02, 0x06, 0x2c, 0x00, 0x1f, 0xc0, + 0x48, 0x0f, 0x78, 0x01, 0x29, 0x00, 0xd0, 0x1a, + 0x49, 0x0e, 0x6c, 0x8a, 0x6c, 0xc9, 0x1a, 0x51, + 0x63, 0xc1, 0x1c, 0x0a, 0x29, 0x00, 0xdc, 0x04, + 0x1f, 0xc1, 0x39, 0x79, 0x69, 0x09, 0x18, 0x51, + 0x63, 0xc1, 0x23, 0x01, 0x03, 0x1b, 0x6b, 0xc1, + 0x42, 0x99, 0xdb, 0x08, 0x22, 0xff, 0x32, 0x07, + 0x49, 0x05, 0x85, 0x8a, 0x6b, 0xc0, 0x85, 0xc8, + 0x20, 0x09, 0x02, 0x40, 0x86, 0xc8, 0x47, 0x70, + 0x2e, 0x08, 0x04, 0xc8, 0x66, 0x00, 0x00, 0x80, + 0x2c, 0x00, 0x1f, 0xc0, 0xb4, 0x80, 0x20, 0x00, + 0x49, 0x1e, 0x6c, 0x8a, 0x6c, 0xc9, 0x1a, 0x52, + 0x49, 0x1d, 0x2a, 0x00, 0xdc, 0x01, 0x69, 0x0b, + 0x18, 0xd2, 0x23, 0x01, 0x02, 0xdb, 0x42, 0x9a, + 0xdd, 0x00, 0x08, 0xd8, 0x22, 0x33, 0x06, 0x52, + 0x6e, 0x93, 0x6e, 0x52, 0x1a, 0x9a, 0x2a, 0x00, + 0xdc, 0x01, 0x6a, 0x4b, 0x18, 0xd2, 0x08, 0x92, + 0x00, 0x92, 0x4b, 0x14, 0x68, 0xdb, 0x2b, 0x00, + 0xd0, 0x06, 0x23, 0x01, 0x03, 0x1b, 0x6a, 0x4f, + 0x18, 0xfb, 0x6a, 0x89, 0x1a, 0x59, 0xe0, 0x01, + 0x21, 0x01, 0x03, 0x09, 0x42, 0x8a, 0xdd, 0x04, + 0x04, 0x00, 0x0c, 0x00, 0x23, 0x01, 0x02, 0x5b, + 0x43, 0x18, 0x28, 0x00, 0xd0, 0x0b, 0x4b, 0x0a, + 0x42, 0x9a, 0xdd, 0x00, 0x1c, 0x1a, 0x21, 0x06, + 0x43, 0x01, 0x48, 0x08, 0x85, 0x81, 0x85, 0xc2, + 0x21, 0x09, 0x02, 0x49, 0x86, 0xc1, 0xbc, 0x80, + 0x47, 0x70, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, + 0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x04, 0xc8, + 0x00, 0x00, 0xff, 0xff, 0x2c, 0x00, 0x1f, 0xc0, + 0xb5, 0x90, 0x04, 0x00, 0x0c, 0x00, 0x4f, 0x13, + 0x6d, 0x39, 0x29, 0x00, 0xd1, 0x10, 0x24, 0x01, + 0x28, 0x01, 0xd0, 0x10, 0x28, 0x04, 0xd0, 0x15, + 0x28, 0x05, 0xd1, 0x09, 0xf7, 0xff, 0xf8, 0x52, + 0xf7, 0xff, 0xf8, 0x06, 0x20, 0x00, 0x66, 0xf8, + 0x67, 0x38, 0x20, 0x05, 0x65, 0x78, 0x65, 0x3c, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, + 0xff, 0xfb, 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x3e, + 0x20, 0x04, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x48, + 0xb5, 0x90, 0x04, 0x00, 0x0c, 0x00, 0x4f, 0x23, + 0x6d, 0x39, 0x29, 0x00, 0xd0, 0x0e, 0x29, 0x02, + 0xd1, 0x09, 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x34, + 0x28, 0x04, 0xd0, 0x27, 0x28, 0x05, 0xd1, 0x02, + 0x20, 0xff, 0xf7, 0xff, 0xf8, 0xd1, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x24, 0x02, 0x28, 0x01, + 0xd0, 0x0c, 0x28, 0x04, 0xd0, 0x12, 0x28, 0x05, + 0xd1, 0xf5, 0x20, 0x00, 0xf7, 0xff, 0xf8, 0xc4, + 0x20, 0x05, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x42, + 0x20, 0x01, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x7a, + 0x20, 0x04, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x20, 0x0e, + 0xf0, 0x11, 0xfb, 0xb2, 0x21, 0x00, 0x20, 0x0d, + 0xf0, 0x11, 0xfb, 0xae, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x02, 0xf0, 0x0f, 0xf8, 0x0e, + 0x20, 0xff, 0x49, 0x03, 0x70, 0x08, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x48, + 0x2e, 0x08, 0x04, 0xc8, 0xb5, 0xf0, 0x4f, 0x2b, + 0x24, 0x00, 0x6d, 0x38, 0x28, 0x01, 0xd0, 0x1e, + 0x28, 0x02, 0xd1, 0x19, 0x26, 0x03, 0x6d, 0x78, + 0x1d, 0xfd, 0x35, 0x79, 0x28, 0x01, 0xd0, 0x34, + 0x28, 0x04, 0xd0, 0x3f, 0x28, 0x05, 0xd1, 0x0f, + 0x20, 0x02, 0x63, 0x6c, 0xf0, 0x0e, 0xff, 0xee, + 0x20, 0x00, 0xf7, 0xfb, 0xfd, 0x01, 0xf7, 0xff, + 0xf8, 0x2b, 0x65, 0x3e, 0x20, 0x00, 0x65, 0x78, + 0xf7, 0xfe, 0xfe, 0xc2, 0x20, 0x01, 0x61, 0xe8, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x78, + 0x28, 0x01, 0xd0, 0x0c, 0x28, 0x04, 0xd0, 0x11, + 0x28, 0x05, 0xd1, 0xf5, 0xf7, 0xfe, 0xff, 0x8c, + 0xf7, 0xfe, 0xff, 0xe2, 0x65, 0x3c, 0x65, 0x7c, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, + 0xff, 0x83, 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 0xff, 0xd4, + 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x63, 0x6c, 0x20, 0x02, 0x60, 0xfc, + 0xf0, 0x0e, 0xff, 0xbc, 0x20, 0x00, 0xf7, 0xfb, + 0xfc, 0xcf, 0x65, 0x7c, 0x65, 0x3e, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 0xff, 0xf4, + 0x65, 0x7c, 0x65, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x48, + 0xb5, 0x90, 0x4c, 0x1b, 0x68, 0xe0, 0x28, 0x03, + 0xd0, 0x1f, 0x1f, 0xe7, 0x3f, 0x79, 0x6d, 0x38, + 0x28, 0x02, 0xd1, 0x1a, 0x6d, 0x78, 0x28, 0x01, + 0xd0, 0x1a, 0x28, 0x04, 0xd0, 0x20, 0x28, 0x05, + 0xd1, 0x13, 0x4a, 0x14, 0x49, 0x14, 0x48, 0x15, + 0xf7, 0xfe, 0xfe, 0x54, 0x21, 0x00, 0x20, 0x0e, + 0xf0, 0x11, 0xfb, 0x2a, 0x20, 0x01, 0xf0, 0x0e, + 0xff, 0x8d, 0x20, 0x03, 0x60, 0xe0, 0x68, 0xf8, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x01, 0xf0, 0x0e, + 0xff, 0x85, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x01, 0xf0, 0x0e, 0xff, 0x7f, 0x20, 0x00, + 0x70, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x00, 0x20, 0x0b, 0xf0, 0x11, 0xfb, 0x10, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0xc8, 0x2e, 0x08, 0x05, 0x54, + 0x2e, 0x08, 0x05, 0x4c, 0x2e, 0x08, 0x05, 0x50, + 0xb5, 0xf0, 0x4c, 0x21, 0x6d, 0x20, 0x28, 0x02, + 0xd1, 0x24, 0x26, 0xff, 0x6d, 0x60, 0x1d, 0xe7, + 0x37, 0x79, 0x28, 0x01, 0xd0, 0x1d, 0x28, 0x04, + 0xd0, 0x1f, 0x28, 0x05, 0xd1, 0x1a, 0x20, 0x01, + 0xf0, 0x0e, 0xff, 0x58, 0x25, 0x00, 0x68, 0xe0, + 0x28, 0x00, 0xd0, 0x04, 0x21, 0x00, 0x20, 0x00, + 0xf0, 0x0e, 0xfe, 0xfa, 0x60, 0xe5, 0x70, 0x3e, + 0x68, 0xf8, 0x28, 0x03, 0xd1, 0x14, 0x48, 0x13, + 0x22, 0x00, 0x68, 0x41, 0x20, 0x00, 0xf7, 0xfe, + 0xfd, 0xef, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x20, + 0xe0, 0x0f, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x11, + 0xfa, 0xd3, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x01, 0x61, 0xf8, 0x6b, 0x38, 0xf7, 0xfe, + 0xfe, 0x0f, 0x20, 0x02, 0x60, 0xfd, 0xf0, 0x0e, + 0xff, 0x2d, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x11, + 0xfa, 0xc3, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x05, 0x48, + 0xb5, 0xb0, 0x04, 0x07, 0x0c, 0x3f, 0x2f, 0x01, + 0xda, 0x00, 0x27, 0x01, 0x2f, 0x3f, 0xdd, 0x00, + 0x27, 0x3f, 0x48, 0x17, 0x6d, 0x01, 0x29, 0x02, + 0xd1, 0x13, 0x6d, 0x40, 0x25, 0x02, 0x4c, 0x15, + 0x28, 0x04, 0xd0, 0x11, 0x28, 0x05, 0xd1, 0x0c, + 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x11, 0xfa, 0xa4, + 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x11, 0xfa, 0xa0, + 0x20, 0x22, 0x1c, 0x39, 0xf0, 0x11, 0xfa, 0x9c, + 0x60, 0xe5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x11, 0xfa, 0x94, + 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x11, 0xfa, 0x90, + 0x20, 0x22, 0x1c, 0x39, 0xf0, 0x11, 0xfa, 0x8c, + 0x20, 0x00, 0xf7, 0xfe, 0xfd, 0xcd, 0x60, 0xe5, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x04, 0xc8, + 0xb5, 0x00, 0x48, 0x0b, 0x6d, 0x01, 0x29, 0x02, + 0xd1, 0x10, 0x6d, 0x40, 0x28, 0x04, 0xd0, 0x01, + 0x28, 0x05, 0xd1, 0x0b, 0x21, 0x00, 0x20, 0x16, + 0xf0, 0x11, 0xfa, 0x72, 0x20, 0x00, 0xf7, 0xfe, + 0xfd, 0xb3, 0x21, 0x00, 0x48, 0x03, 0x70, 0x01, + 0x21, 0x01, 0x60, 0xc1, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x04, 0xc8, + 0xb5, 0x00, 0x48, 0x0b, 0x6d, 0x01, 0x29, 0x02, + 0xd1, 0x10, 0x6d, 0x40, 0x28, 0x04, 0xd0, 0x01, + 0x28, 0x05, 0xd1, 0x0b, 0x21, 0x00, 0x20, 0x1a, + 0xf0, 0x11, 0xfa, 0x56, 0x20, 0x00, 0xf7, 0xfe, + 0xfd, 0x97, 0x21, 0x00, 0x48, 0x03, 0x70, 0x01, + 0x21, 0x01, 0x60, 0xc1, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x04, 0xc8, + 0x48, 0x03, 0x6d, 0x00, 0x28, 0x00, 0xd1, 0x00, + 0x47, 0x70, 0x20, 0xff, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0x48, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x0f, 0x4d, 0x52, 0x6d, 0x29, 0x48, 0x52, + 0x26, 0x00, 0x29, 0x01, 0xd0, 0x4c, 0x29, 0x02, + 0xd1, 0x6e, 0x6d, 0x69, 0x29, 0x01, 0xd0, 0x20, + 0x29, 0x04, 0xd0, 0x2e, 0x29, 0x05, 0xd1, 0x3e, + 0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x08, 0xd5, 0x01, + 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, + 0x69, 0x28, 0xf0, 0x18, 0xff, 0xdd, 0x70, 0x20, + 0x20, 0x33, 0x06, 0x40, 0x6e, 0x41, 0x6e, 0x80, + 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, + 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, 0xf0, 0x18, + 0xff, 0xcf, 0x70, 0x38, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x08, + 0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, + 0x43, 0x41, 0x69, 0x28, 0xf0, 0x18, 0xff, 0xc0, + 0x70, 0x20, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x33, 0x06, 0x40, 0x6e, 0x41, + 0x6e, 0x80, 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, + 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, + 0xf0, 0x18, 0xff, 0xae, 0x70, 0x38, 0x70, 0x26, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x70, 0x26, + 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x6d, 0x69, 0x29, 0x01, 0xd0, 0x21, 0x29, 0x04, + 0xd0, 0x2f, 0x29, 0x05, 0xd1, 0x3f, 0x69, 0x69, + 0x6c, 0xc0, 0x1a, 0x40, 0xd5, 0x01, 0x69, 0x29, + 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x69, 0x28, + 0xf0, 0x18, 0xff, 0x92, 0x70, 0x20, 0x21, 0x33, + 0x06, 0x49, 0x6a, 0xe8, 0x6e, 0x49, 0x1a, 0x08, + 0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, + 0x43, 0x41, 0x6a, 0x68, 0xf0, 0x18, 0xff, 0x84, + 0x70, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xe0, 0x26, 0x69, 0x69, 0x6c, 0xc0, 0x1a, 0x40, + 0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, + 0x43, 0x41, 0x69, 0x28, 0xf0, 0x18, 0xff, 0x74, + 0x70, 0x20, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x33, 0x06, 0x49, 0x6a, 0xe8, + 0x6e, 0x49, 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, + 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, + 0xf0, 0x18, 0xff, 0x62, 0x70, 0x38, 0x70, 0x26, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x70, 0x26, + 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x70, 0x26, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x48, + 0x66, 0x00, 0x00, 0x80, 0xb5, 0xf0, 0x1c, 0x17, + 0x9e, 0x05, 0x1a, 0xf2, 0x1c, 0x0d, 0x21, 0x00, + 0x1c, 0x1c, 0x42, 0xba, 0xda, 0x03, 0x1c, 0x08, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x42, 0xa0, + 0xd3, 0x01, 0x42, 0xb0, 0xd9, 0x03, 0x1c, 0x08, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x19, 0xc1, + 0x42, 0xb1, 0xd9, 0x0c, 0x1a, 0x32, 0x4e, 0x0a, + 0x64, 0x32, 0x1c, 0x29, 0xf7, 0xfb, 0xf8, 0x84, + 0x6c, 0x30, 0x1a, 0x3a, 0x18, 0x29, 0x1c, 0x20, + 0xf7, 0xfb, 0xf8, 0x7e, 0xe0, 0x03, 0x1c, 0x29, + 0x1c, 0x3a, 0xf7, 0xfb, 0xf8, 0x79, 0x1c, 0x38, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0xc8, 0xb5, 0xf0, 0x1c, 0x17, + 0x9e, 0x05, 0x1a, 0xf2, 0x1c, 0x05, 0x20, 0x00, + 0x1c, 0x1c, 0x42, 0xba, 0xdb, 0x18, 0x42, 0xa1, + 0xd3, 0x16, 0x42, 0xb1, 0xd2, 0x14, 0x19, 0xc8, + 0x42, 0xb0, 0xd9, 0x0c, 0x1a, 0x72, 0x4e, 0x0a, + 0x64, 0x32, 0x1c, 0x28, 0xf7, 0xfb, 0xf8, 0x5c, + 0x6c, 0x30, 0x1a, 0x3a, 0x18, 0x28, 0x1c, 0x21, + 0xf7, 0xfb, 0xf8, 0x56, 0xe0, 0x03, 0x1c, 0x28, + 0x1c, 0x3a, 0xf7, 0xfb, 0xf8, 0x51, 0x1c, 0x38, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0xc8, 0x47, 0x70, 0xb5, 0x00, + 0xb0, 0x82, 0x46, 0x6a, 0x49, 0x06, 0xa8, 0x01, + 0xf7, 0xfe, 0xfc, 0x58, 0x21, 0x00, 0x20, 0x0b, + 0xf0, 0x11, 0xf9, 0x2e, 0x20, 0x03, 0x49, 0x03, + 0x61, 0x88, 0xb0, 0x02, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x05, 0x64, 0x2e, 0x08, 0x05, 0x48, + 0xb5, 0x80, 0x4f, 0x0b, 0x22, 0x00, 0x20, 0x00, + 0x69, 0xf9, 0xf7, 0xfe, 0xfc, 0x2d, 0x21, 0x00, + 0x20, 0x0d, 0xf0, 0x11, 0xf9, 0x19, 0x21, 0x01, + 0x1f, 0xf8, 0x38, 0x79, 0x61, 0xc1, 0x6b, 0x00, + 0xf7, 0xfe, 0xfc, 0x56, 0x20, 0x00, 0x61, 0xb8, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0x48, 0xb5, 0x80, 0x4f, 0x06, + 0x68, 0x38, 0x1d, 0xc1, 0x31, 0xb5, 0x20, 0x2f, + 0x02, 0x80, 0xf0, 0x18, 0xfe, 0xbd, 0x60, 0x39, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x02, 0xcb, 0x10, 0x48, 0x05, 0x8f, 0xc1, + 0x29, 0x00, 0xd0, 0x05, 0x21, 0x00, 0x87, 0xc1, + 0x48, 0x03, 0x69, 0x01, 0x31, 0x01, 0x61, 0x01, + 0x47, 0x70, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x08, 0x05, 0x68, 0x48, 0x03, 0x21, 0x00, + 0x60, 0x01, 0x48, 0x03, 0x69, 0x41, 0x31, 0x01, + 0x61, 0x41, 0x47, 0x70, 0x2e, 0x08, 0x48, 0x00, + 0x2e, 0x08, 0x05, 0x68, 0xb5, 0x00, 0xb0, 0x88, + 0x46, 0x68, 0xf0, 0x13, 0xfc, 0xbf, 0x48, 0x07, + 0x69, 0x81, 0x31, 0x01, 0x23, 0x01, 0x22, 0x06, + 0x61, 0x81, 0x21, 0x47, 0x02, 0x49, 0x05, 0x48, + 0xf0, 0x13, 0xfb, 0xac, 0xb0, 0x08, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x68, + 0xb5, 0x90, 0x1c, 0x07, 0x20, 0xff, 0x30, 0xa5, + 0xb0, 0x85, 0x90, 0x00, 0x20, 0x01, 0x02, 0x40, + 0x90, 0x02, 0x48, 0x12, 0x90, 0x04, 0x20, 0x0e, + 0xab, 0x03, 0x80, 0x18, 0x46, 0x68, 0xf0, 0x13, + 0xfc, 0xd1, 0x2f, 0x00, 0xd0, 0x16, 0x20, 0x33, + 0x06, 0x40, 0x6d, 0x40, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc7, 0x98, 0x02, 0x1e, 0x79, 0xf0, 0x00, + 0xfb, 0x31, 0x4c, 0x09, 0x68, 0x20, 0x28, 0x00, + 0xd1, 0x04, 0x20, 0xa5, 0x01, 0xc0, 0xf0, 0x00, + 0xfb, 0x37, 0x60, 0x20, 0x98, 0x02, 0x1a, 0x38, + 0x49, 0x04, 0x60, 0x88, 0xb0, 0x05, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x1c, 0x00, 0x00, + 0x2e, 0x08, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x68, + 0xb5, 0x00, 0x22, 0x01, 0x21, 0x01, 0x20, 0x00, + 0xf0, 0x0f, 0xf9, 0x2e, 0x48, 0x04, 0x68, 0x00, + 0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, + 0xf0, 0x00, 0xf9, 0xea, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x9b, 0xc4, 0xb5, 0xf0, 0x48, 0x55, + 0x4e, 0x55, 0x80, 0x30, 0x27, 0x00, 0x4c, 0x55, + 0x86, 0xe7, 0x86, 0xa7, 0x48, 0x54, 0x60, 0x07, + 0xf0, 0x0b, 0xf8, 0x2e, 0x48, 0x53, 0xf0, 0x14, + 0xf8, 0xdb, 0xf7, 0xfa, 0xff, 0x29, 0x21, 0xff, + 0x48, 0x51, 0x60, 0x01, 0x68, 0x01, 0x29, 0x00, + 0xd0, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x01, + 0x4a, 0x4e, 0x60, 0xd1, 0x60, 0x07, 0xf7, 0xfc, + 0xfb, 0x17, 0x20, 0x01, 0xf7, 0xff, 0xff, 0x98, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0e, 0xfc, 0x6c, + 0xf0, 0x01, 0xfa, 0xbc, 0x48, 0x48, 0x60, 0x07, + 0x25, 0x02, 0x48, 0x48, 0x60, 0x05, 0x20, 0x03, + 0x49, 0x47, 0x60, 0x08, 0x49, 0x47, 0x60, 0x08, + 0x49, 0x47, 0x60, 0x0d, 0x49, 0x47, 0x60, 0x08, + 0x48, 0x47, 0x60, 0x07, 0x48, 0x47, 0x65, 0x87, + 0xf0, 0x00, 0xf9, 0x8a, 0xf0, 0x14, 0xf9, 0x48, + 0x20, 0x00, 0xf0, 0x11, 0xfe, 0x85, 0x28, 0x00, + 0xd1, 0x64, 0x48, 0x43, 0xf0, 0x0e, 0xfa, 0xbe, + 0x20, 0x00, 0xf0, 0x0e, 0xfb, 0x2f, 0x87, 0xe7, + 0x87, 0xa7, 0x22, 0x01, 0xb4, 0x04, 0x22, 0x03, + 0x21, 0x01, 0x20, 0x00, 0x1c, 0x2b, 0xf0, 0x11, + 0xfb, 0x2b, 0x20, 0x02, 0xb0, 0x01, 0xf7, 0xfc, + 0xfc, 0x73, 0xf7, 0xff, 0xff, 0x95, 0x20, 0x7d, + 0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xc7, 0x20, 0x7d, + 0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xdb, 0xf0, 0x09, + 0xff, 0x4f, 0xf0, 0x09, 0xff, 0x8d, 0xf7, 0xfb, + 0xf9, 0xbf, 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfd, + 0xf8, 0x11, 0xf7, 0xfd, 0xfb, 0xbf, 0xf7, 0xfb, + 0xfd, 0x0d, 0x03, 0xe8, 0xf0, 0x00, 0xfa, 0x5c, + 0xf0, 0x05, 0xfc, 0x30, 0x49, 0x2b, 0x70, 0x08, + 0x05, 0xa8, 0xf0, 0x1e, 0xf9, 0x78, 0x49, 0x2a, + 0x20, 0x17, 0xf0, 0x1e, 0xf9, 0x81, 0x49, 0x29, + 0x20, 0x08, 0xf0, 0x1e, 0xf9, 0x7d, 0xf0, 0x1e, + 0xf9, 0x73, 0x4b, 0x27, 0x40, 0x18, 0xf0, 0x1e, + 0xf9, 0x73, 0x01, 0xe8, 0xf0, 0x1e, 0xf9, 0x67, + 0x48, 0x24, 0x23, 0x01, 0x22, 0x08, 0x21, 0x81, + 0x01, 0x09, 0x60, 0x07, 0xf0, 0x11, 0xfa, 0x38, + 0xf0, 0x01, 0xfa, 0xd6, 0x49, 0x20, 0x20, 0x04, + 0xf0, 0x1e, 0xf9, 0x66, 0xf0, 0x1e, 0xf9, 0x5c, + 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x1e, + 0xf9, 0x5b, 0x20, 0x10, 0xf0, 0x1e, 0xf9, 0x4f, + 0x87, 0x67, 0x21, 0x00, 0x1c, 0x30, 0xf7, 0xfd, + 0xfd, 0xa9, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x08, 0x04, 0x98, 0x07, 0x77, 0x77, 0x20, + 0x72, 0x00, 0x02, 0x00, 0x2e, 0x08, 0x05, 0x68, + 0x6e, 0x00, 0x10, 0x00, 0x6e, 0x00, 0x11, 0x00, + 0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x15, 0x00, + 0x6e, 0x00, 0x16, 0x00, 0x6e, 0x00, 0x17, 0x00, + 0x6e, 0x00, 0x18, 0x00, 0xcc, 0x00, 0x0f, 0x80, + 0x00, 0x80, 0x10, 0x80, 0x2e, 0x08, 0x1a, 0x94, + 0x2e, 0x00, 0x54, 0xa1, 0x2e, 0x00, 0x54, 0xc1, + 0xff, 0xff, 0xfe, 0xff, 0x2e, 0x08, 0x48, 0x00, + 0x2e, 0x00, 0x54, 0x81, 0xb5, 0x90, 0x1c, 0x0c, + 0x1c, 0x07, 0xf0, 0x1e, 0xf9, 0x55, 0x2f, 0x01, + 0xda, 0x00, 0x27, 0x01, 0x4b, 0x0e, 0x42, 0x9f, + 0xdd, 0x00, 0x1c, 0x1f, 0x3f, 0x01, 0x04, 0x3f, + 0x4b, 0x0c, 0x18, 0xff, 0x21, 0x03, 0x48, 0x0c, + 0x60, 0x01, 0x60, 0x47, 0x21, 0x01, 0x60, 0x01, + 0x20, 0x01, 0x1c, 0x21, 0xf0, 0x1e, 0xf9, 0x0c, + 0xf0, 0x1e, 0xf9, 0x02, 0x23, 0x02, 0x43, 0xdb, + 0x40, 0x18, 0xf0, 0x1e, 0xf9, 0x01, 0xf0, 0x1e, + 0xf9, 0x6d, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x00, 0xfd, 0xe8, 0x00, 0x00, 0x9e, 0x34, + 0x6e, 0x00, 0x03, 0x00, 0xb5, 0x90, 0x1c, 0x0c, + 0x1c, 0x07, 0xf0, 0x1e, 0xf9, 0x29, 0x2f, 0x01, + 0xda, 0x00, 0x27, 0x01, 0x4b, 0x0e, 0x42, 0x9f, + 0xdd, 0x00, 0x1c, 0x1f, 0x3f, 0x01, 0x04, 0x3f, + 0x21, 0x03, 0x37, 0xff, 0x37, 0x96, 0x48, 0x0b, + 0x60, 0x01, 0x60, 0x47, 0x21, 0x01, 0x60, 0x01, + 0x20, 0x01, 0x1c, 0x21, 0xf0, 0x1e, 0xf8, 0xe0, + 0xf0, 0x1e, 0xf8, 0xd6, 0x23, 0x02, 0x43, 0xdb, + 0x40, 0x18, 0xf0, 0x1e, 0xf8, 0xd5, 0xf0, 0x1e, + 0xf9, 0x41, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x00, 0xfd, 0xe8, 0x6e, 0x00, 0x03, 0x00, + 0xb5, 0x00, 0xf0, 0x1e, 0xf9, 0x01, 0x20, 0x03, + 0x49, 0x05, 0x60, 0x08, 0xf0, 0x1e, 0xf8, 0xc0, + 0x23, 0x02, 0x43, 0x18, 0xf0, 0x1e, 0xf8, 0xc0, + 0xf0, 0x1e, 0xf9, 0x2c, 0xbc, 0x08, 0x47, 0x18, + 0x6e, 0x00, 0x03, 0x00, 0xb5, 0x90, 0x1c, 0x0c, + 0x1c, 0x07, 0xf0, 0x1e, 0xf8, 0xed, 0x2f, 0x01, + 0xda, 0x00, 0x27, 0x01, 0x4b, 0x0e, 0x42, 0x9f, + 0xdd, 0x00, 0x1c, 0x1f, 0x3f, 0x01, 0x04, 0x3f, + 0x4b, 0x0c, 0x18, 0xff, 0x21, 0x03, 0x48, 0x0c, + 0x60, 0x01, 0x60, 0x47, 0x21, 0x01, 0x60, 0x01, + 0x20, 0x05, 0x1c, 0x21, 0xf0, 0x1e, 0xf8, 0xa4, + 0xf0, 0x1e, 0xf8, 0x9a, 0x23, 0x20, 0x43, 0xdb, + 0x40, 0x18, 0xf0, 0x1e, 0xf8, 0x99, 0xf0, 0x1e, + 0xf9, 0x05, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x00, 0xfd, 0xe8, 0x00, 0x00, 0x9e, 0x34, + 0x6e, 0x00, 0x04, 0x00, 0xb5, 0x90, 0x1c, 0x0c, + 0x1c, 0x07, 0xf0, 0x1e, 0xf8, 0xc1, 0x2f, 0x01, + 0xda, 0x00, 0x27, 0x01, 0x4b, 0x0e, 0x42, 0x9f, + 0xdd, 0x00, 0x1c, 0x1f, 0x3f, 0x01, 0x04, 0x3f, + 0x21, 0x03, 0x37, 0xff, 0x37, 0x96, 0x48, 0x0b, + 0x60, 0x01, 0x60, 0x47, 0x21, 0x01, 0x60, 0x01, + 0x20, 0x05, 0x1c, 0x21, 0xf0, 0x1e, 0xf8, 0x78, + 0xf0, 0x1e, 0xf8, 0x6e, 0x23, 0x20, 0x43, 0xdb, + 0x40, 0x18, 0xf0, 0x1e, 0xf8, 0x6d, 0xf0, 0x1e, + 0xf8, 0xd9, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x00, 0xfd, 0xe8, 0x6e, 0x00, 0x04, 0x00, + 0xb5, 0x00, 0xf0, 0x1e, 0xf8, 0x99, 0x20, 0x03, + 0x49, 0x05, 0x60, 0x08, 0xf0, 0x1e, 0xf8, 0x58, + 0x23, 0x20, 0x43, 0x18, 0xf0, 0x1e, 0xf8, 0x58, + 0xf0, 0x1e, 0xf8, 0xc4, 0xbc, 0x08, 0x47, 0x18, + 0x6e, 0x00, 0x04, 0x00, 0xb5, 0x00, 0x48, 0x0b, + 0x68, 0x41, 0x31, 0x14, 0x60, 0x41, 0x68, 0x81, + 0x31, 0x01, 0x60, 0x81, 0x48, 0x08, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x28, 0x01, 0xd1, 0x01, + 0xf7, 0xfe, 0xfa, 0x52, 0xbc, 0x08, 0x47, 0x18, + 0x48, 0x04, 0x21, 0x10, 0xf0, 0x0f, 0xf8, 0x34, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, + 0x2e, 0x08, 0x04, 0xfc, 0x2e, 0x08, 0x05, 0xb4, + 0xb5, 0x00, 0xf0, 0x1e, 0xf8, 0x69, 0x21, 0x00, + 0x48, 0x08, 0x60, 0x41, 0x60, 0x81, 0x49, 0x08, + 0x20, 0x07, 0xf0, 0x1e, 0xf8, 0x2d, 0xf0, 0x1e, + 0xf8, 0x23, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x18, + 0xf0, 0x1e, 0xf8, 0x22, 0xf0, 0x1e, 0xf8, 0x8e, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, + 0x2e, 0x00, 0x58, 0xe1, 0x48, 0x01, 0x68, 0x40, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb4, + 0xb5, 0x90, 0x49, 0x0d, 0x1c, 0x0f, 0x48, 0x0d, + 0x24, 0x1e, 0x22, 0x10, 0x1c, 0x23, 0xf0, 0x0f, + 0xf9, 0x35, 0x22, 0x02, 0x21, 0x10, 0x1c, 0x38, + 0x1c, 0x23, 0xf0, 0x0b, 0xfb, 0x9d, 0x49, 0x08, + 0x20, 0x10, 0xf0, 0x1e, 0xf8, 0x05, 0xf0, 0x1d, + 0xff, 0xfb, 0x4b, 0x06, 0x40, 0x18, 0xf0, 0x1d, + 0xff, 0xfb, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x48, 0x10, 0x2e, 0x08, 0x05, 0xb4, + 0x2e, 0x00, 0x59, 0xa5, 0xff, 0xfe, 0xff, 0xff, + 0xb5, 0x00, 0xb0, 0x86, 0x46, 0x68, 0x49, 0x0c, + 0xc9, 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, + 0xc9, 0x0c, 0xc0, 0x0c, 0x48, 0x09, 0xab, 0x00, + 0xcb, 0x0e, 0xb0, 0x03, 0xf0, 0x0f, 0xf9, 0x3a, + 0xb0, 0x03, 0x48, 0x07, 0x68, 0x01, 0x08, 0x4a, + 0xd3, 0x04, 0x08, 0x49, 0x00, 0x49, 0x23, 0x04, + 0x43, 0x19, 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x48, 0x10, 0x2e, 0x08, 0x05, 0xb4, + 0x2e, 0x08, 0x00, 0x04, 0xb5, 0x80, 0x29, 0x0c, + 0xd2, 0x00, 0x21, 0x0c, 0x31, 0x07, 0x08, 0xc9, + 0x00, 0xc9, 0x27, 0x00, 0x68, 0x02, 0x42, 0x82, + 0xd0, 0x03, 0x68, 0x93, 0x42, 0x8b, 0xd3, 0x0d, + 0x1c, 0x17, 0x2f, 0x00, 0xd0, 0x1e, 0x68, 0xb8, + 0x1a, 0x42, 0x2a, 0x0c, 0xd2, 0x00, 0x1c, 0x01, + 0x1a, 0x42, 0xd1, 0x05, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x76, 0xe0, 0x0c, 0x68, 0x12, 0xe7, 0xea, + 0x1d, 0xca, 0x32, 0x01, 0x1a, 0x80, 0x60, 0xb8, + 0x19, 0xc0, 0x1d, 0xc7, 0x37, 0x01, 0x20, 0x00, + 0x60, 0x38, 0x60, 0x78, 0x60, 0xb9, 0x68, 0xb8, + 0x60, 0x38, 0x1d, 0xf8, 0x30, 0x01, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, 0x1f, 0xcc, + 0x3c, 0x01, 0x68, 0x21, 0x19, 0x0a, 0x60, 0xa1, + 0x68, 0x07, 0x32, 0x08, 0x42, 0x87, 0xd1, 0x06, + 0x68, 0x41, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x48, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x42, 0x97, + 0xd1, 0x0f, 0x68, 0x7d, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x46, 0x68, 0xa0, 0x68, 0xb9, 0x18, 0x40, + 0x30, 0x08, 0x60, 0xa0, 0x1c, 0x20, 0x1c, 0x29, + 0xf0, 0x00, 0xf8, 0x36, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0xbb, 0x19, 0xdb, 0x33, 0x08, + 0x42, 0xa3, 0xd1, 0x13, 0x68, 0xb8, 0x18, 0x40, + 0x30, 0x08, 0x60, 0xb8, 0x19, 0xc0, 0x68, 0x3c, + 0x30, 0x08, 0x42, 0xa0, 0xd1, 0xdc, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x29, 0x68, 0xb8, 0x68, 0xa1, + 0x18, 0x40, 0x30, 0x08, 0x60, 0xb8, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x42, 0xbc, 0xd2, 0x06, + 0x68, 0x79, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x14, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x3f, + 0xe7, 0xc0, 0xb5, 0x00, 0x31, 0x10, 0x32, 0x01, + 0x1c, 0x0b, 0x1a, 0x51, 0x39, 0x08, 0x60, 0x99, + 0x60, 0x00, 0x1c, 0x01, 0x60, 0x40, 0x1c, 0x18, + 0xf0, 0x00, 0xf8, 0x02, 0xbc, 0x08, 0x47, 0x18, + 0x68, 0x0a, 0x60, 0x02, 0x60, 0x08, 0x68, 0x02, + 0x60, 0x50, 0x60, 0x41, 0x47, 0x70, 0xc8, 0x06, + 0x38, 0x08, 0x60, 0x11, 0xc8, 0x03, 0x60, 0x41, + 0x47, 0x70, 0xb5, 0x00, 0x1c, 0x0a, 0x1c, 0x01, + 0x48, 0x02, 0xf7, 0xff, 0xff, 0xde, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xd8, + 0xb5, 0x90, 0x1c, 0x07, 0xf0, 0x1d, 0xff, 0x24, + 0x23, 0x11, 0x05, 0x1b, 0x1c, 0x04, 0x43, 0x18, + 0xf0, 0x1d, 0xff, 0x22, 0x1c, 0x39, 0x48, 0x05, + 0xf7, 0xff, 0xff, 0x50, 0x1c, 0x07, 0x1c, 0x20, + 0xf0, 0x1d, 0xff, 0x1a, 0x1c, 0x38, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xd8, + 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, + 0xff, 0x41, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xd8, 0xb5, 0x90, 0x1c, 0x07, + 0xd0, 0x0e, 0xf0, 0x1d, 0xff, 0x01, 0x23, 0x11, + 0x05, 0x1b, 0x1c, 0x04, 0x43, 0x18, 0xf0, 0x1d, + 0xfe, 0xff, 0x1c, 0x39, 0x48, 0x04, 0xf7, 0xff, + 0xff, 0x61, 0x1c, 0x20, 0xf0, 0x1d, 0xfe, 0xf8, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xd8, 0xb5, 0x00, 0x4a, 0x04, + 0xc2, 0x03, 0x1c, 0x0a, 0x1c, 0x01, 0x48, 0x03, + 0xf7, 0xff, 0xff, 0x97, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x05, 0xc0, 0x2e, 0x08, 0x05, 0xd0, + 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, + 0xff, 0x11, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xd0, 0xb5, 0x00, 0x49, 0x08, + 0x68, 0x0a, 0x42, 0x90, 0xd3, 0x02, 0x68, 0x49, + 0x42, 0x88, 0xd9, 0x03, 0xf7, 0xff, 0xff, 0xc6, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x01, 0x48, 0x03, + 0xf7, 0xff, 0xff, 0x30, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x05, 0xc0, 0x2e, 0x08, 0x05, 0xd0, + 0xb5, 0x00, 0x4a, 0x05, 0x60, 0x90, 0x60, 0xd1, + 0x1c, 0x0a, 0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, + 0xff, 0x68, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xc0, 0x2e, 0x08, 0x05, 0xe0, + 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, + 0xfe, 0xe1, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xe0, 0xb5, 0x00, 0x49, 0x08, + 0x68, 0x8a, 0x42, 0x90, 0xd3, 0x02, 0x68, 0xc9, + 0x42, 0x88, 0xd9, 0x03, 0xf7, 0xff, 0xff, 0x96, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x01, 0x48, 0x03, + 0xf7, 0xff, 0xff, 0x00, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x05, 0xc0, 0x2e, 0x08, 0x05, 0xe0, + 0xb5, 0xf0, 0x06, 0x07, 0x0e, 0x3f, 0x04, 0x09, + 0x0c, 0x09, 0xb0, 0x81, 0x91, 0x00, 0x06, 0x16, + 0x0e, 0x36, 0x00, 0xbd, 0x4c, 0x15, 0x59, 0x60, + 0x28, 0x00, 0xd1, 0x15, 0xf7, 0xfb, 0xfa, 0x06, + 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x22, 0x02, + 0x99, 0x01, 0x1c, 0x38, 0xf0, 0x0a, 0xfd, 0x5c, + 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, + 0x1c, 0x38, 0xb0, 0x01, 0xf0, 0x0a, 0xff, 0x18, + 0x20, 0x03, 0x00, 0x71, 0x4a, 0x0a, 0x52, 0x50, + 0x59, 0x60, 0x30, 0x01, 0x51, 0x60, 0x48, 0x09, + 0x23, 0x14, 0x5e, 0xc1, 0x29, 0x00, 0xd1, 0x02, + 0x49, 0x07, 0x4a, 0x08, 0x65, 0xd1, 0x8a, 0x81, + 0x31, 0x01, 0x82, 0x81, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0xca, 0x84, + 0x2e, 0x08, 0x4a, 0x20, 0x2e, 0x08, 0x07, 0x68, + 0x2e, 0x02, 0xc8, 0x94, 0xa0, 0x00, 0x0d, 0x00, + 0xb5, 0xb0, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x0c, + 0x0e, 0x24, 0x00, 0xb9, 0x48, 0x1a, 0x58, 0x42, + 0x3a, 0x01, 0x50, 0x42, 0xd1, 0x20, 0x23, 0x01, + 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x02, 0x1c, 0x38, + 0xf0, 0x0a, 0xfe, 0xe6, 0x22, 0x00, 0xb4, 0x04, + 0x25, 0x00, 0x1c, 0x38, 0x1c, 0x2b, 0x49, 0x13, + 0xf0, 0x0a, 0xfd, 0x1a, 0x00, 0x61, 0xb0, 0x01, + 0x48, 0x11, 0x52, 0x45, 0x48, 0x0f, 0x4a, 0x11, + 0x52, 0x50, 0x00, 0x79, 0x4a, 0x10, 0x52, 0x50, + 0x00, 0x62, 0x19, 0x12, 0x00, 0x92, 0x49, 0x0f, + 0x18, 0x53, 0x81, 0x1d, 0x52, 0x88, 0x80, 0x58, + 0x48, 0x0d, 0x8a, 0x81, 0x39, 0x01, 0x82, 0x81, + 0x23, 0x14, 0x5e, 0xc0, 0x28, 0x00, 0xd1, 0x03, + 0x20, 0xd7, 0x00, 0xc0, 0x49, 0x09, 0x65, 0xc8, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x02, 0xca, 0x84, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x4a, 0x20, 0x2e, 0x08, 0x49, 0xe0, + 0x2e, 0x08, 0x49, 0xa8, 0x2e, 0x08, 0x48, 0x28, + 0x2e, 0x08, 0x07, 0x68, 0xa0, 0x00, 0x0d, 0x00, + 0xb5, 0xf0, 0x04, 0x06, 0x0c, 0x36, 0x04, 0x0c, + 0x0c, 0x24, 0x1c, 0x17, 0xb0, 0x8a, 0x46, 0x69, + 0x1c, 0x30, 0x1c, 0x22, 0xf0, 0x00, 0xf8, 0xb0, + 0x23, 0x01, 0x1c, 0x05, 0x42, 0xd8, 0xd1, 0x03, + 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x4b, 0x4e, 0x42, 0x9c, 0xd1, 0x06, 0xa8, 0x00, + 0x88, 0x00, 0x1c, 0x31, 0x1c, 0x2a, 0xf7, 0xff, + 0xff, 0x57, 0xe0, 0x7f, 0x20, 0x20, 0x40, 0x20, + 0x28, 0x20, 0xd1, 0x1f, 0x06, 0x2a, 0x0e, 0x12, + 0xa8, 0x00, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, + 0x1c, 0x31, 0x1c, 0x23, 0xf7, 0xfd, 0xf8, 0x72, + 0x28, 0x00, 0xd0, 0x6f, 0x48, 0x42, 0x00, 0x69, + 0x4a, 0x42, 0x52, 0x50, 0xa9, 0x00, 0x88, 0x09, + 0x00, 0x49, 0x4a, 0x41, 0x52, 0x50, 0xa8, 0x00, + 0x88, 0x00, 0x1c, 0x29, 0xf0, 0x00, 0xf9, 0xce, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0a, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x21, 0x00, + 0xaa, 0x01, 0x88, 0x3b, 0x0a, 0x1b, 0x70, 0x13, + 0x88, 0x3b, 0x93, 0x09, 0x32, 0x01, 0x06, 0x1b, + 0xd0, 0x02, 0x1c, 0x48, 0x06, 0x00, 0x0e, 0x00, + 0x9b, 0x09, 0x70, 0x13, 0x31, 0x01, 0x32, 0x01, + 0x37, 0x02, 0x29, 0x0e, 0xdb, 0xed, 0x21, 0x00, + 0x23, 0x00, 0x70, 0x13, 0x31, 0x01, 0x32, 0x01, + 0x29, 0x04, 0xdb, 0xfa, 0x21, 0x0c, 0x40, 0x21, + 0x29, 0x0c, 0xd1, 0x03, 0x04, 0x21, 0x0c, 0x09, + 0x24, 0x01, 0x43, 0x0c, 0x28, 0x06, 0xdc, 0x0e, + 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a, + 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 0x06, 0x00, + 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc, + 0xfc, 0x4f, 0xb0, 0x01, 0xe0, 0x1e, 0x28, 0x0a, + 0xdc, 0x0e, 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, + 0x06, 0x2a, 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, + 0x06, 0x00, 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, + 0xf7, 0xfc, 0xfc, 0x58, 0xb0, 0x01, 0xe0, 0x0d, + 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a, + 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 0x06, 0x00, + 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc, + 0xfc, 0x63, 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x05, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0a, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 0xa8, 0x00, + 0x88, 0x00, 0x00, 0x6a, 0x19, 0x52, 0x00, 0x92, + 0x49, 0x0a, 0x52, 0x88, 0x18, 0x50, 0x80, 0x46, + 0x80, 0x84, 0x49, 0x05, 0x80, 0xc1, 0x21, 0x01, + 0x81, 0x01, 0x1c, 0x28, 0xb0, 0x0a, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xb9, 0x6a, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0xe0, + 0x2e, 0x08, 0x49, 0xa8, 0x2e, 0x08, 0x48, 0x28, + 0xb4, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x17, + 0x0c, 0x3f, 0xb0, 0x82, 0x48, 0x58, 0x22, 0x00, + 0x4d, 0x58, 0x95, 0x01, 0x1c, 0x06, 0x00, 0x53, + 0x9d, 0x01, 0x5a, 0xed, 0x42, 0xb5, 0xd1, 0x02, + 0x04, 0x10, 0x0c, 0x00, 0xe0, 0x02, 0x32, 0x01, + 0x2a, 0x20, 0xdb, 0xf4, 0x42, 0xb0, 0xd1, 0x04, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, + 0x47, 0x70, 0x80, 0x0e, 0x4a, 0x4e, 0x92, 0x00, + 0x4d, 0x4e, 0x4a, 0x4f, 0x4b, 0x4f, 0x42, 0x9f, + 0xd1, 0x32, 0x23, 0x00, 0x00, 0x5f, 0x5b, 0xd7, + 0x42, 0xa7, 0xd1, 0x0a, 0x00, 0x5f, 0x5b, 0xef, + 0x2f, 0x03, 0xd1, 0x01, 0x80, 0x0b, 0xe0, 0x07, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, + 0x47, 0x70, 0x33, 0x01, 0x2b, 0x1c, 0xdb, 0xed, + 0x88, 0x0f, 0x4b, 0x3f, 0x42, 0x9f, 0xd1, 0x0a, + 0x27, 0x00, 0x00, 0x7b, 0x5a, 0xd6, 0x4b, 0x3c, + 0x42, 0x9e, 0xd1, 0x01, 0x80, 0x0f, 0xe0, 0x02, + 0x37, 0x01, 0x2f, 0x1c, 0xdb, 0xf5, 0x88, 0x0f, + 0x4b, 0x37, 0x42, 0x9f, 0xd1, 0x04, 0x20, 0x00, + 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x23, 0x03, 0x00, 0x47, 0x9e, 0x00, 0x53, 0xf3, + 0x88, 0x0f, 0x00, 0x7f, 0x53, 0xeb, 0xe0, 0x54, + 0x23, 0x20, 0x40, 0x3b, 0x2b, 0x20, 0xd1, 0x1e, + 0x23, 0x00, 0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, + 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, 0x2b, 0x1c, + 0xdb, 0xf3, 0x27, 0x00, 0x00, 0x7b, 0x5a, 0xd5, + 0x42, 0xb5, 0xd1, 0x01, 0x80, 0x0f, 0xe0, 0x02, + 0x37, 0x01, 0x2f, 0x1c, 0xdb, 0xf6, 0x88, 0x0f, + 0x42, 0xb7, 0xd1, 0x36, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x23, 0x00, + 0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, 0xd1, 0x0a, + 0x00, 0x5f, 0x5b, 0xef, 0x2f, 0x02, 0xd1, 0x01, + 0x80, 0x0b, 0xe0, 0x07, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, + 0x2b, 0x1c, 0xdb, 0xed, 0x88, 0x0f, 0x4b, 0x14, + 0x42, 0x9f, 0xd1, 0x0a, 0x27, 0x00, 0x00, 0x7b, + 0x5a, 0xd6, 0x4b, 0x11, 0x42, 0x9e, 0xd1, 0x01, + 0x80, 0x0f, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1c, + 0xdb, 0xf5, 0x88, 0x0f, 0x4b, 0x0c, 0x42, 0x9f, + 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x23, 0x02, 0x00, 0x47, + 0x9e, 0x00, 0x53, 0xf3, 0x88, 0x0f, 0x00, 0x7f, + 0x53, 0xeb, 0x00, 0x43, 0x9d, 0x01, 0x52, 0xec, + 0x88, 0x09, 0x00, 0x49, 0x52, 0x54, 0x04, 0x00, + 0x14, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0xe0, + 0x2e, 0x08, 0x4a, 0x20, 0x2e, 0x08, 0x4a, 0x60, + 0x2e, 0x08, 0x49, 0xa8, 0x00, 0x00, 0xb9, 0x6a, + 0xb5, 0xf0, 0x04, 0x07, 0x0c, 0x3f, 0xb0, 0x81, + 0x4a, 0x34, 0x92, 0x00, 0x1c, 0x11, 0x42, 0x97, + 0xd0, 0x01, 0x2f, 0x20, 0xdb, 0x05, 0x20, 0x00, + 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x7c, 0x4a, 0x2e, 0x5b, 0x10, + 0x42, 0x88, 0xd1, 0x05, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x49, 0x28, 0x53, 0x11, 0x23, 0x00, 0x49, 0x29, + 0x00, 0x5e, 0x5b, 0x8e, 0x42, 0x86, 0xd1, 0x02, + 0x04, 0x1d, 0x0c, 0x2d, 0xe0, 0x02, 0x33, 0x01, + 0x2b, 0x1c, 0xdb, 0xf5, 0x23, 0x00, 0x00, 0x5e, + 0x5b, 0x96, 0x42, 0x86, 0xd1, 0x03, 0x04, 0x1a, + 0x0c, 0x12, 0x92, 0x00, 0xe0, 0x02, 0x33, 0x01, + 0x2b, 0x20, 0xdb, 0xf4, 0x9a, 0x00, 0x4e, 0x1b, + 0x42, 0xb2, 0xd1, 0x0d, 0x22, 0x00, 0x00, 0x53, + 0x5a, 0xcb, 0x42, 0x83, 0xd1, 0x05, 0x23, 0x00, + 0x00, 0x50, 0x4a, 0x19, 0x52, 0x13, 0x52, 0x0e, + 0xe0, 0x02, 0x32, 0x01, 0x2a, 0x1c, 0xdb, 0xf2, + 0x4e, 0x16, 0x5b, 0x30, 0x28, 0x02, 0xd1, 0x05, + 0x23, 0x00, 0x53, 0x33, 0x1c, 0x28, 0x1c, 0x39, + 0xf0, 0x00, 0xf8, 0x38, 0x5b, 0x30, 0x28, 0x01, + 0xd1, 0x0a, 0x1c, 0x38, 0xf7, 0xfc, 0xff, 0xe6, + 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x5b, 0x30, 0x28, 0x03, 0xd1, 0x03, 0x1c, 0x28, + 0x1c, 0x39, 0xf7, 0xff, 0xfd, 0xcd, 0x04, 0x38, + 0x14, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x49, 0xe0, 0x2e, 0x08, 0x49, 0xa8, + 0x2e, 0x08, 0x4a, 0x60, 0x2e, 0x08, 0x4a, 0x20, + 0x04, 0x01, 0x0c, 0x09, 0x20, 0x02, 0x00, 0x4b, + 0x18, 0x5b, 0x00, 0x9b, 0x4a, 0x03, 0x18, 0x99, + 0x81, 0x08, 0x48, 0x03, 0x52, 0xd0, 0x80, 0x48, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x48, 0x28, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x04, 0x0f, + 0x0c, 0x3f, 0x06, 0x39, 0x0e, 0x09, 0x06, 0x00, + 0x0e, 0x00, 0xf7, 0xfc, 0xfc, 0x1b, 0x20, 0x00, + 0x00, 0x7b, 0x19, 0xdb, 0x00, 0x9b, 0x4a, 0x04, + 0x18, 0x99, 0x81, 0x08, 0x48, 0x03, 0x52, 0xd0, + 0x80, 0x48, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x48, 0x28, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0x80, 0x04, 0x09, 0x0c, 0x09, 0x78, 0x42, + 0x02, 0x12, 0x78, 0x83, 0x43, 0x1a, 0x05, 0x12, + 0x0d, 0x12, 0x27, 0x00, 0x43, 0xff, 0x32, 0x03, + 0x42, 0x8a, 0xd0, 0x03, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x0b, 0xf9, 0xa0, + 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9c, 0x09, + 0x04, 0x00, 0x0c, 0x00, 0xb0, 0x81, 0x90, 0x00, + 0x06, 0x09, 0x0e, 0x09, 0x06, 0x12, 0x0e, 0x12, + 0xb0, 0x88, 0x4f, 0x16, 0x68, 0xb8, 0x28, 0x0c, + 0xdb, 0x06, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x09, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0x23, 0x00, 0x00, 0x45, 0x46, 0x6e, + 0x53, 0x73, 0x30, 0x01, 0x04, 0x00, 0x14, 0x00, + 0x28, 0x10, 0xdb, 0xf7, 0x02, 0x08, 0x43, 0x10, + 0xab, 0x00, 0x80, 0x18, 0x46, 0x6a, 0x21, 0x04, + 0x98, 0x08, 0xf7, 0xff, 0xfd, 0x95, 0x28, 0x00, + 0xda, 0x01, 0xb0, 0x09, 0xe7, 0xe4, 0x00, 0x81, + 0x4a, 0x05, 0x50, 0x54, 0x9b, 0x0c, 0x4a, 0x05, + 0x50, 0x53, 0x68, 0xb9, 0x31, 0x01, 0x60, 0xb9, + 0xb0, 0x09, 0xe7, 0xd9, 0x2e, 0x08, 0x07, 0x80, + 0x2e, 0x08, 0x4b, 0x18, 0x2e, 0x08, 0x4a, 0x98, + 0xb5, 0x80, 0x04, 0x07, 0x14, 0x3f, 0xd5, 0x04, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0xf4, + 0x20, 0x00, 0x00, 0xb9, 0x4a, 0x05, 0x50, 0x50, + 0x4a, 0x05, 0x50, 0x50, 0x49, 0x05, 0x68, 0x8a, + 0x3a, 0x01, 0x60, 0x8a, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x4a, 0x98, + 0x2e, 0x08, 0x4b, 0x18, 0x2e, 0x08, 0x07, 0x80, + 0xb5, 0x90, 0x27, 0x00, 0x4c, 0x08, 0x00, 0xb8, + 0x58, 0x20, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38, + 0xf7, 0xff, 0xff, 0xd6, 0x37, 0x01, 0x2f, 0x20, + 0xdb, 0xf5, 0x20, 0x00, 0x49, 0x03, 0x60, 0xc8, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x4a, 0x98, 0x2e, 0x08, 0x07, 0x80, + 0xb5, 0x00, 0xf7, 0xff, 0xff, 0xe5, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0xff, 0x04, 0x00, 0x14, 0x00, + 0xb0, 0x83, 0x90, 0x00, 0x1c, 0x0f, 0x04, 0x11, + 0x0c, 0x09, 0x24, 0x00, 0x1c, 0x38, 0x1c, 0x0d, + 0xb0, 0x81, 0xf7, 0xff, 0xff, 0x59, 0x1c, 0x01, + 0x20, 0x00, 0x29, 0x00, 0xd0, 0x04, 0xb0, 0x04, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x78, 0xf9, 0x02, 0x09, 0x79, 0x3a, 0x43, 0x11, + 0x04, 0x09, 0x0c, 0x09, 0x9b, 0x07, 0x88, 0x1a, + 0x42, 0x91, 0xd0, 0x01, 0xb0, 0x04, 0xe7, 0xef, + 0x7a, 0x39, 0x02, 0x09, 0x7a, 0x7a, 0x43, 0x11, + 0x04, 0xc9, 0x0c, 0xc9, 0x91, 0x00, 0x7a, 0xb9, + 0x02, 0x09, 0x7a, 0xfa, 0x43, 0x11, 0x05, 0x0b, + 0x0d, 0x1b, 0x1d, 0xf9, 0x31, 0x05, 0x27, 0x00, + 0x1d, 0xd8, 0x30, 0x09, 0x1a, 0x2a, 0x2b, 0x00, + 0xdd, 0x0a, 0x78, 0x08, 0x28, 0x09, 0xd1, 0x00, + 0x37, 0x01, 0x78, 0x48, 0x1c, 0x85, 0x1b, 0x5b, + 0x18, 0x40, 0x1c, 0x81, 0x2b, 0x00, 0xdc, 0xf4, + 0x2a, 0x00, 0xdd, 0x36, 0x48, 0x2c, 0x88, 0x06, + 0x96, 0x03, 0x88, 0x85, 0x95, 0x02, 0x78, 0xc8, + 0x02, 0x00, 0x79, 0x0b, 0x43, 0x18, 0x05, 0x00, + 0x0d, 0x00, 0x78, 0x0b, 0x2b, 0x01, 0xd0, 0x01, + 0x2b, 0x02, 0xd1, 0x06, 0x78, 0x4d, 0x02, 0x2d, + 0x78, 0x8e, 0x43, 0x35, 0x04, 0xed, 0x0c, 0xed, + 0x9e, 0x03, 0x2b, 0x04, 0xd0, 0x01, 0x2b, 0x03, + 0xd1, 0x09, 0x78, 0x4b, 0x02, 0x1b, 0x78, 0x8d, + 0x43, 0x2b, 0x04, 0xdb, 0x0c, 0xdb, 0x9d, 0x02, + 0x42, 0xab, 0xd1, 0x00, 0x24, 0x01, 0x1d, 0x43, + 0x1a, 0xd2, 0x31, 0x05, 0x28, 0x00, 0xdd, 0x0a, + 0x78, 0x0b, 0x2b, 0x09, 0xd1, 0x00, 0x37, 0x01, + 0x78, 0x4b, 0x1c, 0x9d, 0x1b, 0x40, 0x18, 0x59, + 0x31, 0x02, 0x28, 0x00, 0xdc, 0xf4, 0x2a, 0x00, + 0xdc, 0xcd, 0x2c, 0x00, 0xd0, 0x17, 0xf7, 0xff, + 0xff, 0x63, 0x99, 0x00, 0x48, 0x0f, 0x80, 0x01, + 0x2f, 0x00, 0xd0, 0x0d, 0x20, 0x0a, 0xb0, 0x84, + 0xab, 0x00, 0x80, 0x18, 0x20, 0x02, 0x70, 0x98, + 0x9b, 0x0b, 0x93, 0x01, 0x46, 0x69, 0x20, 0x75, + 0xf0, 0x04, 0xff, 0x76, 0xb0, 0x04, 0xe0, 0x07, + 0xf7, 0xfa, 0xf8, 0xf4, 0xe0, 0x04, 0x98, 0x01, + 0xf7, 0xff, 0xff, 0x2a, 0xf0, 0x00, 0xf8, 0x22, + 0x20, 0x00, 0xb0, 0x04, 0xe7, 0x74, 0x00, 0x00, + 0x2e, 0x08, 0x07, 0x80, 0x2e, 0x08, 0x00, 0x08, + 0xb4, 0x90, 0x04, 0x02, 0x0c, 0x12, 0x04, 0x0f, + 0x0c, 0x3f, 0x4b, 0x07, 0x68, 0xd8, 0x28, 0x80, + 0xda, 0x08, 0x2a, 0x00, 0xd0, 0x06, 0x00, 0x41, + 0x4c, 0x04, 0x52, 0x67, 0x4f, 0x04, 0x52, 0x7a, + 0x30, 0x01, 0x60, 0xd8, 0xbc, 0x90, 0x47, 0x70, + 0x2e, 0x08, 0x07, 0x80, 0x2e, 0x08, 0x4b, 0x98, + 0x2e, 0x08, 0x4c, 0x98, 0xb5, 0x90, 0x4f, 0x13, + 0x24, 0x00, 0x43, 0xe4, 0x68, 0xf8, 0x28, 0x00, + 0xd1, 0x03, 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x40, 0x49, 0x0e, 0x18, 0x41, + 0x1e, 0x8a, 0xb4, 0x04, 0x49, 0x0d, 0x18, 0x40, + 0x38, 0x40, 0x8f, 0xc0, 0x4b, 0x0c, 0x22, 0xff, + 0x21, 0x02, 0xf7, 0xff, 0xfe, 0xaf, 0xb0, 0x01, + 0x28, 0x00, 0xda, 0x03, 0x1c, 0x20, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x68, 0xf8, 0x38, 0x01, + 0x60, 0xf8, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x07, 0x80, + 0x2e, 0x08, 0x4c, 0x98, 0x2e, 0x08, 0x4b, 0x98, + 0x2e, 0x00, 0x62, 0xef, 0xb5, 0xf0, 0x04, 0x05, + 0x14, 0x2d, 0x1c, 0x0f, 0x04, 0x11, 0x0c, 0x09, + 0x1c, 0x0e, 0x4c, 0x28, 0x23, 0x02, 0x69, 0x20, + 0x42, 0xd8, 0xd0, 0x04, 0x1c, 0x38, 0xf7, 0xff, + 0xfe, 0x6b, 0x28, 0x00, 0xd0, 0x06, 0x1c, 0x28, + 0xf7, 0xff, 0xfe, 0xc2, 0x20, 0x00, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x79, 0xb8, 0x69, 0x21, + 0x42, 0x88, 0xd1, 0x09, 0x20, 0x01, 0x43, 0xc0, + 0x61, 0x20, 0x1c, 0x28, 0xf7, 0xff, 0xfe, 0xb4, + 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x23, 0x01, 0x42, 0xd9, 0xd1, 0x02, 0x61, 0x20, + 0x20, 0x00, 0x60, 0xe0, 0x37, 0x08, 0x1f, 0xf4, + 0x3c, 0x05, 0x2c, 0x00, 0xdd, 0x11, 0x78, 0x38, + 0x02, 0x00, 0x78, 0x79, 0x43, 0x08, 0x04, 0x00, + 0x0c, 0x00, 0x78, 0xb9, 0x02, 0x09, 0x78, 0xfa, + 0x43, 0x11, 0x04, 0xc9, 0x0c, 0xc9, 0xf7, 0xff, + 0xff, 0x77, 0x37, 0x04, 0x3c, 0x04, 0x2c, 0x00, + 0xdc, 0xed, 0xf7, 0xff, 0xff, 0x8b, 0xf7, 0xff, + 0xff, 0x89, 0xf7, 0xff, 0xff, 0x87, 0xf7, 0xff, + 0xff, 0x85, 0xf7, 0xff, 0xff, 0x83, 0xf7, 0xff, + 0xff, 0x81, 0xf7, 0xff, 0xff, 0x7f, 0xf7, 0xff, + 0xff, 0x7d, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x07, 0x80, + 0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, + 0x0c, 0x2d, 0x26, 0x00, 0x43, 0xf6, 0x4f, 0x0f, + 0x62, 0x3e, 0x61, 0xfe, 0x61, 0xbe, 0xf7, 0xff, + 0xfe, 0x8f, 0x2d, 0x00, 0xd0, 0x13, 0x2c, 0x00, + 0xd0, 0x11, 0x0c, 0xf0, 0x42, 0x85, 0xd0, 0x0e, + 0x42, 0x84, 0xd0, 0x0c, 0x80, 0x3c, 0x80, 0xbd, + 0x20, 0x00, 0x61, 0x3e, 0x22, 0x00, 0x61, 0x78, + 0xb4, 0x04, 0x4b, 0x05, 0x22, 0xff, 0x21, 0x00, + 0xf7, 0xff, 0xfe, 0x1c, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x07, 0x80, + 0x2e, 0x00, 0x64, 0xc9, 0x56, 0x47, 0x41, 0x38, + 0x78, 0x31, 0x36, 0x00, 0xb5, 0x00, 0xb0, 0x81, + 0x48, 0x05, 0x69, 0xc0, 0x68, 0x80, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x00, 0xf0, 0x13, 0xfa, 0x22, + 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x92, 0x7c, 0xb5, 0xf0, 0x27, 0x00, + 0xb0, 0x85, 0x97, 0x00, 0x26, 0x10, 0x96, 0x01, + 0x25, 0x05, 0x01, 0xed, 0x95, 0x02, 0x20, 0xff, + 0x30, 0xd1, 0x90, 0x03, 0x97, 0x04, 0x22, 0x00, + 0x21, 0x00, 0xb4, 0x06, 0x4c, 0x0d, 0x69, 0xe0, + 0x68, 0x81, 0x1c, 0x08, 0xaa, 0x02, 0x1c, 0x3b, + 0xf0, 0x13, 0xfc, 0x8a, 0xb0, 0x02, 0x97, 0x00, + 0x20, 0xff, 0x30, 0xd1, 0x90, 0x01, 0x95, 0x02, + 0x96, 0x03, 0x97, 0x04, 0x69, 0xe0, 0x68, 0x80, + 0x46, 0x69, 0xf0, 0x13, 0xfb, 0xbb, 0xf7, 0xff, + 0xff, 0xc9, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0x90, 0x20, 0x07, 0xb0, 0x85, 0xf0, 0x08, + 0xff, 0xaf, 0x24, 0xff, 0x34, 0xe1, 0x22, 0x05, + 0x01, 0xd2, 0x21, 0x00, 0x20, 0x07, 0x1c, 0x23, + 0xf0, 0x08, 0xff, 0xbe, 0x27, 0x00, 0x22, 0x00, + 0x21, 0x02, 0x20, 0x07, 0x1c, 0x3b, 0xf0, 0x09, + 0xfb, 0x67, 0x22, 0x01, 0x21, 0x01, 0x20, 0x07, + 0x1c, 0x3b, 0xf0, 0x09, 0xfb, 0x19, 0x22, 0x32, + 0x21, 0x32, 0x20, 0x07, 0xf0, 0x09, 0xf8, 0x74, + 0x97, 0x00, 0x97, 0x01, 0x20, 0x05, 0x01, 0xc0, + 0x90, 0x02, 0x94, 0x03, 0x97, 0x04, 0x48, 0x06, + 0x69, 0xc0, 0x68, 0x80, 0x46, 0x69, 0xf0, 0x13, + 0xfb, 0x85, 0xf7, 0xff, 0xff, 0x93, 0xb0, 0x05, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x92, 0x7c, 0xb4, 0x80, 0x01, 0x00, + 0x4b, 0x2a, 0x18, 0xc0, 0x4b, 0x2a, 0x69, 0xdb, + 0x69, 0x9f, 0x00, 0x8b, 0x18, 0x59, 0x02, 0x09, + 0x18, 0x89, 0x18, 0x79, 0x78, 0x02, 0x70, 0x0a, + 0x78, 0x42, 0x1d, 0xcb, 0x33, 0x39, 0x74, 0x1a, + 0x78, 0x82, 0x1d, 0xcb, 0x33, 0x99, 0x70, 0x1a, + 0x78, 0xc2, 0x1d, 0xcb, 0x33, 0xd9, 0x74, 0x1a, + 0x79, 0x02, 0x1d, 0xcb, 0x33, 0xff, 0x33, 0x3a, + 0x70, 0x1a, 0x79, 0x42, 0x1d, 0xcb, 0x33, 0xff, + 0x33, 0x7a, 0x74, 0x1a, 0x79, 0x82, 0x1d, 0xcb, + 0x33, 0xff, 0x33, 0xda, 0x70, 0x1a, 0x79, 0xc2, + 0x23, 0x11, 0x01, 0x5b, 0x18, 0xcb, 0x74, 0x1a, + 0x7a, 0x02, 0x23, 0x05, 0x01, 0xdb, 0x18, 0xcb, + 0x70, 0x1a, 0x7a, 0x42, 0x23, 0x0b, 0x01, 0x9b, + 0x18, 0xcb, 0x74, 0x1a, 0x7a, 0x82, 0x23, 0x19, + 0x01, 0x5b, 0x18, 0xcb, 0x70, 0x1a, 0x7a, 0xc2, + 0x23, 0x1b, 0x01, 0x5b, 0x18, 0xcb, 0x74, 0x1a, + 0x7b, 0x02, 0x23, 0x0f, 0x01, 0x9b, 0x18, 0xcb, + 0x70, 0x1a, 0x7b, 0x42, 0x23, 0x01, 0x02, 0x9b, + 0x18, 0xcb, 0x74, 0x1a, 0x7b, 0x82, 0x23, 0x23, + 0x01, 0x5b, 0x18, 0xcb, 0x70, 0x1a, 0x7b, 0xc0, + 0x23, 0x25, 0x01, 0x5b, 0x18, 0xc9, 0x74, 0x08, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x07, 0xa4, + 0x2e, 0x08, 0x92, 0x7c, 0xb5, 0xb0, 0x23, 0x00, + 0x1c, 0x07, 0x56, 0xc0, 0x1c, 0x14, 0x1c, 0x0d, + 0x28, 0x00, 0xd0, 0x0f, 0x20, 0x50, 0x1c, 0x21, + 0xf0, 0x17, 0xfd, 0x3e, 0x19, 0x41, 0x23, 0x00, + 0x56, 0xf8, 0x1c, 0x22, 0xf7, 0xff, 0xff, 0x92, + 0x23, 0x00, 0x37, 0x01, 0x56, 0xf8, 0x34, 0x01, + 0x28, 0x00, 0xd1, 0xef, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x90, 0x06, 0x00, 0x0e, 0x00, + 0x04, 0x09, 0x14, 0x09, 0x04, 0x17, 0x14, 0x3f, + 0x09, 0x03, 0xb0, 0x81, 0x4a, 0x08, 0x5c, 0xd4, + 0xab, 0x00, 0x70, 0x1c, 0x07, 0x00, 0x0f, 0x00, + 0x5c, 0x10, 0x70, 0x58, 0x20, 0x00, 0x70, 0x98, + 0x46, 0x68, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xce, + 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x17, 0xbc, 0xb5, 0x90, 0x04, 0x00, + 0x0c, 0x00, 0x04, 0x09, 0x14, 0x09, 0x04, 0x17, + 0x14, 0x3f, 0x0b, 0x03, 0xb0, 0x82, 0x4a, 0x0f, + 0x5c, 0xd4, 0xab, 0x00, 0x70, 0x1c, 0x0a, 0x03, + 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xd4, 0xab, 0x00, + 0x70, 0x5c, 0x09, 0x03, 0x07, 0x1b, 0x0f, 0x1b, + 0x5c, 0xd4, 0xab, 0x00, 0x70, 0x9c, 0x07, 0x00, + 0x0f, 0x00, 0x5c, 0x10, 0x70, 0xd8, 0x20, 0x00, + 0x71, 0x18, 0x46, 0x68, 0x1c, 0x3a, 0xf7, 0xff, + 0xff, 0xa5, 0xb0, 0x02, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xbc, + 0xb5, 0x90, 0x04, 0x0f, 0x14, 0x3f, 0x04, 0x12, + 0x14, 0x12, 0x0f, 0x03, 0xb0, 0x83, 0x49, 0x1b, + 0x5c, 0xcc, 0xab, 0x00, 0x70, 0x1c, 0x0e, 0x03, + 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x00, + 0x70, 0x5c, 0x0d, 0x03, 0x07, 0x1b, 0x0f, 0x1b, + 0x5c, 0xcc, 0xab, 0x00, 0x70, 0x9c, 0x0c, 0x03, + 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x00, + 0x70, 0xdc, 0x0b, 0x03, 0x07, 0x1b, 0x0f, 0x1b, + 0x5c, 0xcc, 0xab, 0x01, 0x70, 0x1c, 0x0a, 0x03, + 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x01, + 0x70, 0x5c, 0x09, 0x03, 0x07, 0x1b, 0x0f, 0x1b, + 0x5c, 0xcc, 0xab, 0x01, 0x70, 0x9c, 0x07, 0x00, + 0x0f, 0x00, 0x5c, 0x08, 0x70, 0xd8, 0x20, 0x00, + 0x71, 0x18, 0x46, 0x68, 0x1c, 0x39, 0xf7, 0xff, + 0xff, 0x65, 0xb0, 0x03, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xbc, + 0xb5, 0xf0, 0x1c, 0x04, 0x04, 0x10, 0x14, 0x00, + 0xb0, 0x81, 0x90, 0x00, 0x04, 0x1e, 0x14, 0x36, + 0x22, 0x3c, 0x1c, 0x20, 0x1c, 0x0f, 0xb0, 0x85, + 0xf0, 0x17, 0xfc, 0xd2, 0xa3, 0x72, 0xcb, 0x0c, + 0xf0, 0x17, 0xfc, 0xde, 0xf0, 0x17, 0xfc, 0xe0, + 0x4d, 0x71, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x18, + 0x22, 0x38, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0xc3, 0xa3, 0x6b, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0xcf, 0xf0, 0x17, 0xfc, 0xd1, 0x5c, 0x28, + 0xab, 0x02, 0x70, 0x58, 0x22, 0x34, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0xb5, 0xa3, 0x64, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0xc1, 0xf0, 0x17, + 0xfc, 0xc3, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x98, + 0x22, 0x30, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0xa7, 0xa3, 0x5d, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0xb3, 0xf0, 0x17, 0xfc, 0xb5, 0x5c, 0x28, + 0xab, 0x02, 0x70, 0xd8, 0x22, 0x2c, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x99, 0xa3, 0x56, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0xa5, 0xf0, 0x17, + 0xfc, 0xa7, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x18, + 0x22, 0x28, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0x8b, 0xa3, 0x4f, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0x97, 0xf0, 0x17, 0xfc, 0x99, 0x5c, 0x28, + 0xab, 0x03, 0x70, 0x58, 0x22, 0x24, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x7d, 0xa3, 0x48, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x89, 0xf0, 0x17, + 0xfc, 0x8b, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x98, + 0x22, 0x20, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0x6f, 0xa3, 0x41, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0x7b, 0xf0, 0x17, 0xfc, 0x7d, 0x5c, 0x28, + 0xab, 0x03, 0x70, 0xd8, 0x22, 0x1c, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x61, 0xa3, 0x3a, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x6d, 0xf0, 0x17, + 0xfc, 0x6f, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x18, + 0x22, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0x53, 0xa3, 0x33, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0x5f, 0xf0, 0x17, 0xfc, 0x61, 0x5c, 0x28, + 0xab, 0x00, 0x70, 0x58, 0x22, 0x14, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x45, 0xa3, 0x2c, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x51, 0xf0, 0x17, + 0xfc, 0x53, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x98, + 0x22, 0x10, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0x37, 0xa3, 0x25, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0x43, 0xf0, 0x17, 0xfc, 0x45, 0x5c, 0x28, + 0xab, 0x00, 0x70, 0xd8, 0x22, 0x0c, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x29, 0xa3, 0x1e, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x35, 0xf0, 0x17, + 0xfc, 0x37, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x18, + 0x22, 0x08, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, + 0xfc, 0x1b, 0xa3, 0x17, 0xcb, 0x0c, 0xf0, 0x17, + 0xfc, 0x27, 0xf0, 0x17, 0xfc, 0x29, 0x5c, 0x28, + 0xab, 0x01, 0x70, 0x58, 0x22, 0x04, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x0d, 0xa3, 0x10, + 0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x19, 0xf0, 0x17, + 0xfc, 0x1b, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x98, + 0xa3, 0x0b, 0xcb, 0x0c, 0x1c, 0x20, 0x1c, 0x39, + 0xf0, 0x17, 0xfc, 0x0e, 0xf0, 0x17, 0xfc, 0x10, + 0x5c, 0x28, 0xab, 0x01, 0x70, 0xd8, 0x20, 0x00, + 0x73, 0x18, 0x46, 0x68, 0x99, 0x05, 0x1c, 0x32, + 0x33, 0x0c, 0xf7, 0xff, 0xfe, 0x6f, 0xb0, 0x06, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x17, 0xbc, 0x21, 0x00, 0xb0, 0x81, + 0x91, 0x00, 0xe0, 0x02, 0x99, 0x00, 0x31, 0x01, + 0x91, 0x00, 0x99, 0x00, 0x42, 0x81, 0xdb, 0xf9, + 0xb0, 0x01, 0x47, 0x70, 0xb5, 0xf0, 0x06, 0x06, + 0x0e, 0x36, 0x25, 0x02, 0x48, 0x0d, 0x60, 0x05, + 0x27, 0x07, 0x4c, 0x0d, 0x60, 0x25, 0x20, 0x01, + 0x40, 0xb8, 0x40, 0x30, 0xd0, 0x01, 0x20, 0x03, + 0xe0, 0x00, 0x20, 0x02, 0x49, 0x09, 0x60, 0x08, + 0x20, 0x0a, 0xf7, 0xff, 0xff, 0xdf, 0x20, 0x03, + 0x60, 0x20, 0x20, 0x0c, 0xf7, 0xff, 0xff, 0xda, + 0x3f, 0x01, 0xd5, 0xeb, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x6e, 0x00, 0x14, 0x00, + 0x6e, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x12, 0x00, + 0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x0f, + 0x0e, 0x3f, 0x06, 0x00, 0x0e, 0x00, 0x23, 0x80, + 0x43, 0x18, 0xf7, 0xff, 0xff, 0xcf, 0x20, 0x14, + 0xf7, 0xff, 0xff, 0xc0, 0x1c, 0x38, 0xf7, 0xff, + 0xff, 0xc9, 0x20, 0x03, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x00, 0x49, 0x04, 0x60, 0x08, 0x49, 0x04, + 0x60, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x12, 0x00, + 0x6e, 0x00, 0x13, 0x00, 0xb5, 0x00, 0x21, 0x01, + 0x20, 0x02, 0xf7, 0xff, 0xff, 0xd9, 0x48, 0x10, + 0xf7, 0xff, 0xff, 0xa4, 0x21, 0x00, 0x20, 0x02, + 0xf7, 0xff, 0xff, 0xd2, 0x48, 0x0d, 0xf7, 0xff, + 0xff, 0x9d, 0x21, 0x44, 0x20, 0x00, 0xf7, 0xff, + 0xff, 0xcb, 0x21, 0x81, 0x20, 0x01, 0xf7, 0xff, + 0xff, 0xc7, 0x21, 0xf0, 0x20, 0x02, 0xf7, 0xff, + 0xff, 0xc3, 0x21, 0x45, 0x20, 0x03, 0xf7, 0xff, + 0xff, 0xbf, 0x21, 0x45, 0x20, 0x04, 0xf7, 0xff, + 0xff, 0xbb, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0xc3, 0x50, + 0xb5, 0x80, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x08, + 0x0e, 0x00, 0x28, 0x45, 0xdd, 0x00, 0x20, 0x45, + 0x1d, 0xc1, 0x31, 0x79, 0x20, 0x03, 0xf7, 0xff, + 0xff, 0xa7, 0x2f, 0x45, 0xdd, 0x00, 0x27, 0x45, + 0x20, 0x04, 0x1d, 0xf9, 0x31, 0x79, 0xf7, 0xff, + 0xff, 0x9f, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x00, 0xf0, 0x1c, 0xfe, 0xcd, 0x23, 0x01, + 0x03, 0x5b, 0x43, 0x18, 0xf0, 0x1c, 0xfe, 0xcc, + 0xf0, 0x1c, 0xfe, 0xc6, 0x23, 0x01, 0x03, 0x9b, + 0x43, 0x18, 0xf0, 0x1c, 0xfe, 0xc5, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x00, 0xf0, 0x1c, 0xfe, 0xbc, + 0x4b, 0x05, 0x40, 0x18, 0xf0, 0x1c, 0xfe, 0xbc, + 0xf0, 0x1c, 0xfe, 0xb6, 0x4b, 0x03, 0x40, 0x18, + 0xf0, 0x1c, 0xfe, 0xb6, 0xbc, 0x08, 0x47, 0x18, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xb5, 0x80, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0xd8, + 0x07, 0xf8, 0x0f, 0x40, 0x49, 0x0a, 0x58, 0x08, + 0x0c, 0x39, 0xd3, 0x05, 0x23, 0x01, 0x02, 0x5b, + 0x68, 0x01, 0x43, 0x19, 0x60, 0x01, 0xe0, 0x03, + 0x68, 0x01, 0x4b, 0x06, 0x40, 0x19, 0x60, 0x01, + 0xf0, 0x13, 0xff, 0x5e, 0xf7, 0xff, 0xff, 0xd5, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0x44, 0xff, 0xff, 0xfd, 0xff, + 0xb5, 0x00, 0x4a, 0x09, 0x1f, 0x11, 0x20, 0x0e, + 0xf0, 0x13, 0xff, 0x08, 0x28, 0x00, 0xd1, 0x09, + 0x48, 0x06, 0xf0, 0x13, 0xff, 0x49, 0x49, 0x06, + 0x20, 0x0e, 0xf0, 0x1c, 0xfe, 0x85, 0xf7, 0xff, + 0xff, 0xbc, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x17, 0xe0, 0x2e, 0x08, 0x1a, 0x38, + 0x2e, 0x00, 0x6c, 0xab, 0xb5, 0x00, 0xf7, 0xff, + 0xff, 0x9f, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x1c, + 0xfe, 0x73, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, + 0xa0, 0x0d, 0x22, 0x00, 0x21, 0x0b, 0xf7, 0xff, + 0xfd, 0x61, 0x4f, 0x0d, 0x22, 0x0a, 0x21, 0x0b, + 0x68, 0x38, 0xf7, 0xff, 0xfd, 0xbd, 0x68, 0x38, + 0x30, 0x01, 0x60, 0x38, 0x48, 0x09, 0x7c, 0x01, + 0x29, 0x01, 0xd1, 0x05, 0x69, 0x41, 0x29, 0xff, + 0xd0, 0x02, 0x20, 0x01, 0xf0, 0x00, 0xf8, 0x0c, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x49, 0x52, 0x20, 0x49, 0x52, 0x51, 0x3a, 0x00, + 0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x17, 0xcc, + 0xb5, 0x90, 0x06, 0x0c, 0x0e, 0x24, 0x1c, 0x07, + 0xf7, 0xff, 0xff, 0x6e, 0x48, 0x11, 0x68, 0x01, + 0x00, 0x49, 0x08, 0x49, 0x07, 0xfa, 0x43, 0x11, + 0x0a, 0x09, 0x02, 0x09, 0x43, 0x21, 0x60, 0x01, + 0x68, 0xc2, 0x2a, 0x00, 0xd1, 0x11, 0x68, 0x82, + 0x1c, 0x53, 0x68, 0x82, 0x60, 0x83, 0x00, 0x92, + 0x4b, 0x09, 0x50, 0x99, 0x68, 0x81, 0x29, 0x64, + 0xd1, 0x01, 0x21, 0x00, 0x60, 0x81, 0x68, 0x81, + 0x68, 0x42, 0x42, 0x91, 0xd1, 0x01, 0x21, 0x01, + 0x60, 0xc1, 0xf7, 0xff, 0xff, 0x5e, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x17, 0xcc, + 0x2e, 0x08, 0x4d, 0x98, 0xb5, 0x90, 0x1c, 0x07, + 0xf7, 0xff, 0xff, 0x42, 0x48, 0x10, 0x68, 0xc1, + 0x24, 0x00, 0x29, 0x00, 0xd1, 0x03, 0x68, 0x41, + 0x68, 0x82, 0x42, 0x91, 0xd0, 0x12, 0x68, 0x41, + 0x1c, 0x4a, 0x68, 0x41, 0x60, 0x42, 0x00, 0x89, + 0x4a, 0x0a, 0x58, 0x51, 0x60, 0x39, 0x68, 0x41, + 0x29, 0x64, 0xd1, 0x00, 0x60, 0x44, 0x60, 0xc4, + 0xf7, 0xff, 0xff, 0x3b, 0x20, 0x01, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x35, + 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x17, 0xcc, 0x2e, 0x08, 0x4d, 0x98, + 0xb5, 0x80, 0xb0, 0x81, 0x4f, 0x0e, 0x8e, 0xb8, + 0x28, 0x00, 0xd1, 0x04, 0x46, 0x68, 0xf7, 0xff, + 0xff, 0xcd, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x00, + 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x98, 0x00, 0x49, 0x07, 0x60, 0x08, + 0x20, 0x08, 0x85, 0x38, 0x20, 0x04, 0x85, 0x78, + 0x20, 0x0f, 0x02, 0x40, 0x86, 0xb8, 0x20, 0x01, + 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1e, 0x00, + 0xb5, 0x00, 0x49, 0x0b, 0xca, 0x08, 0xc1, 0x08, + 0xca, 0x08, 0xc1, 0x08, 0xca, 0x0c, 0xc1, 0x0c, + 0x78, 0x01, 0x48, 0x08, 0x70, 0x01, 0x78, 0x00, + 0x28, 0x01, 0xd1, 0x04, 0xf0, 0x00, 0xf8, 0x41, + 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x4f, 0x28, 0x2e, 0x08, 0x1a, 0x50, + 0xb5, 0x90, 0x27, 0x00, 0x48, 0x13, 0x70, 0x07, + 0x20, 0x02, 0xf0, 0x04, 0xfb, 0x57, 0x28, 0x00, + 0xd1, 0x03, 0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x00, 0x21, 0x01, 0x4a, 0x0e, + 0x00, 0x43, 0x18, 0x1b, 0x00, 0x9b, 0x18, 0x9c, + 0x70, 0xa1, 0x52, 0xd7, 0x30, 0x01, 0x28, 0x02, + 0xdb, 0xf6, 0x22, 0x00, 0x1c, 0x08, 0x4c, 0x09, + 0x00, 0x53, 0x18, 0x9b, 0x00, 0xdb, 0x19, 0x19, + 0x70, 0x88, 0x52, 0xe7, 0x70, 0xcf, 0x32, 0x01, + 0x2a, 0x08, 0xdb, 0xf5, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x50, + 0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x60, + 0xb5, 0x00, 0xf0, 0x04, 0xf9, 0xe7, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x80, 0x20, 0x00, 0x49, 0x17, + 0x78, 0x09, 0x29, 0x01, 0xd1, 0x26, 0x49, 0x16, + 0x78, 0x4a, 0x2a, 0x14, 0xd0, 0x18, 0xdc, 0x09, + 0x2a, 0x11, 0xd0, 0x12, 0x2a, 0x12, 0xd0, 0x16, + 0x2a, 0x13, 0xd1, 0x16, 0x68, 0x8f, 0xf0, 0x00, + 0xf8, 0x77, 0xe0, 0x12, 0x2a, 0x15, 0xd0, 0x05, + 0x2a, 0x23, 0xd1, 0x0e, 0x68, 0x8f, 0xf0, 0x00, + 0xf8, 0xaf, 0xe0, 0x0a, 0xf0, 0x00, 0xf8, 0x8a, + 0xe0, 0x07, 0xf0, 0x00, 0xf8, 0x13, 0xe0, 0x04, + 0xf0, 0x00, 0xf8, 0x4a, 0xe0, 0x01, 0xf0, 0x00, + 0xf8, 0x2d, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, + 0xf0, 0x04, 0xfa, 0xe6, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x50, + 0x2e, 0x08, 0x4f, 0x28, 0xb5, 0x90, 0xb0, 0x81, + 0x4c, 0x0d, 0x79, 0xa0, 0x28, 0x01, 0xd1, 0x12, + 0xf0, 0x00, 0xf9, 0x1c, 0x1c, 0x07, 0xd5, 0x01, + 0x20, 0x00, 0xe0, 0x0d, 0x88, 0xa4, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x11, 0x1c, 0x38, 0xf0, 0x00, + 0xfa, 0x0d, 0x28, 0x00, 0xd1, 0x03, 0x1c, 0x38, + 0x1c, 0x21, 0xf0, 0x00, 0xf9, 0x47, 0x20, 0x01, + 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x4f, 0x28, 0xb5, 0x90, 0xb0, 0x81, + 0x4c, 0x0a, 0x88, 0xa0, 0xf0, 0x00, 0xf8, 0x96, + 0x1c, 0x07, 0xd4, 0x0a, 0x88, 0xa4, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x12, 0x1c, 0x38, 0xf0, 0x00, + 0xf9, 0xf1, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, + 0xf9, 0x2d, 0x20, 0x01, 0xb0, 0x01, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x28, + 0xb5, 0xb0, 0xb0, 0x81, 0x4c, 0x0b, 0x88, 0xa0, + 0xf0, 0x00, 0xf8, 0x7c, 0x1c, 0x07, 0xd4, 0x0c, + 0x88, 0xa5, 0x79, 0xa2, 0x46, 0x6b, 0x21, 0x14, + 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0xd7, 0x28, 0x00, + 0xd0, 0x03, 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x00, + 0xf9, 0x11, 0x20, 0x01, 0xb0, 0x01, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x28, + 0xb5, 0x90, 0xb0, 0x81, 0x4c, 0x0c, 0x88, 0xa0, + 0xf0, 0x00, 0xf8, 0x60, 0x1c, 0x07, 0xd4, 0x0c, + 0x68, 0xa0, 0x78, 0x01, 0x88, 0xa0, 0xf0, 0x00, + 0xf8, 0x71, 0x1c, 0x02, 0xd4, 0x07, 0x46, 0x6b, + 0x21, 0x13, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0xb6, + 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x00, + 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x4f, 0x28, 0xb5, 0x90, 0xb0, 0x81, + 0x4c, 0x0d, 0x88, 0xa0, 0xf0, 0x00, 0xf8, 0x42, + 0x1c, 0x07, 0xd4, 0x0f, 0x00, 0x78, 0x19, 0xc0, + 0x00, 0x80, 0x49, 0x0a, 0x18, 0x40, 0x7a, 0x01, + 0x88, 0xa0, 0xf0, 0x00, 0xf8, 0x4f, 0x1c, 0x02, + 0xd4, 0x04, 0x46, 0x6b, 0x21, 0x15, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x94, 0x20, 0x01, 0xb0, 0x01, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x4f, 0x28, 0x2e, 0x08, 0x4f, 0x48, + 0xb5, 0x90, 0xb0, 0x81, 0x4f, 0x10, 0x88, 0xb8, + 0xf0, 0x00, 0xf8, 0x20, 0x1c, 0x04, 0xd4, 0x14, + 0x79, 0xb9, 0x88, 0xb8, 0xf0, 0x00, 0xf8, 0x32, + 0x1c, 0x02, 0xd5, 0x08, 0x79, 0xba, 0x88, 0xb9, + 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x49, 0x1c, 0x02, + 0xd5, 0x01, 0x20, 0x00, 0xe0, 0x08, 0x46, 0x6b, + 0x21, 0x23, 0x1c, 0x20, 0xf0, 0x00, 0xf9, 0x6e, + 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x00, + 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x4f, 0x28, 0xb4, 0x80, 0x04, 0x02, + 0x0c, 0x12, 0x20, 0x00, 0x49, 0x08, 0x00, 0x43, + 0x18, 0x1b, 0x00, 0x9b, 0x18, 0x5f, 0x78, 0xbf, + 0x2f, 0x01, 0xd0, 0x02, 0x5a, 0xcb, 0x42, 0x93, + 0xd0, 0x04, 0x30, 0x01, 0x28, 0x02, 0xdb, 0xf2, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0x47, 0x70, + 0x2e, 0x08, 0x4f, 0x48, 0xb4, 0xb0, 0x04, 0x02, + 0x0c, 0x12, 0x06, 0x0f, 0x0e, 0x3f, 0x20, 0x00, + 0x49, 0x0a, 0x00, 0x44, 0x18, 0x24, 0x00, 0xe4, + 0x18, 0x63, 0x78, 0x9d, 0x2d, 0x01, 0xd0, 0x05, + 0x5b, 0x0c, 0x42, 0x94, 0xd1, 0x02, 0x78, 0xdb, + 0x42, 0xbb, 0xd0, 0x04, 0x30, 0x01, 0x28, 0x08, + 0xdb, 0xef, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xb0, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x4f, 0x60, + 0xb5, 0xb0, 0x04, 0x09, 0x0c, 0x09, 0x06, 0x12, + 0x0e, 0x12, 0x24, 0x00, 0x1c, 0x07, 0x48, 0x13, + 0x00, 0x63, 0x19, 0x1b, 0x00, 0xdb, 0x18, 0x1b, + 0x78, 0x9b, 0x2b, 0x01, 0xd1, 0x16, 0x00, 0x63, + 0x19, 0x1b, 0x00, 0xdb, 0x18, 0x1d, 0x70, 0xea, + 0x52, 0xc1, 0x20, 0x03, 0x70, 0xa8, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x9a, 0x00, 0x78, 0x19, 0xc0, + 0x00, 0x80, 0x49, 0x09, 0x18, 0x40, 0x88, 0xc1, + 0x31, 0x01, 0x80, 0xc1, 0x1c, 0x20, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x34, 0x01, 0x2c, 0x08, + 0xdb, 0xde, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x60, + 0x2e, 0x08, 0x4f, 0x48, 0xb4, 0x90, 0x20, 0x00, + 0x4c, 0x19, 0x4f, 0x1a, 0x88, 0xba, 0x49, 0x1a, + 0x00, 0x43, 0x18, 0x1b, 0x00, 0x9b, 0x18, 0x5b, + 0x78, 0x9b, 0x2b, 0x01, 0xd1, 0x17, 0x00, 0x43, + 0x18, 0x1b, 0x00, 0x9b, 0x52, 0xca, 0x22, 0x02, + 0x18, 0x59, 0x70, 0x8a, 0x22, 0x00, 0x80, 0xca, + 0x72, 0x4a, 0x89, 0x3a, 0x2a, 0x10, 0xdb, 0x03, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x9a, 0xdd, 0x03, + 0x20, 0x02, 0x43, 0xc0, 0xbc, 0x90, 0x47, 0x70, + 0x80, 0x8a, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x43, + 0x18, 0x1b, 0x00, 0xdb, 0x5a, 0xe3, 0x42, 0x93, + 0xd1, 0x03, 0x20, 0x01, 0x43, 0xc0, 0xbc, 0x90, + 0x47, 0x70, 0x30, 0x01, 0x28, 0x02, 0xdb, 0xd3, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0x47, 0x70, + 0x2e, 0x08, 0x4f, 0x60, 0x2e, 0x08, 0x4f, 0x28, + 0x2e, 0x08, 0x4f, 0x48, 0xb5, 0xf0, 0x04, 0x0e, + 0x0c, 0x36, 0x1c, 0x07, 0xd5, 0x06, 0x2f, 0x02, + 0xdb, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x00, 0x7b, + 0x19, 0xdb, 0x00, 0x9b, 0x49, 0x0e, 0x18, 0x5a, + 0x70, 0x90, 0x22, 0x00, 0x52, 0xca, 0x24, 0x00, + 0x4d, 0x0c, 0x00, 0x60, 0x19, 0x00, 0x00, 0xc0, + 0x5a, 0x29, 0x42, 0xb1, 0xd1, 0x08, 0x22, 0x00, + 0x19, 0x41, 0x70, 0xca, 0x52, 0x2a, 0x20, 0x01, + 0x70, 0x88, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x20, + 0x34, 0x01, 0x2c, 0x08, 0xdb, 0xed, 0x1c, 0x38, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x60, + 0xb5, 0x00, 0x49, 0x03, 0x78, 0x08, 0xf0, 0x04, + 0xf8, 0x6b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x4f, 0x28, 0xb5, 0x00, 0x49, 0x03, + 0x78, 0x08, 0xf0, 0x04, 0xf8, 0x61, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x4f, 0x38, + 0xb5, 0xf0, 0x01, 0x46, 0x18, 0x36, 0x00, 0xb6, + 0x1c, 0x07, 0xb0, 0x84, 0x48, 0x0c, 0x90, 0x03, + 0x18, 0x34, 0x68, 0xa0, 0x28, 0x00, 0xd0, 0x0a, + 0x46, 0x69, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x3e, + 0x1c, 0x05, 0xd0, 0x02, 0x98, 0x01, 0xf0, 0x04, + 0xf9, 0x23, 0x2d, 0x00, 0xd1, 0xf4, 0x20, 0x00, + 0x99, 0x03, 0x51, 0x88, 0x60, 0x60, 0x60, 0xa0, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x50, 0x20, 0xb4, 0xb0, 0x01, 0x43, + 0x18, 0x18, 0x00, 0x80, 0x4a, 0x12, 0x18, 0x82, + 0x20, 0x00, 0x68, 0x93, 0x2b, 0x0a, 0xda, 0x1d, + 0x33, 0x01, 0x60, 0x93, 0x78, 0x8c, 0x68, 0x55, + 0x00, 0x6b, 0x19, 0x5b, 0x00, 0x9b, 0x18, 0xd3, + 0x73, 0x9c, 0x68, 0x4c, 0x68, 0x55, 0x00, 0x6b, + 0x19, 0x5b, 0x00, 0x9b, 0x18, 0xd3, 0x61, 0x1c, + 0x89, 0x0f, 0x68, 0x54, 0x00, 0x63, 0x19, 0x1b, + 0x00, 0x9b, 0x18, 0xd1, 0x82, 0x8f, 0x68, 0x51, + 0x31, 0x01, 0x60, 0x51, 0x29, 0x0a, 0xdb, 0x00, + 0x60, 0x50, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, + 0x2e, 0x08, 0x50, 0x20, 0xb4, 0xb0, 0x01, 0x47, + 0x18, 0x3f, 0x00, 0xbf, 0x4a, 0x12, 0x18, 0xbc, + 0x20, 0x00, 0x68, 0xa3, 0x2b, 0x00, 0xdd, 0x1d, + 0x3b, 0x01, 0x60, 0xa3, 0x59, 0xd5, 0x00, 0x6b, + 0x19, 0x5b, 0x00, 0x9b, 0x18, 0xe3, 0x7b, 0x9b, + 0x70, 0x8b, 0x59, 0xd5, 0x00, 0x6b, 0x19, 0x5b, + 0x00, 0x9b, 0x18, 0xe3, 0x69, 0x1b, 0x60, 0x4b, + 0x59, 0xd5, 0x00, 0x6b, 0x19, 0x5b, 0x00, 0x9b, + 0x18, 0xe3, 0x8a, 0x9b, 0x81, 0x0b, 0x59, 0xd1, + 0x31, 0x01, 0x51, 0xd1, 0x29, 0x0a, 0xdb, 0x00, + 0x51, 0xd0, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, + 0x2e, 0x08, 0x50, 0x20, 0xb5, 0x90, 0x06, 0x09, + 0x0e, 0x09, 0x1c, 0x1f, 0x00, 0x43, 0x18, 0x1b, + 0x00, 0x9b, 0x4c, 0x0f, 0x19, 0x1b, 0x78, 0x9b, + 0x2b, 0x02, 0xd0, 0x0f, 0x2b, 0x03, 0xd0, 0x07, + 0x2b, 0x04, 0xd1, 0x11, 0x1c, 0x3b, 0xf0, 0x00, + 0xf9, 0x27, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x3b, 0xf0, 0x00, 0xf8, 0x37, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x3a, 0xf0, 0x00, + 0xf8, 0x09, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x4f, 0x48, 0xb5, 0x90, 0x06, 0x09, + 0x0e, 0x09, 0x23, 0x01, 0x60, 0x13, 0x29, 0x11, + 0xd1, 0x17, 0x22, 0x23, 0x49, 0x0d, 0x70, 0x0a, + 0x22, 0x21, 0x70, 0x4a, 0x22, 0x04, 0x80, 0x4a, + 0x00, 0x44, 0x18, 0x24, 0x00, 0xa4, 0x4f, 0x0a, + 0x5b, 0x38, 0x80, 0x88, 0xf7, 0xff, 0xff, 0x34, + 0x28, 0x00, 0xd0, 0x06, 0x20, 0x03, 0x19, 0xe1, + 0x70, 0x88, 0x20, 0x01, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x4f, 0x28, + 0x2e, 0x08, 0x4f, 0x48, 0xb5, 0xff, 0x06, 0x09, + 0x0e, 0x09, 0x27, 0x00, 0x20, 0x00, 0xb0, 0x84, + 0x60, 0x18, 0x1c, 0x1e, 0x98, 0x04, 0x00, 0x43, + 0x18, 0x18, 0x00, 0x80, 0x90, 0x03, 0x4a, 0x6a, + 0x92, 0x02, 0x18, 0x84, 0x25, 0x02, 0x48, 0x69, + 0x29, 0x12, 0xd0, 0x71, 0x9a, 0x06, 0x00, 0x53, + 0x18, 0x9a, 0x00, 0xd2, 0x4b, 0x66, 0x18, 0xd2, + 0x92, 0x01, 0x29, 0x13, 0xd0, 0x17, 0x29, 0x14, + 0xd0, 0x67, 0x29, 0x23, 0xd1, 0x66, 0x89, 0x82, + 0x99, 0x06, 0xb4, 0x04, 0x68, 0x83, 0x9d, 0x02, + 0x78, 0xea, 0x98, 0x05, 0xf0, 0x00, 0xf9, 0x52, + 0xb0, 0x01, 0x1c, 0x07, 0xd0, 0x5b, 0x89, 0xa8, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0x01, 0x60, 0x30, + 0x21, 0x04, 0x70, 0xa1, 0xe0, 0x97, 0x68, 0x81, + 0x78, 0x4a, 0x23, 0x80, 0x40, 0x1a, 0x88, 0xc0, + 0x1e, 0x83, 0x04, 0x1d, 0x0c, 0x2d, 0x31, 0x02, + 0x91, 0x00, 0x2a, 0x80, 0xd1, 0x28, 0x88, 0xa1, + 0x42, 0x81, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x87, + 0x9c, 0x01, 0x8a, 0xa1, 0x29, 0x00, 0xd1, 0x0c, + 0x1c, 0x28, 0xf0, 0x03, 0xff, 0xfb, 0x61, 0x20, + 0x28, 0x00, 0xd0, 0xf3, 0x82, 0xa5, 0x69, 0x20, + 0x99, 0x00, 0x1c, 0x2a, 0xf0, 0x16, 0xff, 0x12, + 0xe0, 0x75, 0x19, 0x48, 0x04, 0x02, 0x0c, 0x12, + 0x69, 0x20, 0xf0, 0x03, 0xff, 0xf0, 0x28, 0x00, + 0xd0, 0xe4, 0x61, 0x20, 0x8a, 0xa1, 0x18, 0x40, + 0x99, 0x00, 0x1c, 0x2a, 0xf0, 0x16, 0xff, 0x02, + 0x8a, 0xa0, 0x19, 0x40, 0x82, 0xa0, 0xe0, 0x62, + 0x9e, 0x01, 0x8a, 0xb1, 0x4c, 0x3d, 0x29, 0x00, + 0xd1, 0x1a, 0x1c, 0x28, 0xf0, 0x03, 0xff, 0xd6, + 0x60, 0xa0, 0x28, 0x00, 0xd0, 0xce, 0x21, 0x23, + 0x70, 0x21, 0x70, 0x61, 0x21, 0x0c, 0x80, 0x61, + 0x99, 0x03, 0x9a, 0x02, 0x5a, 0x51, 0x80, 0xa1, + 0x78, 0xf1, 0x71, 0xa1, 0x81, 0xa5, 0x99, 0x00, + 0x1c, 0x2a, 0xf0, 0x16, 0xfe, 0xe3, 0xe0, 0x24, + 0xe0, 0x4b, 0xe0, 0x2e, 0xe0, 0x43, 0xe0, 0x42, + 0x19, 0x48, 0x04, 0x02, 0x0c, 0x12, 0x69, 0x30, + 0xf0, 0x03, 0xff, 0xbd, 0x28, 0x00, 0xd0, 0xb1, + 0x61, 0x30, 0x8a, 0xb1, 0x18, 0x40, 0x99, 0x00, + 0x1c, 0x2a, 0xf0, 0x16, 0xfe, 0xcf, 0x8a, 0xb0, + 0x19, 0x40, 0x82, 0xb0, 0x21, 0x23, 0x70, 0x21, + 0x70, 0x61, 0x21, 0x0c, 0x80, 0x61, 0x98, 0x03, + 0x9a, 0x02, 0x5a, 0x10, 0x80, 0xa0, 0x78, 0xf0, + 0x71, 0xa0, 0x8a, 0xb0, 0x81, 0xa0, 0x69, 0x30, + 0x60, 0xa0, 0xf7, 0xff, 0xfe, 0x7f, 0x28, 0x00, + 0xd1, 0x03, 0x68, 0xa0, 0xf0, 0x03, 0xff, 0xbc, + 0xe0, 0x19, 0x20, 0x00, 0x82, 0xb0, 0x61, 0x30, + 0xe0, 0x14, 0x9a, 0x06, 0x06, 0x11, 0x0e, 0x09, + 0x29, 0x02, 0xd1, 0x10, 0x21, 0x23, 0x70, 0x01, + 0x21, 0x22, 0x70, 0x41, 0x21, 0x04, 0x80, 0x41, + 0x99, 0x03, 0x9a, 0x02, 0x5a, 0x51, 0x80, 0x81, + 0xf7, 0xff, 0xfe, 0x5a, 0x28, 0x00, 0xd1, 0x00, + 0xe7, 0x78, 0x70, 0xa5, 0x27, 0x01, 0x1c, 0x38, + 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x23, 0x70, 0x01, 0x21, 0x22, + 0x70, 0x41, 0x21, 0x04, 0x80, 0x41, 0x99, 0x03, + 0x9a, 0x02, 0x5a, 0x51, 0x80, 0x81, 0xf7, 0xff, + 0xfe, 0x43, 0x28, 0x00, 0xd1, 0xe9, 0xe7, 0x61, + 0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x28, + 0x2e, 0x08, 0x4f, 0x60, 0x2e, 0x08, 0x4f, 0x38, + 0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x24, 0x00, + 0x20, 0x00, 0x60, 0x18, 0x1c, 0x1f, 0xb0, 0x84, + 0x29, 0x14, 0xd0, 0x04, 0xdc, 0x09, 0x29, 0x12, + 0xd0, 0x01, 0x29, 0x13, 0xd1, 0x65, 0x98, 0x04, + 0x1c, 0x3b, 0xf7, 0xff, 0xff, 0x03, 0x1c, 0x04, + 0xe0, 0x6e, 0x29, 0x15, 0xd0, 0x0a, 0x29, 0x23, + 0xd1, 0x5b, 0x49, 0x38, 0x1c, 0x10, 0xf7, 0xff, + 0xfe, 0x51, 0x1c, 0x04, 0xd0, 0x64, 0x20, 0x01, + 0x60, 0x38, 0xe0, 0x61, 0x1c, 0x17, 0x22, 0x00, + 0x98, 0x04, 0x00, 0x43, 0x18, 0x18, 0x00, 0x80, + 0x49, 0x31, 0x18, 0x43, 0x93, 0x03, 0x72, 0x5a, + 0x5a, 0x0a, 0x92, 0x00, 0x9b, 0x03, 0x88, 0xd8, + 0x28, 0x01, 0xd0, 0x03, 0x37, 0x01, 0x2f, 0x08, + 0xd1, 0x00, 0x27, 0x00, 0x26, 0x00, 0x48, 0x2b, + 0x90, 0x01, 0x1d, 0x01, 0x91, 0x02, 0x4d, 0x2a, + 0x00, 0x78, 0x19, 0xc0, 0x00, 0xc0, 0x5a, 0x29, + 0x9a, 0x00, 0x42, 0x91, 0xd1, 0x32, 0x19, 0x40, + 0x89, 0x80, 0x28, 0x00, 0xdd, 0x0e, 0x22, 0x00, + 0xb4, 0x04, 0x00, 0x78, 0x19, 0xc0, 0x00, 0xc0, + 0x19, 0x40, 0x78, 0xc2, 0x23, 0x00, 0x98, 0x05, + 0x1c, 0x39, 0xf0, 0x00, 0xf8, 0x3f, 0x1c, 0x04, + 0xb0, 0x01, 0xe0, 0x26, 0x99, 0x02, 0x1c, 0x38, + 0xf7, 0xff, 0xfe, 0x40, 0x1c, 0x04, 0xd0, 0x19, + 0x98, 0x01, 0x89, 0x82, 0xb4, 0x04, 0x98, 0x02, + 0x68, 0x84, 0x00, 0x78, 0x19, 0xc0, 0x00, 0xc0, + 0x19, 0x45, 0x78, 0xea, 0x98, 0x05, 0x1c, 0x39, + 0x1c, 0x23, 0x1c, 0x2e, 0xf0, 0x00, 0xf8, 0x26, + 0x1c, 0x04, 0x89, 0xa8, 0xb0, 0x01, 0x28, 0x00, + 0xd1, 0x0b, 0x68, 0x70, 0xf0, 0x03, 0xff, 0x10, + 0xe0, 0x07, 0xe0, 0x0d, 0x36, 0x01, 0x37, 0x01, + 0x2f, 0x08, 0xd1, 0x00, 0x27, 0x00, 0x2e, 0x08, + 0xdb, 0xbe, 0x9b, 0x03, 0x7a, 0x58, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0x03, 0x9b, 0x03, 0x70, 0x98, + 0x1c, 0x20, 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x2c, + 0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x38, + 0x2e, 0x08, 0x4f, 0x60, 0xb5, 0xff, 0x06, 0x16, + 0x0e, 0x36, 0x9f, 0x09, 0x04, 0x3c, 0x0c, 0x24, + 0x1c, 0x18, 0x00, 0x4b, 0x18, 0x59, 0x00, 0xc9, + 0xb0, 0x85, 0x4a, 0x30, 0x18, 0x8f, 0x28, 0x00, + 0xd1, 0x02, 0x89, 0xbc, 0x68, 0xbd, 0xe0, 0x03, + 0x60, 0x78, 0x60, 0xb8, 0x81, 0xbc, 0x1c, 0x05, + 0x99, 0x05, 0x00, 0x4b, 0x18, 0x5b, 0x00, 0x9b, + 0x93, 0x04, 0x1c, 0xa2, 0x49, 0x28, 0x91, 0x03, + 0x18, 0x59, 0x91, 0x02, 0x88, 0x89, 0x42, 0x8a, + 0xdd, 0x0a, 0x20, 0x80, 0x90, 0x00, 0x1e, 0x88, + 0x04, 0x04, 0x0c, 0x24, 0x19, 0x28, 0x60, 0xb8, + 0x89, 0xb8, 0x1b, 0x00, 0x81, 0xb8, 0xe0, 0x09, + 0x21, 0x00, 0x91, 0x00, 0x81, 0xb9, 0x28, 0x00, + 0xd1, 0x04, 0x68, 0x78, 0xf0, 0x03, 0xfe, 0xbc, + 0x21, 0x00, 0x60, 0x79, 0x1c, 0xa0, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x01, 0xf0, 0x03, 0xfe, 0x8e, + 0x4f, 0x18, 0x60, 0xb8, 0x1c, 0x01, 0xd1, 0x01, + 0x20, 0x00, 0xe0, 0x22, 0x20, 0x21, 0x70, 0x38, + 0x20, 0x13, 0x70, 0x78, 0x20, 0x08, 0x80, 0x78, + 0x98, 0x04, 0x9a, 0x03, 0x5a, 0x10, 0x80, 0xb8, + 0x98, 0x01, 0x80, 0xf8, 0x70, 0x0e, 0x98, 0x00, + 0x68, 0xb9, 0x70, 0x48, 0x68, 0xb8, 0x30, 0x02, + 0x1c, 0x29, 0x1c, 0x22, 0xf0, 0x16, 0xfd, 0x92, + 0xf7, 0xff, 0xfd, 0x54, 0x28, 0x00, 0xd1, 0x03, + 0x68, 0xb8, 0xf0, 0x03, 0xfe, 0x91, 0xe7, 0xdf, + 0x99, 0x02, 0x72, 0x0e, 0x20, 0x01, 0x99, 0x02, + 0x72, 0x48, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x60, + 0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x38, + 0xb5, 0xf0, 0x4d, 0x15, 0x69, 0x68, 0x28, 0x00, + 0xd1, 0x06, 0x20, 0xff, 0x30, 0x01, 0xf0, 0x03, + 0xfe, 0x51, 0x61, 0x68, 0x28, 0x00, 0xd0, 0x11, + 0x27, 0x00, 0x4c, 0x10, 0x21, 0x01, 0x01, 0x3e, + 0x19, 0x30, 0x81, 0x01, 0x21, 0x00, 0x60, 0xc1, + 0x20, 0x00, 0x1c, 0x39, 0xf0, 0x05, 0xf9, 0x90, + 0x04, 0x00, 0x0c, 0x00, 0x53, 0xa0, 0x04, 0x00, + 0x14, 0x00, 0xd5, 0x04, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x37, 0x01, + 0x2f, 0x02, 0xdb, 0xe7, 0x21, 0x00, 0x82, 0x29, + 0x20, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x54, 0x2e, 0x08, 0x54, 0x50, + 0xb5, 0xf7, 0x04, 0x01, 0x0c, 0x09, 0x04, 0x16, + 0x0c, 0x36, 0x27, 0x00, 0x48, 0x12, 0x01, 0x3a, + 0x5a, 0x82, 0x42, 0x8a, 0xd0, 0x02, 0x37, 0x01, + 0x2f, 0x02, 0xdb, 0xf8, 0x2f, 0x02, 0xda, 0x17, + 0x24, 0x00, 0x99, 0x01, 0x1c, 0x38, 0x1c, 0x32, + 0xf0, 0x00, 0xf9, 0xd6, 0x1c, 0x05, 0x28, 0x02, + 0xd1, 0x05, 0x20, 0x14, 0xf0, 0x03, 0xfe, 0x3e, + 0x34, 0x01, 0x2c, 0x0a, 0xd0, 0x08, 0x2d, 0x02, + 0xd0, 0xef, 0x2d, 0x00, 0xd1, 0x04, 0x20, 0x00, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0x43, 0xc0, 0xe7, 0xf8, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x50, 0xb5, 0xf0, 0x4f, 0x14, + 0x26, 0x00, 0x69, 0x78, 0x28, 0x00, 0xd0, 0x02, + 0xf0, 0x03, 0xfe, 0x1a, 0x61, 0x7e, 0x24, 0x00, + 0x4d, 0x10, 0x01, 0x27, 0x5b, 0xe8, 0x28, 0x00, + 0xdd, 0x02, 0xf0, 0x05, 0xf9, 0xe7, 0x53, 0xee, + 0x19, 0x78, 0x68, 0xc7, 0x2f, 0x00, 0xd0, 0x0c, + 0x68, 0x38, 0x28, 0x00, 0xd0, 0x06, 0x1c, 0x38, + 0x68, 0x3f, 0xf0, 0x03, 0xfe, 0x05, 0x68, 0x38, + 0x28, 0x00, 0xd1, 0xf8, 0x1c, 0x38, 0xf0, 0x03, + 0xfd, 0xff, 0x34, 0x01, 0x2c, 0x02, 0xdb, 0xe4, + 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x54, 0x2e, 0x08, 0x54, 0x50, + 0xb5, 0xf0, 0x1c, 0x07, 0x20, 0x03, 0x1c, 0x0d, + 0x01, 0x39, 0x1c, 0x14, 0x4a, 0x12, 0x18, 0x8e, + 0x81, 0x30, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x22, + 0x28, 0x00, 0xd1, 0x10, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x6d, 0x28, 0x00, 0xd0, 0x04, 0x28, 0x07, + 0xd1, 0x12, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0x1c, 0x29, 0x1c, 0x22, 0xf0, 0x00, + 0xf8, 0xb3, 0x28, 0x00, 0xd0, 0x04, 0x20, 0x01, + 0x81, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x50, 0xb5, 0xf0, 0x27, 0x01, + 0xb0, 0x81, 0xab, 0x00, 0x70, 0x1f, 0x01, 0x05, + 0x4c, 0x15, 0x5b, 0x60, 0x46, 0x6a, 0x21, 0x06, + 0xf0, 0x05, 0xf9, 0x56, 0x28, 0x00, 0xdd, 0x1d, + 0xa8, 0x00, 0x78, 0x40, 0x28, 0x00, 0xd0, 0x19, + 0x27, 0x00, 0x20, 0x02, 0xab, 0x00, 0x70, 0x18, + 0x26, 0x06, 0x5b, 0x60, 0x46, 0x6a, 0x21, 0x06, + 0xf0, 0x05, 0xf9, 0x46, 0x28, 0x00, 0xdb, 0x05, + 0x20, 0x14, 0xf0, 0x03, 0xfd, 0xaf, 0x37, 0x01, + 0x2f, 0x0a, 0xd1, 0x01, 0x1c, 0x30, 0xe0, 0x06, + 0xa8, 0x00, 0x78, 0x40, 0x28, 0x00, 0xd0, 0xec, + 0x20, 0x00, 0xe0, 0x00, 0x1c, 0x38, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x50, 0xb5, 0x80, 0x27, 0x01, + 0xb0, 0x81, 0xab, 0x00, 0x70, 0x1f, 0x01, 0x00, + 0x49, 0x09, 0x5a, 0x08, 0x46, 0x6a, 0x21, 0x06, + 0xf0, 0x05, 0xf9, 0x22, 0x28, 0x00, 0xdd, 0x05, + 0xa8, 0x00, 0x78, 0x40, 0x28, 0x00, 0xd0, 0x01, + 0x20, 0x00, 0xe0, 0x00, 0x1c, 0x38, 0xb0, 0x01, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x50, 0xb5, 0xf0, 0x27, 0x00, + 0x26, 0x06, 0x01, 0x05, 0xb0, 0xff, 0xb0, 0x87, + 0x4c, 0x24, 0x20, 0x00, 0xab, 0x00, 0x80, 0x18, + 0x20, 0x01, 0x02, 0x40, 0x80, 0x58, 0xa8, 0x05, + 0x90, 0x01, 0x5b, 0x60, 0x46, 0x6a, 0x21, 0x02, + 0xf0, 0x05, 0xf8, 0xfe, 0x28, 0x00, 0xda, 0x01, + 0x1c, 0x30, 0xe0, 0x2f, 0xa9, 0x02, 0x88, 0x09, + 0xa8, 0x05, 0xaa, 0x03, 0xab, 0x04, 0xf0, 0x00, + 0xfa, 0x73, 0x28, 0x00, 0xda, 0x2b, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0x20, 0xc8, 0xf0, 0x03, + 0xfd, 0x59, 0x2f, 0x0a, 0xdb, 0xdd, 0x2f, 0x0a, + 0xd0, 0xea, 0xa8, 0x03, 0x88, 0x00, 0xab, 0x00, + 0x80, 0x18, 0x27, 0x01, 0x80, 0x5f, 0xa8, 0x04, + 0x90, 0x01, 0x5b, 0x60, 0x46, 0x6a, 0x21, 0x03, + 0xf0, 0x05, 0xf8, 0xda, 0x28, 0x00, 0xdb, 0xdb, + 0xa8, 0x02, 0x88, 0x00, 0x28, 0x01, 0xd1, 0xd7, + 0xab, 0x85, 0x70, 0x5f, 0x27, 0x00, 0x70, 0x1f, + 0x5b, 0x60, 0x21, 0x07, 0xaa, 0x85, 0xf0, 0x05, + 0xf8, 0xcb, 0x1c, 0x38, 0xb0, 0x7f, 0xb0, 0x07, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x27, 0x00, + 0xe7, 0xd9, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x50, + 0xb5, 0xf7, 0x1c, 0x07, 0x20, 0x00, 0xb0, 0x84, + 0x4c, 0x5b, 0x70, 0x20, 0xab, 0x00, 0x70, 0x58, + 0x70, 0x18, 0x01, 0x38, 0x49, 0x59, 0x5a, 0x08, + 0x46, 0x6a, 0x21, 0x07, 0xf0, 0x05, 0xf8, 0xb0, + 0x28, 0x00, 0xdb, 0x2f, 0x1d, 0x22, 0x92, 0x03, + 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0x04, + 0x28, 0x01, 0xd0, 0x27, 0x78, 0x20, 0x23, 0x08, + 0x43, 0x18, 0x70, 0x20, 0x78, 0x22, 0x21, 0x01, + 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0xd3, 0x28, 0x01, + 0xd0, 0x1c, 0x78, 0x20, 0x23, 0xf7, 0x40, 0x18, + 0x70, 0x20, 0x78, 0x22, 0x21, 0x01, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0xc8, 0x28, 0x01, 0xd0, 0x11, + 0x21, 0x01, 0x9a, 0x03, 0x1c, 0x38, 0xf0, 0x00, + 0xf9, 0xe7, 0x28, 0x01, 0xd0, 0x0a, 0x78, 0x20, + 0x23, 0x04, 0x43, 0x18, 0x70, 0x20, 0x78, 0x22, + 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0xb6, + 0x28, 0x01, 0xd1, 0x01, 0x20, 0x05, 0xe0, 0x71, + 0x25, 0x00, 0x23, 0x01, 0x1c, 0x38, 0xa9, 0x02, + 0xaa, 0x01, 0xf0, 0x00, 0xf9, 0x33, 0x1c, 0x06, + 0x28, 0x01, 0xd0, 0xf3, 0x20, 0x14, 0xf0, 0x03, + 0xfc, 0xdd, 0x35, 0x01, 0x2d, 0x0a, 0xd0, 0xed, + 0x2e, 0x03, 0xd0, 0xee, 0x2e, 0x02, 0xd0, 0xec, + 0xa8, 0x02, 0x78, 0x00, 0x02, 0x00, 0xa9, 0x02, + 0x78, 0x49, 0x18, 0x40, 0x9a, 0x06, 0x60, 0x10, + 0x99, 0x05, 0x42, 0x88, 0xd9, 0x08, 0x99, 0x05, + 0x0a, 0x08, 0xab, 0x02, 0x70, 0x18, 0x99, 0x05, + 0x70, 0x59, 0x99, 0x05, 0x9a, 0x06, 0x60, 0x11, + 0x78, 0x20, 0x23, 0xfb, 0x40, 0x18, 0x70, 0x20, + 0x78, 0x22, 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, + 0xf9, 0x81, 0x28, 0x01, 0xd0, 0x0a, 0x78, 0x20, + 0x23, 0x02, 0x43, 0x18, 0x70, 0x20, 0x78, 0x22, + 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x76, + 0x28, 0x01, 0xd1, 0x01, 0x20, 0x01, 0xe0, 0x31, + 0x25, 0x00, 0x22, 0x02, 0x1c, 0x38, 0xa9, 0x02, + 0xf0, 0x00, 0xf8, 0x36, 0x1c, 0x06, 0x28, 0x01, + 0xd0, 0xb4, 0x20, 0x14, 0xf0, 0x03, 0xfc, 0x9e, + 0x35, 0x01, 0x2d, 0x0a, 0xd0, 0xae, 0x2e, 0x02, + 0xd0, 0xef, 0x78, 0x20, 0x23, 0xfd, 0x40, 0x18, + 0x70, 0x20, 0x78, 0x22, 0x21, 0x01, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x58, 0x28, 0x01, 0xd0, 0xe1, + 0x25, 0x00, 0x21, 0x01, 0x9a, 0x03, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x76, 0x28, 0x01, 0xd0, 0x99, + 0x79, 0x20, 0x23, 0xc3, 0x40, 0x18, 0x71, 0x20, + 0x20, 0x14, 0xf0, 0x03, 0xfc, 0x7f, 0x35, 0x01, + 0x2d, 0x0a, 0xd0, 0x8f, 0x79, 0x20, 0x09, 0xc0, + 0xd3, 0xeb, 0x20, 0x00, 0xb0, 0x04, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0x54, 0x2e, 0x08, 0x54, 0x50, + 0xb5, 0xf7, 0x04, 0x15, 0x0c, 0x2d, 0x1c, 0x07, + 0x01, 0x00, 0xb0, 0x82, 0x90, 0x01, 0x49, 0x3d, + 0x91, 0x00, 0x18, 0x40, 0x89, 0x00, 0x28, 0x01, + 0xd0, 0x07, 0x4a, 0x3b, 0x21, 0x01, 0x1c, 0x38, + 0x1c, 0x16, 0xf0, 0x00, 0xf9, 0x49, 0x28, 0x01, + 0xd1, 0x01, 0x20, 0x01, 0xe0, 0x64, 0x4c, 0x37, + 0x79, 0x20, 0x23, 0xc3, 0x40, 0x18, 0x71, 0x20, + 0x79, 0x20, 0x0a, 0x00, 0xd3, 0x02, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x66, 0x21, 0x01, 0x1c, 0x38, + 0x1c, 0x32, 0xf0, 0x00, 0xf9, 0x35, 0x28, 0x01, + 0xd0, 0xeb, 0x79, 0x20, 0x23, 0xc3, 0x40, 0x18, + 0x71, 0x20, 0x79, 0x20, 0x09, 0xc0, 0xd2, 0x01, + 0x20, 0x02, 0xe0, 0x49, 0x78, 0x20, 0x23, 0x01, + 0x43, 0x18, 0x70, 0x20, 0x78, 0x22, 0x21, 0x01, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xfb, 0x28, 0x01, + 0xd0, 0xd7, 0x06, 0x2a, 0x0e, 0x12, 0x21, 0x02, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xf3, 0x28, 0x01, + 0xd0, 0xcf, 0x0a, 0x2a, 0x21, 0x03, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0xec, 0x28, 0x01, 0xd0, 0xc8, + 0x98, 0x01, 0x99, 0x00, 0x5a, 0x08, 0x9a, 0x03, + 0x1c, 0x29, 0xf0, 0x04, 0xff, 0x55, 0x42, 0xa8, + 0xd1, 0xbf, 0x21, 0x01, 0x1c, 0x38, 0x1c, 0x32, + 0xf0, 0x00, 0xf9, 0x02, 0x28, 0x01, 0xd0, 0xb8, + 0x79, 0x20, 0x23, 0xc3, 0x40, 0x18, 0x71, 0x20, + 0x79, 0x20, 0x08, 0x80, 0xd3, 0x0c, 0x78, 0x20, + 0x23, 0xfe, 0x40, 0x18, 0x70, 0x20, 0x78, 0x22, + 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xca, + 0x28, 0x01, 0xd0, 0xa6, 0x20, 0x04, 0xe0, 0x0b, + 0x78, 0x20, 0x23, 0xfe, 0x40, 0x18, 0x70, 0x20, + 0x78, 0x22, 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0xbd, 0x28, 0x01, 0xd0, 0x99, 0x20, 0x00, + 0xb0, 0x02, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x50, + 0x2e, 0x08, 0x1a, 0x58, 0x2e, 0x08, 0x1a, 0x54, + 0xb5, 0xf0, 0xb0, 0x81, 0x46, 0x6a, 0x1c, 0x07, + 0x4e, 0x16, 0x25, 0x00, 0x69, 0x71, 0x1c, 0x2b, + 0xf0, 0x00, 0xf8, 0x2c, 0x28, 0x00, 0xd1, 0x21, + 0xa8, 0x00, 0x88, 0x00, 0x30, 0x07, 0x04, 0x00, + 0x0c, 0x00, 0xf0, 0x03, 0xfb, 0xa3, 0x1c, 0x04, + 0xd0, 0x18, 0xa8, 0x00, 0x60, 0x25, 0x88, 0x00, + 0x80, 0xa0, 0xaa, 0x00, 0x88, 0x12, 0x69, 0x71, + 0x1d, 0xa0, 0xf0, 0x16, 0xfa, 0xb7, 0x01, 0x38, + 0x49, 0x09, 0x18, 0x40, 0x68, 0xc1, 0x29, 0x00, + 0xd1, 0x01, 0x60, 0xc4, 0xe0, 0x06, 0x68, 0x08, + 0x28, 0x00, 0xd0, 0x03, 0x68, 0x09, 0x68, 0x08, + 0x28, 0x00, 0xd1, 0xfb, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x54, + 0x2e, 0x08, 0x54, 0x50, 0xb5, 0xf0, 0x1c, 0x07, + 0x01, 0x00, 0xb0, 0x83, 0x90, 0x02, 0x1c, 0x14, + 0x1c, 0x0d, 0x49, 0x32, 0x91, 0x01, 0x18, 0x46, + 0x89, 0x30, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x01, + 0xe0, 0x58, 0x2b, 0x00, 0xd0, 0x12, 0x68, 0xf0, + 0x28, 0x00, 0xd0, 0x0f, 0x88, 0x82, 0x1d, 0x81, + 0x1c, 0x28, 0xf0, 0x16, 0xfa, 0x87, 0x68, 0xf0, + 0x88, 0x80, 0x80, 0x20, 0x68, 0xf0, 0x1c, 0x01, + 0x68, 0x00, 0x60, 0xf0, 0x1c, 0x08, 0xf0, 0x03, + 0xfb, 0x83, 0xe0, 0x42, 0x4a, 0x24, 0x92, 0x00, + 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x74, + 0x28, 0x01, 0xd0, 0xe0, 0x4e, 0x21, 0x79, 0x30, + 0x23, 0xc3, 0x40, 0x18, 0x71, 0x30, 0x79, 0x30, + 0x0a, 0x00, 0xd2, 0x01, 0x20, 0x03, 0xe0, 0x31, + 0x4a, 0x1d, 0x21, 0x02, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x63, 0x28, 0x01, 0xd0, 0xcf, 0x4a, 0x1b, + 0x21, 0x03, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x5c, + 0x28, 0x01, 0xd0, 0xc8, 0x7b, 0x30, 0x02, 0x00, + 0x7a, 0x31, 0x18, 0x40, 0x80, 0x20, 0x88, 0x20, + 0x4b, 0x15, 0x42, 0x98, 0xd0, 0xbf, 0x23, 0xff, + 0x33, 0x01, 0x42, 0x98, 0xdc, 0xbb, 0x1c, 0x38, + 0xf7, 0xff, 0xfd, 0xc0, 0x28, 0x01, 0xd0, 0xb6, + 0x98, 0x02, 0x99, 0x01, 0x5a, 0x08, 0x88, 0x21, + 0x1c, 0x2a, 0xf0, 0x04, 0xfe, 0xb3, 0x88, 0x21, + 0x42, 0x88, 0xd1, 0xac, 0x21, 0x01, 0x9a, 0x00, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x39, 0x28, 0x01, + 0xd0, 0xa5, 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x50, + 0x2e, 0x08, 0x1a, 0x58, 0x2e, 0x08, 0x1a, 0x54, + 0x2e, 0x08, 0x1a, 0x5c, 0x2e, 0x08, 0x1a, 0x60, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0xb0, 0xb0, 0x81, + 0xab, 0x00, 0x70, 0x1a, 0x1c, 0x0c, 0x1c, 0x07, + 0xb0, 0x82, 0xf7, 0xff, 0xfd, 0x93, 0x25, 0x01, + 0x28, 0x01, 0xd1, 0x01, 0x1c, 0x28, 0xe0, 0x11, + 0xab, 0x00, 0x80, 0x1c, 0xa8, 0x02, 0x90, 0x01, + 0x01, 0x3c, 0x4f, 0x08, 0x5b, 0x38, 0x46, 0x6a, + 0x21, 0x05, 0xf0, 0x04, 0xfe, 0xb1, 0x28, 0x00, + 0xda, 0x03, 0x19, 0xe1, 0x81, 0x0d, 0x1c, 0x28, + 0xe0, 0x00, 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x50, + 0xb5, 0xf0, 0x1c, 0x14, 0x1c, 0x0d, 0x1c, 0x07, + 0xb0, 0x82, 0xf7, 0xff, 0xfd, 0x6f, 0x26, 0x01, + 0x28, 0x01, 0xd1, 0x01, 0x1c, 0x30, 0xe0, 0x10, + 0xab, 0x00, 0x80, 0x1d, 0x94, 0x01, 0x01, 0x3c, + 0x4f, 0x08, 0x5b, 0x38, 0x46, 0x6a, 0x21, 0x04, + 0xf0, 0x04, 0xfe, 0x8e, 0x28, 0x00, 0xda, 0x03, + 0x19, 0xe1, 0x81, 0x0e, 0x1c, 0x30, 0xe0, 0x00, + 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x50, + 0xb5, 0xb0, 0xb0, 0x86, 0x90, 0x05, 0x91, 0x04, + 0x20, 0x00, 0x90, 0x01, 0x1c, 0x14, 0x46, 0x6a, + 0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, + 0xb4, 0x04, 0x1c, 0x1f, 0x21, 0x1d, 0x20, 0x00, + 0xaa, 0x09, 0xab, 0x08, 0xf0, 0x00, 0xf8, 0x82, + 0x25, 0x00, 0x43, 0xed, 0xb0, 0x04, 0x28, 0x00, + 0xdb, 0x3b, 0x46, 0x6a, 0xa8, 0x02, 0xa9, 0x01, + 0xb4, 0x07, 0xaa, 0x06, 0xb4, 0x04, 0x21, 0x1c, + 0x20, 0x00, 0xaa, 0x09, 0xab, 0x08, 0xf0, 0x00, + 0xf8, 0x71, 0xb0, 0x04, 0x28, 0x00, 0xdb, 0x2c, + 0x46, 0x6a, 0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, + 0xaa, 0x06, 0xb4, 0x04, 0x21, 0x15, 0x20, 0x00, + 0xaa, 0x09, 0xab, 0x08, 0xf0, 0x00, 0xf8, 0x62, + 0xb0, 0x04, 0x28, 0x00, 0xdb, 0x1d, 0x46, 0x6a, + 0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, + 0xb4, 0x04, 0x21, 0x20, 0x20, 0x00, 0xaa, 0x09, + 0xab, 0x08, 0xf0, 0x00, 0xf8, 0x53, 0xb0, 0x04, + 0x28, 0x00, 0xdb, 0x0e, 0x46, 0x6a, 0xa8, 0x02, + 0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, 0xb4, 0x04, + 0x21, 0x1a, 0x20, 0x00, 0xaa, 0x09, 0xab, 0x08, + 0xf0, 0x00, 0xf8, 0x44, 0xb0, 0x04, 0x28, 0x00, + 0xda, 0x01, 0x1c, 0x28, 0xe0, 0x3a, 0x98, 0x02, + 0x80, 0x20, 0x20, 0x01, 0x90, 0x03, 0x43, 0xc4, + 0x46, 0x6a, 0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, + 0xaa, 0x06, 0xb4, 0x04, 0x21, 0x1b, 0x20, 0x00, + 0xaa, 0x09, 0xab, 0x08, 0xf0, 0x00, 0xf8, 0x2e, + 0xb0, 0x04, 0x28, 0x00, 0xd0, 0xf0, 0x42, 0xa0, + 0xd0, 0xee, 0x28, 0x00, 0xdb, 0xe5, 0x46, 0x6a, + 0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, + 0xb4, 0x04, 0x21, 0x14, 0x20, 0x00, 0xaa, 0x09, + 0xab, 0x08, 0xf0, 0x00, 0xf8, 0x1b, 0xb0, 0x04, + 0x28, 0x00, 0xdb, 0xd6, 0x46, 0x6a, 0xa8, 0x02, + 0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, 0xb4, 0x04, + 0x21, 0xff, 0x20, 0x00, 0xaa, 0x09, 0xab, 0x08, + 0xf0, 0x00, 0xf8, 0x0c, 0xb0, 0x04, 0x28, 0x00, + 0xdb, 0xc7, 0x98, 0x01, 0x28, 0x0f, 0xd1, 0xc4, + 0x70, 0x38, 0x20, 0x01, 0xb0, 0x06, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x06, 0x08, + 0x0e, 0x00, 0xb0, 0x83, 0x90, 0x00, 0x25, 0x00, + 0x24, 0x00, 0x26, 0x00, 0x1c, 0x17, 0x22, 0x00, + 0x21, 0x00, 0xb0, 0x87, 0x91, 0x04, 0x98, 0x07, + 0x28, 0xff, 0xd1, 0x0b, 0x68, 0x38, 0x78, 0x00, + 0x28, 0xff, 0xd1, 0x07, 0x9b, 0x0d, 0x68, 0x18, + 0x28, 0x01, 0xd1, 0x03, 0x20, 0x00, 0x9b, 0x0d, + 0x60, 0x18, 0xe1, 0x87, 0x68, 0x38, 0x78, 0x01, + 0x78, 0x43, 0x93, 0x05, 0x30, 0x02, 0x32, 0x02, + 0x60, 0x38, 0x92, 0x06, 0x9a, 0x07, 0x42, 0x8a, + 0xd1, 0x5b, 0x21, 0x01, 0x91, 0x04, 0x9a, 0x07, + 0x2a, 0x1b, 0xd0, 0x57, 0xdc, 0x0b, 0x2a, 0x14, + 0xd0, 0x5a, 0x2a, 0x15, 0xd0, 0x11, 0x2a, 0x1a, + 0xd1, 0x4f, 0x78, 0x02, 0x07, 0x91, 0x0f, 0x89, + 0x29, 0x01, 0xdd, 0x14, 0xe0, 0x10, 0x2a, 0xc0, + 0xd0, 0x73, 0x2a, 0xc1, 0xd1, 0x45, 0xa1, 0xb6, + 0xf0, 0x16, 0xf9, 0x4c, 0x28, 0x00, 0xd1, 0x07, + 0xe1, 0x47, 0x78, 0x01, 0x29, 0x05, 0xd1, 0x03, + 0x78, 0x40, 0x28, 0x00, 0xd1, 0x00, 0xe1, 0x40, + 0x20, 0x00, 0x43, 0xc0, 0xe1, 0x56, 0x23, 0x3c, + 0x40, 0x1a, 0x78, 0x40, 0x9b, 0x16, 0x60, 0x18, + 0x29, 0x00, 0xd1, 0x02, 0x68, 0x38, 0x78, 0x80, + 0xe0, 0x04, 0x68, 0x38, 0x78, 0x83, 0x78, 0xc0, + 0x02, 0x00, 0x18, 0x18, 0x9b, 0x14, 0x60, 0x18, + 0x98, 0x14, 0x68, 0x00, 0x4b, 0xa8, 0x42, 0x98, + 0xdc, 0xe6, 0x68, 0x38, 0x18, 0x43, 0x78, 0xdb, + 0x08, 0x5b, 0xd3, 0xe1, 0x18, 0x89, 0x31, 0x04, + 0x18, 0x40, 0x90, 0x02, 0x9b, 0x0d, 0x68, 0x18, + 0x9a, 0x06, 0x1a, 0x80, 0x9a, 0x05, 0x1a, 0x51, + 0x1a, 0x40, 0x90, 0x03, 0xaa, 0x14, 0xca, 0x07, + 0xb4, 0x07, 0x9a, 0x16, 0xb4, 0x04, 0x21, 0xc0, + 0x98, 0x0b, 0xaa, 0x06, 0xab, 0x07, 0xf7, 0xff, + 0xff, 0x81, 0xb0, 0x04, 0x28, 0x00, 0xdb, 0xc7, + 0xe1, 0x07, 0xe1, 0x06, 0x78, 0x00, 0x09, 0x81, + 0x07, 0x89, 0xd1, 0x02, 0x21, 0x01, 0xe0, 0x01, + 0xe0, 0xc1, 0x21, 0x00, 0x9a, 0x13, 0x68, 0x12, + 0x40, 0x11, 0xd1, 0xb9, 0x23, 0xc0, 0x43, 0xdb, + 0x40, 0x18, 0x90, 0x00, 0x28, 0x0f, 0xd1, 0x01, + 0x99, 0x15, 0x60, 0x08, 0x20, 0x00, 0x99, 0x13, + 0x60, 0x08, 0x68, 0x39, 0x78, 0x08, 0x0a, 0x00, + 0xd3, 0x73, 0x78, 0x48, 0x28, 0x04, 0xd1, 0x71, + 0x78, 0x8a, 0x92, 0x09, 0x20, 0x0b, 0x40, 0x10, + 0xd0, 0x6d, 0x78, 0xcb, 0x20, 0x00, 0x22, 0x00, + 0x08, 0x5e, 0xd3, 0x00, 0x30, 0x01, 0x10, 0x5b, + 0xe0, 0x00, 0xe0, 0xa1, 0x06, 0x1b, 0x0e, 0x1b, + 0x32, 0x01, 0x2a, 0x08, 0xdb, 0xf4, 0x22, 0x04, + 0x1c, 0xc3, 0x2b, 0x04, 0xdb, 0x07, 0x5c, 0x8e, + 0x0a, 0x33, 0xd3, 0x00, 0x30, 0x01, 0x32, 0x01, + 0x1c, 0xc3, 0x42, 0x93, 0xda, 0xf7, 0x9a, 0x09, + 0x30, 0x01, 0x08, 0xd2, 0xd3, 0x25, 0x18, 0x0b, + 0x78, 0xda, 0x92, 0x08, 0x07, 0x92, 0x0f, 0x92, + 0x1c, 0x1e, 0x2a, 0x03, 0xd0, 0x09, 0x22, 0x00, + 0x79, 0x35, 0x0a, 0x2b, 0xd3, 0x04, 0x32, 0x01, + 0x18, 0xb3, 0x79, 0x1d, 0x0a, 0x2b, 0xd2, 0xfa, + 0x1c, 0x55, 0x23, 0x1c, 0x9a, 0x08, 0x40, 0x1a, + 0x2a, 0x1c, 0xd0, 0x0b, 0x22, 0x00, 0x19, 0x73, + 0x79, 0x1c, 0x1c, 0x1e, 0x0a, 0x23, 0xd3, 0x04, + 0x32, 0x01, 0x18, 0xb3, 0x79, 0x1c, 0x0a, 0x23, + 0xd2, 0xfa, 0x1c, 0x54, 0x19, 0x40, 0x19, 0x00, + 0x30, 0x01, 0x9a, 0x09, 0x09, 0x12, 0xd3, 0x0e, + 0x18, 0x0a, 0x78, 0xd6, 0x0a, 0x33, 0xd3, 0x09, + 0x79, 0x12, 0x23, 0xc0, 0x40, 0x13, 0x09, 0x9d, + 0x23, 0x30, 0x40, 0x1a, 0x09, 0x14, 0x19, 0x40, + 0x19, 0x00, 0x30, 0x01, 0x30, 0x01, 0x9a, 0x09, + 0x09, 0x52, 0xd3, 0x05, 0x18, 0x0a, 0x78, 0xd2, + 0x09, 0x52, 0xd3, 0x00, 0x30, 0x02, 0x30, 0x01, + 0x9a, 0x09, 0x09, 0x52, 0x07, 0x92, 0xd0, 0x11, + 0x18, 0x0a, 0x78, 0xd2, 0x23, 0x18, 0x40, 0x13, + 0x08, 0xdd, 0x23, 0x60, 0x40, 0x13, 0x09, 0x5c, + 0xe0, 0x02, 0xe0, 0x2c, 0xe0, 0x2b, 0xe0, 0x2a, + 0x0a, 0x12, 0xd3, 0x00, 0x00, 0x64, 0x19, 0x40, + 0x19, 0x00, 0x30, 0x01, 0x30, 0x03, 0x18, 0x09, + 0x91, 0x02, 0x9b, 0x0d, 0x68, 0x19, 0x9a, 0x06, + 0x1a, 0x89, 0x1a, 0x08, 0x90, 0x03, 0xaa, 0x14, + 0xca, 0x07, 0xb4, 0x07, 0x9a, 0x16, 0xb4, 0x04, + 0x21, 0xc0, 0x98, 0x0b, 0xaa, 0x06, 0xab, 0x07, + 0xf7, 0xff, 0xfe, 0xd0, 0xb0, 0x04, 0x28, 0x00, + 0xdb, 0x0d, 0xaa, 0x14, 0xca, 0x07, 0xb4, 0x07, + 0x9a, 0x16, 0xb4, 0x04, 0x21, 0xc1, 0x98, 0x0b, + 0xaa, 0x06, 0xab, 0x07, 0xf7, 0xff, 0xfe, 0xc2, + 0xb0, 0x04, 0x28, 0x00, 0xda, 0x02, 0x26, 0x01, + 0x43, 0xf6, 0xe0, 0x46, 0x98, 0x00, 0x9a, 0x16, + 0x68, 0x11, 0x42, 0x88, 0xd1, 0x01, 0x26, 0x01, + 0xe0, 0x3f, 0x26, 0x00, 0xe0, 0x3d, 0x9a, 0x05, + 0x2a, 0x00, 0xd0, 0x00, 0xe6, 0xf8, 0xe0, 0x38, + 0x99, 0x0a, 0x29, 0x1b, 0xd1, 0x05, 0xa1, 0x2f, + 0xf0, 0x16, 0xf8, 0x34, 0x28, 0x00, 0xd1, 0xf5, + 0xe0, 0x2f, 0x9a, 0x05, 0x2a, 0x0e, 0xd1, 0xf1, + 0x78, 0x01, 0x29, 0x41, 0xd1, 0xee, 0x78, 0x40, + 0x28, 0x02, 0xd1, 0xeb, 0xa0, 0x2a, 0xf0, 0x16, + 0xf8, 0x51, 0x90, 0x01, 0x68, 0x38, 0x9a, 0x01, + 0x30, 0x02, 0xa1, 0x27, 0xf0, 0x16, 0xf8, 0x6c, + 0x28, 0x00, 0xd1, 0xdf, 0x68, 0x38, 0x9a, 0x01, + 0x18, 0x80, 0x78, 0x80, 0xf0, 0x00, 0xf8, 0x4a, + 0x28, 0x00, 0xd0, 0xd7, 0x68, 0x38, 0x9a, 0x01, + 0x18, 0x80, 0x78, 0xc1, 0x29, 0x2e, 0xd1, 0xd1, + 0x79, 0x00, 0xf0, 0x00, 0xf8, 0x3f, 0x28, 0x00, + 0xd0, 0xcc, 0x68, 0x38, 0x9a, 0x01, 0x18, 0x80, + 0x79, 0x40, 0xf0, 0x00, 0xf8, 0x37, 0x28, 0x00, + 0xd0, 0xc4, 0x9a, 0x06, 0x9b, 0x05, 0x18, 0xd2, + 0x9b, 0x0d, 0x68, 0x18, 0x42, 0x82, 0xda, 0xbd, + 0x68, 0x38, 0x9b, 0x05, 0x18, 0xc0, 0x60, 0x38, + 0x9b, 0x0d, 0x68, 0x18, 0x1a, 0x80, 0x60, 0x18, + 0x99, 0x04, 0x29, 0x00, 0xd1, 0x00, 0xe6, 0x6e, + 0x98, 0x07, 0x28, 0x1b, 0xd1, 0x01, 0x1c, 0x30, + 0xe0, 0x00, 0x20, 0x01, 0xb0, 0x0a, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x4d, + 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xfe, 0x44, 0x56, 0x42, 0x5f, + 0x48, 0x4f, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x56, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x0e, 0x09, + 0x22, 0xf0, 0x40, 0x0a, 0x20, 0x00, 0x2a, 0x30, + 0xd1, 0x04, 0x07, 0x09, 0x0f, 0x09, 0x29, 0x09, + 0xdc, 0x00, 0x20, 0x01, 0x47, 0x70, 0xb5, 0xf3, + 0x26, 0x00, 0x1c, 0x07, 0xb0, 0x85, 0x48, 0x4f, + 0x90, 0x04, 0x23, 0x10, 0x5e, 0xc0, 0x22, 0x08, + 0x92, 0x01, 0x01, 0x01, 0x91, 0x03, 0x4a, 0x4c, + 0x92, 0x02, 0x18, 0x8d, 0x89, 0x29, 0x4c, 0x4b, + 0x29, 0x02, 0xd1, 0x47, 0x46, 0x6a, 0x23, 0x01, + 0x1d, 0xf9, 0x31, 0x01, 0xf7, 0xff, 0xfc, 0xc2, + 0x1c, 0x01, 0xd0, 0x16, 0x20, 0x04, 0x22, 0x03, + 0x29, 0x01, 0xd0, 0x2b, 0x29, 0x04, 0xd1, 0x6e, + 0x70, 0x22, 0x80, 0x60, 0x99, 0x03, 0x9a, 0x02, + 0x5a, 0x50, 0x80, 0xa0, 0x21, 0x02, 0x71, 0xa1, + 0x22, 0x08, 0x99, 0x06, 0x80, 0x0a, 0x1c, 0x38, + 0x1c, 0x21, 0xf0, 0x15, 0xff, 0x4b, 0x26, 0x03, + 0xe0, 0x5d, 0x21, 0x02, 0x70, 0x21, 0xa8, 0x00, + 0x88, 0x00, 0x30, 0x07, 0x04, 0x00, 0x0c, 0x00, + 0x80, 0x60, 0x99, 0x03, 0x9a, 0x02, 0x5a, 0x51, + 0x80, 0xa1, 0xa9, 0x00, 0x88, 0x09, 0x80, 0xe1, + 0x30, 0x04, 0x99, 0x06, 0x80, 0x08, 0x9a, 0x01, + 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x15, 0xff, 0x32, + 0x26, 0x02, 0xe0, 0x44, 0x81, 0x2a, 0x70, 0x20, + 0x80, 0x60, 0x99, 0x03, 0x9a, 0x02, 0x5a, 0x50, + 0x80, 0xa0, 0x22, 0x08, 0x99, 0x06, 0x80, 0x0a, + 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x15, 0xff, 0x22, + 0x26, 0x04, 0xe0, 0x34, 0x21, 0xff, 0x31, 0x01, + 0x1d, 0x2a, 0xf7, 0xff, 0xfa, 0x2d, 0x1c, 0x01, + 0x20, 0x0c, 0x29, 0x00, 0xd0, 0x16, 0x29, 0x07, + 0xd1, 0x29, 0x26, 0x01, 0x70, 0x26, 0x21, 0x08, + 0x80, 0x61, 0x99, 0x03, 0x9a, 0x02, 0x5a, 0x51, + 0x80, 0xa1, 0x21, 0x02, 0x71, 0xa1, 0x68, 0x69, + 0x81, 0x21, 0x99, 0x06, 0x80, 0x08, 0x1c, 0x02, + 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x15, 0xff, 0x02, + 0x81, 0x2e, 0xe0, 0x13, 0x23, 0x01, 0x70, 0x23, + 0x21, 0x08, 0x80, 0x61, 0x99, 0x03, 0x9a, 0x02, + 0x5a, 0x51, 0x80, 0xa1, 0x71, 0xa3, 0x68, 0x69, + 0x81, 0x21, 0x99, 0x06, 0x80, 0x08, 0x1c, 0x02, + 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x15, 0xfe, 0xee, + 0x21, 0x02, 0x81, 0x29, 0x26, 0x01, 0x98, 0x04, + 0x8a, 0x00, 0x30, 0x01, 0x99, 0x04, 0x82, 0x08, + 0x23, 0x10, 0x98, 0x04, 0x5e, 0xc0, 0x28, 0x02, + 0xd1, 0x02, 0x20, 0x00, 0x99, 0x04, 0x82, 0x08, + 0x1c, 0x30, 0xb0, 0x05, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x54, + 0x2e, 0x08, 0x54, 0x50, 0x2e, 0x08, 0x54, 0x40, + 0xb5, 0x80, 0x27, 0x00, 0x78, 0x00, 0x49, 0x0d, + 0x72, 0x08, 0x7a, 0x0b, 0x48, 0x0c, 0x2b, 0x01, + 0xd1, 0x06, 0xca, 0x08, 0xc0, 0x08, 0xca, 0x08, + 0xc0, 0x08, 0xca, 0x0c, 0xc0, 0x0c, 0xe0, 0x07, + 0x68, 0xc9, 0x60, 0x01, 0x1c, 0x08, 0x49, 0x07, + 0xf7, 0xff, 0xff, 0x41, 0x1c, 0x07, 0xd0, 0x01, + 0xf0, 0x00, 0xf8, 0x50, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x6c, + 0x2e, 0x08, 0x54, 0x70, 0x2e, 0x08, 0x1a, 0x7c, + 0xb5, 0xb0, 0x24, 0x00, 0x4f, 0x17, 0x72, 0x3c, + 0x20, 0x01, 0xf0, 0x02, 0xff, 0xc3, 0x28, 0x00, + 0xd1, 0x03, 0x43, 0xc0, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0xf7, 0xff, 0xf9, 0x25, 0x28, 0x00, + 0xdc, 0x04, 0x20, 0x01, 0x43, 0xc0, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x25, 0x01, + 0x49, 0x0d, 0x00, 0x82, 0x18, 0x53, 0x70, 0x9d, + 0x52, 0x8c, 0x30, 0x01, 0x28, 0x02, 0xdb, 0xf8, + 0x68, 0xf8, 0x28, 0x00, 0xd1, 0x0a, 0x20, 0xff, + 0x30, 0x0d, 0xf0, 0x02, 0xff, 0x67, 0x60, 0xf8, + 0x28, 0x00, 0xd1, 0x03, 0x38, 0x03, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x28, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x6c, + 0x2e, 0x08, 0x1a, 0x6c, 0xb5, 0x80, 0x4f, 0x06, + 0x68, 0xf8, 0xf0, 0x02, 0xff, 0x79, 0x20, 0x00, + 0x60, 0xf8, 0xf7, 0xff, 0xf9, 0x53, 0xf0, 0x02, + 0xfe, 0x45, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x6c, 0xb5, 0x80, 0x21, 0x00, + 0x48, 0x18, 0x7a, 0x02, 0x48, 0x18, 0x2a, 0x01, + 0xd1, 0x0e, 0x78, 0x42, 0x2a, 0x13, 0xd1, 0x03, + 0x68, 0x87, 0xf0, 0x00, 0xf8, 0x2b, 0x1c, 0x01, + 0x29, 0x00, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x02, + 0xff, 0x5b, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x68, 0x00, 0x78, 0x00, 0x28, 0x01, 0xd0, 0x14, + 0x28, 0x02, 0xd0, 0x08, 0x28, 0x03, 0xd0, 0x0b, + 0x28, 0x04, 0xd1, 0xf2, 0xf0, 0x00, 0xf8, 0x8c, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x00, + 0xf8, 0x6b, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0xf0, 0x00, 0xf8, 0x4c, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0xf0, 0x00, 0xf8, 0x23, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x6c, + 0x2e, 0x08, 0x54, 0x70, 0xb5, 0x80, 0xb0, 0x83, + 0x4f, 0x0b, 0x88, 0xb8, 0xf0, 0x00, 0xf8, 0xae, + 0x28, 0x00, 0xdb, 0x0a, 0x88, 0xf9, 0xab, 0x02, + 0x80, 0x19, 0x68, 0xb9, 0x91, 0x01, 0x46, 0x6b, + 0x21, 0x13, 0xaa, 0x01, 0xf0, 0x00, 0xf8, 0xd6, + 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x00, + 0xb0, 0x03, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x70, 0xb5, 0xf0, 0xb0, 0x83, + 0x4e, 0x0f, 0x68, 0x30, 0x88, 0x84, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x6e, 0x25, 0x01, 0x1c, 0x07, + 0xd4, 0x11, 0x68, 0x30, 0x79, 0x81, 0xab, 0x01, + 0x70, 0x19, 0x89, 0x00, 0x80, 0x58, 0x46, 0x6b, + 0x21, 0x01, 0x1c, 0x38, 0xaa, 0x01, 0xf0, 0x00, + 0xf8, 0xb5, 0x28, 0x00, 0xd1, 0x03, 0x1c, 0x38, + 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x91, 0x1c, 0x28, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x70, 0xb5, 0x90, 0xb0, 0x83, + 0x4c, 0x0a, 0x68, 0x20, 0x88, 0x80, 0xf0, 0x00, + 0xf8, 0x4b, 0x27, 0x01, 0x28, 0x00, 0xdb, 0x08, + 0x68, 0x21, 0x79, 0x89, 0xab, 0x01, 0x70, 0x19, + 0x46, 0x6b, 0x21, 0x03, 0xaa, 0x01, 0xf0, 0x00, + 0xf8, 0x95, 0x1c, 0x38, 0xb0, 0x03, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x70, + 0xb5, 0x90, 0xb0, 0x83, 0x4c, 0x0b, 0x68, 0x20, + 0x88, 0x80, 0xf0, 0x00, 0xf8, 0x53, 0x27, 0x01, + 0x28, 0x00, 0xdb, 0x0a, 0x68, 0x21, 0x88, 0xca, + 0xab, 0x02, 0x80, 0x1a, 0x31, 0x08, 0x91, 0x01, + 0x46, 0x6b, 0x21, 0x02, 0xaa, 0x01, 0xf0, 0x00, + 0xf8, 0x79, 0x1c, 0x38, 0xb0, 0x03, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x70, + 0xb5, 0xb0, 0xb0, 0x81, 0x48, 0x0b, 0x68, 0x00, + 0x88, 0x84, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x36, + 0x25, 0x01, 0x1c, 0x07, 0xd4, 0x09, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x04, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x61, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, + 0xf8, 0x3f, 0x1c, 0x28, 0xb0, 0x01, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x70, + 0xb4, 0x80, 0x04, 0x03, 0x0c, 0x1b, 0x20, 0x00, + 0x49, 0x0d, 0x00, 0x82, 0x18, 0x57, 0x78, 0xbf, + 0x2f, 0x01, 0xd1, 0x06, 0x00, 0x87, 0x53, 0xcb, + 0x23, 0x02, 0x18, 0x51, 0x70, 0x8b, 0xbc, 0x80, + 0x47, 0x70, 0x5a, 0x8a, 0x42, 0x9a, 0xd1, 0x03, + 0x20, 0x01, 0x43, 0xc0, 0xbc, 0x80, 0x47, 0x70, + 0x30, 0x01, 0x28, 0x02, 0xdb, 0xe9, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0x6c, 0xb4, 0x80, 0x04, 0x02, + 0x0c, 0x12, 0x20, 0x00, 0x49, 0x07, 0x00, 0x83, + 0x18, 0x5f, 0x78, 0xbf, 0x2f, 0x01, 0xd0, 0x02, + 0x5a, 0xcb, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, + 0x28, 0x02, 0xdb, 0xf4, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0x6c, + 0xb4, 0x80, 0x28, 0x00, 0xda, 0x05, 0x28, 0x02, + 0xdb, 0x03, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, + 0x47, 0x70, 0x23, 0x01, 0x00, 0x82, 0x49, 0x03, + 0x18, 0x57, 0x70, 0xbb, 0x23, 0x00, 0x52, 0x8b, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0x6c, + 0xb5, 0x00, 0x49, 0x03, 0x78, 0x08, 0xf0, 0x02, + 0xfd, 0x77, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x70, 0xb5, 0x90, 0x06, 0x09, + 0x0e, 0x09, 0x00, 0x87, 0x4c, 0x0a, 0x19, 0x3f, + 0x78, 0xbf, 0x2f, 0x02, 0xd0, 0x06, 0x2f, 0x03, + 0xd1, 0x09, 0xf0, 0x00, 0xf8, 0x39, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x00, 0xf8, 0x0a, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0x6c, 0xb5, 0x90, 0x06, 0x09, + 0x0e, 0x09, 0x27, 0x01, 0x60, 0x1f, 0x29, 0x01, + 0xd1, 0x19, 0x23, 0x12, 0x49, 0x0e, 0x70, 0x0b, + 0x23, 0x11, 0x70, 0x4b, 0x23, 0x08, 0x80, 0x4b, + 0x00, 0x84, 0x4f, 0x0c, 0x5b, 0x38, 0x80, 0x88, + 0x78, 0x10, 0x71, 0x88, 0x88, 0x50, 0x81, 0x08, + 0xf7, 0xff, 0xff, 0xc2, 0x28, 0x00, 0xd0, 0x06, + 0x20, 0x03, 0x19, 0xe1, 0x70, 0x88, 0x20, 0x01, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x70, 0x2e, 0x08, 0x1a, 0x6c, + 0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x17, + 0x22, 0x01, 0xb0, 0x81, 0x9b, 0x04, 0x25, 0x01, + 0x00, 0x86, 0x60, 0x1a, 0x48, 0x38, 0x90, 0x00, + 0x4c, 0x38, 0x29, 0x02, 0xd0, 0x23, 0x29, 0x03, + 0xd0, 0x41, 0x29, 0x04, 0xd0, 0x4f, 0x29, 0x13, + 0xd1, 0x5e, 0x88, 0xba, 0x98, 0x00, 0x5b, 0x80, + 0x68, 0x39, 0xf7, 0xfe, 0xff, 0x9d, 0x1c, 0x05, + 0xd1, 0x11, 0x20, 0x12, 0x70, 0x20, 0x20, 0x15, + 0x70, 0x60, 0x20, 0x04, 0x80, 0x60, 0x98, 0x00, + 0x5b, 0x80, 0x80, 0xa0, 0xf7, 0xff, 0xff, 0x88, + 0x28, 0x00, 0xd0, 0x4b, 0x20, 0x00, 0x9b, 0x04, + 0x25, 0x01, 0x60, 0x18, 0xe0, 0x46, 0x20, 0x00, + 0x9b, 0x04, 0x60, 0x18, 0xe0, 0x41, 0x88, 0xb8, + 0xf0, 0x02, 0xfd, 0xac, 0x60, 0xa0, 0x1c, 0x01, + 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x3b, 0x20, 0x12, + 0x70, 0x20, 0x20, 0x13, 0x70, 0x60, 0x20, 0x08, + 0x80, 0x60, 0x98, 0x00, 0x5b, 0x80, 0x80, 0xa0, + 0x88, 0xb8, 0x80, 0xe0, 0x88, 0xba, 0x1c, 0x08, + 0x68, 0x39, 0xf0, 0x15, 0xfc, 0xb7, 0xf7, 0xff, + 0xff, 0x63, 0x28, 0x00, 0xd1, 0x26, 0x68, 0xa0, + 0xf0, 0x02, 0xfd, 0xb6, 0xe0, 0x21, 0x20, 0x12, + 0x70, 0x20, 0x20, 0x14, 0x70, 0x60, 0x20, 0x04, + 0x80, 0x60, 0x98, 0x00, 0x5b, 0x80, 0x80, 0xa0, + 0x78, 0x38, 0x80, 0xa0, 0xf7, 0xff, 0xff, 0x50, + 0x28, 0x00, 0xd1, 0x13, 0xe0, 0x11, 0x20, 0x12, + 0x70, 0x20, 0x70, 0x60, 0x20, 0x04, 0x80, 0x60, + 0x98, 0x00, 0x5b, 0x80, 0x80, 0xa0, 0xf7, 0xff, + 0xff, 0x43, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x02, + 0x99, 0x00, 0x18, 0x71, 0x70, 0x88, 0xe0, 0x01, + 0xe7, 0xff, 0x25, 0x00, 0x1c, 0x28, 0xb0, 0x01, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x6c, 0x2e, 0x08, 0x54, 0x70, + 0xb5, 0xf0, 0x1c, 0x17, 0x06, 0x02, 0x0e, 0x12, + 0x04, 0x0c, 0x0c, 0x24, 0x1c, 0x59, 0x1c, 0x48, + 0x1c, 0x1d, 0x1c, 0x43, 0xb0, 0x81, 0x93, 0x00, + 0x1f, 0xd6, 0x3e, 0x89, 0x2e, 0x07, 0xd2, 0x51, + 0xa3, 0x01, 0x5d, 0x9b, 0x00, 0x5b, 0x44, 0x9f, + 0x03, 0x4d, 0x14, 0x3e, 0x4d, 0x27, 0x31, 0x00, + 0x70, 0x2a, 0x1c, 0x0d, 0x21, 0x02, 0x70, 0x29, + 0x1c, 0x01, 0x1c, 0x05, 0x1c, 0x20, 0xf0, 0x00, + 0xf8, 0xab, 0x88, 0xba, 0x68, 0x39, 0x1c, 0xa8, + 0xf0, 0x15, 0xfc, 0x5c, 0x88, 0xb8, 0x30, 0x04, + 0xe0, 0x3a, 0x70, 0x2a, 0x1c, 0x0d, 0x21, 0x07, + 0x70, 0x29, 0x1c, 0x05, 0x79, 0x38, 0x70, 0x28, + 0x9d, 0x00, 0x22, 0x04, 0x1c, 0x28, 0x1c, 0x39, + 0xf0, 0x15, 0xfc, 0x4c, 0x1c, 0x20, 0x1d, 0x29, + 0xf0, 0x00, 0xf8, 0x92, 0x20, 0x09, 0xe0, 0x27, + 0x70, 0x2a, 0x1c, 0x0d, 0x21, 0x02, 0x70, 0x29, + 0x1c, 0x01, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x88, + 0x20, 0x04, 0xe0, 0x1d, 0x70, 0x2a, 0x1c, 0x0d, + 0x21, 0x03, 0x70, 0x29, 0x1c, 0x05, 0x78, 0xb8, + 0x70, 0x28, 0x99, 0x00, 0x1c, 0x20, 0xf0, 0x00, + 0xf8, 0x7b, 0x20, 0x05, 0xe0, 0x10, 0x70, 0x2a, + 0x1c, 0x0d, 0x21, 0x06, 0x70, 0x29, 0x22, 0x04, + 0x1c, 0x39, 0x1c, 0x05, 0xf0, 0x15, 0xfc, 0x26, + 0x1c, 0x20, 0x1d, 0x29, 0xf0, 0x00, 0xf8, 0x6c, + 0x20, 0x08, 0xe0, 0x01, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf0, 0x1c, 0x0f, 0x78, 0x01, 0x9d, 0x05, + 0x70, 0x11, 0x78, 0x41, 0x78, 0x12, 0x1c, 0x86, + 0x30, 0x03, 0x3a, 0x90, 0x1c, 0x1c, 0x2a, 0x07, + 0xd2, 0x51, 0xa3, 0x02, 0x5c, 0x9b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x11, 0x4d, 0x4d, + 0x1b, 0x2e, 0x39, 0x00, 0x29, 0x02, 0xd1, 0x3d, + 0x1c, 0x30, 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x4e, + 0x1c, 0xb0, 0x60, 0x28, 0x1f, 0x38, 0x80, 0xa8, + 0x88, 0x20, 0x80, 0xe8, 0xe0, 0x37, 0x29, 0x04, + 0xd1, 0x30, 0x22, 0x04, 0x1c, 0x68, 0x1c, 0x31, + 0xf0, 0x15, 0xfb, 0xf0, 0x2f, 0x06, 0xd0, 0x2e, + 0xe0, 0x28, 0x29, 0x07, 0xd1, 0x26, 0x78, 0x31, + 0x71, 0x29, 0x1c, 0x01, 0x1c, 0x06, 0x22, 0x04, + 0x1c, 0x28, 0xf0, 0x15, 0xfb, 0xe3, 0x1d, 0x30, + 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x2f, 0x88, 0x20, + 0x80, 0xe8, 0x2f, 0x09, 0xd0, 0x1b, 0xe0, 0x15, + 0x29, 0x02, 0xd1, 0x13, 0x1c, 0x30, 0x1c, 0x21, + 0xf0, 0x00, 0xf8, 0x24, 0x88, 0x20, 0x80, 0x28, + 0x2f, 0x04, 0xd0, 0x10, 0xe0, 0x0a, 0x29, 0x03, + 0xd1, 0x08, 0x78, 0x31, 0x70, 0xa9, 0x1c, 0x21, + 0xf0, 0x00, 0xf8, 0x18, 0x88, 0x20, 0x80, 0x28, + 0x2f, 0x05, 0xd0, 0x04, 0x20, 0x01, 0x43, 0xc0, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x06, 0x00, 0x0e, 0x00, 0x0a, 0x02, 0x70, 0x0a, + 0x70, 0x48, 0x47, 0x70, 0x78, 0x02, 0x02, 0x12, + 0x78, 0x40, 0x18, 0x10, 0x80, 0x08, 0x47, 0x70, + 0xb5, 0x00, 0x78, 0x01, 0x48, 0x0b, 0x71, 0x01, + 0x79, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x02, + 0xd1, 0x0b, 0x48, 0x09, 0xca, 0x08, 0xc0, 0x08, + 0xca, 0x08, 0xc0, 0x08, 0xca, 0x0c, 0xc0, 0x0c, + 0xf0, 0x00, 0xf8, 0x37, 0x20, 0x00, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x80, + 0x2e, 0x08, 0x54, 0x80, 0xb5, 0x80, 0x20, 0x04, + 0xf0, 0x02, 0xfc, 0xa4, 0x22, 0x00, 0x28, 0x00, + 0xda, 0x03, 0x1c, 0x10, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x48, 0x0a, 0x71, 0x02, 0x21, 0x00, + 0x20, 0x01, 0x4b, 0x09, 0x01, 0x0f, 0x55, 0xd8, + 0x31, 0x01, 0x29, 0x20, 0xdb, 0xfa, 0x21, 0x00, + 0x4b, 0x06, 0x00, 0x4f, 0x53, 0xda, 0x31, 0x01, + 0x29, 0x10, 0xdb, 0xfa, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x80, + 0x2e, 0x08, 0x54, 0xa0, 0x2e, 0x08, 0x56, 0xa0, + 0xb5, 0x00, 0xf0, 0x02, 0xfb, 0x3b, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x80, 0x20, 0x00, 0x49, 0x1e, + 0x79, 0x0a, 0x49, 0x1e, 0x2a, 0x01, 0xd1, 0x26, + 0x78, 0x4a, 0x2a, 0x43, 0xd0, 0x1d, 0xdc, 0x09, + 0x2a, 0x31, 0xd0, 0x14, 0x2a, 0x33, 0xd0, 0x15, + 0x2a, 0x34, 0xd1, 0x25, 0x68, 0x8f, 0xf0, 0x00, + 0xf8, 0x2f, 0xe0, 0x21, 0x2a, 0x45, 0xd0, 0x06, + 0x2a, 0x46, 0xd0, 0x11, 0x2a, 0x48, 0xd1, 0x1b, + 0xf0, 0x00, 0xf8, 0xcc, 0xe0, 0x18, 0x68, 0x8f, + 0xf0, 0x00, 0xf8, 0x6a, 0xe0, 0x14, 0xf0, 0x00, + 0xf8, 0x8b, 0xe0, 0x11, 0xf0, 0x00, 0xf8, 0x92, + 0xe0, 0x0e, 0xf0, 0x00, 0xf8, 0xc9, 0xe0, 0x0b, + 0xf0, 0x00, 0xf8, 0xf0, 0xe0, 0x08, 0x88, 0x08, + 0x28, 0x70, 0xdb, 0x04, 0x28, 0x80, 0xda, 0x02, + 0xf0, 0x00, 0xf9, 0x0c, 0xe0, 0x00, 0x20, 0x01, + 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x02, + 0xfc, 0x2b, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x80, 0x2e, 0x08, 0x54, 0x80, + 0xb5, 0x90, 0xb0, 0x85, 0xaa, 0x01, 0xb4, 0x04, + 0x4f, 0x1f, 0x89, 0xb9, 0x68, 0xb8, 0xaa, 0x05, + 0xab, 0x04, 0xf7, 0xff, 0xfe, 0xf9, 0x24, 0x00, + 0xb0, 0x01, 0x28, 0x00, 0xda, 0x01, 0x1c, 0x20, + 0xe0, 0x2d, 0xa8, 0x04, 0x78, 0x00, 0x28, 0x91, + 0xd0, 0x06, 0xa8, 0x03, 0x88, 0x00, 0xf0, 0x00, + 0xf9, 0x4f, 0x1c, 0x07, 0xd4, 0xf3, 0xe0, 0x10, + 0x79, 0x38, 0xab, 0x01, 0x70, 0x18, 0xa8, 0x01, + 0x78, 0x00, 0xf0, 0x00, 0xf8, 0xff, 0x28, 0x00, + 0xda, 0x06, 0x20, 0xf1, 0xab, 0x02, 0x70, 0x58, + 0xa8, 0x01, 0xf0, 0x00, 0xfe, 0x77, 0xe0, 0x12, + 0x1c, 0x07, 0x46, 0x6b, 0xa9, 0x04, 0x78, 0x09, + 0x1c, 0x38, 0xaa, 0x01, 0xf0, 0x00, 0xf9, 0xe2, + 0x28, 0x00, 0xd0, 0xd8, 0x01, 0x38, 0x49, 0x07, + 0x5c, 0x08, 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x0c, 0x98, 0x00, 0xb0, 0x05, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0x90, 0xb0, 0x81, 0x4c, 0x0e, 0x88, 0xa0, + 0xf0, 0x00, 0xf9, 0x1a, 0x1c, 0x07, 0xd4, 0x07, + 0x78, 0x61, 0x46, 0x6b, 0x22, 0x00, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0xc0, 0x28, 0x00, 0xd1, 0x01, + 0x20, 0x00, 0x90, 0x00, 0x01, 0x38, 0x49, 0x07, + 0x5c, 0x08, 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0xe8, 0x98, 0x00, 0xb0, 0x01, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0x00, 0x48, 0x03, 0x79, 0x00, 0xf0, 0x00, + 0xfd, 0xef, 0x20, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x80, 0xb5, 0xf0, 0xb0, 0x83, + 0x4e, 0x14, 0x79, 0x30, 0xab, 0x00, 0x70, 0x18, + 0x27, 0x00, 0x4c, 0x13, 0x01, 0x3d, 0x5d, 0x60, + 0x28, 0x01, 0xd0, 0x13, 0x19, 0x29, 0x78, 0x4a, + 0x79, 0x30, 0x42, 0x82, 0xd0, 0x02, 0x79, 0x09, + 0x42, 0x81, 0xd1, 0x0b, 0x78, 0x71, 0x46, 0x6a, + 0x1c, 0x38, 0xab, 0x02, 0xf0, 0x00, 0xf9, 0x86, + 0x5d, 0x60, 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0xb4, 0x37, 0x01, 0x2f, 0x20, + 0xdb, 0xe4, 0xa8, 0x00, 0x78, 0x00, 0xf0, 0x00, + 0xfd, 0xd9, 0x98, 0x02, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, + 0x2e, 0x08, 0x54, 0xa0, 0xb5, 0x00, 0x48, 0x03, + 0x79, 0x00, 0xf0, 0x00, 0xfd, 0xe1, 0x20, 0x01, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, + 0xb5, 0x90, 0xb0, 0x83, 0x4c, 0x11, 0x88, 0xa0, + 0xf0, 0x00, 0xf8, 0xb2, 0x1c, 0x07, 0xd5, 0x01, + 0x20, 0x01, 0xe0, 0x0c, 0x79, 0xa0, 0xab, 0x01, + 0x70, 0x18, 0x79, 0xe0, 0x70, 0x58, 0x78, 0x61, + 0x46, 0x6a, 0x1c, 0x38, 0x33, 0x04, 0xf0, 0x00, + 0xf9, 0x51, 0x28, 0x00, 0xd1, 0x00, 0x90, 0x02, + 0x01, 0x38, 0x49, 0x07, 0x5c, 0x08, 0x28, 0x02, + 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x7a, + 0x98, 0x02, 0xb0, 0x03, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x80, + 0x2e, 0x08, 0x54, 0xa0, 0xb5, 0x90, 0xb0, 0x81, + 0x4c, 0x0e, 0x88, 0xa0, 0xf0, 0x00, 0xf8, 0x88, + 0x1c, 0x07, 0xd5, 0x01, 0x20, 0x01, 0xe0, 0x07, + 0x78, 0x61, 0x46, 0x6b, 0x22, 0x00, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x2c, 0x28, 0x00, 0xd1, 0x00, + 0x90, 0x00, 0x01, 0x38, 0x49, 0x06, 0x5c, 0x08, + 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x55, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, + 0x2e, 0x08, 0x54, 0xa0, 0xb5, 0x80, 0xb0, 0x81, + 0x48, 0x0e, 0x88, 0x00, 0xf0, 0x00, 0xf8, 0x9e, + 0x1c, 0x07, 0xd5, 0x01, 0x20, 0x01, 0xe0, 0x11, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xd3, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x70, 0x1c, 0x38, 0xf0, 0x00, + 0xf9, 0x05, 0x01, 0x38, 0x49, 0x06, 0x5c, 0x08, + 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x31, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, + 0x2e, 0x08, 0x54, 0xa0, 0xb4, 0xb0, 0x06, 0x02, + 0x0e, 0x12, 0x49, 0x10, 0x23, 0x00, 0x5e, 0xcc, + 0x43, 0xdf, 0x2c, 0x20, 0xda, 0x17, 0x20, 0x00, + 0x4b, 0x0d, 0x01, 0x05, 0x5d, 0x5d, 0x2d, 0x01, + 0xd1, 0x0e, 0x25, 0x02, 0x01, 0x07, 0x55, 0xdd, + 0x18, 0xfb, 0x70, 0x5a, 0x1c, 0x42, 0x80, 0x5a, + 0x22, 0x00, 0x71, 0x1a, 0x80, 0xda, 0x81, 0x1a, + 0x1c, 0x62, 0x80, 0x0a, 0xbc, 0xb0, 0x47, 0x70, + 0x30, 0x01, 0x28, 0x20, 0xdb, 0xe9, 0x1c, 0x38, + 0xbc, 0xb0, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0x80, + 0x2e, 0x08, 0x54, 0xa0, 0xb5, 0x80, 0x1c, 0x07, + 0xd5, 0x06, 0x2f, 0x20, 0xdb, 0x04, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x87, 0x21, 0x01, + 0x01, 0x38, 0x4a, 0x05, 0x54, 0x11, 0x48, 0x05, + 0x88, 0x01, 0x39, 0x01, 0x80, 0x01, 0x1c, 0x38, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0xa0, 0x2e, 0x08, 0x1a, 0x80, + 0xb4, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, + 0x49, 0x09, 0x01, 0x03, 0x5c, 0xcf, 0x2f, 0x01, + 0xd0, 0x06, 0x18, 0x5b, 0x88, 0x5f, 0x42, 0x97, + 0xd0, 0x07, 0x88, 0xdb, 0x42, 0x93, 0xd0, 0x04, + 0x30, 0x01, 0x28, 0x20, 0xdb, 0xf1, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0xa0, 0xb4, 0x90, 0x04, 0x02, + 0x0c, 0x12, 0x06, 0x0b, 0x0e, 0x1b, 0x20, 0x00, + 0x49, 0x0b, 0x01, 0x07, 0x5d, 0xcc, 0x2c, 0x01, + 0xd0, 0x0b, 0x18, 0x7f, 0x88, 0x7f, 0x42, 0x97, + 0xd1, 0x07, 0x01, 0x02, 0x18, 0x51, 0x71, 0x0b, + 0x1d, 0xc2, 0x32, 0x1a, 0x80, 0xca, 0xbc, 0x90, + 0x47, 0x70, 0x30, 0x01, 0x28, 0x20, 0xdb, 0xec, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0x47, 0x70, + 0x2e, 0x08, 0x54, 0xa0, 0xb4, 0x80, 0x04, 0x02, + 0x0c, 0x12, 0x20, 0x00, 0x49, 0x07, 0x01, 0x03, + 0x5c, 0xcf, 0x2f, 0x01, 0xd0, 0x03, 0x18, 0x5b, + 0x89, 0x1b, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, + 0x28, 0x20, 0xdb, 0xf4, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0x80, 0x04, 0x01, 0x0c, 0x09, 0x22, 0x00, + 0x20, 0x00, 0x4b, 0x0f, 0x00, 0x47, 0x5b, 0xdf, + 0x2f, 0x00, 0xd1, 0x06, 0x1d, 0xc2, 0x32, 0x69, + 0x04, 0x12, 0x0c, 0x12, 0x00, 0x40, 0x52, 0x1a, + 0xe0, 0x02, 0x30, 0x01, 0x28, 0x10, 0xdd, 0xf1, + 0x2a, 0x00, 0xd0, 0x09, 0x20, 0x01, 0x04, 0x80, + 0x43, 0x10, 0xf0, 0x02, 0xf9, 0xdf, 0x04, 0x00, + 0x0c, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xa0, 0xb5, 0x90, 0x1c, 0x07, + 0x01, 0x00, 0x49, 0x0e, 0x18, 0x44, 0x89, 0x20, + 0x28, 0x00, 0xd0, 0x13, 0xf0, 0x02, 0xfa, 0x02, + 0x20, 0x00, 0x49, 0x0b, 0x01, 0x3a, 0x4b, 0x09, + 0x18, 0xd2, 0x89, 0x13, 0x22, 0x00, 0x00, 0x47, + 0x5b, 0xcf, 0x42, 0x9f, 0xd1, 0x02, 0x00, 0x40, + 0x52, 0x0a, 0xe0, 0x02, 0x30, 0x01, 0x28, 0x10, + 0xdd, 0xf5, 0x81, 0x22, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0xa0, + 0x2e, 0x08, 0x56, 0xa0, 0xb5, 0x00, 0x49, 0x03, + 0x78, 0x08, 0xf0, 0x02, 0xf9, 0x41, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x80, + 0xb5, 0x00, 0x49, 0x03, 0x78, 0x08, 0xf0, 0x02, + 0xf9, 0x37, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x90, 0xb5, 0x90, 0x06, 0x09, + 0x0e, 0x09, 0x1c, 0x1f, 0x01, 0x03, 0x4c, 0x1d, + 0x5c, 0xe3, 0x1e, 0x9c, 0x2c, 0x07, 0xd2, 0x31, + 0xa3, 0x01, 0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, + 0x09, 0x15, 0x03, 0x0f, 0x1b, 0x21, 0x27, 0x00, + 0x1c, 0x3b, 0xf0, 0x00, 0xf9, 0x23, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x3b, 0xf0, 0x00, + 0xf8, 0x27, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x3b, 0xf0, 0x00, 0xf8, 0x5d, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x3b, 0xf0, 0x00, + 0xfa, 0x51, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x3b, 0xf0, 0x00, 0xfb, 0x65, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x3b, 0xf0, 0x00, + 0xfa, 0xf1, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x3b, 0xf0, 0x00, 0xfb, 0x35, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x1f, + 0x23, 0x01, 0x60, 0x3b, 0xb0, 0x81, 0x29, 0x91, + 0xd1, 0x23, 0x21, 0x45, 0x4b, 0x16, 0x70, 0x19, + 0x21, 0x42, 0x70, 0x59, 0x21, 0x08, 0x80, 0x59, + 0x01, 0x06, 0x4d, 0x14, 0x19, 0x74, 0x78, 0x60, + 0x71, 0x18, 0x88, 0x60, 0x80, 0xd8, 0x1c, 0x51, + 0x91, 0x00, 0x22, 0x04, 0x1d, 0xd8, 0x30, 0x01, + 0xf0, 0x15, 0xf8, 0xa8, 0xf7, 0xff, 0xff, 0x8a, + 0x28, 0x00, 0xd1, 0x01, 0x60, 0x38, 0xe0, 0x0f, + 0x22, 0x04, 0x99, 0x00, 0x1d, 0xe0, 0x30, 0x03, + 0xf0, 0x15, 0xf8, 0x9c, 0x20, 0x05, 0x55, 0xa8, + 0xe0, 0x03, 0x29, 0x7f, 0xdc, 0x01, 0x29, 0x45, + 0xd1, 0x01, 0x20, 0x00, 0x60, 0x38, 0x20, 0x01, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0xff, 0x1c, 0x04, 0x06, 0x08, 0x0e, 0x00, + 0x21, 0x01, 0xb0, 0x84, 0x9b, 0x07, 0x25, 0x01, + 0x60, 0x19, 0x4e, 0x55, 0x01, 0x21, 0x91, 0x03, + 0x28, 0x33, 0xd0, 0x5d, 0x28, 0x43, 0xd1, 0x5c, + 0x20, 0x09, 0xf0, 0x02, 0xf9, 0x57, 0x4f, 0x51, + 0x60, 0xb8, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x01, + 0xe0, 0x94, 0x9a, 0x06, 0x79, 0x51, 0x01, 0x20, + 0x4a, 0x4b, 0x18, 0x84, 0x1d, 0xe0, 0x30, 0x03, + 0x90, 0x02, 0x29, 0x00, 0xd0, 0x4a, 0x88, 0x60, + 0xf7, 0xff, 0xfe, 0xc8, 0x28, 0x00, 0xda, 0x20, + 0x20, 0xf1, 0xab, 0x01, 0x70, 0x18, 0x46, 0x68, + 0x22, 0x04, 0x99, 0x02, 0xf0, 0x15, 0xf8, 0x5a, + 0x20, 0x43, 0x70, 0x38, 0x20, 0x34, 0x70, 0x78, + 0x20, 0x0c, 0x80, 0x78, 0x78, 0x60, 0x71, 0x38, + 0x88, 0x61, 0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, + 0xf7, 0xff, 0xfb, 0xca, 0x81, 0xb8, 0xf7, 0xff, + 0xff, 0x2d, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x00, + 0x9b, 0x07, 0x60, 0x18, 0xe0, 0x55, 0x20, 0x02, + 0xe0, 0x1e, 0x46, 0x68, 0x22, 0x04, 0x99, 0x02, + 0xf0, 0x15, 0xf8, 0x3c, 0x20, 0x43, 0x70, 0x38, + 0x20, 0x34, 0x70, 0x78, 0x20, 0x0c, 0x80, 0x78, + 0x9a, 0x06, 0x79, 0x50, 0x71, 0x38, 0x88, 0xe1, + 0x46, 0x6a, 0x20, 0x93, 0x68, 0xbb, 0xf7, 0xff, + 0xfb, 0xab, 0x81, 0xb8, 0xf7, 0xff, 0xff, 0x0e, + 0x28, 0x00, 0xd0, 0xe0, 0x20, 0x7d, 0x00, 0xc0, + 0xf7, 0xff, 0xfe, 0xbe, 0x81, 0x20, 0x20, 0x03, + 0x99, 0x03, 0x54, 0x70, 0x25, 0x01, 0xe0, 0x40, + 0xe0, 0x34, 0xe0, 0x37, 0x9a, 0x06, 0x79, 0x10, + 0xab, 0x01, 0x70, 0x18, 0x46, 0x68, 0x22, 0x04, + 0x99, 0x02, 0xf0, 0x15, 0xf8, 0x13, 0x20, 0x43, + 0x70, 0x38, 0x20, 0x34, 0x70, 0x78, 0x20, 0x0c, + 0x80, 0x78, 0x78, 0x60, 0x71, 0x38, 0x88, 0x61, + 0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, 0xf7, 0xff, + 0xfb, 0x83, 0x81, 0xb8, 0xf7, 0xff, 0xfe, 0xe6, + 0x28, 0x00, 0xd0, 0xb8, 0x9a, 0x06, 0x79, 0x10, + 0x28, 0x00, 0xd1, 0x13, 0x21, 0x45, 0x48, 0x14, + 0x70, 0x01, 0x21, 0x44, 0x70, 0x41, 0x27, 0x04, + 0x80, 0x47, 0x78, 0x61, 0x71, 0x81, 0x88, 0x61, + 0x80, 0x81, 0xf7, 0xff, 0xfe, 0xdd, 0x28, 0x00, + 0xd1, 0x01, 0x25, 0x00, 0xe0, 0x0d, 0x99, 0x03, + 0x54, 0x77, 0xe0, 0x0a, 0x20, 0x02, 0x99, 0x03, + 0x54, 0x70, 0xe0, 0x06, 0x28, 0x7f, 0xdc, 0x01, + 0x28, 0x45, 0xd1, 0x02, 0x20, 0x00, 0x9b, 0x07, + 0x60, 0x18, 0x1c, 0x28, 0xb0, 0x04, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0xa0, 0x2e, 0x08, 0x54, 0x80, + 0x2e, 0x08, 0x54, 0x90, 0xb5, 0xff, 0x06, 0x09, + 0x0e, 0x09, 0x22, 0x01, 0xb0, 0x83, 0x9b, 0x06, + 0x01, 0x00, 0x60, 0x1a, 0x90, 0x02, 0x4e, 0x98, + 0x19, 0x84, 0x4f, 0x98, 0x4d, 0x98, 0x29, 0x46, + 0xd0, 0x5d, 0xdc, 0x0e, 0x29, 0x33, 0xd0, 0x5b, + 0x29, 0x45, 0xd1, 0x5a, 0x89, 0xb8, 0x30, 0x04, + 0x04, 0x00, 0x0c, 0x00, 0xf0, 0x02, 0xf8, 0x96, + 0x60, 0xa8, 0x28, 0x00, 0xd1, 0x33, 0x20, 0x00, + 0xe0, 0xcf, 0x29, 0x90, 0xd0, 0x52, 0x29, 0x95, + 0xd1, 0x4b, 0x88, 0xe0, 0x28, 0x00, 0xd1, 0x6c, + 0x22, 0x05, 0x21, 0x04, 0x68, 0xb8, 0xf0, 0x02, + 0xf8, 0x8a, 0x60, 0xb8, 0x28, 0x00, 0xd0, 0xee, + 0x21, 0x00, 0xab, 0x00, 0x70, 0x99, 0x22, 0x43, + 0x70, 0x3a, 0x22, 0x34, 0x70, 0x7a, 0x21, 0x0c, + 0x80, 0x79, 0x78, 0x61, 0x71, 0x39, 0x88, 0x61, + 0x46, 0x6a, 0x1c, 0x03, 0x20, 0x96, 0xf7, 0xff, + 0xfb, 0x0f, 0x81, 0xb8, 0xf7, 0xff, 0xfe, 0x72, + 0x28, 0x00, 0xd0, 0xd8, 0x20, 0x45, 0x70, 0x28, + 0x20, 0x47, 0x70, 0x68, 0x20, 0x04, 0x80, 0x68, + 0x88, 0x60, 0x80, 0xa8, 0x21, 0x00, 0x71, 0xa9, + 0xf7, 0xff, 0xfe, 0x6e, 0xe0, 0xb0, 0x68, 0xb9, + 0x91, 0x00, 0x89, 0xb9, 0xab, 0x01, 0x80, 0x19, + 0x22, 0x43, 0x70, 0x2a, 0x22, 0x34, 0x70, 0x6a, + 0x21, 0x0c, 0x80, 0x69, 0x78, 0x61, 0x71, 0x29, + 0x88, 0x61, 0x46, 0x6a, 0x1c, 0x03, 0x20, 0x90, + 0xf7, 0xff, 0xfa, 0xea, 0x81, 0xa8, 0xf7, 0xff, + 0xfe, 0x57, 0x28, 0x00, 0xd1, 0x06, 0x68, 0xa8, + 0xf0, 0x02, 0xf8, 0x6a, 0xe7, 0xaf, 0xe0, 0x61, + 0xe0, 0x8b, 0xe0, 0xc5, 0x20, 0x00, 0x9b, 0x06, + 0x60, 0x18, 0xe0, 0x61, 0x88, 0xe0, 0x28, 0x00, + 0xd1, 0x1c, 0x9a, 0x05, 0x88, 0x90, 0xf0, 0x02, + 0xf8, 0x35, 0x60, 0xa8, 0x1c, 0x01, 0xd0, 0x9e, + 0x20, 0x45, 0x70, 0x28, 0x70, 0x68, 0x22, 0x0c, + 0x80, 0x6a, 0x88, 0x60, 0x80, 0xa8, 0x9a, 0x05, + 0x88, 0x90, 0x81, 0xa8, 0x89, 0xaa, 0x1c, 0x08, + 0x99, 0x05, 0x68, 0x09, 0xf0, 0x14, 0xff, 0x42, + 0xf7, 0xff, 0xfe, 0x2e, 0x28, 0x00, 0xd1, 0xdd, + 0xe7, 0xd5, 0xe0, 0x16, 0x99, 0x05, 0x88, 0xc9, + 0x42, 0x81, 0xd1, 0x05, 0x78, 0x60, 0x71, 0x38, + 0x68, 0xb8, 0x1c, 0x81, 0x88, 0x60, 0xe0, 0x03, + 0x79, 0x21, 0x71, 0x39, 0x68, 0xb9, 0x31, 0x02, + 0xf7, 0xff, 0xfb, 0x76, 0x22, 0x43, 0x70, 0x3a, + 0xf7, 0xff, 0xfe, 0x0c, 0x28, 0x00, 0xd0, 0xc1, + 0xe0, 0x2a, 0x22, 0x43, 0x70, 0x3a, 0x22, 0x34, + 0x70, 0x7a, 0x21, 0x0c, 0x80, 0x79, 0x9a, 0x05, + 0x88, 0x11, 0x42, 0x88, 0xd1, 0x0f, 0x78, 0x60, + 0x71, 0x38, 0x68, 0xb8, 0x1c, 0x81, 0x88, 0x60, + 0xf7, 0xff, 0xfb, 0x5e, 0x88, 0xe1, 0x79, 0x20, + 0x88, 0x62, 0x80, 0xe2, 0x78, 0x62, 0x71, 0x22, + 0x80, 0x61, 0x70, 0x60, 0xe0, 0x05, 0x79, 0x21, + 0x71, 0x39, 0x68, 0xb9, 0x31, 0x02, 0xf7, 0xff, + 0xfb, 0x4f, 0xf7, 0xff, 0xfd, 0xe7, 0x28, 0x00, + 0xd0, 0x9c, 0xe0, 0x23, 0x20, 0x04, 0xf0, 0x01, + 0xff, 0xdd, 0x60, 0xb8, 0x28, 0x00, 0xd1, 0x01, + 0x20, 0x01, 0xe0, 0x16, 0x25, 0x00, 0xab, 0x00, + 0x70, 0x9d, 0x22, 0x43, 0x70, 0x3a, 0x22, 0x34, + 0x70, 0x7a, 0x21, 0x0c, 0x80, 0x79, 0x78, 0x61, + 0x71, 0x39, 0x88, 0x61, 0x46, 0x6a, 0x1c, 0x03, + 0x20, 0x95, 0xf7, 0xff, 0xfa, 0x65, 0x81, 0xb8, + 0xf7, 0xff, 0xfd, 0xc8, 0x28, 0x00, 0xd1, 0x05, + 0x1c, 0x28, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x7d, 0x00, 0xc0, + 0xf7, 0xff, 0xfd, 0x72, 0x81, 0x20, 0x20, 0x06, + 0xe0, 0x37, 0x88, 0xe0, 0x28, 0x00, 0xd0, 0x03, + 0x79, 0x20, 0x78, 0x61, 0x42, 0x88, 0xd1, 0x01, + 0x20, 0x02, 0xe0, 0x2e, 0x20, 0x04, 0xf0, 0x01, + 0xff, 0xa9, 0x60, 0xb8, 0x28, 0x00, 0xd0, 0xcb, + 0x21, 0x00, 0xab, 0x00, 0x70, 0x99, 0x79, 0x21, + 0x9a, 0x05, 0x78, 0x12, 0x42, 0x91, 0xd1, 0x02, + 0x78, 0x61, 0x88, 0x63, 0xe0, 0x00, 0x88, 0xe3, + 0x22, 0x43, 0x70, 0x3a, 0x22, 0x34, 0x70, 0x7a, + 0x22, 0x0c, 0x80, 0x7a, 0x71, 0x39, 0x46, 0x6a, + 0x1c, 0x05, 0x20, 0x95, 0x1c, 0x19, 0x1c, 0x2b, + 0xf7, 0xff, 0xfa, 0x2a, 0x81, 0xb8, 0xf7, 0xff, + 0xfd, 0x8d, 0x28, 0x00, 0xd1, 0x03, 0x21, 0x00, + 0x9b, 0x06, 0x60, 0x18, 0xe6, 0xef, 0x20, 0x7d, + 0x00, 0xc0, 0xf7, 0xff, 0xfd, 0x39, 0x81, 0x20, + 0x20, 0x08, 0x99, 0x02, 0x54, 0x70, 0xe7, 0x9f, + 0x29, 0x7f, 0xdd, 0x9d, 0xe7, 0x36, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0xa0, 0x2e, 0x08, 0x54, 0x80, + 0x2e, 0x08, 0x54, 0x90, 0xb5, 0xff, 0x06, 0x09, + 0x0e, 0x09, 0x22, 0x01, 0xb0, 0x83, 0x9b, 0x06, + 0x01, 0x05, 0x60, 0x1a, 0x4e, 0x4f, 0x19, 0xac, + 0x1d, 0xe2, 0x32, 0x03, 0x92, 0x02, 0x4f, 0x4e, + 0x29, 0x33, 0xd0, 0x61, 0x29, 0x70, 0xd0, 0x37, + 0x29, 0x94, 0xd1, 0x5e, 0xf7, 0xff, 0xfd, 0x3a, + 0x88, 0xe0, 0x99, 0x05, 0x88, 0xc9, 0x42, 0x88, + 0xd1, 0x06, 0x22, 0x04, 0x98, 0x02, 0x99, 0x05, + 0xf0, 0x14, 0xff, 0x2c, 0x28, 0x00, 0xd0, 0x01, + 0x20, 0x00, 0xe0, 0x2c, 0x99, 0x05, 0x79, 0x08, + 0xab, 0x01, 0x70, 0x18, 0x46, 0x68, 0x22, 0x04, + 0x99, 0x02, 0xf0, 0x14, 0xfe, 0x63, 0x20, 0x43, + 0x70, 0x38, 0x20, 0x34, 0x70, 0x78, 0x20, 0x0c, + 0x80, 0x78, 0x78, 0x60, 0x71, 0x38, 0x88, 0x61, + 0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, 0xf7, 0xff, + 0xf9, 0xd3, 0x81, 0xb8, 0xf7, 0xff, 0xfd, 0x36, + 0x28, 0x00, 0xd1, 0x03, 0x20, 0x00, 0x9b, 0x06, + 0x60, 0x18, 0xe7, 0xdd, 0x99, 0x05, 0x79, 0x08, + 0x28, 0x00, 0xd1, 0x53, 0x20, 0x04, 0xe0, 0x52, + 0x20, 0x09, 0xf0, 0x01, 0xff, 0x23, 0x60, 0xb8, + 0x28, 0x00, 0xd1, 0x05, 0x20, 0x01, 0xb0, 0x03, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0xf1, 0xab, 0x01, 0x70, 0x18, 0x46, 0x68, + 0x22, 0x04, 0x99, 0x02, 0xf0, 0x14, 0xfe, 0x32, + 0x20, 0x43, 0x70, 0x38, 0x20, 0x34, 0x70, 0x78, + 0x20, 0x0c, 0x80, 0x78, 0x78, 0x60, 0x71, 0x38, + 0x88, 0x61, 0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, + 0xf7, 0xff, 0xf9, 0xa2, 0x81, 0xb8, 0xf7, 0xff, + 0xfd, 0x05, 0x28, 0x00, 0xd0, 0xb0, 0xe0, 0x29, + 0xe0, 0x00, 0xe0, 0x2a, 0x78, 0x60, 0x99, 0x05, + 0x78, 0x09, 0x42, 0x88, 0xd1, 0x01, 0x20, 0x07, + 0xe0, 0x21, 0x20, 0x09, 0xf0, 0x01, 0xfe, 0xf2, + 0x60, 0xb8, 0x28, 0x00, 0xd0, 0xa0, 0x20, 0xf1, + 0xab, 0x01, 0x70, 0x18, 0x46, 0x68, 0x22, 0x04, + 0x99, 0x02, 0xf0, 0x14, 0xfe, 0x07, 0x20, 0x43, + 0x70, 0x38, 0x20, 0x34, 0x70, 0x78, 0x20, 0x0c, + 0x80, 0x78, 0x78, 0x60, 0x71, 0x38, 0x88, 0x61, + 0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, 0xf7, 0xff, + 0xf9, 0x77, 0x81, 0xb8, 0xf7, 0xff, 0xfc, 0xda, + 0x28, 0x00, 0xd0, 0xa3, 0x20, 0x02, 0x55, 0x70, + 0xe7, 0xb0, 0x29, 0x7f, 0xdc, 0x01, 0x29, 0x45, + 0xd1, 0xac, 0x20, 0x00, 0x9b, 0x06, 0x60, 0x18, + 0xe7, 0xa8, 0x00, 0x00, 0x2e, 0x08, 0x54, 0xa0, + 0x2e, 0x08, 0x54, 0x80, 0xb5, 0xf0, 0x06, 0x09, + 0x0e, 0x09, 0x1c, 0x04, 0x20, 0x01, 0x60, 0x18, + 0x1c, 0x17, 0xb0, 0x82, 0x29, 0x70, 0xd0, 0x28, + 0x29, 0x94, 0xd1, 0x2c, 0x1c, 0x20, 0xf7, 0xff, + 0xfc, 0x95, 0x79, 0x38, 0x28, 0x00, 0xd1, 0x2d, + 0x20, 0x43, 0x4f, 0x19, 0x70, 0x38, 0x20, 0x34, + 0x70, 0x78, 0x20, 0x0c, 0x80, 0x78, 0x01, 0x25, + 0x4e, 0x16, 0x19, 0xac, 0x79, 0x20, 0x71, 0x38, + 0x88, 0xe1, 0x46, 0x6a, 0x20, 0x95, 0x68, 0xbb, + 0xf7, 0xff, 0xf9, 0x3e, 0x81, 0xb8, 0xf7, 0xff, + 0xfc, 0xa1, 0x28, 0x00, 0xd1, 0x01, 0x25, 0x00, + 0xe0, 0x14, 0x20, 0x7d, 0x00, 0xc0, 0xf7, 0xff, + 0xfc, 0x4f, 0x81, 0x20, 0x20, 0x08, 0x55, 0x70, + 0xe0, 0x0b, 0x1c, 0x20, 0x1c, 0x3a, 0xf7, 0xff, + 0xff, 0x1d, 0x1c, 0x05, 0xe0, 0x06, 0x29, 0x7f, + 0xdc, 0x01, 0x29, 0x45, 0xd1, 0x01, 0x20, 0x00, + 0x60, 0x18, 0x25, 0x01, 0x1c, 0x28, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x22, 0x01, + 0x26, 0x02, 0x01, 0x05, 0x60, 0x1a, 0x1c, 0x1f, + 0x4c, 0x0c, 0x29, 0x33, 0xd0, 0x08, 0x29, 0x70, + 0xd0, 0x08, 0x29, 0x96, 0xd1, 0x08, 0xf7, 0xff, + 0xfc, 0x49, 0x20, 0x00, 0x60, 0x38, 0xe0, 0x01, + 0xf7, 0xff, 0xfc, 0x44, 0x55, 0x66, 0xe0, 0x05, + 0x29, 0x7f, 0xdc, 0x01, 0x29, 0x45, 0xd1, 0x01, + 0x20, 0x00, 0x60, 0x38, 0x20, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0xa0, + 0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0xb0, 0x81, + 0x91, 0x00, 0x21, 0x01, 0xb0, 0x83, 0x9b, 0x07, + 0x60, 0x19, 0x91, 0x02, 0x01, 0x05, 0x99, 0x03, + 0x4e, 0x52, 0x19, 0xac, 0x4f, 0x52, 0x29, 0x33, + 0xd0, 0x4f, 0x29, 0x70, 0xd0, 0x06, 0x29, 0x96, + 0xd1, 0x5d, 0xf7, 0xff, 0xfc, 0x1f, 0x20, 0x00, + 0x9b, 0x07, 0x60, 0x18, 0x88, 0xe0, 0x28, 0x00, + 0xd1, 0x0f, 0x20, 0x45, 0x70, 0x38, 0x20, 0x47, + 0x70, 0x78, 0x20, 0x04, 0x80, 0x78, 0x88, 0x60, + 0x80, 0xb8, 0x20, 0x00, 0x71, 0xb8, 0xf7, 0xff, + 0xfc, 0x31, 0x28, 0x00, 0xd0, 0x75, 0x20, 0x02, + 0xe0, 0x51, 0x20, 0x05, 0xf0, 0x01, 0xfe, 0x26, + 0x4f, 0x42, 0x60, 0xb8, 0x28, 0x00, 0xd1, 0x01, + 0x20, 0x01, 0xe0, 0x76, 0x21, 0x43, 0x70, 0x39, + 0x21, 0x34, 0x70, 0x79, 0x21, 0x0c, 0x80, 0x79, + 0x99, 0x03, 0x29, 0x70, 0xd1, 0x03, 0x21, 0x00, + 0xab, 0x00, 0x70, 0x99, 0xe0, 0x08, 0x9a, 0x06, + 0x78, 0x91, 0xab, 0x00, 0x70, 0x99, 0x88, 0xe1, + 0x9a, 0x06, 0x88, 0x12, 0x42, 0x91, 0xd1, 0x04, + 0x78, 0x61, 0x71, 0x39, 0x88, 0x61, 0x1c, 0x03, + 0xe0, 0x02, 0x79, 0x22, 0x71, 0x3a, 0x1c, 0x03, + 0x46, 0x6a, 0x20, 0x96, 0xf7, 0xff, 0xf8, 0x9c, + 0x81, 0xb8, 0xf7, 0xff, 0xfc, 0x09, 0x28, 0x00, + 0xd1, 0xcd, 0x68, 0xb8, 0xf0, 0x01, 0xfe, 0x1c, + 0xe7, 0xd2, 0x88, 0xe0, 0x28, 0x00, 0xd1, 0x0f, + 0x20, 0x45, 0x70, 0x38, 0x20, 0x47, 0x70, 0x78, + 0x20, 0x04, 0x80, 0x78, 0x88, 0x60, 0x80, 0xb8, + 0x20, 0x00, 0x71, 0xb8, 0xf7, 0xff, 0xfb, 0xea, + 0x28, 0x00, 0xd1, 0xb8, 0xe0, 0x38, 0xe0, 0x2e, + 0x78, 0x60, 0x79, 0x21, 0x42, 0x88, 0xd1, 0x02, + 0x20, 0x02, 0x55, 0x70, 0xe7, 0xb8, 0x79, 0x39, + 0x42, 0x81, 0xd1, 0x02, 0x20, 0x08, 0x55, 0x70, + 0xe0, 0x2a, 0x20, 0x05, 0xf0, 0x01, 0xfd, 0xd2, + 0x60, 0xb8, 0x28, 0x00, 0xd0, 0xac, 0x21, 0x00, + 0xab, 0x00, 0x70, 0x99, 0x21, 0x43, 0x70, 0x39, + 0x21, 0x34, 0x70, 0x79, 0x21, 0x0c, 0x80, 0x79, + 0x78, 0x61, 0x71, 0x39, 0x88, 0x61, 0x46, 0x6a, + 0x1c, 0x03, 0x20, 0x96, 0xf7, 0xff, 0xf8, 0x5c, + 0x81, 0xb8, 0xf7, 0xff, 0xfb, 0xbf, 0x28, 0x00, + 0xd1, 0x8d, 0x68, 0xb8, 0xf0, 0x01, 0xfd, 0xdc, + 0xe0, 0x00, 0xe0, 0x09, 0xe7, 0x87, 0x99, 0x03, + 0x29, 0x7f, 0xdc, 0x02, 0x99, 0x03, 0x29, 0x45, + 0xd1, 0x02, 0x20, 0x00, 0x9b, 0x07, 0x60, 0x18, + 0x98, 0x02, 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0xa0, + 0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0x90, + 0xb5, 0x00, 0x06, 0x01, 0x0e, 0x09, 0x22, 0x45, + 0x48, 0x07, 0x70, 0x02, 0x22, 0x41, 0x70, 0x42, + 0x22, 0x04, 0x80, 0x42, 0x71, 0x01, 0xf7, 0xff, + 0xfb, 0x95, 0x28, 0x00, 0xd1, 0x01, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x80, 0xb5, 0x00, 0x06, 0x01, + 0x0e, 0x09, 0x22, 0x45, 0x48, 0x07, 0x70, 0x02, + 0x22, 0x49, 0x70, 0x42, 0x22, 0x04, 0x80, 0x42, + 0x71, 0x01, 0xf7, 0xff, 0xfb, 0x7f, 0x28, 0x00, + 0xd1, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, + 0xb5, 0x00, 0x06, 0x01, 0x0e, 0x09, 0x22, 0x43, + 0x48, 0x07, 0x70, 0x02, 0x22, 0x32, 0x70, 0x42, + 0x22, 0x04, 0x80, 0x42, 0x71, 0x01, 0xf7, 0xff, + 0xfb, 0x69, 0x28, 0x00, 0xd1, 0x01, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x80, 0xb5, 0x80, 0x79, 0x41, + 0xb0, 0x82, 0xab, 0x01, 0x70, 0x19, 0x1c, 0x41, + 0x46, 0x68, 0x22, 0x04, 0xf0, 0x14, 0xfc, 0x72, + 0x20, 0x43, 0x4f, 0x0b, 0x70, 0x38, 0x20, 0x34, + 0x70, 0x78, 0x20, 0x0c, 0x80, 0x78, 0x46, 0x6a, + 0x21, 0x00, 0x20, 0x92, 0x68, 0xbb, 0xf7, 0xfe, + 0xff, 0xe3, 0x81, 0xb8, 0xf7, 0xff, 0xfb, 0x46, + 0x28, 0x00, 0xd1, 0x00, 0xe0, 0x00, 0x20, 0x01, + 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x54, 0x80, 0xb5, 0xf0, 0x00, 0xc6, + 0x18, 0x36, 0x01, 0x36, 0x1c, 0x07, 0xb0, 0x84, + 0x48, 0x0d, 0x90, 0x03, 0x18, 0x34, 0x68, 0xa0, + 0x28, 0x00, 0xd0, 0x0b, 0x46, 0x69, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x48, 0x1c, 0x05, 0x28, 0x34, + 0xd1, 0x02, 0x98, 0x01, 0xf0, 0x01, 0xfd, 0x48, + 0x2d, 0x00, 0xd1, 0xf3, 0x20, 0x00, 0x99, 0x03, + 0x51, 0x88, 0x60, 0x60, 0x60, 0xa0, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x57, 0xc0, 0xb4, 0xb0, 0x06, 0x0f, + 0x0e, 0x3f, 0x00, 0xc3, 0x18, 0x18, 0x01, 0x00, + 0x49, 0x15, 0x18, 0x41, 0x20, 0x00, 0x68, 0x8b, + 0x2b, 0x0a, 0xda, 0x23, 0x33, 0x01, 0x60, 0x8b, + 0x68, 0x4d, 0x19, 0x4c, 0x34, 0x80, 0x71, 0x27, + 0x2f, 0x34, 0xd1, 0x14, 0x78, 0x14, 0x68, 0x4d, + 0x00, 0x6b, 0x19, 0x5b, 0x00, 0x9b, 0x18, 0xcb, + 0x73, 0x1c, 0x68, 0x54, 0x68, 0x4d, 0x00, 0x6b, + 0x19, 0x5b, 0x00, 0x9b, 0x18, 0xcb, 0x61, 0x1c, + 0x89, 0x17, 0x68, 0x4c, 0x00, 0x63, 0x19, 0x1b, + 0x00, 0x9b, 0x18, 0xca, 0x82, 0x97, 0x68, 0x4a, + 0x32, 0x01, 0x60, 0x4a, 0x2a, 0x0a, 0xdb, 0x00, + 0x60, 0x48, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, + 0x2e, 0x08, 0x57, 0xc0, 0xb4, 0xf0, 0x00, 0xc7, + 0x18, 0x3f, 0x01, 0x3f, 0x4a, 0x16, 0x18, 0xbc, + 0x25, 0x00, 0x68, 0xa0, 0x28, 0x00, 0xdc, 0x02, + 0x1c, 0x28, 0xbc, 0xf0, 0x47, 0x70, 0x38, 0x01, + 0x60, 0xa0, 0x59, 0xd3, 0x18, 0xe0, 0x30, 0x80, + 0x79, 0x00, 0x28, 0x34, 0xd1, 0x14, 0x1c, 0x1e, + 0x00, 0x5b, 0x19, 0x9b, 0x00, 0x9b, 0x18, 0xe3, + 0x7b, 0x1b, 0x70, 0x0b, 0x59, 0xd6, 0x00, 0x73, + 0x19, 0x9b, 0x00, 0x9b, 0x18, 0xe3, 0x69, 0x1b, + 0x60, 0x4b, 0x59, 0xd6, 0x00, 0x73, 0x19, 0x9b, + 0x00, 0x9b, 0x18, 0xe3, 0x8a, 0x9b, 0x81, 0x0b, + 0x59, 0xd1, 0x31, 0x01, 0x51, 0xd1, 0x29, 0x0a, + 0xdb, 0xdb, 0x51, 0xd5, 0xbc, 0xf0, 0x47, 0x70, + 0x2e, 0x08, 0x57, 0xc0, 0xb5, 0x00, 0x78, 0x01, + 0x48, 0x0c, 0x70, 0x01, 0x78, 0x01, 0x29, 0x01, + 0xd0, 0x01, 0x29, 0x02, 0xd1, 0x0e, 0x48, 0x0a, + 0x29, 0x01, 0xd1, 0x04, 0xca, 0x0a, 0xc0, 0x0a, + 0xca, 0x0a, 0xc0, 0x0a, 0xe0, 0x01, 0x88, 0x11, + 0x80, 0x01, 0xf0, 0x00, 0xf8, 0x32, 0x20, 0x00, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x88, + 0x2e, 0x08, 0x56, 0xc0, 0xb5, 0x90, 0x27, 0x00, + 0x48, 0x0d, 0x70, 0x07, 0x80, 0x87, 0x20, 0x03, + 0xf0, 0x01, 0xfc, 0xc0, 0x28, 0x00, 0xda, 0x03, + 0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x00, 0x20, 0x01, 0x27, 0xff, 0x4a, 0x07, + 0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x18, 0x9c, + 0x70, 0xa0, 0x52, 0xd7, 0x31, 0x01, 0x29, 0x08, + 0xdb, 0xf6, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x88, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0x00, 0xf0, 0x01, 0xfb, 0x5f, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0xb0, 0x27, 0x00, 0x48, 0x1f, + 0x78, 0x00, 0x4c, 0x1f, 0x28, 0x01, 0xd1, 0x1c, + 0x78, 0x60, 0x28, 0x23, 0xd0, 0x0f, 0xdc, 0x06, + 0x28, 0x21, 0xd0, 0x10, 0x28, 0x22, 0xd1, 0x28, + 0xf0, 0x00, 0xf8, 0x62, 0xe0, 0x24, 0x28, 0x32, + 0xd0, 0x0c, 0x28, 0x34, 0xd1, 0x21, 0x68, 0xa5, + 0xf0, 0x00, 0xf8, 0xea, 0xe0, 0x1c, 0x68, 0xa5, + 0xf0, 0x00, 0xf8, 0x88, 0xe0, 0x18, 0xf0, 0x00, + 0xf8, 0x25, 0xe0, 0x15, 0xf0, 0x00, 0xf8, 0xf8, + 0xe0, 0x12, 0x28, 0x02, 0xd1, 0x11, 0x88, 0x20, + 0xf0, 0x01, 0xfc, 0x28, 0x88, 0x20, 0x28, 0x50, + 0xdd, 0x04, 0x28, 0x58, 0xdc, 0x02, 0xf0, 0x00, + 0xf9, 0x03, 0xe0, 0x05, 0x28, 0x60, 0xdd, 0x04, + 0x28, 0x68, 0xdc, 0x02, 0xf0, 0x00, 0xf9, 0x22, + 0x1c, 0x07, 0x2f, 0x00, 0xd1, 0x02, 0x1c, 0x28, + 0xf0, 0x01, 0xfc, 0x4e, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x88, + 0x2e, 0x08, 0x56, 0xc0, 0xb5, 0x90, 0x20, 0x01, + 0xb0, 0x81, 0x90, 0x00, 0xf0, 0x00, 0xf9, 0x2c, + 0x1c, 0x04, 0xd5, 0x01, 0x20, 0x01, 0xe0, 0x1a, + 0x4f, 0x0f, 0x88, 0xb8, 0x00, 0xe1, 0x1b, 0x09, + 0x00, 0x89, 0x4a, 0x0e, 0x52, 0x50, 0x78, 0x79, + 0x46, 0x6b, 0x22, 0x00, 0x1c, 0x20, 0xf0, 0x00, + 0xfb, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x20, + 0xf0, 0x00, 0xf9, 0x60, 0x20, 0x35, 0x70, 0x38, + 0x20, 0x4a, 0x70, 0x78, 0x20, 0x04, 0x80, 0x78, + 0xf0, 0x00, 0xf9, 0xee, 0x98, 0x00, 0xb0, 0x01, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0xf0, 0x20, 0x01, 0xb0, 0x81, 0x90, 0x00, + 0x4c, 0x14, 0x88, 0xa6, 0x27, 0x00, 0x4d, 0x14, + 0x00, 0xf8, 0x1b, 0xc0, 0x00, 0x80, 0x19, 0x41, + 0x78, 0x89, 0x29, 0x01, 0xd0, 0x0d, 0x5a, 0x28, + 0x42, 0xb0, 0xd1, 0x0a, 0x78, 0x61, 0x46, 0x6b, + 0x22, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0xd6, + 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38, 0xf0, 0x00, + 0xf9, 0x31, 0x37, 0x01, 0x2f, 0x08, 0xdb, 0xe7, + 0x20, 0x35, 0x70, 0x20, 0x20, 0x4b, 0x70, 0x60, + 0x20, 0x04, 0x80, 0x60, 0xf0, 0x00, 0xf9, 0xbc, + 0x98, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x56, 0xc0, + 0x2e, 0x08, 0x56, 0xe0, 0xb5, 0xf0, 0x20, 0x00, + 0xb0, 0x87, 0x90, 0x00, 0x48, 0x2a, 0x89, 0x87, + 0x68, 0x85, 0x79, 0x80, 0x90, 0x05, 0x24, 0x00, + 0xaa, 0x03, 0xb4, 0x04, 0x04, 0x39, 0x0c, 0x09, + 0x9a, 0x06, 0x1c, 0x28, 0xab, 0x07, 0xf0, 0x00, + 0xfa, 0x21, 0xb0, 0x01, 0x90, 0x01, 0x28, 0x00, + 0xdb, 0x04, 0x98, 0x05, 0xf0, 0x00, 0xf9, 0x2c, + 0x1c, 0x06, 0xd5, 0x01, 0x20, 0x00, 0xe0, 0x36, + 0x98, 0x00, 0x30, 0x01, 0x90, 0x00, 0x98, 0x01, + 0x18, 0x2d, 0x1a, 0x3f, 0x2f, 0x00, 0xdd, 0x0b, + 0x04, 0x38, 0x0c, 0x00, 0xf0, 0x01, 0xfb, 0x96, + 0x1c, 0x04, 0xd0, 0xef, 0x1c, 0x20, 0x1c, 0x29, + 0x1c, 0x3a, 0xf0, 0x14, 0xfa, 0xaf, 0x1c, 0x25, + 0xa9, 0x06, 0x78, 0x09, 0x1c, 0x30, 0xaa, 0x03, + 0xab, 0x02, 0xf0, 0x00, 0xfa, 0x83, 0x28, 0x00, + 0xd0, 0xe0, 0x98, 0x00, 0x28, 0x02, 0xda, 0x01, + 0x2f, 0x00, 0xdc, 0xc9, 0x2c, 0x00, 0xd0, 0x02, + 0x1c, 0x20, 0xf0, 0x01, 0xfb, 0xa1, 0x2f, 0x00, + 0xd0, 0x01, 0x20, 0x00, 0x90, 0x02, 0x00, 0xf0, + 0x1b, 0x80, 0x00, 0x80, 0x49, 0x07, 0x18, 0x40, + 0x78, 0x80, 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x30, + 0xf0, 0x00, 0xf8, 0xc8, 0x98, 0x02, 0xb0, 0x07, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0x80, 0xb0, 0x81, 0x4f, 0x09, 0x79, 0x38, + 0xf0, 0x00, 0xf8, 0xe2, 0x28, 0x00, 0xdb, 0x06, + 0x78, 0x79, 0x46, 0x6b, 0x22, 0x00, 0xf0, 0x00, + 0xfa, 0x51, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x00, + 0x90, 0x00, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xc0, + 0xb5, 0x80, 0xb0, 0x81, 0x4f, 0x09, 0x79, 0x38, + 0xf0, 0x00, 0xf8, 0xca, 0x28, 0x00, 0xdb, 0x06, + 0x78, 0x79, 0x46, 0x6b, 0x22, 0x00, 0xf0, 0x00, + 0xfa, 0x39, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x00, + 0x90, 0x00, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xc0, + 0xb5, 0x90, 0xb0, 0x81, 0x48, 0x0f, 0x88, 0x00, + 0xf0, 0x00, 0xf8, 0xca, 0x1c, 0x07, 0xd5, 0x01, + 0x20, 0x01, 0xe0, 0x13, 0x20, 0x00, 0x00, 0xf9, + 0x1b, 0xc9, 0x00, 0x89, 0x4a, 0x0a, 0x18, 0x8c, + 0x80, 0xa0, 0x21, 0x50, 0x46, 0x6b, 0x22, 0x00, + 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0x17, 0x78, 0xa0, + 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x71, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xc0, + 0x2e, 0x08, 0x56, 0xe0, 0xb5, 0x00, 0xb0, 0x81, + 0x48, 0x0b, 0x88, 0x00, 0xf0, 0x00, 0xf8, 0xbc, + 0x28, 0x00, 0xda, 0x01, 0x20, 0x01, 0xe0, 0x0c, + 0x21, 0x00, 0x00, 0xc2, 0x1a, 0x12, 0x00, 0x92, + 0x4b, 0x06, 0x18, 0xd2, 0x80, 0xd1, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x60, 0xf0, 0x00, 0xf9, 0xf2, + 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0xf0, 0x4c, 0x22, 0x23, 0x04, 0x5e, 0xe1, + 0x1f, 0x58, 0x29, 0x08, 0xda, 0x35, 0x27, 0x00, + 0x4d, 0x1f, 0x00, 0xf9, 0x1b, 0xc9, 0x00, 0x89, + 0x19, 0x49, 0x78, 0x89, 0x29, 0x01, 0xd1, 0x2f, + 0x22, 0x00, 0x00, 0xd3, 0x1a, 0x9b, 0x00, 0x9b, + 0x19, 0x5b, 0x78, 0x9e, 0x2e, 0x01, 0xd0, 0x02, + 0x78, 0xdb, 0x42, 0x8b, 0xd0, 0x02, 0x32, 0x01, + 0x2a, 0x08, 0xdb, 0xf2, 0x2a, 0x08, 0xda, 0x04, + 0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x09, + 0xdb, 0xea, 0x29, 0x09, 0xd0, 0x15, 0x00, 0xf8, + 0x1b, 0xc0, 0x00, 0x80, 0x19, 0x40, 0x70, 0xc1, + 0x21, 0x02, 0x70, 0x81, 0x21, 0x00, 0x80, 0x81, + 0x80, 0xc1, 0x82, 0x01, 0x60, 0xc1, 0x83, 0x01, + 0x61, 0x41, 0x76, 0x81, 0x1c, 0x38, 0xf7, 0xff, + 0xfd, 0x7d, 0x88, 0xa0, 0x30, 0x01, 0x80, 0xa0, + 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x37, 0x01, 0x2f, 0x08, 0xdb, 0xc5, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x88, + 0x2e, 0x08, 0x56, 0xe0, 0xb5, 0x90, 0x1c, 0x07, + 0xd5, 0x06, 0x2f, 0x08, 0xdb, 0x04, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x65, 0x00, 0xf8, + 0x1b, 0xc0, 0x00, 0x80, 0x49, 0x0a, 0x18, 0x44, + 0x88, 0xe0, 0x28, 0x00, 0xd0, 0x03, 0xf0, 0x01, + 0xfa, 0x79, 0x20, 0x00, 0x80, 0xe0, 0x1c, 0x38, + 0xf7, 0xff, 0xfd, 0x50, 0x20, 0x01, 0x70, 0xa0, + 0x48, 0x04, 0x88, 0x81, 0x39, 0x01, 0x80, 0x81, + 0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x1a, 0x88, + 0xb4, 0x80, 0x06, 0x02, 0x0e, 0x12, 0x20, 0x00, + 0x49, 0x08, 0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, + 0x18, 0x5b, 0x78, 0x9f, 0x2f, 0x01, 0xd0, 0x02, + 0x78, 0xdb, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, + 0x28, 0x08, 0xdb, 0xf2, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x56, 0xe0, + 0xb4, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, + 0x49, 0x08, 0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, + 0x18, 0x5b, 0x78, 0x9f, 0x2f, 0x01, 0xd0, 0x02, + 0x88, 0x9b, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, + 0x28, 0x08, 0xdb, 0xf2, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x56, 0xe0, + 0xb4, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, + 0x49, 0x08, 0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, + 0x18, 0x5b, 0x78, 0x9f, 0x2f, 0x01, 0xd0, 0x02, + 0x88, 0xdb, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, + 0x28, 0x08, 0xdb, 0xf2, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0x80, 0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, + 0x49, 0x05, 0x18, 0x47, 0x88, 0xb8, 0x28, 0x00, + 0xd0, 0x03, 0xf0, 0x01, 0xfa, 0x13, 0x20, 0x00, + 0x80, 0xb8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xe0, 0xb5, 0x80, 0x00, 0xc3, + 0x1a, 0x18, 0x00, 0x80, 0x49, 0x05, 0x18, 0x47, + 0x88, 0xf8, 0x28, 0x00, 0xd0, 0x03, 0xf0, 0x01, + 0xfa, 0x01, 0x20, 0x00, 0x80, 0xf8, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0x00, 0x49, 0x03, 0x78, 0x08, 0xf0, 0x01, + 0xf9, 0x53, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x56, 0xc0, 0xb5, 0x00, 0x49, 0x03, + 0x78, 0x08, 0xf0, 0x01, 0xf9, 0x49, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x56, 0xd0, + 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, 0x49, 0x0a, + 0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, 0x18, 0x5b, + 0x78, 0xdb, 0x42, 0x93, 0xd1, 0x06, 0x00, 0xc3, + 0x1a, 0x18, 0x00, 0x80, 0x5a, 0x08, 0x06, 0x00, + 0x0e, 0x00, 0x47, 0x70, 0x30, 0x01, 0x28, 0x08, + 0xdb, 0xee, 0x20, 0xff, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x56, 0xe0, 0xb5, 0xf0, 0x06, 0x05, + 0x0e, 0x2d, 0x06, 0x0c, 0x0e, 0x24, 0x1c, 0x17, + 0x1c, 0x59, 0x1c, 0x1a, 0x1c, 0x4e, 0xb0, 0x81, + 0x2d, 0x86, 0xd0, 0x3b, 0xdc, 0x0b, 0x1f, 0xef, + 0x3f, 0x79, 0x2f, 0x06, 0xd2, 0x3c, 0xa3, 0x02, + 0x5d, 0xdb, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x3a, 0x32, 0x32, 0x32, 0x32, 0x32, 0x2d, 0xa0, + 0xd0, 0x15, 0xdc, 0x0d, 0x20, 0x02, 0x18, 0x1b, + 0x33, 0x01, 0x2d, 0x87, 0xd0, 0x01, 0x2d, 0x88, + 0xd1, 0x2a, 0x70, 0x15, 0x70, 0x08, 0x70, 0x34, + 0x78, 0x38, 0x70, 0x18, 0x20, 0x04, 0xe0, 0x25, + 0x2d, 0xa1, 0xd0, 0x04, 0x2d, 0xa2, 0xd1, 0x1f, + 0x20, 0xa0, 0x70, 0x10, 0xe0, 0x17, 0x70, 0x15, + 0x1c, 0x0d, 0x88, 0xb9, 0x46, 0x6a, 0x1c, 0x28, + 0xf0, 0x00, 0xf8, 0x5d, 0xa8, 0x00, 0x88, 0x00, + 0x18, 0x28, 0x70, 0x04, 0x88, 0xb9, 0x1e, 0x4a, + 0x68, 0x39, 0x30, 0x01, 0xf0, 0x14, 0xf8, 0xbe, + 0x88, 0xb8, 0xa9, 0x00, 0x88, 0x09, 0x18, 0x40, + 0x30, 0x01, 0xe0, 0x07, 0x70, 0x15, 0x20, 0x01, + 0x70, 0x08, 0x70, 0x34, 0x20, 0x03, 0xe0, 0x01, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x06, 0x16, + 0x0e, 0x36, 0x9d, 0x05, 0x1c, 0x04, 0x78, 0x00, + 0x70, 0x18, 0xb0, 0x82, 0x46, 0x6a, 0x34, 0x01, + 0x1c, 0x20, 0xa9, 0x01, 0x1c, 0x1f, 0xf0, 0x00, + 0xf8, 0x57, 0x21, 0x00, 0x43, 0xc9, 0x28, 0x00, + 0xdb, 0x06, 0xa8, 0x00, 0x88, 0x00, 0x18, 0x20, + 0x78, 0x02, 0x30, 0x01, 0x42, 0xb2, 0xd0, 0x01, + 0x1c, 0x08, 0xe0, 0x20, 0x78, 0x3a, 0x2a, 0x85, + 0xd0, 0x17, 0xdc, 0x06, 0x2a, 0x80, 0xd0, 0x10, + 0x2a, 0x83, 0xd0, 0x12, 0x2a, 0x84, 0xd1, 0xf3, + 0xe0, 0x0f, 0x2a, 0x86, 0xd0, 0x0d, 0x2a, 0xa0, + 0xd0, 0x01, 0x2a, 0xa1, 0xd1, 0xec, 0x60, 0x28, + 0xa8, 0x01, 0x88, 0x00, 0x38, 0x01, 0x80, 0xa8, + 0xe0, 0x03, 0x78, 0x00, 0x23, 0x80, 0x40, 0x18, + 0x70, 0x28, 0xa8, 0x01, 0x88, 0x00, 0xa9, 0x00, + 0x88, 0x09, 0x18, 0x40, 0x30, 0x01, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x04, 0x09, + 0x0c, 0x09, 0xb0, 0x81, 0xab, 0x00, 0x80, 0x19, + 0x29, 0x7f, 0xdc, 0x05, 0xa9, 0x00, 0x88, 0x09, + 0x70, 0x01, 0x20, 0x01, 0x80, 0x10, 0xe0, 0x15, + 0xa9, 0x00, 0x88, 0x09, 0x29, 0xff, 0xdc, 0x07, + 0x21, 0x81, 0x70, 0x01, 0x21, 0x02, 0x80, 0x11, + 0xa9, 0x00, 0x88, 0x09, 0x70, 0x41, 0xe0, 0x09, + 0x21, 0x82, 0x70, 0x01, 0x21, 0x03, 0x80, 0x11, + 0xa9, 0x00, 0x78, 0x49, 0x70, 0x41, 0xa9, 0x00, + 0x78, 0x09, 0x70, 0x81, 0xb0, 0x01, 0x47, 0x70, + 0xb4, 0x90, 0x27, 0x01, 0x78, 0x04, 0x23, 0x80, + 0x40, 0x23, 0x2b, 0x80, 0xd1, 0x14, 0x06, 0x63, + 0x0e, 0x5b, 0x80, 0x13, 0x88, 0x13, 0x2b, 0x01, + 0xd1, 0x01, 0x78, 0x40, 0xe0, 0x05, 0x2b, 0x02, + 0xd1, 0x07, 0x78, 0x43, 0x02, 0x1b, 0x78, 0x80, + 0x18, 0x18, 0x80, 0x08, 0x88, 0x10, 0x30, 0x01, + 0xe0, 0x04, 0x27, 0x00, 0x43, 0xff, 0xe0, 0x02, + 0x80, 0x0c, 0x20, 0x01, 0x80, 0x10, 0x1c, 0x38, + 0xbc, 0x90, 0x47, 0x70, 0xb5, 0xf0, 0x1c, 0x07, + 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x18, 0x00, 0xfb, + 0x1b, 0xdb, 0x00, 0x9b, 0xb0, 0x82, 0x4c, 0x42, + 0x19, 0x1e, 0x78, 0xb3, 0x1e, 0x9c, 0x4b, 0x41, + 0x93, 0x01, 0x1d, 0x1d, 0x2c, 0x07, 0xd2, 0x63, + 0xa3, 0x01, 0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, + 0x60, 0x65, 0x03, 0x08, 0x40, 0x24, 0x6b, 0x00, + 0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x80, + 0xe0, 0x66, 0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, + 0xfa, 0x83, 0x1c, 0x04, 0x28, 0x01, 0xd1, 0x5a, + 0x78, 0xb0, 0x28, 0x04, 0xd1, 0x57, 0x1c, 0x38, + 0x1c, 0x29, 0xf7, 0xff, 0xfb, 0xf7, 0x1c, 0x01, + 0xd0, 0x59, 0x9b, 0x01, 0x68, 0x9d, 0x46, 0x6b, + 0x22, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x68, + 0x1c, 0x04, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x46, + 0xe0, 0x36, 0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, + 0xfc, 0x53, 0x1c, 0x04, 0x28, 0x01, 0xd1, 0x3e, + 0x78, 0xb0, 0x28, 0x04, 0xd1, 0x3b, 0x1c, 0x38, + 0x1c, 0x29, 0xf7, 0xff, 0xfb, 0xdb, 0x1c, 0x01, + 0xd0, 0x3d, 0x9b, 0x01, 0x68, 0x9d, 0x46, 0x6b, + 0x22, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x4c, + 0x1c, 0x04, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x2a, + 0xe0, 0x1a, 0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, + 0xfc, 0x03, 0x1c, 0x04, 0x28, 0x01, 0xd1, 0x22, + 0x78, 0xb0, 0x28, 0x04, 0xd1, 0x1f, 0x1c, 0x38, + 0x1c, 0x29, 0xf7, 0xff, 0xfb, 0xbf, 0x1c, 0x01, + 0xd0, 0x21, 0x9b, 0x01, 0x68, 0x9d, 0x46, 0x6b, + 0x22, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x30, + 0x1c, 0x04, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x0e, + 0x1c, 0x28, 0xf0, 0x01, 0xf8, 0xb5, 0xe0, 0x12, + 0xe0, 0x10, 0x1c, 0x02, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0x17, 0xe0, 0x09, 0x1c, 0x03, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x62, 0xe0, 0x04, 0xe0, 0x06, + 0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, 0xfd, 0x14, + 0x1c, 0x04, 0xe0, 0x00, 0x24, 0x00, 0x1c, 0x20, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x56, 0xc0, + 0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x17, + 0x22, 0x01, 0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, + 0xb0, 0x81, 0x60, 0x3a, 0x90, 0x00, 0x4e, 0x1f, + 0x19, 0x85, 0x29, 0x21, 0xd0, 0x02, 0x29, 0x80, + 0xd0, 0x2f, 0xe0, 0x06, 0x20, 0x03, 0xf0, 0x01, + 0xf8, 0x5d, 0x4c, 0x1b, 0x60, 0xa0, 0x1c, 0x01, + 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x2a, 0x20, 0x32, + 0x70, 0x20, 0x20, 0x23, 0x70, 0x60, 0x20, 0x0c, + 0x80, 0x60, 0x98, 0x00, 0x5a, 0x30, 0x80, 0xa0, + 0x78, 0xe8, 0x71, 0xa0, 0x1c, 0x0b, 0x79, 0xa1, + 0x22, 0x00, 0x20, 0x82, 0xf7, 0xff, 0xfe, 0x66, + 0x81, 0xa0, 0xf7, 0xff, 0xfe, 0x35, 0x28, 0x00, + 0xd1, 0x01, 0x60, 0x38, 0xe7, 0xe5, 0x78, 0xe8, + 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x43, 0x18, 0x49, 0x09, 0xf0, 0x00, + 0xff, 0xe9, 0x80, 0xa8, 0x20, 0x03, 0x70, 0xa8, + 0xe0, 0x03, 0x7e, 0xa8, 0x28, 0x00, 0xd1, 0x00, + 0x60, 0x38, 0x20, 0x01, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xe0, + 0x2e, 0x08, 0x56, 0xc0, 0x00, 0x00, 0x27, 0x10, + 0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x22, 0x01, + 0x60, 0x1a, 0x00, 0xc2, 0x1a, 0x12, 0x00, 0x92, + 0xb0, 0x81, 0x92, 0x00, 0x1c, 0x1f, 0x4e, 0x54, + 0x19, 0x95, 0x4c, 0x54, 0x29, 0x80, 0xd0, 0x35, + 0xdc, 0x04, 0x29, 0x22, 0xd0, 0x13, 0x29, 0x50, + 0xd1, 0x0d, 0xe0, 0x0e, 0x29, 0x83, 0xd0, 0x11, + 0x29, 0x84, 0xd1, 0x08, 0xf7, 0xff, 0xfd, 0xd4, + 0x20, 0x03, 0xf0, 0x01, 0xf8, 0x03, 0x4c, 0x4c, + 0x60, 0xa0, 0x1c, 0x01, 0xd1, 0x6d, 0x20, 0x00, + 0xe0, 0x89, 0x20, 0x02, 0xe0, 0x67, 0xf7, 0xff, + 0xfd, 0xc7, 0xe7, 0xfa, 0xf7, 0xff, 0xfd, 0xc4, + 0x20, 0x34, 0x70, 0x20, 0x20, 0x31, 0x70, 0x60, + 0x20, 0x04, 0x80, 0x60, 0x78, 0xe8, 0x71, 0x20, + 0xf7, 0xff, 0xfd, 0xde, 0x28, 0x00, 0xd1, 0x01, + 0x60, 0x38, 0xe0, 0x74, 0x78, 0xe8, 0x30, 0x50, + 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, + 0x43, 0x18, 0x49, 0x3c, 0xf0, 0x00, 0xff, 0x92, + 0x80, 0xa8, 0xe0, 0x65, 0xf7, 0xff, 0xfd, 0xa8, + 0x9a, 0x03, 0x78, 0x10, 0x28, 0x80, 0xd1, 0x21, + 0x20, 0x32, 0x70, 0x20, 0x20, 0x23, 0x70, 0x60, + 0x20, 0x0c, 0x80, 0x60, 0x9a, 0x00, 0x5a, 0xb0, + 0x80, 0xa0, 0x78, 0xe9, 0x71, 0xa1, 0x22, 0x00, + 0x20, 0x81, 0x68, 0xa3, 0xf7, 0xff, 0xfd, 0xe6, + 0x81, 0xa0, 0xf7, 0xff, 0xfd, 0xb5, 0x28, 0x00, + 0xd0, 0xc1, 0x78, 0xe8, 0x30, 0x50, 0x04, 0x00, + 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, + 0x49, 0x28, 0xf0, 0x00, 0xff, 0x6b, 0x80, 0xa8, + 0x20, 0x07, 0xe0, 0x20, 0x20, 0x32, 0x70, 0x20, + 0x20, 0x23, 0x70, 0x60, 0x20, 0x0c, 0x80, 0x60, + 0x9a, 0x00, 0x5a, 0xb0, 0x80, 0xa0, 0x78, 0xe9, + 0x71, 0xa1, 0x22, 0x00, 0x20, 0xa2, 0x68, 0xa3, + 0xf7, 0xff, 0xfd, 0xc4, 0x81, 0xa0, 0xf7, 0xff, + 0xfd, 0x93, 0x28, 0x00, 0xd0, 0x0a, 0x78, 0xe8, + 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x43, 0x18, 0x49, 0x17, 0xf0, 0x00, + 0xff, 0x49, 0x80, 0xa8, 0x20, 0x05, 0x70, 0xa8, + 0xe0, 0x1c, 0xe7, 0xff, 0x20, 0x32, 0x70, 0x20, + 0x20, 0x23, 0x70, 0x60, 0x20, 0x0c, 0x80, 0x60, + 0x9a, 0x00, 0x5a, 0xb0, 0x80, 0xa0, 0x78, 0xe8, + 0x71, 0xa0, 0x1c, 0x0b, 0x22, 0x00, 0x1c, 0x01, + 0x20, 0x85, 0xf7, 0xff, 0xfd, 0x9f, 0x81, 0xa0, + 0xf7, 0xff, 0xfd, 0x78, 0x28, 0x00, 0xd1, 0x01, + 0x60, 0x38, 0xe7, 0x78, 0x20, 0x02, 0x70, 0xa8, + 0x20, 0x00, 0x60, 0x38, 0x20, 0x01, 0xb0, 0x01, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x56, 0xc0, + 0x2e, 0x08, 0x56, 0xd0, 0x00, 0x00, 0x27, 0x10, + 0xb5, 0xff, 0x1c, 0x07, 0x06, 0x08, 0x0e, 0x00, + 0x21, 0x01, 0xb0, 0x84, 0x9a, 0x07, 0x26, 0x01, + 0x60, 0x11, 0x00, 0xf9, 0x1b, 0xc9, 0x00, 0x89, + 0x91, 0x02, 0x4a, 0x78, 0x92, 0x03, 0x18, 0x8c, + 0x28, 0x22, 0xd0, 0x0d, 0x4d, 0x76, 0x28, 0x32, + 0xd0, 0x6f, 0x28, 0x34, 0xd0, 0x12, 0x28, 0x60, + 0xd1, 0x6c, 0x20, 0x03, 0xf0, 0x00, 0xff, 0x4a, + 0x60, 0xa8, 0x1c, 0x01, 0xd1, 0x67, 0xe0, 0x16, + 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0x23, 0x1c, 0x38, + 0xf0, 0x00, 0xfc, 0x16, 0x1c, 0x06, 0xd0, 0x5f, + 0x20, 0x02, 0xe0, 0xcc, 0x1c, 0x38, 0xf7, 0xff, + 0xfd, 0x19, 0x89, 0xa8, 0x30, 0x0a, 0x04, 0x00, + 0x0c, 0x00, 0xf0, 0x00, 0xff, 0x33, 0x4f, 0x67, + 0x60, 0xb8, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x00, + 0xe0, 0xbf, 0x89, 0xa9, 0x22, 0x01, 0x02, 0x92, + 0x42, 0x91, 0xdc, 0x1e, 0x31, 0x01, 0xab, 0x01, + 0x80, 0x19, 0x68, 0xa9, 0x91, 0x00, 0x21, 0x32, + 0x70, 0x39, 0x21, 0x23, 0x70, 0x79, 0x21, 0x0c, + 0x80, 0x79, 0x99, 0x02, 0x9a, 0x03, 0x5a, 0x51, + 0x80, 0xb9, 0x78, 0xe1, 0x71, 0xb9, 0x46, 0x6a, + 0x1c, 0x03, 0x20, 0xa0, 0xf7, 0xff, 0xfd, 0x32, + 0x81, 0xb8, 0x20, 0x00, 0x82, 0x20, 0x21, 0x05, + 0x60, 0xe0, 0x70, 0xa1, 0x9a, 0x07, 0x60, 0x10, + 0xe0, 0x1f, 0xab, 0x01, 0x80, 0x1a, 0x68, 0xa9, + 0x91, 0x00, 0x21, 0x32, 0x70, 0x39, 0x21, 0x23, + 0x70, 0x79, 0x21, 0x0c, 0x80, 0x79, 0x99, 0x02, + 0x9a, 0x03, 0x5a, 0x51, 0x80, 0xb9, 0x78, 0xe1, + 0x71, 0xb9, 0x46, 0x6a, 0x1c, 0x03, 0x20, 0xa1, + 0xf7, 0xff, 0xfd, 0x14, 0x81, 0xb8, 0x68, 0xa8, + 0x60, 0xa0, 0x4b, 0x47, 0x18, 0xc0, 0x60, 0xe0, + 0x89, 0xa8, 0x1a, 0xc0, 0x82, 0x20, 0x20, 0x06, + 0x70, 0xa0, 0xf7, 0xff, 0xfc, 0xe3, 0x28, 0x00, + 0xd1, 0x07, 0x68, 0xb8, 0xf0, 0x00, 0xff, 0x08, + 0xe0, 0x2f, 0xe0, 0x0e, 0xe0, 0x63, 0xe0, 0x3a, + 0xe0, 0x6e, 0x78, 0xe0, 0x30, 0x50, 0x04, 0x00, + 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, + 0x49, 0x3a, 0xf0, 0x00, 0xfe, 0x87, 0x80, 0xa0, + 0xe0, 0x62, 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0xae, + 0x20, 0x03, 0xf0, 0x00, 0xfe, 0xcb, 0x60, 0xa8, + 0x1c, 0x01, 0xd0, 0x98, 0x20, 0x32, 0x70, 0x28, + 0x20, 0x23, 0x70, 0x68, 0x20, 0x0c, 0x80, 0x68, + 0x98, 0x02, 0x9a, 0x03, 0x5a, 0x10, 0x80, 0xa8, + 0x78, 0xe0, 0x71, 0xa8, 0x1c, 0x0b, 0x22, 0x00, + 0x1c, 0x01, 0x20, 0x84, 0xf7, 0xff, 0xfc, 0xd6, + 0x81, 0xa8, 0xf7, 0xff, 0xfc, 0xa5, 0x28, 0x00, + 0xd1, 0x01, 0x26, 0x00, 0xe0, 0x40, 0x78, 0xe0, + 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x43, 0x18, 0x49, 0x23, 0xf0, 0x00, + 0xfe, 0x59, 0x80, 0xa0, 0xe0, 0x32, 0x20, 0x32, + 0x70, 0x28, 0x20, 0x23, 0x70, 0x68, 0x20, 0x0c, + 0x80, 0x68, 0x98, 0x02, 0x9a, 0x03, 0x5a, 0x10, + 0x80, 0xa8, 0x78, 0xe0, 0x71, 0xa8, 0x1c, 0x0b, + 0x22, 0x00, 0x1c, 0x01, 0x20, 0xa2, 0xf7, 0xff, + 0xfc, 0xb1, 0x81, 0xa8, 0xf7, 0xff, 0xfc, 0x80, + 0x28, 0x00, 0xd1, 0x02, 0x9a, 0x07, 0x60, 0x10, + 0xe7, 0xd7, 0x78, 0xe0, 0x30, 0x50, 0x04, 0x00, + 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, + 0x49, 0x10, 0xf0, 0x00, 0xfe, 0x33, 0x80, 0xa0, + 0x21, 0x05, 0x70, 0xa1, 0xe0, 0x0c, 0x28, 0x7f, + 0xda, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, + 0x9a, 0x07, 0x1c, 0x38, 0xf0, 0x00, 0xfb, 0x64, + 0x1c, 0x06, 0xd0, 0x01, 0x20, 0x08, 0x70, 0xa0, + 0x1c, 0x30, 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xe0, + 0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xd0, + 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x27, 0x10, + 0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x20, 0x01, + 0xb0, 0x84, 0x9a, 0x07, 0x25, 0x01, 0x60, 0x10, + 0x98, 0x04, 0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, + 0x90, 0x03, 0x4e, 0xcf, 0x19, 0x87, 0x4c, 0xcf, + 0x29, 0x60, 0xd0, 0x6d, 0xdc, 0x0e, 0x29, 0x22, + 0xd0, 0x37, 0x29, 0x32, 0xd0, 0x69, 0x29, 0x34, + 0xd0, 0x68, 0x29, 0x50, 0xd1, 0x67, 0x20, 0x03, + 0xf0, 0x00, 0xfe, 0x40, 0x60, 0xa0, 0x28, 0x00, + 0xd1, 0x62, 0xe0, 0x80, 0x29, 0x80, 0xd0, 0x32, + 0x29, 0x84, 0xd0, 0x5e, 0x29, 0x86, 0xd1, 0x5a, + 0x98, 0x04, 0xf7, 0xff, 0xfc, 0x01, 0x20, 0x86, + 0x76, 0xb8, 0xf7, 0xff, 0xfb, 0x41, 0x1c, 0x05, + 0xd5, 0x73, 0x20, 0x01, 0xab, 0x01, 0x70, 0x18, + 0x21, 0x32, 0x70, 0x21, 0x21, 0x23, 0x70, 0x61, + 0x21, 0x0c, 0x80, 0x61, 0x98, 0x03, 0x5a, 0x30, + 0x80, 0xa0, 0x78, 0xf9, 0x71, 0xa1, 0x20, 0x88, + 0x68, 0xa3, 0xaa, 0x01, 0xf7, 0xff, 0xfc, 0x3a, + 0x81, 0xa0, 0xf7, 0xff, 0xfc, 0x09, 0x28, 0x00, + 0xd1, 0x5c, 0x1c, 0x28, 0xf7, 0xff, 0xfb, 0x6e, + 0xe0, 0xdd, 0x98, 0x04, 0xf7, 0xff, 0xfb, 0xdc, + 0x98, 0x04, 0xf0, 0x00, 0xfa, 0xe1, 0x1c, 0x05, + 0xd0, 0x2a, 0x20, 0x02, 0xe1, 0x4c, 0x98, 0x04, + 0xf7, 0xff, 0xfb, 0xd2, 0x9a, 0x06, 0x78, 0x10, + 0x28, 0x80, 0xd1, 0x27, 0x21, 0x32, 0x70, 0x21, + 0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, 0x80, 0x61, + 0x98, 0x03, 0x5a, 0x30, 0x80, 0xa0, 0x78, 0xf9, + 0x71, 0xa1, 0x22, 0x00, 0x20, 0x81, 0x68, 0xa3, + 0xf7, 0xff, 0xfc, 0x10, 0x81, 0xa0, 0xf7, 0xff, + 0xfb, 0xdf, 0x28, 0x00, 0xd0, 0x73, 0x78, 0xf8, + 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x43, 0x18, 0x49, 0x9a, 0xf0, 0x00, + 0xfd, 0x95, 0x80, 0xb8, 0x20, 0x07, 0xe1, 0x23, + 0xe1, 0x23, 0xe0, 0xea, 0xe0, 0xe6, 0xe1, 0x13, + 0xe0, 0xed, 0xe0, 0x7e, 0x8a, 0x38, 0x28, 0x00, + 0xdd, 0x5e, 0x68, 0xf9, 0x29, 0x00, 0xd0, 0x5c, + 0x91, 0x01, 0x21, 0x32, 0x4c, 0x91, 0x70, 0x21, + 0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, 0x80, 0x61, + 0x99, 0x03, 0x5a, 0x71, 0x80, 0xa1, 0x78, 0xf9, + 0x71, 0xa1, 0x26, 0x01, 0x02, 0xb6, 0x42, 0xb0, + 0xdd, 0x1c, 0x48, 0x8b, 0xf0, 0x00, 0xfd, 0xbe, + 0x60, 0xa0, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x00, + 0xe0, 0x01, 0xe0, 0x8e, 0xe0, 0x7e, 0xe0, 0xfd, + 0xab, 0x02, 0x80, 0x1e, 0x78, 0xf9, 0x1c, 0x03, + 0x20, 0xa1, 0xaa, 0x01, 0xf7, 0xff, 0xfb, 0xce, + 0x81, 0xa0, 0x68, 0xf8, 0x4b, 0x81, 0x18, 0xc0, + 0x60, 0xf8, 0x8a, 0x38, 0x1a, 0xc0, 0x82, 0x38, + 0x20, 0x06, 0xe0, 0x1a, 0x30, 0x0a, 0x04, 0x00, + 0x0c, 0x00, 0xf0, 0x00, 0xfd, 0x9f, 0x60, 0xa0, + 0x28, 0x00, 0xd0, 0xe0, 0x8a, 0x39, 0x31, 0x01, + 0xab, 0x02, 0x80, 0x19, 0x78, 0xf9, 0x1c, 0x03, + 0x20, 0xa0, 0xaa, 0x01, 0xf7, 0xff, 0xfb, 0xb2, + 0x81, 0xa0, 0x24, 0x00, 0x82, 0x3c, 0x60, 0xfc, + 0x68, 0xb8, 0xf0, 0x00, 0xfd, 0xb1, 0x20, 0x05, + 0x60, 0xbc, 0x70, 0xb8, 0xf7, 0xff, 0xfb, 0x82, + 0x28, 0x00, 0xd0, 0x0c, 0x78, 0xf8, 0x30, 0x50, + 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, + 0x43, 0x18, 0x49, 0x67, 0xf0, 0x00, 0xfd, 0x2e, + 0x80, 0xb8, 0x20, 0x00, 0xe0, 0x02, 0xe0, 0xa1, + 0xe0, 0x03, 0xe0, 0x02, 0x9a, 0x07, 0x60, 0x10, + 0xe0, 0xb7, 0x7e, 0xb8, 0x28, 0x00, 0xd1, 0x11, + 0x78, 0xf8, 0x30, 0x60, 0x04, 0x00, 0x0c, 0x00, + 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, 0x21, 0x7d, + 0x00, 0xc9, 0xf0, 0x00, 0xfd, 0x17, 0x80, 0xf8, + 0x20, 0x04, 0x70, 0xb8, 0x68, 0xa0, 0xf0, 0x00, + 0xfd, 0x83, 0xe0, 0xa2, 0x20, 0x00, 0x76, 0xb8, + 0xe0, 0x9f, 0x20, 0x84, 0x76, 0xb8, 0x21, 0x32, + 0x70, 0x21, 0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, + 0x80, 0x61, 0x98, 0x03, 0x5a, 0x30, 0x80, 0xa0, + 0x78, 0xf9, 0x71, 0xa1, 0x22, 0x00, 0x20, 0x85, + 0x68, 0xa3, 0xf7, 0xff, 0xfb, 0x67, 0x81, 0xa0, + 0xf7, 0xff, 0xfb, 0x36, 0x28, 0x00, 0xd1, 0x01, + 0x25, 0x00, 0xe0, 0x03, 0x98, 0x04, 0xf0, 0x00, + 0xfa, 0x13, 0x1c, 0x05, 0x2d, 0x00, 0xd0, 0x00, + 0xe7, 0x2f, 0xe0, 0x7e, 0x78, 0xf8, 0x30, 0x50, + 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x98, 0x00, 0x43, 0x18, 0x49, 0x40, + 0xf0, 0x00, 0xfc, 0xe0, 0x80, 0xb8, 0x20, 0x01, + 0xe0, 0x70, 0x00, 0xe8, 0x1b, 0x40, 0x00, 0x80, + 0x19, 0x81, 0x78, 0xc9, 0xab, 0x01, 0x70, 0x19, + 0x99, 0x03, 0x5a, 0x71, 0x52, 0x31, 0x21, 0x32, + 0x70, 0x21, 0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, + 0x80, 0x61, 0x98, 0x03, 0x5a, 0x30, 0x80, 0xa0, + 0x78, 0xf9, 0x71, 0xa1, 0x20, 0x87, 0x68, 0xa3, + 0xaa, 0x01, 0xf7, 0xff, 0xfb, 0x2f, 0x81, 0xa0, + 0xf7, 0xff, 0xfa, 0xfe, 0x28, 0x00, 0xd1, 0x03, + 0x1c, 0x28, 0xf7, 0xff, 0xfa, 0x63, 0xe0, 0x31, + 0x21, 0x21, 0x9a, 0x07, 0x1c, 0x28, 0xf7, 0xff, + 0xfc, 0x8f, 0x1c, 0x05, 0x78, 0xf8, 0x30, 0x50, + 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, + 0x43, 0x18, 0x49, 0x25, 0xf0, 0x00, 0xfc, 0xaa, + 0x80, 0xb8, 0xe0, 0x3a, 0x98, 0x04, 0x1d, 0x22, + 0xe0, 0x01, 0x22, 0x00, 0x98, 0x04, 0xf7, 0xfe, + 0xff, 0xd9, 0x1c, 0x05, 0xe0, 0x31, 0x21, 0x32, + 0x70, 0x21, 0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, + 0x80, 0x61, 0x99, 0x03, 0x5a, 0x71, 0x80, 0xa1, + 0x78, 0xf9, 0x71, 0xa1, 0x22, 0x00, 0x1c, 0x03, + 0x20, 0x84, 0xf7, 0xff, 0xfa, 0xfb, 0x81, 0xa0, + 0xf7, 0xff, 0xfa, 0xca, 0x28, 0x00, 0xd1, 0x03, + 0x9a, 0x07, 0x60, 0x10, 0x25, 0x00, 0xe0, 0x18, + 0x78, 0xf8, 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, + 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, 0x49, 0x0e, + 0xf0, 0x00, 0xfc, 0x7c, 0x80, 0xb8, 0xe0, 0x0a, + 0x29, 0x7f, 0xda, 0x01, 0x21, 0x01, 0xe0, 0x00, + 0x21, 0x00, 0x98, 0x04, 0x9a, 0x07, 0xf0, 0x00, + 0xf9, 0xaf, 0x1c, 0x05, 0xd0, 0x01, 0x20, 0x08, + 0x70, 0xb8, 0x1c, 0x28, 0xb0, 0x04, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x56, 0xc0, + 0x00, 0x00, 0x27, 0x10, 0x2e, 0x08, 0x56, 0xd0, + 0x00, 0x00, 0x04, 0x0a, 0x00, 0x00, 0x03, 0xff, + 0xb5, 0x80, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x07, + 0x20, 0x01, 0x60, 0x18, 0x29, 0x50, 0xd0, 0x0e, + 0xdc, 0x06, 0x29, 0x22, 0xd0, 0x0b, 0x29, 0x32, + 0xd0, 0x09, 0x29, 0x34, 0xd1, 0x0d, 0xe0, 0x06, + 0x29, 0x80, 0xd0, 0x02, 0x29, 0x84, 0xd1, 0x08, + 0xe0, 0x01, 0x20, 0x00, 0x70, 0x10, 0x1c, 0x38, + 0xf7, 0xff, 0xfe, 0x2e, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x29, 0x7f, 0xda, 0x01, 0x21, 0x01, + 0xe0, 0x00, 0x21, 0x00, 0x1c, 0x38, 0x1c, 0x1a, + 0xf0, 0x00, 0xf9, 0x72, 0x28, 0x00, 0xd0, 0xf1, + 0x21, 0x08, 0x00, 0xfa, 0x1b, 0xd2, 0x00, 0x92, + 0x4b, 0x02, 0x18, 0xd2, 0x70, 0x91, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x20, 0x01, + 0xb0, 0x81, 0x1c, 0x17, 0x9a, 0x04, 0x25, 0x01, + 0x60, 0x10, 0x98, 0x01, 0x00, 0xc2, 0x1a, 0x12, + 0x00, 0x92, 0x1c, 0x16, 0x48, 0x78, 0x90, 0x00, + 0x18, 0x14, 0x29, 0x80, 0xd0, 0x59, 0xdc, 0x08, + 0x29, 0x22, 0xd0, 0x1a, 0x29, 0x32, 0xd0, 0x55, + 0x29, 0x34, 0xd0, 0x53, 0x29, 0x50, 0xd1, 0x61, + 0xe0, 0xc8, 0x29, 0x84, 0xd0, 0x4e, 0x4e, 0x71, + 0x29, 0xa0, 0xd0, 0x18, 0x29, 0xa1, 0xd1, 0x59, + 0x98, 0x01, 0xf7, 0xff, 0xfa, 0x19, 0x8b, 0x21, + 0x29, 0x00, 0xd1, 0x54, 0x88, 0xb8, 0xf0, 0x00, + 0xfc, 0x45, 0x60, 0xb0, 0x28, 0x00, 0xd1, 0x58, + 0xe0, 0x15, 0x98, 0x01, 0xf7, 0xff, 0xfa, 0x0c, + 0x98, 0x01, 0xf0, 0x00, 0xf9, 0x11, 0x1c, 0x05, + 0xd0, 0x6a, 0x20, 0x02, 0xe0, 0xbd, 0x98, 0x01, + 0xf7, 0xff, 0xfa, 0x02, 0x8b, 0x21, 0x29, 0x00, + 0xd1, 0x07, 0x88, 0xb8, 0xf0, 0x00, 0xfc, 0x2e, + 0x60, 0xb0, 0x28, 0x00, 0xd1, 0x0c, 0x20, 0x00, + 0xe0, 0xb1, 0x88, 0xb8, 0x18, 0x08, 0x04, 0x02, + 0x0c, 0x12, 0x69, 0x60, 0xf0, 0x00, 0xfc, 0x27, + 0x60, 0xb0, 0x28, 0x00, 0xd0, 0xf3, 0x61, 0x60, + 0x20, 0x34, 0x70, 0x30, 0x70, 0x70, 0x20, 0x0c, + 0x80, 0x70, 0x78, 0xe0, 0x71, 0x30, 0x88, 0xb9, + 0x8b, 0x20, 0x18, 0x09, 0x81, 0xb1, 0x68, 0xb1, + 0x18, 0x08, 0x88, 0xba, 0x68, 0x39, 0xf0, 0x13, + 0xfb, 0x2d, 0xf7, 0xff, 0xfa, 0x07, 0x28, 0x00, + 0xd1, 0x05, 0x68, 0xb0, 0xf0, 0x00, 0xfc, 0x2c, + 0xe0, 0x53, 0xe0, 0x36, 0xe0, 0x76, 0x78, 0xe0, + 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x43, 0x18, 0x49, 0x46, 0xf0, 0x00, + 0xfb, 0xad, 0x80, 0xa0, 0x20, 0x00, 0x83, 0x20, + 0x61, 0x60, 0xe0, 0x22, 0xe0, 0x6d, 0x88, 0xb8, + 0x18, 0x08, 0x04, 0x02, 0x0c, 0x12, 0x69, 0x60, + 0xf0, 0x00, 0xfb, 0xf1, 0x60, 0xb0, 0x28, 0x00, + 0xd0, 0xbd, 0x61, 0x60, 0x8b, 0x21, 0x69, 0x60, + 0x18, 0x40, 0x88, 0xba, 0x68, 0x39, 0xf0, 0x13, + 0xfb, 0x01, 0x8b, 0x20, 0x88, 0xb9, 0x18, 0x40, + 0x83, 0x20, 0x78, 0xe0, 0x30, 0x50, 0x04, 0x00, + 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, + 0x49, 0x33, 0xf0, 0x00, 0xfb, 0x87, 0x80, 0xa0, + 0x20, 0x00, 0x9a, 0x04, 0x60, 0x10, 0xe0, 0x55, + 0xe0, 0x54, 0x98, 0x01, 0xf7, 0xff, 0xf9, 0x98, + 0x78, 0x38, 0x28, 0x80, 0xd1, 0x23, 0x20, 0x32, + 0x4f, 0x2c, 0x70, 0x38, 0x20, 0x23, 0x70, 0x78, + 0x20, 0x0c, 0x80, 0x78, 0x98, 0x00, 0x5b, 0x80, + 0x80, 0xb8, 0x78, 0xe1, 0x71, 0xb9, 0x22, 0x00, + 0x20, 0x81, 0x68, 0xbb, 0xf7, 0xff, 0xf9, 0xd6, + 0x81, 0xb8, 0xf7, 0xff, 0xf9, 0xa5, 0x28, 0x00, + 0xd1, 0x01, 0x25, 0x00, 0xe0, 0x36, 0x78, 0xe0, + 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, + 0x04, 0x1b, 0x43, 0x18, 0x49, 0x1c, 0xf0, 0x00, + 0xfb, 0x59, 0x80, 0xa0, 0xe0, 0x2a, 0x7e, 0xa0, + 0x28, 0x00, 0xd1, 0x10, 0x78, 0xe0, 0x30, 0x60, + 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, + 0x43, 0x18, 0x21, 0x7d, 0x00, 0xc9, 0xf0, 0x00, + 0xfb, 0x49, 0x80, 0xe0, 0x20, 0x00, 0x9a, 0x04, + 0x60, 0x10, 0x20, 0x04, 0xe0, 0x15, 0x20, 0x00, + 0x76, 0xa0, 0xe0, 0x13, 0x98, 0x01, 0x9b, 0x04, + 0x1c, 0x3a, 0xf7, 0xff, 0xfd, 0x29, 0x1c, 0x05, + 0xe0, 0x0c, 0x29, 0x7f, 0xda, 0x01, 0x21, 0x01, + 0xe0, 0x00, 0x21, 0x00, 0x98, 0x01, 0x9a, 0x04, + 0xf0, 0x00, 0xf8, 0x6e, 0x1c, 0x05, 0xd0, 0x01, + 0x20, 0x08, 0x70, 0xa0, 0x1c, 0x28, 0xb0, 0x01, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x56, 0xd0, + 0x00, 0x00, 0x27, 0x10, 0x2e, 0x08, 0x56, 0xc0, + 0xb5, 0xf0, 0x1c, 0x07, 0x06, 0x08, 0x0e, 0x00, + 0x21, 0x01, 0x26, 0x02, 0x00, 0xfa, 0x1b, 0xd2, + 0x00, 0x92, 0x60, 0x19, 0x1c, 0x1c, 0x49, 0x19, + 0x18, 0x55, 0x28, 0x22, 0xd0, 0x19, 0x28, 0x50, + 0xd0, 0x11, 0x28, 0x80, 0xd0, 0x21, 0x28, 0x85, + 0xd1, 0x23, 0x1c, 0x38, 0xf7, 0xff, 0xf9, 0x20, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x25, 0x28, 0x00, + 0xd0, 0x00, 0x70, 0xae, 0x21, 0x00, 0x60, 0x21, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x1a, 0x28, 0x00, 0xd0, 0xf7, + 0xe0, 0x07, 0x1c, 0x38, 0xf7, 0xff, 0xf9, 0x0c, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x11, 0x28, 0x00, + 0xd0, 0xee, 0x70, 0xae, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0x00, 0x22, 0x34, 0x49, 0x0a, 0x70, 0x0a, + 0x22, 0x33, 0x70, 0x4a, 0x22, 0x04, 0x80, 0x4a, + 0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, 0x4a, 0x07, + 0x18, 0x80, 0x78, 0xc0, 0x71, 0x08, 0xf7, 0xff, + 0xf9, 0x0b, 0x28, 0x00, 0xd1, 0x01, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xe0, + 0xb5, 0xf0, 0x1c, 0x04, 0x20, 0x01, 0x26, 0x01, + 0x60, 0x10, 0x1c, 0x17, 0x4d, 0x1b, 0x29, 0x00, + 0xd0, 0x08, 0x20, 0x03, 0xf0, 0x00, 0xfb, 0x02, + 0x60, 0xa8, 0x28, 0x00, 0xd1, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x32, 0x70, 0x28, + 0x20, 0x23, 0x70, 0x68, 0x20, 0x0c, 0x80, 0x68, + 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 0x49, 0x12, + 0x5a, 0x0a, 0x80, 0xaa, 0x18, 0x44, 0x78, 0xe1, + 0x71, 0xa9, 0x22, 0x00, 0x20, 0x84, 0x68, 0xab, + 0xf7, 0xff, 0xf9, 0x08, 0x81, 0xa8, 0xf7, 0xff, + 0xf8, 0xd7, 0x28, 0x00, 0xd1, 0x02, 0x26, 0x00, + 0x60, 0x38, 0xe0, 0x0a, 0x78, 0xe0, 0x30, 0x50, + 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, + 0x43, 0x18, 0x49, 0x06, 0xf0, 0x00, 0xfa, 0x8a, + 0x80, 0xa0, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x56, 0xc0, + 0x2e, 0x08, 0x56, 0xe0, 0x00, 0x00, 0x27, 0x10, + 0x20, 0x00, 0x47, 0x70, 0xb5, 0x90, 0x28, 0x00, + 0xd0, 0x06, 0x21, 0xff, 0x4a, 0x24, 0x73, 0x11, + 0x4b, 0x24, 0x18, 0xc1, 0xf7, 0xfa, 0xfe, 0x88, + 0x20, 0x00, 0x21, 0x00, 0x4a, 0x22, 0x01, 0x83, + 0x18, 0x1b, 0x00, 0xdb, 0x18, 0x9b, 0x33, 0xff, + 0x33, 0xff, 0x33, 0x02, 0x60, 0x19, 0x60, 0x59, + 0x30, 0x01, 0x28, 0x06, 0xdb, 0xf3, 0x20, 0x00, + 0x43, 0xc4, 0x4a, 0x1c, 0x01, 0x03, 0x50, 0xd1, + 0x18, 0x9b, 0x60, 0xdc, 0x30, 0x01, 0x28, 0x1e, + 0xdb, 0xf8, 0x27, 0x01, 0x20, 0x02, 0x49, 0x18, + 0x60, 0x08, 0xf7, 0xfd, 0xfb, 0x11, 0x28, 0x01, + 0xd0, 0x00, 0x27, 0x00, 0xf7, 0xfb, 0xff, 0x78, + 0x28, 0x00, 0xd1, 0x00, 0x27, 0x00, 0xf7, 0xfe, + 0xfe, 0x09, 0x28, 0x00, 0xd1, 0x00, 0x27, 0x00, + 0xf7, 0xfd, 0xfe, 0x24, 0x28, 0x00, 0xd1, 0x00, + 0x27, 0x00, 0xf0, 0x01, 0xf9, 0x05, 0x28, 0x00, + 0xd1, 0x00, 0x27, 0x00, 0xf0, 0x02, 0xf8, 0xb6, + 0x42, 0xa0, 0xd1, 0x00, 0x27, 0x00, 0x2f, 0x01, + 0xd1, 0x01, 0xf0, 0x00, 0xf8, 0x0f, 0x1c, 0x38, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0x90, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x5e, 0x30, 0x2e, 0x08, 0x5c, 0x50, + 0x6e, 0x00, 0x11, 0x00, 0xb5, 0x00, 0xf0, 0x18, + 0xfd, 0x33, 0x49, 0x07, 0x20, 0x19, 0xf0, 0x18, + 0xfc, 0xfb, 0xf0, 0x18, 0xfc, 0xf1, 0x4b, 0x05, + 0x40, 0x18, 0xf0, 0x18, 0xfc, 0xf1, 0xf0, 0x18, + 0xfd, 0x5d, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x00, 0xaf, 0xb5, 0xfd, 0xff, 0xff, 0xff, + 0xb5, 0x00, 0xf0, 0x18, 0xfc, 0xe1, 0x23, 0x01, + 0x06, 0x5b, 0x43, 0x18, 0xf0, 0x18, 0xfc, 0xe0, + 0x20, 0x01, 0x06, 0x40, 0xf0, 0x18, 0xfc, 0xd3, + 0x48, 0x02, 0x68, 0x81, 0x31, 0x01, 0x60, 0x81, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x90, + 0xb5, 0xf0, 0xb0, 0x84, 0xf0, 0x00, 0xfa, 0x80, + 0x4f, 0x99, 0x88, 0x39, 0x48, 0x99, 0x29, 0x06, + 0xd2, 0x64, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x03, 0x36, 0x61, 0x8e, + 0xb9, 0xe8, 0x1d, 0xc5, 0x35, 0xff, 0x35, 0xfa, + 0x68, 0x6c, 0x68, 0x2e, 0x2e, 0x00, 0xd1, 0x13, + 0xf7, 0xfa, 0xfc, 0xa0, 0x69, 0x39, 0x42, 0x88, + 0xd9, 0x24, 0xf7, 0xfa, 0xfc, 0x9b, 0x30, 0x64, + 0x61, 0x38, 0x20, 0x00, 0xab, 0x01, 0x70, 0x18, + 0x3b, 0x04, 0x70, 0x18, 0x46, 0x69, 0x22, 0x00, + 0xa8, 0x01, 0xf7, 0xfd, 0xfa, 0x69, 0xe0, 0x15, + 0x21, 0x01, 0xab, 0x01, 0x70, 0x19, 0x19, 0x01, + 0x31, 0xff, 0x31, 0xe1, 0x78, 0x09, 0x3b, 0x04, + 0x70, 0x19, 0x01, 0x21, 0x18, 0x0a, 0x46, 0x69, + 0xa8, 0x01, 0xf7, 0xfd, 0xfa, 0x59, 0x20, 0x1e, + 0x1c, 0x61, 0x3e, 0x01, 0xf0, 0x13, 0xf8, 0xd8, + 0x60, 0x69, 0x60, 0x2e, 0x21, 0x01, 0xe0, 0x54, + 0x23, 0x01, 0x02, 0x9b, 0x18, 0xc5, 0x68, 0xec, + 0x68, 0xae, 0x2e, 0x00, 0xd0, 0x20, 0x19, 0x01, + 0x23, 0x1f, 0x01, 0x5b, 0x18, 0xc9, 0x7a, 0x09, + 0xab, 0x00, 0x70, 0x19, 0xa9, 0x00, 0x78, 0x09, + 0x09, 0x09, 0x29, 0x06, 0xd0, 0x01, 0x21, 0x01, + 0xe0, 0x00, 0x21, 0x02, 0xab, 0x01, 0x70, 0x19, + 0x01, 0x21, 0x18, 0x08, 0x23, 0x41, 0x00, 0xdb, + 0x18, 0xc2, 0x46, 0x69, 0xa8, 0x01, 0xf7, 0xfb, + 0xfe, 0xa3, 0x20, 0x1e, 0x1c, 0x61, 0x3e, 0x01, + 0xf0, 0x13, 0xf8, 0xae, 0x60, 0xe9, 0x60, 0xae, + 0x21, 0x02, 0xe0, 0x2a, 0xe0, 0xc2, 0x23, 0x03, + 0x02, 0x5b, 0x18, 0xc5, 0x69, 0x6c, 0x69, 0x2e, + 0x2e, 0x00, 0xd0, 0x21, 0x21, 0x01, 0xab, 0x01, + 0x70, 0x19, 0x19, 0x01, 0x23, 0x2f, 0x01, 0x5b, + 0x18, 0xc9, 0x7c, 0x09, 0xab, 0x00, 0x70, 0x19, + 0xa9, 0x00, 0x78, 0x09, 0x09, 0x09, 0x29, 0x06, + 0xd1, 0x02, 0x21, 0x02, 0x71, 0x19, 0x33, 0x04, + 0x01, 0x21, 0x18, 0x08, 0x23, 0x41, 0x01, 0x1b, + 0x18, 0xc2, 0x46, 0x69, 0xa8, 0x01, 0xf7, 0xfe, + 0xfd, 0x09, 0x20, 0x1e, 0x1c, 0x61, 0x3e, 0x01, + 0xf0, 0x13, 0xf8, 0x82, 0x61, 0x69, 0x61, 0x2e, + 0x21, 0x03, 0x80, 0x39, 0x20, 0x00, 0xe0, 0x97, + 0x23, 0x01, 0x02, 0xdb, 0x18, 0xc5, 0x69, 0xec, + 0x69, 0xae, 0x2e, 0x00, 0xd0, 0x21, 0x21, 0x01, + 0xab, 0x01, 0x70, 0x19, 0x19, 0x01, 0x23, 0x3f, + 0x01, 0x5b, 0x18, 0xc9, 0x7e, 0x09, 0xab, 0x00, + 0x70, 0x19, 0xa9, 0x00, 0x78, 0x09, 0x09, 0x09, + 0x29, 0x06, 0xd1, 0x02, 0x21, 0x02, 0x71, 0x19, + 0x33, 0x04, 0x01, 0x21, 0x18, 0x08, 0x23, 0xc3, + 0x00, 0xdb, 0x18, 0xc2, 0x46, 0x69, 0xa8, 0x01, + 0xf7, 0xfd, 0xfc, 0xfe, 0x20, 0x1e, 0x1c, 0x61, + 0x3e, 0x01, 0xf0, 0x13, 0xf8, 0x55, 0x61, 0xe9, + 0x61, 0xae, 0x20, 0x04, 0xe0, 0x2c, 0x23, 0x05, + 0x02, 0x5b, 0x18, 0xc5, 0x6a, 0x6c, 0x6a, 0x2e, + 0x2e, 0x00, 0xd0, 0x24, 0x19, 0x01, 0x18, 0xc9, + 0x78, 0x09, 0xab, 0x00, 0x70, 0x19, 0xa9, 0x00, + 0x78, 0x09, 0x09, 0x09, 0x29, 0x06, 0xd0, 0x05, + 0x29, 0x07, 0xd0, 0x01, 0x29, 0x08, 0xd1, 0x03, + 0x21, 0x03, 0xe0, 0x02, 0x21, 0x02, 0xe0, 0x00, + 0x21, 0x01, 0xab, 0x01, 0x70, 0x19, 0x01, 0x21, + 0x18, 0x08, 0x23, 0x41, 0x01, 0x5b, 0x18, 0xc2, + 0x46, 0x69, 0xa8, 0x01, 0xf0, 0x00, 0xff, 0xb4, + 0x20, 0x1e, 0x1c, 0x61, 0x3e, 0x01, 0xf0, 0x13, + 0xf8, 0x27, 0x62, 0x69, 0x62, 0x2e, 0x20, 0x05, + 0x80, 0x38, 0xe7, 0xa3, 0xe7, 0xff, 0x23, 0x03, + 0x02, 0x9b, 0x18, 0xc6, 0x6a, 0xf4, 0x6a, 0xb5, + 0x2d, 0x00, 0xd0, 0x33, 0x19, 0x01, 0x18, 0xc9, + 0x7a, 0x09, 0xab, 0x00, 0x70, 0x19, 0xa9, 0x00, + 0x78, 0x09, 0x09, 0x09, 0x29, 0x09, 0xd0, 0x10, + 0x29, 0x0a, 0xd1, 0x1f, 0x01, 0x21, 0x18, 0x08, + 0x23, 0x05, 0x02, 0x5b, 0x18, 0xc0, 0x90, 0x02, + 0x8d, 0x01, 0x6a, 0xc0, 0xf7, 0xf5, 0xfd, 0x7c, + 0x23, 0x01, 0x42, 0xd8, 0xd0, 0x14, 0x98, 0x02, + 0xe0, 0x0d, 0x01, 0x21, 0x18, 0x08, 0x23, 0x05, + 0x02, 0x5b, 0x18, 0xc0, 0x90, 0x03, 0x8d, 0x01, + 0x6a, 0xc0, 0xf7, 0xf5, 0xfd, 0xe6, 0x23, 0x01, + 0x42, 0xd8, 0xd0, 0x05, 0x98, 0x03, 0x6a, 0xc0, + 0xf0, 0x00, 0xf9, 0x42, 0x34, 0x01, 0x3d, 0x01, + 0x20, 0x1e, 0x1c, 0x21, 0xf0, 0x12, 0xff, 0xe8, + 0x62, 0xf1, 0x62, 0xb5, 0x20, 0x00, 0x80, 0x38, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x90, 0x2e, 0x08, 0x5e, 0x30, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0xb4, 0x0f, 0xb5, 0x80, + 0xb0, 0x84, 0x99, 0x06, 0xaa, 0x07, 0x4f, 0x15, + 0x68, 0x38, 0xf0, 0x13, 0xf8, 0xf5, 0x30, 0x01, + 0x04, 0x00, 0x0c, 0x00, 0xab, 0x00, 0x80, 0x18, + 0x28, 0x80, 0xdc, 0x19, 0xa8, 0x00, 0x88, 0x00, + 0x28, 0x04, 0xdb, 0x15, 0xa8, 0x00, 0x88, 0x00, + 0x30, 0x02, 0xf0, 0x00, 0xf8, 0xeb, 0x28, 0x00, + 0xd0, 0x0e, 0x90, 0x01, 0xaa, 0x00, 0x88, 0x12, + 0x68, 0x39, 0xf0, 0x13, 0xf8, 0x03, 0x21, 0x00, + 0xaa, 0x00, 0x88, 0x12, 0x98, 0x01, 0x54, 0x81, + 0x46, 0x69, 0x20, 0xa6, 0xf0, 0x00, 0xf8, 0x24, + 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 0xb0, 0x04, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xcc, + 0xb5, 0x90, 0x04, 0x0c, 0x0c, 0x24, 0x1c, 0x07, + 0x1c, 0x20, 0xb0, 0x84, 0xf0, 0x00, 0xf8, 0xca, + 0x28, 0x00, 0xd1, 0x01, 0x43, 0xc0, 0xe0, 0x0b, + 0xab, 0x00, 0x80, 0x1c, 0x90, 0x01, 0x1c, 0x39, + 0x1c, 0x22, 0xf0, 0x12, 0xff, 0xdf, 0x46, 0x69, + 0x20, 0x96, 0xf0, 0x00, 0xf8, 0x05, 0x20, 0x00, + 0xb0, 0x04, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf0, 0x06, 0x06, 0x0e, 0x36, 0x07, 0x30, + 0x0f, 0x00, 0x01, 0x83, 0x18, 0x18, 0x00, 0xc0, + 0x1c, 0x0f, 0xb0, 0x83, 0x49, 0x2e, 0x18, 0x45, + 0x1f, 0xe8, 0x38, 0x79, 0x90, 0x02, 0x6f, 0x84, + 0x6f, 0xc0, 0x2c, 0x1e, 0xda, 0x4e, 0x09, 0x31, + 0x29, 0x06, 0xd1, 0x11, 0x88, 0x3a, 0xb0, 0x81, + 0x92, 0x00, 0x19, 0x01, 0x20, 0x1e, 0x1c, 0x2f, + 0xf0, 0x12, 0xff, 0x6a, 0x9a, 0x00, 0x01, 0x08, + 0x18, 0x38, 0x38, 0xff, 0x38, 0xff, 0x38, 0x42, + 0x87, 0x02, 0x18, 0x68, 0xb0, 0x01, 0xe0, 0x34, + 0x29, 0x07, 0xd1, 0x22, 0x19, 0x01, 0x20, 0x1e, + 0xf0, 0x12, 0xff, 0x5a, 0x91, 0x00, 0x01, 0x08, + 0x18, 0x28, 0x90, 0x01, 0x22, 0x10, 0x38, 0xff, + 0x38, 0xff, 0x38, 0x0a, 0x1c, 0x39, 0xf0, 0x12, + 0xff, 0x9d, 0x98, 0x00, 0x18, 0x28, 0x38, 0x40, + 0x76, 0x06, 0x78, 0xb8, 0xf0, 0x00, 0xf8, 0x76, + 0x99, 0x01, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, + 0x67, 0xc8, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0x1a, + 0x78, 0xba, 0x68, 0x79, 0xf0, 0x12, 0xff, 0x8a, + 0xe0, 0x11, 0x19, 0x01, 0x20, 0x1e, 0xf0, 0x12, + 0xff, 0x37, 0x91, 0x00, 0x01, 0x08, 0x18, 0x28, + 0x22, 0x10, 0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, + 0x1c, 0x39, 0xf0, 0x12, 0xff, 0x7b, 0x98, 0x00, + 0x18, 0x28, 0x38, 0x40, 0x76, 0x06, 0x1c, 0x60, + 0x99, 0x02, 0x67, 0x88, 0x20, 0xff, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x5e, 0x30, 0xb5, 0xf3, 0x04, 0x0d, + 0x0c, 0x2d, 0x98, 0x00, 0x04, 0x06, 0x0c, 0x36, + 0x27, 0x00, 0x4c, 0x17, 0x01, 0x38, 0x58, 0x20, + 0x42, 0xb0, 0xd1, 0x07, 0xf7, 0xfa, 0xfa, 0xb2, + 0x19, 0x41, 0x01, 0x38, 0x19, 0x00, 0x60, 0xc1, + 0x60, 0x85, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1e, + 0xdb, 0xf0, 0x2f, 0x1e, 0xdb, 0x1a, 0x27, 0x00, + 0x01, 0x38, 0x58, 0x20, 0x28, 0x00, 0xd1, 0x0b, + 0x01, 0x38, 0x50, 0x26, 0x99, 0x00, 0x0c, 0x09, + 0x19, 0x04, 0x60, 0x61, 0xf7, 0xfa, 0xfa, 0x9a, + 0x19, 0x40, 0x60, 0xe0, 0x60, 0xa5, 0xe0, 0x02, + 0x37, 0x01, 0x2f, 0x1e, 0xdb, 0xec, 0x2f, 0x1e, + 0xdb, 0x04, 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x30, 0xe7, 0xf9, + 0x2e, 0x08, 0x5c, 0x50, 0xb4, 0x80, 0x21, 0x00, + 0x4a, 0x07, 0x23, 0x00, 0x01, 0x0f, 0x59, 0xd7, + 0x42, 0x87, 0xd1, 0x02, 0x01, 0x08, 0x50, 0x13, + 0xe0, 0x02, 0x31, 0x01, 0x29, 0x1e, 0xdb, 0xf5, + 0x1c, 0x18, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x5c, 0x50, 0xb5, 0x00, 0xf7, 0xfa, + 0xfb, 0xd7, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, + 0x1c, 0x04, 0x1c, 0x10, 0x1c, 0x15, 0x1c, 0x0f, + 0xf7, 0xff, 0xff, 0xf4, 0x1c, 0x06, 0xd1, 0x06, + 0x1c, 0x20, 0xf7, 0xfa, 0xfb, 0xd3, 0x20, 0x00, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1b, 0xea, + 0x19, 0xf0, 0x21, 0x00, 0xf0, 0x12, 0xff, 0xfe, + 0x1c, 0x30, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x12, + 0xff, 0x01, 0x1c, 0x20, 0xf7, 0xfa, 0xfb, 0xc2, + 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x80, 0x27, 0x01, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xfa, 0xfb, 0xb8, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0x1c, 0x07, + 0xf7, 0xfa, 0xfa, 0x40, 0x19, 0xc7, 0xf7, 0xfa, + 0xfa, 0x3d, 0x42, 0xb8, 0xd3, 0xfb, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x47, 0x70, + 0xb5, 0xf0, 0xf7, 0xfa, 0xfa, 0x33, 0x4e, 0x13, + 0x69, 0x71, 0x42, 0x88, 0xd0, 0x1d, 0xf7, 0xfa, + 0xfa, 0x2d, 0x27, 0x00, 0x61, 0x70, 0x4d, 0x10, + 0x4c, 0x10, 0x01, 0x38, 0x58, 0x22, 0x2a, 0x00, + 0xd0, 0x10, 0x19, 0x00, 0x68, 0xc3, 0x69, 0x71, + 0x42, 0x8b, 0xd2, 0x0b, 0x80, 0x2a, 0x68, 0x82, + 0x18, 0x51, 0x60, 0xc1, 0x68, 0x40, 0x07, 0x00, + 0x0f, 0x00, 0x23, 0x60, 0x43, 0x18, 0x1c, 0x29, + 0xf7, 0xff, 0xfe, 0xea, 0x37, 0x01, 0x2f, 0x1e, + 0xdb, 0xe7, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x90, + 0x2e, 0x08, 0x5c, 0x40, 0x2e, 0x08, 0x5c, 0x50, + 0xb5, 0x80, 0x04, 0x00, 0x0c, 0x00, 0x21, 0x9f, + 0x4a, 0x07, 0x70, 0x11, 0x21, 0x80, 0x70, 0x51, + 0x21, 0x10, 0x70, 0x91, 0x27, 0x00, 0x70, 0xd7, + 0x21, 0x04, 0xf0, 0x01, 0xf8, 0xdd, 0x1c, 0x38, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x72, 0x60, 0xb5, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0xf0, 0x00, 0xf8, 0x03, 0x20, 0x00, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0x04, 0x00, + 0x0c, 0x00, 0x21, 0x9f, 0x4a, 0x07, 0x70, 0x11, + 0x21, 0x80, 0x70, 0x51, 0x21, 0x12, 0x70, 0x91, + 0x27, 0x00, 0x70, 0xd7, 0x21, 0x04, 0xf0, 0x01, + 0xf8, 0xbf, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, + 0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x21, 0x00, + 0x20, 0x9f, 0x4a, 0x14, 0x70, 0x10, 0x20, 0x80, + 0x70, 0x50, 0x20, 0x11, 0x70, 0x90, 0x27, 0x00, + 0x48, 0x11, 0x01, 0x3d, 0x19, 0xed, 0x00, 0xed, + 0x59, 0x46, 0x2e, 0x00, 0xd0, 0x0c, 0x00, 0x8b, + 0x18, 0x9b, 0x0e, 0x36, 0x71, 0x1e, 0x59, 0x46, + 0x0c, 0x36, 0x71, 0x5e, 0x59, 0x46, 0x0a, 0x36, + 0x71, 0x9e, 0x59, 0x45, 0x71, 0xdd, 0x31, 0x01, + 0x37, 0x01, 0x2f, 0x07, 0xdb, 0xe9, 0x00, 0x88, + 0x70, 0xd0, 0x1d, 0x01, 0x1c, 0x20, 0xf0, 0x01, + 0xf8, 0x8f, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, + 0x2e, 0x08, 0x7e, 0xa8, 0xb5, 0x80, 0x04, 0x00, + 0x0c, 0x00, 0x21, 0x9f, 0x4a, 0x07, 0x70, 0x11, + 0x21, 0x80, 0x70, 0x51, 0x21, 0x20, 0x70, 0x91, + 0x27, 0x00, 0x70, 0xd7, 0x21, 0x04, 0xf0, 0x01, + 0xf8, 0x77, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, + 0xb5, 0xf0, 0x04, 0x07, 0x0c, 0x3f, 0xb0, 0x82, + 0x1c, 0xc8, 0x1c, 0x0c, 0x46, 0x69, 0xf0, 0x00, + 0xfc, 0x8b, 0x1c, 0x01, 0x00, 0xf8, 0x4a, 0x25, + 0x18, 0x80, 0x88, 0xc2, 0x20, 0x00, 0x4f, 0x24, + 0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, 0x19, 0xdb, + 0x78, 0xdb, 0x42, 0x93, 0xd1, 0x07, 0x00, 0xc2, + 0x1a, 0x12, 0x00, 0x92, 0x5a, 0xba, 0x32, 0x01, + 0x4b, 0x1e, 0x70, 0x9a, 0xe0, 0x04, 0x30, 0x01, + 0x04, 0x00, 0x14, 0x00, 0x28, 0x08, 0xdb, 0xeb, + 0x18, 0x61, 0x91, 0x01, 0x7a, 0x09, 0x04, 0x0d, + 0x14, 0x2d, 0x00, 0xc6, 0x1a, 0x36, 0x00, 0xb6, + 0x5b, 0xb8, 0x01, 0x00, 0x4c, 0x16, 0x19, 0x00, + 0x68, 0x40, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, + 0xff, 0x07, 0x1c, 0x68, 0xf7, 0xff, 0xfe, 0xde, + 0x5b, 0xb9, 0x01, 0x09, 0x19, 0x09, 0x60, 0x48, + 0x28, 0x00, 0xd0, 0x0a, 0x99, 0x01, 0x31, 0x09, + 0x1c, 0x2a, 0xf0, 0x12, 0xfd, 0xf3, 0x21, 0x00, + 0x5b, 0xb8, 0x01, 0x00, 0x19, 0x00, 0x68, 0x40, + 0x55, 0x41, 0x20, 0x02, 0x5b, 0xb9, 0x01, 0x0a, + 0x54, 0xa0, 0x1c, 0x08, 0xf0, 0x01, 0xf9, 0xae, + 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7a, 0x60, + 0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x72, 0x60, + 0x2e, 0x08, 0x7e, 0x88, 0xb5, 0x80, 0x04, 0x00, + 0x0c, 0x00, 0x21, 0x9f, 0x4a, 0x07, 0x70, 0x11, + 0x21, 0x80, 0x70, 0x51, 0x21, 0x22, 0x70, 0x91, + 0x27, 0x00, 0x70, 0xd7, 0x21, 0x04, 0xf0, 0x01, + 0xf8, 0x03, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, + 0xb5, 0x90, 0x04, 0x04, 0x0c, 0x24, 0xb0, 0x81, + 0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, + 0xfc, 0x17, 0x18, 0x38, 0x78, 0xc0, 0x28, 0x00, + 0xd0, 0x0f, 0x23, 0x7d, 0x00, 0xdb, 0x43, 0x58, + 0x22, 0x03, 0x1c, 0x21, 0xf0, 0x01, 0xf8, 0x77, + 0x28, 0x00, 0xdd, 0x06, 0x00, 0x61, 0x4a, 0x07, + 0x18, 0x89, 0x31, 0xff, 0x31, 0xff, 0x31, 0x02, + 0x84, 0xc8, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x08, + 0x20, 0x00, 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7e, 0xa8, + 0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x21, 0x9f, + 0x4a, 0x0b, 0x70, 0x11, 0x21, 0x84, 0x70, 0x51, + 0x21, 0x41, 0x70, 0x91, 0x49, 0x09, 0x68, 0x09, + 0x0a, 0x0b, 0x70, 0xd3, 0x71, 0x11, 0x49, 0x08, + 0x68, 0x09, 0x0c, 0x0b, 0x71, 0x53, 0x0a, 0x0b, + 0x71, 0x93, 0x71, 0xd1, 0x21, 0x08, 0xf0, 0x00, + 0xff, 0xbb, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x1a, 0xd8, + 0x2e, 0x08, 0x1a, 0xd4, 0xb5, 0x80, 0x04, 0x00, + 0x0c, 0x00, 0x21, 0x9f, 0x4a, 0x07, 0x70, 0x11, + 0x21, 0x80, 0x70, 0x51, 0x21, 0x30, 0x70, 0x91, + 0x27, 0x00, 0x70, 0xd7, 0x21, 0x04, 0xf0, 0x00, + 0xff, 0xa3, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, + 0xb5, 0x90, 0x04, 0x07, 0x0c, 0x3f, 0xb0, 0x81, + 0x1c, 0xc8, 0x46, 0x69, 0xf0, 0x00, 0xfb, 0xb8, + 0x00, 0xf8, 0x49, 0x19, 0x18, 0x40, 0x88, 0xc2, + 0x20, 0x00, 0x49, 0x18, 0x00, 0xc3, 0x1a, 0x1b, + 0x00, 0x9b, 0x18, 0x5b, 0x78, 0xdb, 0x42, 0x93, + 0xd1, 0x07, 0x00, 0xc2, 0x1a, 0x12, 0x00, 0x92, + 0x5a, 0x89, 0x31, 0x01, 0x4a, 0x12, 0x70, 0x91, + 0xe0, 0x04, 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, + 0x28, 0x08, 0xdb, 0xeb, 0x01, 0x00, 0x49, 0x0f, + 0x18, 0x47, 0x68, 0xb8, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xff, 0xfe, 0x3e, 0x24, 0x00, 0x81, 0xbc, + 0xa8, 0x00, 0x88, 0x00, 0xf7, 0xff, 0xfe, 0x12, + 0x60, 0xb8, 0x28, 0x00, 0xd0, 0x03, 0xa8, 0x00, + 0x88, 0x00, 0x08, 0x40, 0x81, 0xb8, 0x1c, 0x20, + 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x7a, 0x60, 0x2e, 0x08, 0x56, 0xe0, + 0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x7e, 0x88, + 0xb5, 0x80, 0x04, 0x07, 0x0c, 0x3f, 0x04, 0x08, + 0x0c, 0x00, 0xf0, 0x02, 0xfc, 0xe9, 0x28, 0x00, + 0xd0, 0x0c, 0x68, 0x82, 0x2a, 0x00, 0xd0, 0x09, + 0x89, 0x81, 0x29, 0x00, 0xd0, 0x06, 0x1c, 0x38, + 0xf0, 0x00, 0xff, 0x46, 0x20, 0x01, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x47, 0x70, + 0xb5, 0x90, 0x04, 0x04, 0x0c, 0x24, 0xb0, 0x81, + 0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, + 0xfb, 0x57, 0x18, 0x3f, 0x78, 0xf8, 0x28, 0x00, + 0xd0, 0x0d, 0x28, 0x01, 0xd1, 0x16, 0x1c, 0x20, + 0xf0, 0x00, 0xfc, 0x16, 0x79, 0x38, 0x23, 0x7d, + 0x00, 0xdb, 0x43, 0x58, 0x22, 0x01, 0x1c, 0x21, + 0xf0, 0x00, 0xff, 0xb1, 0xe0, 0x08, 0x1c, 0x20, + 0xf0, 0x00, 0xfc, 0x0a, 0x21, 0x09, 0x48, 0x06, + 0x70, 0x01, 0x21, 0x20, 0xf7, 0xff, 0xfc, 0xec, + 0x20, 0x00, 0xe0, 0x01, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x72, 0x60, 0xb5, 0x90, 0x04, 0x04, + 0x0c, 0x24, 0xb0, 0x81, 0x1c, 0xc8, 0x1c, 0x0f, + 0x46, 0x69, 0xf0, 0x00, 0xfb, 0x29, 0x1c, 0x02, + 0x18, 0x38, 0x78, 0xc0, 0x28, 0x01, 0xd1, 0x04, + 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x00, 0xf8, 0x0a, + 0xe0, 0x03, 0x21, 0xf0, 0x1c, 0x20, 0xf0, 0x00, + 0xf8, 0x31, 0x20, 0x00, 0xb0, 0x01, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x04, 0x12, 0x14, 0x12, 0x18, 0x89, + 0x79, 0x0a, 0x2a, 0x00, 0xdd, 0x13, 0x2a, 0x03, + 0xdc, 0x11, 0x49, 0x0c, 0x70, 0x0a, 0x23, 0x9f, + 0x4a, 0x0b, 0x70, 0x13, 0x23, 0x88, 0x70, 0x53, + 0x23, 0x02, 0x70, 0x93, 0x70, 0xd3, 0x23, 0x01, + 0x71, 0x13, 0x78, 0x09, 0x71, 0x51, 0x21, 0x06, + 0xf0, 0x00, 0xfe, 0xd6, 0xe0, 0x02, 0x21, 0xf1, + 0xf0, 0x00, 0xf8, 0x0c, 0x20, 0x00, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x70, + 0x2e, 0x08, 0x72, 0x60, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0xb5, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x23, 0x9f, 0x4a, 0x07, 0x70, 0x13, + 0x23, 0x88, 0x70, 0x53, 0x23, 0x02, 0x70, 0x93, + 0x23, 0x01, 0x70, 0xd3, 0x71, 0x11, 0x21, 0x05, + 0xf0, 0x00, 0xfe, 0xb6, 0x20, 0x00, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, + 0xb5, 0xf3, 0xb0, 0x82, 0x4d, 0x1f, 0x78, 0x28, + 0x28, 0x0f, 0xd1, 0x2a, 0x99, 0x03, 0x1c, 0xc8, + 0xa9, 0x01, 0xf0, 0x00, 0xfa, 0xc9, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x00, 0x1d, 0xec, 0x34, 0xf9, + 0x88, 0xe1, 0xa8, 0x01, 0x88, 0x00, 0x18, 0x08, + 0x04, 0x06, 0x0c, 0x36, 0x68, 0xa0, 0x1c, 0x32, + 0xf7, 0xff, 0xfd, 0x41, 0x1c, 0x07, 0xd1, 0x01, + 0x43, 0xf8, 0xe0, 0x1d, 0x98, 0x00, 0x99, 0x03, + 0x18, 0x08, 0x1c, 0xc1, 0x88, 0xe0, 0x19, 0xc0, + 0xaa, 0x01, 0x88, 0x12, 0xf0, 0x12, 0xfc, 0x4e, + 0x1f, 0xb0, 0x04, 0x00, 0x0c, 0x00, 0x12, 0x01, + 0x71, 0x39, 0x71, 0x78, 0x1c, 0x38, 0xf7, 0xff, + 0xfd, 0x4b, 0x21, 0x04, 0x48, 0x08, 0x70, 0x01, + 0x27, 0x00, 0x70, 0x47, 0x70, 0x87, 0x21, 0x03, + 0xf7, 0xff, 0xfc, 0x4a, 0x70, 0x2f, 0x1c, 0x38, + 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x7c, + 0x2e, 0x08, 0x72, 0x60, 0xb5, 0xf0, 0xb0, 0x81, + 0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, + 0xfa, 0x87, 0x04, 0x05, 0x0c, 0x2d, 0x4e, 0x23, + 0x78, 0x30, 0x1d, 0xf4, 0x34, 0xf9, 0x28, 0x0f, + 0xd0, 0x23, 0xa8, 0x00, 0x88, 0x00, 0x30, 0x06, + 0xf7, 0xff, 0xfc, 0xfc, 0x60, 0xa0, 0x1c, 0x02, + 0xd0, 0x18, 0x19, 0x78, 0x1c, 0xc1, 0x1d, 0x90, + 0xaa, 0x00, 0x88, 0x12, 0xf0, 0x12, 0xfc, 0x12, + 0x20, 0x9f, 0x68, 0xa1, 0x70, 0x08, 0x20, 0x88, + 0x68, 0xa1, 0x70, 0x48, 0x20, 0x03, 0x68, 0xa1, + 0x70, 0x88, 0x20, 0x82, 0x68, 0xa1, 0x70, 0xc8, + 0x20, 0x0f, 0x70, 0x30, 0xa8, 0x00, 0x88, 0x00, + 0x30, 0x06, 0xe0, 0x18, 0x20, 0x00, 0x43, 0xc0, + 0xe0, 0x17, 0x88, 0xe1, 0xa8, 0x00, 0x88, 0x00, + 0x18, 0x0a, 0x68, 0xa0, 0xf7, 0xff, 0xfc, 0xdb, + 0x60, 0xa0, 0x28, 0x00, 0xd0, 0xf2, 0x88, 0xe1, + 0x18, 0x40, 0x19, 0x79, 0xaa, 0x00, 0x88, 0x12, + 0x31, 0x03, 0xf0, 0x12, 0xfb, 0xeb, 0x88, 0xe0, + 0xa9, 0x00, 0x88, 0x09, 0x18, 0x40, 0x80, 0xe0, + 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x7c, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0xb5, 0xf0, 0x1c, 0x0f, 0x04, 0x01, 0x0c, 0x09, + 0xb0, 0x81, 0x91, 0x00, 0xb0, 0x81, 0x46, 0x69, + 0x1c, 0xf8, 0xf0, 0x00, 0xfa, 0x2d, 0x1c, 0x02, + 0x18, 0x38, 0x78, 0xc1, 0x07, 0xc9, 0x0f, 0xc9, + 0x79, 0x04, 0x23, 0x05, 0x48, 0x16, 0x70, 0x03, + 0x70, 0x41, 0x70, 0x84, 0x21, 0x00, 0xab, 0x00, + 0x88, 0x1b, 0x3b, 0x02, 0x2b, 0x00, 0xdd, 0x09, + 0x18, 0x55, 0x19, 0xed, 0x79, 0x6d, 0x18, 0x46, + 0x70, 0xf5, 0x31, 0x01, 0x04, 0x09, 0x14, 0x09, + 0x42, 0x8b, 0xdc, 0xf5, 0x27, 0x00, 0xa9, 0x00, + 0x88, 0x09, 0x18, 0x41, 0x70, 0x4f, 0xa9, 0x00, + 0x88, 0x09, 0x31, 0x02, 0xf7, 0xff, 0xfb, 0xb8, + 0x23, 0x05, 0x48, 0x08, 0x70, 0x03, 0x21, 0x01, + 0x70, 0x41, 0x30, 0xff, 0x30, 0x01, 0x99, 0x01, + 0x80, 0x41, 0x80, 0x84, 0x80, 0xc7, 0x1c, 0x38, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x7d, 0x7c, + 0xb5, 0xb0, 0x21, 0x9f, 0x4f, 0x1e, 0x70, 0x39, + 0x21, 0x88, 0x70, 0x79, 0x21, 0x08, 0x70, 0xb9, + 0x1d, 0xc2, 0x32, 0xf9, 0x88, 0xd1, 0x18, 0x09, + 0x78, 0x4b, 0x21, 0x01, 0x24, 0x00, 0x2b, 0x0b, + 0xd1, 0x05, 0x70, 0xf9, 0x71, 0x3c, 0x88, 0x50, + 0x21, 0x05, 0x1c, 0x3a, 0xe0, 0x17, 0x23, 0x81, + 0x70, 0xfb, 0x88, 0xd3, 0x33, 0x01, 0x71, 0x3b, + 0x71, 0x79, 0x21, 0x00, 0x88, 0xd3, 0x2b, 0x00, + 0xdd, 0x09, 0x18, 0x43, 0x78, 0x9b, 0x18, 0x7d, + 0x71, 0xab, 0x31, 0x01, 0x04, 0x09, 0x14, 0x09, + 0x88, 0xd3, 0x42, 0x8b, 0xdc, 0xf5, 0x88, 0xd0, + 0x1d, 0x81, 0x88, 0x50, 0x1c, 0x3a, 0xf0, 0x00, + 0xfd, 0x9f, 0x22, 0x20, 0x21, 0x00, 0x1c, 0x38, + 0xf0, 0x12, 0xfc, 0x58, 0x20, 0x06, 0x70, 0x38, + 0x21, 0x20, 0x1c, 0x38, 0xf7, 0xff, 0xfb, 0x68, + 0x1c, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x72, 0x60, 0xb5, 0xf0, 0x1c, 0x0f, + 0x04, 0x01, 0x0c, 0x09, 0xb0, 0x83, 0x91, 0x00, + 0xb0, 0x84, 0x49, 0x2f, 0x91, 0x06, 0x78, 0x08, + 0x4e, 0x2e, 0x1c, 0xf1, 0x91, 0x05, 0x4d, 0x2e, + 0x28, 0x08, 0xd1, 0x34, 0x1c, 0xf8, 0xa9, 0x02, + 0xf0, 0x00, 0xf9, 0x9e, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x01, 0x88, 0xe9, 0xa8, 0x02, 0x88, 0x00, + 0x18, 0x08, 0x04, 0x02, 0x0c, 0x12, 0x92, 0x00, + 0x68, 0xa8, 0xf7, 0xff, 0xfc, 0x18, 0x1c, 0x04, + 0xd1, 0x02, 0x20, 0x00, 0x43, 0xc0, 0xe0, 0x3a, + 0x98, 0x01, 0x18, 0x38, 0x1c, 0xc1, 0x88, 0xe8, + 0x19, 0x00, 0xaa, 0x02, 0x88, 0x12, 0xf0, 0x12, + 0xfb, 0x25, 0x9a, 0x00, 0x1f, 0x90, 0x04, 0x00, + 0x0c, 0x00, 0x12, 0x01, 0x71, 0x21, 0x71, 0x60, + 0x98, 0x05, 0x1c, 0x21, 0xaa, 0x03, 0xf0, 0x00, + 0xf9, 0xcd, 0x1c, 0x07, 0xd5, 0x03, 0x1c, 0x20, + 0xf7, 0xff, 0xfc, 0x1a, 0xe7, 0xe1, 0x1c, 0x20, + 0xf7, 0xff, 0xfc, 0x16, 0xe0, 0x06, 0x98, 0x05, + 0x1c, 0x39, 0xaa, 0x03, 0xf0, 0x00, 0xf9, 0xbe, + 0x1c, 0x07, 0xd4, 0xd6, 0x24, 0x02, 0x70, 0x34, + 0x12, 0x38, 0x70, 0x70, 0x70, 0xb7, 0xa8, 0x03, + 0x88, 0x00, 0x1c, 0xc1, 0x1c, 0x30, 0xf7, 0xff, + 0xfb, 0x0b, 0x99, 0x06, 0x70, 0x0c, 0x20, 0x01, + 0x99, 0x06, 0x70, 0x48, 0x99, 0x04, 0x80, 0x69, + 0x80, 0xa8, 0x21, 0x00, 0x80, 0xe9, 0xb0, 0x07, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x7d, 0x7c, 0x2e, 0x08, 0x72, 0x60, + 0x2e, 0x08, 0x7e, 0x7c, 0xb5, 0xf0, 0xb0, 0x81, + 0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, + 0xf9, 0x3f, 0x04, 0x05, 0x0c, 0x2d, 0x4e, 0x23, + 0x78, 0x30, 0x1d, 0xf4, 0x34, 0xf9, 0x28, 0x08, + 0xd0, 0x23, 0xa8, 0x00, 0x88, 0x00, 0x30, 0x06, + 0xf7, 0xff, 0xfb, 0xb4, 0x60, 0xa0, 0x1c, 0x02, + 0xd0, 0x18, 0x19, 0x78, 0x1c, 0xc1, 0x1d, 0x90, + 0xaa, 0x00, 0x88, 0x12, 0xf0, 0x12, 0xfa, 0xca, + 0x20, 0x9f, 0x68, 0xa1, 0x70, 0x08, 0x20, 0x88, + 0x68, 0xa1, 0x70, 0x48, 0x20, 0x09, 0x68, 0xa1, + 0x70, 0x88, 0x20, 0x82, 0x68, 0xa1, 0x70, 0xc8, + 0x20, 0x08, 0x70, 0x30, 0xa8, 0x00, 0x88, 0x00, + 0x30, 0x06, 0xe0, 0x18, 0x20, 0x00, 0x43, 0xc0, + 0xe0, 0x17, 0x88, 0xe1, 0xa8, 0x00, 0x88, 0x00, + 0x18, 0x0a, 0x68, 0xa0, 0xf7, 0xff, 0xfb, 0x93, + 0x60, 0xa0, 0x28, 0x00, 0xd0, 0xf2, 0x88, 0xe1, + 0x18, 0x40, 0x19, 0x79, 0xaa, 0x00, 0x88, 0x12, + 0x31, 0x03, 0xf0, 0x12, 0xfa, 0xa3, 0x88, 0xe0, + 0xa9, 0x00, 0x88, 0x09, 0x18, 0x40, 0x80, 0xe0, + 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x7c, + 0xb5, 0x80, 0x04, 0x00, 0x0c, 0x00, 0x22, 0x9f, + 0x4f, 0x0d, 0x70, 0x3a, 0x22, 0x88, 0x70, 0x7a, + 0x22, 0x0b, 0x70, 0xba, 0x22, 0x01, 0x70, 0xfa, + 0x71, 0x39, 0x21, 0x05, 0x1c, 0x3a, 0xf0, 0x00, + 0xfc, 0xbf, 0x22, 0x20, 0x21, 0x00, 0x1c, 0x38, + 0xf0, 0x12, 0xfb, 0x78, 0x20, 0x06, 0x70, 0x38, + 0x21, 0x20, 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x88, + 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x72, 0x60, 0xb5, 0xf0, 0x1c, 0x0f, + 0x04, 0x01, 0x0c, 0x09, 0xb0, 0x83, 0x91, 0x00, + 0xb0, 0x84, 0x49, 0x2f, 0x91, 0x06, 0x78, 0x08, + 0x4e, 0x2e, 0x1c, 0xf1, 0x91, 0x05, 0x4d, 0x2e, + 0x28, 0x07, 0xd1, 0x34, 0x1c, 0xf8, 0xa9, 0x02, + 0xf0, 0x00, 0xf8, 0xbe, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x01, 0x88, 0xe9, 0xa8, 0x02, 0x88, 0x00, + 0x18, 0x08, 0x04, 0x02, 0x0c, 0x12, 0x92, 0x00, + 0x68, 0xa8, 0xf7, 0xff, 0xfb, 0x38, 0x1c, 0x04, + 0xd1, 0x02, 0x20, 0x00, 0x43, 0xc0, 0xe0, 0x3a, + 0x98, 0x01, 0x18, 0x38, 0x1c, 0xc1, 0x88, 0xe8, + 0x19, 0x00, 0xaa, 0x02, 0x88, 0x12, 0xf0, 0x12, + 0xfa, 0x45, 0x9a, 0x00, 0x1f, 0x90, 0x04, 0x00, + 0x0c, 0x00, 0x12, 0x01, 0x71, 0x21, 0x71, 0x60, + 0x98, 0x05, 0x1c, 0x21, 0xaa, 0x03, 0xf0, 0x00, + 0xf8, 0xed, 0x1c, 0x07, 0xd5, 0x03, 0x1c, 0x20, + 0xf7, 0xff, 0xfb, 0x3a, 0xe7, 0xe1, 0x1c, 0x20, + 0xf7, 0xff, 0xfb, 0x36, 0xe0, 0x06, 0x98, 0x05, + 0x1c, 0x39, 0xaa, 0x03, 0xf0, 0x00, 0xf8, 0xde, + 0x1c, 0x07, 0xd4, 0xd6, 0x24, 0x03, 0x70, 0x34, + 0x12, 0x38, 0x70, 0x70, 0x70, 0xb7, 0xa8, 0x03, + 0x88, 0x00, 0x19, 0x01, 0x1c, 0x30, 0xf7, 0xff, + 0xfa, 0x2b, 0x99, 0x06, 0x70, 0x0c, 0x20, 0x01, + 0x99, 0x06, 0x70, 0x48, 0x99, 0x04, 0x80, 0x69, + 0x80, 0xa8, 0x21, 0x00, 0x80, 0xe9, 0xb0, 0x07, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x7d, 0x7c, 0x2e, 0x08, 0x72, 0x60, + 0x2e, 0x08, 0x7e, 0x7c, 0xb5, 0xf0, 0xb0, 0x81, + 0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, + 0xf8, 0x5f, 0x04, 0x05, 0x0c, 0x2d, 0x4e, 0x23, + 0x78, 0x30, 0x1d, 0xf4, 0x34, 0xf9, 0x28, 0x07, + 0xd0, 0x23, 0xa8, 0x00, 0x88, 0x00, 0x30, 0x06, + 0xf7, 0xff, 0xfa, 0xd4, 0x60, 0xa0, 0x1c, 0x02, + 0xd0, 0x18, 0x19, 0x78, 0x1c, 0xc1, 0x1d, 0x90, + 0xaa, 0x00, 0x88, 0x12, 0xf0, 0x12, 0xf9, 0xea, + 0x20, 0x9f, 0x68, 0xa1, 0x70, 0x08, 0x20, 0x88, + 0x68, 0xa1, 0x70, 0x48, 0x20, 0x0c, 0x68, 0xa1, + 0x70, 0x88, 0x20, 0x82, 0x68, 0xa1, 0x70, 0xc8, + 0x20, 0x07, 0x70, 0x30, 0xa8, 0x00, 0x88, 0x00, + 0x30, 0x06, 0xe0, 0x18, 0x20, 0x00, 0x43, 0xc0, + 0xe0, 0x17, 0x88, 0xe1, 0xa8, 0x00, 0x88, 0x00, + 0x18, 0x0a, 0x68, 0xa0, 0xf7, 0xff, 0xfa, 0xb3, + 0x60, 0xa0, 0x28, 0x00, 0xd0, 0xf2, 0x88, 0xe1, + 0x18, 0x40, 0x19, 0x79, 0xaa, 0x00, 0x88, 0x12, + 0x31, 0x03, 0xf0, 0x12, 0xf9, 0xc3, 0x88, 0xe0, + 0xa9, 0x00, 0x88, 0x09, 0x18, 0x40, 0x80, 0xe0, + 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x7c, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0xb4, 0xb0, 0x24, 0x01, 0x22, 0x00, 0x78, 0x07, + 0x0a, 0x3b, 0xd3, 0x15, 0x23, 0x00, 0x06, 0x7c, + 0x0e, 0x64, 0x2c, 0x00, 0xdd, 0x0a, 0x02, 0x12, + 0x04, 0x12, 0x0c, 0x12, 0x18, 0xc5, 0x78, 0x6d, + 0x43, 0x2a, 0x04, 0x12, 0x0c, 0x12, 0x33, 0x01, + 0x42, 0x9c, 0xdc, 0xf4, 0x1c, 0x78, 0x06, 0x40, + 0x0e, 0x40, 0x04, 0x04, 0x14, 0x24, 0xe0, 0x01, + 0x06, 0x7a, 0x0e, 0x52, 0x80, 0x0a, 0x1c, 0x20, + 0xbc, 0xb0, 0x47, 0x70, 0xb5, 0xf0, 0x04, 0x16, + 0x0c, 0x36, 0x1c, 0x07, 0x78, 0x00, 0x04, 0x00, + 0x1c, 0x0c, 0x78, 0x79, 0x02, 0x09, 0x43, 0x08, + 0x78, 0xb9, 0x43, 0x08, 0xb0, 0x81, 0x4b, 0x12, + 0x42, 0x98, 0xd1, 0x09, 0x46, 0x69, 0x1c, 0xf8, + 0xf7, 0xff, 0xff, 0xca, 0x1c, 0x05, 0xa8, 0x00, + 0x88, 0x00, 0x30, 0x02, 0x42, 0xb0, 0xdd, 0x02, + 0x20, 0x00, 0x43, 0xc0, 0xe0, 0x10, 0x19, 0x78, + 0xaa, 0x00, 0x88, 0x12, 0x1c, 0xc1, 0x1c, 0x20, + 0xf0, 0x12, 0xf9, 0x5c, 0xa8, 0x00, 0x88, 0x00, + 0x18, 0x28, 0x30, 0x03, 0x04, 0x00, 0x14, 0x00, + 0x21, 0x00, 0xaa, 0x00, 0x88, 0x12, 0x54, 0xa1, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x9f, 0x88, 0x03, 0xb5, 0xf7, 0x1c, 0x07, + 0x20, 0x00, 0xb0, 0x85, 0x90, 0x02, 0x26, 0x00, + 0x99, 0x06, 0x1c, 0xc8, 0xa9, 0x04, 0xf7, 0xff, + 0xff, 0x9f, 0xa9, 0x04, 0x88, 0x09, 0x1c, 0x04, + 0x43, 0xf0, 0x02, 0xc3, 0x42, 0xd9, 0xd2, 0x58, + 0x21, 0x00, 0x91, 0x03, 0x4d, 0x2d, 0x99, 0x06, + 0x19, 0x08, 0x22, 0x01, 0x02, 0xd2, 0x30, 0x04, + 0x1c, 0x29, 0xf7, 0xff, 0xff, 0xaf, 0x90, 0x01, + 0x23, 0x01, 0x42, 0xd8, 0xd0, 0x1c, 0x1c, 0x28, + 0xf0, 0x12, 0xf9, 0x98, 0x90, 0x00, 0x1c, 0x42, + 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x12, 0xf9, 0x22, + 0x98, 0x00, 0x18, 0x38, 0x1c, 0x47, 0x98, 0x00, + 0x18, 0x30, 0x1c, 0x46, 0x98, 0x01, 0x18, 0x24, + 0x98, 0x03, 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x03, 0x28, 0x03, 0xdb, 0xdb, 0xa8, 0x04, + 0x88, 0x00, 0x42, 0x84, 0xda, 0x27, 0xe0, 0x02, + 0x20, 0x00, 0x43, 0xc0, 0xe0, 0x29, 0x99, 0x06, + 0x19, 0x08, 0x22, 0x01, 0x02, 0xd2, 0x30, 0x04, + 0x1c, 0x29, 0xf7, 0xff, 0xff, 0x83, 0x90, 0x01, + 0x23, 0x01, 0x42, 0xd8, 0xd0, 0xf0, 0x1c, 0x28, + 0xf0, 0x12, 0xf9, 0x6c, 0x90, 0x00, 0x1c, 0x42, + 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x12, 0xf8, 0xf6, + 0x98, 0x00, 0x18, 0x38, 0x1c, 0x47, 0x98, 0x00, + 0x18, 0x30, 0x1c, 0x46, 0x98, 0x01, 0x18, 0x24, + 0x98, 0x02, 0x30, 0x01, 0x90, 0x02, 0xa8, 0x04, + 0x88, 0x00, 0x42, 0x84, 0xdb, 0xdb, 0x9a, 0x07, + 0x80, 0x16, 0x98, 0x02, 0x30, 0x03, 0x04, 0x00, + 0x14, 0x00, 0xb0, 0x05, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x6a, 0x60, + 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0x54, + 0xb0, 0x84, 0xab, 0x00, 0x70, 0x18, 0x22, 0x46, + 0x70, 0x5a, 0x22, 0x04, 0x80, 0x5a, 0x80, 0x99, + 0x46, 0x69, 0xf7, 0xff, 0xf8, 0xf5, 0xb0, 0x04, + 0xbc, 0x08, 0x47, 0x18, 0x47, 0x70, 0x00, 0x00, + 0xb5, 0x00, 0x78, 0x01, 0x48, 0x0c, 0x70, 0x01, + 0x78, 0x00, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x02, + 0xd0, 0x01, 0x28, 0x03, 0xd1, 0x0b, 0x48, 0x09, + 0xca, 0x08, 0xc0, 0x08, 0xca, 0x08, 0xc0, 0x08, + 0xca, 0x0c, 0xc0, 0x0c, 0xf0, 0x00, 0xf8, 0x67, + 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0xa8, 0x2e, 0x08, 0x7b, 0x60, + 0xb5, 0x80, 0x20, 0x00, 0x27, 0x00, 0x4a, 0x1f, + 0x01, 0x03, 0x54, 0xd7, 0x18, 0x9b, 0x60, 0x5f, + 0x60, 0x9f, 0x81, 0x9f, 0x30, 0x01, 0x28, 0x02, + 0xdb, 0xf6, 0x48, 0x1b, 0x70, 0x07, 0x49, 0x1b, + 0x48, 0x1b, 0x60, 0x01, 0x49, 0x1b, 0x1d, 0xc2, + 0x32, 0x79, 0x60, 0x91, 0x49, 0x1a, 0x1d, 0xc2, + 0x32, 0xf9, 0x61, 0x11, 0x49, 0x19, 0x23, 0x05, + 0x01, 0xdb, 0x18, 0xc2, 0x23, 0x03, 0x02, 0x1b, + 0x62, 0x91, 0x18, 0xc1, 0x63, 0x0f, 0x49, 0x16, + 0x1d, 0xc2, 0x32, 0xff, 0x32, 0xfa, 0x30, 0xff, + 0x30, 0x81, 0x62, 0x11, 0x61, 0x87, 0x20, 0x05, + 0xf7, 0xff, 0xf9, 0x94, 0x28, 0x00, 0xda, 0x03, + 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0x49, 0x0e, 0x00, 0xc2, 0x52, 0x8f, + 0x30, 0x01, 0x28, 0x40, 0xdb, 0xfa, 0x48, 0x0c, + 0x70, 0x47, 0x20, 0x01, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7e, 0x88, + 0x2e, 0x08, 0x1a, 0xa8, 0x00, 0x01, 0x00, 0x41, + 0x2e, 0x08, 0x7e, 0xa8, 0x00, 0x02, 0x00, 0x41, + 0x00, 0x03, 0x00, 0x41, 0x00, 0x40, 0x00, 0x41, + 0x00, 0x24, 0x00, 0x41, 0x2e, 0x08, 0x7b, 0x70, + 0x2e, 0x08, 0x7d, 0x7c, 0xb5, 0x00, 0xf7, 0xff, + 0xf8, 0x25, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, + 0xb0, 0x83, 0x48, 0xda, 0x90, 0x02, 0x78, 0x00, + 0x21, 0x00, 0x4a, 0xd9, 0x4c, 0xd9, 0x4f, 0xda, + 0x28, 0x01, 0xd1, 0x71, 0x78, 0x78, 0x38, 0x41, + 0x4d, 0xd8, 0x4e, 0xd9, 0x4b, 0xd9, 0x93, 0x01, + 0x28, 0x0b, 0xd2, 0x6a, 0xa3, 0x01, 0x5c, 0x1b, + 0x00, 0x5b, 0x44, 0x9f, 0xc9, 0x8e, 0xc9, 0xde, + 0xdd, 0xc9, 0x67, 0xc9, 0x3b, 0x2b, 0x05, 0x00, + 0x88, 0xb8, 0x06, 0x00, 0x0e, 0x00, 0x01, 0x00, + 0x9b, 0x01, 0x54, 0x19, 0x9b, 0x01, 0x18, 0xc0, + 0x68, 0x40, 0x1c, 0x0c, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xff, 0xf9, 0x26, 0x88, 0xb8, 0x06, 0x00, + 0x0e, 0x00, 0x01, 0x00, 0x9b, 0x01, 0x18, 0xc0, + 0x60, 0x44, 0x68, 0x80, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xff, 0xf9, 0x1a, 0x88, 0xb8, 0x06, 0x00, + 0x0e, 0x00, 0x01, 0x01, 0x9b, 0x01, 0x18, 0xc9, + 0x22, 0x01, 0x60, 0x8c, 0x70, 0x32, 0x70, 0x74, + 0x18, 0x80, 0xe0, 0x09, 0x20, 0x01, 0x88, 0xb9, + 0x06, 0x09, 0x0e, 0x09, 0x01, 0x0a, 0x9b, 0x01, + 0x54, 0x98, 0x70, 0x30, 0x70, 0x70, 0x18, 0x08, + 0x70, 0xb0, 0x21, 0x20, 0x1c, 0x30, 0xf7, 0xff, + 0xf8, 0x07, 0xe0, 0x8d, 0x26, 0x00, 0x00, 0xf1, + 0x19, 0x08, 0x88, 0xc2, 0x79, 0x3b, 0x42, 0x9a, + 0xd1, 0x1e, 0x22, 0x00, 0x80, 0xc2, 0x58, 0x60, + 0xf0, 0x00, 0xfa, 0x86, 0x23, 0x01, 0x42, 0xd8, + 0xd0, 0x16, 0x01, 0x01, 0x18, 0x09, 0x00, 0xc9, + 0x19, 0x49, 0x88, 0x8a, 0x2a, 0x00, 0xd0, 0x01, + 0x3a, 0x01, 0x80, 0x8a, 0x28, 0x04, 0xd1, 0x0b, + 0x00, 0x70, 0x19, 0x40, 0x30, 0xff, 0x30, 0xff, + 0x30, 0x02, 0x90, 0x00, 0x8c, 0xc0, 0xf0, 0x00, + 0xfa, 0xcb, 0x22, 0x00, 0x98, 0x00, 0x84, 0xc2, + 0x36, 0x01, 0x2e, 0x20, 0xdb, 0xd7, 0xe0, 0x63, + 0xe0, 0x9c, 0xe0, 0x74, 0x88, 0xb8, 0x00, 0xc0, + 0x1c, 0x0e, 0x19, 0x01, 0x80, 0xce, 0x58, 0x20, + 0xf0, 0x00, 0xfa, 0x5e, 0x23, 0x01, 0x42, 0xd8, + 0xd0, 0x56, 0x01, 0x01, 0x18, 0x09, 0x00, 0xc9, + 0x19, 0x49, 0x88, 0x8a, 0x2a, 0x00, 0xd0, 0x01, + 0x3a, 0x01, 0x80, 0x8a, 0x28, 0x04, 0xd1, 0x5e, + 0x88, 0xb8, 0x00, 0x40, 0x19, 0x40, 0x30, 0xff, + 0x30, 0xff, 0x30, 0x02, 0x8c, 0xc0, 0xf0, 0x00, + 0xfa, 0xa3, 0x88, 0xb8, 0x00, 0x40, 0x19, 0x40, + 0x30, 0xff, 0x30, 0xff, 0x30, 0x02, 0x84, 0xc6, + 0xe0, 0xb6, 0x7a, 0x38, 0x06, 0x00, 0x7a, 0x79, + 0x04, 0x09, 0x43, 0x08, 0x7a, 0xb9, 0x02, 0x09, + 0x43, 0x08, 0x7a, 0xf9, 0x43, 0x08, 0x4b, 0x8a, + 0x42, 0x98, 0xd0, 0x43, 0xdc, 0x0d, 0x49, 0x89, + 0x42, 0x88, 0xd0, 0x19, 0x42, 0x90, 0xd0, 0x1b, + 0x49, 0x87, 0x42, 0x88, 0xd1, 0x3a, 0x1d, 0xe8, + 0x30, 0xf9, 0x8a, 0x82, 0x32, 0x01, 0x82, 0x82, + 0xe0, 0x28, 0x49, 0x84, 0x42, 0x88, 0xd0, 0x1f, + 0x49, 0x83, 0x42, 0x88, 0xd1, 0x2e, 0x23, 0x05, + 0x01, 0xdb, 0x18, 0xe8, 0x8d, 0x82, 0x2a, 0x00, + 0xd1, 0x13, 0x22, 0x01, 0x85, 0x82, 0xe0, 0x19, + 0x88, 0xa8, 0x30, 0x01, 0x80, 0xa8, 0xe0, 0x15, + 0x1d, 0xe8, 0x30, 0x79, 0x89, 0x81, 0x31, 0x01, + 0x81, 0x81, 0x88, 0xf9, 0x00, 0xc8, 0x50, 0x22, + 0x79, 0x3a, 0x19, 0x00, 0x80, 0xc2, 0xe0, 0x10, + 0xe0, 0x7b, 0x88, 0xf9, 0x22, 0xf3, 0xe0, 0x13, + 0x1d, 0xe8, 0x30, 0xff, 0x30, 0xfa, 0x8c, 0x82, + 0x32, 0x01, 0x84, 0x82, 0x88, 0xfa, 0x00, 0xd0, + 0x50, 0x21, 0x79, 0x39, 0x19, 0x00, 0x80, 0xc1, + 0x1c, 0x11, 0x22, 0x00, 0xe0, 0x04, 0xe0, 0xbd, + 0xe0, 0x1b, 0xe0, 0x05, 0x88, 0xf9, 0x22, 0xf0, + 0x20, 0x00, 0xf0, 0x00, 0xf9, 0xc1, 0xe0, 0x5f, + 0x88, 0xb8, 0x00, 0xc1, 0x58, 0x61, 0x4b, 0x64, + 0x42, 0x99, 0xd0, 0x0b, 0xdc, 0x58, 0x4b, 0x61, + 0x42, 0x99, 0xd0, 0x04, 0x42, 0x91, 0xd1, 0x54, + 0xf7, 0xff, 0xf8, 0xf4, 0xe0, 0xa6, 0xf7, 0xff, + 0xf8, 0x8b, 0xe0, 0xa3, 0xf7, 0xff, 0xf9, 0xc2, + 0xe0, 0xa0, 0x68, 0xb9, 0x98, 0x02, 0x60, 0x41, + 0x88, 0xb8, 0xf0, 0x00, 0xf8, 0xbd, 0x98, 0x02, + 0x68, 0x40, 0xe0, 0x8f, 0x28, 0x03, 0xd1, 0x50, + 0x68, 0x78, 0x88, 0x3b, 0x06, 0x1e, 0x0e, 0x36, + 0x1c, 0x05, 0x2e, 0x06, 0xd0, 0x3f, 0xdc, 0x08, + 0x2e, 0x06, 0xd2, 0x58, 0xa3, 0x01, 0x5d, 0x9b, + 0x00, 0x5b, 0x44, 0x9f, 0x5b, 0x55, 0x3c, 0x12, + 0x61, 0x4d, 0x2e, 0x0a, 0xd0, 0x3e, 0xdc, 0x05, + 0x2e, 0x08, 0xd0, 0x36, 0x2e, 0x09, 0xd1, 0x57, + 0x26, 0x00, 0xe0, 0x56, 0x2e, 0x0b, 0xd0, 0x66, + 0x2e, 0xe0, 0xd1, 0x51, 0x48, 0x49, 0x70, 0x01, + 0xe0, 0x69, 0x49, 0x49, 0x78, 0x4a, 0x2a, 0x01, + 0xd1, 0x4a, 0x78, 0x03, 0x1d, 0xca, 0x32, 0xf9, + 0x88, 0xd7, 0x18, 0x7f, 0x70, 0xbb, 0x88, 0xd3, + 0x33, 0x01, 0x80, 0xd3, 0x88, 0xd3, 0x88, 0x97, + 0x42, 0xbb, 0xd0, 0x02, 0x78, 0x00, 0x28, 0x0b, + 0xd1, 0x3a, 0x78, 0x08, 0x28, 0x02, 0xd0, 0x09, + 0x28, 0x03, 0xd0, 0x07, 0x28, 0x05, 0xd1, 0x33, + 0x1c, 0x08, 0xf7, 0xff, 0xfb, 0x59, 0xe0, 0x4a, + 0xe0, 0x54, 0xe0, 0x53, 0x78, 0x89, 0x88, 0x50, + 0xf7, 0xff, 0xfc, 0x52, 0xe0, 0x43, 0x78, 0xb9, + 0xf0, 0x00, 0xff, 0x52, 0xe0, 0x3f, 0x20, 0x00, + 0xe0, 0x0b, 0x78, 0xb9, 0xf0, 0x00, 0xfa, 0x2a, + 0xe0, 0x39, 0xe0, 0x3e, 0x78, 0x01, 0x02, 0x09, + 0x78, 0x40, 0x43, 0x08, 0x49, 0x2f, 0x81, 0x48, + 0x20, 0x08, 0xf0, 0x00, 0xfe, 0xeb, 0xe0, 0x2e, + 0x78, 0x01, 0x02, 0x09, 0x78, 0x40, 0x43, 0x08, + 0xf0, 0x00, 0xfa, 0x45, 0xe0, 0x27, 0xe0, 0x26, + 0x78, 0xba, 0x1c, 0x01, 0x78, 0x00, 0xf0, 0x00, + 0xfa, 0x13, 0xe0, 0x20, 0x78, 0xba, 0x1c, 0x01, + 0x78, 0x00, 0xf0, 0x00, 0xfa, 0x22, 0xe0, 0x1a, + 0xe0, 0x19, 0x00, 0xf0, 0x58, 0x21, 0x4b, 0x14, + 0x42, 0x99, 0xd1, 0x0d, 0x19, 0x00, 0x88, 0xc0, + 0xf7, 0xfd, 0xfd, 0x9a, 0x68, 0x79, 0x78, 0x09, + 0x30, 0x01, 0x42, 0x88, 0xd1, 0x04, 0x1c, 0x30, + 0xf7, 0xff, 0xf8, 0xd4, 0xe0, 0x07, 0xe0, 0x03, + 0x36, 0x01, 0x2e, 0x20, 0xdb, 0xe9, 0xe0, 0x02, + 0x20, 0xff, 0xf0, 0x00, 0xfa, 0x6b, 0x2d, 0x00, + 0xd0, 0x08, 0x1c, 0x28, 0xf7, 0xfe, 0xff, 0xa4, + 0xe0, 0x04, 0x28, 0x02, 0xd1, 0x02, 0x88, 0x38, + 0xf0, 0x00, 0xf9, 0xac, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0xa8, + 0x00, 0x02, 0x00, 0x41, 0x2e, 0x08, 0x7a, 0x60, + 0x2e, 0x08, 0x7b, 0x60, 0x2e, 0x08, 0x7e, 0xa8, + 0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x7e, 0x88, + 0x00, 0x20, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, + 0x00, 0x03, 0x00, 0x41, 0x00, 0x24, 0x00, 0x41, + 0x00, 0x40, 0x00, 0x41, 0x2e, 0x08, 0x1a, 0x94, + 0x2e, 0x08, 0x7d, 0x7c, 0x2e, 0x08, 0x8f, 0x80, + 0xb5, 0x90, 0x04, 0x04, 0x0c, 0x24, 0x78, 0x08, + 0x04, 0x00, 0x1c, 0x0f, 0x78, 0x49, 0x02, 0x09, + 0x43, 0x08, 0x78, 0xb9, 0x43, 0x08, 0x4b, 0x47, + 0x42, 0x98, 0xd0, 0x5d, 0xdc, 0x20, 0x4b, 0x46, + 0x42, 0x98, 0xd0, 0x5a, 0xdc, 0x0f, 0x4b, 0x45, + 0x42, 0x98, 0xd0, 0x41, 0x33, 0x01, 0x42, 0x98, + 0xd0, 0x37, 0x4b, 0x43, 0x42, 0x98, 0xd1, 0x5f, + 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 0xf8, 0x20, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x4b, 0x3f, + 0x42, 0x98, 0xd0, 0x3e, 0x4b, 0x3e, 0x42, 0x98, + 0xd1, 0x52, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, + 0xf8, 0x87, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x4b, 0x3a, 0x42, 0x98, 0xd0, 0x50, 0xdc, 0x0f, + 0x4b, 0x39, 0x42, 0x98, 0xd0, 0x3d, 0x33, 0x06, + 0x42, 0x98, 0xd0, 0x42, 0x4b, 0x37, 0x42, 0x98, + 0xd1, 0x3e, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, + 0xfa, 0xe1, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x4b, 0x33, 0x42, 0x98, 0xd0, 0x16, 0x33, 0x01, + 0x42, 0x98, 0xd1, 0x31, 0x1c, 0x20, 0x1c, 0x39, + 0xf7, 0xff, 0xfc, 0x20, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xfe, + 0xff, 0x85, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x20, 0xf7, 0xfe, 0xff, 0x9d, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x20, 0x1c, 0x39, + 0xf7, 0xff, 0xfb, 0xa0, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, + 0xf9, 0x09, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xe0, 0x00, 0xe0, 0x1c, 0x1c, 0x20, 0x1c, 0x39, + 0xf7, 0xff, 0xf9, 0x02, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, + 0xf9, 0x29, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xe0, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, + 0xfa, 0x1b, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 0xfb, 0x06, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x11, + 0x89, 0x40, 0xf0, 0x00, 0xf9, 0x60, 0x1c, 0x20, + 0x1c, 0x39, 0xf7, 0xff, 0xf8, 0x81, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x9f, 0x88, 0x00, + 0x00, 0x9f, 0x80, 0x31, 0x00, 0x9f, 0x80, 0x10, + 0x00, 0x9f, 0x80, 0x21, 0x00, 0x9f, 0x80, 0x33, + 0x00, 0x9f, 0x84, 0x40, 0x00, 0x9f, 0x88, 0x0a, + 0x00, 0x9f, 0x88, 0x01, 0x00, 0x9f, 0x88, 0x09, + 0x00, 0x9f, 0x88, 0x0c, 0x2e, 0x08, 0x8f, 0x80, + 0xb5, 0xf0, 0x04, 0x06, 0x0c, 0x36, 0x04, 0x0d, + 0x0c, 0x2d, 0x1c, 0x28, 0x1c, 0x17, 0xf7, 0xfe, + 0xfe, 0x9d, 0x4c, 0x0d, 0x60, 0xa0, 0x28, 0x00, + 0xd1, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x54, 0x70, 0x21, 0x21, 0x45, 0x70, 0x61, + 0x21, 0x0c, 0x80, 0x61, 0x80, 0xa6, 0x81, 0xa5, + 0x1c, 0x39, 0x1c, 0x2a, 0xf0, 0x11, 0xfd, 0xaa, + 0x78, 0x20, 0x1c, 0x21, 0xf7, 0xfe, 0xfd, 0xd0, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x7b, 0x60, 0xb5, 0x00, 0x06, 0x02, + 0x0e, 0x12, 0x20, 0x54, 0x49, 0x05, 0x70, 0x08, + 0x23, 0x48, 0x70, 0x4b, 0x23, 0x04, 0x80, 0x4b, + 0x71, 0x0a, 0xf7, 0xfe, 0xfd, 0xbd, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7b, 0x60, + 0xb5, 0x90, 0x04, 0x0b, 0x0c, 0x1b, 0x27, 0x54, + 0x49, 0x07, 0x70, 0x0f, 0x24, 0x43, 0x70, 0x4c, + 0x24, 0x04, 0x80, 0x4c, 0x71, 0xc8, 0x80, 0x8b, + 0x71, 0x8a, 0x1c, 0x38, 0xf7, 0xfe, 0xfd, 0xa8, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x7b, 0x60, 0xb5, 0x00, 0x04, 0x02, + 0x0c, 0x12, 0x20, 0x54, 0x49, 0x05, 0x70, 0x08, + 0x23, 0x46, 0x70, 0x4b, 0x23, 0x04, 0x80, 0x4b, + 0x80, 0x8a, 0xf7, 0xfe, 0xfd, 0x95, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7b, 0x60, + 0x23, 0xff, 0x04, 0x1b, 0x40, 0x18, 0x23, 0x01, + 0x05, 0x5b, 0x42, 0x98, 0xd0, 0x1e, 0xdc, 0x0b, + 0x09, 0x5b, 0x42, 0x98, 0xd0, 0x16, 0x00, 0x5b, + 0x42, 0x98, 0xd0, 0x15, 0x23, 0x03, 0x04, 0x1b, + 0x42, 0x98, 0xd1, 0x19, 0x20, 0x02, 0x47, 0x70, + 0x23, 0x09, 0x04, 0x9b, 0x42, 0x98, 0xd0, 0x0f, + 0x23, 0x01, 0x05, 0x9b, 0x42, 0x98, 0xd0, 0x0d, + 0x23, 0x03, 0x05, 0x5b, 0x42, 0x98, 0xd1, 0x0b, + 0x20, 0x06, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x01, 0x47, 0x70, 0x20, 0x03, 0x47, 0x70, + 0x20, 0x04, 0x47, 0x70, 0x20, 0x05, 0x47, 0x70, + 0x20, 0x00, 0x43, 0xc0, 0x47, 0x70, 0xb5, 0xb0, + 0x04, 0x07, 0x0c, 0x3f, 0x04, 0x0b, 0x0c, 0x1b, + 0x04, 0x14, 0x0c, 0x24, 0x22, 0x00, 0x20, 0x00, + 0x49, 0x10, 0x00, 0xc5, 0x5b, 0x4d, 0x2d, 0x00, + 0xd1, 0x08, 0x1c, 0x42, 0x04, 0x12, 0x0c, 0x12, + 0x00, 0xc0, 0x52, 0x0a, 0x18, 0x40, 0x80, 0x84, + 0x80, 0x43, 0xe0, 0x02, 0x30, 0x01, 0x28, 0x40, + 0xdd, 0xef, 0x2a, 0x00, 0xd0, 0x0a, 0x20, 0x05, + 0x04, 0x00, 0x43, 0x10, 0x1c, 0x39, 0xf7, 0xfe, + 0xfd, 0xa9, 0x04, 0x00, 0x0c, 0x00, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x7b, 0x70, + 0xb5, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, + 0x49, 0x0b, 0x00, 0xc3, 0x5a, 0xcb, 0x42, 0x93, + 0xd1, 0x09, 0x27, 0x00, 0x00, 0xc0, 0x52, 0x0f, + 0x1c, 0x10, 0xf7, 0xfe, 0xfd, 0xc7, 0x1c, 0x38, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x30, 0x01, + 0x28, 0x40, 0xdb, 0xee, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x7b, 0x70, 0xb5, 0xf0, 0x04, 0x06, + 0x0c, 0x36, 0x27, 0x00, 0x4c, 0x17, 0x00, 0xf8, + 0x5a, 0x20, 0x42, 0xb0, 0xd1, 0x1d, 0x00, 0xfd, + 0x19, 0x28, 0x88, 0x81, 0x29, 0x05, 0xd2, 0x10, + 0xa3, 0x01, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, + 0x17, 0x02, 0x09, 0x10, 0x17, 0x00, 0x21, 0x09, + 0x48, 0x0f, 0x70, 0x01, 0x21, 0x20, 0xf7, 0xfe, + 0xfc, 0xdf, 0xe0, 0x02, 0x88, 0x40, 0xf0, 0x01, + 0xfc, 0xf9, 0x5b, 0x60, 0xf7, 0xff, 0xff, 0xc0, + 0xe0, 0x06, 0x88, 0x40, 0xf7, 0xfe, 0xff, 0x2c, + 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x40, 0xdb, 0xda, + 0x2f, 0x40, 0xd1, 0x02, 0x1c, 0x30, 0xf7, 0xfe, + 0xfd, 0x89, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7b, 0x70, + 0x2e, 0x08, 0x72, 0x60, 0x20, 0x00, 0x47, 0x70, + 0xb5, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x05, + 0xd0, 0x0c, 0x28, 0x0a, 0xd0, 0x05, 0x28, 0x0b, + 0xd1, 0x08, 0x78, 0x48, 0x22, 0x10, 0x21, 0x0b, + 0xe0, 0x02, 0x78, 0x48, 0x22, 0x10, 0x21, 0x0a, + 0xf0, 0x01, 0xfc, 0x90, 0x20, 0x00, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x00, 0x06, 0x00, 0x0e, 0x00, + 0x28, 0x05, 0xd0, 0x06, 0x28, 0x0a, 0xd0, 0x07, + 0x28, 0x0b, 0xd1, 0x02, 0x78, 0x88, 0xf0, 0x01, + 0xfb, 0xaf, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, + 0x78, 0x48, 0x28, 0x01, 0xd0, 0xf9, 0x78, 0x88, + 0xf0, 0x01, 0xfb, 0xa4, 0xe7, 0xf5, 0xb5, 0xf0, + 0x4d, 0x22, 0x81, 0x68, 0x27, 0x00, 0x06, 0x38, + 0x0e, 0x00, 0xf0, 0x01, 0xfb, 0xc5, 0x28, 0x4e, + 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x01, 0xfb, 0x6c, + 0x1c, 0x78, 0x04, 0x07, 0x14, 0x3f, 0x2f, 0x14, + 0xdb, 0xf1, 0x89, 0x68, 0xf0, 0x01, 0xfc, 0xda, + 0x89, 0x68, 0xf0, 0x01, 0xfc, 0x41, 0x21, 0x0e, + 0x4f, 0x17, 0x28, 0x00, 0xd1, 0x02, 0x70, 0x39, + 0x20, 0x04, 0xe0, 0x1e, 0x20, 0x00, 0x24, 0x00, + 0x4e, 0x14, 0x00, 0xe1, 0x58, 0x71, 0x4b, 0x14, + 0x42, 0x99, 0xd1, 0x0e, 0x89, 0x69, 0x1c, 0x20, + 0xf7, 0xfe, 0xff, 0x3e, 0x28, 0x00, 0xd0, 0x07, + 0x21, 0x0e, 0x70, 0x39, 0x20, 0x00, 0x70, 0x78, + 0x21, 0x06, 0x1c, 0x38, 0xf7, 0xfe, 0xfc, 0x60, + 0x20, 0x01, 0x34, 0x01, 0x2c, 0x20, 0xdb, 0xe8, + 0x28, 0x00, 0xd1, 0x07, 0x21, 0x0e, 0x70, 0x39, + 0x20, 0x05, 0x70, 0x78, 0x21, 0x06, 0x1c, 0x38, + 0xf7, 0xfe, 0xfc, 0x52, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x80, + 0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x7a, 0x60, + 0x00, 0x03, 0x00, 0x41, 0xb5, 0xf0, 0x06, 0x00, + 0x0e, 0x00, 0x21, 0x00, 0xb0, 0x85, 0x91, 0x02, + 0x22, 0x02, 0x92, 0x01, 0x28, 0xff, 0xd0, 0x02, + 0x22, 0x01, 0x92, 0x01, 0x1c, 0x01, 0x9a, 0x01, + 0x2a, 0x00, 0xdd, 0x4d, 0x4a, 0x28, 0x92, 0x04, + 0x4f, 0x28, 0x20, 0x01, 0x70, 0x38, 0x01, 0x08, + 0x9a, 0x04, 0x5c, 0x12, 0x70, 0x7a, 0x31, 0x01, + 0x91, 0x03, 0x70, 0xb9, 0x21, 0x00, 0x91, 0x00, + 0x9a, 0x04, 0x18, 0x84, 0x89, 0xa0, 0x28, 0x00, + 0xd0, 0x16, 0x68, 0xa3, 0x2b, 0x00, 0xd0, 0x13, + 0x70, 0xf8, 0x28, 0x00, 0xdd, 0x0b, 0x00, 0x4a, + 0x5a, 0x9d, 0x0a, 0x2e, 0x19, 0xd5, 0x71, 0x2e, + 0x5a, 0x9a, 0x71, 0x6a, 0x31, 0x01, 0x06, 0x09, + 0x0e, 0x09, 0x42, 0x88, 0xdc, 0xf3, 0x00, 0x40, + 0x99, 0x00, 0x18, 0x40, 0x1c, 0x45, 0xe0, 0x02, + 0x20, 0x00, 0x70, 0xf8, 0x25, 0x01, 0x68, 0x60, + 0x28, 0x00, 0xd0, 0x0e, 0xf0, 0x11, 0xfc, 0x66, + 0x1c, 0x02, 0x19, 0x78, 0x68, 0x61, 0x30, 0x03, + 0xf0, 0x11, 0xfb, 0xf0, 0x68, 0x60, 0xf0, 0x11, + 0xfc, 0x5d, 0x19, 0x45, 0x20, 0x00, 0x19, 0x79, + 0x70, 0xc8, 0x1c, 0x38, 0x1d, 0x69, 0xf7, 0xfe, + 0xfb, 0xf3, 0x99, 0x03, 0x06, 0x09, 0x0e, 0x09, + 0x98, 0x02, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x02, 0x9a, 0x01, 0x42, 0x90, 0xdb, 0xb4, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x7e, 0x88, 0x2e, 0x08, 0x72, 0x60, + 0xb5, 0x80, 0x20, 0x00, 0x22, 0x00, 0x1c, 0x0f, + 0x49, 0x0a, 0x54, 0x0a, 0x30, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x28, 0x02, 0xdb, 0xf9, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0xc6, 0x28, 0x01, 0xd1, 0x03, + 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xb8, + 0xb5, 0xf0, 0x04, 0x0c, 0x0c, 0x24, 0x1c, 0x17, + 0xf0, 0x00, 0xf8, 0x8e, 0x4d, 0x0d, 0x69, 0x28, + 0x4b, 0x0d, 0x18, 0xc6, 0x20, 0x04, 0xf0, 0x00, + 0xf9, 0x65, 0x20, 0x00, 0x2c, 0x00, 0xdd, 0x0c, + 0x5c, 0x39, 0x80, 0x31, 0x23, 0x03, 0x07, 0x1b, + 0x69, 0x29, 0x18, 0xc9, 0x88, 0x09, 0x54, 0x39, + 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x42, 0xa0, + 0xdb, 0xf2, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xb0, + 0x30, 0x00, 0x40, 0x00, 0xb5, 0xf0, 0x1c, 0x0c, + 0x1c, 0x17, 0xb0, 0x83, 0xf0, 0x00, 0xf8, 0x68, + 0x4e, 0x13, 0x69, 0x30, 0x4b, 0x13, 0x18, 0xc5, + 0x20, 0x04, 0xf0, 0x00, 0xf9, 0x3f, 0x23, 0x03, + 0x07, 0x1b, 0x69, 0x30, 0x18, 0xc1, 0x20, 0x00, + 0x2c, 0x00, 0xdd, 0x0a, 0x88, 0x2a, 0x54, 0x3a, + 0x88, 0x0a, 0x54, 0x3a, 0x88, 0x0a, 0x54, 0x3a, + 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x42, 0xa0, + 0xdb, 0xf4, 0x46, 0x68, 0x90, 0x02, 0x20, 0x01, + 0xab, 0x01, 0x80, 0x18, 0x21, 0x04, 0xa8, 0x01, + 0xf0, 0x00, 0xf8, 0x9e, 0x1c, 0x20, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0xb0, 0x30, 0x00, 0x40, 0x00, + 0xb5, 0xb0, 0x25, 0x01, 0x1c, 0x0c, 0x1c, 0x17, + 0xf0, 0x00, 0xf8, 0x36, 0x48, 0x18, 0x2c, 0x08, + 0xd2, 0x2a, 0xa3, 0x02, 0x5d, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x26, 0x04, 0x06, 0x0c, + 0x12, 0x18, 0x1e, 0x23, 0x25, 0x00, 0xe0, 0x1f, + 0x61, 0x47, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, + 0xf8, 0x31, 0xe0, 0x14, 0x61, 0x47, 0x1c, 0x38, + 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x53, 0xe0, 0x0e, + 0x61, 0x87, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, + 0xf8, 0x6f, 0xe0, 0x08, 0x61, 0x87, 0x1c, 0x38, + 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x93, 0xe0, 0x02, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xb1, 0x1c, 0x05, + 0xe0, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0x14, + 0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0xb0, 0x20, 0x00, 0x47, 0x70, + 0x49, 0x05, 0x68, 0xca, 0x42, 0x90, 0xd0, 0x06, + 0x60, 0xc8, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0x01, + 0x20, 0x01, 0x03, 0x40, 0x61, 0x08, 0x47, 0x70, + 0x2e, 0x08, 0x1a, 0xb0, 0xb5, 0xb0, 0x1c, 0x07, + 0x88, 0x00, 0x4a, 0x10, 0x43, 0x02, 0x48, 0x10, + 0x69, 0x00, 0x43, 0x02, 0x25, 0x03, 0x07, 0x2d, + 0x43, 0x05, 0x1c, 0x08, 0x1c, 0x14, 0xf0, 0x00, + 0xf8, 0xc1, 0x20, 0x00, 0x88, 0x79, 0x29, 0x00, + 0xdd, 0x0a, 0x88, 0x21, 0x68, 0x7a, 0x54, 0x11, + 0x88, 0x29, 0x68, 0x7a, 0x54, 0x11, 0x88, 0x79, + 0x30, 0x01, 0x34, 0x02, 0x42, 0x81, 0xdc, 0xf4, + 0x30, 0x01, 0x81, 0x38, 0x20, 0x00, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x30, 0x00, 0x40, 0x00, + 0x2e, 0x08, 0x1a, 0xb0, 0xb5, 0x90, 0x1c, 0x07, + 0x88, 0x00, 0x4b, 0x0d, 0x18, 0xc0, 0x4a, 0x0d, + 0x69, 0x12, 0x18, 0x84, 0x1c, 0x08, 0xf0, 0x00, + 0xf8, 0x9d, 0x20, 0x00, 0x88, 0x79, 0x29, 0x00, + 0xdd, 0x07, 0x68, 0x79, 0x5c, 0x09, 0x80, 0x21, + 0x88, 0x79, 0x30, 0x01, 0x34, 0x02, 0x42, 0x81, + 0xdc, 0xf7, 0x20, 0x01, 0x81, 0x38, 0x20, 0x00, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x30, 0x00, 0x40, 0x00, 0x2e, 0x08, 0x1a, 0xb0, + 0xb5, 0xb0, 0x1c, 0x07, 0x88, 0x00, 0x07, 0xc2, + 0x0f, 0xd2, 0x4c, 0x0f, 0xd0, 0x04, 0x23, 0xfe, + 0x40, 0x18, 0x4b, 0x0e, 0x18, 0xc0, 0xe0, 0x01, + 0x4b, 0x0d, 0x18, 0xc0, 0x69, 0x22, 0x18, 0x85, + 0x1c, 0x08, 0xf0, 0x00, 0xf8, 0x73, 0x23, 0x03, + 0x07, 0x1b, 0x69, 0x20, 0x18, 0xc0, 0x88, 0x29, + 0x68, 0x7a, 0x70, 0x11, 0x88, 0x01, 0x68, 0x7a, + 0x70, 0x11, 0x88, 0x00, 0x68, 0x79, 0x70, 0x08, + 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0xb0, 0x30, 0x00, 0x50, 0x00, + 0x30, 0x00, 0x40, 0x00, 0xb5, 0x90, 0x88, 0x02, + 0x07, 0xd3, 0x0f, 0xdb, 0x1c, 0x07, 0x48, 0x0b, + 0x2b, 0x00, 0xd0, 0x02, 0x4b, 0x0a, 0x18, 0xd2, + 0xe0, 0x01, 0x4b, 0x0a, 0x18, 0xd2, 0x69, 0x00, + 0x18, 0x14, 0x1c, 0x08, 0xf0, 0x00, 0xf8, 0x4a, + 0x68, 0x78, 0x78, 0x00, 0x80, 0x20, 0x88, 0x38, + 0x07, 0xc0, 0x0f, 0xc0, 0x20, 0x00, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0xb0, + 0x30, 0x00, 0x50, 0x00, 0x30, 0x00, 0x40, 0x00, + 0xb5, 0x90, 0x1c, 0x07, 0x20, 0x00, 0x78, 0x39, + 0x29, 0x01, 0xd0, 0x02, 0x29, 0x02, 0xd1, 0x28, + 0xe0, 0x26, 0x48, 0x15, 0x24, 0x00, 0x68, 0x01, + 0x29, 0x00, 0xd0, 0x16, 0x60, 0x04, 0x20, 0x1a, + 0xf0, 0x00, 0xf9, 0x10, 0x20, 0xc8, 0xf7, 0xfe, + 0xfb, 0x79, 0x20, 0x01, 0x06, 0x40, 0xf0, 0x16, + 0xfd, 0xca, 0xf0, 0x16, 0xfd, 0xcd, 0x4b, 0x0d, + 0x40, 0x18, 0xf0, 0x16, 0xfd, 0xcd, 0x20, 0x00, + 0xf0, 0x00, 0xf8, 0xb8, 0x20, 0x01, 0xf0, 0x00, + 0xf8, 0xb5, 0x48, 0x09, 0x1f, 0xc1, 0x39, 0x01, + 0x68, 0xc9, 0x5c, 0x40, 0x28, 0x00, 0xd0, 0x02, + 0x20, 0x01, 0x70, 0x78, 0xe0, 0x00, 0x70, 0x7c, + 0x20, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x98, 0xfd, 0xff, 0xff, 0xff, + 0x2e, 0x08, 0x1a, 0xb8, 0xb5, 0xb0, 0x1c, 0x07, + 0x4c, 0x1e, 0x68, 0xe0, 0x00, 0x80, 0x4d, 0x1e, + 0x58, 0x28, 0x42, 0xb8, 0xd0, 0x32, 0x2f, 0x08, + 0xd2, 0x2d, 0xa3, 0x02, 0x5d, 0xdb, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x29, 0x29, 0x04, 0x04, + 0x13, 0x13, 0x29, 0x29, 0x28, 0x03, 0xd0, 0x22, + 0x28, 0x02, 0xd0, 0x20, 0x20, 0x03, 0x49, 0x15, + 0x60, 0x08, 0x68, 0xe0, 0x00, 0xc3, 0x18, 0x18, + 0xf0, 0x00, 0xf8, 0xc8, 0x21, 0xf3, 0x40, 0x01, + 0xe0, 0x10, 0x28, 0x04, 0xd0, 0x13, 0x28, 0x05, + 0xd0, 0x11, 0x20, 0x00, 0x21, 0x03, 0x07, 0x09, + 0x80, 0x08, 0x68, 0xe0, 0x00, 0xc3, 0x18, 0x18, + 0xf0, 0x00, 0xf8, 0xb8, 0x23, 0xf3, 0x40, 0x18, + 0x21, 0x04, 0x43, 0x01, 0x68, 0xe0, 0x00, 0xc3, + 0x18, 0x18, 0xf0, 0x00, 0xf8, 0x95, 0x68, 0xe0, + 0x00, 0x80, 0x50, 0x2f, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xb0, + 0x2e, 0x08, 0x1a, 0xb0, 0x6e, 0x00, 0x11, 0x00, + 0xb5, 0x80, 0x21, 0x80, 0x1c, 0x07, 0x20, 0x1f, + 0xf0, 0x00, 0xf8, 0x82, 0x21, 0x55, 0x20, 0x02, + 0xf0, 0x00, 0xf8, 0x7e, 0x20, 0x02, 0xf0, 0x00, + 0xf8, 0x95, 0x28, 0x55, 0xd0, 0x03, 0x20, 0x00, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x33, + 0x20, 0x05, 0xf0, 0x00, 0xf8, 0x71, 0x21, 0x33, + 0x20, 0x0e, 0xf0, 0x00, 0xf8, 0x6d, 0x21, 0x21, + 0x20, 0x17, 0xf0, 0x00, 0xf8, 0x69, 0x21, 0x00, + 0x20, 0x01, 0xf0, 0x00, 0xf8, 0x65, 0x21, 0x00, + 0x20, 0x0a, 0xf0, 0x00, 0xf8, 0x61, 0x21, 0x01, + 0x20, 0x02, 0xf0, 0x00, 0xf8, 0x5d, 0x21, 0x01, + 0x20, 0x0b, 0xf0, 0x00, 0xf8, 0x59, 0x21, 0x00, + 0x20, 0x03, 0xf0, 0x00, 0xf8, 0x55, 0x21, 0x00, + 0x20, 0x0c, 0xf0, 0x00, 0xf8, 0x51, 0x21, 0x00, + 0x20, 0x04, 0xf0, 0x00, 0xf8, 0x4d, 0x21, 0x01, + 0x20, 0x0d, 0xf0, 0x00, 0xf8, 0x49, 0x21, 0x02, + 0x20, 0x1e, 0xf0, 0x00, 0xf8, 0x45, 0x21, 0x04, + 0x20, 0x1c, 0xf0, 0x00, 0xf8, 0x41, 0x21, 0x03, + 0x20, 0x1b, 0xf0, 0x00, 0xf8, 0x3d, 0x21, 0x01, + 0x20, 0x1f, 0xf0, 0x00, 0xf8, 0x39, 0x21, 0x01, + 0x20, 0x18, 0xf0, 0x00, 0xf8, 0x35, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x04, 0x20, 0x01, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x00, 0xc3, + 0x1c, 0x07, 0x18, 0x18, 0x1c, 0x06, 0xf0, 0x00, + 0xf8, 0x41, 0x07, 0xc0, 0x0f, 0xc0, 0x25, 0x01, + 0x4c, 0x10, 0x28, 0x00, 0xd0, 0x06, 0x5d, 0xe1, + 0x29, 0x00, 0xd0, 0x03, 0x1c, 0x28, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x28, 0x00, 0xd1, 0x01, + 0x55, 0xe0, 0xe7, 0xf7, 0x21, 0x80, 0x1c, 0x30, + 0xf0, 0x00, 0xf8, 0x12, 0x20, 0x32, 0xf7, 0xfe, + 0xfa, 0x95, 0x21, 0x00, 0x1c, 0x30, 0xf0, 0x00, + 0xf8, 0x0b, 0x20, 0x32, 0xf7, 0xfe, 0xfa, 0x8e, + 0x55, 0xe5, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xb8, + 0xb5, 0xb0, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x0d, + 0x0e, 0x2d, 0x24, 0x09, 0xb0, 0x81, 0xab, 0x00, + 0x70, 0x1f, 0x70, 0x5d, 0x46, 0x69, 0x22, 0x02, + 0x20, 0x80, 0xf7, 0xf4, 0xfa, 0xe6, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x08, 0x1e, 0x60, 0x06, 0x04, + 0x0e, 0x24, 0xd1, 0xf0, 0xb0, 0x01, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x06, 0x04, + 0x0e, 0x24, 0xb0, 0x82, 0x48, 0x1f, 0x68, 0x00, + 0x90, 0x00, 0x25, 0x09, 0xab, 0x01, 0x70, 0x1c, + 0x20, 0xff, 0x3b, 0x04, 0x70, 0x18, 0x22, 0x01, + 0xb4, 0x04, 0x20, 0x80, 0xa9, 0x02, 0xab, 0x01, + 0xf7, 0xf4, 0xfb, 0x22, 0xb0, 0x01, 0xaf, 0x00, + 0x78, 0x3f, 0xab, 0x01, 0x70, 0x1c, 0x20, 0xff, + 0x3b, 0x04, 0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, + 0x20, 0x80, 0xa9, 0x02, 0xab, 0x01, 0xf7, 0xf4, + 0xfb, 0x13, 0xb0, 0x01, 0xae, 0x00, 0x78, 0x36, + 0xab, 0x01, 0x70, 0x1c, 0x20, 0xff, 0x3b, 0x04, + 0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, 0x20, 0x80, + 0xa9, 0x02, 0xab, 0x01, 0xf7, 0xf4, 0xfb, 0x04, + 0xb0, 0x01, 0xa8, 0x00, 0x78, 0x00, 0x42, 0xb7, + 0xd1, 0x03, 0x42, 0x87, 0xd1, 0x01, 0x1c, 0x38, + 0xe0, 0x04, 0x1e, 0x68, 0x06, 0x05, 0x0e, 0x2d, + 0xd1, 0xc8, 0x20, 0xff, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0xcc, 0x9c, + 0xb5, 0x80, 0x78, 0x01, 0x29, 0x00, 0xd1, 0x1b, + 0x78, 0x40, 0x28, 0x00, 0xd0, 0x18, 0x4f, 0x0e, + 0x68, 0xf8, 0x00, 0xc3, 0x18, 0x18, 0xf7, 0xff, + 0xff, 0xad, 0x21, 0x20, 0x43, 0x01, 0x68, 0xf8, + 0x00, 0xc3, 0x18, 0x18, 0xf7, 0xff, 0xff, 0x8c, + 0x68, 0xf8, 0x00, 0xc3, 0x18, 0x18, 0xf7, 0xff, + 0xff, 0xa1, 0x21, 0x40, 0x43, 0x01, 0x68, 0xf8, + 0x00, 0xc3, 0x18, 0x18, 0xf7, 0xff, 0xff, 0x80, + 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0xb0, 0xb5, 0x80, 0x20, 0xe1, + 0x01, 0x00, 0xf7, 0xfe, 0xf9, 0xcb, 0x49, 0x1f, + 0x60, 0xc8, 0x28, 0x00, 0xd0, 0x0d, 0x27, 0x00, + 0x80, 0x4f, 0x70, 0x0f, 0x20, 0x64, 0x80, 0x88, + 0x80, 0xcf, 0x21, 0x64, 0x20, 0x00, 0xf0, 0x00, + 0xfe, 0x34, 0x20, 0x00, 0x22, 0xff, 0x49, 0x18, + 0xe0, 0x08, 0x78, 0x08, 0x23, 0x80, 0x43, 0x18, + 0x70, 0x08, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x01, 0x03, 0x18, 0x5b, + 0x70, 0x5a, 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, + 0x28, 0x0a, 0xdb, 0xf7, 0x20, 0x00, 0x49, 0x0f, + 0x22, 0xff, 0x32, 0x01, 0x54, 0x0f, 0x30, 0x01, + 0x04, 0x00, 0x0c, 0x00, 0x42, 0x90, 0xdb, 0xf9, + 0x20, 0x00, 0x49, 0x0b, 0x54, 0x0f, 0x30, 0x01, + 0x04, 0x00, 0x0c, 0x00, 0x42, 0x90, 0xdb, 0xf9, + 0x1c, 0x38, 0x49, 0x08, 0x63, 0x8f, 0x60, 0x4f, + 0x60, 0x0f, 0x62, 0x0f, 0x61, 0xcf, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x8f, 0x80, + 0x2e, 0x08, 0x8f, 0x90, 0x2e, 0x08, 0x90, 0x7c, + 0x2e, 0x08, 0x91, 0x7c, 0x2e, 0x08, 0x90, 0x30, + 0xb5, 0x90, 0x27, 0x00, 0x4c, 0x0b, 0x01, 0x38, + 0x5c, 0x21, 0x29, 0x00, 0xd0, 0x09, 0x19, 0x00, + 0x68, 0x81, 0x29, 0x00, 0xd0, 0x02, 0x88, 0x80, + 0xf7, 0xff, 0xfb, 0x8a, 0x1c, 0x38, 0xf0, 0x00, + 0xff, 0x83, 0x37, 0x01, 0x2f, 0x0a, 0xdb, 0xee, + 0xf0, 0x00, 0xf8, 0x06, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x90, + 0xb5, 0xf0, 0x25, 0x00, 0x4f, 0x1e, 0x88, 0x78, + 0x26, 0x00, 0x28, 0x00, 0xdd, 0x2c, 0x00, 0xec, + 0x19, 0x64, 0x00, 0xa4, 0x68, 0xf8, 0x19, 0x00, + 0x68, 0x80, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfe, + 0xf9, 0x7b, 0x68, 0xf8, 0x19, 0x00, 0x60, 0x86, + 0x68, 0xf8, 0x19, 0x00, 0x68, 0x40, 0x28, 0x00, + 0xd0, 0x04, 0xf7, 0xfe, 0xf9, 0x71, 0x68, 0xf8, + 0x19, 0x00, 0x60, 0x46, 0x68, 0xf8, 0x59, 0x00, + 0x28, 0x00, 0xd0, 0x03, 0xf7, 0xfe, 0xf9, 0x68, + 0x68, 0xf8, 0x51, 0x06, 0x68, 0xf8, 0x19, 0x00, + 0x69, 0x40, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfe, + 0xf9, 0x5f, 0x68, 0xf8, 0x19, 0x00, 0x61, 0x46, + 0x88, 0x78, 0x35, 0x01, 0x42, 0xa8, 0xdc, 0xd2, + 0x68, 0xf8, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfe, + 0xf9, 0x53, 0x60, 0xfe, 0x80, 0x7e, 0x80, 0xbe, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x8f, 0x80, 0xb5, 0xf0, 0x06, 0x0d, + 0x0e, 0x2d, 0x1c, 0x07, 0x20, 0x02, 0x40, 0x28, + 0x26, 0x00, 0x43, 0xf6, 0x24, 0x00, 0x28, 0x00, + 0xd0, 0x0d, 0x68, 0x38, 0x28, 0x00, 0xd0, 0x02, + 0xf7, 0xfe, 0xf9, 0x3a, 0x60, 0x3c, 0x68, 0x78, + 0x28, 0x00, 0xd0, 0x02, 0xf7, 0xfe, 0xf9, 0x34, + 0x60, 0x7c, 0x61, 0x7e, 0x61, 0xbe, 0x08, 0x68, + 0xd3, 0x0d, 0x69, 0xf8, 0x28, 0x00, 0xd0, 0x02, + 0xf7, 0xfe, 0xf9, 0x2a, 0x61, 0xfc, 0x6a, 0x38, + 0x28, 0x00, 0xd0, 0x02, 0xf7, 0xfe, 0xf9, 0x24, + 0x62, 0x3c, 0x63, 0x3e, 0x63, 0x7e, 0x08, 0xe8, + 0xd3, 0x05, 0x6b, 0xb8, 0x28, 0x00, 0xd0, 0x02, + 0xf7, 0xfe, 0xf9, 0x1a, 0x63, 0xbc, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0x4f, 0x12, + 0x88, 0xb8, 0x1d, 0xc1, 0x31, 0x0d, 0x00, 0xca, + 0x18, 0x52, 0x00, 0x92, 0x00, 0xc1, 0x18, 0x09, + 0x00, 0x89, 0x68, 0xf8, 0xf7, 0xfe, 0xf8, 0xe7, + 0x60, 0xf8, 0x28, 0x00, 0xd0, 0x0b, 0x88, 0xb8, + 0x1d, 0xc1, 0x31, 0x0d, 0xf0, 0x00, 0xfd, 0x51, + 0x88, 0xb8, 0x30, 0x14, 0x80, 0xb8, 0x20, 0x00, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x38, + 0x23, 0x80, 0x43, 0x18, 0x70, 0x38, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x8f, 0x80, 0xb5, 0x90, 0x06, 0x07, + 0x0e, 0x3f, 0x4c, 0x10, 0x2f, 0x11, 0xd1, 0x02, + 0x78, 0x20, 0x27, 0x08, 0x40, 0x07, 0xf7, 0xff, + 0xff, 0x3b, 0xf7, 0xff, 0xfe, 0xeb, 0x09, 0x38, + 0xd3, 0x03, 0x78, 0x20, 0x23, 0x08, 0x43, 0x18, + 0x70, 0x20, 0x4b, 0x09, 0x22, 0x00, 0x21, 0x00, + 0x20, 0x00, 0xf0, 0x00, 0xfe, 0x4f, 0x4b, 0x07, + 0x22, 0x11, 0x21, 0x00, 0x20, 0x42, 0xf0, 0x00, + 0xfe, 0x49, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x80, + 0x00, 0x00, 0x13, 0x88, 0x00, 0x00, 0x27, 0x10, + 0x49, 0x0e, 0x78, 0x0a, 0x08, 0x52, 0xd3, 0x01, + 0x22, 0xff, 0xe0, 0x00, 0x22, 0x00, 0x70, 0x02, + 0x78, 0x0a, 0x08, 0x92, 0xd3, 0x01, 0x22, 0xff, + 0xe0, 0x00, 0x22, 0x00, 0x70, 0x42, 0x78, 0x0a, + 0x09, 0x52, 0xd3, 0x01, 0x22, 0xff, 0xe0, 0x00, + 0x22, 0x00, 0x70, 0x82, 0x78, 0x09, 0x09, 0x89, + 0xd3, 0x01, 0x21, 0xff, 0xe0, 0x00, 0x21, 0x00, + 0x70, 0xc1, 0x47, 0x70, 0x2e, 0x08, 0x8f, 0x80, + 0xb5, 0x00, 0xf7, 0xff, 0xfe, 0xf9, 0x48, 0x03, + 0x78, 0x01, 0x23, 0x80, 0x43, 0x19, 0x70, 0x01, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x8f, 0x80, + 0xb5, 0xf0, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x07, + 0xb0, 0x81, 0x48, 0x3b, 0x90, 0x00, 0x78, 0x00, + 0x23, 0x80, 0x40, 0x18, 0x26, 0x00, 0x43, 0xf6, + 0x28, 0x00, 0xd1, 0x04, 0x1c, 0x38, 0xf0, 0x00, + 0xfe, 0xd5, 0x1c, 0x04, 0xd5, 0x01, 0x1c, 0x30, + 0xe0, 0x61, 0x78, 0x38, 0x4e, 0x33, 0x28, 0x42, + 0xd0, 0x45, 0xdc, 0x1c, 0x28, 0x00, 0xd0, 0x25, + 0x28, 0x01, 0xd0, 0x57, 0x28, 0x02, 0xd1, 0x55, + 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x00, 0xf9, 0xe8, + 0x28, 0x00, 0xd0, 0x04, 0x01, 0x20, 0x19, 0x80, + 0x88, 0x80, 0xf7, 0xff, 0xfa, 0x5d, 0x1c, 0x20, + 0xf0, 0x00, 0xfe, 0x56, 0xf0, 0x00, 0xfd, 0x6f, + 0x28, 0x00, 0xd1, 0x43, 0xf0, 0x00, 0xfd, 0x6b, + 0x28, 0x00, 0xd0, 0xfb, 0xe0, 0x3e, 0x28, 0x4e, + 0xd0, 0x38, 0x28, 0x70, 0xd0, 0x1e, 0x28, 0x73, + 0xd1, 0x38, 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x00, + 0xfc, 0x37, 0xe0, 0x33, 0x98, 0x00, 0x78, 0x00, + 0x08, 0x40, 0xd2, 0x2f, 0x1c, 0x38, 0x1c, 0x29, + 0xf0, 0x00, 0xf8, 0x36, 0x28, 0x01, 0xd1, 0x29, + 0x01, 0x20, 0x19, 0x80, 0x88, 0x80, 0xf7, 0xff, + 0xfa, 0x37, 0xf0, 0x00, 0xfd, 0x4c, 0x28, 0x00, + 0xd1, 0x20, 0xf0, 0x00, 0xfd, 0x48, 0x28, 0x00, + 0xd0, 0xfb, 0xe0, 0x1b, 0x1c, 0x38, 0x1c, 0x29, + 0xf0, 0x00, 0xfb, 0xf6, 0xe0, 0x16, 0x98, 0x00, + 0x78, 0x00, 0x09, 0x40, 0xd2, 0x12, 0x1c, 0x38, + 0x1c, 0x29, 0xf0, 0x00, 0xf8, 0xd1, 0x28, 0x10, + 0xd1, 0x0c, 0x01, 0x20, 0x19, 0x80, 0x88, 0x80, + 0xf7, 0xff, 0xfa, 0x1a, 0x1c, 0x20, 0xf0, 0x00, + 0xfe, 0x13, 0xe0, 0x03, 0x1c, 0x38, 0x1c, 0x29, + 0xf0, 0x00, 0xfb, 0x10, 0x20, 0x00, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x8f, 0x80, 0x2e, 0x08, 0x8f, 0x90, + 0xb5, 0xf0, 0x04, 0x09, 0x0c, 0x09, 0x25, 0x00, + 0xb0, 0x85, 0xf7, 0xf3, 0xff, 0xa9, 0x20, 0x08, + 0xf7, 0xf3, 0xff, 0xc2, 0x20, 0x04, 0xf7, 0xf3, + 0xff, 0xbf, 0x20, 0x0c, 0xf7, 0xf3, 0xff, 0xbc, + 0x04, 0x00, 0x0c, 0x00, 0x90, 0x03, 0x20, 0x10, + 0xf7, 0xf3, 0xff, 0xb6, 0x4f, 0x4d, 0x81, 0x38, + 0x20, 0x02, 0xf7, 0xf3, 0xff, 0xb1, 0x20, 0x05, + 0xf7, 0xf3, 0xff, 0xae, 0x06, 0x04, 0x0e, 0x24, + 0x20, 0x01, 0xf7, 0xf3, 0xff, 0xa9, 0x20, 0x08, + 0xf7, 0xf3, 0xff, 0xa6, 0x06, 0x06, 0x0e, 0x36, + 0x20, 0x08, 0xf7, 0xf3, 0xff, 0xa1, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x02, 0x48, 0x42, 0x90, 0x04, + 0x5d, 0x80, 0x0a, 0x01, 0xd3, 0x03, 0x06, 0xc0, + 0x0e, 0xc0, 0x42, 0xa0, 0xd0, 0x45, 0x20, 0x80, + 0x43, 0x20, 0x99, 0x04, 0x55, 0x88, 0x98, 0x03, + 0x38, 0x09, 0xd5, 0x00, 0x30, 0x03, 0x10, 0x80, + 0x04, 0x00, 0x0c, 0x00, 0x90, 0x01, 0x88, 0x7c, + 0x28, 0x00, 0xdd, 0x36, 0x20, 0x10, 0xf7, 0xf3, + 0xff, 0x83, 0x04, 0x06, 0x0c, 0x36, 0x20, 0x10, + 0xf7, 0xf3, 0xff, 0x7e, 0x04, 0xc1, 0x0c, 0xc9, + 0x91, 0x00, 0x2e, 0x00, 0xd0, 0x21, 0x1c, 0x30, + 0xf0, 0x00, 0xfb, 0xe0, 0x4b, 0x2f, 0x42, 0x98, + 0xd1, 0x10, 0x88, 0xb8, 0x88, 0x79, 0x42, 0x88, + 0xd1, 0x05, 0xf7, 0xff, 0xfe, 0xa3, 0x23, 0x01, + 0x42, 0xd8, 0xd1, 0x00, 0xe0, 0x49, 0x88, 0x79, + 0x31, 0x01, 0x80, 0x79, 0x1c, 0x61, 0x1c, 0x20, + 0x04, 0x0c, 0x0c, 0x24, 0x00, 0xc3, 0x18, 0x18, + 0x00, 0x80, 0x68, 0xf9, 0x18, 0x09, 0x81, 0xce, + 0x99, 0x00, 0x68, 0xfa, 0x18, 0x10, 0x82, 0x01, + 0xe0, 0x01, 0x99, 0x00, 0x80, 0xf9, 0x1c, 0x68, + 0x04, 0x05, 0x0c, 0x2d, 0x98, 0x01, 0x42, 0x85, + 0xdb, 0xc8, 0x98, 0x04, 0x99, 0x02, 0xf0, 0x00, + 0xfb, 0xd3, 0x28, 0xff, 0xd1, 0x28, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xfe, 0x0a, + 0x04, 0x00, 0x0c, 0x00, 0xf0, 0x00, 0xfd, 0x78, + 0x78, 0x38, 0x09, 0x00, 0xd3, 0x16, 0x20, 0x00, + 0x88, 0x79, 0x29, 0x00, 0xdd, 0x12, 0x00, 0xc2, + 0x18, 0x12, 0x00, 0x92, 0x68, 0xf9, 0x18, 0x89, + 0x89, 0xca, 0x89, 0x7b, 0x42, 0x9a, 0xd0, 0x03, + 0x7f, 0x0a, 0x23, 0x80, 0x43, 0x1a, 0x77, 0x0a, + 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x88, 0x79, + 0x42, 0x81, 0xdc, 0xec, 0x78, 0x38, 0x23, 0x01, + 0x43, 0x18, 0x70, 0x38, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x80, + 0x2e, 0x08, 0x90, 0x7c, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0xf0, 0x04, 0x09, 0x0c, 0x09, 0x25, 0x00, + 0xb0, 0x88, 0xf7, 0xf3, 0xfe, 0xf1, 0x20, 0x08, + 0xf7, 0xf3, 0xff, 0x0a, 0x20, 0x04, 0xf7, 0xf3, + 0xff, 0x07, 0x20, 0x0c, 0xf7, 0xf3, 0xff, 0x04, + 0x04, 0x04, 0x0c, 0x24, 0x20, 0x10, 0xf7, 0xf3, + 0xfe, 0xff, 0x20, 0x02, 0xf7, 0xf3, 0xfe, 0xfc, + 0x20, 0x05, 0xf7, 0xf3, 0xfe, 0xf9, 0x06, 0x06, + 0x0e, 0x36, 0x20, 0x01, 0xf7, 0xf3, 0xfe, 0xf4, + 0x20, 0x08, 0xf7, 0xf3, 0xfe, 0xf1, 0x06, 0x07, + 0x0e, 0x3f, 0x20, 0x08, 0xf7, 0xf3, 0xfe, 0xec, + 0x06, 0x01, 0x0e, 0x09, 0x91, 0x04, 0x20, 0x10, + 0xf7, 0xf3, 0xfe, 0xe6, 0x20, 0x08, 0xf7, 0xf3, + 0xfe, 0xe3, 0x49, 0x4c, 0x91, 0x07, 0x5d, 0xc8, + 0x0a, 0x01, 0xd3, 0x05, 0x06, 0xc0, 0x0e, 0xc0, + 0x42, 0xb0, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x88, + 0x20, 0x80, 0x43, 0x30, 0x99, 0x07, 0x55, 0xc8, + 0x4f, 0x45, 0x88, 0x78, 0x90, 0x00, 0x1f, 0xe0, + 0x38, 0x05, 0x90, 0x06, 0x28, 0x00, 0xdd, 0x68, + 0x48, 0x42, 0x90, 0x05, 0x20, 0x10, 0xf7, 0xf3, + 0xfe, 0xc7, 0x04, 0x06, 0x0c, 0x36, 0x20, 0x06, + 0xf7, 0xf3, 0xfe, 0xc2, 0x20, 0x06, 0xf7, 0xf3, + 0xfe, 0xbf, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x03, + 0x2e, 0x00, 0xd1, 0x11, 0x20, 0x0c, 0xf7, 0xf3, + 0xfe, 0xb7, 0x04, 0x06, 0x0c, 0x36, 0x24, 0x00, + 0x2e, 0x00, 0xdd, 0x07, 0x20, 0x08, 0xf7, 0xf3, + 0xfe, 0xaf, 0x1c, 0x60, 0x04, 0x04, 0x0c, 0x24, + 0x42, 0xb4, 0xdb, 0xf7, 0x19, 0xa8, 0xe0, 0x3e, + 0x1c, 0x30, 0xf0, 0x00, 0xfb, 0x0f, 0x1c, 0x04, + 0x4b, 0x2f, 0x42, 0x98, 0xd1, 0x18, 0x88, 0xb8, + 0x88, 0x79, 0x42, 0x88, 0xd1, 0x05, 0xf7, 0xff, + 0xfd, 0xd1, 0x23, 0x01, 0x42, 0xd8, 0xd1, 0x00, + 0xe0, 0x47, 0x9c, 0x00, 0x00, 0xe1, 0x19, 0x09, + 0x00, 0x89, 0x68, 0xf8, 0x18, 0x40, 0x81, 0xc6, + 0x88, 0x78, 0x30, 0x01, 0x80, 0x78, 0x98, 0x00, + 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, + 0x98, 0x03, 0x00, 0xe2, 0x19, 0x12, 0x00, 0x92, + 0x68, 0xf9, 0x18, 0x89, 0x77, 0xc8, 0x20, 0x0c, + 0xf7, 0xf3, 0xfe, 0x7e, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x02, 0x26, 0x00, 0x28, 0x00, 0xdd, 0x0c, + 0x98, 0x05, 0xa9, 0x01, 0x1c, 0x22, 0xf0, 0x00, + 0xfb, 0x45, 0xa8, 0x01, 0x88, 0x00, 0x18, 0x30, + 0x04, 0x06, 0x0c, 0x36, 0x98, 0x02, 0x42, 0x86, + 0xdb, 0xf2, 0x98, 0x02, 0x18, 0x28, 0x30, 0x05, + 0x04, 0x05, 0x0c, 0x2d, 0x98, 0x06, 0x42, 0xa8, + 0xdc, 0x98, 0x98, 0x07, 0x99, 0x04, 0xf0, 0x00, + 0xfa, 0xe7, 0x28, 0xff, 0xd1, 0x82, 0x78, 0x38, + 0x23, 0x10, 0x43, 0x18, 0x70, 0x38, 0x78, 0x38, + 0x08, 0x81, 0xd3, 0x05, 0x09, 0x41, 0xd3, 0x03, + 0x09, 0x00, 0xd2, 0x01, 0xf0, 0x00, 0xfe, 0xd3, + 0x20, 0x10, 0xb0, 0x08, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x91, 0x7c, + 0x2e, 0x08, 0x8f, 0x80, 0x2e, 0x08, 0x82, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x20, 0x00, 0x47, 0x70, + 0xb5, 0xf0, 0x04, 0x09, 0x0c, 0x09, 0x22, 0x00, + 0xb0, 0x90, 0x92, 0x0c, 0x92, 0x02, 0x92, 0x01, + 0xf7, 0xf3, 0xfe, 0x1a, 0x20, 0x08, 0xf7, 0xf3, + 0xfe, 0x33, 0x20, 0x04, 0xf7, 0xf3, 0xfe, 0x30, + 0x20, 0x0c, 0xf7, 0xf3, 0xfe, 0x2d, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x0d, 0x20, 0x10, 0xf7, 0xf3, + 0xfe, 0x27, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x0a, + 0x20, 0x02, 0xf7, 0xf3, 0xfe, 0x21, 0x20, 0x05, + 0xf7, 0xf3, 0xfe, 0x1e, 0x06, 0x03, 0x0e, 0x1b, + 0x93, 0x05, 0x20, 0x01, 0xf7, 0xf3, 0xfe, 0x18, + 0x06, 0x02, 0x0e, 0x12, 0x92, 0x04, 0x20, 0x08, + 0xf7, 0xf3, 0xfe, 0x12, 0x20, 0x08, 0xf7, 0xf3, + 0xfe, 0x0f, 0x20, 0x03, 0xf7, 0xf3, 0xfe, 0x0c, + 0x20, 0x0d, 0xf7, 0xf3, 0xfe, 0x09, 0x04, 0x07, + 0x0c, 0x3f, 0x20, 0x04, 0xf7, 0xf3, 0xfe, 0x04, + 0x20, 0x0c, 0xf7, 0xf3, 0xfe, 0x01, 0x04, 0x01, + 0x0c, 0x09, 0x91, 0x09, 0x98, 0x0a, 0xf0, 0x00, + 0xfd, 0x13, 0x1c, 0x04, 0xd1, 0x01, 0x43, 0xe0, + 0xe1, 0x27, 0x7f, 0x20, 0x0a, 0x00, 0xd3, 0x01, + 0x20, 0x00, 0xe1, 0x22, 0x84, 0x27, 0x25, 0x00, + 0x99, 0x09, 0x4e, 0x92, 0x1d, 0xf7, 0x37, 0xf9, + 0x29, 0x00, 0xdd, 0x2a, 0x98, 0x0a, 0xf0, 0x00, + 0xfa, 0x51, 0x1c, 0x02, 0x1c, 0x30, 0xa9, 0x06, + 0xf0, 0x00, 0xfa, 0xb4, 0x28, 0x09, 0xd1, 0x16, + 0x98, 0x02, 0x28, 0x00, 0xd1, 0x06, 0x20, 0xff, + 0x90, 0x01, 0x20, 0x01, 0x70, 0x38, 0x18, 0x28, + 0x04, 0x05, 0x0c, 0x2d, 0x20, 0xff, 0x90, 0x02, + 0x19, 0x78, 0xaa, 0x06, 0x88, 0x12, 0x1c, 0x31, + 0xf0, 0x10, 0xfd, 0x14, 0xa8, 0x06, 0x88, 0x00, + 0x18, 0x28, 0x04, 0x05, 0x0c, 0x2d, 0xa9, 0x06, + 0x88, 0x09, 0x98, 0x0c, 0x18, 0x40, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x0c, 0x99, 0x09, 0x42, 0x88, + 0xdb, 0xd4, 0x48, 0x7b, 0x90, 0x0f, 0x2d, 0x00, + 0xd0, 0x0d, 0x9a, 0x04, 0xb4, 0x04, 0x21, 0x03, + 0x98, 0x10, 0x9a, 0x0b, 0x9b, 0x06, 0xf0, 0x00, + 0xfd, 0xac, 0xb0, 0x01, 0x98, 0x0f, 0x1c, 0x39, + 0x1c, 0x2a, 0xf0, 0x00, 0xfd, 0xc8, 0x20, 0x00, + 0x90, 0x0b, 0x98, 0x0d, 0x99, 0x09, 0x1a, 0x40, + 0x38, 0x0d, 0x90, 0x0e, 0x28, 0x00, 0xdd, 0x75, + 0x20, 0x00, 0x90, 0x00, 0x25, 0x00, 0x20, 0x08, + 0xf7, 0xf3, 0xfd, 0x9e, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x03, 0x20, 0x03, 0xf7, 0xf3, 0xfd, 0x98, + 0x20, 0x0d, 0xf7, 0xf3, 0xfd, 0x95, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x07, 0x98, 0x03, 0x28, 0x07, + 0xd2, 0x12, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x0e, 0x04, 0x04, 0x07, + 0x07, 0x0e, 0x0c, 0x00, 0x98, 0x07, 0x82, 0x60, + 0xe0, 0x06, 0x99, 0x07, 0x1c, 0x20, 0xf0, 0x00, + 0xfd, 0x51, 0xe0, 0x01, 0x20, 0xff, 0x90, 0x00, + 0x20, 0x04, 0xf7, 0xf3, 0xfd, 0x79, 0x20, 0x0c, + 0xf7, 0xf3, 0xfd, 0x76, 0x04, 0x01, 0x0c, 0x09, + 0x91, 0x08, 0x20, 0x00, 0x90, 0x0c, 0x29, 0x00, + 0xdd, 0x1c, 0x98, 0x0a, 0xf0, 0x00, 0xf9, 0xd6, + 0x1c, 0x02, 0x1c, 0x30, 0xa9, 0x06, 0xf0, 0x00, + 0xfa, 0x39, 0x28, 0x09, 0xd0, 0x37, 0x28, 0x0a, + 0xd0, 0x44, 0x28, 0x56, 0xd1, 0x04, 0x98, 0x00, + 0x28, 0xff, 0xd1, 0x01, 0x98, 0x07, 0x83, 0x60, + 0xa9, 0x06, 0x88, 0x09, 0x98, 0x0c, 0x18, 0x40, + 0x04, 0x00, 0x0c, 0x00, 0x90, 0x0c, 0x99, 0x08, + 0x42, 0x88, 0xdb, 0xe2, 0x98, 0x03, 0x70, 0x38, + 0x98, 0x07, 0x12, 0x00, 0x70, 0x78, 0x98, 0x07, + 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 0x71, 0x38, + 0x20, 0x01, 0x71, 0x78, 0x2d, 0x00, 0xd0, 0x40, + 0x98, 0x02, 0x28, 0x00, 0xd1, 0x0a, 0x20, 0xff, + 0x90, 0x02, 0x9a, 0x04, 0xb4, 0x04, 0x21, 0x03, + 0x98, 0x10, 0x9a, 0x0b, 0x9b, 0x06, 0xf0, 0x00, + 0xfd, 0x30, 0xb0, 0x01, 0x1f, 0x68, 0x12, 0x01, + 0x70, 0xf9, 0x71, 0x38, 0x98, 0x0f, 0x1c, 0x39, + 0x1c, 0x2a, 0xe0, 0x3e, 0xe0, 0x4b, 0x2d, 0x00, + 0xd1, 0x00, 0x25, 0x06, 0x19, 0x78, 0xaa, 0x06, + 0x88, 0x12, 0x1c, 0x31, 0xf0, 0x10, 0xfc, 0x6a, + 0xa8, 0x06, 0x88, 0x00, 0x18, 0x28, 0x04, 0x05, + 0x0c, 0x2d, 0xe7, 0xc1, 0x98, 0x03, 0x28, 0x04, + 0xd0, 0x02, 0x98, 0x03, 0x28, 0x03, 0xd1, 0xbb, + 0x69, 0x60, 0x28, 0x00, 0xd0, 0x09, 0x8b, 0x21, + 0x00, 0xc9, 0x18, 0x40, 0x78, 0xb1, 0x38, 0x06, + 0x70, 0x81, 0x78, 0x71, 0x70, 0x41, 0x78, 0x31, + 0x70, 0x01, 0x22, 0x00, 0x8b, 0x21, 0x00, 0xc9, + 0x69, 0x60, 0x18, 0x40, 0x38, 0x20, 0x77, 0x42, + 0xe7, 0xa6, 0x98, 0x01, 0x28, 0xff, 0xd1, 0x12, + 0x98, 0x02, 0x28, 0x00, 0xd1, 0x0a, 0x20, 0xff, + 0x90, 0x02, 0x9a, 0x04, 0xb4, 0x04, 0x21, 0x03, + 0x98, 0x10, 0x9a, 0x0b, 0x9b, 0x06, 0xf0, 0x00, + 0xfc, 0xec, 0xb0, 0x01, 0x22, 0x05, 0x98, 0x0f, + 0x1c, 0x39, 0xf0, 0x00, 0xfd, 0x24, 0x98, 0x0b, + 0x99, 0x08, 0x18, 0x40, 0x30, 0x06, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x0b, 0x98, 0x0e, 0x99, 0x0b, + 0x42, 0x88, 0xdd, 0x00, 0xe7, 0x3c, 0x7f, 0x20, + 0x23, 0x80, 0x43, 0x18, 0x77, 0x20, 0x9a, 0x04, + 0x07, 0xd0, 0x0e, 0x80, 0x9b, 0x05, 0x18, 0xc0, + 0x77, 0x60, 0x98, 0x02, 0x28, 0xff, 0xd1, 0x03, + 0x99, 0x0f, 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0x20, + 0x20, 0x01, 0xb0, 0x10, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x83, 0x80, + 0x2e, 0x08, 0x85, 0x80, 0xb5, 0xf0, 0x04, 0x09, + 0x0c, 0x09, 0x22, 0x00, 0xb0, 0x88, 0x92, 0x05, + 0xf7, 0xf3, 0xfc, 0xa2, 0x20, 0x08, 0xf7, 0xf3, + 0xfc, 0xbb, 0x20, 0x04, 0xf7, 0xf3, 0xfc, 0xb8, + 0x20, 0x0c, 0xf7, 0xf3, 0xfc, 0xb5, 0x04, 0x05, + 0x0c, 0x2d, 0x20, 0x10, 0xf7, 0xf3, 0xfc, 0xb0, + 0x04, 0x07, 0x0c, 0x3f, 0x20, 0x02, 0xf7, 0xf3, + 0xfc, 0xab, 0x20, 0x05, 0xf7, 0xf3, 0xfc, 0xa8, + 0x20, 0x01, 0xf7, 0xf3, 0xfc, 0xa5, 0x06, 0x04, + 0x0e, 0x24, 0x20, 0x08, 0xf7, 0xf3, 0xfc, 0xa0, + 0x06, 0x06, 0x0e, 0x36, 0x20, 0x08, 0xf7, 0xf3, + 0xfc, 0x9b, 0x20, 0x10, 0xf7, 0xf3, 0xfc, 0x98, + 0x20, 0x10, 0xf7, 0xf3, 0xfc, 0x95, 0x20, 0x08, + 0xf7, 0xf3, 0xfc, 0x92, 0x20, 0x08, 0xf7, 0xf3, + 0xfc, 0x8f, 0x2c, 0x00, 0xd0, 0x65, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0xf4, 0x90, 0x03, 0x4b, 0x44, + 0x42, 0x98, 0xd0, 0x5e, 0x48, 0x43, 0x89, 0x41, + 0x42, 0xb9, 0xd1, 0x5b, 0x68, 0xc0, 0x9a, 0x03, + 0x00, 0xd1, 0x18, 0x89, 0x00, 0x89, 0x18, 0x40, + 0x7f, 0x80, 0x4c, 0x3f, 0x1d, 0xe7, 0x37, 0x39, + 0x28, 0x04, 0xd0, 0x0b, 0x28, 0x05, 0xd0, 0x09, + 0x2e, 0x00, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x04, + 0x2e, 0x01, 0xd1, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x02, 0x72, 0xb8, 0x2d, 0x0f, 0xdd, 0x61, + 0x1f, 0xe8, 0x38, 0x08, 0x90, 0x07, 0x28, 0x00, + 0xdd, 0x5c, 0x48, 0x34, 0x90, 0x06, 0x20, 0x10, + 0xf7, 0xf3, 0xfc, 0x5e, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x04, 0x20, 0x10, 0xf7, 0xf3, 0xfc, 0x58, + 0x20, 0x18, 0xf7, 0xf3, 0xfc, 0x55, 0x90, 0x01, + 0x20, 0x18, 0xf7, 0xf3, 0xfc, 0x51, 0x90, 0x00, + 0x20, 0x03, 0xf7, 0xf3, 0xfc, 0x4d, 0x20, 0x01, + 0xf7, 0xf3, 0xfc, 0x4a, 0x20, 0x0c, 0xf7, 0xf3, + 0xfc, 0x47, 0x04, 0x05, 0x0c, 0x2d, 0x98, 0x05, + 0x19, 0x40, 0x30, 0x0c, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x05, 0x7a, 0xb8, 0x00, 0xc1, 0x1a, 0x09, + 0x00, 0x89, 0x19, 0x09, 0x69, 0x8a, 0x9b, 0x04, + 0x42, 0x9a, 0xd0, 0x2b, 0x26, 0x00, 0x28, 0x00, + 0xd0, 0x01, 0x28, 0x01, 0xd1, 0x0b, 0x98, 0x01, + 0x60, 0xc8, 0x7a, 0xb9, 0x00, 0xcb, 0x1a, 0x59, + 0x00, 0x89, 0x19, 0x09, 0x98, 0x00, 0x61, 0x08, + 0xe0, 0x05, 0xe0, 0x1f, 0xe0, 0x1e, 0x98, 0x01, + 0x63, 0xe0, 0x98, 0x00, 0x64, 0x20, 0x2d, 0x00, + 0xdd, 0x14, 0x98, 0x06, 0x9a, 0x03, 0xa9, 0x02, + 0xf0, 0x00, 0xf8, 0xec, 0x28, 0x4d, 0xd1, 0x06, + 0x7a, 0xb9, 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, + 0x19, 0x09, 0x98, 0x04, 0x61, 0x48, 0xa8, 0x02, + 0x88, 0x00, 0x18, 0x30, 0x04, 0x06, 0x0c, 0x36, + 0x42, 0xae, 0xdb, 0xea, 0x98, 0x07, 0x99, 0x05, + 0x42, 0x88, 0xdc, 0xa4, 0x20, 0x00, 0xb0, 0x08, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x8f, 0x80, + 0x2e, 0x08, 0x90, 0x30, 0x2e, 0x08, 0x89, 0x98, + 0xb5, 0x80, 0x04, 0x09, 0x0c, 0x09, 0xf7, 0xf3, + 0xfb, 0xd7, 0x20, 0x08, 0xf7, 0xf3, 0xfb, 0xf0, + 0x20, 0x04, 0xf7, 0xf3, 0xfb, 0xed, 0x20, 0x0c, + 0xf7, 0xf3, 0xfb, 0xea, 0x20, 0x10, 0xf7, 0xf3, + 0xfb, 0xe7, 0x4f, 0x07, 0x60, 0xf8, 0x20, 0x18, + 0xf7, 0xf3, 0xfb, 0xe2, 0x60, 0xb8, 0x48, 0x05, + 0x78, 0x01, 0x23, 0x20, 0x43, 0x19, 0x70, 0x01, + 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0xcc, 0x2e, 0x08, 0x8f, 0x80, + 0xb5, 0xb0, 0x04, 0x09, 0x0c, 0x09, 0xb0, 0x81, + 0xf7, 0xf3, 0xfb, 0xb2, 0x20, 0x08, 0xf7, 0xf3, + 0xfb, 0xcb, 0x20, 0x04, 0xf7, 0xf3, 0xfb, 0xc8, + 0x20, 0x0c, 0xf7, 0xf3, 0xfb, 0xc5, 0x20, 0x10, + 0xf7, 0xf3, 0xfb, 0xc2, 0x04, 0x00, 0x0c, 0x00, + 0x4f, 0x11, 0x60, 0xf8, 0x20, 0x18, 0xf7, 0xf3, + 0xfb, 0xbb, 0x60, 0xb8, 0x20, 0x04, 0xf7, 0xf3, + 0xfb, 0xb7, 0x20, 0x0c, 0xf7, 0xf3, 0xfb, 0xb4, + 0x04, 0x04, 0x0c, 0x24, 0x27, 0x00, 0x2c, 0x00, + 0xdd, 0x0c, 0x4d, 0x0a, 0x46, 0x69, 0x1c, 0x28, + 0x4a, 0x09, 0xf0, 0x00, 0xf8, 0x7b, 0xa8, 0x00, + 0x88, 0x00, 0x18, 0x38, 0x04, 0x07, 0x0c, 0x3f, + 0x42, 0xa7, 0xdb, 0xf3, 0x20, 0x00, 0xb0, 0x01, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0xcc, 0x2e, 0x08, 0x8a, 0x98, + 0x00, 0x00, 0xff, 0xff, 0xb4, 0x80, 0x04, 0x02, + 0x0c, 0x12, 0x20, 0x00, 0x49, 0x0a, 0x88, 0x49, + 0x29, 0x00, 0xdd, 0x0d, 0x4b, 0x08, 0x68, 0xdf, + 0x00, 0xc3, 0x18, 0x1b, 0x00, 0x9b, 0x18, 0xfb, + 0x89, 0xdb, 0x42, 0x93, 0xd0, 0x05, 0x30, 0x01, + 0x04, 0x00, 0x0c, 0x00, 0x42, 0x81, 0xdc, 0xf3, + 0x48, 0x02, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x8f, 0x80, 0x00, 0x00, 0xff, 0xff, + 0xb4, 0x80, 0x06, 0x0a, 0x0e, 0x12, 0x21, 0x00, + 0x32, 0x01, 0x2a, 0x00, 0xdd, 0x0a, 0x5c, 0x47, + 0x0a, 0x3b, 0xd2, 0x02, 0x20, 0x00, 0xbc, 0x80, + 0x47, 0x70, 0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, + 0x42, 0x8a, 0xdc, 0xf4, 0x20, 0xff, 0xbc, 0x80, + 0x47, 0x70, 0xb4, 0x90, 0x04, 0x02, 0x0c, 0x12, + 0x04, 0x0f, 0x0c, 0x3f, 0x42, 0xba, 0xda, 0x29, + 0x20, 0x00, 0x49, 0x15, 0x00, 0xd3, 0x18, 0x9b, + 0x00, 0x9b, 0x68, 0xcc, 0x18, 0xe4, 0x81, 0xe0, + 0x68, 0xcc, 0x18, 0xe4, 0x77, 0x20, 0x68, 0xcc, + 0x18, 0xe4, 0x60, 0x60, 0x68, 0xcc, 0x50, 0xe0, + 0x68, 0xcc, 0x18, 0xe4, 0x82, 0x20, 0x68, 0xcc, + 0x18, 0xe4, 0x60, 0xa0, 0x68, 0xcc, 0x18, 0xe4, + 0x81, 0xa0, 0x68, 0xcc, 0x18, 0xe4, 0x61, 0x60, + 0x68, 0xcc, 0x18, 0xe4, 0x83, 0x20, 0x68, 0xcc, + 0x18, 0xe4, 0x83, 0x60, 0x68, 0xcc, 0x18, 0xe3, + 0x82, 0x58, 0x32, 0x01, 0x04, 0x12, 0x0c, 0x12, + 0x42, 0xba, 0xdb, 0xd7, 0xbc, 0x90, 0x47, 0x70, + 0x2e, 0x08, 0x8f, 0x80, 0xb5, 0xf0, 0x04, 0x15, + 0x0c, 0x2d, 0x1c, 0x07, 0x20, 0x08, 0x1c, 0x0c, + 0xf7, 0xf3, 0xfb, 0x26, 0x06, 0x06, 0x0e, 0x36, + 0x20, 0x08, 0xf7, 0xf3, 0xfb, 0x21, 0x06, 0x01, + 0x0e, 0x09, 0x1c, 0x88, 0x80, 0x20, 0x2e, 0x48, + 0xd0, 0x42, 0xdc, 0x0c, 0x1e, 0xb0, 0x28, 0x09, + 0xd2, 0x61, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x25, 0x2c, 0x5e, 0x5e, + 0x5e, 0x5e, 0x33, 0x1e, 0x4f, 0x00, 0x2e, 0x56, + 0xd0, 0x4e, 0xdc, 0x0a, 0x2e, 0x4d, 0xd0, 0x36, + 0x2e, 0x4e, 0xd1, 0x51, 0x1c, 0x38, 0x1c, 0x2a, + 0xf0, 0x00, 0xfd, 0x4c, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x2e, 0x58, 0xd0, 0x32, 0x2e, 0x5d, + 0xd1, 0x46, 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, + 0xfc, 0x11, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 0xfb, 0xbc, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, + 0x1c, 0x2a, 0xf0, 0x00, 0xfb, 0xcd, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, 0x1c, 0x2a, + 0xf0, 0x00, 0xfb, 0xd8, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, + 0xfb, 0xe3, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 0xfc, 0x00, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, + 0x1c, 0x2a, 0xf0, 0x00, 0xfc, 0x71, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, 0x1c, 0x2a, + 0xf0, 0x00, 0xfd, 0x6c, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, + 0xfd, 0x97, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 0xfd, 0xb4, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, + 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 0xfd, 0xbe, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, + 0x22, 0x01, 0x20, 0x00, 0xb0, 0x88, 0x4f, 0x35, + 0x88, 0x79, 0x25, 0x00, 0x29, 0x00, 0xdd, 0x35, + 0x00, 0xc4, 0x18, 0x24, 0x00, 0xa4, 0x68, 0xf9, + 0x19, 0x09, 0x7f, 0x0e, 0x0a, 0x33, 0xd2, 0x1d, + 0x09, 0xf3, 0xd2, 0x1b, 0x8a, 0x0b, 0x2b, 0x00, + 0xd0, 0x18, 0x00, 0xc3, 0x18, 0x18, 0x00, 0x80, + 0x68, 0xfa, 0x18, 0x10, 0x8a, 0x02, 0x89, 0xc9, + 0x4b, 0x29, 0x20, 0x02, 0xf0, 0x00, 0xf8, 0x52, + 0x21, 0x00, 0x43, 0xc9, 0x42, 0x88, 0xd1, 0x01, + 0x1c, 0x08, 0xe0, 0x42, 0x68, 0xf8, 0x19, 0x00, + 0x7f, 0x01, 0x23, 0x40, 0x43, 0x19, 0x77, 0x01, + 0x1c, 0x28, 0xe0, 0x3a, 0x8a, 0x0b, 0x2b, 0x00, + 0xd1, 0x02, 0x23, 0xa0, 0x43, 0x33, 0x77, 0x0b, + 0x68, 0xf9, 0x19, 0x09, 0x7f, 0x09, 0x0a, 0x09, + 0xd2, 0x00, 0x22, 0x00, 0x88, 0x79, 0x30, 0x01, + 0x42, 0x81, 0xdc, 0xc9, 0x2a, 0x00, 0xd1, 0x01, + 0x20, 0x02, 0xe0, 0x26, 0x78, 0x38, 0x08, 0x81, + 0xd2, 0x22, 0x23, 0x02, 0x43, 0x18, 0x70, 0x38, + 0x78, 0x38, 0x09, 0x00, 0xd3, 0x02, 0x89, 0x78, + 0xf7, 0xfe, 0xfd, 0x1d, 0x20, 0x0c, 0xab, 0x00, + 0x70, 0x18, 0x88, 0x78, 0x0a, 0x01, 0x70, 0x59, + 0x70, 0x98, 0x46, 0x68, 0x21, 0x20, 0xf7, 0xfd, + 0xf9, 0xa7, 0x78, 0x38, 0x08, 0x81, 0xd3, 0x05, + 0x09, 0x41, 0xd3, 0x03, 0x09, 0x00, 0xd2, 0x01, + 0xf0, 0x00, 0xfa, 0xcd, 0x22, 0x14, 0x21, 0x00, + 0x20, 0x70, 0x1c, 0x2b, 0xf0, 0x00, 0xf8, 0x0a, + 0x20, 0x01, 0xb0, 0x08, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x80, + 0x00, 0x00, 0x13, 0x88, 0xb5, 0xf0, 0x06, 0x04, + 0x0e, 0x24, 0x04, 0x08, 0x0c, 0x00, 0xb0, 0x83, + 0x90, 0x00, 0x04, 0x10, 0x0c, 0x00, 0x90, 0x01, + 0x04, 0x1e, 0x0c, 0x36, 0xb0, 0x89, 0x98, 0x0a, + 0xf0, 0x00, 0xf9, 0x28, 0x90, 0x00, 0x23, 0x01, + 0x42, 0xd8, 0xd1, 0x00, 0xe0, 0x55, 0x98, 0x00, + 0x01, 0x01, 0x91, 0x0b, 0x4f, 0x2b, 0x19, 0xc8, + 0x70, 0x44, 0x9a, 0x09, 0x80, 0x42, 0x5c, 0x7a, + 0x23, 0x01, 0x43, 0x1a, 0x54, 0x7a, 0x99, 0x0a, + 0x80, 0xc1, 0x1c, 0x05, 0x60, 0x86, 0x20, 0x00, + 0x21, 0x00, 0x00, 0x42, 0xab, 0x01, 0x52, 0x99, + 0x30, 0x01, 0x04, 0x00, 0x14, 0x00, 0x28, 0x10, + 0xdb, 0xf6, 0x02, 0x20, 0x23, 0xff, 0x43, 0x18, + 0xab, 0x01, 0x80, 0x18, 0x2c, 0x02, 0xd0, 0x01, + 0x2c, 0x4e, 0xd1, 0x10, 0x20, 0xff, 0x02, 0x00, + 0x9a, 0x09, 0x40, 0x10, 0x23, 0xff, 0x43, 0x18, + 0xab, 0x01, 0x80, 0x58, 0x9a, 0x09, 0x02, 0x10, + 0x23, 0xff, 0x02, 0x1b, 0x40, 0x18, 0x23, 0xff, + 0x43, 0x18, 0xab, 0x02, 0x80, 0x18, 0x21, 0x04, + 0x98, 0x0a, 0xaa, 0x01, 0xf7, 0xf7, 0xfe, 0x98, + 0x04, 0x01, 0x0c, 0x09, 0x81, 0xa9, 0x20, 0x00, + 0x43, 0xc0, 0x42, 0x81, 0xd1, 0x07, 0x21, 0x00, + 0x9a, 0x0b, 0x54, 0xb9, 0x21, 0xff, 0x70, 0x69, + 0x0c, 0x01, 0x81, 0xa9, 0xe0, 0x0d, 0x99, 0x0b, + 0x5c, 0x78, 0x23, 0x02, 0x43, 0x18, 0x54, 0x78, + 0x2e, 0x00, 0xd0, 0x05, 0x22, 0x02, 0x99, 0x00, + 0x1c, 0x30, 0xf7, 0xfe, 0xfb, 0xe0, 0x80, 0xa8, + 0x20, 0x00, 0xb0, 0x0c, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x90, + 0xb5, 0xf0, 0x04, 0x00, 0x14, 0x00, 0x01, 0x05, + 0x4c, 0x10, 0x5d, 0x60, 0x26, 0x00, 0x28, 0x00, + 0xd1, 0x03, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x19, 0x2f, 0x89, 0xb8, 0xf7, 0xf7, + 0xff, 0xe3, 0x22, 0x00, 0x43, 0xd2, 0x21, 0xff, + 0x42, 0x90, 0xd1, 0x07, 0x55, 0x66, 0x70, 0x79, + 0x0c, 0x00, 0x81, 0xb8, 0x1c, 0x10, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x55, 0x66, 0x70, 0x79, + 0x1c, 0x30, 0x49, 0x03, 0x81, 0xb9, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x8f, 0x90, + 0x00, 0x00, 0xff, 0xff, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0xb5, 0xb0, 0x04, 0x0d, + 0x0c, 0x2d, 0x1c, 0x07, 0xb0, 0x84, 0xf0, 0x00, + 0xf8, 0x2d, 0x23, 0x01, 0x42, 0xd8, 0xd1, 0x01, + 0x20, 0x01, 0xe0, 0x15, 0x1c, 0x28, 0xf7, 0xfd, + 0xf9, 0xb1, 0x1c, 0x04, 0xd0, 0x0f, 0x1c, 0x20, + 0x1c, 0x39, 0x1c, 0x2a, 0xf0, 0x10, 0xf8, 0xca, + 0x20, 0x06, 0xab, 0x00, 0x80, 0x18, 0x70, 0x9d, + 0x94, 0x01, 0x46, 0x69, 0x20, 0x85, 0xf7, 0xfd, + 0xf8, 0xeb, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x02, + 0xb0, 0x04, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x06, 0x00, 0x0e, 0x00, 0x28, 0x0a, 0xdd, 0x01, + 0x20, 0xff, 0x47, 0x70, 0x01, 0x00, 0x49, 0x02, + 0x18, 0x40, 0x78, 0x40, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x8f, 0x90, 0xb4, 0x90, 0x21, 0x00, + 0x4b, 0x13, 0x01, 0x0a, 0x5c, 0x9f, 0x2f, 0x00, + 0xd0, 0x18, 0x18, 0xd7, 0x78, 0x7c, 0x78, 0x02, + 0x42, 0x94, 0xd1, 0x13, 0x2a, 0x00, 0xd0, 0x0e, + 0x2a, 0x42, 0xd0, 0x0c, 0x2a, 0x70, 0xd0, 0x0a, + 0x2a, 0x73, 0xd0, 0x08, 0x79, 0x02, 0x78, 0xc4, + 0x02, 0x24, 0x19, 0x12, 0x04, 0x12, 0x0c, 0x12, + 0x88, 0x7f, 0x42, 0x97, 0xd1, 0x02, 0x1c, 0x08, + 0xbc, 0x90, 0x47, 0x70, 0x31, 0x01, 0x04, 0x09, + 0x14, 0x09, 0x29, 0x0a, 0xd1, 0xdd, 0x20, 0x00, + 0x43, 0xc0, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x8f, 0x90, 0xb4, 0xb0, 0x06, 0x03, + 0x0e, 0x1b, 0x04, 0x0f, 0x0c, 0x3f, 0x06, 0x14, + 0x0e, 0x24, 0x20, 0x00, 0x4a, 0x09, 0x01, 0x01, + 0x18, 0x89, 0x78, 0x4d, 0x42, 0x9d, 0xd1, 0x04, + 0x2c, 0x00, 0xd0, 0x09, 0x88, 0x49, 0x42, 0xb9, + 0xd0, 0x06, 0x30, 0x01, 0x04, 0x00, 0x14, 0x00, + 0x28, 0x0a, 0xd1, 0xf0, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0xb0, 0x47, 0x70, 0x2e, 0x08, 0x8f, 0x90, + 0xb4, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, + 0x49, 0x09, 0x01, 0x03, 0x5c, 0xcf, 0x2f, 0x00, + 0xd0, 0x06, 0x18, 0x5b, 0x89, 0x9b, 0x42, 0x93, + 0xd1, 0x02, 0x20, 0xff, 0xbc, 0x80, 0x47, 0x70, + 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x28, 0x0a, + 0xdb, 0xef, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, + 0x2e, 0x08, 0x8f, 0x90, 0x48, 0x0a, 0x21, 0x00, + 0x4a, 0x0a, 0x01, 0x0b, 0x5c, 0xd3, 0x2b, 0x00, + 0xd1, 0x00, 0x1c, 0x08, 0x31, 0x01, 0x04, 0x09, + 0x0c, 0x09, 0x29, 0x0a, 0xdb, 0xf5, 0x4b, 0x04, + 0x42, 0x98, 0xd0, 0x02, 0x04, 0x00, 0x14, 0x00, + 0x47, 0x70, 0x20, 0x00, 0x43, 0xc0, 0x47, 0x70, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x8f, 0x90, + 0xb4, 0x80, 0x04, 0x07, 0x0c, 0x3f, 0x20, 0x00, + 0x49, 0x0b, 0x88, 0x4a, 0x2a, 0x00, 0xdd, 0x10, + 0x68, 0xc9, 0x00, 0xc3, 0x18, 0x1b, 0x00, 0x9b, + 0x18, 0xcb, 0x89, 0xdb, 0x42, 0xbb, 0xd1, 0x05, + 0x00, 0xc3, 0x18, 0x18, 0x00, 0x80, 0x18, 0x08, + 0xbc, 0x80, 0x47, 0x70, 0x30, 0x01, 0x42, 0x82, + 0xdc, 0xef, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, + 0x2e, 0x08, 0x8f, 0x80, 0xb5, 0x90, 0x06, 0x03, + 0x0e, 0x1b, 0x06, 0x0c, 0x0e, 0x24, 0x06, 0x00, + 0x0e, 0x00, 0x01, 0x02, 0x48, 0x16, 0x18, 0x11, + 0x27, 0x00, 0x2c, 0x0a, 0xd0, 0x0c, 0x2c, 0x0b, + 0xd1, 0x06, 0x2b, 0x0a, 0xda, 0x04, 0x54, 0x87, + 0x20, 0xff, 0x70, 0x48, 0x48, 0x11, 0x81, 0x88, + 0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2b, 0x0a, 0xda, 0xf9, 0x5c, 0x84, 0x23, 0x02, + 0x43, 0x23, 0x54, 0x83, 0x78, 0x48, 0x28, 0x00, + 0xd0, 0x0b, 0x28, 0x02, 0xd1, 0xf0, 0x88, 0x48, + 0xf7, 0xff, 0xff, 0xba, 0x28, 0x00, 0xd0, 0xeb, + 0x7f, 0x01, 0x23, 0x10, 0x43, 0x19, 0x77, 0x01, + 0xe7, 0xe6, 0x48, 0x05, 0x78, 0x01, 0x23, 0x40, + 0x43, 0x19, 0x70, 0x01, 0xe7, 0xe0, 0x00, 0x00, + 0x2e, 0x08, 0x8f, 0x90, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x8f, 0x80, 0xb5, 0x90, 0x04, 0x07, + 0x14, 0x3f, 0x2f, 0x0a, 0xda, 0x25, 0x2f, 0x00, + 0xdb, 0x23, 0x01, 0x38, 0x49, 0x17, 0x18, 0x44, + 0x78, 0x60, 0x28, 0x02, 0xd1, 0x0d, 0x88, 0x60, + 0xf7, 0xff, 0xff, 0x96, 0x28, 0x00, 0xd0, 0x08, + 0x7f, 0x01, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x19, + 0x77, 0x01, 0x7f, 0x01, 0x23, 0xa0, 0x43, 0x19, + 0x77, 0x01, 0x78, 0x60, 0x28, 0x42, 0xd1, 0x09, + 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0xa5, 0x4b, 0x0c, + 0x22, 0x11, 0x21, 0x00, 0x20, 0x42, 0xf7, 0xff, + 0xfe, 0x2d, 0xe0, 0x02, 0x1c, 0x38, 0xf7, 0xff, + 0xfe, 0x9b, 0xf7, 0xff, 0xfd, 0xb4, 0x28, 0x00, + 0xd1, 0x03, 0xf7, 0xff, 0xfd, 0xb0, 0x28, 0x00, + 0xd0, 0xfb, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x90, + 0x00, 0x00, 0x27, 0x10, 0xb5, 0xb0, 0x04, 0x05, + 0x0c, 0x2d, 0x24, 0x00, 0x27, 0x00, 0x48, 0x0e, + 0x21, 0x07, 0xf7, 0xfe, 0xff, 0x4b, 0x1c, 0x28, + 0xf7, 0xff, 0xff, 0x5e, 0x28, 0x00, 0xd0, 0x0e, + 0x8a, 0x41, 0x29, 0x00, 0xd0, 0x00, 0x1c, 0x0f, + 0x69, 0x40, 0x28, 0x00, 0xd0, 0x03, 0x88, 0x00, + 0x42, 0x88, 0xd0, 0x00, 0x1c, 0x04, 0x42, 0xbc, + 0xd0, 0x01, 0xf7, 0xf2, 0xf9, 0x27, 0x20, 0x00, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x90, 0x30, 0xb5, 0x90, 0x04, 0x0c, + 0x0c, 0x24, 0x1c, 0x07, 0x69, 0x40, 0x28, 0x00, + 0xd0, 0x06, 0x8b, 0x39, 0x1c, 0x4a, 0x00, 0xd2, + 0x00, 0xc9, 0xf7, 0xfd, 0xf8, 0x4c, 0xe0, 0x02, + 0x20, 0x08, 0xf7, 0xfd, 0xf8, 0x43, 0x61, 0x78, + 0x69, 0x78, 0x28, 0x00, 0xd0, 0x0e, 0x8b, 0x39, + 0x31, 0x01, 0x83, 0x39, 0x8b, 0x39, 0x00, 0xc9, + 0x18, 0x40, 0x38, 0x40, 0x87, 0x04, 0x21, 0x00, + 0x8b, 0x3a, 0x00, 0xd2, 0x69, 0x78, 0x18, 0x80, + 0x38, 0x20, 0x76, 0x81, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0xb4, 0xb0, 0x06, 0x09, 0x0e, 0x09, + 0x04, 0x12, 0x0c, 0x12, 0x06, 0x1b, 0x0e, 0x1b, + 0x9f, 0x03, 0x06, 0x3c, 0x0e, 0x24, 0x27, 0x9f, + 0x70, 0x07, 0x27, 0x80, 0x70, 0x47, 0x27, 0x32, + 0x70, 0x87, 0x27, 0x82, 0x70, 0xc7, 0x27, 0x00, + 0x71, 0x07, 0x25, 0x06, 0x71, 0x45, 0x71, 0x81, + 0x0a, 0x11, 0x71, 0xc1, 0x72, 0x02, 0x08, 0x59, + 0x43, 0x21, 0x72, 0x41, 0x72, 0x87, 0x72, 0xc7, + 0x1c, 0x38, 0xbc, 0xb0, 0x47, 0x70, 0xb5, 0xb0, + 0x04, 0x14, 0x0c, 0x24, 0x1c, 0x07, 0x79, 0x00, + 0x02, 0x00, 0x79, 0x7a, 0x43, 0x10, 0x04, 0x05, + 0x0c, 0x2d, 0x1d, 0xf8, 0x30, 0x05, 0x1c, 0x22, + 0xf0, 0x0f, 0xff, 0x1c, 0x19, 0x28, 0x04, 0x00, + 0x0c, 0x00, 0x12, 0x01, 0x71, 0x39, 0x71, 0x78, + 0x0a, 0x20, 0x72, 0xb8, 0x72, 0xfc, 0x20, 0x00, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, + 0x04, 0x15, 0x0c, 0x2d, 0x1c, 0x07, 0x79, 0x00, + 0x02, 0x00, 0x79, 0x7a, 0x43, 0x10, 0x04, 0x04, + 0x0c, 0x24, 0x19, 0x38, 0x30, 0x06, 0x1c, 0x2a, + 0xf0, 0x0f, 0xff, 0x00, 0x19, 0x60, 0x04, 0x00, + 0x0c, 0x00, 0x12, 0x01, 0x71, 0x39, 0x71, 0x78, + 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf3, 0x79, 0x08, 0x02, 0x00, 0x1c, 0x0f, + 0x79, 0x49, 0x43, 0x08, 0x04, 0x00, 0x0c, 0x00, + 0x25, 0x9f, 0x23, 0x80, 0x22, 0x32, 0x28, 0x80, + 0xda, 0x04, 0x24, 0x04, 0x70, 0xbd, 0x70, 0xfb, + 0x71, 0x3a, 0xe0, 0x07, 0x28, 0xff, 0xda, 0x07, + 0x24, 0x05, 0x70, 0x7d, 0x70, 0xbb, 0x70, 0xfa, + 0x21, 0x81, 0x71, 0x39, 0x71, 0x78, 0xe0, 0x00, + 0x24, 0x06, 0x19, 0x00, 0x1c, 0x06, 0xf7, 0xfc, + 0xff, 0xb5, 0x1c, 0x05, 0xd0, 0x0a, 0x20, 0x06, + 0x1b, 0x00, 0x19, 0xc1, 0x1c, 0x28, 0x1c, 0x32, + 0xf0, 0x0f, 0xfe, 0xcc, 0x98, 0x00, 0x60, 0x85, + 0x98, 0x00, 0x81, 0x86, 0x20, 0x00, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x47, 0x70, + 0xb5, 0xf0, 0x06, 0x12, 0x0e, 0x12, 0xb0, 0x81, + 0x92, 0x00, 0x25, 0x00, 0x1c, 0x04, 0x1c, 0x0f, + 0x28, 0x00, 0xd0, 0x01, 0x2f, 0x00, 0xd1, 0x01, + 0x20, 0x00, 0xe0, 0x34, 0x26, 0x00, 0x1c, 0x20, + 0xf0, 0x0f, 0xff, 0x20, 0x28, 0x00, 0xd9, 0x2a, + 0x5d, 0xa0, 0x28, 0x80, 0xdb, 0x03, 0x28, 0x9f, + 0xdc, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0xff, + 0x9a, 0x00, 0x2a, 0x00, 0xd0, 0x0f, 0x28, 0x87, + 0xd1, 0x01, 0x22, 0xff, 0xe0, 0x00, 0x22, 0x00, + 0x2a, 0x00, 0xd0, 0x10, 0x29, 0x00, 0xd0, 0x0e, + 0x1c, 0x69, 0x04, 0x0a, 0x0c, 0x12, 0x1c, 0x29, + 0x54, 0x78, 0x1c, 0x15, 0xe0, 0x07, 0x29, 0x00, + 0xd0, 0x05, 0x1c, 0x69, 0x04, 0x09, 0x0c, 0x09, + 0x1c, 0x2a, 0x54, 0xb8, 0x1c, 0x0d, 0x1c, 0x70, + 0x04, 0x06, 0x0c, 0x36, 0x1c, 0x20, 0xf0, 0x0f, + 0xfe, 0xf5, 0x42, 0xb0, 0xd8, 0xd4, 0x20, 0x00, + 0x55, 0x78, 0x04, 0x28, 0x14, 0x00, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0xb5, 0xf0, 0x04, 0x0d, 0x0c, 0x2d, 0x26, 0x09, + 0x70, 0x06, 0x1c, 0x07, 0x70, 0x7d, 0x24, 0x00, + 0x2d, 0x00, 0xdd, 0x09, 0x20, 0x08, 0xf7, 0xf2, + 0xff, 0x27, 0x19, 0x39, 0x70, 0x88, 0x1c, 0x60, + 0x06, 0x04, 0x0e, 0x24, 0x42, 0xac, 0xdb, 0xf5, + 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x90, 0x04, 0x0c, 0x0c, 0x24, 0x27, 0x00, + 0x2c, 0x00, 0xdd, 0x07, 0x20, 0x08, 0xf7, 0xf2, + 0xff, 0x13, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, + 0x42, 0xa7, 0xdb, 0xf7, 0x20, 0x02, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x04, 0x0c, + 0x0c, 0x24, 0x27, 0x00, 0x2c, 0x00, 0xdd, 0x07, + 0x20, 0x08, 0xf7, 0xf2, 0xff, 0x01, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0x42, 0xa7, 0xdb, 0xf7, + 0x20, 0x03, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x90, 0x04, 0x0c, 0x0c, 0x24, 0x27, 0x00, + 0x2c, 0x00, 0xdd, 0x07, 0x20, 0x08, 0xf7, 0xf2, + 0xfe, 0xef, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, + 0x42, 0xa7, 0xdb, 0xf7, 0x20, 0x08, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x04, 0x0c, + 0x0c, 0x24, 0x27, 0x00, 0x2c, 0x00, 0xdd, 0x07, + 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0xdd, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0x42, 0xa7, 0xdb, 0xf7, + 0x20, 0x5d, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf0, 0x04, 0x14, 0x0c, 0x24, 0x20, 0x08, + 0xf7, 0xf2, 0xfe, 0xce, 0x4f, 0x37, 0x00, 0xe3, + 0x19, 0x1c, 0x00, 0xa4, 0x68, 0xf9, 0x19, 0x09, + 0x77, 0x88, 0x20, 0x08, 0x1c, 0x26, 0xf7, 0xf2, + 0xfe, 0xc3, 0x06, 0x05, 0x0e, 0x2d, 0x68, 0xf8, + 0x19, 0x80, 0x68, 0x40, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xfc, 0xff, 0x06, 0x1c, 0x68, 0xf7, 0xfc, + 0xfe, 0xdd, 0x68, 0xf9, 0x19, 0x09, 0x60, 0x48, + 0x28, 0x00, 0xd1, 0x0b, 0x26, 0x00, 0x2d, 0x00, + 0xdd, 0x1c, 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0xac, + 0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0x42, 0xae, + 0xdb, 0xf7, 0xe0, 0x13, 0x26, 0x00, 0x2d, 0x00, + 0xdd, 0x0b, 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0xa0, + 0x68, 0xf9, 0x19, 0x09, 0x68, 0x49, 0x55, 0x88, + 0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0x42, 0xae, + 0xdb, 0xf3, 0x21, 0x00, 0x68, 0xf8, 0x19, 0x00, + 0x68, 0x40, 0x55, 0x81, 0x20, 0x08, 0xf7, 0xf2, + 0xfe, 0x8f, 0x06, 0x05, 0x0e, 0x2d, 0x68, 0xf8, + 0x59, 0x00, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfc, + 0xfe, 0xd3, 0x1c, 0x68, 0xf7, 0xfc, 0xfe, 0xaa, + 0x68, 0xf9, 0x51, 0x08, 0x28, 0x00, 0xd1, 0x0b, + 0x27, 0x00, 0x2d, 0x00, 0xdd, 0x1a, 0x20, 0x08, + 0xf7, 0xf2, 0xfe, 0x7a, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0x42, 0xaf, 0xdb, 0xf7, 0xe0, 0x11, + 0x26, 0x00, 0x2d, 0x00, 0xdd, 0x0a, 0x20, 0x08, + 0xf7, 0xf2, 0xfe, 0x6e, 0x68, 0xf9, 0x59, 0x09, + 0x55, 0x88, 0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, + 0x42, 0xae, 0xdb, 0xf4, 0x21, 0x00, 0x68, 0xf8, + 0x59, 0x00, 0x55, 0x81, 0x20, 0x48, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x8f, 0x80, + 0xb5, 0xf0, 0x04, 0x0d, 0x0c, 0x2d, 0x20, 0x18, + 0xf7, 0xf2, 0xfe, 0x56, 0x4f, 0x4e, 0x1d, 0xfc, + 0x34, 0x39, 0x7a, 0xa0, 0x28, 0x00, 0xd0, 0x0e, + 0x28, 0x01, 0xd0, 0x0c, 0x27, 0x00, 0x1e, 0xec, + 0x2c, 0x00, 0xdd, 0x68, 0x20, 0x08, 0xf7, 0xf2, + 0xfe, 0x47, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, + 0x42, 0xbc, 0xdc, 0xf7, 0xe0, 0x84, 0x28, 0x00, + 0xd1, 0x01, 0x21, 0x02, 0xe0, 0x00, 0x21, 0x01, + 0x1c, 0x38, 0xf7, 0xfe, 0xfd, 0x3b, 0x20, 0x08, + 0xf7, 0xf2, 0xfe, 0x36, 0x06, 0x05, 0x0e, 0x2d, + 0x1c, 0x68, 0xf7, 0xfc, 0xfe, 0x57, 0x7a, 0xa1, + 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, 0x50, 0x78, + 0x28, 0x00, 0xd1, 0x0b, 0x26, 0x00, 0x2d, 0x00, + 0xdd, 0x29, 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0x24, + 0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0x42, 0xae, + 0xdb, 0xf7, 0xe0, 0x20, 0x26, 0x00, 0x2d, 0x00, + 0xdd, 0x0d, 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0x18, + 0x7a, 0xa1, 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, + 0x58, 0x79, 0x55, 0x88, 0x1c, 0x70, 0x06, 0x06, + 0x0e, 0x36, 0x42, 0xae, 0xdb, 0xf1, 0x20, 0x00, + 0x7a, 0xa1, 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, + 0x58, 0x79, 0x55, 0x88, 0x7a, 0xa0, 0x00, 0xc3, + 0x1a, 0x18, 0x00, 0x80, 0x58, 0x39, 0x22, 0x00, + 0x1c, 0x08, 0xf7, 0xff, 0xfe, 0x81, 0x20, 0x08, + 0xf7, 0xf2, 0xfd, 0xfa, 0x06, 0x06, 0x0e, 0x36, + 0x1c, 0x70, 0xf7, 0xfc, 0xfe, 0x1b, 0x7a, 0xa1, + 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, 0x19, 0xc9, + 0x60, 0x48, 0x28, 0x00, 0xd1, 0x0c, 0x27, 0x00, + 0x2e, 0x00, 0xdd, 0x08, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0xe7, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, + 0x42, 0xb7, 0xdb, 0xf7, 0xe0, 0x24, 0xe0, 0x23, + 0x25, 0x00, 0x2e, 0x00, 0xdd, 0x0e, 0x20, 0x08, + 0xf7, 0xf2, 0xfd, 0xda, 0x7a, 0xa1, 0x00, 0xcb, + 0x1a, 0x59, 0x00, 0x89, 0x19, 0xc9, 0x68, 0x49, + 0x55, 0x48, 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, + 0x42, 0xb5, 0xdb, 0xf0, 0x20, 0x00, 0x7a, 0xa1, + 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, 0x19, 0xc9, + 0x68, 0x49, 0x55, 0x48, 0x7a, 0xa0, 0x00, 0xc3, + 0x1a, 0x18, 0x00, 0x80, 0x19, 0xc0, 0x68, 0x41, + 0x22, 0x00, 0x1c, 0x08, 0xf7, 0xff, 0xfe, 0x40, + 0x20, 0x4d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x90, 0x30, 0xb5, 0xf0, 0x1c, 0x07, + 0x20, 0x04, 0xb0, 0x81, 0xf7, 0xf2, 0xfd, 0xb0, + 0x20, 0x04, 0xf7, 0xf2, 0xfd, 0xad, 0x20, 0x18, + 0xf7, 0xf2, 0xfd, 0xaa, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0xa7, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, + 0x26, 0x00, 0x28, 0x00, 0xdd, 0x2e, 0x20, 0x08, + 0xf7, 0xf2, 0xfd, 0x9e, 0x04, 0x05, 0x0c, 0x2d, + 0x24, 0x00, 0x2d, 0x00, 0xdd, 0x08, 0x20, 0x08, + 0xf7, 0xf2, 0xfd, 0x96, 0x55, 0x38, 0x1c, 0x60, + 0x04, 0x04, 0x0c, 0x24, 0x42, 0xac, 0xdb, 0xf6, + 0x20, 0x20, 0x55, 0x78, 0x19, 0x70, 0x06, 0x06, + 0x0e, 0x36, 0x20, 0x08, 0xf7, 0xf2, 0xfd, 0x88, + 0x04, 0x04, 0x0c, 0x24, 0x25, 0x00, 0x2c, 0x00, + 0xdd, 0x08, 0x20, 0x08, 0xf7, 0xf2, 0xfd, 0x80, + 0x55, 0x78, 0x1c, 0x68, 0x04, 0x05, 0x0c, 0x2d, + 0x42, 0xa5, 0xdb, 0xf6, 0x20, 0x00, 0x55, 0x38, + 0x19, 0x30, 0x06, 0x06, 0x0e, 0x36, 0x98, 0x00, + 0x42, 0x86, 0xdb, 0xd0, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0x6f, 0x04, 0x05, 0x0c, 0x2d, 0x24, 0x00, + 0x2d, 0x00, 0xdd, 0x08, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0x67, 0x55, 0x38, 0x1c, 0x60, 0x06, 0x04, + 0x0e, 0x24, 0x42, 0xac, 0xdb, 0xf6, 0x20, 0x00, + 0x55, 0x78, 0x20, 0x4e, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x04, 0x0c, + 0x0c, 0x24, 0x26, 0x00, 0x2c, 0x00, 0xdd, 0x24, + 0x4d, 0x14, 0x20, 0x18, 0xf7, 0xf2, 0xfd, 0x50, + 0x68, 0x29, 0x42, 0x88, 0xd1, 0x12, 0x20, 0x06, + 0xf7, 0xf2, 0xfd, 0x4a, 0x20, 0x01, 0xf7, 0xf2, + 0xfd, 0x47, 0x20, 0x01, 0xf7, 0xf2, 0xfd, 0x44, + 0x20, 0x10, 0xf7, 0xf2, 0xfd, 0x41, 0x20, 0x28, + 0xf7, 0xf2, 0xfd, 0x3e, 0x20, 0x10, 0xf7, 0xf2, + 0xfd, 0x3b, 0xe0, 0x08, 0x27, 0x00, 0x20, 0x08, + 0xf7, 0xf2, 0xfd, 0x36, 0x1c, 0x78, 0x04, 0x07, + 0x0c, 0x3f, 0x2f, 0x0a, 0xdb, 0xf7, 0x42, 0xa6, + 0xdb, 0xdb, 0x20, 0x58, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xd0, + 0xb5, 0xb0, 0x1c, 0x07, 0x04, 0x08, 0x0c, 0x00, + 0x24, 0x00, 0x08, 0x85, 0x2d, 0x00, 0xdd, 0x17, + 0x2c, 0x00, 0xd1, 0x0d, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0x1b, 0x70, 0x38, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0x17, 0x70, 0x78, 0x20, 0x08, 0xf7, 0xf2, + 0xfd, 0x13, 0x70, 0xb8, 0x20, 0x08, 0xe0, 0x00, + 0x20, 0x20, 0xf7, 0xf2, 0xfd, 0x0d, 0x1c, 0x60, + 0x06, 0x04, 0x0e, 0x24, 0x42, 0xa5, 0xdc, 0xe7, + 0x20, 0x0a, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x90, 0x04, 0x0c, 0x0c, 0x24, 0x27, 0x00, + 0x2c, 0x00, 0xdd, 0x07, 0x20, 0x08, 0xf7, 0xf2, + 0xfc, 0xfb, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, + 0x42, 0xa7, 0xdb, 0xf7, 0x20, 0x56, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x04, 0x0c, + 0x0c, 0x24, 0x27, 0x00, 0x2c, 0x00, 0xdd, 0x07, + 0x20, 0x08, 0xf7, 0xf2, 0xfc, 0xe9, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0x42, 0xa7, 0xdb, 0xf7, + 0x20, 0xff, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf7, 0x06, 0x0e, 0x0e, 0x36, 0xb0, 0x83, + 0xf0, 0x0c, 0xfc, 0x22, 0x1c, 0x05, 0xd0, 0x05, + 0x00, 0xa8, 0x30, 0x0c, 0xf7, 0xf7, 0xf8, 0x5c, + 0x1c, 0x04, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x22, + 0x95, 0x01, 0x1d, 0xe0, 0x30, 0x05, 0x90, 0x02, + 0x46, 0x6a, 0xb4, 0x04, 0x25, 0x00, 0x98, 0x04, + 0x1c, 0x31, 0xaa, 0x02, 0x1c, 0x2b, 0x1c, 0x27, + 0xf0, 0x0c, 0xf9, 0xc8, 0xb0, 0x01, 0x98, 0x00, + 0x60, 0x38, 0x28, 0x00, 0xd0, 0x0b, 0x99, 0x05, + 0xf0, 0x0c, 0xfb, 0x9e, 0x28, 0x00, 0xd1, 0x02, + 0x60, 0x7d, 0x1c, 0x38, 0xe0, 0x07, 0x68, 0x38, + 0xa9, 0x01, 0xf0, 0x0c, 0xf9, 0xe7, 0x1c, 0x20, + 0xf7, 0xf7, 0xf8, 0x58, 0x1c, 0x28, 0xb0, 0x03, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xff, 0x9c, 0x0b, 0x9d, 0x09, 0x9e, 0x0a, + 0xb0, 0x8c, 0x4a, 0x78, 0x92, 0x0b, 0x49, 0x78, + 0x91, 0x0a, 0x2c, 0x00, 0xd1, 0x0b, 0x20, 0x00, + 0x00, 0x81, 0x9a, 0x0b, 0x58, 0x51, 0x29, 0x00, + 0xd1, 0x01, 0x1c, 0x04, 0xe0, 0x19, 0x30, 0x01, + 0x28, 0x08, 0xdb, 0xf5, 0xe0, 0x15, 0x2c, 0x08, + 0xd8, 0x07, 0x3c, 0x01, 0x00, 0xa0, 0x9a, 0x0b, + 0x58, 0x10, 0x28, 0x00, 0xd0, 0x0d, 0x20, 0x00, + 0xe0, 0xcf, 0x23, 0x20, 0x99, 0x0a, 0x5e, 0xcc, + 0x1c, 0x60, 0x84, 0x08, 0x99, 0x0a, 0x5e, 0xc8, + 0x28, 0x00, 0xd1, 0x02, 0x20, 0x64, 0x99, 0x0a, + 0x84, 0x08, 0x2e, 0x00, 0xd0, 0x03, 0x2e, 0x01, + 0xd1, 0x03, 0x22, 0x01, 0xe0, 0x02, 0x22, 0x00, + 0xe0, 0x00, 0x22, 0x03, 0x92, 0x01, 0x1c, 0x28, + 0xf0, 0x08, 0xfd, 0xd3, 0x90, 0x00, 0x00, 0x80, + 0x30, 0x80, 0xf7, 0xf6, 0xff, 0xf1, 0x1c, 0x07, + 0xd0, 0xdd, 0x98, 0x00, 0x1d, 0xc2, 0x32, 0x79, + 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfc, 0x9e, + 0x98, 0x00, 0x60, 0xf8, 0x1d, 0xf8, 0x30, 0x79, + 0x61, 0x38, 0x98, 0x0e, 0x86, 0x78, 0x98, 0x0f, + 0x86, 0xb8, 0x98, 0x0c, 0x90, 0x02, 0x99, 0x0d, + 0x91, 0x03, 0x9a, 0x0e, 0x18, 0x80, 0x38, 0x01, + 0x90, 0x04, 0x98, 0x0f, 0x18, 0x08, 0x38, 0x01, + 0x90, 0x05, 0xa8, 0x02, 0x1c, 0x29, 0xf0, 0x08, + 0xfd, 0xb3, 0x61, 0x78, 0x9a, 0x01, 0x2a, 0x00, + 0xd0, 0x0e, 0x2a, 0x01, 0xd1, 0x1e, 0x00, 0x80, + 0xf7, 0xf6, 0xff, 0xc6, 0x61, 0xb8, 0x28, 0x00, + 0xd0, 0x04, 0x69, 0x79, 0x00, 0x8a, 0x21, 0x00, + 0xf0, 0x0f, 0xfc, 0x74, 0x20, 0x01, 0xe0, 0x0b, + 0x00, 0x80, 0xf7, 0xf7, 0xf8, 0x01, 0x61, 0xb8, + 0x28, 0x00, 0xd0, 0x04, 0x69, 0x79, 0x00, 0x8a, + 0x21, 0x00, 0xf0, 0x0f, 0xfc, 0x67, 0x20, 0x00, + 0x86, 0x38, 0x23, 0x01, 0x03, 0xdb, 0x69, 0xf8, + 0x43, 0x18, 0xe0, 0x0d, 0x61, 0xbe, 0x0e, 0x36, + 0x06, 0x36, 0x23, 0x0d, 0x06, 0x9b, 0x42, 0xde, + 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x01, + 0x86, 0x38, 0x69, 0xf8, 0x4b, 0x33, 0x40, 0x18, + 0x61, 0xf8, 0x69, 0xb8, 0x28, 0x00, 0xd1, 0x06, + 0x69, 0x78, 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, + 0xf7, 0xf6, 0xff, 0xb4, 0xe7, 0x7f, 0x68, 0xf8, + 0x90, 0x06, 0x69, 0x38, 0x90, 0x07, 0x69, 0x78, + 0x90, 0x08, 0x69, 0xb8, 0x90, 0x09, 0xa8, 0x02, + 0x1c, 0x21, 0x1d, 0xfa, 0x32, 0x01, 0xb4, 0x07, + 0x1c, 0x2a, 0xb4, 0x04, 0x20, 0x00, 0x9a, 0x05, + 0xa9, 0x0a, 0xab, 0x0c, 0xf0, 0x03, 0xf8, 0x8a, + 0xb0, 0x04, 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x5f, 0xe7, 0x63, 0x2d, 0x00, + 0xd0, 0x09, 0x2d, 0x01, 0xd0, 0x07, 0x2d, 0x02, + 0xd0, 0x05, 0x2d, 0x03, 0xd0, 0x03, 0x23, 0x02, + 0x69, 0xf8, 0x43, 0x18, 0x61, 0xf8, 0x85, 0xfc, + 0x2c, 0x08, 0xd2, 0x02, 0x00, 0xa0, 0x9a, 0x0b, + 0x50, 0x17, 0x20, 0x01, 0x24, 0x00, 0x63, 0xf8, + 0x63, 0xbc, 0x85, 0xbd, 0x21, 0x01, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x0c, 0x99, 0x0a, 0x8c, 0x88, + 0x06, 0x01, 0x0e, 0x09, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0xbe, 0x22, 0x00, 0x21, 0x00, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x93, 0x98, 0x18, 0x60, 0x38, + 0x98, 0x18, 0x28, 0x00, 0xd0, 0x06, 0x22, 0x00, + 0x21, 0x03, 0x1c, 0x23, 0x9c, 0x18, 0x1c, 0x38, + 0xf0, 0x0f, 0xfa, 0xaa, 0x68, 0xb8, 0x60, 0x78, + 0x1c, 0x38, 0xb0, 0x0c, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0xdc, + 0x2e, 0x08, 0x1a, 0xdc, 0xff, 0xff, 0x7f, 0xff, + 0xb5, 0x80, 0x1c, 0x07, 0xb0, 0x82, 0x28, 0x00, + 0xd0, 0x13, 0x68, 0x78, 0x28, 0x00, 0xd1, 0x10, + 0x68, 0xb8, 0x90, 0x00, 0x1d, 0xf8, 0x30, 0x05, + 0x90, 0x01, 0x46, 0x69, 0x68, 0x38, 0xf0, 0x0c, + 0xf8, 0xd1, 0x22, 0x0c, 0x21, 0x00, 0x1c, 0x38, + 0xf0, 0x0f, 0xfb, 0xd4, 0x1c, 0x38, 0xf7, 0xf6, + 0xff, 0x3d, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0xb0, 0x84, + 0x28, 0x00, 0xd1, 0x03, 0xb0, 0x04, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x23, 0x00, + 0x49, 0x1d, 0x00, 0x82, 0x58, 0x8c, 0x42, 0xbc, + 0xd1, 0x00, 0x50, 0x8b, 0x30, 0x01, 0x28, 0x08, + 0xdb, 0xf7, 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x00, + 0xf8, 0xbc, 0x68, 0xf8, 0x90, 0x00, 0x69, 0x38, + 0x90, 0x01, 0x69, 0x78, 0x90, 0x02, 0x69, 0xb8, + 0x90, 0x03, 0x46, 0x68, 0x1d, 0xc2, 0x32, 0x01, + 0x46, 0x69, 0x68, 0xb8, 0xf0, 0x03, 0xfb, 0x0e, + 0x6a, 0x38, 0x28, 0x00, 0xd0, 0x03, 0x68, 0x41, + 0x39, 0x01, 0x60, 0x41, 0x30, 0x04, 0x69, 0xf8, + 0x0c, 0x00, 0xd3, 0x0c, 0x23, 0x30, 0x5e, 0xf8, + 0x28, 0x00, 0xd1, 0x03, 0x69, 0xb8, 0xf7, 0xf6, + 0xff, 0x31, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02, + 0x69, 0xb8, 0xf7, 0xf6, 0xfe, 0xfb, 0x22, 0x80, + 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfb, 0x8a, + 0x1c, 0x38, 0xf7, 0xf6, 0xfe, 0xf3, 0xe7, 0xbd, + 0x2e, 0x08, 0x1a, 0xdc, 0x28, 0x00, 0xd0, 0x08, + 0x28, 0x01, 0xd0, 0x08, 0x28, 0x02, 0xd0, 0x08, + 0x28, 0x03, 0xd1, 0x08, 0x20, 0xff, 0x30, 0x01, + 0x47, 0x70, 0x20, 0x02, 0x47, 0x70, 0x20, 0x04, + 0x47, 0x70, 0x20, 0x10, 0x47, 0x70, 0x20, 0x00, + 0x47, 0x70, 0xb5, 0x90, 0x1c, 0x07, 0x06, 0x08, + 0x0e, 0x00, 0x06, 0x14, 0x0e, 0x24, 0x28, 0x00, + 0xd0, 0x0a, 0x21, 0x03, 0x68, 0xb8, 0xf0, 0x04, + 0xfc, 0x15, 0x68, 0xb8, 0x1c, 0x21, 0xf0, 0x04, + 0xfc, 0xbd, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x00, 0x68, 0xb8, 0xf0, 0x04, 0xfc, 0x0a, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, + 0x06, 0x09, 0xd0, 0x02, 0x68, 0x80, 0x21, 0x02, + 0xe0, 0x01, 0x68, 0x80, 0x21, 0x00, 0xf0, 0x04, + 0xfb, 0xfd, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, + 0x06, 0x09, 0x0e, 0x09, 0x28, 0x00, 0xd0, 0x02, + 0x68, 0x80, 0xf0, 0x04, 0xfe, 0x03, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0xb0, 0x23, 0x05, 0x43, 0x18, + 0x4d, 0x08, 0x84, 0xa8, 0x27, 0x00, 0x4c, 0x08, + 0x00, 0xb8, 0x58, 0x20, 0x8c, 0xa9, 0x06, 0x09, + 0x0e, 0x09, 0xf7, 0xff, 0xff, 0xe8, 0x37, 0x01, + 0x2f, 0x08, 0xdb, 0xf5, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xdc, + 0x2e, 0x08, 0x1a, 0xdc, 0x48, 0x01, 0x23, 0x24, + 0x5e, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0xdc, + 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x28, 0x00, + 0xd0, 0x15, 0x6a, 0x20, 0x28, 0x00, 0xd0, 0x06, + 0x42, 0xb8, 0xd0, 0x10, 0x68, 0x41, 0x39, 0x01, + 0x60, 0x41, 0x20, 0x00, 0x62, 0x20, 0x2f, 0x00, + 0xd0, 0x09, 0x68, 0xa0, 0x68, 0x39, 0xf0, 0x0c, + 0xf8, 0x0f, 0x28, 0x00, 0xd1, 0x03, 0x62, 0x27, + 0x68, 0x78, 0x30, 0x01, 0x60, 0x78, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x06, 0x09, + 0xd0, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, + 0x68, 0x80, 0xf0, 0x04, 0xfd, 0x03, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0x1c, 0x0c, + 0xd0, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, + 0x68, 0xb8, 0xf0, 0x04, 0xf8, 0x9b, 0x2c, 0x00, + 0xd0, 0x03, 0x23, 0x01, 0x69, 0xf8, 0x43, 0x18, + 0xe0, 0x02, 0x69, 0xf8, 0x08, 0x40, 0x00, 0x40, + 0x61, 0xf8, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x01, 0x21, 0x07, 0x07, 0x09, 0x63, 0x88, + 0x47, 0x70, 0x00, 0x00, 0xb5, 0x90, 0x9c, 0x03, + 0x9f, 0x04, 0xb0, 0x85, 0x91, 0x00, 0x92, 0x01, + 0x93, 0x02, 0x94, 0x03, 0x97, 0x04, 0x68, 0x80, + 0x46, 0x69, 0xf0, 0x0a, 0xff, 0x5f, 0xb0, 0x05, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, + 0xb0, 0x86, 0x98, 0x06, 0x6a, 0x40, 0x68, 0xc3, + 0x93, 0x05, 0x98, 0x06, 0x6b, 0xc0, 0x01, 0x80, + 0x06, 0x05, 0x0e, 0x2d, 0x95, 0x00, 0x68, 0x18, + 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, + 0x08, 0xc0, 0x90, 0x04, 0x99, 0x07, 0x68, 0x48, + 0x99, 0x04, 0x43, 0x48, 0x99, 0x07, 0x68, 0x09, + 0x08, 0xc9, 0x18, 0x0f, 0x97, 0x03, 0x21, 0x00, + 0x91, 0x02, 0x9b, 0x05, 0x68, 0x58, 0x28, 0x00, + 0xdd, 0x5e, 0x23, 0x32, 0x98, 0x06, 0x5e, 0xc0, + 0x9b, 0x09, 0x43, 0x58, 0x9a, 0x08, 0x18, 0x81, + 0x1c, 0x08, 0xd5, 0x00, 0x30, 0x03, 0x10, 0x80, + 0x29, 0x00, 0xda, 0x04, 0x42, 0x49, 0x07, 0x89, + 0x0f, 0x89, 0x42, 0x49, 0xe0, 0x01, 0x07, 0x89, + 0x0f, 0x89, 0x00, 0x4a, 0x9d, 0x00, 0x41, 0x15, + 0x1c, 0x2b, 0x06, 0x2d, 0x0e, 0x2d, 0x27, 0xc0, + 0x40, 0xd7, 0x06, 0x3a, 0x0e, 0x12, 0x9b, 0x06, + 0x69, 0x9b, 0x18, 0x18, 0x9b, 0x05, 0x9f, 0x03, + 0x19, 0xdb, 0x33, 0x88, 0x78, 0x1f, 0x33, 0x01, + 0x93, 0x01, 0x24, 0x00, 0x9b, 0x07, 0x68, 0x9b, + 0x2b, 0x00, 0xd9, 0x23, 0x0a, 0x3b, 0xd3, 0x05, + 0x78, 0x03, 0x43, 0x93, 0x70, 0x03, 0x78, 0x03, + 0x43, 0x2b, 0x70, 0x03, 0x31, 0x01, 0x29, 0x03, + 0xdd, 0x04, 0x22, 0xc0, 0x21, 0x00, 0x9d, 0x00, + 0x30, 0x01, 0xe0, 0x05, 0x10, 0x92, 0x06, 0x12, + 0x0e, 0x12, 0x10, 0xab, 0x06, 0x1d, 0x0e, 0x2d, + 0x00, 0x7b, 0x06, 0x1f, 0x0e, 0x3f, 0x34, 0x01, + 0x07, 0x63, 0xd1, 0x03, 0x9b, 0x01, 0x78, 0x1f, + 0x33, 0x01, 0x93, 0x01, 0x9b, 0x07, 0x68, 0x9b, + 0x42, 0xa3, 0xd8, 0xdb, 0x98, 0x04, 0x9f, 0x03, + 0x18, 0x3f, 0x97, 0x03, 0x9b, 0x09, 0x33, 0x01, + 0x93, 0x09, 0x99, 0x02, 0x31, 0x01, 0x91, 0x02, + 0x9b, 0x05, 0x68, 0x58, 0x42, 0x88, 0xdc, 0xa0, + 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0xff, 0xb0, 0x86, 0x98, 0x06, + 0x6a, 0x40, 0x68, 0xc3, 0x93, 0x05, 0x98, 0x06, + 0x6b, 0xc0, 0x07, 0x06, 0x0f, 0x36, 0x96, 0x00, + 0x01, 0x30, 0x06, 0x06, 0x0e, 0x36, 0x96, 0x01, + 0x68, 0x18, 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, + 0x01, 0x40, 0x08, 0xc0, 0x90, 0x04, 0x68, 0x48, + 0x9a, 0x04, 0x43, 0x50, 0x68, 0x0a, 0x08, 0xd2, + 0x18, 0x17, 0x97, 0x03, 0x22, 0x00, 0x92, 0x02, + 0x9b, 0x05, 0x68, 0x58, 0x28, 0x00, 0xdd, 0x48, + 0x23, 0x32, 0x98, 0x06, 0x5e, 0xc0, 0x9b, 0x09, + 0x43, 0x58, 0x9a, 0x08, 0x18, 0x82, 0x1c, 0x10, + 0xd5, 0x00, 0x30, 0x01, 0x10, 0x40, 0x9b, 0x06, + 0x69, 0x9b, 0x18, 0x18, 0x9b, 0x05, 0x9f, 0x03, + 0x19, 0xdb, 0x1d, 0xdd, 0x35, 0x81, 0x78, 0x2f, + 0x24, 0x00, 0x68, 0x8b, 0x35, 0x01, 0x2b, 0x00, + 0xd9, 0x21, 0x0a, 0x3b, 0xd3, 0x10, 0x08, 0x53, + 0xd3, 0x06, 0x78, 0x06, 0x23, 0xf0, 0x40, 0x33, + 0x70, 0x03, 0x78, 0x03, 0x9e, 0x00, 0xe0, 0x05, + 0x78, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 0x70, 0x03, + 0x78, 0x03, 0x9e, 0x01, 0x43, 0x33, 0x70, 0x03, + 0x32, 0x01, 0x08, 0x53, 0xd2, 0x00, 0x30, 0x01, + 0x00, 0x7b, 0x06, 0x1f, 0x0e, 0x3f, 0x34, 0x01, + 0x07, 0x63, 0xd1, 0x01, 0x78, 0x2f, 0x35, 0x01, + 0x68, 0x8b, 0x42, 0xa3, 0xd8, 0xdd, 0x98, 0x04, + 0x9f, 0x03, 0x18, 0x3f, 0x97, 0x03, 0x9b, 0x09, + 0x33, 0x01, 0x93, 0x09, 0x9a, 0x02, 0x32, 0x01, + 0x92, 0x02, 0x9b, 0x05, 0x68, 0x58, 0x42, 0x90, + 0xdc, 0xb6, 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0xb0, 0x83, + 0x98, 0x03, 0x6a, 0x40, 0x68, 0xc4, 0x98, 0x03, + 0x6b, 0xc0, 0x06, 0x03, 0x0e, 0x1b, 0x93, 0x00, + 0x68, 0x20, 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, + 0x01, 0x40, 0x08, 0xc2, 0x92, 0x02, 0x68, 0x48, + 0x43, 0x50, 0x68, 0x0a, 0x08, 0xd2, 0x18, 0x10, + 0x90, 0x01, 0x25, 0x00, 0x68, 0x60, 0x28, 0x00, + 0xdd, 0x35, 0x23, 0x32, 0x98, 0x03, 0x5e, 0xc0, + 0x9b, 0x06, 0x43, 0x58, 0x9a, 0x05, 0x18, 0x80, + 0x9a, 0x03, 0x69, 0x92, 0x18, 0x17, 0x98, 0x01, + 0x18, 0x20, 0x1d, 0xc6, 0x36, 0x81, 0x78, 0x32, + 0x20, 0x00, 0x68, 0x8b, 0x36, 0x01, 0x2b, 0x00, + 0xd9, 0x16, 0x0a, 0x13, 0xd3, 0x01, 0x9b, 0x00, + 0x70, 0x3b, 0x00, 0x52, 0x06, 0x12, 0x0e, 0x12, + 0xd1, 0x09, 0x1d, 0xc2, 0x32, 0x01, 0x08, 0xd2, + 0x00, 0xd2, 0x1a, 0x10, 0x19, 0xc7, 0x1c, 0x10, + 0x78, 0x32, 0x36, 0x01, 0xe0, 0x01, 0x30, 0x01, + 0x37, 0x01, 0x68, 0x8b, 0x42, 0x83, 0xd8, 0xe8, + 0x98, 0x01, 0x9a, 0x02, 0x18, 0x80, 0x90, 0x01, + 0x9b, 0x06, 0x33, 0x01, 0x93, 0x06, 0x68, 0x60, + 0x35, 0x01, 0x42, 0xa8, 0xdc, 0xc9, 0xb0, 0x03, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xff, 0x23, 0x2c, 0x1c, 0x07, 0x5e, 0xc0, + 0xb0, 0x85, 0x28, 0x01, 0xd0, 0x0f, 0x28, 0x02, + 0xd0, 0x07, 0x28, 0x03, 0xd1, 0x11, 0xab, 0x06, + 0xcb, 0x0e, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x9a, + 0xe0, 0x5d, 0xab, 0x06, 0xcb, 0x0e, 0x1c, 0x38, + 0xf7, 0xff, 0xff, 0x23, 0xe0, 0x57, 0xab, 0x06, + 0xcb, 0x0e, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x97, + 0xe0, 0x51, 0x6a, 0x78, 0x68, 0xc0, 0x90, 0x04, + 0x68, 0x00, 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, + 0x01, 0x40, 0x08, 0xc0, 0x90, 0x03, 0x99, 0x06, + 0x68, 0x48, 0x99, 0x03, 0x43, 0x48, 0x99, 0x06, + 0x68, 0x09, 0x08, 0xc9, 0x18, 0x09, 0x91, 0x02, + 0x21, 0x00, 0x91, 0x01, 0x98, 0x04, 0x68, 0x40, + 0x28, 0x00, 0xdd, 0x38, 0x98, 0x04, 0x99, 0x02, + 0x9e, 0x07, 0x18, 0x40, 0x30, 0x88, 0x78, 0x05, + 0x30, 0x01, 0x90, 0x00, 0x24, 0x00, 0x99, 0x06, + 0x68, 0x88, 0x28, 0x00, 0xd9, 0x1d, 0x0a, 0x28, + 0xd3, 0x05, 0x68, 0xb8, 0x6b, 0xfb, 0x9a, 0x08, + 0x1c, 0x31, 0xf0, 0x0a, 0xfb, 0x7d, 0x00, 0x68, + 0x06, 0x05, 0x0e, 0x2d, 0xd1, 0x0b, 0x1d, 0xe0, + 0x30, 0x01, 0x08, 0xc0, 0x00, 0xc0, 0x1b, 0x01, + 0x19, 0x8e, 0x1c, 0x04, 0x98, 0x00, 0x78, 0x05, + 0x30, 0x01, 0x90, 0x00, 0xe0, 0x01, 0x34, 0x01, + 0x36, 0x01, 0x99, 0x06, 0x68, 0x88, 0x42, 0xa0, + 0xd8, 0xe1, 0x98, 0x03, 0x99, 0x02, 0x18, 0x09, + 0x91, 0x02, 0x9a, 0x08, 0x32, 0x01, 0x92, 0x08, + 0x99, 0x01, 0x31, 0x01, 0x91, 0x01, 0x98, 0x04, + 0x68, 0x40, 0x42, 0x88, 0xdc, 0xc6, 0xb0, 0x05, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x90, 0x1c, 0x07, 0x20, 0x00, 0xb0, 0x88, + 0xf0, 0x08, 0xfa, 0x2b, 0x90, 0x06, 0x00, 0x80, + 0x30, 0x10, 0x00, 0x80, 0xf7, 0xf6, 0xfc, 0x48, + 0x1c, 0x04, 0x20, 0x00, 0x2c, 0x00, 0xd1, 0x03, + 0xb0, 0x08, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x1d, 0xe1, 0x31, 0x09, 0x91, 0x07, 0x49, 0x19, + 0x68, 0x4b, 0x1c, 0x5a, 0x60, 0x4a, 0x60, 0x63, + 0x60, 0xe7, 0x68, 0x39, 0x01, 0x09, 0x31, 0x1f, + 0x09, 0x49, 0x01, 0x49, 0x90, 0x00, 0x90, 0x01, + 0x1e, 0x48, 0x90, 0x02, 0x68, 0xe0, 0x68, 0x40, + 0x00, 0xc0, 0x38, 0x01, 0x90, 0x03, 0x46, 0x68, + 0x21, 0x00, 0xf0, 0x08, 0xfa, 0x09, 0x60, 0xa0, + 0x68, 0xe0, 0x30, 0x88, 0x90, 0x05, 0x68, 0xa0, + 0x90, 0x04, 0x46, 0x68, 0x1c, 0x22, 0x68, 0x61, + 0xb4, 0x07, 0x22, 0x00, 0xb4, 0x04, 0x22, 0x01, + 0x20, 0x00, 0xa9, 0x0a, 0xab, 0x08, 0xf0, 0x02, + 0xfd, 0x21, 0xb0, 0x04, 0x28, 0x00, 0xd0, 0x03, + 0x1c, 0x20, 0xf7, 0xf6, 0xfc, 0x2f, 0x24, 0x00, + 0x1c, 0x20, 0xe7, 0xc5, 0x2e, 0x08, 0x1b, 0x04, + 0xb5, 0x80, 0x1c, 0x07, 0xb0, 0x84, 0x28, 0x00, + 0xd0, 0x1a, 0x20, 0x00, 0xf0, 0x08, 0xf9, 0xdd, + 0x90, 0x00, 0x1d, 0xf8, 0x30, 0x09, 0x90, 0x01, + 0x68, 0xb8, 0x90, 0x02, 0x68, 0xf8, 0x30, 0x88, + 0x90, 0x03, 0x46, 0x68, 0x46, 0x69, 0x1d, 0xc2, + 0x32, 0x01, 0x68, 0x38, 0xf0, 0x03, 0xf8, 0x0e, + 0x22, 0x10, 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, + 0xf8, 0xa1, 0x1c, 0x38, 0xf7, 0xf6, 0xfc, 0x0a, + 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xff, 0x23, 0x32, 0x1c, 0x07, 0x5e, 0xc0, + 0x1c, 0x0c, 0x1c, 0x15, 0xb0, 0x8a, 0x42, 0x90, + 0xdd, 0x63, 0x6a, 0x78, 0x28, 0x00, 0xd1, 0x0b, + 0x4e, 0x38, 0x68, 0x30, 0x28, 0x00, 0xd1, 0x05, + 0x48, 0x37, 0xf7, 0xff, 0xff, 0x7d, 0x60, 0x30, + 0x28, 0x00, 0xd0, 0x61, 0x68, 0x30, 0x62, 0x78, + 0x23, 0x01, 0x6b, 0xb8, 0x6a, 0x79, 0x42, 0xd8, + 0xd1, 0x01, 0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, + 0x92, 0x01, 0x68, 0xc8, 0x90, 0x00, 0x68, 0x00, + 0x90, 0x04, 0x98, 0x00, 0x68, 0x40, 0x90, 0x03, + 0x6b, 0xf8, 0x28, 0x01, 0xd1, 0x01, 0x90, 0x02, + 0xe0, 0x11, 0x20, 0x00, 0x90, 0x02, 0x9a, 0x01, + 0x2a, 0x00, 0xd1, 0x0c, 0x1c, 0x20, 0xf0, 0x00, + 0xf8, 0x57, 0x6b, 0xba, 0x99, 0x03, 0xb4, 0x06, + 0x1c, 0x03, 0x9a, 0x0f, 0x1c, 0x38, 0x1c, 0x29, + 0xf7, 0xff, 0xfd, 0x80, 0xb0, 0x02, 0x99, 0x03, + 0x91, 0x08, 0x20, 0x01, 0x90, 0x09, 0x78, 0x20, + 0x28, 0x00, 0xd0, 0x31, 0x23, 0x32, 0x5e, 0xf8, + 0x42, 0xa8, 0xdd, 0x22, 0x78, 0x20, 0x99, 0x00, + 0xf0, 0x00, 0xf8, 0x34, 0x90, 0x07, 0x1c, 0x06, + 0x78, 0x20, 0x07, 0x00, 0x0f, 0x00, 0x99, 0x04, + 0x43, 0x48, 0x90, 0x05, 0x78, 0x20, 0x09, 0x00, + 0x07, 0x40, 0x0f, 0x40, 0x99, 0x03, 0x43, 0x48, + 0x90, 0x06, 0x98, 0x02, 0x34, 0x01, 0x28, 0x00, + 0xd0, 0x0c, 0x99, 0x0d, 0x9a, 0x01, 0xb4, 0x06, + 0x6a, 0x78, 0x68, 0xb9, 0x68, 0x00, 0xaa, 0x07, + 0x1c, 0x2b, 0xf0, 0x0a, 0xfd, 0x81, 0xb0, 0x02, + 0xe0, 0x06, 0xe0, 0x09, 0x9b, 0x0d, 0x1c, 0x38, + 0xa9, 0x05, 0x1c, 0x2a, 0xf7, 0xff, 0xfe, 0xa8, + 0x19, 0xad, 0x78, 0x20, 0x28, 0x00, 0xd1, 0xcd, + 0xb0, 0x0a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1b, 0x04, + 0x2e, 0x03, 0x45, 0xb8, 0x29, 0x00, 0xd1, 0x00, + 0x49, 0x02, 0x06, 0x40, 0x0e, 0x40, 0x18, 0x40, + 0x7a, 0x00, 0x47, 0x70, 0x2e, 0x03, 0x45, 0xb8, + 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0xd1, 0x08, + 0x4f, 0x0c, 0x68, 0x38, 0x28, 0x00, 0xd1, 0x03, + 0x48, 0x0b, 0xf7, 0xff, 0xfe, 0xf9, 0x60, 0x38, + 0x68, 0x3f, 0x25, 0x00, 0x78, 0x20, 0x28, 0x00, + 0xd0, 0x08, 0x78, 0x20, 0x68, 0xf9, 0x34, 0x01, + 0xf7, 0xff, 0xff, 0xe0, 0x19, 0x45, 0x78, 0x20, + 0x28, 0x00, 0xd1, 0xf6, 0x1c, 0x28, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1b, 0x04, + 0x2e, 0x03, 0x45, 0xb8, 0xb5, 0x80, 0x28, 0x00, + 0xd1, 0x08, 0x4f, 0x09, 0x68, 0x38, 0x28, 0x00, + 0xd1, 0x03, 0x48, 0x08, 0xf7, 0xff, 0xfe, 0xd8, + 0x60, 0x38, 0x68, 0x38, 0x28, 0x00, 0xd1, 0x02, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xc0, + 0x68, 0x40, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1b, 0x04, 0x2e, 0x03, 0x45, 0xb8, + 0xb5, 0xf0, 0xb0, 0x83, 0x4a, 0x18, 0x21, 0x00, + 0x20, 0xff, 0x30, 0x01, 0xf7, 0xff, 0xfa, 0xac, + 0x49, 0x16, 0x27, 0x00, 0x64, 0x08, 0x49, 0x16, + 0x91, 0x02, 0x49, 0x16, 0x91, 0x01, 0x49, 0x16, + 0x91, 0x00, 0x4c, 0x16, 0x01, 0x38, 0x06, 0x01, + 0x0e, 0x09, 0x20, 0x10, 0x1c, 0x22, 0x1c, 0x0d, + 0xf7, 0xff, 0xfa, 0x9a, 0x00, 0xbe, 0x99, 0x02, + 0x51, 0x88, 0x20, 0x04, 0x1c, 0x29, 0x1c, 0x22, + 0xf7, 0xff, 0xfa, 0x92, 0x99, 0x01, 0x51, 0x88, + 0x20, 0x02, 0x1c, 0x29, 0x1c, 0x22, 0xf7, 0xff, + 0xfa, 0x8b, 0x99, 0x00, 0x51, 0x88, 0x37, 0x01, + 0x2f, 0x08, 0xdb, 0xe3, 0x20, 0x00, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1b, 0x4c, 0x2e, 0x08, 0x1d, 0x0c, + 0x2e, 0x08, 0x92, 0xbc, 0x2e, 0x08, 0x92, 0xdc, + 0x2e, 0x08, 0x92, 0xfc, 0x2e, 0x08, 0x1b, 0x0c, + 0xb5, 0x80, 0x48, 0x0c, 0xf7, 0xff, 0xfe, 0x84, + 0x4f, 0x0b, 0x64, 0x78, 0x48, 0x0b, 0xf7, 0xff, + 0xfe, 0x7f, 0x64, 0xb8, 0x48, 0x0a, 0xf7, 0xff, + 0xfe, 0x7b, 0x64, 0xf8, 0x20, 0x00, 0x22, 0x00, + 0x49, 0x08, 0x00, 0x83, 0x50, 0xca, 0x30, 0x01, + 0x28, 0x10, 0xdb, 0xfa, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0xcc, 0xa0, + 0x2e, 0x08, 0x1d, 0x0c, 0x2e, 0x03, 0x03, 0x2c, + 0x2e, 0x03, 0x45, 0xb8, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0x90, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, + 0x29, 0x00, 0xd0, 0x0b, 0x29, 0x0f, 0xdc, 0x09, + 0x00, 0x8c, 0x4f, 0x06, 0x59, 0x39, 0x29, 0x00, + 0xd0, 0x04, 0x1c, 0x08, 0xf7, 0xff, 0xfb, 0x91, + 0x20, 0x00, 0x51, 0x38, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0xff, 0x04, 0x05, 0x0c, 0x2d, 0x04, 0x10, + 0x0c, 0x00, 0xb0, 0x82, 0x90, 0x00, 0x04, 0x18, + 0x0c, 0x00, 0x90, 0x01, 0x2d, 0x00, 0xd0, 0x01, + 0x2d, 0x0f, 0xdd, 0x01, 0x20, 0xff, 0xe0, 0x53, + 0x00, 0xaf, 0x4c, 0x2c, 0x59, 0xe0, 0x28, 0x00, + 0xd0, 0x02, 0x1c, 0x28, 0xf7, 0xff, 0xff, 0xd0, + 0x98, 0x00, 0x4a, 0x29, 0x40, 0x02, 0x92, 0x00, + 0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9a, 0xdd, 0x01, + 0x1c, 0x1a, 0x93, 0x00, 0x23, 0x09, 0x01, 0x9b, + 0x98, 0x01, 0x42, 0x98, 0xdd, 0x01, 0x1c, 0x1a, + 0x93, 0x00, 0x2d, 0x08, 0xda, 0x01, 0x20, 0x00, + 0xe0, 0x00, 0x20, 0x01, 0x22, 0x00, 0x21, 0x00, + 0xb4, 0x07, 0x9a, 0x06, 0xb4, 0x04, 0x20, 0x00, + 0x9a, 0x04, 0x9b, 0x05, 0xf7, 0xff, 0xfa, 0x38, + 0x51, 0xe0, 0xb0, 0x04, 0x1c, 0x01, 0xd0, 0xd1, + 0x48, 0x18, 0x6c, 0x82, 0x62, 0x4a, 0x21, 0x01, + 0x59, 0xe2, 0x63, 0xd1, 0x21, 0x00, 0x43, 0xc9, + 0x59, 0xe2, 0x63, 0x91, 0x99, 0x03, 0x29, 0x08, + 0xd2, 0x10, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x06, 0x08, 0x0b, + 0x04, 0x06, 0x08, 0x0b, 0x48, 0x0e, 0xe0, 0x02, + 0x48, 0x0e, 0xe0, 0x00, 0x48, 0x0e, 0x59, 0xc6, + 0xe0, 0x00, 0x6c, 0x06, 0x59, 0xe0, 0x1c, 0x31, + 0xf7, 0xff, 0xfb, 0xd6, 0x59, 0xe0, 0x68, 0x80, + 0x21, 0x07, 0xf0, 0x04, 0xf9, 0xb3, 0x20, 0x00, + 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0x00, 0x00, 0xff, 0xfe, 0x2e, 0x08, 0x1d, 0x0c, + 0x2e, 0x08, 0x92, 0xfc, 0x2e, 0x08, 0x92, 0xdc, + 0x2e, 0x08, 0x92, 0xbc, 0xb5, 0xf0, 0x04, 0x00, + 0x0c, 0x00, 0x04, 0x09, 0x14, 0x09, 0x04, 0x16, + 0x14, 0x36, 0xb0, 0x85, 0x28, 0x07, 0xdc, 0x29, + 0x00, 0x84, 0x4f, 0x21, 0x59, 0x38, 0x28, 0x00, + 0xd0, 0x24, 0x08, 0x49, 0x00, 0x49, 0x04, 0x0d, + 0x14, 0x2d, 0x68, 0x80, 0xa9, 0x01, 0xf0, 0x04, + 0xfa, 0x61, 0x98, 0x01, 0x19, 0x40, 0x90, 0x01, + 0x98, 0x03, 0x19, 0x40, 0x90, 0x03, 0x98, 0x02, + 0x19, 0x80, 0x90, 0x02, 0x98, 0x04, 0x19, 0x80, + 0x90, 0x04, 0x98, 0x01, 0x49, 0x15, 0x42, 0x88, + 0xd8, 0x0c, 0x98, 0x02, 0x42, 0x88, 0xd8, 0x09, + 0x23, 0x2d, 0x01, 0x1b, 0x98, 0x01, 0x42, 0x98, + 0xda, 0x04, 0x23, 0x09, 0x01, 0x9b, 0x98, 0x02, + 0x42, 0x98, 0xdb, 0x01, 0x20, 0xff, 0xe0, 0x12, + 0x59, 0x38, 0x68, 0x80, 0xa9, 0x01, 0xf0, 0x02, + 0xf8, 0x31, 0x59, 0x38, 0x68, 0x80, 0x46, 0x69, + 0xf0, 0x03, 0xff, 0x00, 0x98, 0x00, 0x28, 0x00, + 0xd1, 0x04, 0x59, 0x38, 0x68, 0x80, 0x21, 0x01, + 0xf0, 0x03, 0xfc, 0x44, 0x20, 0x00, 0xb0, 0x05, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x92, 0x7c, 0x80, 0x00, 0x00, 0x00, + 0xb5, 0xf0, 0x04, 0x07, 0x0c, 0x3f, 0x04, 0x0b, + 0x0c, 0x1b, 0x04, 0x16, 0x0c, 0x36, 0x20, 0xff, + 0xb0, 0x85, 0x2f, 0x07, 0xdc, 0x10, 0x00, 0xbc, + 0x4f, 0x1c, 0x59, 0x39, 0x29, 0x00, 0xd0, 0x0b, + 0x08, 0x5a, 0x00, 0x52, 0x04, 0x15, 0x0c, 0x2d, + 0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9d, 0xda, 0x03, + 0x23, 0x09, 0x01, 0x9b, 0x42, 0x9e, 0xdb, 0x03, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x68, 0x88, 0xa9, 0x01, 0xf0, 0x04, 0xfa, 0x02, + 0x98, 0x03, 0x99, 0x01, 0x1a, 0x40, 0x90, 0x03, + 0x19, 0x40, 0x90, 0x03, 0x98, 0x04, 0x99, 0x02, + 0x1a, 0x40, 0x90, 0x04, 0x19, 0x80, 0x90, 0x04, + 0x95, 0x01, 0x96, 0x02, 0x59, 0x38, 0x68, 0x80, + 0xa9, 0x01, 0xf0, 0x01, 0xff, 0xe3, 0x59, 0x38, + 0x68, 0x80, 0x46, 0x69, 0xf0, 0x03, 0xfe, 0xb2, + 0x98, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x59, 0x38, + 0x68, 0x80, 0x21, 0x01, 0xf0, 0x03, 0xfb, 0xf6, + 0x20, 0x00, 0xe7, 0xd5, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x80, + 0x49, 0x04, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x03, + 0x68, 0x80, 0x21, 0x00, 0xf0, 0x03, 0xfb, 0xe6, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0x80, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, + 0x29, 0x07, 0xdc, 0x0c, 0x29, 0x01, 0xdb, 0x0a, + 0x00, 0x88, 0x49, 0x06, 0x58, 0x08, 0x27, 0x00, + 0x28, 0x00, 0xd0, 0x03, 0x68, 0x80, 0x21, 0x01, + 0xf0, 0x03, 0xfa, 0x2c, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x92, 0x7c, + 0x04, 0x01, 0x0c, 0x09, 0x20, 0x00, 0x29, 0x0f, + 0xdc, 0x06, 0x00, 0x89, 0x4a, 0x03, 0x58, 0x51, + 0x29, 0x00, 0xd0, 0x01, 0x23, 0x32, 0x5e, 0xc8, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0x04, 0x01, 0x0c, 0x09, 0x20, 0x00, 0x29, 0x0f, + 0xdc, 0x06, 0x00, 0x89, 0x4a, 0x03, 0x58, 0x51, + 0x29, 0x00, 0xd0, 0x01, 0x23, 0x34, 0x5e, 0xc8, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0xb0, 0x04, 0x03, 0x0c, 0x1b, 0x04, 0x0a, + 0x0c, 0x12, 0x20, 0xff, 0x2b, 0x07, 0xdc, 0x10, + 0x00, 0x9d, 0x4f, 0x09, 0x59, 0x79, 0x29, 0x00, + 0xd0, 0x0b, 0x07, 0x14, 0x0f, 0x24, 0x68, 0x88, + 0x21, 0x03, 0xf0, 0x03, 0xfe, 0x9b, 0x59, 0x78, + 0x68, 0x80, 0x1c, 0x21, 0xf0, 0x03, 0xff, 0x42, + 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x92, 0x7c, 0xb5, 0x00, 0x04, 0x01, + 0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x09, + 0x00, 0x89, 0x4a, 0x05, 0x58, 0x51, 0x29, 0x00, + 0xd0, 0x04, 0x68, 0x88, 0x21, 0x02, 0xf0, 0x03, + 0xfe, 0x81, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x92, 0x7c, 0xb5, 0x00, 0x04, 0x01, + 0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x09, + 0x00, 0x89, 0x4a, 0x05, 0x58, 0x51, 0x29, 0x00, + 0xd0, 0x04, 0x68, 0x88, 0x21, 0x00, 0xf0, 0x03, + 0xfe, 0x6d, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x92, 0x7c, 0xb5, 0xf0, 0x04, 0x05, + 0x0c, 0x2d, 0x04, 0x09, 0x0c, 0x09, 0x04, 0x12, + 0x0c, 0x12, 0x04, 0x1e, 0x0c, 0x36, 0x9c, 0x05, + 0x9f, 0x06, 0x04, 0x24, 0x0c, 0x24, 0x04, 0x3f, + 0x0c, 0x3f, 0x20, 0xff, 0xb0, 0x85, 0x2d, 0x0f, + 0xdc, 0x04, 0x00, 0xab, 0x4d, 0x10, 0x58, 0xed, + 0x2d, 0x00, 0xd1, 0x03, 0xb0, 0x05, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x19, 0x88, 0x23, 0x32, + 0x5e, 0xeb, 0x42, 0x98, 0xdd, 0x02, 0x1a, 0x58, + 0x04, 0x06, 0x0c, 0x36, 0x19, 0x10, 0x23, 0x34, + 0x5e, 0xeb, 0x42, 0x98, 0xdd, 0x02, 0x1a, 0x98, + 0x04, 0x04, 0x0c, 0x24, 0x91, 0x00, 0x92, 0x01, + 0x96, 0x02, 0x94, 0x03, 0x97, 0x04, 0x46, 0x69, + 0x68, 0xa8, 0xf0, 0x0a, 0xfa, 0x13, 0xe7, 0xe1, + 0x2e, 0x08, 0x92, 0x7c, 0xb4, 0x80, 0x04, 0x03, + 0x0c, 0x1b, 0x20, 0x00, 0x29, 0x00, 0xdb, 0x0f, + 0x2a, 0x00, 0xdb, 0x0d, 0x00, 0x9b, 0x4f, 0x07, + 0x58, 0xff, 0x2f, 0x00, 0xd0, 0x08, 0x23, 0x32, + 0x5e, 0xfb, 0x42, 0x8b, 0xdd, 0x04, 0x23, 0x34, + 0x5e, 0xf9, 0x42, 0x91, 0xdd, 0x00, 0x20, 0x01, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0xf0, 0x9c, 0x06, 0x9e, 0x05, 0x04, 0x00, + 0x0c, 0x00, 0xb0, 0x85, 0x90, 0x00, 0x04, 0x08, + 0x14, 0x00, 0x04, 0x17, 0x14, 0x3f, 0x04, 0x1d, + 0x14, 0x2d, 0x04, 0x31, 0x14, 0x09, 0x91, 0x01, + 0x04, 0x23, 0x0c, 0x1b, 0x93, 0x02, 0xb0, 0x82, + 0x99, 0x02, 0x00, 0x89, 0x91, 0x06, 0x4a, 0x71, + 0x92, 0x05, 0x58, 0x51, 0x29, 0x00, 0xd1, 0x01, + 0x20, 0xff, 0xe0, 0xd6, 0x2d, 0x00, 0xda, 0x0e, + 0x19, 0x40, 0x04, 0x00, 0x14, 0x00, 0x42, 0x69, + 0x04, 0x0d, 0x14, 0x2d, 0x99, 0x03, 0x18, 0x79, + 0x04, 0x0f, 0x14, 0x3f, 0x99, 0x03, 0x42, 0x49, + 0x04, 0x09, 0x14, 0x09, 0x91, 0x03, 0x1c, 0x01, + 0x1c, 0x04, 0x98, 0x02, 0x1c, 0x3a, 0xf7, 0xff, + 0xff, 0xb1, 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, + 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, + 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, 0xff, 0x70, + 0x98, 0x03, 0x10, 0x40, 0x90, 0x00, 0x10, 0x6e, + 0x1c, 0x28, 0xb0, 0x82, 0xf0, 0x0e, 0xfd, 0x38, + 0xf0, 0x0e, 0xfd, 0x74, 0x90, 0x00, 0x91, 0x01, + 0x98, 0x05, 0xf0, 0x0e, 0xfd, 0x31, 0xf0, 0x0e, + 0xfd, 0x6d, 0x9a, 0x00, 0x9b, 0x01, 0xb0, 0x02, + 0xf0, 0x0e, 0xfd, 0x6c, 0x28, 0x00, 0xd0, 0x4c, + 0x98, 0x03, 0x28, 0x00, 0xdd, 0x21, 0x26, 0x00, + 0x2d, 0x00, 0xdd, 0x6d, 0x98, 0x00, 0x99, 0x03, + 0x18, 0x40, 0x90, 0x00, 0x34, 0x01, 0x42, 0xa8, + 0xdb, 0x03, 0x98, 0x00, 0x1b, 0x40, 0x90, 0x00, + 0x37, 0x01, 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, + 0xf7, 0xff, 0xff, 0x78, 0x28, 0x00, 0xd0, 0x08, + 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, + 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, + 0xff, 0x37, 0x36, 0x01, 0x42, 0xae, 0xdb, 0xe1, + 0xe0, 0x76, 0x98, 0x03, 0x42, 0x40, 0x04, 0x00, + 0x14, 0x00, 0x90, 0x03, 0x98, 0x00, 0x42, 0x46, + 0x20, 0x00, 0x90, 0x01, 0x2d, 0x00, 0xdd, 0x43, + 0x98, 0x03, 0x18, 0x36, 0x34, 0x01, 0x42, 0xae, + 0xdb, 0x01, 0x1b, 0x76, 0x3f, 0x01, 0x98, 0x02, + 0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x52, + 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, + 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, + 0x1c, 0x3a, 0xf0, 0x09, 0xff, 0x11, 0x98, 0x01, + 0x30, 0x01, 0x90, 0x01, 0x42, 0xa8, 0xdb, 0xe3, + 0xe0, 0x4e, 0x98, 0x03, 0x28, 0x00, 0xdd, 0x24, + 0x20, 0x00, 0x90, 0x01, 0x98, 0x03, 0x28, 0x00, + 0xdd, 0x1e, 0x19, 0x76, 0x99, 0x03, 0x37, 0x01, + 0x42, 0x8e, 0xdb, 0x02, 0x98, 0x03, 0x1a, 0x36, + 0x34, 0x01, 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, + 0xf7, 0xff, 0xff, 0x2c, 0x28, 0x00, 0xd0, 0x08, + 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, + 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, + 0xfe, 0xeb, 0x98, 0x01, 0x30, 0x01, 0x90, 0x01, + 0x99, 0x03, 0x42, 0x88, 0xdb, 0xe1, 0xe0, 0x27, + 0xe0, 0x26, 0x98, 0x03, 0x42, 0x40, 0x04, 0x01, + 0x14, 0x09, 0x91, 0x03, 0x20, 0x00, 0x90, 0x01, + 0x29, 0x00, 0xdd, 0x1d, 0x19, 0x76, 0x99, 0x03, + 0x3f, 0x01, 0x42, 0x8e, 0xdb, 0x02, 0x99, 0x03, + 0x1a, 0x76, 0x34, 0x01, 0x98, 0x02, 0x1c, 0x21, + 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x03, 0x28, 0x00, + 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, + 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, + 0xf0, 0x09, 0xfe, 0xc2, 0x98, 0x01, 0x30, 0x01, + 0x90, 0x01, 0x99, 0x03, 0x42, 0x88, 0xdb, 0xe1, + 0x20, 0x00, 0xb0, 0x07, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0xb4, 0x80, 0x23, 0x00, 0x88, 0x01, 0x0a, 0x0a, + 0x06, 0x12, 0x0e, 0x12, 0x06, 0x09, 0x0e, 0x09, + 0x2a, 0xdf, 0xd0, 0x1a, 0xdc, 0x07, 0x2a, 0xc4, + 0xd0, 0x19, 0x2a, 0xd6, 0xd0, 0x1b, 0x2a, 0xdc, + 0xd1, 0x08, 0x22, 0x1e, 0xe0, 0x06, 0x2a, 0xe4, + 0xd0, 0x13, 0x2a, 0xf6, 0xd0, 0x15, 0x2a, 0xfc, + 0xd1, 0x00, 0x22, 0x1f, 0x29, 0xdf, 0xd0, 0x26, + 0xdc, 0x11, 0x29, 0xc4, 0xd0, 0x25, 0x29, 0xd6, + 0xd0, 0x27, 0x29, 0xdc, 0xd1, 0x12, 0x21, 0x1e, + 0xe0, 0x10, 0x22, 0x19, 0xe7, 0xf2, 0x22, 0x1a, + 0xe7, 0xf0, 0x22, 0x1b, 0xe7, 0xee, 0x22, 0x1c, + 0xe7, 0xec, 0x22, 0x1d, 0xe7, 0xea, 0x29, 0xe4, + 0xd0, 0x15, 0x29, 0xf6, 0xd0, 0x17, 0x29, 0xfc, + 0xd1, 0x00, 0x21, 0x1f, 0x02, 0x17, 0x18, 0x7f, + 0x80, 0x07, 0x30, 0x02, 0x2a, 0x00, 0xd0, 0x04, + 0x29, 0x00, 0xd0, 0x02, 0x33, 0x01, 0x2b, 0x70, + 0xdb, 0xc0, 0xbc, 0x80, 0x47, 0x70, 0x21, 0x19, + 0xe7, 0xf0, 0x21, 0x1a, 0xe7, 0xee, 0x21, 0x1b, + 0xe7, 0xec, 0x21, 0x1c, 0xe7, 0xea, 0x21, 0x1d, + 0xe7, 0xe8, 0xb5, 0xf0, 0x1c, 0x0f, 0x1c, 0x11, + 0x04, 0x02, 0x0c, 0x12, 0x04, 0x0c, 0x0c, 0x24, + 0x04, 0x1d, 0x0c, 0x2d, 0x00, 0x96, 0xb0, 0x81, + 0x48, 0x10, 0x90, 0x00, 0x59, 0x81, 0x20, 0xff, + 0x29, 0x00, 0xd0, 0x16, 0x2a, 0x00, 0xd0, 0x14, + 0x2a, 0x0f, 0xdc, 0x12, 0x23, 0x32, 0x5e, 0xca, + 0x42, 0xa2, 0xdb, 0x0e, 0x23, 0x34, 0x5e, 0xc9, + 0x42, 0xa9, 0xdb, 0x0a, 0x1c, 0x38, 0xf7, 0xff, + 0xff, 0x93, 0x98, 0x00, 0x59, 0x80, 0x1c, 0x39, + 0x1c, 0x22, 0x1c, 0x2b, 0xf7, 0xff, 0xfb, 0x5c, + 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0xb4, 0xb0, 0x04, 0x07, 0x0c, 0x3f, 0x04, 0x09, + 0x0c, 0x09, 0x04, 0x14, 0x14, 0x24, 0x04, 0x1a, + 0x14, 0x12, 0x20, 0xff, 0x2f, 0x0f, 0xdc, 0x1d, + 0x00, 0xbd, 0x4f, 0x0f, 0x59, 0x7b, 0x2b, 0x00, + 0xd0, 0x18, 0x48, 0x0e, 0x29, 0x01, 0xd0, 0x05, + 0x29, 0x02, 0xd0, 0x01, 0x29, 0x03, 0xd0, 0x03, + 0x6c, 0x80, 0xe0, 0x02, 0x6c, 0x40, 0xe0, 0x00, + 0x6c, 0xc0, 0x62, 0x58, 0x59, 0x78, 0x63, 0xc4, + 0x20, 0x00, 0x43, 0xc0, 0x42, 0x82, 0xd1, 0x02, + 0x59, 0x79, 0x63, 0x88, 0xe0, 0x01, 0x59, 0x78, + 0x63, 0x82, 0x20, 0x00, 0xbc, 0xb0, 0x47, 0x70, + 0x2e, 0x08, 0x92, 0x7c, 0x2e, 0x08, 0x1d, 0x0c, + 0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09, + 0x0c, 0x09, 0x00, 0x80, 0x4a, 0x07, 0x58, 0x10, + 0x28, 0x00, 0xd1, 0x02, 0x20, 0xff, 0xbc, 0x08, + 0x47, 0x18, 0x07, 0x89, 0x0f, 0x89, 0x68, 0x80, + 0xf0, 0x03, 0xfe, 0x6c, 0x20, 0x00, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0x80, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x12, + 0x0c, 0x12, 0x1c, 0x1f, 0x28, 0x07, 0xdc, 0x1f, + 0x28, 0x01, 0xdb, 0x1d, 0x00, 0x80, 0x4b, 0x10, + 0x58, 0x1b, 0x2b, 0x00, 0xd0, 0x18, 0x29, 0x02, + 0xd0, 0x0e, 0x29, 0x04, 0xd0, 0x0c, 0x29, 0x10, + 0xd0, 0x0a, 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, + 0xd1, 0x0e, 0x06, 0x12, 0x0e, 0x12, 0x1c, 0x39, + 0x48, 0x08, 0x6c, 0x00, 0x68, 0x00, 0xe0, 0x05, + 0x07, 0x12, 0x0f, 0x12, 0x49, 0x06, 0x58, 0x08, + 0x68, 0x00, 0x1c, 0x39, 0xf0, 0x0b, 0xfa, 0xf2, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x92, 0x7c, 0x2e, 0x08, 0x1d, 0x0c, + 0x2e, 0x08, 0x92, 0xbc, 0xb5, 0xf0, 0x04, 0x07, + 0x0c, 0x3f, 0x04, 0x10, 0x0c, 0x00, 0x22, 0x00, + 0xb0, 0x85, 0x92, 0x00, 0x2f, 0x07, 0xdc, 0x74, + 0x2f, 0x01, 0xdb, 0x73, 0x00, 0xbe, 0x4a, 0x3e, + 0x59, 0x92, 0x2a, 0x00, 0xd0, 0x6f, 0x04, 0x1a, + 0x0c, 0x12, 0x07, 0xd5, 0x0f, 0xed, 0x24, 0x02, + 0x40, 0x14, 0x27, 0x04, 0x40, 0x17, 0x23, 0x08, + 0x40, 0x1a, 0x92, 0x04, 0x29, 0x02, 0xd0, 0x34, + 0x29, 0x04, 0xd0, 0x32, 0x29, 0x10, 0xd0, 0x30, + 0x01, 0x5b, 0x42, 0x99, 0xd1, 0x60, 0x06, 0x02, + 0x0e, 0x12, 0x46, 0x69, 0x1c, 0x16, 0x48, 0x31, + 0x90, 0x01, 0x6c, 0x00, 0x68, 0x00, 0xf0, 0x0b, + 0xfa, 0xe9, 0x98, 0x00, 0x4b, 0x2e, 0x40, 0x18, + 0x90, 0x00, 0x2d, 0x00, 0xd0, 0x02, 0x23, 0x02, + 0x43, 0x18, 0x90, 0x00, 0x2c, 0x00, 0xd0, 0x04, + 0x23, 0x01, 0x04, 0x5b, 0x98, 0x00, 0x43, 0x18, + 0x90, 0x00, 0x2f, 0x00, 0xd0, 0x03, 0x23, 0x01, + 0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x9a, 0x04, + 0x2a, 0x00, 0xd0, 0x04, 0x23, 0x01, 0x04, 0x1b, + 0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x98, 0x01, + 0x99, 0x00, 0x6c, 0x00, 0x68, 0x00, 0x1c, 0x32, + 0xe0, 0x30, 0x07, 0x02, 0x0f, 0x12, 0x92, 0x03, + 0x48, 0x1c, 0x90, 0x02, 0x59, 0x80, 0x68, 0x00, + 0x46, 0x69, 0xf0, 0x0b, 0xfa, 0xbb, 0x98, 0x00, + 0x4b, 0x17, 0x40, 0x18, 0x90, 0x00, 0x2d, 0x00, + 0xd0, 0x02, 0x23, 0x02, 0x43, 0x18, 0x90, 0x00, + 0x2c, 0x00, 0xd0, 0x04, 0x23, 0x01, 0x04, 0x5b, + 0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x2f, 0x00, + 0xd0, 0x03, 0x23, 0x01, 0x98, 0x00, 0x43, 0x18, + 0x90, 0x00, 0x9a, 0x04, 0x2a, 0x00, 0xd0, 0x04, + 0x23, 0x01, 0x04, 0x1b, 0x98, 0x00, 0x43, 0x18, + 0x90, 0x00, 0x98, 0x02, 0x9a, 0x03, 0x59, 0x80, + 0xe0, 0x02, 0xe0, 0x05, 0xe0, 0x04, 0xe0, 0x03, + 0x68, 0x00, 0x99, 0x00, 0xf0, 0x0b, 0xfa, 0x62, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x92, 0x7c, 0x2e, 0x08, 0x1d, 0x0c, + 0xff, 0xfc, 0xff, 0xfc, 0x2e, 0x08, 0x92, 0xbc, + 0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, + 0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36, 0xb0, 0x85, + 0xa8, 0x01, 0x49, 0x48, 0xc9, 0x8e, 0xc0, 0x8e, + 0x2c, 0x00, 0xd0, 0x07, 0x2c, 0x01, 0xd0, 0x07, + 0x2c, 0x02, 0xd0, 0x07, 0x2c, 0x03, 0xd1, 0x74, + 0x20, 0x08, 0xe0, 0x04, 0x20, 0x01, 0xe0, 0x02, + 0x20, 0x02, 0xe0, 0x00, 0x20, 0x04, 0x90, 0x00, + 0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9d, 0xdc, 0x69, + 0x23, 0x09, 0x01, 0x9b, 0x42, 0x9e, 0xdc, 0x65, + 0x1e, 0x68, 0x90, 0x03, 0x1e, 0x70, 0x90, 0x04, + 0xa8, 0x01, 0x1c, 0x21, 0xf0, 0x07, 0xfb, 0xe4, + 0x4f, 0x37, 0x60, 0x78, 0x00, 0x80, 0x23, 0x01, + 0x04, 0x1b, 0x42, 0x98, 0xdc, 0x56, 0x1f, 0xf8, + 0x38, 0x79, 0x67, 0xc4, 0x68, 0x38, 0x28, 0x00, + 0xd0, 0x0a, 0x68, 0x80, 0xb0, 0x81, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x00, 0xf0, 0x09, 0xfd, 0x6e, + 0x68, 0x38, 0xf7, 0xfe, 0xfe, 0xd2, 0xb0, 0x01, + 0x22, 0x00, 0x21, 0x0a, 0x20, 0x01, 0xb4, 0x07, + 0x1c, 0x22, 0xb4, 0x04, 0x21, 0x00, 0x20, 0x00, + 0x1c, 0x2a, 0x1c, 0x33, 0xf7, 0xfe, 0xfd, 0xac, + 0x60, 0x38, 0xb0, 0x04, 0x28, 0x00, 0xd0, 0x40, + 0x69, 0x84, 0x98, 0x00, 0x43, 0x45, 0x1d, 0xe8, + 0xd5, 0x00, 0x30, 0x07, 0x10, 0xc0, 0x43, 0x70, + 0x1c, 0x01, 0x60, 0x78, 0x20, 0x00, 0x29, 0x00, + 0xdd, 0x05, 0x21, 0x00, 0x54, 0x21, 0x68, 0x7a, + 0x30, 0x01, 0x42, 0x90, 0xdb, 0xfa, 0x20, 0x01, + 0x02, 0x80, 0xf7, 0xf0, 0xff, 0x55, 0x28, 0x00, + 0xdb, 0xf9, 0x4d, 0x18, 0x1c, 0x28, 0xf7, 0xf0, + 0xff, 0x6f, 0x28, 0x00, 0xdb, 0xfa, 0x68, 0x78, + 0x28, 0x00, 0xdd, 0x14, 0x68, 0x78, 0x04, 0x00, + 0x0c, 0x00, 0xf7, 0xf0, 0xff, 0x45, 0x28, 0x00, + 0xdb, 0xf8, 0x1c, 0x20, 0xf7, 0xf0, 0xff, 0x60, + 0x28, 0x00, 0xdb, 0xfa, 0x18, 0x24, 0x68, 0x79, + 0x1a, 0x08, 0x60, 0x78, 0x28, 0x00, 0xdc, 0xed, + 0xe0, 0x01, 0xe0, 0x0a, 0xe0, 0x09, 0x20, 0x00, + 0xf7, 0xf0, 0xff, 0x32, 0x28, 0x00, 0xd1, 0xfa, + 0x1c, 0x20, 0xf7, 0xf0, 0xff, 0x4d, 0x28, 0x00, + 0xdb, 0xfa, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x03, 0xa7, 0xc4, + 0x2e, 0x08, 0x1d, 0x8c, 0x2e, 0x08, 0x93, 0x1c, + 0xb5, 0xf0, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09, + 0x0c, 0x09, 0xb0, 0x87, 0x91, 0x00, 0x04, 0x11, + 0x0c, 0x09, 0x91, 0x01, 0x04, 0x19, 0x0c, 0x09, + 0x91, 0x02, 0xb0, 0x85, 0x28, 0x07, 0xdc, 0x43, + 0x28, 0x01, 0xdb, 0x41, 0x00, 0x85, 0x48, 0x3e, + 0x90, 0x0b, 0x59, 0x41, 0x29, 0x00, 0xd0, 0x3b, + 0x48, 0x3c, 0x90, 0x0a, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x36, 0x23, 0x2c, 0x5e, 0xca, 0x2a, 0x0b, + 0xd2, 0x32, 0xa3, 0x02, 0x5c, 0x9b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, + 0x22, 0x00, 0x92, 0x00, 0x92, 0x01, 0x23, 0x32, + 0x5e, 0xc3, 0x93, 0x02, 0x23, 0x34, 0x5e, 0xc0, + 0x90, 0x03, 0x92, 0x04, 0x98, 0x07, 0x08, 0x80, + 0xd3, 0x40, 0x23, 0x2c, 0x5e, 0xc8, 0x28, 0x00, + 0xd0, 0x08, 0x28, 0x01, 0xd0, 0x08, 0x28, 0x02, + 0xd0, 0x08, 0x28, 0x03, 0xd1, 0x10, 0x27, 0xff, + 0x37, 0x01, 0xe0, 0x04, 0x27, 0x02, 0xe0, 0x02, + 0x27, 0x04, 0xe0, 0x00, 0x27, 0x10, 0x4e, 0x24, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x9f, 0xd1, 0x16, + 0x24, 0x00, 0x48, 0x22, 0x90, 0x09, 0xe0, 0x03, + 0xb0, 0x0c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0xa0, 0x58, 0x31, 0x29, 0x00, 0xd0, 0x06, + 0x06, 0x22, 0x0e, 0x12, 0x98, 0x09, 0x6c, 0x00, + 0x68, 0x00, 0xf0, 0x0b, 0xf9, 0x53, 0x34, 0x01, + 0x42, 0xbc, 0xdb, 0xf1, 0xe0, 0x12, 0x24, 0x00, + 0x2f, 0x00, 0xdd, 0x0f, 0x48, 0x16, 0x90, 0x08, + 0x00, 0xa0, 0x58, 0x31, 0x29, 0x00, 0xd0, 0x06, + 0x07, 0x22, 0x0f, 0x12, 0x98, 0x08, 0x59, 0x40, + 0x68, 0x00, 0xf0, 0x0b, 0xf9, 0x3f, 0x34, 0x01, + 0x42, 0xbc, 0xdb, 0xf1, 0x98, 0x07, 0x08, 0x40, + 0xd3, 0x01, 0x22, 0xff, 0xe0, 0x00, 0x22, 0x00, + 0x99, 0x06, 0xb4, 0x06, 0x98, 0x0d, 0x59, 0x40, + 0x68, 0x81, 0x98, 0x0c, 0x68, 0x00, 0x68, 0x80, + 0x9b, 0x07, 0xaa, 0x02, 0xf0, 0x09, 0xff, 0x08, + 0xb0, 0x0e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x92, 0x7c, 0x2e, 0x08, 0x1d, 0x8c, + 0x2e, 0x08, 0x93, 0x1c, 0x2e, 0x08, 0x1d, 0x0c, + 0x2e, 0x08, 0x92, 0xbc, 0xb5, 0x80, 0x4f, 0x05, + 0x68, 0x38, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfe, + 0xfd, 0xd4, 0x20, 0x00, 0x60, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1d, 0x8c, + 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, + 0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, + 0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, + 0x21, 0x01, 0xf0, 0x03, 0xfb, 0x93, 0x20, 0x00, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, + 0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, + 0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, + 0x21, 0x00, 0xf0, 0x03, 0xfb, 0x7f, 0x20, 0x00, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x92, 0x7c, + 0xb5, 0xf7, 0xb0, 0x86, 0x9c, 0x07, 0x20, 0x00, + 0x6e, 0x40, 0x90, 0x05, 0x98, 0x05, 0x30, 0x0c, + 0x90, 0x05, 0x48, 0x7f, 0x90, 0x04, 0x98, 0x04, + 0x30, 0x0c, 0x90, 0x04, 0xf0, 0x13, 0xfc, 0x2a, + 0x90, 0x01, 0xf0, 0x13, 0xfc, 0x0d, 0x90, 0x00, + 0x20, 0x00, 0x43, 0xc0, 0x49, 0x79, 0x60, 0x08, + 0x20, 0x00, 0x43, 0xc0, 0x49, 0x77, 0x60, 0x88, + 0x20, 0x00, 0x43, 0xc0, 0x49, 0x75, 0x61, 0x08, + 0x98, 0x06, 0x28, 0x00, 0xd0, 0x73, 0x20, 0x00, + 0x6a, 0x40, 0x90, 0x03, 0x68, 0x20, 0x30, 0x05, + 0x99, 0x06, 0x1a, 0x08, 0x90, 0x06, 0x68, 0xe0, + 0x28, 0x00, 0xd0, 0x08, 0x68, 0x60, 0x99, 0x03, + 0x68, 0x09, 0x42, 0x88, 0xd1, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x06, 0x68, 0x60, + 0x9a, 0x08, 0x42, 0x90, 0xd1, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x73, + 0x68, 0x27, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x01, + 0x98, 0x05, 0xe0, 0x00, 0x98, 0x04, 0x1c, 0x06, + 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, + 0x6e, 0x40, 0xe0, 0x00, 0x48, 0x5c, 0x90, 0x02, + 0x1d, 0xe5, 0x35, 0x0d, 0x68, 0xa0, 0x28, 0x08, + 0xd2, 0x5f, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x16, 0x28, 0x3a, + 0x49, 0x55, 0x65, 0x71, 0x69, 0x20, 0x49, 0x55, + 0x60, 0x08, 0xcd, 0x02, 0x48, 0x53, 0x60, 0x41, + 0xcd, 0x02, 0x98, 0x02, 0x60, 0x01, 0x3f, 0x01, + 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, + 0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x67, + 0x69, 0x20, 0x49, 0x4c, 0x60, 0x88, 0xcd, 0x02, + 0x48, 0x4a, 0x60, 0xc1, 0xcd, 0x02, 0x98, 0x02, + 0x60, 0x41, 0x3f, 0x01, 0x1c, 0x38, 0x3f, 0x01, + 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 0xc6, 0x02, + 0xe7, 0xf8, 0xe0, 0x55, 0x69, 0x20, 0x49, 0x43, + 0x61, 0x08, 0xcd, 0x02, 0x48, 0x41, 0x61, 0x41, + 0xcd, 0x02, 0x98, 0x02, 0x60, 0x81, 0x3f, 0x01, + 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, + 0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x43, + 0x69, 0x20, 0x00, 0x80, 0xe0, 0x00, 0xe0, 0x4b, + 0x21, 0x00, 0x6a, 0x89, 0x50, 0x0e, 0x1c, 0x38, + 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, + 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x34, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x33, 0x50, 0x0e, 0x1c, 0x38, + 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, + 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x28, 0x69, 0x20, + 0x00, 0x80, 0x21, 0x00, 0x6e, 0x09, 0xe0, 0x01, + 0xe0, 0x28, 0xe0, 0x20, 0x50, 0x0e, 0x1c, 0x38, + 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, + 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x18, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x26, 0x50, 0x0e, 0x1c, 0x38, + 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, + 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x0c, 0x69, 0x20, + 0x90, 0x03, 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, + 0xd0, 0x04, 0xcd, 0x02, 0x98, 0x03, 0xc0, 0x02, + 0x90, 0x03, 0xe7, 0xf6, 0xe0, 0x00, 0xe7, 0xff, + 0x68, 0xe0, 0x28, 0xff, 0xd1, 0x01, 0x96, 0x05, + 0xe0, 0x00, 0x96, 0x04, 0x68, 0x20, 0x00, 0x80, + 0x19, 0x00, 0x1d, 0xc4, 0x34, 0x0d, 0xe7, 0x3b, + 0x98, 0x01, 0x28, 0x00, 0xd1, 0x01, 0xf0, 0x13, + 0xfb, 0x89, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x01, + 0xf0, 0x13, 0xfb, 0x68, 0x20, 0x00, 0x6e, 0x80, + 0x68, 0x00, 0x4b, 0x0f, 0x42, 0x98, 0xd0, 0x06, + 0x48, 0x0d, 0x21, 0x00, 0x6e, 0x89, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x08, 0x62, 0x08, 0x20, 0x00, + 0x21, 0x00, 0x6e, 0x89, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x06, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb0, 0x06, 0xe7, 0xf9, 0x00, 0x00, + 0x2e, 0x08, 0x97, 0x1c, 0x66, 0x00, 0x00, 0x80, + 0x2e, 0x08, 0x3b, 0xa4, 0x2e, 0x08, 0x1d, 0x94, + 0xda, 0xa5, 0xaa, 0x57, 0xb5, 0x80, 0xb0, 0xa7, + 0x46, 0x68, 0x4f, 0x08, 0x23, 0x13, 0xcf, 0x06, + 0xc0, 0x06, 0x3b, 0x01, 0xd1, 0xfb, 0xcf, 0x04, + 0xc0, 0x04, 0x46, 0x69, 0x4a, 0x04, 0x20, 0x27, + 0xf7, 0xff, 0xfe, 0xde, 0xb0, 0x27, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x03, 0xa7, 0xd4, + 0xf0, 0x24, 0x00, 0x09, 0xb5, 0xff, 0xb0, 0x83, + 0x99, 0x04, 0x04, 0x09, 0x0c, 0x09, 0x91, 0x00, + 0x9a, 0x05, 0x06, 0x16, 0x0e, 0x36, 0x9b, 0x06, + 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 0x98, 0x0c, + 0x06, 0x00, 0x0e, 0x00, 0x90, 0x02, 0xb0, 0x84, + 0x25, 0x00, 0x98, 0x07, 0x1d, 0xc2, 0x32, 0x21, + 0x92, 0x00, 0x20, 0xff, 0x30, 0x01, 0x68, 0x00, + 0x49, 0x6b, 0x60, 0x08, 0x98, 0x12, 0x28, 0x01, + 0xd1, 0x73, 0x98, 0x07, 0x28, 0x00, 0xd1, 0x05, + 0x20, 0x63, 0xb0, 0x07, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x91, 0x01, + 0x99, 0x01, 0x23, 0xff, 0x33, 0xe1, 0x42, 0x99, + 0xd3, 0x04, 0xe0, 0x0a, 0x99, 0x01, 0x31, 0x01, + 0x91, 0x01, 0xe7, 0xf5, 0x20, 0x00, 0x99, 0x01, + 0x23, 0x2c, 0x43, 0x59, 0x9a, 0x00, 0x50, 0x50, + 0xe7, 0xf4, 0x98, 0x07, 0x49, 0x5b, 0x68, 0x09, + 0x60, 0x08, 0x98, 0x05, 0x28, 0x10, 0xdb, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x99, 0x05, + 0x29, 0x1f, 0xdc, 0x01, 0x21, 0x01, 0xe0, 0x00, + 0x21, 0x00, 0x40, 0x08, 0xd0, 0x04, 0x98, 0x05, + 0x49, 0x53, 0x68, 0x09, 0x60, 0x08, 0xe0, 0x02, + 0x20, 0x62, 0xb0, 0x07, 0xe7, 0xce, 0x20, 0x00, + 0x49, 0x4d, 0x68, 0x09, 0x70, 0x08, 0x1c, 0x30, + 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, + 0x21, 0x01, 0xf0, 0x00, 0xfb, 0x01, 0x1c, 0x07, + 0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, + 0xe7, 0xbc, 0x22, 0x00, 0xb4, 0x04, 0x99, 0x05, + 0x1c, 0x30, 0x23, 0x04, 0x22, 0x00, 0xf0, 0x00, + 0xf9, 0x2f, 0xb0, 0x01, 0x1c, 0x07, 0x2f, 0x00, + 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, 0xe7, 0xad, + 0x98, 0x06, 0x28, 0x00, 0xdb, 0x04, 0x98, 0x06, + 0x28, 0x3f, 0xdc, 0x01, 0x9d, 0x06, 0xe0, 0x00, + 0x25, 0x1b, 0x98, 0x11, 0x01, 0x80, 0x43, 0x05, + 0x23, 0x80, 0x43, 0x1d, 0x48, 0x39, 0x68, 0x01, + 0x0a, 0x09, 0x02, 0x09, 0x60, 0x01, 0x48, 0x37, + 0x68, 0x01, 0x43, 0x29, 0x60, 0x01, 0xf0, 0x13, + 0xfa, 0x67, 0x90, 0x03, 0xf0, 0x13, 0xfa, 0x7e, + 0xe0, 0x00, 0xe0, 0x13, 0x90, 0x02, 0xf0, 0x13, + 0xfa, 0xdd, 0x1c, 0x04, 0x4b, 0x30, 0x40, 0x1c, + 0x1c, 0x20, 0xf0, 0x13, 0xfa, 0xdb, 0x98, 0x02, + 0x28, 0x40, 0xd0, 0x01, 0xf0, 0x13, 0xfa, 0xa6, + 0x98, 0x03, 0x28, 0x80, 0xd0, 0x01, 0xf0, 0x13, + 0xfa, 0x85, 0xe0, 0x43, 0x22, 0x00, 0xb4, 0x04, + 0x1c, 0x30, 0x23, 0x04, 0x22, 0x00, 0x49, 0x27, + 0xf0, 0x00, 0xf8, 0xee, 0xb0, 0x01, 0x1c, 0x07, + 0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, + 0xe7, 0x6c, 0x1c, 0x30, 0x23, 0x03, 0x02, 0x5b, + 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0xf0, 0x00, + 0xfa, 0xa3, 0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x02, + 0x20, 0xa2, 0xb0, 0x07, 0xe7, 0x5e, 0x48, 0x19, + 0x68, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x60, 0x01, + 0x48, 0x16, 0x68, 0x01, 0x23, 0x1b, 0x43, 0x19, + 0x60, 0x01, 0x48, 0x12, 0x68, 0x00, 0x68, 0x00, + 0x90, 0x07, 0xf0, 0x13, 0xfa, 0x21, 0x90, 0x03, + 0xf0, 0x13, 0xfa, 0x38, 0x90, 0x02, 0xf0, 0x13, + 0xfa, 0x99, 0x1c, 0x04, 0x23, 0x01, 0x04, 0x5b, + 0x43, 0x1c, 0x1c, 0x20, 0xf0, 0x13, 0xfa, 0x96, + 0x98, 0x02, 0x28, 0x40, 0xd0, 0x01, 0xf0, 0x13, + 0xfa, 0x61, 0x98, 0x03, 0x28, 0x80, 0xd0, 0x01, + 0xf0, 0x13, 0xfa, 0x40, 0x1c, 0x38, 0xb0, 0x07, + 0xe7, 0x34, 0xb0, 0x04, 0xb0, 0x03, 0xe7, 0x31, + 0x2e, 0x08, 0x9b, 0x24, 0x2e, 0x08, 0x9b, 0x1c, + 0x2e, 0x08, 0x9b, 0x20, 0x68, 0x00, 0x00, 0x38, + 0xff, 0xfd, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0x00, 0xf7, 0xff, 0xfe, 0xe7, 0xf0, 0x00, + 0xf8, 0x02, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, + 0xf0, 0x0b, 0xf9, 0x48, 0x26, 0x00, 0x2e, 0x04, + 0xd3, 0x02, 0xe0, 0x12, 0x36, 0x01, 0xe7, 0xfa, + 0x01, 0x30, 0x4b, 0x3c, 0x18, 0xc7, 0x25, 0x00, + 0x2d, 0x04, 0xd3, 0x02, 0xe0, 0x08, 0x35, 0x01, + 0xe7, 0xfa, 0x20, 0x00, 0x60, 0xb8, 0x20, 0x00, + 0x60, 0xf8, 0x37, 0xff, 0x37, 0x01, 0xe7, 0xf6, + 0xe7, 0xec, 0x4f, 0x35, 0x25, 0x00, 0x2d, 0x04, + 0xd3, 0x02, 0xe0, 0x07, 0x35, 0x01, 0xe7, 0xfa, + 0x20, 0x00, 0x60, 0xb8, 0x20, 0x00, 0x60, 0xf8, + 0x37, 0x10, 0xe7, 0xf7, 0x20, 0x00, 0x49, 0x2f, + 0x68, 0x09, 0x70, 0x08, 0x24, 0x00, 0x2c, 0x20, + 0xd3, 0x02, 0xe0, 0x1f, 0x34, 0x01, 0xe7, 0xfa, + 0x21, 0x00, 0x00, 0xe0, 0x4a, 0x2a, 0x68, 0x12, + 0x50, 0x11, 0x20, 0x00, 0x00, 0xe1, 0x4a, 0x28, + 0x68, 0x12, 0x18, 0x89, 0x60, 0x48, 0x21, 0x00, + 0x00, 0xe0, 0x4a, 0x26, 0x68, 0x12, 0x18, 0x80, + 0x60, 0x41, 0x20, 0x00, 0x00, 0xa1, 0x4a, 0x24, + 0x68, 0x12, 0x50, 0x50, 0x20, 0x00, 0x00, 0xe1, + 0x1b, 0x09, 0x00, 0x89, 0x4a, 0x21, 0x68, 0x12, + 0x52, 0x50, 0xe7, 0xdf, 0x20, 0x00, 0x21, 0x19, + 0x06, 0x89, 0x62, 0x48, 0x48, 0x1e, 0x21, 0x19, + 0x06, 0x89, 0x62, 0x48, 0x20, 0x00, 0x49, 0x1d, + 0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0x1b, + 0x68, 0x09, 0x60, 0x48, 0x20, 0x00, 0x49, 0x19, + 0x68, 0x09, 0x60, 0xc8, 0x20, 0x00, 0x49, 0x17, + 0x68, 0x09, 0x61, 0x08, 0x20, 0x00, 0x49, 0x15, + 0x68, 0x09, 0x61, 0x48, 0x20, 0x00, 0x49, 0x13, + 0x68, 0x09, 0x61, 0x88, 0x20, 0x00, 0x49, 0x12, + 0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0x10, + 0x68, 0x09, 0x60, 0x48, 0x20, 0x00, 0x49, 0x0e, + 0x68, 0x09, 0x60, 0x88, 0x48, 0x0d, 0x68, 0x01, + 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x9e, 0x00, 0x00, 0xc0, + 0x9e, 0x00, 0x09, 0x80, 0x2e, 0x08, 0x9b, 0x28, + 0x2e, 0x08, 0x9b, 0x3c, 0x2e, 0x08, 0x9b, 0x40, + 0x2e, 0x08, 0x9b, 0x38, 0x2e, 0x08, 0x9b, 0x30, + 0x00, 0x40, 0x00, 0x03, 0x2e, 0x08, 0x9b, 0x78, + 0x2e, 0x08, 0x9b, 0x7c, 0x6a, 0x00, 0x00, 0x10, + 0xb5, 0xff, 0xb0, 0x83, 0x98, 0x03, 0x06, 0x04, + 0x0e, 0x24, 0x99, 0x04, 0x04, 0x08, 0x0c, 0x00, + 0x90, 0x00, 0x9a, 0x05, 0x06, 0x10, 0x0e, 0x00, + 0x90, 0x01, 0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00, + 0x90, 0x02, 0xb0, 0x81, 0x00, 0xe0, 0x49, 0xc1, + 0x68, 0x09, 0x18, 0x47, 0x00, 0xa0, 0x49, 0xc0, + 0x68, 0x09, 0x18, 0x45, 0x00, 0xe0, 0x1b, 0x00, + 0x00, 0x80, 0x49, 0xbe, 0x68, 0x09, 0x18, 0x46, + 0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x04, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x68, 0x28, 0x4b, 0xb9, 0x40, 0x18, 0x60, 0x28, + 0x68, 0x38, 0x4b, 0xb8, 0x40, 0x18, 0x60, 0x38, + 0x68, 0x38, 0x23, 0x40, 0x40, 0x18, 0xd0, 0x17, + 0x68, 0x38, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, + 0x60, 0x38, 0x48, 0xb3, 0x68, 0x01, 0x08, 0x49, + 0x00, 0x49, 0x60, 0x01, 0x48, 0xb1, 0x68, 0x01, + 0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, + 0x98, 0x01, 0x4b, 0xaf, 0x42, 0x98, 0xd1, 0x03, + 0x20, 0x00, 0x49, 0xae, 0x68, 0x09, 0x60, 0x08, + 0x98, 0x01, 0x4b, 0xab, 0x42, 0x98, 0xd0, 0x73, + 0x68, 0x38, 0x23, 0x21, 0x43, 0xdb, 0x40, 0x18, + 0x60, 0x38, 0x68, 0x28, 0x23, 0x07, 0x03, 0x5b, + 0x40, 0x18, 0x60, 0x28, 0x98, 0x01, 0x4b, 0xa6, + 0x40, 0x18, 0x68, 0x29, 0x43, 0x08, 0x60, 0x28, + 0x20, 0x00, 0x75, 0x30, 0x98, 0x02, 0x07, 0x80, + 0x0f, 0x80, 0x28, 0x01, 0xd1, 0x04, 0x88, 0x30, + 0x23, 0x10, 0x43, 0x18, 0x80, 0x30, 0xe0, 0x04, + 0x88, 0x30, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, + 0x80, 0x30, 0x98, 0x02, 0x23, 0x80, 0x40, 0x18, + 0x28, 0x80, 0xd1, 0x08, 0x68, 0x38, 0x23, 0x40, + 0x43, 0x18, 0x60, 0x38, 0x20, 0xff, 0x49, 0x97, + 0x68, 0x09, 0x70, 0x08, 0xe0, 0x04, 0x68, 0x38, + 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, 0x60, 0x38, + 0x98, 0x03, 0x28, 0x01, 0xd1, 0x36, 0x88, 0x30, + 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 0x80, 0x30, + 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, 0x23, 0x0d, + 0x06, 0x9b, 0x1a, 0xc1, 0x00, 0xe0, 0x4a, 0x8c, + 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 0x20, 0x01, + 0x70, 0xb0, 0x68, 0x38, 0x23, 0x01, 0x03, 0x9b, + 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 0x4b, 0x87, + 0x43, 0x18, 0x60, 0x38, 0x48, 0x86, 0x70, 0x44, + 0x20, 0x00, 0x49, 0x86, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x01, 0x02, 0xc0, 0x49, 0x84, 0x61, 0x48, + 0x49, 0x83, 0x61, 0x08, 0x20, 0x01, 0x49, 0x83, + 0x64, 0x48, 0x20, 0x00, 0x49, 0x81, 0x64, 0x48, + 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x28, 0x20, 0x00, 0x49, 0x7e, 0x68, 0x09, + 0x60, 0x08, 0xe0, 0x9a, 0x98, 0x03, 0x28, 0x02, + 0xd1, 0x30, 0x20, 0x33, 0x06, 0x40, 0xe0, 0x00, + 0xe0, 0x94, 0x6d, 0xc0, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc0, 0x00, 0xe1, 0x4a, 0x70, 0x68, 0x12, + 0x18, 0x89, 0x60, 0x48, 0x20, 0x02, 0x70, 0xb0, + 0x68, 0x38, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x18, + 0x60, 0x38, 0x68, 0x38, 0x4b, 0x6b, 0x43, 0x18, + 0x60, 0x38, 0x48, 0x6b, 0x70, 0x84, 0x20, 0x00, + 0x49, 0x6e, 0x60, 0x08, 0x00, 0xe0, 0x49, 0x5b, + 0x68, 0x09, 0x58, 0x08, 0x23, 0xff, 0x33, 0x01, + 0x43, 0x18, 0x00, 0xe1, 0x4a, 0x57, 0x68, 0x12, + 0x50, 0x50, 0x20, 0x4b, 0x49, 0x67, 0x60, 0x08, + 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x28, 0xe0, 0x66, 0x98, 0x03, 0x28, 0x04, + 0xd1, 0x15, 0x20, 0x00, 0x00, 0xe1, 0x4a, 0x5a, + 0x68, 0x12, 0x18, 0x89, 0x60, 0x48, 0x98, 0x03, + 0x70, 0xb0, 0x68, 0x38, 0x23, 0x20, 0x43, 0x18, + 0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 0x48, 0x56, + 0x70, 0x04, 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, + 0x43, 0x18, 0x60, 0x28, 0xe0, 0x4d, 0x98, 0x03, + 0x23, 0x10, 0x40, 0x18, 0xd0, 0x0f, 0x21, 0x00, + 0x00, 0xe0, 0x4a, 0x4d, 0x68, 0x12, 0x18, 0x80, + 0x60, 0x41, 0x68, 0x38, 0x4b, 0x52, 0x43, 0x18, + 0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 0x37, 0x04, + 0x20, 0x0e, 0x60, 0x38, 0xe0, 0x39, 0x98, 0x03, + 0x28, 0x08, 0xd1, 0x23, 0x48, 0x4d, 0x68, 0x00, + 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x03, + 0x20, 0x4f, 0xb0, 0x04, 0xe6, 0xf8, 0xe0, 0x67, + 0x20, 0x01, 0x49, 0x48, 0x68, 0x09, 0x31, 0x60, + 0x76, 0x88, 0x48, 0x46, 0x68, 0x00, 0x30, 0x60, + 0x76, 0x04, 0x20, 0x01, 0x49, 0x43, 0x68, 0x09, + 0x31, 0x80, 0x70, 0xc8, 0x49, 0x42, 0x00, 0xe0, + 0x4a, 0x37, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, + 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x28, 0xe0, 0x12, 0x21, 0x00, 0x00, 0xe0, + 0x4a, 0x31, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, + 0x98, 0x03, 0x70, 0xb0, 0x68, 0x38, 0x23, 0x20, + 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 0x60, 0x38, + 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x28, 0xe0, 0x33, 0x98, 0x03, 0x23, 0x10, + 0x40, 0x18, 0xd0, 0x09, 0x1c, 0x20, 0xf0, 0x05, + 0xf8, 0x0f, 0x90, 0x00, 0x28, 0x00, 0xd0, 0x02, + 0x98, 0x00, 0xb0, 0x04, 0xe6, 0xbc, 0xe0, 0x1a, + 0x98, 0x03, 0x28, 0x01, 0xd1, 0x03, 0x20, 0xff, + 0x49, 0x21, 0x70, 0x48, 0xe0, 0x13, 0x98, 0x03, + 0x28, 0x02, 0xd1, 0x03, 0x20, 0xff, 0x49, 0x1e, + 0x70, 0x88, 0xe0, 0x0c, 0x98, 0x03, 0x28, 0x08, + 0xd1, 0x09, 0x20, 0x00, 0x49, 0x21, 0x68, 0x09, + 0x31, 0x80, 0x70, 0xc8, 0x20, 0x00, 0x49, 0x1f, + 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x7d, 0x30, + 0x07, 0xc0, 0x0f, 0xc0, 0x28, 0x01, 0xd1, 0x03, + 0x1c, 0x20, 0x49, 0x1c, 0xf0, 0x00, 0xf9, 0x16, + 0x20, 0x00, 0x70, 0xb0, 0x20, 0x00, 0xb0, 0x04, + 0xe6, 0x92, 0xb0, 0x01, 0xb0, 0x03, 0xe6, 0x8f, + 0xe6, 0x8e, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x3c, + 0x2e, 0x08, 0x9b, 0x38, 0x2e, 0x08, 0x9b, 0x30, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x9b, 0x44, + 0xff, 0xff, 0x1f, 0xff, 0x2e, 0x08, 0x9b, 0x98, + 0x2e, 0x08, 0x9b, 0x40, 0x00, 0x00, 0x20, 0x01, + 0x2e, 0x08, 0x9b, 0x9c, 0x2e, 0x08, 0x9b, 0x68, + 0xcc, 0x00, 0x0f, 0x00, 0x66, 0x00, 0x00, 0x80, + 0x2e, 0x08, 0x9b, 0xac, 0x2e, 0x08, 0x9b, 0xb0, + 0x00, 0x00, 0x20, 0xa0, 0x2e, 0x08, 0xb9, 0xb0, + 0x66, 0x00, 0x01, 0xf0, 0xff, 0xff, 0x00, 0x00, + 0xb5, 0xff, 0x98, 0x00, 0x06, 0x01, 0x0e, 0x09, + 0x98, 0x01, 0x06, 0x02, 0x0e, 0x12, 0x98, 0x02, + 0x04, 0x07, 0x0c, 0x3f, 0x9b, 0x03, 0x04, 0x1c, + 0x0c, 0x24, 0x29, 0x20, 0xdb, 0x04, 0x20, 0xa2, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2a, 0x02, 0xd1, 0x0a, 0x00, 0xc8, 0x4b, 0x1f, + 0x68, 0x1b, 0x58, 0x18, 0x4b, 0x1e, 0x40, 0x18, + 0x00, 0xcb, 0x4d, 0x1c, 0x68, 0x2d, 0x50, 0xe8, + 0xe0, 0x30, 0x2a, 0x01, 0xd1, 0x0b, 0x00, 0xc8, + 0x4b, 0x18, 0x68, 0x1b, 0x58, 0x18, 0x43, 0x27, + 0x1c, 0x3b, 0x43, 0x18, 0x00, 0xcb, 0x4d, 0x15, + 0x68, 0x2d, 0x50, 0xe8, 0xe0, 0x22, 0x20, 0x00, + 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x1e, 0x1c, 0x43, + 0x06, 0x1b, 0x16, 0x18, 0xe7, 0xf8, 0x2a, 0x03, + 0xd1, 0x0b, 0x00, 0xc3, 0x4d, 0x0d, 0x68, 0x2d, + 0x58, 0xeb, 0x1c, 0x3d, 0x43, 0x25, 0x43, 0x1d, + 0x00, 0xc3, 0x4e, 0x0a, 0x68, 0x36, 0x50, 0xf5, + 0xe0, 0x0b, 0x2a, 0x04, 0xd1, 0x09, 0x00, 0xc3, + 0x4d, 0x06, 0x68, 0x2d, 0x58, 0xed, 0x4b, 0x06, + 0x40, 0x2b, 0x00, 0xc5, 0x4e, 0x03, 0x68, 0x36, + 0x51, 0x73, 0xe7, 0xe0, 0x20, 0x00, 0xe7, 0xbb, + 0xe7, 0xba, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x3c, + 0xff, 0xff, 0xe1, 0xff, 0xb4, 0xb0, 0x1c, 0x07, + 0x1c, 0x0a, 0x06, 0x38, 0x0e, 0x00, 0x06, 0x11, + 0x0e, 0x09, 0x4c, 0x14, 0x68, 0x25, 0x4b, 0x14, + 0x40, 0x2b, 0x60, 0x23, 0x28, 0x01, 0xd1, 0x06, + 0x4c, 0x10, 0x68, 0x25, 0x23, 0x01, 0x04, 0x1b, + 0x43, 0x2b, 0x60, 0x23, 0xe0, 0x07, 0x28, 0x00, + 0xd1, 0x05, 0x4c, 0x0c, 0x68, 0x25, 0x23, 0x01, + 0x05, 0x9b, 0x43, 0x2b, 0x60, 0x23, 0x29, 0x01, + 0xd1, 0x06, 0x4c, 0x08, 0x68, 0x25, 0x23, 0x01, + 0x03, 0x9b, 0x43, 0x2b, 0x60, 0x23, 0xe0, 0x07, + 0x29, 0x02, 0xd1, 0x05, 0x4c, 0x03, 0x68, 0x25, + 0x23, 0x01, 0x03, 0xdb, 0x43, 0x2b, 0x60, 0x23, + 0xbc, 0xb0, 0x47, 0x70, 0x64, 0x00, 0x00, 0x24, + 0xff, 0xbe, 0x3f, 0xff, 0xb5, 0xff, 0x1c, 0x1f, + 0x9c, 0x09, 0xb0, 0x82, 0x98, 0x02, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x00, 0x99, 0x03, 0x06, 0x0a, + 0x0e, 0x12, 0x98, 0x04, 0x06, 0x05, 0x0e, 0x2d, + 0x98, 0x0c, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x01, + 0x00, 0xd0, 0x1a, 0x80, 0x00, 0x80, 0x4b, 0x1b, + 0x68, 0x1b, 0x18, 0xc1, 0x2a, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x1f, 0xdb, 0x02, + 0x20, 0xaf, 0xb0, 0x02, 0xe7, 0xf6, 0x71, 0x8d, + 0x68, 0x3b, 0x00, 0xd0, 0x4e, 0x12, 0x68, 0x36, + 0x19, 0x80, 0x60, 0x43, 0x1c, 0x20, 0x71, 0xc8, + 0x20, 0x00, 0x80, 0x88, 0x20, 0x00, 0x60, 0xc8, + 0x98, 0x00, 0x23, 0x01, 0x43, 0x18, 0x75, 0x08, + 0x98, 0x01, 0x74, 0x88, 0x60, 0x8f, 0x88, 0xb8, + 0x82, 0x08, 0x20, 0x00, 0x74, 0xc8, 0x88, 0xb8, + 0x61, 0x38, 0x20, 0x00, 0x73, 0x38, 0x20, 0x00, + 0x73, 0x78, 0x20, 0x00, 0x73, 0xb8, 0x20, 0x00, + 0x73, 0xf8, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xd1, + 0xb0, 0x02, 0xe7, 0xcf, 0x2e, 0x08, 0x9b, 0x30, + 0x2e, 0x08, 0x9b, 0x40, 0xb5, 0xf3, 0x98, 0x00, + 0x06, 0x04, 0x0e, 0x24, 0x99, 0x01, 0x04, 0x0d, + 0x0c, 0x2d, 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, + 0x49, 0x25, 0x68, 0x09, 0x18, 0x47, 0x2c, 0x20, + 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x4b, 0x21, 0x42, 0x9d, + 0xd1, 0x27, 0x00, 0xe1, 0x4b, 0x20, 0x68, 0x1b, + 0x18, 0xc8, 0x00, 0xa1, 0x4b, 0x1f, 0x68, 0x1b, + 0x18, 0xca, 0x68, 0x11, 0x4b, 0x1e, 0x40, 0x19, + 0x60, 0x11, 0x68, 0x01, 0x23, 0x40, 0x40, 0x19, + 0xd0, 0x13, 0x68, 0x01, 0x23, 0x40, 0x43, 0xdb, + 0x40, 0x19, 0x60, 0x01, 0x21, 0x00, 0x4b, 0x19, + 0x68, 0x1b, 0x70, 0x19, 0x49, 0x18, 0x68, 0x0b, + 0x08, 0x5b, 0x00, 0x5b, 0x60, 0x0b, 0x49, 0x17, + 0x68, 0x0e, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x33, + 0x60, 0x0b, 0x68, 0x01, 0x4b, 0x14, 0x40, 0x19, + 0x60, 0x01, 0x20, 0x00, 0x75, 0x38, 0x20, 0x00, + 0x80, 0x38, 0x20, 0x00, 0x80, 0xb8, 0x68, 0xb8, + 0x72, 0x44, 0x20, 0xa0, 0x68, 0xb9, 0x72, 0x08, + 0x20, 0x00, 0x60, 0xb8, 0x79, 0xb9, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x12, 0xfe, 0x1f, 0x20, 0x00, + 0x71, 0xb8, 0x20, 0x00, 0xe7, 0xba, 0xe7, 0xb9, + 0x2e, 0x08, 0x9b, 0x30, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x9b, 0x3c, 0x2e, 0x08, 0x9b, 0x38, + 0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x9b, 0x2c, + 0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20, + 0xff, 0xff, 0x3f, 0xde, 0xb5, 0xff, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x28, 0x0e, 0x00, + 0x06, 0x23, 0x0e, 0x1b, 0x06, 0x39, 0x0e, 0x09, + 0x9e, 0x03, 0x06, 0x36, 0x16, 0x32, 0x28, 0x20, + 0xda, 0x02, 0x4e, 0x08, 0x68, 0x36, 0x60, 0x30, + 0x4e, 0x07, 0x68, 0x36, 0x60, 0x33, 0x4e, 0x07, + 0x68, 0x36, 0x60, 0x31, 0x4e, 0x06, 0x68, 0x36, + 0x60, 0x32, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x58, + 0x2e, 0x08, 0x9b, 0x5c, 0x2e, 0x08, 0x9b, 0x60, + 0x2e, 0x08, 0x9b, 0x64, 0x1c, 0x01, 0x06, 0x08, + 0x0e, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x22, 0x01, + 0x4b, 0x04, 0x68, 0x1b, 0x60, 0x1a, 0xe0, 0x03, + 0x22, 0x02, 0x4b, 0x02, 0x68, 0x1b, 0x60, 0x1a, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xa0, + 0xb5, 0xf1, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24, + 0xb0, 0x81, 0x27, 0x00, 0x26, 0x00, 0x4a, 0x55, + 0x92, 0x00, 0x00, 0xe0, 0x49, 0x54, 0x68, 0x09, + 0x58, 0x08, 0x23, 0x03, 0x03, 0x9b, 0x40, 0x18, + 0x23, 0x01, 0x03, 0x9b, 0x42, 0x98, 0xd0, 0x05, + 0x20, 0xa0, 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0xe0, 0x49, 0x4c, + 0x68, 0x09, 0x58, 0x08, 0x21, 0x20, 0x43, 0x01, + 0x00, 0xe0, 0x4a, 0x49, 0x68, 0x12, 0x50, 0x11, + 0x21, 0x00, 0x48, 0x48, 0xf0, 0x05, 0xfc, 0x3c, + 0x48, 0x47, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x01, + 0xe0, 0x08, 0xe0, 0x82, 0x20, 0x02, 0xf0, 0x0c, + 0xf8, 0x75, 0x1c, 0x38, 0x37, 0x01, 0x4b, 0x43, + 0x42, 0x98, 0xd3, 0xf1, 0x4b, 0x41, 0x42, 0x9f, + 0xd3, 0x00, 0x26, 0xa1, 0x48, 0x40, 0x68, 0x01, + 0x4b, 0x40, 0x40, 0x19, 0x60, 0x01, 0x20, 0x00, + 0x00, 0xe1, 0x1b, 0x09, 0x00, 0x89, 0x4a, 0x3e, + 0x68, 0x12, 0x18, 0x89, 0x70, 0x88, 0x20, 0x00, + 0x43, 0xc0, 0x49, 0x3c, 0x67, 0x48, 0x22, 0x00, + 0xb4, 0x04, 0x1c, 0x20, 0x23, 0x00, 0x22, 0x00, + 0x49, 0x39, 0xf7, 0xff, 0xfc, 0x69, 0xb0, 0x01, + 0x27, 0x00, 0x25, 0x00, 0x2d, 0x04, 0xdb, 0x02, + 0xe0, 0x1e, 0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa9, + 0x22, 0x0f, 0x1c, 0x10, 0x40, 0x88, 0x01, 0x29, + 0x9a, 0x00, 0x18, 0x89, 0x68, 0x49, 0x42, 0xa1, + 0xd1, 0x11, 0x21, 0x33, 0x06, 0x49, 0x6b, 0xc9, + 0x40, 0x01, 0xd0, 0x01, 0x37, 0x01, 0xe0, 0x00, + 0xe0, 0x02, 0x4b, 0x26, 0x42, 0x9f, 0xd3, 0xf4, + 0x4b, 0x24, 0x42, 0x9f, 0xd3, 0x02, 0x26, 0xa1, + 0xe0, 0x02, 0xe0, 0x3a, 0x27, 0x00, 0xe7, 0xe0, + 0x48, 0x26, 0x68, 0x01, 0x23, 0xff, 0x33, 0x01, + 0x43, 0x19, 0x60, 0x01, 0x48, 0x21, 0x6d, 0x80, + 0x49, 0x20, 0x65, 0x88, 0x48, 0x1f, 0x6b, 0xc0, + 0x23, 0x01, 0x07, 0x9b, 0x40, 0x18, 0xd0, 0x00, + 0xe7, 0xf8, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, + 0x21, 0x33, 0x06, 0x49, 0x66, 0x48, 0x20, 0x33, + 0x06, 0x40, 0x6d, 0x80, 0x21, 0x33, 0x06, 0x49, + 0x66, 0x88, 0x20, 0x03, 0x02, 0x00, 0x49, 0x15, + 0x67, 0x48, 0x48, 0x11, 0x68, 0x01, 0x23, 0x01, + 0x02, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00, + 0x49, 0x13, 0x65, 0x88, 0x20, 0x00, 0x49, 0x12, + 0x65, 0xc8, 0x20, 0x00, 0x49, 0x10, 0x66, 0x08, + 0x21, 0x00, 0x20, 0xff, 0xf0, 0x05, 0xfb, 0xb8, + 0x1c, 0x30, 0xb0, 0x01, 0xe7, 0x66, 0xb0, 0x01, + 0xe7, 0x64, 0xe7, 0x63, 0x9e, 0x00, 0x00, 0xc0, + 0x2e, 0x08, 0x9b, 0x3c, 0x00, 0x00, 0x80, 0x0f, + 0xcc, 0x00, 0x05, 0x00, 0x00, 0x1e, 0x84, 0x80, + 0x66, 0x00, 0x00, 0x4c, 0xff, 0xff, 0xfd, 0xff, + 0x2e, 0x08, 0x9b, 0x30, 0x66, 0x00, 0x00, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x66, 0x00, 0x00, 0xe0, + 0xcc, 0x00, 0x00, 0x00, 0xb5, 0xf1, 0x98, 0x00, + 0x06, 0x07, 0x0e, 0x3f, 0xb0, 0x81, 0x25, 0x00, + 0x26, 0x00, 0x4a, 0x2e, 0x92, 0x00, 0x00, 0xf8, + 0x49, 0x2d, 0x68, 0x09, 0x58, 0x08, 0x23, 0x03, + 0x03, 0x9b, 0x40, 0x18, 0x23, 0x01, 0x03, 0xdb, + 0x42, 0x98, 0xd0, 0x05, 0x20, 0xa0, 0xb0, 0x01, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x22, 0x00, 0xb4, 0x04, 0x1c, 0x38, 0x23, 0x00, + 0x22, 0x00, 0x49, 0x24, 0xf7, 0xff, 0xfb, 0xd0, + 0xb0, 0x01, 0x24, 0x00, 0x2c, 0x04, 0xdb, 0x02, + 0xe0, 0x1e, 0x34, 0x01, 0xe7, 0xfa, 0x00, 0xa1, + 0x22, 0x0f, 0x1c, 0x10, 0x40, 0x88, 0x01, 0x21, + 0x9a, 0x00, 0x18, 0x89, 0x68, 0x49, 0x42, 0xb9, + 0xd1, 0x11, 0x21, 0x33, 0x06, 0x49, 0x6b, 0xc9, + 0x40, 0x01, 0xd0, 0x01, 0x35, 0x01, 0xe0, 0x00, + 0xe0, 0x02, 0x4b, 0x17, 0x42, 0x9d, 0xd3, 0xf4, + 0x4b, 0x15, 0x42, 0x9d, 0xd9, 0x02, 0x26, 0xa1, + 0xe0, 0x02, 0xe0, 0x1d, 0x25, 0x00, 0xe7, 0xe0, + 0x20, 0x04, 0xf0, 0x02, 0xff, 0xb7, 0x20, 0x01, + 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, 0x21, 0x00, + 0x00, 0xf8, 0x4a, 0x0b, 0x68, 0x12, 0x50, 0x11, + 0x21, 0x00, 0x00, 0xf8, 0x4a, 0x08, 0x68, 0x12, + 0x18, 0x80, 0x60, 0x41, 0x21, 0x00, 0x00, 0xb8, + 0x4a, 0x08, 0x68, 0x12, 0x50, 0x11, 0x1c, 0x30, + 0xb0, 0x01, 0xe7, 0xb5, 0xb0, 0x01, 0xe7, 0xb3, + 0xe7, 0xb2, 0x00, 0x00, 0x9e, 0x00, 0x00, 0xc0, + 0x2e, 0x08, 0x9b, 0x3c, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x01, 0xd4, 0xc0, 0x2e, 0x08, 0x9b, 0x38, + 0xb5, 0xff, 0x99, 0x01, 0x06, 0x0f, 0x0e, 0x3f, + 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, 0x9b, 0x03, + 0x06, 0x1e, 0x0e, 0x36, 0x2d, 0x1f, 0xdb, 0x04, + 0x20, 0xaf, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x2f, 0x20, 0xdb, 0x01, 0x20, 0xa2, + 0xe7, 0xf7, 0x2e, 0x80, 0xd0, 0x13, 0xf0, 0x12, + 0xfc, 0xc3, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80, + 0x20, 0x01, 0xf0, 0x00, 0xfb, 0x6d, 0x2c, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfc, 0xef, 0x98, 0x00, + 0x21, 0x80, 0x68, 0x49, 0x60, 0x08, 0x48, 0x09, + 0x68, 0x00, 0x70, 0x05, 0xe0, 0x0b, 0xf0, 0x12, + 0xfc, 0xaf, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80, + 0x20, 0x02, 0xf0, 0x00, 0xfb, 0x59, 0x2c, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfc, 0xdb, 0x20, 0x00, + 0xe7, 0xd3, 0xe7, 0xd2, 0x2e, 0x08, 0x9b, 0x88, + 0xb5, 0xff, 0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, + 0x9a, 0x02, 0x06, 0x17, 0x0e, 0x3f, 0x9b, 0x03, + 0x06, 0x1c, 0x0e, 0x24, 0xb0, 0x82, 0x20, 0x80, + 0x40, 0x38, 0x90, 0x00, 0x06, 0x7f, 0x0e, 0x7f, + 0x2e, 0x1f, 0xdb, 0x05, 0x20, 0xaf, 0xb0, 0x02, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2c, 0x20, 0xdb, 0x02, 0x20, 0xa2, 0xb0, 0x02, + 0xe7, 0xf6, 0x2f, 0x04, 0xd1, 0x00, 0x27, 0x00, + 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 0x49, 0x17, + 0x68, 0x09, 0x18, 0x40, 0x90, 0x01, 0x98, 0x00, + 0x28, 0x00, 0xd0, 0x0d, 0xf0, 0x12, 0xfc, 0x74, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0x92, + 0x20, 0x02, 0xf0, 0x00, 0xfb, 0x1d, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfc, 0x9f, 0xe0, 0x13, + 0xf0, 0x12, 0xfc, 0x66, 0x1c, 0x05, 0x1c, 0x21, + 0x22, 0x01, 0x02, 0x92, 0x20, 0x01, 0xf0, 0x00, + 0xfb, 0x0f, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x12, + 0xfc, 0x91, 0x98, 0x02, 0x21, 0x80, 0x68, 0x89, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0x00, 0x55, 0xc6, + 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xc4, 0xb0, 0x02, + 0xe7, 0xc2, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x30, + 0xb5, 0xff, 0xb0, 0x82, 0x99, 0x03, 0x04, 0x0d, + 0x0c, 0x2d, 0x9a, 0x04, 0x06, 0x10, 0x0e, 0x00, + 0x90, 0x00, 0x9b, 0x05, 0x06, 0x18, 0x0e, 0x00, + 0x90, 0x01, 0x98, 0x00, 0x28, 0x1f, 0xdb, 0x05, + 0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x23, 0x80, + 0x40, 0x18, 0xd1, 0x2f, 0x98, 0x00, 0x49, 0x2c, + 0x68, 0x09, 0x73, 0x08, 0x27, 0x00, 0x2f, 0x20, + 0xdb, 0x04, 0xe0, 0x26, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0xe7, 0xf8, 0x20, 0x01, 0x40, 0xb8, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x1c, 0x24, 0x00, + 0x20, 0x40, 0x40, 0x28, 0xd0, 0x04, 0x04, 0x20, + 0x0c, 0x00, 0x24, 0x01, 0x03, 0xa4, 0x43, 0x04, + 0x20, 0x80, 0x40, 0x28, 0xd0, 0x04, 0x04, 0x20, + 0x0c, 0x00, 0x24, 0x01, 0x03, 0xe4, 0x43, 0x04, + 0xf0, 0x12, 0xfc, 0x0e, 0x1c, 0x06, 0x1c, 0x22, + 0x1c, 0x39, 0x20, 0x01, 0xf0, 0x00, 0xfa, 0xb8, + 0x2e, 0x80, 0xd0, 0x01, 0xf0, 0x12, 0xfc, 0x3a, + 0xe7, 0xd8, 0xe0, 0x24, 0x27, 0x00, 0x2f, 0x20, + 0xdb, 0x04, 0xe0, 0x20, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0xe7, 0xf8, 0x20, 0x01, 0x40, 0xb8, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x16, 0x24, 0x00, + 0x20, 0x40, 0x40, 0x28, 0xd0, 0x01, 0x4b, 0x0d, + 0x40, 0x1c, 0x20, 0x80, 0x40, 0x28, 0xd0, 0x01, + 0x04, 0x64, 0x0c, 0x64, 0xf0, 0x12, 0xfb, 0xe8, + 0x1c, 0x06, 0x1c, 0x22, 0x1c, 0x39, 0x20, 0x02, + 0xf0, 0x00, 0xfa, 0x92, 0x2e, 0x80, 0xd0, 0x01, + 0xf0, 0x12, 0xfc, 0x14, 0xe7, 0xde, 0x20, 0x00, + 0xb0, 0x02, 0xe7, 0x9f, 0xb0, 0x02, 0xe7, 0x9d, + 0x2e, 0x08, 0x9b, 0x7c, 0x00, 0x00, 0xbf, 0xff, + 0xb5, 0x80, 0x1c, 0x07, 0x48, 0x07, 0x68, 0x01, + 0x20, 0x00, 0xf0, 0x1b, 0xfa, 0xad, 0x60, 0x38, + 0x48, 0x04, 0x68, 0x00, 0x1d, 0x01, 0x20, 0x00, + 0xf0, 0x1b, 0xfa, 0xa6, 0x60, 0x78, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x9b, 0x7c, + 0xb5, 0xf7, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0e, + 0x0e, 0x36, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, + 0x2e, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20, + 0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x20, 0x80, + 0x40, 0x20, 0xd0, 0x0d, 0xf0, 0x12, 0xfb, 0xa8, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2, + 0x20, 0x02, 0xf0, 0x00, 0xfa, 0x51, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfb, 0xd3, 0xe0, 0x16, + 0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b, + 0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09, + 0x68, 0x09, 0x71, 0x08, 0xf0, 0x12, 0xfb, 0x90, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2, + 0x20, 0x01, 0xf0, 0x00, 0xfa, 0x39, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfb, 0xbb, 0x20, 0x00, + 0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x9b, 0x80, + 0xb5, 0xf7, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0e, + 0x0e, 0x36, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, + 0x2e, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20, + 0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x20, 0x80, + 0x40, 0x20, 0xd0, 0x0d, 0xf0, 0x12, 0xfb, 0x68, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12, + 0x20, 0x02, 0xf0, 0x00, 0xfa, 0x11, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfb, 0x93, 0xe0, 0x16, + 0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b, + 0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09, + 0x68, 0x09, 0x71, 0x08, 0xf0, 0x12, 0xfb, 0x50, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12, + 0x20, 0x01, 0xf0, 0x00, 0xf9, 0xf9, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x12, 0xfb, 0x7b, 0x20, 0x00, + 0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x9b, 0x84, + 0xb5, 0xff, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, 0x06, 0x0d, + 0x0e, 0x2d, 0x9a, 0x03, 0x06, 0x16, 0x0e, 0x36, + 0x9f, 0x04, 0x1c, 0x29, 0x98, 0x00, 0xf0, 0x00, + 0xf8, 0x91, 0x28, 0x00, 0xd0, 0x05, 0x20, 0xa2, + 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x79, 0x38, 0x79, 0x79, 0x18, 0x40, + 0x79, 0xb9, 0x18, 0x40, 0x06, 0x04, 0x0e, 0x24, + 0x79, 0xb8, 0x02, 0x00, 0x43, 0x04, 0x00, 0x68, + 0x19, 0x80, 0x01, 0x00, 0x49, 0x15, 0x68, 0x09, + 0x50, 0x0c, 0x9b, 0x04, 0x88, 0x99, 0x00, 0x68, + 0x19, 0x80, 0x01, 0x00, 0x4a, 0x11, 0x68, 0x12, + 0x18, 0x80, 0x60, 0x41, 0x78, 0x78, 0x78, 0x39, + 0x18, 0x40, 0x78, 0xb9, 0x18, 0x40, 0x06, 0x04, + 0x0e, 0x24, 0x78, 0xb8, 0x02, 0x00, 0x43, 0x04, + 0x00, 0x68, 0x19, 0x80, 0x01, 0x00, 0x49, 0x09, + 0x68, 0x09, 0x18, 0x40, 0x60, 0x84, 0x9b, 0x04, + 0x88, 0x19, 0x00, 0x68, 0x19, 0x80, 0x01, 0x00, + 0x4a, 0x04, 0x68, 0x12, 0x18, 0x80, 0x60, 0xc1, + 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xc5, 0xb0, 0x01, + 0xe7, 0xc3, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x34, + 0xb5, 0xff, 0x1c, 0x07, 0x06, 0x3d, 0x0e, 0x2d, + 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0x9a, 0x02, + 0x06, 0x16, 0x0e, 0x36, 0x1c, 0x21, 0x1c, 0x28, + 0xf0, 0x00, 0xf8, 0x40, 0x28, 0x00, 0xd0, 0x04, + 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x9a, 0x03, 0x1c, 0x31, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x02, 0xe7, 0xf5, 0xe7, 0xf4, + 0xb4, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, + 0x06, 0x21, 0x0e, 0x09, 0x06, 0x3a, 0x0e, 0x12, + 0x29, 0x10, 0xdb, 0x02, 0x20, 0xa2, 0xbc, 0xf0, + 0x47, 0x70, 0x88, 0xdd, 0x00, 0x48, 0x18, 0x80, + 0x01, 0x00, 0x4e, 0x0f, 0x68, 0x36, 0x50, 0x35, + 0x88, 0x98, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, + 0x4e, 0x0b, 0x68, 0x36, 0x19, 0xad, 0x60, 0x68, + 0x88, 0x58, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, + 0x4e, 0x07, 0x68, 0x36, 0x19, 0xad, 0x60, 0xa8, + 0x88, 0x18, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, + 0x4e, 0x03, 0x68, 0x36, 0x19, 0xad, 0x60, 0xe8, + 0x20, 0x00, 0xe7, 0xdc, 0xe7, 0xdb, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0x34, 0xb4, 0xb0, 0x1c, 0x07, + 0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x06, 0x15, + 0x0e, 0x2d, 0xb0, 0x81, 0x29, 0x20, 0xdb, 0x03, + 0x20, 0xa2, 0xb0, 0x01, 0xbc, 0xb0, 0x47, 0x70, + 0x2d, 0x10, 0xdb, 0x02, 0x20, 0xa2, 0xb0, 0x01, + 0xe7, 0xf8, 0x00, 0xc8, 0x4b, 0x0a, 0x68, 0x1b, + 0x18, 0xc4, 0x68, 0x20, 0x90, 0x00, 0x98, 0x00, + 0x4b, 0x08, 0x40, 0x18, 0x90, 0x00, 0x00, 0x68, + 0x23, 0x1e, 0x40, 0x18, 0x9b, 0x00, 0x43, 0x18, + 0x90, 0x00, 0x98, 0x00, 0x60, 0x20, 0x20, 0x00, + 0xb0, 0x01, 0xe7, 0xe3, 0xb0, 0x01, 0xe7, 0xe1, + 0x2e, 0x08, 0x9b, 0x3c, 0xff, 0xff, 0xdf, 0xe1, + 0x20, 0xff, 0x49, 0x02, 0x68, 0x09, 0x70, 0x08, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x98, + 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0xb0, 0x83, + 0x20, 0x00, 0x43, 0xc0, 0x23, 0x19, 0x06, 0x9b, + 0x67, 0x58, 0x08, 0xb9, 0x00, 0x89, 0x1a, 0x78, + 0x90, 0x02, 0x98, 0x02, 0x18, 0x10, 0x07, 0x80, + 0x0f, 0x80, 0x90, 0x01, 0x98, 0x02, 0x18, 0x10, + 0x08, 0x80, 0x90, 0x00, 0x9b, 0x02, 0x20, 0x03, + 0x1a, 0xc0, 0x23, 0x19, 0x06, 0x9b, 0x67, 0xd8, + 0x24, 0x00, 0x98, 0x00, 0x42, 0x84, 0xd3, 0x02, + 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xf9, 0xc9, 0x08, + 0x20, 0x19, 0x06, 0x80, 0x67, 0x03, 0xe7, 0xf8, + 0x98, 0x01, 0x28, 0x00, 0xd0, 0x0b, 0x9b, 0x01, + 0x00, 0xd8, 0x25, 0x00, 0x43, 0xed, 0x40, 0xc5, + 0x1c, 0x2b, 0x43, 0xdb, 0x68, 0x0d, 0x40, 0x2b, + 0x25, 0x19, 0x06, 0xad, 0x67, 0x2b, 0x20, 0x19, + 0x06, 0x80, 0x6f, 0x40, 0xb0, 0x03, 0xbc, 0xb0, + 0x47, 0x70, 0xb0, 0x03, 0xe7, 0xfb, 0x1c, 0x01, + 0x06, 0x08, 0x0e, 0x00, 0x22, 0x19, 0x06, 0x92, + 0x63, 0x90, 0x47, 0x70, 0xb4, 0xf0, 0x48, 0x4d, + 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x74, + 0x22, 0x00, 0x27, 0x00, 0x49, 0x4a, 0x20, 0x00, + 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x16, 0x1c, 0x43, + 0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, 0x00, 0x83, + 0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b, 0x40, 0x23, + 0xd0, 0x0b, 0x24, 0x01, 0x40, 0x84, 0x1c, 0x23, + 0x43, 0x1f, 0x00, 0x83, 0x58, 0xcc, 0x23, 0x01, + 0x03, 0x5b, 0x43, 0x9c, 0x1c, 0x23, 0x00, 0x84, + 0x51, 0x0b, 0xe7, 0xe8, 0x20, 0x00, 0x28, 0x04, + 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x43, 0x06, 0x18, + 0x0e, 0x00, 0xe7, 0xf8, 0x01, 0x05, 0x4b, 0x39, + 0x18, 0xec, 0x22, 0x00, 0x2a, 0x04, 0xdb, 0x04, + 0xe0, 0x0e, 0x1c, 0x53, 0x06, 0x1a, 0x0e, 0x12, + 0xe7, 0xf8, 0x4b, 0x35, 0x60, 0x23, 0x4b, 0x35, + 0x60, 0x63, 0x23, 0x00, 0x60, 0xa3, 0x23, 0x00, + 0x60, 0xe3, 0x34, 0xff, 0x34, 0x01, 0xe7, 0xf0, + 0xe7, 0xe4, 0xb0, 0x82, 0x4b, 0x2b, 0x69, 0xdc, + 0x23, 0x0c, 0x40, 0x23, 0x08, 0x9c, 0xab, 0x01, + 0x70, 0x1c, 0x4b, 0x28, 0x69, 0xdc, 0x23, 0x30, + 0x40, 0x23, 0x09, 0x1c, 0xab, 0x00, 0x70, 0x1c, + 0xab, 0x01, 0x78, 0x1b, 0xac, 0x00, 0x78, 0x24, + 0x42, 0xa3, 0xd1, 0x09, 0x23, 0x33, 0x06, 0x5b, + 0x6b, 0xdb, 0x2b, 0x00, 0xd1, 0x04, 0x4b, 0x1f, + 0x6a, 0x9b, 0x07, 0xdb, 0x0f, 0xdb, 0xd0, 0x21, + 0x4b, 0x1c, 0x69, 0xdd, 0x23, 0x0c, 0x40, 0x2b, + 0x08, 0x9c, 0x00, 0xa5, 0x26, 0x01, 0x40, 0xae, + 0x1c, 0x33, 0x25, 0x33, 0x06, 0x6d, 0x64, 0x2b, + 0x25, 0x01, 0x40, 0xa5, 0x1c, 0x2b, 0x4d, 0x1a, + 0x63, 0xab, 0x4b, 0x14, 0x69, 0xdd, 0x23, 0x0c, + 0x40, 0x2b, 0x08, 0x9d, 0xab, 0x01, 0x70, 0x1d, + 0xe0, 0x00, 0xe0, 0x1d, 0x4b, 0x0f, 0x69, 0xdd, + 0x23, 0x30, 0x40, 0x2b, 0x09, 0x1d, 0xab, 0x00, + 0x70, 0x1d, 0xe7, 0xcd, 0xb0, 0x02, 0x20, 0x00, + 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x10, 0x1c, 0x43, + 0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, 0x24, 0x01, + 0x40, 0x84, 0x1c, 0x23, 0x40, 0x3b, 0xd0, 0x06, + 0x00, 0x83, 0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b, + 0x43, 0x23, 0x00, 0x84, 0x51, 0x0b, 0xe7, 0xee, + 0xbc, 0xf0, 0x47, 0x70, 0x66, 0x00, 0x01, 0x00, + 0x64, 0x00, 0x00, 0x80, 0x9e, 0x00, 0x00, 0xc0, + 0x9e, 0x00, 0x00, 0x00, 0x2e, 0x0f, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x80, 0xb4, 0x80, 0x1c, 0x03, + 0x1c, 0x0a, 0x48, 0x0a, 0x68, 0x00, 0x68, 0x01, + 0x20, 0x19, 0x06, 0x80, 0x6a, 0x80, 0x0a, 0x40, + 0x00, 0x4f, 0x43, 0x38, 0x60, 0x18, 0x0f, 0xc8, + 0x07, 0xc0, 0x60, 0x10, 0x68, 0x10, 0x0f, 0xc0, + 0x60, 0x10, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, + 0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xa4, + 0xb5, 0x80, 0x1c, 0x07, 0x48, 0x05, 0x68, 0x00, + 0x1d, 0xc1, 0x31, 0x01, 0x20, 0x00, 0xf0, 0x1b, + 0xf8, 0x37, 0x60, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x7c, + 0xb4, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, + 0x06, 0x20, 0x0e, 0x00, 0x06, 0x39, 0x0e, 0x09, + 0x04, 0x1a, 0x0c, 0x12, 0x4d, 0x07, 0x68, 0x2d, + 0x70, 0xe8, 0x4d, 0x06, 0x68, 0x2d, 0x70, 0xa9, + 0x4d, 0x04, 0x68, 0x2d, 0x80, 0x2a, 0x25, 0x01, + 0x04, 0x2d, 0x26, 0x33, 0x06, 0x76, 0x60, 0x35, + 0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x9b, 0xa8, + 0x20, 0x0d, 0x06, 0xc0, 0x69, 0xc0, 0x47, 0x70, + 0xe7, 0xfd, 0x1c, 0x01, 0x31, 0x01, 0x23, 0x2d, + 0x01, 0x1b, 0x42, 0x99, 0xd9, 0x03, 0x20, 0x2d, + 0x01, 0x00, 0x47, 0x70, 0xe0, 0x01, 0x1c, 0x08, + 0xe7, 0xfb, 0xe7, 0xfa, 0xb5, 0xf3, 0xb0, 0x85, + 0x20, 0x00, 0x90, 0x03, 0x20, 0x00, 0x90, 0x02, + 0x9f, 0x05, 0x69, 0x3d, 0x69, 0x38, 0x28, 0x13, + 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x05, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x99, 0x06, + 0x68, 0x88, 0x68, 0x09, 0x1a, 0x40, 0x1c, 0x41, + 0x91, 0x04, 0x69, 0x78, 0x23, 0x04, 0x40, 0x18, + 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, + 0x00, 0xa8, 0x49, 0xf8, 0x58, 0x08, 0x99, 0x04, + 0x43, 0x48, 0x61, 0xf8, 0x99, 0x06, 0x68, 0x88, + 0x68, 0x09, 0x1a, 0x40, 0x30, 0x01, 0x63, 0xb8, + 0x68, 0xf8, 0x90, 0x01, 0x48, 0xf2, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x06, 0x98, 0x01, 0x28, 0x19, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0xe0, 0x05, 0x98, 0x01, 0x28, 0x08, 0xd3, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, + 0xd0, 0x07, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06, + 0xf0, 0x02, 0xf9, 0xea, 0x20, 0x00, 0xb0, 0x05, + 0xe7, 0xc5, 0x49, 0xe6, 0x20, 0x91, 0xf0, 0x1a, + 0xff, 0xb7, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x0b, 0xfb, 0x64, 0xe7, 0xf5, 0x98, 0x01, + 0x00, 0x80, 0x49, 0xe1, 0x58, 0x08, 0x99, 0x05, + 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 0x49, 0xdd, + 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, 0xe7, 0xae, + 0x48, 0xd9, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, + 0x2d, 0x0b, 0xdb, 0x26, 0x2d, 0x12, 0xdc, 0x24, + 0x2d, 0x0b, 0xdb, 0x0b, 0x2d, 0x12, 0xdc, 0x09, + 0x48, 0xd6, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, + 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06, 0xf0, 0x02, + 0xf9, 0xbb, 0xe0, 0x16, 0x6b, 0x38, 0xf7, 0xff, + 0xff, 0x7c, 0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00, + 0x48, 0xcf, 0xf0, 0x0c, 0xfb, 0x4b, 0x1d, 0xf8, + 0x30, 0x21, 0x99, 0x06, 0xf0, 0x02, 0xf9, 0xac, + 0x6b, 0x38, 0xf7, 0xff, 0xff, 0x6e, 0x90, 0x00, + 0x6a, 0xb9, 0x9a, 0x00, 0x48, 0xc8, 0xf0, 0x0c, + 0xfb, 0x6b, 0x48, 0xc8, 0x68, 0x00, 0x99, 0x05, + 0x42, 0x88, 0xd1, 0x30, 0x48, 0xc0, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x2c, 0x48, 0xc1, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x0a, 0x20, 0x0d, 0x06, 0xc0, + 0x68, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x01, + 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0xc8, 0x48, 0xba, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x0d, 0x6a, 0xb8, 0x30, 0x01, 0x05, 0x00, + 0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, 0x43, 0x08, + 0x6b, 0x79, 0x31, 0x02, 0x43, 0x08, 0x21, 0x0d, + 0x06, 0xc9, 0x61, 0x88, 0xe0, 0x0b, 0x6a, 0xb8, + 0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, + 0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, + 0x43, 0x08, 0x49, 0xaf, 0x60, 0x08, 0x2d, 0x0b, + 0xdb, 0x15, 0x2d, 0x12, 0xdc, 0x13, 0x48, 0xa9, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0f, 0x48, 0xa4, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x0b, 0x20, 0x00, + 0x62, 0xb8, 0x20, 0x00, 0x62, 0xf8, 0x48, 0xa7, + 0x63, 0x38, 0x48, 0xa7, 0x63, 0x78, 0x6b, 0x38, + 0xf7, 0xff, 0xff, 0x1b, 0x90, 0x00, 0x48, 0x9c, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d, + 0x06, 0xc0, 0x68, 0x80, 0x90, 0x03, 0x20, 0x00, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x01, + 0xfb, 0x07, 0x6b, 0x38, 0xf7, 0xff, 0xff, 0x09, + 0x90, 0x00, 0x9a, 0x00, 0x99, 0x01, 0x1c, 0x38, + 0xf0, 0x01, 0xfa, 0x8c, 0x98, 0x03, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0x48, 0x93, 0x68, 0x00, + 0x99, 0x05, 0x42, 0x88, 0xd1, 0x0b, 0x48, 0x8c, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x07, 0x48, 0x8d, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x98, 0x02, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x48, 0x86, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 0x48, 0x87, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, 0xb0, 0x84, + 0x98, 0x05, 0xf0, 0x0c, 0xf9, 0xe1, 0x28, 0x00, + 0xd1, 0x0e, 0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12, + 0xdd, 0x0a, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x0a, + 0xf0, 0x02, 0xf9, 0x12, 0x20, 0x92, 0x49, 0x7b, + 0x60, 0x08, 0x20, 0x00, 0xb0, 0x09, 0xe6, 0xea, + 0x49, 0x80, 0x20, 0x91, 0xf0, 0x1a, 0xfe, 0xdc, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0c, + 0xfa, 0x22, 0x20, 0x92, 0x49, 0x7b, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x7b, 0x68, 0x09, 0x60, 0x08, + 0x2d, 0x0b, 0xdb, 0x39, 0x2d, 0x12, 0xdc, 0x37, + 0xb0, 0x81, 0x24, 0x00, 0x20, 0x00, 0x90, 0x03, + 0x20, 0x01, 0x49, 0x75, 0x68, 0x09, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x6a, 0xb8, + 0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, + 0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, + 0x43, 0x08, 0x90, 0x00, 0x20, 0x00, 0x62, 0xb8, + 0x20, 0x00, 0x62, 0xf8, 0x48, 0x67, 0x63, 0x38, + 0x48, 0x67, 0x63, 0x78, 0x6b, 0x38, 0xf7, 0xff, + 0xfe, 0x9c, 0x90, 0x02, 0x48, 0x66, 0x68, 0x00, + 0x23, 0x77, 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x02, + 0x1c, 0x39, 0xf0, 0x0b, 0xfe, 0x05, 0x98, 0x00, + 0x49, 0x61, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x66, 0xc8, 0x48, 0x5e, 0x68, 0x00, + 0xf0, 0x0c, 0xf9, 0xf8, 0xb0, 0x01, 0xe1, 0x2b, + 0x24, 0x00, 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x16, + 0x2c, 0x07, 0xd2, 0x14, 0x6a, 0xf8, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, + 0x18, 0x18, 0x00, 0xc0, 0xe0, 0x00, 0xe1, 0x3c, + 0x4a, 0x53, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, + 0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe6, 0x2e, 0x00, + 0xd1, 0x13, 0x2c, 0x18, 0xd2, 0x11, 0x6a, 0xf8, + 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, + 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x48, 0x68, 0x12, + 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x40, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01, + 0xe7, 0xe9, 0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff, + 0xfe, 0x50, 0x90, 0x01, 0x2c, 0x07, 0xd2, 0x05, + 0x48, 0x3f, 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0b, + 0xfc, 0xcb, 0xe0, 0x06, 0x2c, 0x18, 0xd2, 0x04, + 0x1f, 0xe0, 0x49, 0x3b, 0x68, 0x09, 0xf0, 0x0b, + 0xfd, 0x01, 0x48, 0x3a, 0x49, 0x38, 0x68, 0x09, + 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x66, 0xc8, + 0x48, 0x36, 0x49, 0x35, 0x68, 0x09, 0x23, 0x09, + 0x01, 0xdb, 0x18, 0xc9, 0x67, 0x08, 0x48, 0x33, + 0x49, 0x31, 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, + 0x18, 0xc9, 0x66, 0x88, 0x48, 0x2f, 0x49, 0x2e, + 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, + 0x66, 0x48, 0x20, 0x00, 0x49, 0x2a, 0x68, 0x09, + 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, + 0x6b, 0x79, 0x48, 0x27, 0x68, 0x00, 0xf0, 0x0b, + 0xfd, 0x4b, 0x94, 0x02, 0x1d, 0xf8, 0x30, 0x21, + 0x99, 0x0a, 0xf0, 0x02, 0xf8, 0x4d, 0x24, 0x00, + 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x14, 0x2c, 0x07, + 0xd2, 0x12, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, 0x18, 0x18, + 0x00, 0xc0, 0x4a, 0x1b, 0x68, 0x12, 0x18, 0x80, + 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, + 0x42, 0x81, 0xda, 0x00, 0x26, 0x01, 0xe7, 0xe8, + 0x2e, 0x00, 0xd1, 0x2f, 0x2c, 0x18, 0xd2, 0x2d, + 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, + 0x34, 0x01, 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x10, + 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, 0xda, 0x1c, + 0xe0, 0x1a, 0x00, 0x00, 0x2e, 0x03, 0xa8, 0xc8, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, + 0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xbb, 0x00, 0x2e, 0x08, 0xba, 0x28, + 0x2e, 0x08, 0x9b, 0xb8, 0x00, 0x00, 0x02, 0xcf, + 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0xd1, 0xf4, + 0x2e, 0x08, 0xbb, 0x20, 0x00, 0x00, 0xff, 0xff, + 0x26, 0x01, 0xe7, 0xcd, 0x3c, 0x01, 0x6b, 0x38, + 0xf7, 0xff, 0xfd, 0xc3, 0x90, 0x01, 0x2c, 0x07, + 0xd2, 0x12, 0x48, 0x48, 0x68, 0x01, 0x1c, 0x20, + 0xf0, 0x0b, 0xfb, 0xcc, 0x00, 0xa0, 0x19, 0x00, + 0x00, 0xc0, 0x49, 0x44, 0x68, 0x09, 0x18, 0x40, + 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, 0x9a, 0x01, + 0x1c, 0x39, 0xf0, 0x0b, 0xfd, 0x21, 0xe0, 0x4a, + 0x2c, 0x18, 0xd2, 0x48, 0x1f, 0xe0, 0x49, 0x3d, + 0x68, 0x09, 0xf0, 0x0b, 0xfc, 0x0b, 0x20, 0x4c, + 0x43, 0x60, 0x49, 0x3a, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x9a, 0x01, + 0x1c, 0x39, 0xf0, 0x0b, 0xfd, 0x0d, 0x20, 0x4c, + 0x43, 0x60, 0x49, 0x34, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x82, 0x6f, 0xc0, + 0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c, 0x43, 0x60, + 0x49, 0x2e, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, + 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c, 0x43, 0x60, + 0x49, 0x28, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, + 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x0c, 0x00, + 0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02, 0x21, 0x4c, + 0x43, 0x61, 0x4a, 0x22, 0x68, 0x12, 0x18, 0x89, + 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, + 0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c, 0x43, 0x61, + 0x4a, 0x1c, 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, + 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 0x48, 0x19, + 0x68, 0x00, 0xf0, 0x0c, 0xf8, 0xcf, 0x6b, 0x79, + 0x48, 0x16, 0x68, 0x00, 0xf0, 0x0b, 0xfc, 0x36, + 0x98, 0x02, 0x42, 0x84, 0xda, 0x01, 0x1c, 0x21, + 0xe0, 0x00, 0x99, 0x02, 0x91, 0x00, 0x99, 0x00, + 0x48, 0x10, 0x68, 0x00, 0xf0, 0x0b, 0xfd, 0x46, + 0x49, 0x0f, 0x20, 0x91, 0xf0, 0x1a, 0xfd, 0x58, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x0b, + 0x68, 0x00, 0x90, 0x03, 0x48, 0x0b, 0x68, 0x00, + 0x49, 0x08, 0x60, 0x08, 0x98, 0x03, 0x49, 0x09, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, + 0xb0, 0x04, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x05, 0xe5, 0x4b, 0xb0, 0x05, + 0xe5, 0x49, 0x00, 0x00, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x24, + 0x2e, 0x08, 0xba, 0x2c, 0xb5, 0xff, 0x1c, 0x07, + 0x9d, 0x09, 0xb0, 0x89, 0x26, 0x00, 0x20, 0x00, + 0x90, 0x03, 0x99, 0x0a, 0x68, 0x4c, 0x2d, 0x13, + 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x09, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x15, + 0x60, 0x04, 0x20, 0x00, 0x60, 0xe0, 0x20, 0x00, + 0x61, 0x20, 0x69, 0x60, 0x4b, 0xf9, 0x40, 0x18, + 0x61, 0x60, 0x02, 0x00, 0x69, 0x60, 0x4b, 0xf8, + 0x40, 0x18, 0x61, 0x60, 0x04, 0x80, 0x69, 0x60, + 0x4b, 0xf6, 0x40, 0x18, 0x61, 0x60, 0x05, 0x80, + 0x69, 0x60, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x18, + 0x61, 0x60, 0x06, 0x00, 0x69, 0x60, 0x4b, 0xf2, + 0x40, 0x18, 0x61, 0x60, 0x04, 0x40, 0x69, 0x60, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x61, 0x60, + 0x06, 0x80, 0x69, 0x60, 0x09, 0x40, 0x01, 0x40, + 0x61, 0x60, 0x06, 0xc0, 0x20, 0x00, 0x61, 0xa0, + 0x20, 0x00, 0x61, 0xe0, 0x20, 0x00, 0x62, 0x20, + 0x20, 0x00, 0x62, 0x60, 0x20, 0x00, 0x63, 0xa0, + 0x20, 0x00, 0x63, 0xe0, 0x20, 0x00, 0x64, 0x60, + 0x20, 0x00, 0x64, 0x20, 0x20, 0x00, 0x60, 0x20, + 0x20, 0x00, 0x71, 0x20, 0x99, 0x0a, 0x68, 0x48, + 0x64, 0xe0, 0x99, 0x0a, 0x68, 0x08, 0x64, 0xa0, + 0x1d, 0xe0, 0x30, 0x21, 0x99, 0x13, 0xf0, 0x01, + 0xff, 0x07, 0x2d, 0x0b, 0xdb, 0x06, 0x2d, 0x12, + 0xdc, 0x04, 0x1d, 0xe0, 0x30, 0x49, 0x99, 0x13, + 0xf0, 0x01, 0xfe, 0xfe, 0x6b, 0x20, 0x6a, 0xa1, + 0x1a, 0x40, 0x30, 0x01, 0x63, 0xa0, 0x00, 0xa8, + 0x49, 0xd4, 0x58, 0x08, 0x69, 0x61, 0x09, 0x49, + 0x01, 0x49, 0x06, 0xc0, 0x0e, 0xc0, 0x43, 0x08, + 0x61, 0x60, 0x06, 0xc0, 0x0e, 0xc0, 0x6b, 0x20, + 0x6a, 0xa1, 0x1a, 0x40, 0x1c, 0x41, 0x91, 0x04, + 0x69, 0x60, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, + 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, 0x00, 0xa8, + 0x49, 0xc9, 0x58, 0x08, 0x99, 0x04, 0x43, 0x48, + 0x61, 0xe0, 0x2d, 0x13, 0xd1, 0x04, 0x20, 0x00, + 0x90, 0x14, 0x20, 0x00, 0x61, 0xa0, 0xe0, 0x13, + 0x9b, 0x0c, 0x68, 0x58, 0x90, 0x01, 0x98, 0x01, + 0x08, 0x80, 0x61, 0xa0, 0x98, 0x01, 0x64, 0x60, + 0x9b, 0x0c, 0x68, 0x18, 0x64, 0x20, 0x20, 0x00, + 0x62, 0x60, 0x9a, 0x0b, 0x63, 0xe2, 0x69, 0x60, + 0x4b, 0xb6, 0x40, 0x18, 0x61, 0x60, 0x02, 0x00, + 0x69, 0x60, 0x4b, 0xb6, 0x40, 0x18, 0x61, 0x60, + 0x05, 0x80, 0x69, 0x60, 0x23, 0x0f, 0x02, 0x9b, + 0x43, 0x18, 0x61, 0x60, 0x04, 0x80, 0x69, 0x60, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x61, 0x60, + 0x06, 0x80, 0x69, 0x60, 0x23, 0xc0, 0x43, 0x18, + 0x61, 0x60, 0x06, 0x00, 0x69, 0x60, 0x23, 0x01, + 0x03, 0x9b, 0x43, 0x18, 0x61, 0x60, 0x04, 0x40, + 0x98, 0x14, 0x60, 0xe0, 0x61, 0x25, 0x48, 0xab, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x98, 0x14, + 0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0xe0, 0x05, 0x98, 0x14, 0x28, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x09, + 0xe7, 0x35, 0x49, 0xa1, 0x20, 0x91, 0xf0, 0x1a, + 0xfc, 0x5b, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x0b, 0xf8, 0x08, 0xe7, 0xf5, 0x48, 0x9d, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x53, 0x68, 0x38, + 0x01, 0x80, 0x0f, 0xc0, 0x68, 0xa1, 0x4b, 0x9a, + 0x40, 0x19, 0x07, 0xc0, 0x09, 0x80, 0x43, 0x08, + 0x60, 0xa0, 0x01, 0x80, 0x0f, 0xc0, 0x68, 0x38, + 0x01, 0xc0, 0x0f, 0xc0, 0x68, 0xa1, 0x4b, 0x95, + 0x40, 0x19, 0x07, 0xc0, 0x09, 0xc0, 0x43, 0x08, + 0x60, 0xa0, 0x01, 0xc0, 0x0f, 0xc0, 0x68, 0x38, + 0x02, 0x00, 0x0e, 0x00, 0x68, 0xa1, 0x4b, 0x85, + 0x40, 0x19, 0x06, 0x00, 0x0e, 0x00, 0x04, 0x00, + 0x43, 0x08, 0x60, 0xa0, 0x02, 0x00, 0x0e, 0x00, + 0x48, 0x86, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x2a, + 0x2f, 0x00, 0xd0, 0x28, 0x20, 0x0d, 0x06, 0xc0, + 0x6a, 0x00, 0x1c, 0x06, 0x68, 0x38, 0x4b, 0x85, + 0x43, 0x98, 0xd0, 0x06, 0x68, 0x38, 0x02, 0x00, + 0x0e, 0x01, 0x20, 0x01, 0x40, 0x88, 0x43, 0x06, + 0xe0, 0x05, 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, + 0x21, 0x01, 0x40, 0x81, 0x43, 0x8e, 0x68, 0x38, + 0x4b, 0x7b, 0x43, 0x98, 0xd0, 0x08, 0x68, 0x38, + 0x02, 0x00, 0x0e, 0x00, 0x1d, 0xc1, 0x31, 0x01, + 0x20, 0x01, 0x40, 0x88, 0x43, 0x06, 0xe0, 0x06, + 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, 0x30, 0x08, + 0x21, 0x01, 0x40, 0x81, 0x43, 0x8e, 0x2d, 0x0b, + 0xdb, 0x0a, 0x2d, 0x12, 0xdc, 0x08, 0x48, 0x6f, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x20, 0x51, + 0x01, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x08, + 0x98, 0x14, 0x00, 0x80, 0x49, 0x6c, 0x58, 0x08, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0x83, 0x90, 0x03, + 0x2d, 0x0b, 0xdb, 0x08, 0x2d, 0x12, 0xdc, 0x06, + 0x48, 0x68, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x01, + 0x20, 0x84, 0x90, 0x03, 0xe0, 0x06, 0x9a, 0x0b, + 0x2a, 0x01, 0xd1, 0x03, 0x2d, 0x13, 0xd0, 0x01, + 0x20, 0x82, 0x90, 0x03, 0x98, 0x03, 0x28, 0x00, + 0xd0, 0x07, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, + 0x20, 0x08, 0x60, 0xe0, 0x98, 0x03, 0xb0, 0x09, + 0xe6, 0xa1, 0x98, 0x15, 0x68, 0x01, 0x98, 0x14, + 0x00, 0x80, 0x4a, 0x59, 0x50, 0x11, 0x6a, 0xa0, + 0x28, 0x00, 0xda, 0x01, 0x20, 0x00, 0x62, 0xa0, + 0x6b, 0x20, 0x28, 0x00, 0xdc, 0x01, 0x20, 0x01, + 0x63, 0x20, 0x6a, 0xe0, 0x28, 0x00, 0xda, 0x01, + 0x20, 0x00, 0x62, 0xe0, 0x6b, 0x60, 0x4b, 0x52, + 0x42, 0x98, 0xdd, 0x01, 0x48, 0x50, 0x63, 0x60, + 0x6b, 0x20, 0xf7, 0xff, 0xfb, 0x9e, 0x90, 0x00, + 0x2d, 0x13, 0xd1, 0x05, 0x6a, 0xa1, 0x9a, 0x00, + 0x48, 0x4c, 0xf0, 0x0b, 0xff, 0x99, 0xe0, 0x15, + 0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12, 0xdd, 0x03, + 0x48, 0x40, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x0d, + 0x2d, 0x0b, 0xdb, 0x06, 0x2d, 0x12, 0xdc, 0x04, + 0x48, 0x3e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x00, + 0xe0, 0x04, 0x6a, 0xa1, 0x9a, 0x00, 0x48, 0x41, + 0xf0, 0x0b, 0xff, 0x82, 0x2d, 0x0b, 0xdb, 0x5f, + 0x2d, 0x12, 0xdc, 0x5e, 0x98, 0x15, 0x68, 0x00, + 0x49, 0x3a, 0x60, 0x08, 0x99, 0x13, 0xa8, 0x05, + 0xf0, 0x01, 0xfd, 0xae, 0xa9, 0x05, 0x98, 0x15, + 0x68, 0x00, 0xf0, 0x05, 0xfc, 0x5f, 0x1d, 0xe0, + 0x30, 0x21, 0xa9, 0x05, 0xf0, 0x01, 0xfd, 0xa4, + 0x20, 0x01, 0x49, 0x35, 0x65, 0x08, 0x20, 0x02, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, + 0x20, 0x02, 0xf0, 0x04, 0xfa, 0xdd, 0x2d, 0x0b, + 0xd0, 0x05, 0x2d, 0x0f, 0xd0, 0x03, 0x2d, 0x10, + 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x03, 0x21, 0x00, + 0x20, 0x12, 0xf0, 0x04, 0xfa, 0xd1, 0x2d, 0x0c, + 0xd0, 0x01, 0x2d, 0x0f, 0xd1, 0x03, 0x21, 0x00, + 0x20, 0x04, 0xf0, 0x04, 0xfa, 0xc9, 0x2d, 0x0d, + 0xd0, 0x01, 0x2d, 0x10, 0xd1, 0x03, 0x21, 0x00, + 0x20, 0x08, 0xf0, 0x04, 0xfa, 0xc1, 0x2d, 0x0e, + 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x03, 0x21, 0x00, + 0x20, 0x01, 0xf0, 0x04, 0xfa, 0xb9, 0x48, 0x15, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 0xb0, 0x82, + 0x49, 0x1c, 0x20, 0x91, 0xf0, 0x1a, 0xfb, 0x40, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, + 0xfe, 0x86, 0x20, 0x92, 0x49, 0x17, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x17, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x15, 0x68, 0x09, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x25, + 0xe0, 0xae, 0xe0, 0xad, 0xff, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0x2e, 0x03, 0xa8, 0x78, + 0x2e, 0x03, 0xa8, 0xc8, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0x9d, 0xf0, + 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0xba, 0x28, + 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0xbb, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0x2e, 0x08, 0xd1, 0xf4, + 0x2e, 0x08, 0xbb, 0x20, 0x6a, 0xa0, 0x30, 0x01, + 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89, + 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08, + 0x90, 0x00, 0x20, 0x00, 0x62, 0xa0, 0x20, 0x00, + 0x62, 0xe0, 0x48, 0x5f, 0x63, 0x20, 0x48, 0x5f, + 0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff, 0xfa, 0xe1, + 0x90, 0x02, 0x48, 0x5d, 0x68, 0x00, 0x23, 0x77, + 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x02, 0x1c, 0x21, + 0xf0, 0x0b, 0xfa, 0x4a, 0x98, 0x00, 0x49, 0x58, + 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, + 0x66, 0xc8, 0x48, 0x55, 0x68, 0x00, 0x21, 0x00, + 0xf0, 0x0b, 0xfa, 0xc4, 0x48, 0x52, 0x68, 0x00, + 0xf0, 0x0b, 0xfe, 0x38, 0x49, 0x51, 0x20, 0x91, + 0xf0, 0x1a, 0xfa, 0xd2, 0xe0, 0x00, 0xe0, 0x11, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf6, 0x48, 0x4c, + 0x68, 0x00, 0x90, 0x01, 0x48, 0x4c, 0x68, 0x00, + 0x49, 0x49, 0x60, 0x08, 0x98, 0x01, 0x49, 0x4a, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x47, 0x60, 0x08, + 0xb0, 0x02, 0xe0, 0x40, 0x48, 0x47, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x0c, 0x6a, 0xa0, 0x30, 0x01, + 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89, + 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08, + 0x49, 0x41, 0x60, 0x08, 0xe0, 0x0c, 0x6a, 0xa0, + 0x30, 0x01, 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, + 0x02, 0x89, 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, + 0x43, 0x08, 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, + 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, + 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, + 0xf0, 0x00, 0xfe, 0x82, 0x48, 0x33, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x07, 0x20, 0x00, 0x62, 0xa0, + 0x20, 0x00, 0x62, 0xe0, 0x48, 0x2a, 0x63, 0x20, + 0x48, 0x2a, 0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff, + 0xfa, 0x78, 0x90, 0x00, 0x9a, 0x00, 0x99, 0x14, + 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xfb, 0x98, 0x02, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x05, + 0x2d, 0x13, 0xd1, 0x03, 0x20, 0x1f, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x08, 0x2d, 0x0b, 0xdb, 0x01, + 0x2d, 0x12, 0xdd, 0x1a, 0x48, 0x23, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d, 0x06, 0xc0, + 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfe, 0x50, + 0x6b, 0x20, 0xf7, 0xff, 0xfa, 0x52, 0x90, 0x00, + 0x9a, 0x00, 0x99, 0x14, 0x1c, 0x20, 0xf0, 0x00, + 0xfd, 0xd5, 0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0x88, 0x48, 0x14, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x06, 0x48, 0x14, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0x0d, 0x06, 0xc0, 0x62, 0x06, + 0x48, 0x0e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x07, + 0x48, 0x0e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x03, + 0x98, 0x14, 0x21, 0x00, 0xf0, 0x0b, 0xfd, 0x0a, + 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x09, 0xe5, 0x10, 0xb0, 0x09, 0xe5, 0x0e, + 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x3f, + 0x2e, 0x08, 0xbb, 0x20, 0x2e, 0x08, 0xd1, 0xf4, + 0x2e, 0x08, 0xbb, 0x24, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0x9b, 0xb8, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0xb5, 0xf7, 0xb0, 0x83, + 0x9f, 0x03, 0x69, 0x38, 0x90, 0x00, 0x98, 0x00, + 0x28, 0x13, 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x03, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x6c, 0x78, 0x99, 0x04, 0x60, 0x48, 0x6c, 0x38, + 0x99, 0x04, 0x60, 0x08, 0x6c, 0xf8, 0x9a, 0x05, + 0x60, 0x50, 0x6c, 0xb8, 0x9a, 0x05, 0x60, 0x10, + 0x68, 0xfd, 0x48, 0xf9, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x03, + 0xe7, 0xda, 0x49, 0xf0, 0x20, 0x91, 0xf0, 0x1a, + 0xf9, 0xf3, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x0a, 0xfd, 0xa0, 0xe7, 0xf5, 0x00, 0xa8, + 0x49, 0xeb, 0x58, 0x08, 0x99, 0x03, 0x42, 0x88, + 0xd0, 0x05, 0x20, 0x92, 0x49, 0xe7, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x03, 0xe7, 0xc4, 0x21, 0x00, + 0x00, 0xa8, 0x4a, 0xe5, 0x50, 0x11, 0x48, 0xe2, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x69, 0x38, + 0x28, 0x0b, 0xdb, 0x16, 0x69, 0x38, 0x28, 0x12, + 0xdc, 0x13, 0x48, 0xe0, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x06, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x03, + 0x69, 0x38, 0x28, 0x12, 0xdc, 0x00, 0xe0, 0x08, + 0x6b, 0x38, 0xf7, 0xff, 0xf9, 0xb6, 0x90, 0x01, + 0x6a, 0xb9, 0x9a, 0x01, 0x48, 0xd8, 0xf0, 0x0b, + 0xfd, 0x85, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x2e, + 0x69, 0x38, 0x28, 0x12, 0xdc, 0x2b, 0x48, 0xd0, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x27, 0x20, 0x00, + 0x49, 0xd2, 0x65, 0x08, 0x20, 0x01, 0x03, 0x00, + 0x49, 0xd0, 0x65, 0x48, 0x20, 0x00, 0x49, 0xcf, + 0x65, 0x88, 0x20, 0x00, 0x49, 0xcd, 0x65, 0xc8, + 0x20, 0x00, 0x49, 0xcc, 0x66, 0x08, 0x20, 0x00, + 0x49, 0xcb, 0x60, 0x08, 0x20, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, + 0xf0, 0x04, 0xf9, 0x0a, 0x48, 0xc3, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x04, 0x48, 0xc5, 0x21, 0x0d, + 0x06, 0xc9, 0x61, 0x88, 0xe0, 0x02, 0x48, 0xc3, + 0x49, 0xc3, 0x60, 0x08, 0xe0, 0x06, 0x69, 0x38, + 0x28, 0x13, 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x08, 0x48, 0xb6, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x2c, 0x20, 0x0d, 0x06, 0xc0, + 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfd, 0x64, + 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb7, + 0x18, 0xc9, 0x60, 0x08, 0x20, 0x00, 0x43, 0xc0, + 0x00, 0xe9, 0x4b, 0xb4, 0x18, 0xc9, 0x60, 0x48, + 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb1, + 0x18, 0xc9, 0x64, 0x08, 0x20, 0x00, 0x43, 0xc0, + 0x00, 0xe9, 0x4b, 0xae, 0x18, 0xc9, 0x64, 0x48, + 0x20, 0x01, 0x40, 0xa8, 0x43, 0xc0, 0x99, 0x02, + 0x40, 0x08, 0x90, 0x02, 0x98, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x9c, 0x69, 0x38, + 0x28, 0x0b, 0xdb, 0x74, 0x69, 0x38, 0x28, 0x12, + 0xdc, 0x72, 0x48, 0x9b, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x6f, 0x20, 0x00, 0x49, 0x9d, 0x65, 0x08, + 0x20, 0x01, 0x03, 0x00, 0x49, 0x9b, 0x65, 0x48, + 0x20, 0x00, 0x49, 0x9a, 0x65, 0x88, 0x20, 0x00, + 0x49, 0x98, 0x65, 0xc8, 0x20, 0x00, 0x49, 0x97, + 0x66, 0x08, 0x20, 0x00, 0x49, 0x96, 0x60, 0x08, + 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, + 0x21, 0x00, 0x20, 0x02, 0xf0, 0x04, 0xf8, 0xa0, + 0x49, 0x95, 0x20, 0x91, 0xf0, 0x1a, 0xf9, 0x2c, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, + 0xfc, 0x72, 0x20, 0x92, 0x49, 0x90, 0x60, 0x08, + 0x48, 0x90, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc0, 0x69, 0x80, 0x08, 0x40, 0x00, 0x40, + 0x49, 0x8c, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc9, 0x61, 0x88, 0x20, 0x01, 0x49, 0x89, + 0x68, 0x09, 0x60, 0x08, 0x20, 0x01, 0x49, 0x87, + 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, + 0x66, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x83, + 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, + 0x61, 0x08, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x7f, + 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, + 0x61, 0x48, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x7b, + 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, + 0x60, 0xc8, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x77, + 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, + 0x60, 0x88, 0x6b, 0x38, 0xf7, 0xff, 0xf8, 0xd9, + 0x90, 0x01, 0x48, 0x72, 0x68, 0x00, 0x23, 0x77, + 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x01, 0x1c, 0x39, + 0xf0, 0x0b, 0xf8, 0x42, 0xe0, 0x02, 0xe0, 0x23, + 0xe0, 0x22, 0xe0, 0x21, 0x48, 0x67, 0x49, 0x6b, + 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, + 0x66, 0xc8, 0x48, 0x68, 0x68, 0x00, 0x21, 0x00, + 0xf0, 0x0b, 0xf8, 0xb8, 0x48, 0x65, 0x68, 0x00, + 0xf0, 0x0b, 0xfc, 0x2c, 0x49, 0x62, 0x20, 0x91, + 0xf0, 0x1a, 0xf8, 0xc6, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x60, 0x68, 0x04, 0x48, 0x60, + 0x68, 0x00, 0x49, 0x5e, 0x60, 0x08, 0x48, 0x5e, + 0x60, 0x04, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, + 0x48, 0x52, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, + 0x48, 0x4d, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, + 0x1c, 0x28, 0xf0, 0x0b, 0xfb, 0x9d, 0x28, 0x01, + 0xd1, 0x6a, 0x98, 0x00, 0x28, 0x0b, 0xdb, 0x02, + 0x98, 0x00, 0x28, 0x12, 0xdd, 0x65, 0xb0, 0x84, + 0x49, 0x4f, 0x20, 0x91, 0xf0, 0x1a, 0xf8, 0xa0, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, + 0xfb, 0xe6, 0x48, 0x4c, 0x68, 0x00, 0x68, 0x40, + 0x28, 0x00, 0xd0, 0x06, 0x48, 0x49, 0x68, 0x00, + 0x68, 0x40, 0x38, 0x01, 0x49, 0x47, 0x68, 0x09, + 0x60, 0x48, 0x20, 0x92, 0x49, 0x44, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x44, 0x68, 0x09, 0x60, 0x08, + 0x24, 0x00, 0x20, 0x00, 0x90, 0x02, 0x98, 0x02, + 0x28, 0x00, 0xd1, 0x15, 0x2c, 0x07, 0xd2, 0x13, + 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, + 0x34, 0x01, 0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, + 0x4a, 0x3a, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, + 0xd1, 0x01, 0x20, 0x01, 0x90, 0x02, 0xe7, 0xe6, + 0x98, 0x02, 0x28, 0x00, 0xd1, 0x14, 0x2c, 0x18, + 0xd2, 0x12, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x20, 0x34, 0x01, 0x23, 0x4c, 0x43, 0x58, + 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, + 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, + 0xd1, 0x01, 0x20, 0x01, 0x90, 0x02, 0xe7, 0xe7, + 0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff, 0xf8, 0x41, + 0x90, 0x01, 0x2c, 0x07, 0xd2, 0x09, 0x48, 0x25, + 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfe, 0xbc, + 0x48, 0x22, 0x68, 0x00, 0xf0, 0x0b, 0xfb, 0xa6, + 0xe0, 0x09, 0x2c, 0x18, 0xd2, 0x07, 0xe0, 0x01, + 0xe0, 0x95, 0xe0, 0x94, 0x1f, 0xe0, 0x49, 0x1d, + 0x68, 0x09, 0xf0, 0x0a, 0xfe, 0xeb, 0x48, 0x1b, + 0x68, 0x00, 0x4b, 0x1c, 0x18, 0xc0, 0xf0, 0x0b, + 0xf8, 0x0b, 0x20, 0x00, 0x49, 0x17, 0x68, 0x09, + 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, + 0x48, 0x14, 0x68, 0x00, 0x68, 0x40, 0x28, 0x07, + 0xd3, 0x2c, 0x48, 0x12, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x23, 0xfe, + 0x43, 0x18, 0x49, 0x0e, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0xe0, 0x1c, 0x00, 0x00, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, + 0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xbb, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0xba, 0x28, 0x3f, 0xff, 0xff, 0xff, + 0x2e, 0x08, 0x9b, 0xb8, 0x68, 0x00, 0x04, 0x00, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0x00, 0x00, 0x04, 0xcc, + 0x61, 0x88, 0xe0, 0x2d, 0x26, 0x01, 0x21, 0x00, + 0x91, 0x00, 0x48, 0x2b, 0x68, 0x00, 0x68, 0x40, + 0x99, 0x00, 0x42, 0x88, 0xd8, 0x04, 0xe0, 0x06, + 0x99, 0x00, 0x31, 0x01, 0x91, 0x00, 0xe7, 0xf4, + 0x00, 0x70, 0x1c, 0x46, 0xe7, 0xf8, 0x08, 0x76, + 0x00, 0x76, 0x48, 0x23, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, + 0x0f, 0xc0, 0x49, 0x1f, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x48, 0x1c, + 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, + 0x69, 0x80, 0x43, 0x30, 0x49, 0x18, 0x68, 0x09, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, + 0x1c, 0x21, 0x48, 0x15, 0x68, 0x00, 0xf0, 0x0a, + 0xff, 0xb1, 0x6b, 0x79, 0x48, 0x12, 0x68, 0x00, + 0xf0, 0x0a, 0xfe, 0xe6, 0x1c, 0x28, 0x21, 0x00, + 0xf0, 0x0b, 0xfa, 0x88, 0x49, 0x0f, 0x20, 0x91, + 0xf0, 0x19, 0xff, 0xba, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x0b, 0x68, 0x00, 0x90, 0x03, + 0x48, 0x0b, 0x68, 0x00, 0x49, 0x08, 0x60, 0x08, + 0x98, 0x03, 0x49, 0x09, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x06, 0x60, 0x08, 0xb0, 0x04, 0x20, 0x92, + 0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, + 0xe5, 0x86, 0xb0, 0x03, 0xe5, 0x84, 0x00, 0x00, + 0x2e, 0x08, 0xbb, 0x20, 0x2e, 0x08, 0xd1, 0xf4, + 0x2e, 0x08, 0xbb, 0x24, 0x2e, 0x08, 0xba, 0x2c, + 0xb5, 0xf3, 0xb0, 0x85, 0x20, 0x00, 0x90, 0x01, + 0x9d, 0x05, 0x9f, 0x06, 0x69, 0x28, 0x90, 0x04, + 0x69, 0x3c, 0x98, 0x04, 0x28, 0x13, 0xd0, 0x01, + 0x2c, 0x13, 0xd1, 0x05, 0x20, 0xff, 0xb0, 0x05, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x68, 0xee, 0x68, 0xf9, 0x91, 0x03, 0x48, 0xdf, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x20, + 0x48, 0xd6, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, + 0x99, 0x03, 0x29, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, 0x99, 0x03, + 0x29, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x99, 0x03, + 0x60, 0xe9, 0x60, 0xfe, 0x20, 0x00, 0xb0, 0x05, + 0xe7, 0xce, 0xe1, 0x92, 0x1c, 0x3d, 0x9f, 0x05, + 0x9e, 0x03, 0x68, 0xf9, 0x91, 0x03, 0x9c, 0x04, + 0xe0, 0xaa, 0x48, 0xc6, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x06, 0x99, 0x03, 0x29, 0x19, 0xd3, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, + 0x99, 0x03, 0x29, 0x08, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd1, 0x73, + 0x49, 0xbd, 0x20, 0x91, 0xf0, 0x19, 0xff, 0x38, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, + 0xfa, 0xe5, 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0xb9, + 0x58, 0x08, 0x42, 0xa8, 0xd1, 0x05, 0x99, 0x03, + 0x00, 0x88, 0x49, 0xb6, 0x58, 0x08, 0x42, 0xb8, + 0xd0, 0x05, 0x20, 0x92, 0x49, 0xb2, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x05, 0xe7, 0x98, 0x48, 0xb2, + 0x68, 0x00, 0x42, 0xa8, 0xd0, 0x03, 0x48, 0xb0, + 0x68, 0x00, 0x42, 0xb8, 0xd1, 0x0a, 0x20, 0x0d, + 0x06, 0xc0, 0x68, 0xc0, 0x90, 0x01, 0x98, 0x01, + 0x28, 0x01, 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x99, 0x03, 0x60, 0xe9, + 0x60, 0xfe, 0x00, 0xb0, 0x49, 0xa5, 0x50, 0x0f, + 0x99, 0x03, 0x00, 0x88, 0x49, 0xa3, 0x50, 0x0d, + 0x48, 0xa0, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x55, + 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, + 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, + 0x20, 0x01, 0x40, 0xb0, 0x99, 0x02, 0x40, 0x08, + 0xd1, 0x12, 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x0b, 0x99, 0x03, + 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x99, 0x02, + 0x40, 0x08, 0x90, 0x02, 0x20, 0x01, 0x40, 0xb0, + 0x99, 0x02, 0x43, 0x08, 0x90, 0x02, 0xe0, 0x11, + 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 0x99, 0x02, + 0x40, 0x08, 0xd1, 0x0b, 0x20, 0x01, 0x40, 0xb0, + 0x43, 0xc0, 0x99, 0x02, 0x40, 0x08, 0x90, 0x02, + 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 0x99, 0x02, + 0x43, 0x08, 0x90, 0x02, 0x6b, 0x28, 0xf7, 0xfe, + 0xfe, 0xbc, 0x90, 0x00, 0x9a, 0x00, 0xe0, 0x00, + 0xe0, 0x22, 0x99, 0x03, 0x1c, 0x28, 0xf0, 0x00, + 0xfa, 0x3d, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0xb1, + 0x90, 0x00, 0x9a, 0x00, 0x1c, 0x31, 0x1c, 0x38, + 0xf0, 0x00, 0xfa, 0x34, 0x98, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0x48, 0x7c, 0x68, 0x00, + 0x42, 0xa8, 0xd0, 0x03, 0x48, 0x7a, 0x68, 0x00, + 0x42, 0xb8, 0xd1, 0x03, 0x98, 0x01, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x20, 0x92, 0x49, 0x74, + 0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x1b, + 0x49, 0x71, 0x20, 0x91, 0xf0, 0x19, 0xfe, 0xa0, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, + 0xfa, 0x4d, 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0x6d, + 0x58, 0x08, 0x42, 0xa8, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x69, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, + 0xe7, 0x06, 0x2c, 0x0b, 0xdb, 0x12, 0x2c, 0x12, + 0xdc, 0x10, 0x48, 0x67, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x09, 0x48, 0x65, 0x68, 0x00, 0x42, 0xa8, + 0xd0, 0x05, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x05, 0xe6, 0xf4, 0x48, 0x60, + 0x60, 0x07, 0xe0, 0x08, 0x6b, 0xf8, 0x28, 0x01, + 0xd1, 0x05, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x05, 0xe6, 0xe8, 0x48, 0x5a, + 0x68, 0x00, 0x42, 0xa8, 0xd1, 0x02, 0x20, 0x00, + 0x49, 0x57, 0x60, 0x08, 0x00, 0xb0, 0x49, 0x55, + 0x50, 0x0f, 0x99, 0x03, 0x60, 0xe9, 0x60, 0xfe, + 0x48, 0x50, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x73, + 0x6b, 0x28, 0xf7, 0xfe, 0xfe, 0x4e, 0x90, 0x00, + 0x6a, 0xa9, 0x9a, 0x00, 0x48, 0x4f, 0xf0, 0x0b, + 0xfa, 0x1d, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x45, + 0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00, 0x48, 0x4b, + 0xf0, 0x0b, 0xfa, 0x42, 0x48, 0x48, 0x68, 0x00, + 0x42, 0xa8, 0xd1, 0x0f, 0x20, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x2c, 0x0b, 0xdb, 0x01, + 0x2c, 0x12, 0xdd, 0x07, 0x21, 0x00, 0x20, 0x02, + 0xf0, 0x03, 0xfd, 0xae, 0x48, 0x42, 0x21, 0x0d, + 0x06, 0xc9, 0x61, 0x88, 0x2c, 0x0b, 0xdb, 0x42, + 0x2c, 0x12, 0xdc, 0x40, 0x98, 0x04, 0x42, 0xa0, + 0xd0, 0x2c, 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, 0xf0, 0x03, + 0xfd, 0x9b, 0x2c, 0x0f, 0xd0, 0x05, 0x2c, 0x10, + 0xd0, 0x03, 0x2c, 0x11, 0xd0, 0x01, 0x2c, 0x0b, + 0xd1, 0x03, 0x21, 0x00, 0x20, 0x12, 0xf0, 0x03, + 0xfd, 0x8f, 0x2c, 0x0c, 0xd0, 0x01, 0x2c, 0x0f, + 0xd1, 0x03, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x03, + 0xfd, 0x87, 0x2c, 0x0d, 0xd0, 0x01, 0x2c, 0x10, + 0xd1, 0x03, 0x21, 0x00, 0x20, 0x08, 0xf0, 0x03, + 0xfd, 0x7f, 0x2c, 0x0e, 0xd0, 0x01, 0x2c, 0x11, + 0xd1, 0x03, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x03, + 0xfd, 0x77, 0xe0, 0x03, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x6a, 0xb8, 0x30, 0x01, + 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, + 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, 0x43, 0x08, + 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, 0x20, 0x0d, + 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x00, + 0xe0, 0x1f, 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, + 0x99, 0x02, 0x40, 0x08, 0x90, 0x02, 0xf0, 0x00, + 0xf9, 0xcf, 0x6b, 0x38, 0xf7, 0xfe, 0xfd, 0xd1, + 0x90, 0x00, 0x9a, 0x00, 0x1c, 0x31, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x54, 0x98, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0x2c, 0x0b, 0xdb, 0x08, + 0x2c, 0x12, 0xdc, 0x06, 0x98, 0x04, 0x42, 0xa0, + 0xd1, 0x03, 0x20, 0x01, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0xc8, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x05, 0xe6, 0x3c, 0xb0, 0x05, + 0xe6, 0x3a, 0xe6, 0x39, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x2e, 0x08, 0xba, 0x28, 0x2e, 0x08, 0xbb, 0x00, + 0x3f, 0xff, 0xff, 0xff, 0xb5, 0xf0, 0x1c, 0x07, + 0x00, 0xb8, 0x49, 0x09, 0x58, 0x0c, 0x1c, 0x7d, + 0x60, 0xe5, 0x00, 0xa8, 0x49, 0x06, 0x50, 0x0c, + 0x6b, 0x20, 0xf7, 0xfe, 0xfd, 0x9a, 0x1c, 0x06, + 0x1c, 0x32, 0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x00, + 0xf9, 0x1d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xb9, 0xc4, 0xb5, 0xf0, 0x1c, 0x07, + 0x00, 0xb8, 0x49, 0x09, 0x58, 0x0c, 0x1e, 0x7d, + 0x60, 0xe5, 0x00, 0xa8, 0x49, 0x06, 0x50, 0x0c, + 0x6b, 0x20, 0xf7, 0xfe, 0xfd, 0x82, 0x1c, 0x06, + 0x1c, 0x32, 0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x00, + 0xf9, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xb9, 0xc4, 0xb5, 0xf3, 0x1c, 0x0f, + 0xb0, 0x86, 0x98, 0x06, 0x90, 0x05, 0x98, 0x05, + 0x68, 0xc5, 0x48, 0x77, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x20, 0xff, 0xb0, 0x06, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x05, 0x69, 0x00, 0x28, 0x13, 0xd1, 0x02, + 0x20, 0xff, 0xb0, 0x06, 0xe7, 0xf4, 0x49, 0x69, + 0x20, 0x91, 0xf0, 0x19, 0xfd, 0x5d, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, 0xf9, 0x0a, + 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x64, 0x58, 0x08, + 0x99, 0x05, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x60, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x06, + 0xe7, 0xde, 0x42, 0xbd, 0xd1, 0x05, 0x20, 0x92, + 0x49, 0x5c, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, + 0xe7, 0xd6, 0x20, 0x00, 0x00, 0xa9, 0x4a, 0x5a, + 0x50, 0x50, 0x98, 0x05, 0x60, 0xc7, 0x48, 0x59, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x0d, 0x48, 0x54, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x09, 0x99, 0x05, + 0x00, 0xb8, 0x4a, 0x53, 0x50, 0x11, 0x20, 0x92, + 0x49, 0x50, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, + 0xe7, 0xbe, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, + 0x1c, 0x04, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, + 0x4b, 0x4b, 0x18, 0xc9, 0x60, 0x08, 0x20, 0x00, + 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x48, 0x18, 0xc9, + 0x60, 0x48, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, + 0x4b, 0x45, 0x18, 0xc9, 0x64, 0x08, 0x20, 0x00, + 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x42, 0x18, 0xc9, + 0x64, 0x48, 0x20, 0x01, 0x90, 0x01, 0x20, 0x01, + 0x40, 0xa8, 0x40, 0x20, 0xd1, 0x01, 0x20, 0x00, + 0x90, 0x01, 0x20, 0x01, 0x40, 0xa8, 0x43, 0xc0, + 0x40, 0x04, 0x1c, 0x3e, 0x42, 0xbd, 0xd9, 0x23, + 0x00, 0xb0, 0x49, 0x37, 0x58, 0x08, 0x28, 0x00, + 0xd0, 0x01, 0x36, 0x01, 0xe7, 0xf8, 0x1e, 0x70, + 0x90, 0x04, 0x98, 0x04, 0x42, 0xb8, 0xda, 0x04, + 0xe0, 0x07, 0x98, 0x04, 0x38, 0x01, 0x90, 0x04, + 0xe7, 0xf7, 0x98, 0x04, 0xf7, 0xff, 0xff, 0x32, + 0xe7, 0xf7, 0x20, 0xff, 0x40, 0xb8, 0x90, 0x03, + 0x20, 0xff, 0x40, 0xb0, 0x43, 0xc0, 0x99, 0x03, + 0x40, 0x08, 0x90, 0x03, 0x98, 0x03, 0x00, 0x40, + 0x90, 0x03, 0x00, 0x60, 0x90, 0x00, 0xe0, 0x1f, + 0x00, 0xb0, 0x49, 0x25, 0x58, 0x08, 0x28, 0x00, + 0xd0, 0x01, 0x3e, 0x01, 0xe7, 0xf8, 0x1c, 0x70, + 0x90, 0x04, 0x98, 0x04, 0x42, 0xb8, 0xd9, 0x04, + 0xe0, 0x07, 0x98, 0x04, 0x30, 0x01, 0x90, 0x04, + 0xe7, 0xf7, 0x98, 0x04, 0xf7, 0xff, 0xff, 0x26, + 0xe7, 0xf7, 0x20, 0xff, 0x40, 0xb0, 0x90, 0x03, + 0x20, 0xff, 0x40, 0xb8, 0x43, 0xc0, 0x99, 0x03, + 0x40, 0x08, 0x90, 0x03, 0x08, 0x60, 0x90, 0x00, + 0x98, 0x00, 0x99, 0x03, 0x40, 0x08, 0x90, 0x00, + 0x98, 0x03, 0x43, 0x84, 0x98, 0x00, 0x43, 0x04, + 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 0x40, 0x04, + 0x98, 0x01, 0x40, 0xb8, 0x43, 0x04, 0x99, 0x05, + 0x00, 0xb8, 0x4a, 0x0d, 0x50, 0x11, 0x98, 0x05, + 0x6b, 0x00, 0xf7, 0xfe, 0xfc, 0x92, 0x90, 0x02, + 0x9a, 0x02, 0x1c, 0x39, 0x98, 0x05, 0xf0, 0x00, + 0xf8, 0x15, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0x84, + 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x06, 0xe7, 0x25, 0xb0, 0x06, 0xe7, 0x23, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, + 0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0x9d, 0xf0, + 0x68, 0x00, 0x04, 0x00, 0xb5, 0xf7, 0x1c, 0x04, + 0x1c, 0x0f, 0x01, 0x3d, 0x4b, 0x2f, 0x18, 0xe9, + 0x1d, 0xe2, 0x32, 0x0d, 0x20, 0x00, 0x28, 0x03, + 0xd3, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xca, 0x20, 0xc1, 0x20, 0xe7, 0xfa, 0x6a, 0xe3, + 0x05, 0x9d, 0x0d, 0xad, 0x00, 0xfe, 0x4b, 0x28, + 0x18, 0xf3, 0x60, 0x1d, 0x6b, 0x63, 0x33, 0x01, + 0x05, 0x9d, 0x0d, 0xad, 0x00, 0xfe, 0x4b, 0x24, + 0x18, 0xf3, 0x60, 0x5d, 0x6a, 0xa5, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x1d, 0x00, 0xfe, 0x4b, 0x20, + 0x18, 0xf3, 0x64, 0x1d, 0x9d, 0x02, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x1d, 0x00, 0xfe, 0x4b, 0x1c, + 0x18, 0xf3, 0x64, 0x5d, 0x4b, 0x1b, 0x68, 0x1b, + 0x2b, 0x01, 0xd1, 0x2a, 0x2f, 0x00, 0xd1, 0x28, + 0x4b, 0x17, 0x68, 0x5d, 0x23, 0x8f, 0x00, 0x9b, + 0x42, 0x9d, 0xd3, 0x03, 0x23, 0x8f, 0x00, 0x9b, + 0x4d, 0x13, 0x60, 0x6b, 0x4b, 0x12, 0x68, 0x1d, + 0x4b, 0x13, 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x12, + 0x4d, 0x0f, 0x60, 0x2b, 0x4b, 0x0e, 0x6c, 0x5d, + 0x23, 0x01, 0x02, 0x9b, 0x1a, 0xed, 0x23, 0xb3, + 0x00, 0x9b, 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x0d, + 0x4d, 0x09, 0x64, 0x6b, 0x4b, 0x08, 0x6c, 0x1d, + 0x23, 0x01, 0x02, 0x9b, 0x1a, 0xed, 0x4b, 0x0a, + 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x09, 0x4d, 0x04, + 0x64, 0x2b, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x68, 0x00, 0x0c, 0x00, + 0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x00, 0x00, 0x02, 0x3a, 0x00, 0x00, 0x06, 0xcc, + 0x00, 0x00, 0x02, 0xca, 0x00, 0x00, 0x06, 0xca, + 0xb4, 0xf0, 0x4f, 0x15, 0x4c, 0x15, 0x20, 0x00, + 0x21, 0x00, 0x22, 0x00, 0x43, 0xd2, 0x4d, 0x14, + 0x68, 0x6d, 0x42, 0x85, 0xdd, 0x1b, 0x1c, 0x05, + 0x30, 0x01, 0x00, 0xad, 0x59, 0x7b, 0x42, 0x93, + 0xd0, 0xf9, 0x4d, 0x0f, 0x68, 0x6d, 0x42, 0x85, + 0xda, 0x00, 0xe0, 0x10, 0x31, 0x01, 0x1c, 0x05, + 0x30, 0x01, 0x00, 0xad, 0x59, 0x7a, 0x42, 0x93, + 0xd0, 0xf9, 0x02, 0x95, 0x43, 0x1d, 0x1c, 0x2e, + 0xc4, 0x40, 0x4d, 0x07, 0x68, 0x6d, 0x42, 0x85, + 0xdb, 0x00, 0x31, 0x01, 0xe7, 0xdf, 0x25, 0x0d, + 0x06, 0xed, 0x61, 0x29, 0xbc, 0xf0, 0x47, 0x70, + 0x2e, 0x08, 0xba, 0x38, 0x68, 0x00, 0x0d, 0x40, + 0x2e, 0x08, 0xbb, 0x00, 0xb5, 0xf3, 0xb0, 0x82, + 0x9d, 0x02, 0x69, 0x2c, 0x2c, 0x13, 0xd1, 0x05, + 0x20, 0x75, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x68, 0xee, 0x48, 0xf8, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, + 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, 0x49, 0xef, + 0x20, 0x91, 0xf0, 0x19, 0xfb, 0xbd, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xff, 0x6a, + 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0xea, 0x58, 0x08, + 0x99, 0x02, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0xe6, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x02, + 0xe7, 0xd0, 0x48, 0xe3, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x16, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, + 0x90, 0x01, 0x99, 0x03, 0x29, 0x01, 0xd1, 0x05, + 0x20, 0x01, 0x40, 0xb0, 0x99, 0x01, 0x43, 0x08, + 0x90, 0x01, 0xe0, 0x05, 0x20, 0x01, 0x40, 0xb0, + 0x43, 0xc0, 0x99, 0x01, 0x40, 0x08, 0x90, 0x01, + 0x98, 0x01, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, + 0x48, 0xd8, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, + 0x48, 0xd3, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, + 0x99, 0x03, 0x29, 0x01, 0xd1, 0x6c, 0xb0, 0x83, + 0x1c, 0x30, 0xf0, 0x0a, 0xfe, 0x71, 0x28, 0x01, + 0xd1, 0x05, 0x20, 0x92, 0x49, 0xcd, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x9e, 0x49, 0xce, + 0x20, 0x91, 0xf0, 0x19, 0xfb, 0x75, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfe, 0xbb, + 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x06, + 0x48, 0xc8, 0x68, 0x00, 0x68, 0x40, 0x30, 0x01, + 0x49, 0xc6, 0x68, 0x09, 0x60, 0x48, 0x20, 0x92, + 0x49, 0xc3, 0x60, 0x08, 0x20, 0x01, 0x49, 0xc3, + 0x68, 0x09, 0x60, 0x08, 0x2c, 0x0b, 0xdb, 0x11, + 0x2c, 0x12, 0xdc, 0x0f, 0x48, 0xbf, 0x68, 0x00, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, + 0x23, 0x01, 0x43, 0x18, 0x49, 0xbb, 0x68, 0x09, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, + 0x27, 0x00, 0xe0, 0xbc, 0x27, 0x00, 0x20, 0x00, + 0x90, 0x01, 0x98, 0x01, 0x28, 0x00, 0xd1, 0x15, + 0x2f, 0x07, 0xd2, 0x13, 0x6a, 0xe8, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, + 0x18, 0x18, 0x00, 0xc0, 0x4a, 0xaf, 0x68, 0x12, + 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, + 0x6f, 0xc0, 0x42, 0x81, 0xda, 0x01, 0x20, 0x01, + 0x90, 0x01, 0xe7, 0xe6, 0x98, 0x01, 0x28, 0x00, + 0xd1, 0x16, 0x2f, 0x18, 0xd2, 0x14, 0x6a, 0xe8, + 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, + 0x23, 0x4c, 0x43, 0x58, 0x4a, 0xa3, 0x68, 0x12, + 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x40, 0x42, 0x81, 0xda, 0x03, 0xe0, 0x00, + 0xe0, 0xb0, 0x20, 0x01, 0x90, 0x01, 0xe7, 0xe5, + 0x3f, 0x01, 0x6b, 0x28, 0xf7, 0xfe, 0xfb, 0x01, + 0x90, 0x00, 0x2f, 0x07, 0xd2, 0x16, 0x48, 0x99, + 0x68, 0x01, 0x1c, 0x38, 0xf0, 0x0a, 0xf9, 0x0a, + 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x95, + 0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b, + 0x18, 0xc0, 0x9a, 0x00, 0x1c, 0x29, 0xf0, 0x0a, + 0xfa, 0x5f, 0x48, 0x90, 0x68, 0x00, 0xf0, 0x0a, + 0xfe, 0x59, 0xe0, 0x4a, 0x2f, 0x18, 0xd2, 0x48, + 0x1f, 0xf8, 0x49, 0x8c, 0x68, 0x09, 0xf0, 0x0a, + 0xf9, 0x45, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x89, + 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x0a, 0x9a, 0x00, 0x1c, 0x29, 0xf0, 0x0a, + 0xfa, 0x47, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x83, + 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x82, 0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17, + 0x20, 0x4c, 0x43, 0x78, 0x49, 0x7d, 0x68, 0x09, + 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b, + 0x20, 0x4c, 0x43, 0x78, 0x49, 0x77, 0x68, 0x09, + 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x68, 0x00, 0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a, + 0x20, 0x02, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x71, + 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, + 0x39, 0x82, 0x67, 0x48, 0xe0, 0x09, 0x20, 0x03, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x6b, 0x68, 0x12, + 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, + 0x67, 0x48, 0x48, 0x68, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x00, 0x40, + 0x90, 0x03, 0x98, 0x03, 0x23, 0x02, 0x43, 0x18, + 0x90, 0x03, 0x48, 0x62, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, + 0x0f, 0xc0, 0x99, 0x03, 0x18, 0x40, 0x90, 0x03, + 0x98, 0x03, 0x49, 0x5c, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x1c, 0x39, + 0x48, 0x58, 0x68, 0x00, 0xf0, 0x0a, 0xfa, 0x72, + 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x04, + 0x6b, 0x69, 0x48, 0x54, 0x68, 0x00, 0xf0, 0x0a, + 0xf9, 0x4d, 0x1c, 0x30, 0x21, 0x01, 0xf0, 0x0a, + 0xfd, 0x45, 0x49, 0x4f, 0x20, 0x91, 0xf0, 0x19, + 0xfa, 0x77, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0x48, 0x4c, 0x68, 0x00, 0x90, 0x02, 0x48, 0x4c, + 0x68, 0x00, 0x49, 0x4a, 0x60, 0x08, 0x98, 0x02, + 0x49, 0x49, 0x60, 0x08, 0x20, 0x92, 0x49, 0x46, + 0x60, 0x08, 0xb0, 0x03, 0x48, 0x43, 0x68, 0x00, + 0x28, 0x01, 0xd1, 0x75, 0x48, 0x3e, 0x68, 0x00, + 0x28, 0x01, 0xd1, 0x71, 0x99, 0x03, 0x29, 0x00, + 0xd1, 0x6e, 0xb0, 0x85, 0x1c, 0x30, 0xf0, 0x0a, + 0xfd, 0x47, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, + 0x49, 0x38, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x07, + 0xe6, 0x74, 0x49, 0x39, 0x20, 0x91, 0xf0, 0x19, + 0xfa, 0x4b, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0xf0, 0x0a, 0xfd, 0x91, 0x2c, 0x0b, 0xdb, 0x01, + 0x2c, 0x12, 0xdd, 0x0b, 0x48, 0x33, 0x68, 0x00, + 0x68, 0x40, 0x28, 0x00, 0xd0, 0x06, 0x48, 0x31, + 0x68, 0x00, 0x68, 0x40, 0x38, 0x01, 0x49, 0x2f, + 0x68, 0x09, 0x60, 0x48, 0x20, 0x92, 0x49, 0x2c, + 0x60, 0x08, 0x20, 0x01, 0x49, 0x2b, 0x68, 0x09, + 0x60, 0x08, 0x2c, 0x0b, 0xdb, 0x11, 0x2c, 0x12, + 0xdc, 0x0f, 0x48, 0x28, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x08, 0x40, + 0x00, 0x40, 0x49, 0x24, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x27, 0x00, + 0xe0, 0xb2, 0x27, 0x00, 0x20, 0x00, 0x90, 0x03, + 0x98, 0x03, 0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07, + 0xd2, 0x13, 0x6a, 0xe8, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 0x18, 0x18, + 0x00, 0xc0, 0x4a, 0x18, 0x68, 0x12, 0x18, 0x80, + 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, + 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x03, + 0xe7, 0xe6, 0x98, 0x03, 0x28, 0x00, 0xd1, 0x26, + 0x2f, 0x18, 0xd2, 0x24, 0x6a, 0xe8, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, + 0x43, 0x58, 0x4a, 0x0c, 0x68, 0x12, 0x18, 0x80, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0xe0, 0x00, + 0xe0, 0xa9, 0x69, 0x40, 0x42, 0x81, 0xd1, 0x11, + 0x20, 0x01, 0x90, 0x03, 0xe0, 0x0e, 0x00, 0x00, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, + 0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0xe7, 0xd5, 0x3f, 0x01, + 0x6b, 0x28, 0xf7, 0xfe, 0xf9, 0xc2, 0x90, 0x01, + 0x2f, 0x07, 0xd2, 0x09, 0x48, 0x4a, 0x68, 0x01, + 0x1c, 0x38, 0xf0, 0x0a, 0xf8, 0x3d, 0x48, 0x48, + 0x68, 0x00, 0xf0, 0x0a, 0xfd, 0x27, 0xe0, 0x06, + 0x2f, 0x18, 0xd2, 0x04, 0x1f, 0xf8, 0x49, 0x44, + 0x68, 0x09, 0xf0, 0x0a, 0xf8, 0x6f, 0x48, 0x42, + 0x68, 0x00, 0x4b, 0x42, 0x18, 0xc0, 0xf0, 0x0a, + 0xf9, 0x8f, 0x20, 0x00, 0x49, 0x3e, 0x68, 0x09, + 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, + 0x48, 0x3b, 0x68, 0x00, 0x68, 0x40, 0x28, 0x07, + 0xd3, 0x0e, 0x48, 0x39, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x23, 0xfe, + 0x43, 0x18, 0x49, 0x35, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0xe0, 0x33, + 0x20, 0x01, 0x90, 0x00, 0x21, 0x00, 0x91, 0x02, + 0x48, 0x2f, 0x68, 0x00, 0x68, 0x40, 0x99, 0x02, + 0x42, 0x88, 0xd8, 0x04, 0xe0, 0x08, 0x99, 0x02, + 0x31, 0x01, 0x91, 0x02, 0xe7, 0xf4, 0x98, 0x00, + 0x00, 0x40, 0x30, 0x01, 0x90, 0x00, 0xe7, 0xf6, + 0x98, 0x00, 0x08, 0x40, 0x00, 0x40, 0x90, 0x00, + 0x48, 0x25, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, + 0x49, 0x21, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc9, 0x61, 0x88, 0x48, 0x1e, 0x68, 0x00, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, + 0x99, 0x00, 0x43, 0x08, 0x49, 0x1a, 0x68, 0x09, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, + 0x1c, 0x39, 0x48, 0x17, 0x68, 0x00, 0xf0, 0x0a, + 0xf9, 0x4d, 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, + 0xdd, 0x04, 0x6b, 0x69, 0x48, 0x12, 0x68, 0x00, + 0xf0, 0x0a, 0xf8, 0x7e, 0x1c, 0x30, 0x21, 0x00, + 0xf0, 0x0a, 0xfc, 0x20, 0x49, 0x10, 0x20, 0x91, + 0xf0, 0x19, 0xf9, 0x52, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x0b, 0x68, 0x00, 0x90, 0x04, + 0x48, 0x0c, 0x68, 0x00, 0x49, 0x08, 0x60, 0x08, + 0x98, 0x04, 0x49, 0x0a, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x07, 0x60, 0x08, 0xb0, 0x05, 0x20, 0x92, + 0x49, 0x07, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, + 0xe5, 0x60, 0xb0, 0x02, 0xe5, 0x5e, 0x00, 0x00, + 0x2e, 0x08, 0xbb, 0x20, 0x00, 0x00, 0x04, 0xcc, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x24, + 0x2e, 0x08, 0xba, 0x2c, 0xb5, 0xf3, 0x1c, 0x07, + 0x1c, 0x3e, 0x69, 0x30, 0x28, 0x13, 0xd1, 0x04, + 0x20, 0x75, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0xf4, 0x48, 0x1e, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x2c, 0x19, 0xd3, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, + 0x2c, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, + 0xe7, 0xe7, 0x49, 0x16, 0x20, 0x91, 0xf0, 0x19, + 0xf9, 0x0b, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x09, 0xfc, 0xb8, 0xe7, 0xf5, 0x00, 0xa0, + 0x49, 0x11, 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x04, + 0x20, 0x92, 0x49, 0x0e, 0x60, 0x08, 0x20, 0xff, + 0xe7, 0xd3, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, + 0x1c, 0x05, 0x20, 0x01, 0x40, 0xa0, 0x40, 0x05, + 0x2d, 0x00, 0xd1, 0x03, 0x20, 0x00, 0x99, 0x01, + 0x60, 0x08, 0xe0, 0x02, 0x20, 0x01, 0x99, 0x01, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x03, 0x60, 0x08, + 0x20, 0x00, 0xe7, 0xbe, 0xe7, 0xbd, 0x00, 0x00, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, + 0x2e, 0x08, 0xb9, 0xc4, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x81, 0x1c, 0x3c, 0x68, 0xe5, 0x69, 0x60, + 0x4b, 0x49, 0x40, 0x18, 0x99, 0x02, 0x07, 0x89, + 0x0f, 0x89, 0x02, 0x09, 0x43, 0x08, 0x61, 0x60, + 0x05, 0x80, 0x48, 0x46, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0xb0, 0x01, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x49, 0x3b, 0x20, 0x91, 0xf0, 0x19, 0xf8, 0xb4, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, + 0xfc, 0x61, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, + 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x01, + 0xe7, 0xe6, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0c, + 0x69, 0x20, 0x28, 0x12, 0xdc, 0x09, 0x01, 0x28, + 0x4b, 0x2d, 0x18, 0xc1, 0x91, 0x00, 0x1d, 0xe6, + 0x36, 0x0d, 0x68, 0x30, 0x99, 0x00, 0x60, 0x08, + 0xe0, 0x41, 0x48, 0x26, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x3d, 0x48, 0x28, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a, + 0xfb, 0x73, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, + 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, + 0xe7, 0xbe, 0x49, 0x21, 0x20, 0x91, 0xf0, 0x19, + 0xf8, 0x77, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0xf0, 0x0a, 0xfb, 0xbd, 0x20, 0x92, 0x49, 0x1c, + 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 0x68, 0x09, + 0x60, 0x08, 0x48, 0x1a, 0x68, 0x01, 0x1c, 0x20, + 0xf0, 0x0a, 0xfb, 0x6e, 0x90, 0x00, 0x69, 0x60, + 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 0x20, 0x91, + 0xf0, 0x19, 0xf8, 0x5e, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x12, 0x68, 0x00, 0x90, 0x01, + 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 0x60, 0x08, + 0x98, 0x01, 0x49, 0x0f, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, + 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, + 0xe7, 0x8a, 0xb0, 0x01, 0xe7, 0x88, 0x00, 0x00, + 0xff, 0xff, 0xfc, 0xff, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x81, 0x1c, 0x3c, 0x68, 0xe5, 0x69, 0x60, + 0x4b, 0x49, 0x40, 0x18, 0x99, 0x02, 0x07, 0x09, + 0x0f, 0x09, 0x02, 0x89, 0x43, 0x08, 0x61, 0x60, + 0x04, 0x80, 0x48, 0x46, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0xb0, 0x01, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x49, 0x3b, 0x20, 0x91, 0xf0, 0x19, 0xf8, 0x08, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, + 0xfb, 0xb5, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, + 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x01, + 0xe7, 0xe6, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0c, + 0x69, 0x20, 0x28, 0x12, 0xdc, 0x09, 0x01, 0x28, + 0x4b, 0x2d, 0x18, 0xc6, 0x1d, 0xe0, 0x30, 0x0d, + 0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 0x60, 0x30, + 0xe0, 0x41, 0x48, 0x26, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x3d, 0x48, 0x28, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a, + 0xfa, 0xc7, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, + 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, + 0xe7, 0xbe, 0x49, 0x21, 0x20, 0x91, 0xf0, 0x18, + 0xff, 0xcb, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0xf0, 0x0a, 0xfb, 0x11, 0x20, 0x92, 0x49, 0x1c, + 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 0x68, 0x09, + 0x60, 0x08, 0x48, 0x1a, 0x68, 0x01, 0x1c, 0x20, + 0xf0, 0x0a, 0xfa, 0xc2, 0x90, 0x00, 0x69, 0x60, + 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 0x20, 0x91, + 0xf0, 0x18, 0xff, 0xb2, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x12, 0x68, 0x00, 0x90, 0x01, + 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 0x60, 0x08, + 0x98, 0x01, 0x49, 0x0f, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, + 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, + 0xe7, 0x8a, 0xb0, 0x01, 0xe7, 0x88, 0x00, 0x00, + 0xff, 0xff, 0xc3, 0xff, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x82, 0x1c, 0x3c, 0x68, 0xe5, 0x26, 0x00, + 0x99, 0x03, 0x29, 0x01, 0xd1, 0x00, 0x26, 0x01, + 0x69, 0x60, 0x06, 0x80, 0x0f, 0xc0, 0x42, 0xb0, + 0xd1, 0x05, 0x20, 0x00, 0xb0, 0x02, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x69, 0x60, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x07, 0xf1, + 0x0e, 0x89, 0x43, 0x08, 0x61, 0x60, 0x06, 0x80, + 0x48, 0x44, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, + 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xde, + 0x49, 0x3b, 0x20, 0x91, 0xf0, 0x18, 0xff, 0x50, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, + 0xfa, 0xfd, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, + 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x02, + 0xe7, 0xc9, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0e, + 0x69, 0x20, 0x28, 0x12, 0xdc, 0x0b, 0x01, 0x28, + 0x4b, 0x2d, 0x18, 0xc1, 0x91, 0x01, 0x1d, 0xe0, + 0x30, 0x0d, 0x90, 0x00, 0x98, 0x00, 0x68, 0x00, + 0x99, 0x01, 0x60, 0x08, 0xe0, 0x41, 0x48, 0x25, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, + 0x1c, 0x28, 0xf0, 0x0a, 0xfa, 0x0d, 0x28, 0x00, + 0xd1, 0x05, 0x20, 0x92, 0x49, 0x1e, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x04, 0xe7, 0x9f, 0x49, 0x20, + 0x20, 0x91, 0xf0, 0x18, 0xff, 0x11, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfa, 0x57, + 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, + 0x49, 0x1a, 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, + 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfa, 0x08, + 0x90, 0x00, 0x69, 0x60, 0x99, 0x00, 0x60, 0xc8, + 0x49, 0x13, 0x20, 0x91, 0xf0, 0x18, 0xfe, 0xf8, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, + 0x68, 0x00, 0x90, 0x01, 0x48, 0x10, 0x68, 0x00, + 0x49, 0x0e, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 0x60, 0x08, + 0xb0, 0x02, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x6b, 0xb0, 0x02, + 0xe7, 0x69, 0x00, 0x00, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x0f, 0xb0, 0x83, 0x1c, 0x25, 0x69, 0x28, + 0x28, 0x13, 0xd1, 0x04, 0x20, 0x75, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xee, + 0x20, 0x04, 0x40, 0x38, 0x08, 0x81, 0x91, 0x02, + 0x69, 0x68, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x18, + 0x07, 0xb9, 0x0f, 0x89, 0x01, 0x89, 0x43, 0x08, + 0x61, 0x68, 0x06, 0x00, 0x69, 0x68, 0x4b, 0x48, + 0x40, 0x18, 0x99, 0x02, 0x07, 0xc9, 0x0c, 0x49, + 0x43, 0x08, 0x61, 0x68, 0x04, 0x40, 0x48, 0x45, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, + 0x20, 0x00, 0xb0, 0x03, 0xe7, 0xd0, 0x49, 0x3c, + 0x20, 0x91, 0xf0, 0x18, 0xfe, 0x91, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xfa, 0x3e, + 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0x37, 0x58, 0x08, + 0x42, 0xa0, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x34, + 0x60, 0x08, 0x20, 0xff, 0xb0, 0x03, 0xe7, 0xbb, + 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, + 0x69, 0x28, 0x28, 0x0b, 0xdb, 0x0e, 0x69, 0x28, + 0x28, 0x12, 0xdc, 0x0b, 0x01, 0x30, 0x4b, 0x2e, + 0x18, 0xc0, 0x90, 0x01, 0x1d, 0xe8, 0x30, 0x0d, + 0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 0x99, 0x01, + 0x60, 0x08, 0xe0, 0x41, 0x48, 0x25, 0x68, 0x00, + 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, 0x68, 0x00, + 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x30, + 0xf0, 0x0a, 0xf9, 0x4e, 0x28, 0x00, 0xd1, 0x05, + 0x20, 0x92, 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x05, 0xe7, 0x91, 0x49, 0x20, 0x20, 0x91, + 0xf0, 0x18, 0xfe, 0x52, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0xf0, 0x0a, 0xf9, 0x98, 0x20, 0x92, + 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, + 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, 0x68, 0x01, + 0x1c, 0x28, 0xf0, 0x0a, 0xf9, 0x49, 0x90, 0x00, + 0x69, 0x68, 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, + 0x20, 0x91, 0xf0, 0x18, 0xfe, 0x39, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, 0x68, 0x00, + 0x90, 0x01, 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, + 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, 0x60, 0x08, + 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, + 0x20, 0x92, 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x03, 0xe7, 0x5d, 0xb0, 0x03, 0xe7, 0x5b, + 0xff, 0xff, 0xbf, 0xff, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0x1c, 0x01, 0x20, 0x0d, + 0x06, 0xc0, 0x60, 0x41, 0x48, 0x02, 0x63, 0x81, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, + 0x68, 0x00, 0x0d, 0x00, 0x20, 0x0d, 0x06, 0xc0, + 0x68, 0x40, 0x02, 0x00, 0x0a, 0x00, 0x47, 0x70, + 0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, 0x68, 0xd0, + 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x03, 0x1c, 0x0a, + 0x1c, 0x19, 0x69, 0x08, 0x28, 0x13, 0xd1, 0x01, + 0x20, 0x75, 0x47, 0x70, 0x69, 0x08, 0x28, 0x0b, + 0xdb, 0x0b, 0x69, 0x08, 0x28, 0x12, 0xdc, 0x08, + 0x6d, 0x08, 0x60, 0x10, 0x6d, 0x88, 0x60, 0x90, + 0x6d, 0x48, 0x60, 0x50, 0x6d, 0xc8, 0x60, 0xd0, + 0xe0, 0x07, 0x6a, 0x88, 0x60, 0x10, 0x6b, 0x08, + 0x60, 0x90, 0x6a, 0xc8, 0x60, 0x50, 0x6b, 0x48, + 0x60, 0xd0, 0x20, 0x00, 0xe7, 0xe5, 0xe7, 0xe4, + 0x1c, 0x03, 0x1c, 0x0a, 0x68, 0x10, 0x60, 0x18, + 0x68, 0x90, 0x60, 0x98, 0x68, 0x50, 0x60, 0x58, + 0x68, 0xd0, 0x60, 0xd8, 0x47, 0x70, 0xe7, 0xfd, + 0x1c, 0x01, 0x1c, 0x0a, 0x69, 0x50, 0x05, 0x80, + 0x0f, 0x80, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, + 0x1c, 0x0a, 0x69, 0x50, 0x12, 0x80, 0x07, 0x00, + 0x0f, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x80, + 0x1c, 0x01, 0x1c, 0x0f, 0x22, 0x01, 0x69, 0x78, + 0x23, 0x20, 0x40, 0x18, 0xd1, 0x00, 0x22, 0x00, + 0x1c, 0x10, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, + 0x1c, 0x01, 0x1c, 0x0b, 0x69, 0x18, 0x28, 0x13, + 0xd1, 0x01, 0x20, 0x75, 0x47, 0x70, 0x69, 0x58, + 0x06, 0x00, 0x0f, 0x82, 0x69, 0x58, 0x04, 0x40, + 0x0f, 0xc0, 0x00, 0x80, 0x43, 0x02, 0x1c, 0x10, + 0xe7, 0xf4, 0xe7, 0xf3, 0x1c, 0x01, 0x20, 0x0d, + 0x06, 0xc0, 0x61, 0x41, 0x20, 0x00, 0x47, 0x70, + 0xe7, 0xfd, 0x20, 0x0d, 0x06, 0xc0, 0x69, 0x40, + 0x1c, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, + 0x1c, 0x01, 0x22, 0x00, 0x29, 0x01, 0xd1, 0x00, + 0x22, 0x01, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, + 0x1c, 0x03, 0x2b, 0x02, 0xd1, 0x01, 0x29, 0x00, + 0xd1, 0x02, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0xc2, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x21, 0x01, + 0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, 0x1c, 0x02, + 0x2a, 0x00, 0xd1, 0x00, 0x21, 0x00, 0x1c, 0x08, + 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, + 0x69, 0x10, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x90, + 0x1c, 0x07, 0x1c, 0x0a, 0x1c, 0x39, 0x69, 0x08, + 0x28, 0x13, 0xd0, 0x05, 0x69, 0x08, 0x28, 0x0b, + 0xdb, 0x05, 0x69, 0x08, 0x28, 0x12, 0xdc, 0x02, + 0x20, 0x86, 0xbc, 0x90, 0x47, 0x70, 0x6b, 0x8c, + 0x69, 0x48, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, + 0x08, 0x64, 0x69, 0x08, 0x00, 0x80, 0x4b, 0x03, + 0x58, 0x18, 0x43, 0x60, 0x60, 0x10, 0x20, 0x00, + 0xe7, 0xef, 0xe7, 0xee, 0x2e, 0x03, 0xa8, 0xc8, + 0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x9c, 0x02, + 0x69, 0x20, 0x28, 0x13, 0xd0, 0x05, 0x69, 0x20, + 0x28, 0x0b, 0xdb, 0x08, 0x69, 0x20, 0x28, 0x12, + 0xdc, 0x05, 0x20, 0x86, 0xb0, 0x01, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xe5, + 0x68, 0x38, 0x64, 0x20, 0x68, 0x7e, 0x64, 0x66, + 0x08, 0xb6, 0x61, 0xa6, 0x48, 0x3f, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, + 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, + 0xb0, 0x01, 0xe7, 0xe0, 0x49, 0x36, 0x20, 0x91, + 0xf0, 0x18, 0xfd, 0x16, 0x28, 0x92, 0xd0, 0x03, + 0x20, 0x01, 0xf0, 0x09, 0xf8, 0xc3, 0xe7, 0xf5, + 0x00, 0xa8, 0x49, 0x32, 0x58, 0x08, 0x99, 0x02, + 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x2e, + 0x60, 0x08, 0x20, 0x86, 0xb0, 0x01, 0xe7, 0xca, + 0x48, 0x2a, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x06, + 0x01, 0x28, 0x4b, 0x2b, 0x18, 0xc0, 0x90, 0x00, + 0x98, 0x00, 0x60, 0x06, 0xe0, 0x41, 0x48, 0x25, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, + 0x1c, 0x28, 0xf0, 0x09, 0xff, 0xdd, 0x28, 0x00, + 0xd1, 0x05, 0x20, 0x92, 0x49, 0x1e, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x03, 0xe7, 0xab, 0x49, 0x20, + 0x20, 0x91, 0xf0, 0x18, 0xfc, 0xe1, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xf8, 0x27, + 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, + 0x49, 0x1a, 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, + 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x09, 0xff, 0xd8, + 0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x61, 0x08, + 0x49, 0x13, 0x20, 0x91, 0xf0, 0x18, 0xfc, 0xc8, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, + 0x68, 0x00, 0x90, 0x01, 0x48, 0x10, 0x68, 0x00, + 0x49, 0x0e, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 0x60, 0x08, + 0xb0, 0x02, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x01, 0xe7, 0x77, 0xb0, 0x01, + 0xe7, 0x75, 0x00, 0x00, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x68, 0x00, 0x0c, 0x04, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xbb, 0x24, 0xb4, 0x80, 0x1c, 0x01, + 0x06, 0x0b, 0x0e, 0x1b, 0x22, 0x01, 0x2a, 0x19, + 0xd3, 0x02, 0xe0, 0x0f, 0x32, 0x01, 0xe7, 0xfa, + 0x00, 0x90, 0x4f, 0x08, 0x58, 0x38, 0x68, 0x80, + 0x02, 0x00, 0x0e, 0x00, 0x42, 0x98, 0xd1, 0x04, + 0x00, 0x90, 0x4f, 0x04, 0x58, 0x38, 0xbc, 0x80, + 0x47, 0x70, 0xe7, 0xef, 0x20, 0x00, 0xe7, 0xfa, + 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xc4, + 0xb4, 0x90, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x38, + 0x16, 0x01, 0x48, 0x20, 0x60, 0x02, 0x48, 0x20, + 0x68, 0x80, 0x23, 0x33, 0x06, 0x5b, 0x65, 0xd8, + 0x48, 0x1d, 0x68, 0xc0, 0x23, 0x33, 0x06, 0x5b, + 0x66, 0x18, 0x48, 0x1c, 0x4b, 0x1a, 0x60, 0x98, + 0x48, 0x1b, 0x4b, 0x19, 0x60, 0xd8, 0x20, 0x01, + 0x23, 0x33, 0x06, 0x5b, 0x66, 0xd8, 0x48, 0x19, + 0x68, 0x04, 0x23, 0x01, 0x04, 0xdb, 0x43, 0x23, + 0x60, 0x03, 0x48, 0x16, 0x68, 0x04, 0x23, 0x01, + 0x04, 0xdb, 0x43, 0x9c, 0x1c, 0x23, 0x60, 0x03, + 0x29, 0x00, 0xd1, 0x10, 0x20, 0xff, 0x30, 0x14, + 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 0x48, 0x10, + 0x68, 0x04, 0x23, 0xff, 0x33, 0x01, 0x43, 0x9c, + 0x1c, 0x23, 0x60, 0x03, 0x48, 0x0d, 0x23, 0x1b, + 0x06, 0x9b, 0x64, 0x18, 0xe0, 0x08, 0x20, 0xff, + 0x30, 0x14, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, + 0x48, 0x02, 0x68, 0x00, 0x4b, 0x08, 0x60, 0x18, + 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x9b, 0xbc, + 0x2e, 0x08, 0xb9, 0x88, 0xcc, 0x1f, 0xe0, 0x00, + 0xcc, 0x1f, 0xfe, 0x00, 0x6c, 0x00, 0x00, 0x40, + 0x6c, 0x00, 0x00, 0x20, 0x00, 0x00, 0x82, 0x18, + 0x6c, 0x00, 0x00, 0x80, 0xb4, 0xf0, 0x1c, 0x01, + 0xb0, 0x82, 0x23, 0x1b, 0x06, 0x9b, 0x6a, 0x1b, + 0x1c, 0x18, 0x27, 0x00, 0x22, 0x00, 0x08, 0x40, + 0x00, 0x40, 0x4b, 0xaf, 0x68, 0x1c, 0x08, 0x64, + 0x00, 0x64, 0x60, 0x1c, 0x4b, 0xad, 0x68, 0x1b, + 0x1c, 0x1d, 0x23, 0x1b, 0x06, 0x9b, 0x6c, 0x1b, + 0x93, 0x01, 0x23, 0xff, 0x33, 0x01, 0x40, 0x03, + 0xd0, 0x00, 0x22, 0xff, 0x23, 0x01, 0x04, 0x9b, + 0x40, 0x03, 0xd0, 0x1b, 0x4c, 0xa4, 0x68, 0x26, + 0x23, 0x01, 0x04, 0x9b, 0x43, 0x9e, 0x1c, 0x33, + 0x60, 0x23, 0x4c, 0xa1, 0x68, 0x26, 0x23, 0x01, + 0x43, 0x33, 0x60, 0x23, 0x23, 0x00, 0x93, 0x00, + 0x9b, 0x00, 0x2b, 0x0a, 0xdb, 0x04, 0xe0, 0x04, + 0x9b, 0x00, 0x33, 0x01, 0x93, 0x00, 0xe7, 0xf7, + 0xe7, 0xfa, 0x4b, 0x99, 0x68, 0x1c, 0x08, 0x64, + 0x00, 0x64, 0x60, 0x1c, 0x23, 0x01, 0x02, 0x9b, + 0x40, 0x0b, 0xd0, 0x29, 0x23, 0x01, 0x02, 0xdb, + 0x40, 0x0b, 0xd0, 0x01, 0x4b, 0x94, 0x40, 0x18, + 0x23, 0x01, 0x03, 0x1b, 0x40, 0x0b, 0xd0, 0x02, + 0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, 0x4b, 0x91, + 0x40, 0x18, 0x02, 0x4c, 0x23, 0x7f, 0x02, 0x5b, + 0x40, 0x23, 0x43, 0x18, 0x23, 0x40, 0x40, 0x0b, + 0xd0, 0x03, 0x23, 0x01, 0x04, 0x5b, 0x43, 0x18, + 0xe0, 0x0a, 0x4b, 0x8b, 0x40, 0x18, 0x23, 0x20, + 0x40, 0x0b, 0xd0, 0x03, 0x23, 0x01, 0x04, 0x1b, + 0x43, 0x18, 0xe0, 0x01, 0x4b, 0x87, 0x40, 0x18, + 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 0xe0, 0xfc, + 0x23, 0x04, 0x40, 0x0b, 0xd0, 0x0f, 0x4c, 0x7e, + 0x68, 0x26, 0x23, 0x01, 0x43, 0x33, 0x60, 0x23, + 0x4b, 0x81, 0x68, 0x9b, 0x24, 0x33, 0x06, 0x64, + 0x65, 0xe3, 0x4b, 0x7f, 0x68, 0xdb, 0x24, 0x33, + 0x06, 0x64, 0x66, 0x23, 0xe0, 0xe9, 0x23, 0x01, + 0x03, 0x5b, 0x40, 0x0b, 0xd0, 0x13, 0x4b, 0x7a, + 0x68, 0x9b, 0x24, 0x33, 0x06, 0x64, 0x65, 0xe3, + 0x4b, 0x77, 0x68, 0xdb, 0x24, 0x33, 0x06, 0x64, + 0x66, 0x23, 0x23, 0x01, 0x24, 0x33, 0x06, 0x64, + 0x66, 0xe3, 0x4c, 0x6d, 0x68, 0x26, 0x23, 0x01, + 0x43, 0x33, 0x60, 0x23, 0xe0, 0xd1, 0x07, 0xcb, + 0x0f, 0xdb, 0xd0, 0x02, 0x23, 0x02, 0x43, 0x18, + 0xe0, 0x05, 0x23, 0x02, 0x40, 0x0b, 0xd0, 0x02, + 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0x23, 0x07, + 0x01, 0xdb, 0x40, 0x0b, 0xd0, 0x0f, 0x23, 0x0c, + 0x43, 0xdb, 0x40, 0x18, 0x23, 0xff, 0x33, 0x01, + 0x40, 0x0b, 0xd0, 0x02, 0x23, 0x04, 0x43, 0x18, + 0xe0, 0x05, 0x23, 0x01, 0x02, 0x5b, 0x40, 0x0b, + 0xd0, 0x01, 0x23, 0x08, 0x43, 0x18, 0x23, 0x01, + 0x04, 0x1b, 0x40, 0x0b, 0xd0, 0x08, 0x23, 0x01, + 0x04, 0x9b, 0x43, 0x98, 0x1c, 0x04, 0x20, 0x01, + 0x04, 0xc0, 0x43, 0x20, 0x23, 0x01, 0x43, 0x18, + 0x23, 0x78, 0x40, 0x0b, 0xd0, 0x73, 0x23, 0x30, + 0x40, 0x03, 0xd0, 0x06, 0x2b, 0x10, 0xd0, 0x04, + 0x2b, 0x20, 0xd0, 0x42, 0x2b, 0x30, 0xd0, 0x40, + 0xe0, 0x81, 0x23, 0x10, 0x40, 0x0b, 0xd1, 0x02, + 0x23, 0x08, 0x40, 0x0b, 0xd0, 0x08, 0x23, 0x30, + 0x43, 0xdb, 0x40, 0x18, 0x23, 0x10, 0x40, 0x0b, + 0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0xe0, 0x2f, + 0x23, 0x30, 0x43, 0xdb, 0x40, 0x18, 0x23, 0x20, + 0x40, 0x0b, 0xd0, 0x02, 0x23, 0x20, 0x43, 0x18, + 0xe0, 0x01, 0x23, 0x30, 0x43, 0x18, 0x23, 0x01, + 0x43, 0x18, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, + 0x27, 0xff, 0x2a, 0x00, 0xd0, 0x04, 0x4b, 0x43, + 0x68, 0x1b, 0x4c, 0x43, 0x60, 0x23, 0xe0, 0x17, + 0x07, 0xab, 0x0f, 0x9b, 0xd0, 0x09, 0x2b, 0x01, + 0xd0, 0x02, 0x2b, 0x02, 0xd0, 0x0a, 0xe0, 0x0e, + 0x4b, 0x3e, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, + 0xe0, 0x0a, 0x4b, 0x3d, 0x24, 0x1b, 0x06, 0xa4, + 0x64, 0x23, 0xe0, 0x05, 0x4b, 0x3b, 0x24, 0x1b, + 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x00, 0xe7, 0xff, + 0xe0, 0x42, 0x23, 0x40, 0x40, 0x0b, 0xd1, 0x02, + 0x23, 0x20, 0x40, 0x0b, 0xd0, 0x0b, 0x23, 0x30, + 0x43, 0xdb, 0x40, 0x18, 0x23, 0x20, 0x40, 0x0b, + 0xd0, 0x02, 0x23, 0x20, 0x43, 0x18, 0xe0, 0x01, + 0x23, 0x30, 0x43, 0x18, 0xe0, 0x2e, 0x23, 0x30, + 0x43, 0xdb, 0x40, 0x18, 0x23, 0x10, 0x40, 0x0b, + 0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0x23, 0x01, + 0x43, 0x18, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, + 0x27, 0xff, 0x2a, 0x00, 0xd0, 0x04, 0x4b, 0x23, + 0x68, 0x1b, 0x4c, 0x23, 0x60, 0x23, 0xe0, 0x19, + 0x07, 0xab, 0x0f, 0x9b, 0xe0, 0x00, 0xe0, 0x17, + 0xd0, 0x09, 0x2b, 0x01, 0xd0, 0x02, 0x2b, 0x02, + 0xd0, 0x0a, 0xe0, 0x0e, 0x4b, 0x20, 0x24, 0x1b, + 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x0a, 0x4b, 0x1f, + 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x05, + 0x4b, 0x1d, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, + 0xe0, 0x00, 0xe7, 0xff, 0xe0, 0x00, 0xe7, 0xff, + 0x2f, 0x00, 0xd1, 0x12, 0x23, 0x1b, 0x06, 0x9b, + 0x62, 0x18, 0x23, 0x00, 0x93, 0x00, 0x9b, 0x00, + 0x2b, 0x0a, 0xdb, 0x04, 0xe0, 0x04, 0x9b, 0x00, + 0x33, 0x01, 0x93, 0x00, 0xe7, 0xf7, 0xe7, 0xfa, + 0x4b, 0x03, 0x68, 0x1c, 0x08, 0x64, 0x00, 0x64, + 0x60, 0x1c, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x6c, 0x00, 0x00, 0x20, 0x6c, 0x00, 0x68, 0x00, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x01, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0x2e, 0x08, 0xb9, 0x88, 0x2e, 0x08, 0x9b, 0xbc, + 0x6c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x98, 0x60, + 0x00, 0x01, 0x58, 0x60, 0x00, 0x02, 0x54, 0x28, + 0x00, 0x00, 0x82, 0x18, 0x00, 0x01, 0x42, 0x18, + 0x00, 0x02, 0x42, 0x18, 0xb5, 0xf3, 0x1c, 0x0f, + 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x00, 0x98, 0x00, 0x28, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x33, 0x06, 0x40, + 0x6e, 0x00, 0x21, 0x33, 0x06, 0x49, 0x6d, 0xc9, + 0x1a, 0x46, 0x48, 0x12, 0x6c, 0x80, 0x1c, 0x04, + 0x48, 0x10, 0x6c, 0xc0, 0x1c, 0x05, 0x42, 0xac, + 0xd9, 0x09, 0x1b, 0x60, 0x21, 0x64, 0x43, 0x41, + 0x1c, 0x30, 0xf0, 0x09, 0xff, 0xcb, 0x21, 0x64, + 0x1a, 0x08, 0x60, 0x38, 0xe0, 0x06, 0x1b, 0x28, + 0x21, 0x64, 0x43, 0x41, 0x1c, 0x30, 0xf0, 0x09, + 0xff, 0xc1, 0x60, 0x38, 0x42, 0xac, 0xd1, 0x03, + 0x20, 0x31, 0xb0, 0x01, 0xe7, 0xd6, 0xe0, 0x02, + 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xd2, 0xb0, 0x01, + 0xe7, 0xd0, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, + 0xb5, 0xff, 0x1c, 0x14, 0x1c, 0x1f, 0xb0, 0x82, + 0x98, 0x02, 0x06, 0x01, 0x0e, 0x09, 0x91, 0x00, + 0x98, 0x0b, 0x06, 0x03, 0x16, 0x1b, 0x93, 0x01, + 0xb0, 0x84, 0x99, 0x04, 0x29, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x9b, 0x05, 0x2b, 0x1f, + 0xdd, 0x02, 0x20, 0xaf, 0xb0, 0x06, 0xe7, 0xf5, + 0x98, 0x07, 0x90, 0x01, 0x2f, 0x00, 0xd0, 0x47, + 0xb0, 0x81, 0x98, 0x08, 0x22, 0x00, 0x92, 0x00, + 0x22, 0x1b, 0x06, 0x92, 0x6a, 0x12, 0x23, 0x01, + 0x05, 0x1b, 0x40, 0x1a, 0xd0, 0x01, 0x22, 0xff, + 0x92, 0x00, 0x25, 0x00, 0x08, 0x62, 0x42, 0xaa, + 0xd8, 0x02, 0xe0, 0x34, 0x35, 0x01, 0xe7, 0xf9, + 0x9a, 0x00, 0x2a, 0x00, 0xd0, 0x1e, 0x88, 0x02, + 0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, 0x12, 0x12, + 0x88, 0x03, 0x02, 0x1b, 0x43, 0x1a, 0x04, 0x11, + 0x0c, 0x09, 0x2f, 0x00, 0xda, 0x05, 0x42, 0x7a, + 0x41, 0x11, 0x1c, 0x0b, 0x04, 0x19, 0x0c, 0x09, + 0xe0, 0x03, 0x40, 0xb9, 0x1c, 0x0a, 0x04, 0x11, + 0x0c, 0x09, 0x22, 0xff, 0x02, 0x12, 0x40, 0x0a, + 0x12, 0x12, 0x02, 0x0b, 0x43, 0x13, 0x80, 0x03, + 0x30, 0x02, 0xe0, 0x0f, 0x2f, 0x00, 0xda, 0x07, + 0x88, 0x02, 0x42, 0x7e, 0x41, 0x32, 0x04, 0x12, + 0x0c, 0x12, 0x80, 0x02, 0x30, 0x02, 0xe0, 0x05, + 0x88, 0x02, 0x40, 0xba, 0x04, 0x12, 0x0c, 0x12, + 0x80, 0x02, 0x30, 0x02, 0xe7, 0xca, 0xb0, 0x01, + 0x49, 0x23, 0x91, 0x03, 0x20, 0x01, 0x06, 0x00, + 0x99, 0x03, 0x60, 0x08, 0x48, 0x21, 0x6c, 0x80, + 0x49, 0x20, 0x6c, 0xc9, 0x1a, 0x40, 0x90, 0x00, + 0x98, 0x00, 0x28, 0x00, 0xdc, 0x09, 0x20, 0x33, + 0x06, 0x40, 0x6e, 0x00, 0x21, 0x33, 0x06, 0x49, + 0x6d, 0xc9, 0x1a, 0x40, 0x99, 0x00, 0x18, 0x40, + 0x90, 0x00, 0x98, 0x00, 0x23, 0x3b, 0x01, 0xdb, + 0x42, 0x98, 0xda, 0x02, 0x20, 0x06, 0xf0, 0x08, + 0xfd, 0x8d, 0x98, 0x00, 0x23, 0x3b, 0x01, 0xdb, + 0x42, 0x98, 0xdb, 0xdf, 0x98, 0x00, 0x42, 0x84, + 0xd9, 0x02, 0x98, 0x00, 0x90, 0x02, 0xe0, 0x00, + 0x94, 0x02, 0x22, 0x04, 0x99, 0x03, 0xb4, 0x06, + 0x9b, 0x07, 0x9a, 0x04, 0x99, 0x06, 0x98, 0x03, + 0xf0, 0x04, 0xfb, 0x8c, 0xb0, 0x02, 0x98, 0x02, + 0x1a, 0x24, 0x98, 0x01, 0x99, 0x02, 0x18, 0x40, + 0x90, 0x01, 0x20, 0x00, 0x90, 0x00, 0x2c, 0x00, + 0xd1, 0xc4, 0x20, 0x00, 0xb0, 0x06, 0xe7, 0x65, + 0xb0, 0x04, 0xb0, 0x02, 0xe7, 0x62, 0x00, 0x00, + 0x9e, 0x00, 0x08, 0x00, 0x66, 0x00, 0x00, 0x80, + 0x20, 0x1b, 0x06, 0x80, 0x6a, 0x00, 0x07, 0xc0, + 0x0f, 0xc0, 0x4a, 0x03, 0x68, 0x12, 0x1c, 0x01, + 0x43, 0x11, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, + 0x6c, 0x00, 0x08, 0x00, 0xb4, 0x90, 0x1c, 0x01, + 0x20, 0x1b, 0x06, 0x80, 0x6a, 0x00, 0x1c, 0x04, + 0x48, 0x1b, 0x68, 0x00, 0x1c, 0x07, 0x20, 0x30, + 0x40, 0x20, 0xd0, 0x06, 0x28, 0x10, 0xd0, 0x06, + 0x28, 0x20, 0xd0, 0x06, 0x28, 0x30, 0xd0, 0x06, + 0xe0, 0x07, 0x22, 0x01, 0xe0, 0x08, 0x22, 0x02, + 0xe0, 0x06, 0x22, 0x04, 0xe0, 0x04, 0x22, 0x08, + 0xe0, 0x02, 0x20, 0x30, 0xbc, 0x90, 0x47, 0x70, + 0x20, 0x03, 0x07, 0x40, 0x40, 0x38, 0x0f, 0x40, + 0xd0, 0x04, 0x28, 0x01, 0xd0, 0x05, 0x28, 0x02, + 0xd0, 0x06, 0xe0, 0x08, 0x23, 0x10, 0x43, 0x1a, + 0xe0, 0x07, 0x23, 0x20, 0x43, 0x1a, 0xe0, 0x04, + 0x23, 0x40, 0x43, 0x1a, 0xe0, 0x01, 0x20, 0x30, + 0xe7, 0xe8, 0x20, 0x01, 0x05, 0xc0, 0x40, 0x38, + 0xd1, 0x01, 0x23, 0x80, 0x43, 0x1a, 0x60, 0x0a, + 0x20, 0x00, 0xe7, 0xdf, 0xe7, 0xde, 0x00, 0x00, + 0x6c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0x48, 0x01, + 0x60, 0x01, 0x47, 0x70, 0x6c, 0x00, 0x00, 0x80, + 0x1c, 0x01, 0x29, 0x1f, 0xdd, 0x01, 0x20, 0xaf, + 0x47, 0x70, 0x20, 0x80, 0x6c, 0x00, 0x60, 0x01, + 0x20, 0x00, 0xe7, 0xf9, 0xe7, 0xf8, 0xb5, 0xf3, + 0x1c, 0x0a, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x03, + 0x0e, 0x1b, 0x93, 0x00, 0xb0, 0x81, 0x20, 0x1b, + 0x06, 0x80, 0x6a, 0x00, 0x1c, 0x01, 0x25, 0x00, + 0x20, 0x00, 0x90, 0x00, 0x20, 0x1b, 0x06, 0x80, + 0x6c, 0x00, 0x1c, 0x04, 0x27, 0x00, 0x9b, 0x01, + 0x2b, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d, + 0x06, 0x9b, 0x1a, 0xc0, 0x9b, 0x01, 0x00, 0xdb, + 0x4e, 0x5f, 0x68, 0x36, 0x19, 0x9b, 0x60, 0x58, + 0x20, 0xff, 0x30, 0x01, 0x40, 0x08, 0xd0, 0x01, + 0x20, 0xff, 0x90, 0x00, 0x23, 0x01, 0x04, 0xdb, + 0x43, 0x99, 0x1c, 0x08, 0x21, 0x01, 0x04, 0x89, + 0x43, 0x01, 0x20, 0x01, 0x03, 0x00, 0x40, 0x10, + 0xd0, 0x05, 0x06, 0x90, 0x0e, 0x80, 0xd0, 0x02, + 0x23, 0x01, 0x05, 0x1b, 0x43, 0x19, 0x23, 0x30, + 0x43, 0xdb, 0x40, 0x19, 0x05, 0x10, 0x0d, 0x00, + 0x28, 0x40, 0xd0, 0x48, 0xdc, 0x0e, 0x28, 0x08, + 0xd0, 0x32, 0xdc, 0x06, 0x28, 0x01, 0xd0, 0x1e, + 0x28, 0x02, 0xd0, 0x21, 0x28, 0x04, 0xd0, 0x26, + 0xe0, 0x67, 0x28, 0x10, 0xd0, 0x2f, 0x28, 0x20, + 0xd0, 0x32, 0xe0, 0x62, 0x23, 0x01, 0x02, 0x5b, + 0x42, 0x98, 0xd0, 0x49, 0xdc, 0x06, 0x28, 0x80, + 0xd0, 0x38, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, + 0xd0, 0x3b, 0xe0, 0x56, 0x23, 0x01, 0x02, 0x9b, + 0x42, 0x98, 0xd0, 0x44, 0x23, 0x01, 0x02, 0xdb, + 0x42, 0x98, 0xd0, 0x47, 0xe0, 0x4d, 0x4b, 0x3d, + 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x3b, 0xe0, 0x49, + 0x23, 0x10, 0x43, 0x19, 0x4b, 0x39, 0x42, 0x9c, + 0xd0, 0x00, 0x4f, 0x38, 0xe0, 0x42, 0x4b, 0x38, + 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x36, 0xe0, 0x3d, + 0x23, 0x10, 0x43, 0x19, 0x4b, 0x34, 0x42, 0x9c, + 0xd0, 0x00, 0x4f, 0x33, 0xe0, 0x36, 0x4b, 0x33, + 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x31, 0xe0, 0x31, + 0x23, 0x10, 0x43, 0x19, 0x4b, 0x2f, 0x42, 0x9c, + 0xd0, 0x00, 0x4f, 0x2e, 0xe0, 0x2a, 0x23, 0x20, + 0x43, 0x19, 0x4b, 0x2d, 0x42, 0x9c, 0xd0, 0x00, + 0x4f, 0x2b, 0xe0, 0x23, 0x23, 0x30, 0x43, 0x19, + 0x4b, 0x29, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x28, + 0xe0, 0x1c, 0x23, 0x20, 0x43, 0x19, 0x4b, 0x27, + 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x25, 0xe0, 0x15, + 0x23, 0x30, 0x43, 0x19, 0x4b, 0x23, 0x42, 0x9c, + 0xd0, 0x00, 0x4f, 0x22, 0xe0, 0x0e, 0x23, 0x20, + 0x43, 0x19, 0x4b, 0x21, 0x42, 0x9c, 0xd0, 0x00, + 0x4f, 0x1f, 0xe0, 0x07, 0x23, 0x30, 0x43, 0x19, + 0x4b, 0x1d, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x1c, + 0xe0, 0x00, 0xe7, 0xff, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x0a, 0x23, 0x01, 0x43, 0x19, 0x20, 0x1b, + 0x06, 0x80, 0x62, 0x01, 0x48, 0x17, 0x68, 0x00, + 0x4b, 0x17, 0x60, 0x18, 0x25, 0xff, 0xe0, 0x0e, + 0x23, 0x01, 0x43, 0x19, 0x2f, 0x00, 0xd0, 0x07, + 0x20, 0x1b, 0x06, 0x80, 0x62, 0x01, 0x20, 0x1b, + 0x06, 0x80, 0x64, 0x07, 0x25, 0xff, 0xe0, 0x02, + 0x20, 0x1b, 0x06, 0x80, 0x62, 0x01, 0x2d, 0x00, + 0xd1, 0x04, 0x48, 0x0e, 0x68, 0x03, 0x08, 0x5b, + 0x00, 0x5b, 0x60, 0x03, 0x20, 0x00, 0xb0, 0x02, + 0xe7, 0x36, 0xb0, 0x01, 0xb0, 0x01, 0xe7, 0x33, + 0x2e, 0x08, 0x9b, 0x40, 0x00, 0x00, 0x82, 0x18, + 0x00, 0x01, 0x42, 0x18, 0x00, 0x02, 0x42, 0x18, + 0x00, 0x00, 0x98, 0x60, 0x00, 0x01, 0x58, 0x60, + 0x00, 0x02, 0x54, 0x28, 0x2e, 0x08, 0x9b, 0xbc, + 0x6c, 0x00, 0x00, 0x80, 0x6c, 0x00, 0x00, 0x20, + 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x82, 0x49, 0x2c, + 0x46, 0x68, 0x22, 0x08, 0xf0, 0x09, 0xfd, 0xca, + 0x20, 0x04, 0xf7, 0xff, 0xfc, 0x23, 0x48, 0x29, + 0x68, 0x80, 0x21, 0x33, 0x06, 0x49, 0x65, 0xc8, + 0x48, 0x26, 0x68, 0xc0, 0x21, 0x33, 0x06, 0x49, + 0x66, 0x08, 0x48, 0x25, 0x68, 0x01, 0x23, 0x02, + 0x43, 0x19, 0x60, 0x01, 0x20, 0x01, 0x21, 0x33, + 0x06, 0x49, 0x67, 0xc8, 0x48, 0x21, 0x68, 0x01, + 0x31, 0xff, 0x31, 0xff, 0x31, 0x02, 0x60, 0x01, + 0x1c, 0x78, 0x12, 0x00, 0xab, 0x01, 0x70, 0x18, + 0x1c, 0x78, 0xab, 0x01, 0x70, 0x58, 0x20, 0x33, + 0x06, 0x40, 0x6d, 0xc5, 0x4b, 0x1a, 0x43, 0x1d, + 0x26, 0x00, 0x2e, 0x10, 0xdb, 0x02, 0xe0, 0x18, + 0x36, 0x01, 0xe7, 0xfa, 0x24, 0x00, 0x2c, 0x07, + 0xd3, 0x02, 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xfa, + 0x46, 0x68, 0x5d, 0x01, 0x70, 0x29, 0x35, 0x01, + 0xe7, 0xf8, 0x24, 0x00, 0x42, 0xbc, 0xdb, 0x02, + 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x02, + 0x5d, 0x01, 0x70, 0x29, 0x35, 0x01, 0xe7, 0xf8, + 0xe7, 0xe6, 0x20, 0x33, 0x06, 0x40, 0x66, 0x05, + 0x48, 0x0a, 0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, + 0x43, 0x19, 0x60, 0x01, 0xb0, 0x02, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x03, 0xa8, 0x70, 0x2e, 0x08, 0xb9, 0x88, + 0x66, 0x00, 0x00, 0x70, 0x66, 0x00, 0x00, 0x5c, + 0xcc, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x20, + 0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x20, + 0x0e, 0x00, 0x06, 0x3d, 0x0e, 0x2d, 0x99, 0x02, + 0x06, 0x0a, 0x0e, 0x12, 0x21, 0x02, 0x40, 0x01, + 0xd0, 0x04, 0x21, 0xff, 0x4b, 0x2f, 0x68, 0x1b, + 0x72, 0x19, 0xe0, 0x0c, 0x49, 0x2d, 0x68, 0x09, + 0x7a, 0x09, 0x29, 0xff, 0xd1, 0x03, 0x21, 0x00, + 0x4b, 0x2a, 0x68, 0x1b, 0x60, 0x19, 0x21, 0x00, + 0x4b, 0x28, 0x68, 0x1b, 0x72, 0x19, 0x07, 0xc1, + 0x0f, 0xc9, 0xd0, 0x04, 0x21, 0xff, 0x4b, 0x25, + 0x68, 0x1b, 0x72, 0x59, 0xe0, 0x0c, 0x49, 0x23, + 0x68, 0x09, 0x7a, 0x49, 0x29, 0xff, 0xd1, 0x03, + 0x21, 0x00, 0x4b, 0x20, 0x68, 0x1b, 0x60, 0x59, + 0x21, 0x00, 0x4b, 0x1e, 0x68, 0x1b, 0x72, 0x59, + 0x2d, 0x01, 0xd1, 0x0f, 0x49, 0x1c, 0x68, 0x0e, + 0x23, 0x01, 0x05, 0x5b, 0x43, 0x9e, 0x1c, 0x33, + 0x60, 0x0b, 0x49, 0x1a, 0x68, 0x09, 0x78, 0x09, + 0x23, 0x02, 0x43, 0x19, 0x4b, 0x17, 0x68, 0x1b, + 0x70, 0x19, 0xe0, 0x0e, 0x49, 0x14, 0x68, 0x0e, + 0x23, 0x01, 0x05, 0x5b, 0x43, 0x33, 0x60, 0x0b, + 0x49, 0x12, 0x68, 0x09, 0x78, 0x09, 0x23, 0x02, + 0x43, 0xdb, 0x40, 0x19, 0x4b, 0x0f, 0x68, 0x1b, + 0x70, 0x19, 0x49, 0x0f, 0x62, 0x4a, 0x2a, 0x01, + 0xd1, 0x08, 0x49, 0x0c, 0x68, 0x09, 0x78, 0x09, + 0x23, 0x01, 0x43, 0x19, 0x4b, 0x09, 0x68, 0x1b, + 0x70, 0x19, 0xe0, 0x07, 0x49, 0x07, 0x68, 0x09, + 0x78, 0x09, 0x08, 0x49, 0x00, 0x49, 0x4b, 0x05, + 0x68, 0x1b, 0x70, 0x19, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x9b, 0xc0, + 0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x9b, 0xc4, + 0xcc, 0x00, 0x0f, 0x80, 0xb4, 0x80, 0x1c, 0x07, + 0x1c, 0x0a, 0x68, 0x38, 0x49, 0x23, 0x68, 0x09, + 0x60, 0xc8, 0x68, 0x78, 0x49, 0x21, 0x68, 0x09, + 0x61, 0x08, 0x68, 0xb8, 0x49, 0x1f, 0x68, 0x09, + 0x61, 0x48, 0x68, 0xf8, 0x49, 0x1d, 0x68, 0x09, + 0x61, 0x88, 0x7d, 0x38, 0x49, 0x1b, 0x68, 0x09, + 0x31, 0x20, 0x70, 0x08, 0x7d, 0x78, 0x49, 0x19, + 0x68, 0x09, 0x31, 0x20, 0x70, 0x48, 0x69, 0x38, + 0x49, 0x16, 0x68, 0x09, 0x61, 0xc8, 0x7d, 0xb8, + 0x49, 0x14, 0x68, 0x09, 0x31, 0x20, 0x70, 0x88, + 0x68, 0x10, 0x49, 0x12, 0x68, 0x09, 0x62, 0x48, + 0x68, 0x50, 0x49, 0x10, 0x68, 0x09, 0x62, 0x88, + 0x68, 0x90, 0x49, 0x0e, 0x68, 0x09, 0x62, 0xc8, + 0x68, 0xd0, 0x49, 0x0c, 0x68, 0x09, 0x63, 0x08, + 0x7d, 0x10, 0x49, 0x0a, 0x68, 0x09, 0x31, 0x20, + 0x76, 0x08, 0x7d, 0x50, 0x49, 0x07, 0x68, 0x09, + 0x31, 0x20, 0x76, 0x48, 0x69, 0x10, 0x49, 0x05, + 0x68, 0x09, 0x63, 0x48, 0x7d, 0x90, 0x49, 0x03, + 0x68, 0x09, 0x31, 0x20, 0x76, 0x88, 0xbc, 0x80, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xc0, + 0x1c, 0x02, 0x1c, 0x0b, 0x48, 0x03, 0x68, 0x00, + 0x60, 0x02, 0x48, 0x02, 0x68, 0x00, 0x60, 0x43, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xc0, + 0xb5, 0xf3, 0xb0, 0x88, 0x98, 0x08, 0x68, 0x04, + 0x20, 0x01, 0x90, 0x06, 0x20, 0x01, 0x90, 0x05, + 0x48, 0x8c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x19, + 0x48, 0x8a, 0x68, 0x00, 0x38, 0x01, 0x49, 0x89, + 0x60, 0x08, 0x48, 0x88, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x10, 0x48, 0x87, 0x78, 0x80, 0x90, 0x00, + 0x98, 0x00, 0x00, 0xc0, 0x49, 0x85, 0x68, 0x09, + 0x58, 0x08, 0x23, 0xff, 0x33, 0x01, 0x43, 0x98, + 0x1c, 0x01, 0x98, 0x00, 0x00, 0xc0, 0x4a, 0x81, + 0x68, 0x12, 0x50, 0x11, 0x20, 0x33, 0x06, 0x40, + 0x6e, 0x00, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc1, + 0x91, 0x02, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, + 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x90, 0x01, + 0x48, 0x79, 0x68, 0x00, 0x42, 0x84, 0xd1, 0x73, + 0x98, 0x01, 0x1d, 0xc7, 0x37, 0x01, 0x78, 0x38, + 0x18, 0x38, 0x1c, 0x47, 0x48, 0x75, 0x6c, 0xc0, + 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x42, 0xb8, + 0xd9, 0x19, 0x78, 0x38, 0x28, 0xff, 0xd1, 0x12, + 0x78, 0x78, 0x23, 0xf0, 0x40, 0x18, 0x28, 0xf0, + 0xd1, 0x0d, 0x78, 0xb8, 0x10, 0x80, 0x07, 0x80, + 0x0f, 0x80, 0x06, 0x00, 0x16, 0x00, 0x90, 0x06, + 0x78, 0x78, 0x10, 0xc0, 0x07, 0xc0, 0x09, 0xc0, + 0x16, 0x00, 0x90, 0x05, 0xe0, 0x03, 0x21, 0x01, + 0x70, 0x39, 0x18, 0x7f, 0xe7, 0xde, 0x21, 0x40, + 0x91, 0x03, 0x25, 0x20, 0x21, 0x14, 0x91, 0x07, + 0x98, 0x06, 0x28, 0x00, 0xd1, 0x02, 0x25, 0x23, + 0x21, 0x12, 0x91, 0x07, 0x98, 0x06, 0x28, 0x02, + 0xd1, 0x02, 0x25, 0x30, 0x21, 0x18, 0x91, 0x07, + 0x98, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x00, 0x6d, + 0x21, 0x70, 0x91, 0x03, 0x99, 0x03, 0x00, 0x48, + 0x99, 0x02, 0x1a, 0x08, 0x90, 0x04, 0x98, 0x04, + 0x99, 0x02, 0x42, 0x88, 0xd3, 0x05, 0xe0, 0x4e, + 0x98, 0x04, 0x99, 0x03, 0x18, 0x40, 0x90, 0x04, + 0xe7, 0xf5, 0x9f, 0x04, 0x21, 0x00, 0x70, 0x39, + 0x37, 0x01, 0x21, 0x00, 0x70, 0x39, 0x37, 0x01, + 0x21, 0x01, 0x70, 0x39, 0x18, 0x7f, 0x21, 0xc0, + 0x70, 0x39, 0x37, 0x01, 0x21, 0x00, 0x70, 0x39, + 0x37, 0x01, 0x21, 0x3a, 0x70, 0x39, 0x37, 0x01, + 0x21, 0x80, 0x70, 0x39, 0x37, 0x01, 0x21, 0x00, + 0x70, 0x39, 0x37, 0x01, 0x99, 0x03, 0x1f, 0xc8, + 0x38, 0x02, 0x1b, 0x41, 0x70, 0x39, 0x37, 0x01, + 0x26, 0x00, 0x99, 0x03, 0x1f, 0xc8, 0x38, 0x02, + 0x1b, 0x40, 0x42, 0xb0, 0xdc, 0x04, 0xe0, 0x00, + 0xe0, 0x34, 0xe0, 0x05, 0x36, 0x01, 0xe7, 0xf4, + 0x21, 0xff, 0x70, 0x39, 0x37, 0x01, 0xe7, 0xf9, + 0x21, 0xff, 0x70, 0x39, 0x37, 0x01, 0x98, 0x05, + 0x00, 0xc0, 0x21, 0xf7, 0x43, 0x01, 0x70, 0x39, + 0x37, 0x01, 0x99, 0x07, 0x70, 0x39, 0x37, 0x01, + 0x21, 0xc0, 0x70, 0x39, 0x37, 0x01, 0x26, 0x00, + 0x1f, 0x28, 0x42, 0xb0, 0xdc, 0x02, 0xe0, 0x05, + 0x36, 0x01, 0xe7, 0xf9, 0x21, 0x00, 0x70, 0x39, + 0x37, 0x01, 0xe7, 0xf9, 0xe7, 0xb0, 0x99, 0x03, + 0x00, 0x48, 0x99, 0x02, 0x1a, 0x08, 0x23, 0x0d, + 0x06, 0x9b, 0x18, 0xc0, 0x49, 0x29, 0x64, 0x88, + 0x99, 0x09, 0x20, 0x78, 0x40, 0x08, 0x23, 0x02, + 0x43, 0x18, 0xf7, 0xff, 0xfa, 0x17, 0x20, 0x01, + 0xf7, 0xff, 0xfa, 0x14, 0x48, 0x22, 0x68, 0x00, + 0x38, 0x02, 0x42, 0xa0, 0xd1, 0x09, 0x48, 0x22, + 0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, + 0x60, 0x01, 0x20, 0xff, 0x49, 0x1f, 0x68, 0x09, + 0x70, 0x08, 0x48, 0x1b, 0x68, 0x00, 0x38, 0x02, + 0x42, 0xa0, 0xd3, 0x0f, 0x48, 0x1c, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x48, 0x1a, 0x68, 0x00, + 0x23, 0x01, 0x06, 0x9b, 0x40, 0x18, 0xd0, 0x05, + 0x20, 0x32, 0x49, 0x13, 0x60, 0x08, 0x48, 0x12, + 0x68, 0x00, 0x1e, 0x84, 0x2c, 0x01, 0xd1, 0x02, + 0x20, 0x02, 0xf7, 0xff, 0xf9, 0xeb, 0x2c, 0xff, + 0xd1, 0x08, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, + 0x30, 0xbc, 0x49, 0x0c, 0x6c, 0xc9, 0x42, 0x88, + 0xd2, 0x00, 0x24, 0x18, 0x2c, 0x00, 0xd0, 0x02, + 0x2c, 0xff, 0xd0, 0x00, 0x3c, 0x01, 0x98, 0x08, + 0x60, 0x04, 0xb0, 0x08, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x9b, 0xb0, + 0x2e, 0x08, 0x9b, 0x9c, 0x2e, 0x08, 0x9b, 0x3c, + 0x2e, 0x08, 0x1f, 0x98, 0x66, 0x00, 0x00, 0x80, + 0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x9b, 0x98, + 0x6c, 0x00, 0x08, 0x00, 0xb5, 0xff, 0x1c, 0x04, + 0x1c, 0x0f, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, + 0x9b, 0x03, 0x06, 0x1e, 0x0e, 0x36, 0x2e, 0x20, + 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x1f, 0xdb, 0x01, + 0x20, 0xaf, 0xe7, 0xf7, 0x20, 0x01, 0x03, 0x40, + 0xf7, 0xff, 0xf9, 0xac, 0x20, 0x14, 0x49, 0x09, + 0x60, 0x08, 0x20, 0xff, 0x60, 0x20, 0x1c, 0x33, + 0x1c, 0x29, 0x1c, 0x38, 0x22, 0x02, 0xf7, 0xfc, + 0xfa, 0x4b, 0x48, 0x05, 0x68, 0x01, 0x23, 0x01, + 0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00, + 0xe7, 0xe0, 0xe7, 0xdf, 0x2e, 0x08, 0x1f, 0x98, + 0x6c, 0x00, 0x00, 0x20, 0xb4, 0x0f, 0xb5, 0xf0, + 0x1c, 0x07, 0xb0, 0x82, 0x20, 0x00, 0x49, 0x16, + 0x60, 0x08, 0x48, 0x16, 0x6f, 0x80, 0x23, 0x09, + 0x01, 0x9b, 0x42, 0x98, 0xd1, 0x02, 0x20, 0xe1, + 0x00, 0xc0, 0xe0, 0x00, 0x48, 0x12, 0x1c, 0x05, + 0x68, 0x38, 0x28, 0xff, 0xd1, 0x17, 0x98, 0x0d, + 0x90, 0x00, 0x98, 0x0c, 0x90, 0x01, 0x98, 0x01, + 0x99, 0x00, 0x1a, 0x46, 0x08, 0x68, 0x19, 0x81, + 0x1c, 0x28, 0xf0, 0x09, 0xfa, 0xeb, 0x1c, 0x04, + 0x34, 0x01, 0x0f, 0xf0, 0x07, 0xc0, 0xd0, 0x00, + 0x24, 0x04, 0x2c, 0x32, 0xd9, 0x00, 0x24, 0x04, + 0x1d, 0xe0, 0x30, 0x0d, 0x60, 0x38, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18, + 0x2e, 0x08, 0x9b, 0xb0, 0xcc, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0x05, 0xdd, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x81, 0x99, 0x02, 0x06, 0x09, 0x0e, 0x09, + 0x91, 0x00, 0xb0, 0x82, 0x99, 0x02, 0x29, 0x20, + 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x99, 0x02, + 0x00, 0x88, 0x49, 0x2f, 0x58, 0x08, 0x90, 0x01, + 0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x03, + 0xe7, 0xf1, 0x20, 0x00, 0x70, 0x78, 0x78, 0xb8, + 0x07, 0x00, 0x0f, 0x00, 0x90, 0x00, 0x98, 0x00, + 0x28, 0x04, 0xd1, 0x1f, 0x6a, 0xfe, 0x24, 0x00, + 0x2c, 0x08, 0xdb, 0x04, 0xe0, 0x18, 0x1c, 0x60, + 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x00, 0xa0, + 0x19, 0x80, 0x68, 0x40, 0x00, 0xa1, 0x19, 0x89, + 0x64, 0x48, 0x21, 0x00, 0x00, 0xa0, 0x19, 0x80, + 0x62, 0x41, 0x00, 0xa0, 0x19, 0x80, 0x6c, 0x40, + 0x28, 0x00, 0xd0, 0x04, 0x20, 0x80, 0x41, 0x20, + 0x88, 0x31, 0x43, 0x08, 0x80, 0x30, 0xe7, 0xe6, + 0x88, 0x30, 0x80, 0x70, 0x78, 0xb8, 0x23, 0x20, + 0x40, 0x18, 0xd0, 0x1f, 0x6b, 0x3d, 0x20, 0x00, + 0x60, 0x28, 0x20, 0x00, 0x60, 0x68, 0x20, 0x00, + 0x60, 0xa8, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04, + 0xe0, 0x0c, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, + 0xe7, 0xf8, 0x20, 0x00, 0x00, 0xa1, 0x19, 0x49, + 0x60, 0xc8, 0x20, 0x00, 0x00, 0xa1, 0x19, 0x49, + 0x63, 0x88, 0xe7, 0xf2, 0x20, 0x00, 0x62, 0xe8, + 0x20, 0x00, 0x63, 0x28, 0x20, 0x00, 0x63, 0x68, + 0x20, 0x00, 0x65, 0xa8, 0x99, 0x02, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x3e, 0xb0, 0x03, 0xe7, 0x9e, + 0xb0, 0x02, 0xb0, 0x01, 0xe7, 0x9b, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xc8, 0xb5, 0xf3, 0x1c, 0x07, + 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0xb0, 0x82, + 0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0xa0, 0x49, 0x12, 0x58, 0x08, 0x1c, 0x05, + 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x02, 0xe7, 0xf3, + 0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x84, + 0x1c, 0x06, 0xd0, 0x02, 0x1c, 0x30, 0xb0, 0x02, + 0xe7, 0xea, 0x78, 0x68, 0x21, 0x20, 0x40, 0x01, + 0x91, 0x00, 0x99, 0x00, 0x1c, 0x38, 0xf0, 0x00, + 0xff, 0x3f, 0x68, 0xe9, 0x91, 0x01, 0x29, 0x00, + 0xd0, 0x03, 0x99, 0x01, 0x1c, 0x38, 0xf0, 0x03, + 0xfe, 0x7a, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xd7, + 0xb0, 0x02, 0xe7, 0xd5, 0x2e, 0x08, 0x9b, 0xc8, + 0xb5, 0xf3, 0x1c, 0x02, 0x99, 0x01, 0x06, 0x0f, + 0x0e, 0x3f, 0xb0, 0x86, 0x00, 0xb8, 0x4b, 0xa1, + 0x68, 0x1b, 0x18, 0xc0, 0x90, 0x00, 0x2f, 0x20, + 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb8, + 0x4b, 0x9b, 0x58, 0x18, 0x90, 0x05, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x06, 0xe7, 0xf2, + 0x78, 0x90, 0x90, 0x01, 0x71, 0xd7, 0x78, 0xd1, + 0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd1, 0x73, + 0x29, 0x20, 0xdd, 0x02, 0x20, 0xb1, 0xb0, 0x06, + 0xe7, 0xe5, 0x48, 0x92, 0x68, 0x00, 0x23, 0x01, + 0x42, 0xd8, 0xd1, 0x02, 0x20, 0xb2, 0xb0, 0x06, + 0xe7, 0xdd, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x8d, + 0x68, 0x1b, 0x40, 0x18, 0xd0, 0x02, 0x20, 0xb1, + 0xb0, 0x06, 0xe7, 0xd4, 0x00, 0x88, 0x4b, 0x8a, + 0x50, 0x1a, 0x48, 0x8a, 0x54, 0x47, 0x01, 0x08, + 0x4b, 0x89, 0x18, 0xc5, 0x7f, 0x10, 0x06, 0x00, + 0x7f, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7f, 0x93, + 0x02, 0x1b, 0x43, 0x18, 0x7f, 0xd3, 0x43, 0x03, + 0xc5, 0x08, 0x1d, 0xd0, 0x30, 0x19, 0x78, 0x00, + 0x06, 0x00, 0x1d, 0xd3, 0x33, 0x19, 0x78, 0x5b, + 0x04, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, + 0x78, 0x9b, 0x02, 0x1b, 0x43, 0x18, 0x1d, 0xd3, + 0x33, 0x19, 0x78, 0xdb, 0x43, 0x03, 0xc5, 0x08, + 0x01, 0x08, 0x4b, 0x7a, 0x18, 0xc4, 0x7b, 0x10, + 0x06, 0x00, 0x7b, 0x53, 0x04, 0x1b, 0x43, 0x18, + 0x7b, 0x93, 0x02, 0x1b, 0x43, 0x18, 0x7b, 0xd3, + 0x43, 0x03, 0xc4, 0x08, 0x7c, 0x10, 0x06, 0x00, + 0x7c, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7c, 0x93, + 0x02, 0x1b, 0x43, 0x18, 0x7c, 0xd3, 0x43, 0x03, + 0xc4, 0x08, 0x98, 0x01, 0x07, 0xc0, 0x0f, 0xc0, + 0xd0, 0x20, 0x1d, 0xd0, 0x30, 0x19, 0x79, 0x00, + 0x06, 0x00, 0x1d, 0xd3, 0x33, 0x19, 0x79, 0x5b, + 0x04, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, + 0x79, 0x9b, 0x02, 0x1b, 0x43, 0x18, 0x1d, 0xd3, + 0x33, 0x19, 0x79, 0xdb, 0x43, 0x03, 0xc5, 0x08, + 0x7d, 0x10, 0x06, 0x00, 0x7d, 0x53, 0x04, 0x1b, + 0x43, 0x18, 0x7d, 0x93, 0x02, 0x1b, 0xe0, 0x00, + 0xe0, 0x42, 0x43, 0x18, 0x7d, 0xd3, 0x43, 0x03, + 0xc4, 0x08, 0xe0, 0x03, 0x23, 0x00, 0xc5, 0x08, + 0x23, 0x00, 0xc4, 0x08, 0x23, 0xff, 0xc5, 0x08, + 0x20, 0x19, 0x06, 0x80, 0x6b, 0x00, 0x23, 0x08, + 0x40, 0x18, 0xd0, 0x06, 0x88, 0x90, 0x04, 0x00, + 0x19, 0xc3, 0x93, 0x02, 0x9b, 0x02, 0xc4, 0x08, + 0xe0, 0x00, 0xc4, 0x80, 0x98, 0x01, 0x23, 0x08, + 0x40, 0x18, 0xd0, 0x17, 0x48, 0x50, 0x5d, 0xc0, + 0x30, 0x01, 0x4b, 0x4f, 0x55, 0xd8, 0x7a, 0x10, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x04, 0x20, 0x01, + 0x40, 0x88, 0x23, 0x19, 0x06, 0x9b, 0x61, 0x18, + 0x7a, 0x10, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x04, + 0x20, 0x01, 0x40, 0x88, 0x23, 0x19, 0x06, 0x9b, + 0x61, 0x58, 0xe0, 0x05, 0x4e, 0x45, 0x20, 0x01, + 0x40, 0x88, 0x68, 0x33, 0x43, 0x18, 0x60, 0x30, + 0x20, 0x01, 0x40, 0x88, 0x4b, 0x3b, 0x68, 0x1b, + 0x43, 0x18, 0x4b, 0x3a, 0x60, 0x18, 0xe0, 0x4f, + 0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x48, + 0x48, 0x3d, 0x88, 0x00, 0x4b, 0x3d, 0x42, 0x98, + 0xd1, 0x02, 0x20, 0xb2, 0xb0, 0x06, 0xe7, 0x26, + 0x00, 0x88, 0x4b, 0x3b, 0x58, 0x18, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x1e, + 0x29, 0x10, 0xdb, 0x02, 0x20, 0xb1, 0xb0, 0x06, + 0xe7, 0x19, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x32, + 0x88, 0x1b, 0x40, 0x18, 0xd0, 0x02, 0x20, 0xb1, + 0xb0, 0x06, 0xe7, 0x10, 0x98, 0x05, 0x78, 0x80, + 0x28, 0x02, 0xdb, 0x02, 0x20, 0xb1, 0xb0, 0x06, + 0xe7, 0x09, 0x00, 0x88, 0x4b, 0x2c, 0x50, 0x1a, + 0x48, 0x2c, 0x54, 0x47, 0x00, 0xf8, 0x1b, 0xc0, + 0x00, 0x80, 0x4b, 0x2b, 0x68, 0x1b, 0x18, 0xc0, + 0x90, 0x04, 0x98, 0x04, 0x7e, 0x00, 0x28, 0xff, + 0xd1, 0x02, 0x98, 0x04, 0x76, 0x01, 0xe0, 0x01, + 0x98, 0x04, 0x76, 0x41, 0x4e, 0x25, 0x96, 0x03, + 0x1d, 0xd3, 0x33, 0x05, 0x00, 0x88, 0x9e, 0x03, + 0x50, 0x33, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x1c, + 0x88, 0x1b, 0x43, 0x18, 0x4b, 0x1a, 0x80, 0x18, + 0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe6, 0xe2, + 0x78, 0x50, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x18, + 0x70, 0x50, 0x98, 0x05, 0x78, 0x80, 0x28, 0x00, + 0xd1, 0x09, 0x98, 0x00, 0x68, 0x00, 0x23, 0x01, + 0x03, 0x5b, 0x43, 0x18, 0x9b, 0x00, 0x60, 0x18, + 0x20, 0x02, 0x9b, 0x05, 0x70, 0xd8, 0x98, 0x05, + 0x78, 0x80, 0x30, 0x01, 0x9b, 0x05, 0x70, 0x98, + 0x20, 0x00, 0xb0, 0x06, 0xe6, 0xc7, 0xb0, 0x06, + 0xe6, 0xc5, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x38, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9c, 0x48, + 0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x9d, 0x10, + 0x64, 0x00, 0x10, 0x00, 0x64, 0x00, 0x08, 0x00, + 0x2e, 0x08, 0xb9, 0x60, 0x64, 0x00, 0x00, 0x18, + 0x2e, 0x08, 0x9c, 0x4c, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x9c, 0xd0, 0x2e, 0x08, 0x9d, 0x30, + 0x2e, 0x08, 0x9b, 0x30, 0x9e, 0x00, 0x04, 0xb8, + 0xb5, 0xf3, 0x1c, 0x02, 0x99, 0x01, 0x06, 0x0f, + 0x0e, 0x3f, 0xb0, 0x86, 0x00, 0xb8, 0x4b, 0x65, + 0x68, 0x1b, 0x18, 0xc0, 0x90, 0x01, 0x2f, 0x20, + 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb8, + 0x4b, 0x5f, 0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02, + 0x20, 0xb0, 0xb0, 0x06, 0xe7, 0xf3, 0x78, 0x90, + 0x90, 0x03, 0x78, 0xd1, 0x00, 0x88, 0x4b, 0x5b, + 0x58, 0x18, 0x42, 0x90, 0xd0, 0x02, 0x20, 0xb1, + 0xb0, 0x06, 0xe7, 0xe8, 0x98, 0x03, 0x23, 0x80, + 0x40, 0x18, 0xd1, 0x49, 0x01, 0x08, 0x4b, 0x56, + 0x18, 0xc3, 0x93, 0x00, 0x20, 0x00, 0x9b, 0x00, + 0x60, 0x18, 0x23, 0x00, 0x00, 0x88, 0x4e, 0x51, + 0x50, 0x33, 0x23, 0xff, 0x48, 0x51, 0x54, 0x43, + 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x4b, 0x50, + 0x68, 0x1b, 0x40, 0x18, 0x4b, 0x4e, 0x60, 0x18, + 0x98, 0x03, 0x23, 0x08, 0x40, 0x18, 0xd0, 0x27, + 0x20, 0x01, 0x40, 0x88, 0x90, 0x04, 0x7a, 0x10, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x0b, 0x98, 0x04, + 0x23, 0x19, 0x06, 0x9b, 0x69, 0x1b, 0x40, 0x18, + 0xd0, 0x04, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, + 0x61, 0x18, 0xe7, 0xf4, 0xe0, 0x0e, 0x7a, 0x10, + 0x23, 0x02, 0x40, 0x18, 0xd0, 0x0a, 0x98, 0x04, + 0x23, 0x19, 0x06, 0x9b, 0x69, 0x5b, 0x40, 0x18, + 0xd0, 0x04, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, + 0x61, 0x58, 0xe7, 0xf4, 0x48, 0x3b, 0x5d, 0xc0, + 0x38, 0x01, 0x4b, 0x3a, 0x55, 0xd8, 0xe0, 0x06, + 0x4e, 0x39, 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, + 0x68, 0x33, 0x40, 0x18, 0x60, 0x30, 0xe0, 0x36, + 0x98, 0x03, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x2f, + 0x00, 0xf8, 0x1b, 0xc0, 0x00, 0x80, 0x4b, 0x33, + 0x68, 0x1b, 0x18, 0xc3, 0x93, 0x02, 0x9b, 0x02, + 0x7e, 0x18, 0x42, 0x88, 0xd1, 0x03, 0x20, 0xff, + 0x9b, 0x02, 0x76, 0x18, 0xe0, 0x0a, 0x9b, 0x02, + 0x7e, 0x58, 0x42, 0x88, 0xd1, 0x03, 0x20, 0xff, + 0x9b, 0x02, 0x76, 0x58, 0xe0, 0x02, 0x20, 0xb1, + 0xb0, 0x06, 0xe7, 0x7c, 0x23, 0x00, 0x00, 0x88, + 0x4e, 0x27, 0x50, 0x33, 0x20, 0xff, 0x4b, 0x27, + 0x54, 0x58, 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, + 0x4b, 0x25, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x24, + 0x80, 0x18, 0x4e, 0x24, 0x96, 0x05, 0x23, 0x00, + 0x00, 0x88, 0x9e, 0x05, 0x50, 0x33, 0xe0, 0x02, + 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x63, 0x78, 0xa8, + 0x38, 0x01, 0x70, 0xa8, 0x78, 0x50, 0x23, 0x80, + 0x43, 0x18, 0x70, 0x50, 0x78, 0xa8, 0x28, 0x00, + 0xd1, 0x07, 0x98, 0x01, 0x68, 0x00, 0x4b, 0x1a, + 0x40, 0x18, 0x9b, 0x01, 0x60, 0x18, 0x20, 0x01, + 0x70, 0xe8, 0x24, 0x1f, 0x2c, 0x00, 0xd1, 0x02, + 0xe0, 0x0a, 0x3c, 0x01, 0xe7, 0xfa, 0x48, 0x0d, + 0x5d, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x19, + 0x06, 0x80, 0x64, 0xc4, 0xe0, 0x00, 0xe7, 0xf4, + 0x20, 0x00, 0xb0, 0x06, 0xe7, 0x3f, 0xb0, 0x06, + 0xe7, 0x3d, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x38, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9c, 0x50, + 0x64, 0x00, 0x08, 0x08, 0x2e, 0x08, 0x9d, 0x10, + 0x2e, 0x08, 0x9c, 0x48, 0x2e, 0x08, 0xb9, 0x60, + 0x64, 0x00, 0x00, 0x18, 0x2e, 0x08, 0x9b, 0x30, + 0x2e, 0x08, 0x9c, 0xd0, 0x2e, 0x08, 0x9d, 0x30, + 0x2e, 0x08, 0x9c, 0x4c, 0x9e, 0x00, 0x04, 0xb8, + 0xff, 0xff, 0xdf, 0xff, 0x1c, 0x03, 0x1c, 0x0a, + 0x78, 0x58, 0x70, 0x10, 0x20, 0x00, 0x47, 0x70, + 0xe7, 0xfd, 0xb5, 0xf7, 0x1c, 0x07, 0xb0, 0x81, + 0x9a, 0x03, 0x06, 0x10, 0x0e, 0x00, 0x90, 0x00, + 0xb0, 0x87, 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, + 0xd0, 0x4c, 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, + 0xd0, 0x48, 0x78, 0xb8, 0x90, 0x06, 0x99, 0x09, + 0x78, 0x88, 0x90, 0x05, 0x98, 0x06, 0x23, 0x20, + 0x40, 0x18, 0xd0, 0x3f, 0x98, 0x05, 0x23, 0x20, + 0x40, 0x18, 0xd0, 0x3b, 0x6b, 0x38, 0x90, 0x01, + 0x99, 0x09, 0x6b, 0x08, 0x90, 0x00, 0x98, 0x01, + 0x28, 0x00, 0xd1, 0x02, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd1, 0x05, 0x20, 0xb6, 0xb0, 0x08, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x01, 0x68, 0x05, 0x98, 0x00, 0x68, 0x04, + 0x7a, 0x2e, 0x7a, 0x21, 0x91, 0x04, 0x7d, 0x6a, + 0x92, 0x03, 0x7d, 0x62, 0x92, 0x02, 0x98, 0x07, + 0x28, 0x00, 0xd0, 0x0a, 0x9a, 0x02, 0x99, 0x04, + 0x1c, 0x28, 0xf0, 0x00, 0xfc, 0xe5, 0x9a, 0x03, + 0x1c, 0x31, 0x1c, 0x20, 0xf0, 0x00, 0xfc, 0xe0, + 0xe0, 0x09, 0x99, 0x04, 0x1c, 0x28, 0x22, 0x00, + 0xf0, 0x00, 0xfc, 0xda, 0x1c, 0x31, 0x1c, 0x20, + 0x22, 0x00, 0xf0, 0x00, 0xfc, 0xd5, 0x20, 0x00, + 0xb0, 0x08, 0xe7, 0xd5, 0x20, 0xb1, 0xb0, 0x08, + 0xe7, 0xd2, 0xb0, 0x07, 0xb0, 0x01, 0xe7, 0xcf, + 0xb4, 0xf0, 0x1c, 0x02, 0x1c, 0x0b, 0x06, 0x1d, + 0x0e, 0x2d, 0xb0, 0x82, 0x2d, 0x00, 0xd1, 0x0a, + 0x48, 0x1a, 0x69, 0x00, 0x90, 0x01, 0x49, 0x1a, + 0x48, 0x18, 0x69, 0x40, 0x90, 0x00, 0x48, 0x17, + 0x6a, 0x00, 0x1e, 0x44, 0xe0, 0x10, 0x2d, 0x20, + 0xd1, 0x0a, 0x48, 0x14, 0x69, 0x80, 0x90, 0x01, + 0x49, 0x14, 0x48, 0x12, 0x69, 0xc0, 0x90, 0x00, + 0x48, 0x10, 0x6a, 0x40, 0x1e, 0x44, 0xe0, 0x03, + 0x20, 0xb3, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x20, 0x00, 0x70, 0x10, 0x78, 0x50, 0x00, 0x80, + 0x4e, 0x0d, 0x58, 0x37, 0x69, 0x38, 0x61, 0x78, + 0x98, 0x01, 0x9e, 0x00, 0x42, 0xb0, 0xd0, 0x07, + 0x98, 0x01, 0x30, 0x01, 0x90, 0x01, 0x98, 0x01, + 0x40, 0x20, 0x90, 0x01, 0x98, 0x01, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xe6, 0xb0, 0x02, + 0xe7, 0xe4, 0x00, 0x00, 0x9e, 0x00, 0x04, 0x80, + 0x9e, 0x00, 0x04, 0x90, 0x9e, 0x00, 0x04, 0x98, + 0x2e, 0x08, 0x9b, 0xc8, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x81, 0x99, 0x02, 0x06, 0x08, 0x0e, 0x00, + 0x90, 0x00, 0xb0, 0x88, 0x98, 0x08, 0x28, 0x00, + 0xd1, 0x0e, 0x49, 0x69, 0x91, 0x02, 0x48, 0x69, + 0x69, 0x00, 0x90, 0x07, 0x48, 0x68, 0x90, 0x06, + 0x48, 0x66, 0x69, 0x40, 0x90, 0x05, 0x48, 0x65, + 0x6a, 0x00, 0x1e, 0x41, 0x91, 0x04, 0xe0, 0x17, + 0x98, 0x08, 0x28, 0x20, 0xd1, 0x0e, 0x49, 0x63, + 0x91, 0x02, 0x48, 0x60, 0x69, 0x80, 0x90, 0x07, + 0x48, 0x61, 0x90, 0x06, 0x48, 0x5d, 0x69, 0xc0, + 0x90, 0x05, 0x48, 0x5c, 0x6a, 0x40, 0x1e, 0x41, + 0x91, 0x04, 0xe0, 0x05, 0x20, 0xb3, 0xb0, 0x09, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x25, 0x00, 0x98, 0x07, 0x99, 0x05, 0x42, 0x88, + 0xd0, 0x73, 0x2d, 0x00, 0xd1, 0x72, 0x98, 0x07, + 0x00, 0x80, 0x99, 0x02, 0x18, 0x40, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xc0, 0x68, 0x01, 0x91, 0x03, + 0x98, 0x07, 0x00, 0x80, 0x99, 0x02, 0x58, 0x08, + 0x90, 0x01, 0x99, 0x02, 0x98, 0x07, 0x18, 0x08, + 0x23, 0x01, 0x02, 0xdb, 0x18, 0xc0, 0x78, 0x00, + 0x90, 0x00, 0x20, 0x00, 0x99, 0x02, 0x9a, 0x07, + 0x18, 0x89, 0x23, 0x01, 0x02, 0xdb, 0x18, 0xc9, + 0x70, 0x08, 0x98, 0x07, 0x30, 0x01, 0x90, 0x07, + 0x98, 0x07, 0x99, 0x04, 0x40, 0x08, 0x90, 0x07, + 0x99, 0x03, 0x29, 0x00, 0xd0, 0x71, 0xb0, 0x83, + 0x20, 0x00, 0x90, 0x00, 0x99, 0x06, 0x91, 0x02, + 0x20, 0x01, 0x90, 0x01, 0x98, 0x03, 0x28, 0x80, + 0xd1, 0x1f, 0x24, 0x00, 0x2c, 0x10, 0xd3, 0x02, + 0xe0, 0x1a, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x01, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x10, 0x48, 0x39, + 0x5d, 0x00, 0x28, 0xff, 0xd0, 0x0c, 0x48, 0x37, + 0x5d, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x49, 0x36, + 0x58, 0x09, 0x00, 0xa8, 0x19, 0xc0, 0x61, 0x01, + 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0xe0, 0x03, + 0x98, 0x01, 0x00, 0x40, 0x90, 0x01, 0xe7, 0xe4, + 0xe0, 0x1d, 0x24, 0x00, 0x2c, 0x20, 0xd3, 0x02, + 0xe0, 0x19, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x01, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x0f, 0x48, 0x2b, + 0x5d, 0x00, 0x28, 0xff, 0xd0, 0x0b, 0x48, 0x29, + 0x5d, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x49, 0x28, + 0x58, 0x09, 0x00, 0xa8, 0x19, 0xc0, 0x61, 0x01, + 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x01, + 0x00, 0x40, 0x90, 0x01, 0xe7, 0xe5, 0x2d, 0x00, + 0xe0, 0x01, 0xe0, 0x27, 0xe0, 0x26, 0xd0, 0x23, + 0xb0, 0x81, 0x98, 0x01, 0x70, 0x78, 0x98, 0x05, + 0x60, 0x78, 0x98, 0x01, 0x00, 0x80, 0x49, 0x1d, + 0x58, 0x08, 0x90, 0x00, 0x98, 0x00, 0x69, 0x46, + 0x98, 0x05, 0x42, 0xb0, 0xd3, 0x04, 0x1d, 0xf0, + 0x30, 0xb9, 0x99, 0x05, 0x42, 0x88, 0xd2, 0x08, + 0x68, 0x30, 0x28, 0x00, 0xd0, 0x01, 0x68, 0x36, + 0xe0, 0x02, 0x20, 0xba, 0xb0, 0x0d, 0xe7, 0x63, + 0xe7, 0xee, 0x60, 0xbe, 0x98, 0x00, 0x61, 0x46, + 0x1c, 0x38, 0xf0, 0x00, 0xfb, 0x02, 0xb0, 0x01, + 0xb0, 0x03, 0xe7, 0x5e, 0x70, 0x3d, 0x98, 0x07, + 0x99, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x09, + 0xe7, 0x52, 0xb0, 0x08, 0xb0, 0x01, 0xe7, 0x4f, + 0x2e, 0x08, 0x9d, 0xfc, 0x9e, 0x00, 0x04, 0x80, + 0x9e, 0x00, 0x04, 0x90, 0x2e, 0x08, 0xa6, 0xfc, + 0x9e, 0x00, 0x04, 0x98, 0x2e, 0x08, 0x9d, 0x30, + 0x2e, 0x08, 0x9c, 0xd0, 0x2e, 0x08, 0x9d, 0x10, + 0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x9b, 0xc8, + 0xb4, 0x90, 0x1c, 0x01, 0x78, 0x48, 0x00, 0x80, + 0x4c, 0x0d, 0x58, 0x23, 0x69, 0x1a, 0x68, 0x8f, + 0x42, 0xba, 0xd0, 0x12, 0x68, 0x10, 0x42, 0xb8, + 0xd0, 0x08, 0x68, 0x10, 0x28, 0x00, 0xd0, 0x01, + 0x68, 0x12, 0xe0, 0x02, 0x20, 0xba, 0xbc, 0x90, + 0x47, 0x70, 0xe7, 0xf3, 0x20, 0x00, 0x60, 0x10, + 0x69, 0x9c, 0x69, 0x18, 0x60, 0x20, 0x61, 0x1f, + 0x61, 0x9a, 0x20, 0x00, 0xe7, 0xf3, 0xe7, 0xf2, + 0x2e, 0x08, 0x9b, 0xc8, 0xb4, 0xb0, 0x1c, 0x02, + 0x1c, 0x0f, 0x78, 0x90, 0x23, 0x04, 0x40, 0x18, + 0xd0, 0x1c, 0x78, 0x90, 0x23, 0x20, 0x40, 0x18, + 0xd0, 0x18, 0x6b, 0x14, 0x68, 0x20, 0x28, 0x00, + 0xd0, 0x02, 0x1d, 0xe5, 0x35, 0x05, 0xe0, 0x01, + 0x1d, 0xe5, 0x35, 0x31, 0x21, 0x00, 0x29, 0x08, + 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, + 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 0x58, 0x2b, + 0x00, 0x88, 0x50, 0x3b, 0xe7, 0xf6, 0x20, 0x00, + 0xbc, 0xb0, 0x47, 0x70, 0x20, 0xb1, 0xe7, 0xfb, + 0xe7, 0xfa, 0xb5, 0xf3, 0x1c, 0x0a, 0xb0, 0x93, + 0x20, 0x00, 0x90, 0x06, 0x98, 0x13, 0x69, 0x00, + 0x90, 0x00, 0x98, 0x00, 0x6b, 0x00, 0x90, 0x12, + 0x98, 0x00, 0x78, 0x80, 0x90, 0x05, 0x98, 0x12, + 0x68, 0x00, 0x90, 0x01, 0x28, 0x00, 0xd0, 0x03, + 0x98, 0x12, 0x30, 0x0c, 0x90, 0x09, 0xe0, 0x0e, + 0x98, 0x12, 0x6a, 0xc0, 0x90, 0x01, 0x28, 0x00, + 0xd0, 0x03, 0x98, 0x12, 0x30, 0x38, 0x90, 0x09, + 0xe0, 0x05, 0x20, 0xb1, 0xb0, 0x13, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0x90, 0x06, 0x98, 0x05, 0x23, 0x04, 0x40, 0x18, + 0xd0, 0x73, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, + 0xe0, 0x0c, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x98, 0x13, 0x30, 0x80, 0x69, 0x00, + 0x00, 0x8b, 0x58, 0xc0, 0x00, 0x8e, 0xab, 0x0a, + 0x51, 0x98, 0xe7, 0xf2, 0x9d, 0x01, 0x21, 0x00, + 0x29, 0x08, 0xdb, 0x04, 0xe0, 0xa7, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, + 0xab, 0x0a, 0x58, 0x18, 0x28, 0x00, 0xd0, 0x55, + 0x20, 0x00, 0x90, 0x08, 0x48, 0x73, 0x90, 0x07, + 0x20, 0x00, 0x90, 0x02, 0x98, 0x02, 0x28, 0x20, + 0xdb, 0x06, 0xe0, 0x8d, 0x98, 0x02, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x90, 0x02, 0xe7, 0xf5, + 0x00, 0x8b, 0xa8, 0x0a, 0x58, 0xc0, 0x9b, 0x07, + 0x40, 0x18, 0x90, 0x08, 0x28, 0x00, 0xd0, 0x73, + 0x00, 0x88, 0x9b, 0x09, 0x58, 0x18, 0x9b, 0x08, + 0x40, 0x18, 0xd0, 0x6e, 0x1d, 0xec, 0x34, 0x01, + 0x27, 0x00, 0x79, 0xa0, 0x9b, 0x06, 0x42, 0x98, + 0xd0, 0x08, 0x68, 0x68, 0x1c, 0x05, 0xd1, 0x02, + 0x20, 0xba, 0xb0, 0x13, 0xe7, 0xab, 0x1d, 0xec, + 0x34, 0x01, 0xe7, 0xf2, 0x78, 0x60, 0x07, 0x00, + 0x0f, 0x00, 0x02, 0x00, 0x04, 0x07, 0x0c, 0x3f, + 0x78, 0xa0, 0x19, 0xc0, 0x30, 0x03, 0x04, 0x07, + 0x0c, 0x3f, 0x2a, 0x00, 0xd0, 0x42, 0x98, 0x13, + 0x88, 0x40, 0x42, 0xb8, 0xdb, 0x3a, 0x98, 0x13, + 0x88, 0x40, 0x1b, 0xc0, 0x9b, 0x13, 0x80, 0x58, + 0x20, 0xbc, 0x90, 0x04, 0x2f, 0x00, 0xdd, 0x30, + 0x2f, 0xbc, 0xdd, 0x1b, 0x20, 0x00, 0x90, 0x03, + 0x98, 0x03, 0x28, 0xbc, 0xdb, 0x09, 0xe0, 0x0d, + 0x98, 0x03, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, + 0xe0, 0x01, 0xe0, 0x4c, 0xe0, 0x41, 0x90, 0x03, + 0xe7, 0xf2, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, + 0x32, 0x01, 0xe7, 0xf1, 0x1f, 0xf8, 0x38, 0xb5, + 0x04, 0x07, 0x0c, 0x3f, 0x68, 0x2d, 0x1d, 0xec, + 0x34, 0x01, 0xe0, 0x11, 0x20, 0x00, 0x90, 0x03, + 0x98, 0x03, 0x42, 0xb8, 0xdb, 0x06, 0xe0, 0x0a, + 0x98, 0x03, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x03, 0xe7, 0xf5, 0x78, 0x23, 0x34, 0x01, + 0x70, 0x13, 0x32, 0x01, 0xe7, 0xf4, 0x27, 0x00, + 0xe7, 0xcc, 0xe0, 0x02, 0x20, 0xb7, 0xb0, 0x13, + 0xe7, 0x59, 0xe0, 0x04, 0x98, 0x13, 0x88, 0x40, + 0x19, 0xc0, 0x9b, 0x13, 0x80, 0x58, 0x00, 0x88, + 0xab, 0x0a, 0x58, 0x18, 0x9b, 0x07, 0x43, 0x98, + 0x00, 0x8e, 0xab, 0x0a, 0x51, 0x98, 0xe0, 0x01, + 0xe0, 0x01, 0xe0, 0x00, 0x9d, 0x01, 0x98, 0x06, + 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x06, + 0x98, 0x07, 0x08, 0x40, 0x90, 0x07, 0xe7, 0x71, + 0xe0, 0x04, 0x98, 0x06, 0x30, 0x20, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x06, 0xe7, 0x57, 0x20, 0x00, + 0xb0, 0x13, 0xe7, 0x34, 0xe0, 0x44, 0x98, 0x05, + 0x23, 0x02, 0x40, 0x18, 0xd0, 0x3b, 0x98, 0x01, + 0x1d, 0xc4, 0x34, 0x01, 0x78, 0x60, 0x07, 0x00, + 0x0f, 0x00, 0x02, 0x00, 0x04, 0x07, 0x0c, 0x3f, + 0x78, 0xa0, 0x19, 0xc0, 0x30, 0x03, 0x04, 0x07, + 0x0c, 0x3f, 0x2f, 0x00, 0xdd, 0x28, 0x2f, 0xbc, + 0xdd, 0x17, 0x21, 0x00, 0x29, 0xbc, 0xdb, 0x04, + 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, + 0x32, 0x01, 0xe7, 0xf6, 0x1f, 0xf8, 0x38, 0xb5, + 0x04, 0x07, 0x0c, 0x3f, 0x98, 0x01, 0x68, 0x00, + 0x90, 0x01, 0x98, 0x01, 0x1d, 0xc4, 0x34, 0x01, + 0xe0, 0x0d, 0x21, 0x00, 0x42, 0xb9, 0xdb, 0x04, + 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, + 0x32, 0x01, 0xe7, 0xf6, 0x27, 0x00, 0xe7, 0xd4, + 0x20, 0x00, 0xb0, 0x13, 0xe6, 0xf3, 0x20, 0xb1, + 0xb0, 0x13, 0xe6, 0xf0, 0xb0, 0x13, 0xe6, 0xee, + 0xe6, 0xed, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xb5, 0xf3, 0xb0, 0x84, 0x98, 0x04, 0x78, 0x40, + 0x00, 0x80, 0x49, 0x4b, 0x58, 0x08, 0x90, 0x03, + 0x28, 0x00, 0xd1, 0x05, 0x20, 0xb0, 0xb0, 0x04, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x04, 0x68, 0x86, 0x98, 0x04, 0x88, 0x47, + 0x98, 0x04, 0x68, 0x44, 0x1d, 0xf0, 0x30, 0xb9, + 0x99, 0x04, 0x68, 0x49, 0x1a, 0x45, 0x42, 0xbd, + 0xdb, 0x0c, 0x2f, 0x00, 0xdb, 0x01, 0x2f, 0xbc, + 0xdd, 0x02, 0x20, 0xba, 0xb0, 0x04, 0xe7, 0xe7, + 0x1c, 0x3a, 0x99, 0x05, 0x1c, 0x20, 0xf0, 0x00, + 0xf9, 0x29, 0xe0, 0x6b, 0x20, 0x00, 0x90, 0x00, + 0x98, 0x04, 0x78, 0x40, 0x00, 0xc3, 0x1a, 0x18, + 0x00, 0x80, 0x49, 0x36, 0x68, 0x09, 0x18, 0x40, + 0x90, 0x01, 0x98, 0x01, 0x78, 0x80, 0x90, 0x02, + 0x98, 0x02, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, + 0x98, 0x02, 0x28, 0x12, 0xd1, 0x03, 0x2d, 0x0e, + 0xda, 0x01, 0x20, 0x01, 0x90, 0x00, 0x2f, 0x00, + 0xdd, 0x50, 0xb0, 0x81, 0x42, 0xaf, 0xdd, 0x0d, + 0x2d, 0x00, 0xdb, 0x01, 0x2d, 0xbc, 0xdd, 0x02, + 0x20, 0xba, 0xb0, 0x05, 0xe7, 0xbc, 0x1c, 0x2a, + 0x99, 0x06, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0xfe, + 0x68, 0x36, 0xe0, 0x0b, 0x2f, 0x00, 0xdb, 0x01, + 0x2f, 0xbc, 0xdd, 0x02, 0x20, 0xba, 0xb0, 0x05, + 0xe7, 0xae, 0x1c, 0x3a, 0x99, 0x06, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0xf0, 0x99, 0x06, 0x19, 0x49, + 0x91, 0x06, 0x1b, 0x7f, 0x1d, 0x31, 0x91, 0x00, + 0x99, 0x00, 0x78, 0x88, 0x19, 0x84, 0x98, 0x01, + 0x28, 0x00, 0xd0, 0x20, 0x99, 0x00, 0x78, 0xc8, + 0x23, 0x80, 0x40, 0x18, 0xd1, 0x1b, 0x1d, 0xf0, + 0x30, 0xb9, 0x1b, 0x05, 0x42, 0xbd, 0xdb, 0x01, + 0x3c, 0x01, 0xe0, 0x14, 0x1c, 0x68, 0x42, 0xb8, + 0xd1, 0x11, 0x99, 0x00, 0x78, 0x88, 0x28, 0x09, + 0xdd, 0x08, 0x99, 0x00, 0x79, 0x08, 0x30, 0x09, + 0x99, 0x00, 0x78, 0x89, 0x42, 0x88, 0xd0, 0x00, + 0x3c, 0x01, 0xe0, 0x04, 0x99, 0x00, 0x78, 0x88, + 0x28, 0x09, 0xd1, 0x00, 0x3c, 0x01, 0x20, 0x00, + 0x90, 0x01, 0x1d, 0xf0, 0x30, 0xb9, 0x1b, 0x05, + 0xb0, 0x01, 0xe7, 0xac, 0x20, 0x00, 0xb0, 0x04, + 0xe7, 0x72, 0xb0, 0x04, 0xe7, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x30, + 0xb5, 0xf1, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24, + 0xb0, 0x83, 0x00, 0xa0, 0x4b, 0x4c, 0x58, 0x1d, + 0x78, 0x28, 0x90, 0x02, 0x2c, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x4b, 0x46, + 0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0, + 0xb0, 0x03, 0xe7, 0xf3, 0x00, 0xe0, 0x1b, 0x00, + 0x00, 0x80, 0x4b, 0x42, 0x68, 0x1b, 0x18, 0xc7, + 0x78, 0xa8, 0x28, 0x00, 0xd0, 0x63, 0x20, 0x00, + 0x42, 0x80, 0xd0, 0x20, 0x21, 0x00, 0x29, 0x20, + 0xdb, 0x04, 0xe0, 0x1b, 0x1c, 0x48, 0x06, 0x01, + 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 0x4b, 0x3a, + 0x58, 0x18, 0x90, 0x01, 0x98, 0x01, 0x79, 0xc0, + 0x42, 0xa0, 0xd1, 0x0e, 0x20, 0x01, 0x40, 0x88, + 0x43, 0xc0, 0x4b, 0x36, 0x68, 0x1b, 0x40, 0x18, + 0x4b, 0x34, 0x60, 0x18, 0x23, 0x00, 0x00, 0x88, + 0x4e, 0x31, 0x50, 0x33, 0x23, 0xff, 0x48, 0x32, + 0x54, 0x43, 0xe7, 0xe3, 0xe0, 0x3f, 0x7e, 0x38, + 0x1c, 0x02, 0x28, 0xff, 0xd0, 0x10, 0x20, 0xff, + 0x4b, 0x2e, 0x54, 0x98, 0x23, 0x00, 0x00, 0x90, + 0x4e, 0x2d, 0x50, 0x33, 0x20, 0x01, 0x40, 0x90, + 0x43, 0xc0, 0x4b, 0x2c, 0x88, 0x1b, 0x40, 0x18, + 0x4b, 0x2a, 0x80, 0x18, 0x20, 0xff, 0x76, 0x38, + 0x7e, 0x78, 0x1c, 0x02, 0x28, 0xff, 0xd0, 0x11, + 0x20, 0xff, 0x4b, 0x24, 0x54, 0x98, 0x23, 0x00, + 0x00, 0x90, 0x4e, 0x23, 0x50, 0x33, 0x20, 0x01, + 0x40, 0x90, 0x43, 0xc0, 0x4b, 0x21, 0x88, 0x1b, + 0x40, 0x18, 0x4b, 0x20, 0x80, 0x18, 0x20, 0xff, + 0x76, 0x78, 0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x03, + 0xe7, 0x98, 0x23, 0x00, 0x00, 0x90, 0x4e, 0x1a, + 0x50, 0x33, 0x20, 0x01, 0x40, 0x90, 0x43, 0xc0, + 0x4b, 0x18, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x17, + 0x80, 0x18, 0x4e, 0x17, 0x96, 0x00, 0x20, 0x00, + 0x00, 0x93, 0x9e, 0x00, 0x50, 0xf0, 0x98, 0x02, + 0x23, 0x20, 0x40, 0x18, 0xd0, 0xff, 0x21, 0x00, + 0x29, 0x0c, 0xdb, 0x04, 0xe0, 0x07, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x00, + 0x18, 0x7b, 0x73, 0x18, 0xe7, 0xf7, 0x20, 0x00, + 0x83, 0x38, 0x20, 0x00, 0x70, 0xf8, 0x20, 0x00, + 0xb0, 0x03, 0xe7, 0x6f, 0xb0, 0x03, 0xe7, 0x6d, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x30, + 0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x9c, 0x48, + 0x2e, 0x08, 0x9d, 0x10, 0x2e, 0x08, 0x9d, 0x30, + 0x2e, 0x08, 0x9c, 0xd0, 0x2e, 0x08, 0x9c, 0x4c, + 0x9e, 0x00, 0x04, 0xb8, 0xb5, 0xf0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x20, 0x1d, 0x02, 0x80, + 0x69, 0x86, 0x1c, 0x3a, 0x1c, 0x29, 0x1c, 0x20, + 0xf0, 0x08, 0xfb, 0x32, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb4, 0xf0, 0x1c, 0x01, 0xb0, 0x82, + 0x68, 0x48, 0x68, 0x8c, 0x1d, 0xe2, 0x32, 0xb7, + 0x42, 0x82, 0xd9, 0x09, 0x78, 0x42, 0x07, 0x12, + 0x0f, 0x12, 0x02, 0x12, 0x78, 0x83, 0x43, 0x1a, + 0x32, 0x03, 0x04, 0x17, 0x0c, 0x3f, 0xe0, 0x41, + 0xb0, 0x82, 0x68, 0x23, 0x93, 0x01, 0x9b, 0x01, + 0x33, 0x04, 0x93, 0x00, 0x9b, 0x00, 0x78, 0x9b, + 0x9e, 0x01, 0x19, 0x9a, 0x78, 0x4e, 0x00, 0xf3, + 0x1b, 0x9b, 0x00, 0x9b, 0x4e, 0x1b, 0x68, 0x36, + 0x19, 0x9b, 0x93, 0x02, 0x9b, 0x02, 0x78, 0x9d, + 0x06, 0xed, 0x0e, 0xed, 0x2d, 0x12, 0xd1, 0x0f, + 0x1d, 0xe3, 0x33, 0xb9, 0x68, 0x4e, 0x1b, 0x9b, + 0x06, 0x1b, 0x0e, 0x1b, 0x93, 0x03, 0x9b, 0x00, + 0x78, 0xde, 0x23, 0x80, 0x40, 0x33, 0xd1, 0x03, + 0x9b, 0x03, 0x2b, 0x0e, 0xda, 0x00, 0x3a, 0x01, + 0x1d, 0xe3, 0x33, 0xb8, 0x42, 0x83, 0xd9, 0x0b, + 0x78, 0x43, 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, + 0x04, 0x1f, 0x0c, 0x3f, 0x78, 0x13, 0x18, 0xfb, + 0x33, 0x03, 0x04, 0x1f, 0x0c, 0x3f, 0xe0, 0x08, + 0x78, 0x13, 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, + 0x78, 0x56, 0x43, 0x33, 0x33, 0x03, 0x04, 0x1f, + 0x0c, 0x3f, 0xb0, 0x02, 0x80, 0x4f, 0xb0, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x9b, 0x30, + 0xb5, 0xf3, 0xb0, 0x81, 0x99, 0x02, 0x06, 0x0b, + 0x0e, 0x1b, 0x93, 0x00, 0x9b, 0x00, 0x2b, 0x00, + 0xd1, 0x0a, 0x49, 0x24, 0x4b, 0x24, 0x69, 0x1b, + 0x1c, 0x18, 0x4b, 0x23, 0x69, 0x5b, 0x1c, 0x1c, + 0x4b, 0x21, 0x6a, 0x1b, 0x1e, 0x5a, 0xe0, 0x09, + 0x49, 0x20, 0x4b, 0x1f, 0x69, 0x9b, 0x1c, 0x18, + 0x4b, 0x1d, 0x69, 0xdb, 0x1c, 0x1c, 0x4b, 0x1c, + 0x6a, 0x5b, 0x1e, 0x5a, 0x9b, 0x01, 0x78, 0xdd, + 0x26, 0x01, 0x40, 0xae, 0x1c, 0x37, 0x42, 0xa0, + 0xd0, 0x26, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x40, 0x3b, + 0xd0, 0x1b, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x43, 0xbb, + 0x1c, 0x1d, 0x00, 0x83, 0x18, 0x5e, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xf3, 0x60, 0x1d, 0x00, 0x83, + 0x18, 0x5d, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xeb, + 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x05, 0x25, 0x00, + 0x18, 0x0e, 0x23, 0x01, 0x02, 0xdb, 0x18, 0xf3, + 0x70, 0x1d, 0x30, 0x01, 0x40, 0x10, 0xe7, 0xd6, + 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x9d, 0xfc, + 0x9e, 0x00, 0x04, 0x80, 0x2e, 0x08, 0xa6, 0xfc, + 0xb4, 0x90, 0x1c, 0x03, 0x1c, 0x0c, 0x1c, 0x17, + 0x06, 0x21, 0x0e, 0x09, 0x06, 0x38, 0x0e, 0x00, + 0x72, 0x19, 0x28, 0x00, 0xd0, 0x00, 0x75, 0x58, + 0x68, 0x5b, 0x2b, 0x00, 0xd1, 0xf8, 0xbc, 0x90, + 0x47, 0x70, 0x00, 0x00, 0xb5, 0x80, 0x1c, 0x07, + 0x68, 0xf8, 0x28, 0x1f, 0xd9, 0x03, 0x20, 0xe1, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x1e, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x1d, 0x40, 0x18, + 0x49, 0x1b, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x80, + 0x48, 0x19, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x18, + 0x6e, 0xc9, 0x60, 0x08, 0x48, 0x16, 0x6d, 0x00, + 0x68, 0x00, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, + 0x49, 0x13, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x80, + 0x48, 0x11, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x10, + 0x6e, 0xc9, 0x60, 0x08, 0x48, 0x0e, 0x6f, 0xc1, + 0xcf, 0x09, 0xc1, 0x09, 0xcf, 0x09, 0xc1, 0x09, + 0xcf, 0x08, 0xc1, 0x08, 0xf0, 0x00, 0xfc, 0x1e, + 0x20, 0x00, 0x49, 0x09, 0x60, 0x08, 0x20, 0x00, + 0x49, 0x07, 0x60, 0x48, 0x20, 0x00, 0x49, 0x06, + 0x60, 0x88, 0x49, 0x07, 0x20, 0x0b, 0xf0, 0x0d, + 0xfd, 0xef, 0x20, 0xff, 0x30, 0x01, 0x49, 0x02, + 0x61, 0xc8, 0x20, 0x00, 0xe7, 0xc0, 0xe7, 0xbf, + 0x2e, 0x08, 0x1f, 0x9c, 0xff, 0xff, 0xfd, 0xff, + 0x2e, 0x01, 0x5f, 0x15, 0x1c, 0x01, 0x48, 0x0e, + 0x6f, 0x00, 0x68, 0x00, 0x60, 0x08, 0x48, 0x0c, + 0x6e, 0x80, 0x68, 0x00, 0x60, 0x48, 0x48, 0x0a, + 0x6e, 0xc0, 0x68, 0x00, 0x60, 0x88, 0x48, 0x08, + 0x6f, 0x40, 0x68, 0x00, 0x60, 0xc8, 0x48, 0x06, + 0x68, 0x00, 0x61, 0x08, 0x48, 0x04, 0x68, 0x40, + 0x61, 0x48, 0x48, 0x03, 0x68, 0x80, 0x61, 0x88, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, + 0x2e, 0x08, 0x1f, 0x9c, 0x48, 0x03, 0x6e, 0x80, + 0x68, 0x00, 0x07, 0x40, 0x0f, 0xc0, 0x47, 0x70, + 0xe7, 0xfd, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x9c, + 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x48, 0x37, + 0x69, 0xc0, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, + 0xd0, 0x02, 0x20, 0xe0, 0xbc, 0x80, 0x47, 0x70, + 0x48, 0x32, 0x62, 0x07, 0x20, 0x00, 0x49, 0x31, + 0x62, 0x48, 0x48, 0x31, 0x60, 0x02, 0x48, 0x30, + 0x68, 0x00, 0x78, 0x00, 0x49, 0x2d, 0x61, 0x88, + 0x48, 0x2d, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x2b, + 0x61, 0x08, 0x48, 0x2b, 0x68, 0x00, 0x68, 0x40, + 0x49, 0x28, 0x60, 0xc8, 0x48, 0x27, 0x69, 0x80, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x27, + 0xe0, 0x01, 0x20, 0x01, 0x02, 0x40, 0x49, 0x23, + 0x61, 0xc8, 0x48, 0x22, 0x68, 0x40, 0x30, 0x01, + 0x49, 0x20, 0x60, 0x48, 0x48, 0x1f, 0x6d, 0x40, + 0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0x1d, + 0x69, 0x89, 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, + 0x43, 0x08, 0x49, 0x1a, 0x6d, 0x49, 0x60, 0x08, + 0x06, 0x00, 0x48, 0x18, 0x6d, 0x00, 0x68, 0x00, + 0x4b, 0x19, 0x40, 0x18, 0x49, 0x15, 0x69, 0x89, + 0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x49, 0x13, + 0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, 0x48, 0x11, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x13, 0x40, 0x18, + 0x49, 0x0e, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x40, + 0x48, 0x0c, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, + 0x03, 0x1b, 0x43, 0x18, 0x49, 0x09, 0x6d, 0x09, + 0x60, 0x08, 0x04, 0xc0, 0x48, 0x07, 0x6d, 0x40, + 0x68, 0x00, 0x49, 0x06, 0x6f, 0x09, 0x60, 0x08, + 0x48, 0x04, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x03, + 0x6e, 0xc9, 0x60, 0x08, 0x20, 0x00, 0xe7, 0x99, + 0xe7, 0x98, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x9c, + 0x2e, 0x08, 0x9d, 0xc0, 0x00, 0x00, 0x02, 0x01, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xb5, 0x00, 0x48, 0xf6, 0x6e, 0x80, 0x68, 0x00, + 0x23, 0x08, 0x40, 0x18, 0xd0, 0x74, 0x48, 0xf3, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xf2, 0x40, 0x18, + 0x49, 0xf0, 0x6d, 0x09, 0x60, 0x08, 0x04, 0x80, + 0x48, 0xee, 0x6e, 0x40, 0x68, 0x00, 0x0a, 0x00, + 0x02, 0x00, 0x49, 0xec, 0x6e, 0x49, 0x60, 0x08, + 0x06, 0x00, 0x48, 0xea, 0x6e, 0xc0, 0x68, 0x00, + 0x23, 0x01, 0x02, 0xdb, 0x40, 0x18, 0xd0, 0x3e, + 0x20, 0xff, 0x30, 0x01, 0x49, 0xe5, 0x61, 0xc8, + 0x48, 0xe4, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xe5, + 0x40, 0x18, 0x49, 0xe2, 0x6d, 0x09, 0x60, 0x08, + 0x04, 0xc0, 0x48, 0xe0, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0xdd, + 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, + 0x48, 0xdd, 0x68, 0x00, 0x7a, 0x00, 0x49, 0xd9, + 0x69, 0x09, 0x1a, 0x41, 0x48, 0xd7, 0x6f, 0xc0, + 0x68, 0x80, 0x68, 0x02, 0x4b, 0xd9, 0x40, 0x1a, + 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, + 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0xd1, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x04, + 0x43, 0x19, 0x60, 0x01, 0x07, 0x48, 0x48, 0xcd, + 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, + 0xf0, 0x0d, 0xfc, 0xd0, 0x48, 0xc9, 0x68, 0x00, + 0x30, 0x01, 0x49, 0xc8, 0x60, 0x08, 0x48, 0xc7, + 0x69, 0xc0, 0x4b, 0xcb, 0x42, 0x98, 0xd0, 0x73, + 0xdc, 0x08, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, + 0xd0, 0x6f, 0x23, 0x01, 0x02, 0x5b, 0x42, 0x98, + 0xd0, 0x07, 0xe2, 0xba, 0x4b, 0xc5, 0x42, 0x98, + 0xd0, 0x68, 0x4b, 0xc5, 0x42, 0x98, 0xd0, 0x66, + 0xe2, 0xb3, 0x48, 0xbc, 0x6e, 0x80, 0x68, 0x00, + 0x23, 0x01, 0x02, 0x5b, 0x40, 0x18, 0xe0, 0x00, + 0xe2, 0xcd, 0xd0, 0x3f, 0x48, 0xb7, 0x68, 0x00, + 0x30, 0x01, 0x49, 0xb6, 0x60, 0x08, 0x48, 0xb5, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xb5, 0x40, 0x18, + 0x49, 0xb2, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, + 0x20, 0xff, 0x30, 0x01, 0x49, 0xaf, 0x61, 0xc8, + 0x48, 0xae, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, + 0x02, 0x09, 0x0a, 0x09, 0x4a, 0xab, 0x6a, 0x52, + 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 0x48, 0xac, + 0x68, 0x00, 0x7a, 0x00, 0x49, 0xa7, 0x69, 0x09, + 0x1a, 0x41, 0x48, 0xa6, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x02, 0x4b, 0xa8, 0x40, 0x1a, 0x04, 0x09, + 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, + 0x02, 0x08, 0x0c, 0x00, 0x48, 0x9f, 0x6f, 0xc0, + 0x68, 0x80, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, + 0x60, 0x01, 0x07, 0x88, 0x48, 0x9b, 0x6f, 0xc0, + 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0d, + 0xfc, 0x6d, 0xe0, 0x5e, 0x48, 0x97, 0x69, 0x00, + 0x28, 0x00, 0xd0, 0x20, 0x48, 0x95, 0x69, 0x00, + 0x38, 0x01, 0x49, 0x94, 0x61, 0x08, 0x48, 0x93, + 0x68, 0xc0, 0x78, 0x00, 0x49, 0x91, 0x6c, 0x89, + 0x68, 0x09, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x08, + 0x49, 0x8e, 0x6c, 0x89, 0x60, 0x08, 0x06, 0x00, + 0x0e, 0x00, 0x48, 0x8c, 0x68, 0xc0, 0xe0, 0x03, + 0xe1, 0x4b, 0xe2, 0x4d, 0xe0, 0x42, 0xe1, 0x93, + 0x30, 0x01, 0x49, 0x88, 0x60, 0xc8, 0x48, 0x8d, + 0x49, 0x86, 0x61, 0xc8, 0xe0, 0x39, 0x20, 0xff, + 0x30, 0x01, 0x49, 0x84, 0x61, 0xc8, 0x48, 0x83, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, + 0x0a, 0x09, 0x4a, 0x80, 0x6a, 0x52, 0x06, 0x12, + 0x43, 0x11, 0x60, 0x01, 0x48, 0x80, 0x68, 0x00, + 0x7a, 0x00, 0x49, 0x7c, 0x69, 0x09, 0x1a, 0x41, + 0x48, 0x7a, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, + 0x4b, 0x7c, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, + 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, + 0x0c, 0x00, 0x48, 0x74, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, + 0x07, 0xc8, 0x48, 0x70, 0x6f, 0xc0, 0x68, 0xc1, + 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0d, 0xfc, 0x16, + 0x48, 0x6c, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x6d, + 0x40, 0x18, 0x49, 0x6a, 0x6d, 0x09, 0x60, 0x08, + 0x04, 0xc0, 0xe2, 0x08, 0x48, 0x67, 0x69, 0x00, + 0x28, 0x00, 0xd0, 0x5f, 0x48, 0x65, 0x6e, 0x80, + 0x68, 0x00, 0x23, 0xff, 0x33, 0x01, 0x40, 0x18, + 0xd0, 0x3f, 0x48, 0x62, 0x68, 0x00, 0x30, 0x01, + 0x49, 0x60, 0x60, 0x08, 0x48, 0x5f, 0x6d, 0x00, + 0x68, 0x00, 0x4b, 0x60, 0x40, 0x18, 0x49, 0x5d, + 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 0x20, 0xff, + 0x30, 0x01, 0x49, 0x5a, 0x61, 0xc8, 0x48, 0x59, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, + 0x0a, 0x09, 0x4a, 0x56, 0x6a, 0x52, 0x06, 0x12, + 0x43, 0x11, 0x60, 0x01, 0x48, 0x56, 0x68, 0x00, + 0x7a, 0x00, 0x49, 0x52, 0x69, 0x09, 0x1a, 0x41, + 0x48, 0x50, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, + 0x4b, 0x52, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, + 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, + 0x0c, 0x00, 0x48, 0x4a, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, + 0x07, 0x88, 0x48, 0x46, 0x6f, 0xc0, 0x68, 0xc1, + 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0d, 0xfb, 0xc2, + 0xe0, 0x17, 0x48, 0x42, 0x68, 0xc0, 0x78, 0x00, + 0x49, 0x40, 0x6c, 0x89, 0x68, 0x09, 0x0a, 0x09, + 0x02, 0x09, 0x43, 0x08, 0x49, 0x3d, 0x6c, 0x89, + 0x60, 0x08, 0x06, 0x00, 0x0e, 0x00, 0x48, 0x3b, + 0x68, 0xc0, 0x30, 0x01, 0x49, 0x39, 0x60, 0xc8, + 0x48, 0x38, 0x69, 0x00, 0x38, 0x01, 0x49, 0x37, + 0x61, 0x08, 0xe0, 0xa1, 0x48, 0x35, 0x6a, 0x00, + 0x38, 0x01, 0x49, 0x34, 0x62, 0x08, 0x48, 0x33, + 0x6a, 0x00, 0x28, 0x00, 0xd0, 0x4b, 0x48, 0x31, + 0x6a, 0x40, 0x30, 0x01, 0x49, 0x2f, 0x62, 0x48, + 0x48, 0x31, 0x68, 0x00, 0x30, 0x0c, 0x49, 0x30, + 0x60, 0x08, 0x48, 0x2f, 0x68, 0x00, 0x78, 0x00, + 0x49, 0x2a, 0x61, 0x88, 0x48, 0x2c, 0x68, 0x00, + 0x7a, 0x00, 0x49, 0x28, 0x61, 0x08, 0x48, 0x2a, + 0x68, 0x00, 0x68, 0x40, 0x49, 0x25, 0x60, 0xc8, + 0x48, 0x24, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, + 0xd0, 0x01, 0x48, 0x27, 0xe0, 0x01, 0x20, 0x01, + 0x02, 0x40, 0x49, 0x20, 0x61, 0xc8, 0x48, 0x1f, + 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, + 0x43, 0x18, 0x49, 0x1c, 0x6d, 0x09, 0x60, 0x08, + 0x04, 0x80, 0x48, 0x1a, 0x6d, 0x40, 0x68, 0x00, + 0x0a, 0x00, 0x02, 0x00, 0x49, 0x17, 0x69, 0x89, + 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, 0x43, 0x08, + 0x49, 0x14, 0x6d, 0x49, 0x60, 0x08, 0x06, 0x00, + 0x48, 0x12, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x19, + 0x40, 0x18, 0x49, 0x10, 0x69, 0x89, 0x07, 0xc9, + 0x0c, 0x49, 0x43, 0x08, 0x49, 0x0d, 0x6d, 0x09, + 0x60, 0x08, 0x04, 0x40, 0xe0, 0x4c, 0x20, 0xff, + 0x30, 0x01, 0x49, 0x0a, 0x61, 0xc8, 0x48, 0x09, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, + 0x0a, 0x09, 0x4a, 0x06, 0x6a, 0x52, 0x06, 0x12, + 0x43, 0x11, 0x60, 0x01, 0x48, 0x06, 0x68, 0x00, + 0x7a, 0x00, 0x49, 0x02, 0x69, 0x09, 0x1a, 0x41, + 0x48, 0x00, 0xe0, 0x11, 0x2e, 0x08, 0x1f, 0x9c, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xef, 0xff, + 0x2e, 0x08, 0x9d, 0xc0, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x02, 0x02, + 0x00, 0x00, 0x02, 0x03, 0xff, 0xff, 0xbf, 0xff, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 0x4b, 0xa5, + 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, + 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, + 0x48, 0xa1, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, + 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x07, 0xc8, + 0x48, 0x9d, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x0d, 0xfb, 0x0f, 0x48, 0x9a, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x99, 0x40, 0x18, + 0x49, 0x97, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, + 0xe1, 0x01, 0x48, 0x95, 0x6e, 0x80, 0x68, 0x00, + 0x23, 0x01, 0x02, 0x5b, 0x40, 0x18, 0xd0, 0x3f, + 0x48, 0x91, 0x68, 0x00, 0x30, 0x01, 0x49, 0x90, + 0x60, 0x08, 0x48, 0x8f, 0x6d, 0x00, 0x68, 0x00, + 0x4b, 0x8e, 0x40, 0x18, 0x49, 0x8c, 0x6d, 0x09, + 0x60, 0x08, 0x04, 0xc0, 0x20, 0xff, 0x30, 0x01, + 0x49, 0x89, 0x61, 0xc8, 0x48, 0x88, 0x6f, 0xc0, + 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, + 0x4a, 0x85, 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, + 0x60, 0x01, 0x48, 0x85, 0x68, 0x00, 0x7a, 0x00, + 0x49, 0x81, 0x69, 0x09, 0x1a, 0x41, 0x48, 0x80, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 0x4b, 0x7d, + 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, + 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, + 0x48, 0x79, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, + 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, 0x07, 0x88, + 0x48, 0x75, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x0d, 0xfa, 0xbf, 0xe0, 0x02, + 0x48, 0x74, 0x49, 0x71, 0x61, 0xc8, 0xe0, 0xb6, + 0x48, 0x6f, 0x69, 0x00, 0x28, 0x00, 0xd0, 0x62, + 0x48, 0x6d, 0x6e, 0x00, 0x68, 0x00, 0x49, 0x6c, + 0x68, 0xc9, 0x70, 0x08, 0x48, 0x6a, 0x68, 0xc0, + 0x30, 0x01, 0x49, 0x69, 0x60, 0xc8, 0x48, 0x68, + 0x69, 0x00, 0x38, 0x01, 0x49, 0x66, 0x61, 0x08, + 0x48, 0x65, 0x69, 0x00, 0x28, 0x00, 0xd1, 0x4d, + 0x48, 0x63, 0x6a, 0x00, 0x28, 0x01, 0xd1, 0x49, + 0x48, 0x63, 0x68, 0x00, 0x7a, 0x40, 0x49, 0x60, + 0x6d, 0x09, 0x68, 0x09, 0x4b, 0x62, 0x40, 0x19, + 0x07, 0xc0, 0x0d, 0x40, 0x43, 0x08, 0x49, 0x5c, + 0x6d, 0x09, 0x60, 0x08, 0x05, 0x40, 0x0f, 0xc0, + 0x20, 0xff, 0x30, 0x01, 0x49, 0x58, 0x61, 0xc8, + 0x48, 0x57, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x57, + 0x40, 0x18, 0x49, 0x55, 0x6d, 0x09, 0x60, 0x08, + 0x04, 0xc0, 0x48, 0x53, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0x50, + 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, + 0x48, 0x4f, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x4c, + 0x69, 0x09, 0x1a, 0x41, 0x48, 0x4a, 0x6f, 0xc0, + 0x68, 0x80, 0x68, 0x02, 0x4b, 0x47, 0x40, 0x1a, + 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, + 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0x44, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x01, + 0x43, 0x19, 0x60, 0x01, 0x07, 0xc8, 0x48, 0x40, + 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, + 0xf0, 0x0d, 0xfa, 0x54, 0xe0, 0x4f, 0x48, 0x3c, + 0x6a, 0x00, 0x38, 0x01, 0x49, 0x3a, 0x62, 0x08, + 0x48, 0x39, 0x6a, 0x40, 0x30, 0x01, 0x49, 0x38, + 0x62, 0x48, 0x48, 0x39, 0x68, 0x00, 0x30, 0x0c, + 0x49, 0x37, 0x60, 0x08, 0x48, 0x36, 0x68, 0x00, + 0x78, 0x00, 0x49, 0x33, 0x61, 0x88, 0x48, 0x34, + 0x68, 0x00, 0x7a, 0x00, 0x49, 0x30, 0x61, 0x08, + 0x48, 0x31, 0x68, 0x00, 0x68, 0x40, 0x49, 0x2e, + 0x60, 0xc8, 0x48, 0x2d, 0x69, 0x80, 0x07, 0xc0, + 0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x2f, 0xe0, 0x01, + 0x20, 0x01, 0x02, 0x40, 0x49, 0x28, 0x61, 0xc8, + 0x48, 0x27, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, + 0x03, 0x5b, 0x43, 0x18, 0x49, 0x24, 0x6d, 0x09, + 0x60, 0x08, 0x04, 0x80, 0x48, 0x22, 0x6d, 0x40, + 0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0x20, + 0x69, 0x89, 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, + 0x43, 0x08, 0x49, 0x1d, 0x6d, 0x49, 0x60, 0x08, + 0x06, 0x00, 0x48, 0x1b, 0x6d, 0x00, 0x68, 0x00, + 0x4b, 0x1f, 0x40, 0x18, 0x49, 0x18, 0x69, 0x89, + 0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x49, 0x16, + 0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, 0xe0, 0x01, + 0xe0, 0x00, 0xe7, 0xff, 0x48, 0x12, 0x6c, 0x80, + 0x68, 0x00, 0x49, 0x11, 0x6e, 0x49, 0x60, 0x08, + 0x48, 0x0f, 0x6d, 0x40, 0x68, 0x00, 0x49, 0x0e, + 0x6f, 0x09, 0x60, 0x08, 0x48, 0x0c, 0x6d, 0x00, + 0x68, 0x00, 0x49, 0x0b, 0x6e, 0xc9, 0x60, 0x08, + 0x48, 0x09, 0x6c, 0xc0, 0x68, 0x00, 0x23, 0x08, + 0x43, 0x18, 0x49, 0x07, 0x6c, 0xc9, 0x60, 0x08, + 0x07, 0x00, 0x48, 0x05, 0x6c, 0xc0, 0x68, 0x00, + 0x49, 0x03, 0x6e, 0x89, 0x60, 0x08, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, + 0x2e, 0x08, 0x1f, 0x9c, 0xff, 0xff, 0xef, 0xff, + 0x2e, 0x08, 0x9d, 0xc0, 0x00, 0x00, 0x02, 0x03, + 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x02, 0x01, + 0xff, 0xff, 0xbf, 0xff, 0xb4, 0x80, 0x49, 0x2e, + 0x20, 0x00, 0x28, 0x08, 0xd3, 0x04, 0xe0, 0x06, + 0x1c, 0x42, 0x06, 0x10, 0x0e, 0x00, 0xe7, 0xf8, + 0x23, 0x00, 0xc1, 0x08, 0xe7, 0xf8, 0x4a, 0x29, + 0x6f, 0xd2, 0x68, 0x12, 0x4b, 0x27, 0x6d, 0x9b, + 0x68, 0x1b, 0x0a, 0x1b, 0x02, 0x1b, 0x06, 0x12, + 0x0e, 0x12, 0x43, 0x1a, 0x4b, 0x23, 0x6d, 0x9b, + 0x60, 0x1a, 0x06, 0x12, 0x0e, 0x12, 0x4a, 0x21, + 0x6f, 0xd2, 0x68, 0x52, 0x4b, 0x1f, 0x6d, 0x1b, + 0x68, 0x1f, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x9f, + 0x1c, 0x3b, 0x07, 0xd2, 0x0c, 0x12, 0x43, 0x1a, + 0x4b, 0x1a, 0x6d, 0x1b, 0x60, 0x1a, 0x04, 0x12, + 0x0f, 0xd2, 0x4a, 0x18, 0x6f, 0xd2, 0x69, 0x12, + 0x4b, 0x16, 0x6d, 0xdb, 0x68, 0x1b, 0x0c, 0x1b, + 0x04, 0x1b, 0x04, 0x12, 0x0c, 0x12, 0x43, 0x1a, + 0x4b, 0x12, 0x6d, 0xdb, 0x60, 0x1a, 0x04, 0x12, + 0x0c, 0x12, 0x4a, 0x10, 0x6d, 0x12, 0x68, 0x12, + 0x23, 0x01, 0x02, 0x5b, 0x43, 0x1a, 0x4b, 0x0d, + 0x6d, 0x1b, 0x60, 0x1a, 0x05, 0x92, 0x4a, 0x0b, + 0x6d, 0x12, 0x68, 0x12, 0x4b, 0x09, 0x6e, 0xdb, + 0x60, 0x1a, 0x4a, 0x08, 0x6d, 0x92, 0x68, 0x12, + 0x4b, 0x06, 0x6f, 0x5b, 0x60, 0x1a, 0x4a, 0x05, + 0x6d, 0xd2, 0x68, 0x12, 0x4b, 0x03, 0x6f, 0x9b, + 0x60, 0x1a, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x1f, 0xc4, 0x2e, 0x08, 0x1f, 0x9c, + 0xb5, 0x90, 0x1c, 0x07, 0x1c, 0x0c, 0x2f, 0x22, + 0xd1, 0x07, 0x2c, 0x3f, 0xd8, 0x01, 0x2c, 0x01, + 0xd2, 0x03, 0x20, 0x38, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x01, 0x49, 0x13, 0x70, 0x08, + 0x23, 0x01, 0x03, 0xdb, 0x42, 0x9f, 0xd0, 0x02, + 0x4b, 0x11, 0x42, 0x9f, 0xd1, 0x04, 0x48, 0x11, + 0x60, 0x07, 0x20, 0x00, 0xe7, 0xee, 0xe0, 0x18, + 0x2f, 0xff, 0xd1, 0x0b, 0x21, 0x00, 0x43, 0xc9, + 0x20, 0x0d, 0xf0, 0x00, 0xf8, 0x1d, 0x48, 0x0c, + 0x68, 0x01, 0x48, 0x0c, 0x68, 0x00, 0xf0, 0x00, + 0xf8, 0x43, 0xe0, 0x07, 0x1c, 0x21, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x3e, 0x48, 0x07, 0x60, 0x07, + 0x48, 0x05, 0x60, 0x04, 0x20, 0x00, 0xe7, 0xd5, + 0xe7, 0xd4, 0xe7, 0xd3, 0x2e, 0x08, 0x9d, 0xe8, + 0x00, 0x00, 0x80, 0x0f, 0xcc, 0x00, 0x05, 0x00, + 0x2e, 0x08, 0x9d, 0xe4, 0x2e, 0x08, 0x20, 0x1c, + 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0x4b, 0x13, + 0x68, 0x5b, 0x1c, 0x18, 0x21, 0x00, 0x29, 0x02, + 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x4b, 0x06, 0x19, + 0x0e, 0x09, 0xe7, 0xf8, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc4, 0x29, 0x00, 0xd1, 0x01, 0x60, 0x27, + 0xe0, 0x05, 0x23, 0x01, 0x42, 0xda, 0xd0, 0x01, + 0x60, 0x22, 0xe0, 0x00, 0xe0, 0x09, 0x1d, 0x05, + 0x23, 0x05, 0x02, 0x1b, 0x42, 0x9d, 0xdb, 0x02, + 0x20, 0x01, 0x02, 0x80, 0xe0, 0x00, 0x30, 0x04, + 0xe7, 0xe4, 0x4b, 0x02, 0x60, 0x58, 0xbc, 0xb0, + 0x47, 0x70, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x00, + 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x05, 0x20, + 0x0d, 0x00, 0x23, 0xff, 0x33, 0x04, 0x42, 0x98, + 0xd0, 0x50, 0xdc, 0x18, 0x28, 0x10, 0xd0, 0x2d, + 0xdc, 0x08, 0x28, 0x01, 0xd0, 0x23, 0x28, 0x02, + 0xd0, 0x1e, 0x28, 0x04, 0xd0, 0x1f, 0x28, 0x08, + 0xd0, 0x1d, 0xe0, 0x76, 0x28, 0x12, 0xd0, 0x1d, + 0x28, 0x22, 0xd0, 0x3a, 0x23, 0xff, 0x33, 0x02, + 0x42, 0x98, 0xd0, 0x24, 0x23, 0xff, 0x33, 0x03, + 0x42, 0x98, 0xd0, 0x29, 0xe0, 0x69, 0x38, 0xff, + 0x38, 0x05, 0x28, 0x08, 0xd2, 0x65, 0xa3, 0x02, + 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x35, 0x3c, 0x41, 0x4f, 0x56, 0x4b, 0x5d, 0x46, + 0x20, 0x00, 0x49, 0x32, 0x63, 0x48, 0x48, 0x31, + 0x62, 0x04, 0xe0, 0x5c, 0x20, 0x01, 0x49, 0x2f, + 0x63, 0x48, 0xe0, 0x58, 0x20, 0x00, 0x49, 0x2e, + 0x67, 0x08, 0x21, 0x00, 0x43, 0xc9, 0x20, 0x10, + 0xf7, 0xff, 0xff, 0x92, 0xe0, 0x4f, 0x20, 0x01, + 0x49, 0x29, 0x67, 0x08, 0x21, 0x00, 0x43, 0xc9, + 0x20, 0x10, 0xf7, 0xff, 0xff, 0x89, 0xe0, 0x46, + 0x20, 0x02, 0x49, 0x25, 0x67, 0x08, 0x21, 0x00, + 0x43, 0xc9, 0x20, 0x10, 0xf7, 0xff, 0xff, 0x80, + 0xe0, 0x3d, 0x1c, 0x39, 0x20, 0x22, 0xf7, 0xff, + 0xff, 0x7b, 0xe0, 0x38, 0x48, 0x1e, 0x65, 0xc7, + 0x21, 0x01, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x74, + 0xe0, 0x31, 0x48, 0x1b, 0x65, 0xc7, 0x21, 0x02, + 0x20, 0x35, 0xf7, 0xff, 0xff, 0x6d, 0xe0, 0x2a, + 0x21, 0x00, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x68, + 0xe0, 0x25, 0x21, 0x03, 0x20, 0x35, 0xf7, 0xff, + 0xff, 0x63, 0xe0, 0x20, 0x21, 0x04, 0x20, 0x35, + 0xf7, 0xff, 0xff, 0x5e, 0xe0, 0x1b, 0x20, 0x00, + 0x49, 0x0f, 0x65, 0xc8, 0xe0, 0x17, 0x48, 0x0e, + 0x66, 0x07, 0x21, 0x01, 0x20, 0x36, 0xf7, 0xff, + 0xff, 0x53, 0xe0, 0x10, 0x48, 0x0a, 0x66, 0x07, + 0x21, 0x02, 0x20, 0x36, 0xf7, 0xff, 0xff, 0x4c, + 0xe0, 0x09, 0x20, 0x00, 0x49, 0x06, 0x66, 0x08, + 0xe0, 0x05, 0x1c, 0x20, 0x21, 0x00, 0x43, 0xc9, + 0xf7, 0xff, 0xff, 0x42, 0xe7, 0xff, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0f, 0x80, + 0xcc, 0x00, 0x05, 0x00, 0xb4, 0xb0, 0x1c, 0x04, + 0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x38, 0x0e, 0x00, + 0x06, 0x19, 0x0e, 0x09, 0x29, 0x01, 0xd0, 0x08, + 0x22, 0x00, 0x4d, 0x09, 0x60, 0x2a, 0x22, 0x00, + 0x43, 0xd2, 0x4d, 0x08, 0x68, 0x2d, 0x60, 0x2a, + 0xe0, 0x08, 0x4a, 0x07, 0x68, 0x12, 0x60, 0x14, + 0x4a, 0x04, 0x68, 0x12, 0x60, 0x10, 0x22, 0x01, + 0x4d, 0x01, 0x60, 0x2a, 0xbc, 0xb0, 0x47, 0x70, + 0xcc, 0x00, 0x0d, 0x00, 0x2e, 0x08, 0x9d, 0xdc, + 0x2e, 0x08, 0x9d, 0xd8, 0xb5, 0xf3, 0xb0, 0x81, + 0x99, 0x02, 0x06, 0x08, 0x16, 0x00, 0x90, 0x00, + 0xb0, 0x85, 0x20, 0x00, 0x90, 0x01, 0x9c, 0x06, + 0x1d, 0xe6, 0x36, 0x05, 0xcc, 0x20, 0x07, 0xa8, + 0x0f, 0x80, 0x06, 0x00, 0x16, 0x00, 0x90, 0x00, + 0x08, 0xad, 0x3d, 0x03, 0xcc, 0x80, 0x08, 0xb8, + 0x00, 0x80, 0x19, 0x86, 0xcc, 0x02, 0x91, 0x04, + 0x99, 0x04, 0x08, 0x89, 0x91, 0x04, 0x20, 0x03, + 0x05, 0x80, 0x21, 0x35, 0x06, 0x49, 0x60, 0x08, + 0x48, 0x46, 0x68, 0x01, 0x08, 0x89, 0x00, 0x89, + 0x60, 0x01, 0x48, 0x45, 0x90, 0x03, 0x20, 0x00, + 0x90, 0x02, 0x98, 0x02, 0x42, 0xa8, 0xd3, 0x04, + 0xe0, 0x08, 0x98, 0x02, 0x30, 0x01, 0x90, 0x02, + 0xe7, 0xf7, 0xcc, 0x02, 0x98, 0x03, 0xc0, 0x02, + 0x90, 0x03, 0xe7, 0xf6, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x03, 0xcc, 0x02, 0x98, 0x03, 0xc0, 0x02, + 0x90, 0x03, 0x20, 0x00, 0x49, 0x39, 0x65, 0x88, + 0x9f, 0x04, 0x2f, 0x00, 0xd8, 0x02, 0xe0, 0x05, + 0x3f, 0x01, 0xe7, 0xfa, 0xce, 0x02, 0x48, 0x35, + 0x64, 0x81, 0xe7, 0xf9, 0x20, 0x00, 0x49, 0x34, + 0x60, 0x48, 0x20, 0x00, 0x21, 0x35, 0x06, 0x49, + 0x60, 0x08, 0x20, 0x00, 0x49, 0x2f, 0x66, 0x88, + 0x20, 0x00, 0x21, 0x35, 0x06, 0x49, 0x61, 0x88, + 0x20, 0x01, 0x49, 0x2c, 0x64, 0xc8, 0x48, 0x2c, + 0x68, 0x40, 0x28, 0x00, 0xd1, 0x0e, 0x27, 0x00, + 0x2f, 0x64, 0xd3, 0x02, 0xe0, 0x02, 0x37, 0x01, + 0xe7, 0xfa, 0xe7, 0xfc, 0x98, 0x01, 0x1c, 0x41, + 0x91, 0x01, 0x4b, 0x26, 0x42, 0x98, 0xdb, 0x00, + 0xe0, 0x00, 0xe7, 0xec, 0x48, 0x24, 0x68, 0x01, + 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x48, 0x23, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x21, + 0x68, 0x40, 0x28, 0x00, 0xd1, 0x0b, 0x48, 0x20, + 0x68, 0x40, 0x4b, 0x19, 0x18, 0xc0, 0x49, 0x1d, + 0x60, 0x08, 0x48, 0x1d, 0x68, 0x80, 0x4b, 0x16, + 0x18, 0xc0, 0x49, 0x1a, 0x60, 0x48, 0x48, 0x19, + 0x68, 0x00, 0x21, 0x33, 0x06, 0x49, 0x65, 0x48, + 0x48, 0x16, 0x68, 0x40, 0x21, 0x33, 0x06, 0x49, + 0x65, 0x88, 0x48, 0x14, 0x68, 0x40, 0x21, 0x33, + 0x06, 0x49, 0x66, 0x88, 0x48, 0x11, 0x68, 0x00, + 0x21, 0x33, 0x06, 0x49, 0x66, 0x48, 0x20, 0x03, + 0x21, 0x33, 0x06, 0x49, 0x67, 0x08, 0x20, 0x00, + 0x49, 0x0e, 0x68, 0x09, 0x70, 0x08, 0x21, 0x00, + 0x20, 0x0d, 0xf7, 0xff, 0xfe, 0x2d, 0xb0, 0x05, + 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x66, 0x00, 0x00, 0x70, + 0xcc, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x80, + 0xcc, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x27, 0x10, + 0x6a, 0x00, 0x00, 0x10, 0x2e, 0x08, 0xb9, 0x88, + 0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0xd2, 0x10, + 0x1c, 0x01, 0xb0, 0x81, 0x48, 0x27, 0x22, 0x00, + 0x92, 0x00, 0x9a, 0x00, 0x2a, 0x16, 0xdb, 0x04, + 0xe0, 0x09, 0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, + 0xe7, 0xf7, 0x68, 0x02, 0x9b, 0x00, 0x00, 0x9b, + 0x50, 0xca, 0x30, 0x04, 0xe7, 0xf5, 0x48, 0x20, + 0x22, 0x00, 0x92, 0x00, 0x9a, 0x00, 0x2a, 0x0b, + 0xdb, 0x04, 0xe0, 0x0a, 0x9a, 0x00, 0x32, 0x01, + 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x03, 0x9a, 0x00, + 0x00, 0x92, 0x18, 0x52, 0x65, 0x93, 0x30, 0x04, + 0xe7, 0xf4, 0x48, 0x18, 0x22, 0x00, 0x92, 0x00, + 0x9a, 0x00, 0x2a, 0x11, 0xdb, 0x04, 0xe0, 0x0b, + 0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, + 0x68, 0x03, 0x9a, 0x00, 0x00, 0x92, 0x18, 0x52, + 0x32, 0x80, 0x60, 0x53, 0x30, 0x04, 0xe7, 0xf3, + 0x48, 0x0f, 0x22, 0x02, 0x92, 0x00, 0x9a, 0x00, + 0x2a, 0x05, 0xdb, 0x04, 0xe0, 0x0b, 0x9a, 0x00, + 0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x02, + 0x9b, 0x00, 0x00, 0x9b, 0x18, 0x5b, 0x33, 0x80, + 0x60, 0x5a, 0x30, 0x04, 0xe7, 0xf3, 0x4a, 0x07, + 0x6c, 0x12, 0x1d, 0xcb, 0x33, 0x79, 0x61, 0xda, + 0xb0, 0x01, 0x47, 0x70, 0xcc, 0x00, 0x05, 0x20, + 0xcc, 0x00, 0x0c, 0x00, 0xcc, 0x00, 0x0c, 0x5c, + 0xcc, 0x00, 0x0c, 0xa0, 0xcc, 0x00, 0x0c, 0x80, + 0xb4, 0xf0, 0x1c, 0x06, 0x1c, 0x0f, 0x1c, 0x14, + 0x1c, 0x1d, 0x06, 0x29, 0x0e, 0x09, 0x2c, 0x1f, + 0xdb, 0x02, 0x20, 0xaf, 0xbc, 0xf0, 0x47, 0x70, + 0x4b, 0x0b, 0x40, 0x1f, 0x48, 0x0b, 0x68, 0x00, + 0x60, 0x06, 0x29, 0x01, 0xd1, 0x07, 0x48, 0x0a, + 0x68, 0x02, 0x43, 0x3a, 0x60, 0x02, 0x20, 0x80, + 0x6e, 0x00, 0x60, 0x04, 0xe0, 0x05, 0x29, 0x02, + 0xd1, 0x03, 0x48, 0x05, 0x68, 0x02, 0x43, 0xba, + 0x60, 0x02, 0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5, + 0xff, 0xff, 0xf8, 0xff, 0x2e, 0x08, 0x9d, 0xe0, + 0xcc, 0x00, 0x02, 0x20, 0xb5, 0xf3, 0xb0, 0x81, + 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, + 0x99, 0x02, 0x06, 0x0e, 0x0e, 0x36, 0x48, 0x1a, + 0x6f, 0x00, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x0d, + 0x20, 0x33, 0x06, 0x40, 0x6d, 0x80, 0x21, 0x33, + 0x06, 0x49, 0x6d, 0x49, 0x1a, 0x41, 0x48, 0x14, + 0x6d, 0xc0, 0x4a, 0x13, 0x6d, 0x92, 0x1a, 0x80, + 0x18, 0x0d, 0xe0, 0x06, 0x20, 0x33, 0x06, 0x40, + 0x6d, 0x80, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x49, + 0x1a, 0x45, 0x98, 0x00, 0x43, 0x68, 0x1c, 0x01, + 0x20, 0x64, 0xf0, 0x07, 0xfb, 0x43, 0x1c, 0x04, + 0x43, 0x6e, 0x1c, 0x31, 0x20, 0x64, 0xf0, 0x07, + 0xfb, 0x3d, 0x1c, 0x07, 0x08, 0xa4, 0x00, 0xa4, + 0x08, 0xbf, 0x00, 0xbf, 0x48, 0x05, 0x64, 0x84, + 0x48, 0x04, 0x64, 0xc7, 0xb0, 0x01, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x0c, 0x80, + 0xb5, 0xf7, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, + 0xb0, 0x82, 0x27, 0x00, 0x2d, 0x1f, 0xdb, 0x05, + 0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2f, 0x00, 0xd1, 0x0d, + 0x48, 0x19, 0x69, 0x80, 0x28, 0x00, 0xd0, 0x00, + 0xe7, 0xfa, 0x20, 0x02, 0x49, 0x16, 0x61, 0x88, + 0x48, 0x15, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x00, + 0x27, 0xff, 0xe7, 0xef, 0x4c, 0x13, 0x94, 0x00, + 0x20, 0x01, 0x02, 0x40, 0x90, 0x01, 0x22, 0x00, + 0x99, 0x03, 0xb4, 0x06, 0x06, 0x2b, 0x16, 0x1b, + 0x9a, 0x03, 0x99, 0x04, 0x1c, 0x20, 0xf0, 0x01, + 0xff, 0x75, 0xb0, 0x02, 0x1c, 0x06, 0x2e, 0xd2, + 0xd1, 0x06, 0x20, 0x00, 0x49, 0x08, 0x61, 0x88, + 0x20, 0xd2, 0xb0, 0x02, 0xe7, 0xd2, 0xe0, 0x08, + 0x20, 0x00, 0x99, 0x00, 0x60, 0x08, 0x20, 0x00, + 0x49, 0x03, 0x61, 0x88, 0x20, 0x00, 0xb0, 0x02, + 0xe7, 0xc8, 0xb0, 0x02, 0xe7, 0xc6, 0x00, 0x00, + 0xcc, 0x00, 0x0f, 0x80, 0xcc, 0x00, 0x06, 0x00, + 0xb5, 0xff, 0x9f, 0x09, 0xb0, 0x81, 0x9b, 0x01, + 0x06, 0x18, 0x0e, 0x00, 0x9b, 0x02, 0x06, 0x19, + 0x0e, 0x09, 0x9b, 0x03, 0x06, 0x1b, 0x0e, 0x1b, + 0x93, 0x00, 0x9b, 0x04, 0x06, 0x1a, 0x0e, 0x12, + 0x06, 0x3d, 0x0e, 0x2d, 0x2d, 0x01, 0xd1, 0x07, + 0x4c, 0x1c, 0x68, 0x26, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x23, 0xe0, 0x07, + 0x2d, 0x02, 0xd1, 0x05, 0x4c, 0x17, 0x68, 0x26, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x33, 0x60, 0x23, + 0x28, 0x00, 0xd1, 0x03, 0x23, 0x00, 0x4c, 0x14, + 0x61, 0xe3, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02, + 0x23, 0x01, 0x4c, 0x11, 0x61, 0xe3, 0x29, 0x00, + 0xd1, 0x03, 0x23, 0x00, 0x4c, 0x0e, 0x65, 0xa3, + 0xe0, 0x04, 0x29, 0x01, 0xd1, 0x02, 0x23, 0x01, + 0x4c, 0x0b, 0x65, 0xa3, 0x2a, 0x00, 0xd1, 0x03, + 0x23, 0x02, 0x4c, 0x09, 0x66, 0xe3, 0xe0, 0x04, + 0x2a, 0x01, 0xd1, 0x02, 0x23, 0x03, 0x4c, 0x06, + 0x66, 0xe3, 0x9b, 0x00, 0x4c, 0x04, 0x67, 0x23, + 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xcc, 0x00, 0x02, 0x20, + 0xcc, 0x00, 0x0f, 0x80, 0xb5, 0xf0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2e, 0x0e, 0x36, + 0xb0, 0x84, 0x48, 0x15, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x04, 0x20, 0x39, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x01, 0xd1, 0x0a, + 0x94, 0x00, 0x97, 0x01, 0x48, 0x0f, 0x90, 0x02, + 0x48, 0x0f, 0x90, 0x03, 0x46, 0x68, 0x21, 0x01, + 0xf0, 0x00, 0xfd, 0x1a, 0xe0, 0x0f, 0x20, 0x00, + 0x90, 0x00, 0x20, 0x00, 0x90, 0x01, 0x48, 0x09, + 0x90, 0x02, 0x48, 0x09, 0x90, 0x03, 0x46, 0x68, + 0x21, 0x01, 0xf0, 0x00, 0xfd, 0x0d, 0x21, 0x00, + 0x20, 0x02, 0xf7, 0xff, 0xfc, 0x85, 0x20, 0x00, + 0xb0, 0x04, 0xe7, 0xdc, 0xb0, 0x04, 0xe7, 0xda, + 0x2e, 0x08, 0xba, 0x28, 0x00, 0x00, 0x02, 0xcf, + 0x00, 0x00, 0x02, 0x3f, 0xb4, 0xb0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x48, 0x14, 0x6c, 0x00, + 0x1c, 0x01, 0x48, 0x13, 0x6f, 0x80, 0x23, 0x09, + 0x01, 0x9b, 0x42, 0x98, 0xd1, 0x12, 0x20, 0x02, + 0x40, 0x20, 0xd0, 0x0c, 0x2d, 0x02, 0xd1, 0x0a, + 0x2f, 0x03, 0xd1, 0x00, 0x31, 0x04, 0x2f, 0x03, + 0xd2, 0x05, 0x07, 0xe0, 0x0f, 0xc0, 0xd0, 0x01, + 0x31, 0x05, 0xe0, 0x00, 0x31, 0x08, 0x2d, 0x02, + 0xd9, 0x00, 0x21, 0x12, 0x00, 0x48, 0x18, 0x40, + 0x30, 0x01, 0x10, 0x40, 0x21, 0x2d, 0x02, 0x09, + 0x43, 0x41, 0x48, 0x03, 0x69, 0x40, 0x18, 0x09, + 0x1c, 0x08, 0xbc, 0xb0, 0x47, 0x70, 0xe7, 0xfc, + 0xcc, 0x00, 0x0f, 0x80, 0x48, 0x07, 0x6a, 0xc0, + 0x1c, 0x01, 0x00, 0x48, 0x18, 0x40, 0x30, 0x01, + 0x10, 0x40, 0x21, 0x2d, 0x02, 0x09, 0x43, 0x41, + 0x48, 0x03, 0x69, 0x40, 0x18, 0x09, 0x1c, 0x08, + 0x47, 0x70, 0xe7, 0xfd, 0xcc, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x0f, 0x80, 0x48, 0x07, 0x68, 0x80, + 0x28, 0x00, 0xd1, 0x03, 0x48, 0x06, 0x69, 0x00, + 0x1c, 0x01, 0xe0, 0x02, 0x48, 0x04, 0x68, 0xc0, + 0x1c, 0x01, 0x4b, 0x02, 0x18, 0xc9, 0x1c, 0x08, + 0x47, 0x70, 0xe7, 0xfd, 0xcc, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x0f, 0x80, 0xb5, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0x48, 0x06, 0x6c, 0x40, 0x60, 0x20, + 0x48, 0x04, 0x6c, 0x80, 0x60, 0x38, 0xf7, 0xff, + 0xff, 0xe1, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xe7, 0xfb, 0x00, 0x00, 0xcc, 0x00, 0x02, 0x00, + 0xb5, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, + 0xf7, 0xff, 0xff, 0xd4, 0x1c, 0x06, 0x2d, 0x00, + 0xd0, 0x01, 0x2c, 0x00, 0xd1, 0x03, 0x20, 0x3a, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x08, 0x78, + 0x00, 0x40, 0xd0, 0x01, 0x20, 0x3a, 0xe7, 0xf7, + 0x20, 0x00, 0x49, 0x0d, 0x66, 0x88, 0x48, 0x0d, + 0x68, 0x01, 0x23, 0x12, 0x43, 0x19, 0x60, 0x01, + 0x48, 0x0b, 0x63, 0x45, 0x48, 0x0a, 0x63, 0x84, + 0x20, 0x01, 0x49, 0x09, 0x62, 0x48, 0x48, 0x09, + 0x68, 0x01, 0x23, 0x01, 0x40, 0x59, 0x60, 0x01, + 0x48, 0x05, 0x63, 0xc7, 0x48, 0x02, 0x60, 0x46, + 0x20, 0x00, 0xe7, 0xdd, 0xe7, 0xdc, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x48, + 0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x00, 0x08, + 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0x1c, 0x16, + 0x1c, 0x1d, 0x48, 0x10, 0x6a, 0x00, 0x28, 0x10, + 0xd0, 0x02, 0x20, 0x3b, 0xbc, 0xf0, 0x47, 0x70, + 0x48, 0x0d, 0x68, 0x00, 0x60, 0x38, 0x68, 0x38, + 0x4b, 0x0b, 0x18, 0xc0, 0x60, 0x38, 0x48, 0x0b, + 0x6b, 0x40, 0x60, 0x30, 0x48, 0x09, 0x6b, 0x80, + 0x60, 0x28, 0x48, 0x09, 0x6c, 0x80, 0x23, 0x10, + 0x40, 0x18, 0xd0, 0x02, 0x20, 0x02, 0x60, 0x20, + 0xe0, 0x01, 0x20, 0x01, 0x60, 0x20, 0x20, 0x00, + 0xe7, 0xe4, 0xe7, 0xe3, 0xcc, 0x00, 0x05, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x80, + 0xcc, 0x00, 0x0f, 0x00, 0xb4, 0xf0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2a, 0x0e, 0x12, + 0x06, 0x21, 0x0e, 0x09, 0x2f, 0x00, 0xd1, 0x30, + 0xb0, 0x81, 0x46, 0x6f, 0x2a, 0x00, 0xd0, 0x06, + 0x2a, 0x08, 0xd0, 0x0d, 0x2a, 0x10, 0xd0, 0x14, + 0x2a, 0x18, 0xd0, 0x1b, 0xe0, 0x23, 0x20, 0x00, + 0x70, 0x38, 0x20, 0x00, 0x70, 0x78, 0x20, 0x0c, + 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 0xe0, 0x1b, + 0x20, 0x00, 0x70, 0x38, 0x20, 0x08, 0x70, 0x78, + 0x20, 0x1c, 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, + 0xe0, 0x12, 0x20, 0x00, 0x70, 0x38, 0x20, 0x10, + 0x70, 0x78, 0x20, 0x0c, 0x70, 0xb8, 0x20, 0x00, + 0x70, 0xf8, 0xe0, 0x09, 0x20, 0x00, 0x70, 0x38, + 0x20, 0x18, 0x70, 0x78, 0x20, 0x1c, 0x70, 0xb8, + 0x20, 0x00, 0x70, 0xf8, 0xe0, 0x00, 0xe7, 0xff, + 0xb0, 0x01, 0x23, 0x00, 0x56, 0xf8, 0x23, 0x39, + 0x06, 0x5b, 0x60, 0x18, 0x23, 0x01, 0x56, 0xf8, + 0x23, 0x39, 0x06, 0x5b, 0x61, 0xd8, 0x29, 0x00, + 0xd1, 0x06, 0x48, 0x0e, 0x68, 0x06, 0x23, 0x20, + 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x03, 0xe0, 0x06, + 0x29, 0x20, 0xd1, 0x04, 0x48, 0x09, 0x68, 0x06, + 0x23, 0x20, 0x43, 0x33, 0x60, 0x03, 0x23, 0x02, + 0x56, 0xf8, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x58, + 0x23, 0x03, 0x56, 0xf8, 0x4b, 0x04, 0x63, 0x18, + 0x20, 0x00, 0x23, 0x39, 0x06, 0x5b, 0x64, 0x98, + 0xbc, 0xf0, 0x47, 0x70, 0x72, 0x00, 0x00, 0x1c, + 0x72, 0x00, 0x01, 0x00, 0xb4, 0xb0, 0x1c, 0x07, + 0x1c, 0x0d, 0x1c, 0x14, 0x06, 0x29, 0x0e, 0x09, + 0x06, 0x22, 0x0e, 0x12, 0xb0, 0x84, 0x29, 0x33, + 0xdc, 0x01, 0x2a, 0x0f, 0xdd, 0x03, 0x20, 0xff, + 0xb0, 0x04, 0xbc, 0xb0, 0x47, 0x70, 0x20, 0x39, + 0x06, 0x40, 0x63, 0x41, 0x20, 0x10, 0x43, 0x10, + 0x23, 0x39, 0x06, 0x5b, 0x63, 0x98, 0x20, 0x39, + 0x06, 0x40, 0x68, 0x00, 0x90, 0x03, 0x98, 0x03, + 0x23, 0x9c, 0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, + 0x20, 0x39, 0x06, 0x40, 0x68, 0x40, 0x90, 0x01, + 0x98, 0x01, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, + 0x90, 0x01, 0x06, 0x38, 0x0e, 0x00, 0xd0, 0x29, + 0x20, 0x10, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, + 0x23, 0x80, 0x43, 0x18, 0x90, 0x03, 0x20, 0x08, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 0x23, 0x10, + 0x43, 0x18, 0x90, 0x03, 0x20, 0x04, 0x40, 0x38, + 0xd0, 0x04, 0x98, 0x03, 0x23, 0x08, 0x43, 0x18, + 0x90, 0x03, 0xe0, 0x0c, 0x20, 0x02, 0x40, 0x38, + 0xd0, 0x04, 0x98, 0x03, 0x23, 0x0c, 0x43, 0x18, + 0x90, 0x03, 0xe0, 0x04, 0x98, 0x03, 0x23, 0x0c, + 0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, 0x20, 0x20, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x20, + 0x43, 0x18, 0x90, 0x01, 0x98, 0x03, 0x23, 0x39, + 0x06, 0x5b, 0x60, 0x18, 0x98, 0x01, 0x23, 0x39, + 0x06, 0x5b, 0x60, 0x58, 0x20, 0x39, 0x06, 0x40, + 0x6a, 0x00, 0x90, 0x00, 0x98, 0x00, 0x23, 0xf0, + 0x43, 0xdb, 0x43, 0x18, 0x90, 0x00, 0x20, 0xff, + 0x02, 0x00, 0x40, 0x38, 0xd0, 0x27, 0x20, 0xff, + 0x30, 0x01, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xfe, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, + 0x02, 0x40, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xfd, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, + 0x02, 0x80, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xfb, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, + 0x02, 0xc0, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xf7, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, + 0x03, 0x00, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xf0, 0x40, 0x18, 0x90, 0x00, 0x98, 0x00, + 0x23, 0x39, 0x06, 0x5b, 0x62, 0x18, 0x20, 0x39, + 0x06, 0x40, 0x69, 0xc0, 0x90, 0x02, 0x98, 0x02, + 0x08, 0x40, 0x00, 0x40, 0x90, 0x02, 0x20, 0x39, + 0x06, 0x40, 0x6a, 0xc0, 0x90, 0x00, 0x98, 0x00, + 0x23, 0x1c, 0x43, 0xdb, 0x40, 0x18, 0x90, 0x00, + 0x20, 0x39, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x03, + 0x98, 0x03, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, + 0x90, 0x03, 0x20, 0x39, 0x06, 0x40, 0x6b, 0xc0, + 0x90, 0x01, 0x98, 0x01, 0x09, 0x00, 0x01, 0x00, + 0x90, 0x01, 0x48, 0x4a, 0x40, 0x38, 0xd0, 0x45, + 0x20, 0x01, 0x04, 0x00, 0x40, 0x38, 0xd0, 0x03, + 0x98, 0x02, 0x23, 0x01, 0x43, 0x18, 0x90, 0x02, + 0x20, 0x01, 0x05, 0xc0, 0x40, 0x38, 0xd0, 0x03, + 0x98, 0x00, 0x23, 0x10, 0x43, 0x18, 0x90, 0x00, + 0x20, 0x07, 0x04, 0x40, 0x40, 0x38, 0x23, 0x01, + 0x04, 0x5b, 0x42, 0x98, 0xd0, 0x08, 0x23, 0x01, + 0x04, 0x9b, 0x42, 0x98, 0xd0, 0x07, 0x23, 0x01, + 0x04, 0xdb, 0x42, 0x98, 0xd0, 0x08, 0xe0, 0x0c, + 0x98, 0x00, 0x90, 0x00, 0xe0, 0x0a, 0x98, 0x00, + 0x23, 0x04, 0x43, 0x18, 0x90, 0x00, 0xe0, 0x05, + 0x98, 0x00, 0x23, 0x0c, 0x43, 0x18, 0x90, 0x00, + 0xe0, 0x00, 0xe7, 0xff, 0x20, 0x01, 0x05, 0x80, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 0x23, 0x10, + 0x43, 0x18, 0x90, 0x03, 0x20, 0x01, 0x05, 0x00, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x08, + 0x43, 0x18, 0x90, 0x01, 0x20, 0x01, 0x05, 0x40, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x07, + 0x43, 0x18, 0x90, 0x01, 0x98, 0x03, 0x23, 0x39, + 0x06, 0x5b, 0x63, 0x98, 0x98, 0x02, 0x23, 0x39, + 0x06, 0x5b, 0x61, 0xd8, 0x98, 0x01, 0x23, 0x39, + 0x06, 0x5b, 0x63, 0xd8, 0x98, 0x00, 0x23, 0x39, + 0x06, 0x5b, 0x62, 0xd8, 0x20, 0x39, 0x06, 0x40, + 0x68, 0x80, 0x90, 0x03, 0x98, 0x03, 0x08, 0x80, + 0x00, 0x80, 0x90, 0x03, 0x0f, 0x38, 0x07, 0x00, + 0xd0, 0x26, 0x20, 0x01, 0x07, 0x00, 0x40, 0x38, + 0x23, 0x01, 0x07, 0x1b, 0x42, 0x98, 0xd1, 0x04, + 0x98, 0x03, 0x23, 0x02, 0x43, 0x18, 0x90, 0x03, + 0xe0, 0x07, 0x20, 0x00, 0x42, 0x80, 0xd1, 0x04, + 0x98, 0x03, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, + 0x90, 0x03, 0x20, 0x01, 0x07, 0x40, 0x40, 0x38, + 0x23, 0x01, 0x07, 0x5b, 0x42, 0x98, 0xd1, 0x04, + 0x98, 0x03, 0x23, 0x01, 0x43, 0x18, 0x90, 0x03, + 0xe0, 0x06, 0x20, 0x00, 0x42, 0x80, 0xd1, 0x03, + 0x98, 0x03, 0x08, 0x40, 0x00, 0x40, 0x90, 0x03, + 0x98, 0x03, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x98, + 0x20, 0x00, 0xb0, 0x04, 0xe6, 0xc1, 0xb0, 0x04, + 0xe6, 0xbf, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, + 0x48, 0x02, 0x69, 0xc0, 0x06, 0x00, 0x16, 0x00, + 0x47, 0x70, 0xe7, 0xfd, 0x72, 0x00, 0x01, 0x00, + 0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x23, + 0x16, 0x18, 0x06, 0x3b, 0x16, 0x19, 0x9b, 0x02, + 0x06, 0x1a, 0x0e, 0x12, 0x2a, 0x00, 0xd1, 0x0b, + 0x23, 0x39, 0x06, 0x5b, 0x60, 0xd8, 0x23, 0x39, + 0x06, 0x5b, 0x61, 0x19, 0x4d, 0x0b, 0x68, 0x2e, + 0x23, 0x01, 0x43, 0x33, 0x60, 0x2b, 0xe0, 0x0c, + 0x2a, 0x01, 0xd1, 0x0a, 0x23, 0x39, 0x06, 0x5b, + 0x61, 0x58, 0x23, 0x39, 0x06, 0x5b, 0x61, 0x99, + 0x4d, 0x04, 0x68, 0x2e, 0x23, 0x02, 0x43, 0x33, + 0x60, 0x2b, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x72, 0x00, 0x00, 0x08, + 0xb4, 0x90, 0x1c, 0x01, 0x20, 0x92, 0x4b, 0x4b, + 0x60, 0x18, 0x20, 0x92, 0x4b, 0x4a, 0x60, 0x18, + 0x20, 0x10, 0x4b, 0x4a, 0x60, 0x18, 0x20, 0x00, + 0x4b, 0x48, 0x60, 0x58, 0x48, 0x48, 0x4b, 0x47, + 0x60, 0x98, 0x22, 0x00, 0x2a, 0x10, 0xdb, 0x02, + 0xe0, 0x07, 0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, + 0x43, 0xc0, 0x00, 0x93, 0x4c, 0x42, 0x50, 0xe0, + 0xe7, 0xf7, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x93, + 0x4c, 0x3f, 0x50, 0xe0, 0x22, 0x00, 0x2a, 0x08, + 0xdb, 0x02, 0xe0, 0x08, 0x32, 0x01, 0xe7, 0xfa, + 0x20, 0x00, 0x43, 0xc0, 0x00, 0x94, 0x4b, 0x3b, + 0x18, 0xe3, 0x64, 0x18, 0xe7, 0xf6, 0x22, 0x00, + 0x2a, 0x20, 0xdb, 0x02, 0xe0, 0x08, 0x32, 0x01, + 0xe7, 0xfa, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x94, + 0x4b, 0x35, 0x18, 0xe3, 0x60, 0x18, 0xe7, 0xf6, + 0x22, 0x00, 0x2a, 0x19, 0xdb, 0x02, 0xe0, 0x06, + 0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, 0x00, 0x93, + 0x4c, 0x30, 0x50, 0xe0, 0xe7, 0xf8, 0x20, 0x00, + 0x4b, 0x2f, 0x60, 0x18, 0x20, 0x39, 0x06, 0x40, + 0x69, 0xc0, 0x27, 0x18, 0x40, 0x07, 0x2f, 0x00, + 0xd0, 0x03, 0x48, 0x2c, 0x4b, 0x2c, 0x60, 0x18, + 0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, 0x4b, 0x2a, + 0x60, 0x18, 0x20, 0x00, 0x4b, 0x29, 0x60, 0x18, + 0x20, 0x00, 0x4b, 0x28, 0x60, 0x58, 0x48, 0x28, + 0x4b, 0x26, 0x60, 0x98, 0x48, 0x24, 0x68, 0x00, + 0x4b, 0x24, 0x60, 0xd8, 0x48, 0x25, 0x60, 0x01, + 0x20, 0x0d, 0x06, 0xc0, 0x61, 0xc1, 0x20, 0x05, + 0x02, 0x00, 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x18, + 0x48, 0x21, 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x58, + 0x48, 0x1f, 0x4b, 0x16, 0x63, 0x98, 0x20, 0x00, + 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x98, 0x20, 0x00, + 0x23, 0x0d, 0x06, 0xdb, 0x61, 0x18, 0x48, 0x1b, + 0x23, 0x0d, 0x06, 0xdb, 0x61, 0x98, 0x20, 0x01, + 0x23, 0x0d, 0x06, 0xdb, 0x60, 0xd8, 0x48, 0x18, + 0x23, 0x0d, 0x06, 0xdb, 0x63, 0x18, 0x48, 0x17, + 0x23, 0x0d, 0x06, 0xdb, 0x63, 0x58, 0x20, 0x00, + 0x4b, 0x15, 0x60, 0x18, 0x48, 0x11, 0x4b, 0x15, + 0x60, 0x18, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70, + 0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0xba, 0x30, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xbb, 0x00, + 0x2e, 0x08, 0xba, 0x38, 0x68, 0x00, 0x0d, 0x00, + 0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0xb9, 0xc4, + 0x2e, 0x08, 0xba, 0x28, 0x00, 0x00, 0x02, 0x3f, + 0x2e, 0x08, 0x9d, 0xec, 0x2e, 0x08, 0xbb, 0x0c, + 0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0x9d, 0xf0, + 0x00, 0xf0, 0x29, 0x6d, 0x3f, 0xff, 0xff, 0xff, + 0x00, 0x80, 0x10, 0x80, 0x00, 0x80, 0xeb, 0x80, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0x9b, 0xb8, + 0xb5, 0xff, 0xb0, 0x85, 0x20, 0x39, 0x06, 0x40, + 0x69, 0xc0, 0x23, 0x18, 0x40, 0x18, 0x90, 0x00, + 0x98, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x5a, + 0x4b, 0x5a, 0x60, 0x18, 0xe0, 0x03, 0x20, 0xff, + 0x30, 0xe0, 0x4b, 0x58, 0x60, 0x18, 0x9c, 0x06, + 0x9f, 0x07, 0x22, 0x00, 0x21, 0x00, 0x98, 0x05, + 0x38, 0x0c, 0x28, 0x06, 0xd2, 0x0c, 0xa3, 0x02, + 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x04, 0x03, 0x06, 0x04, 0x03, 0x06, 0x32, 0x01, + 0x32, 0x01, 0xe0, 0x02, 0x3a, 0x01, 0xe0, 0x00, + 0xe7, 0xff, 0x98, 0x05, 0x38, 0x0b, 0x28, 0x08, + 0xd2, 0x15, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x0a, 0x04, 0x04, 0x04, + 0x0a, 0x0a, 0x0a, 0x04, 0x25, 0x2d, 0x01, 0x2d, + 0x48, 0x44, 0x68, 0x00, 0x1c, 0x46, 0xe0, 0x0e, + 0x48, 0x43, 0x6c, 0x40, 0x1c, 0x05, 0x48, 0x43, + 0x68, 0x40, 0x1c, 0x06, 0xe0, 0x07, 0x21, 0xff, + 0x1c, 0x08, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 0x2d, 0x00, + 0xd0, 0x01, 0x2e, 0x00, 0xd1, 0x04, 0x25, 0x2d, + 0x01, 0x2d, 0x48, 0x38, 0x68, 0x00, 0x1c, 0x46, + 0x29, 0xff, 0xd1, 0x02, 0x1c, 0x08, 0xb0, 0x05, + 0xe7, 0xec, 0x1e, 0x68, 0x90, 0x02, 0x1e, 0x70, + 0x90, 0x01, 0x23, 0x01, 0x42, 0xda, 0xd1, 0x08, + 0x42, 0x50, 0x40, 0x85, 0x1c, 0x2b, 0x1e, 0x5d, + 0x42, 0x50, 0x40, 0x86, 0x1c, 0x33, 0x1e, 0x5e, + 0xe0, 0x05, 0x41, 0x15, 0x1c, 0x28, 0x1e, 0x45, + 0x41, 0x16, 0x1c, 0x30, 0x1e, 0x46, 0x07, 0xe0, + 0x0f, 0xc0, 0xd0, 0x02, 0x21, 0x80, 0x08, 0x64, + 0x00, 0x64, 0x07, 0xf8, 0x0f, 0xc0, 0xd0, 0x02, + 0x21, 0x80, 0x08, 0x7f, 0x00, 0x7f, 0x19, 0x60, + 0x90, 0x04, 0x19, 0xb8, 0x90, 0x03, 0x2c, 0x00, + 0xda, 0x01, 0x21, 0x80, 0x24, 0x00, 0x98, 0x04, + 0x28, 0x01, 0xda, 0x02, 0x21, 0x80, 0x20, 0x01, + 0x90, 0x04, 0x4b, 0x1f, 0x42, 0x9c, 0xdb, 0x01, + 0x21, 0x80, 0x4c, 0x1e, 0x98, 0x04, 0x4b, 0x1c, + 0x42, 0x98, 0xdd, 0x02, 0x21, 0x80, 0x48, 0x1a, + 0x90, 0x04, 0x2f, 0x00, 0xda, 0x01, 0x21, 0x80, + 0x27, 0x00, 0x98, 0x03, 0x28, 0x01, 0xda, 0x02, + 0x21, 0x80, 0x20, 0x01, 0x90, 0x03, 0x48, 0x11, + 0x68, 0x00, 0x42, 0x87, 0xd3, 0x03, 0x21, 0x80, + 0x48, 0x0e, 0x68, 0x00, 0x1e, 0x47, 0x98, 0x03, + 0x4b, 0x0c, 0x68, 0x1b, 0x42, 0x98, 0xd9, 0x03, + 0x21, 0x80, 0x48, 0x0a, 0x68, 0x00, 0x90, 0x03, + 0x9b, 0x08, 0x60, 0x1c, 0x9b, 0x08, 0x60, 0x5f, + 0x98, 0x04, 0x9b, 0x08, 0x60, 0x98, 0x98, 0x03, + 0x9b, 0x08, 0x60, 0xd8, 0x1c, 0x08, 0xb0, 0x05, + 0xe7, 0x88, 0xb0, 0x05, 0xe7, 0x86, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x9d, 0xec, + 0xcc, 0x00, 0x02, 0x00, 0xcc, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0xce, + 0xb5, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0xb0, 0x81, + 0x2c, 0x0b, 0xdb, 0x19, 0x2c, 0x12, 0xdc, 0x17, + 0x68, 0xbe, 0x68, 0xf9, 0x91, 0x00, 0x68, 0x7a, + 0x1c, 0x3b, 0x68, 0x39, 0x1c, 0x20, 0xf7, 0xff, + 0xff, 0x23, 0x1c, 0x05, 0x68, 0xb8, 0x42, 0xb0, + 0xd0, 0x00, 0x25, 0x80, 0x68, 0xf8, 0x99, 0x00, + 0x42, 0x88, 0xd0, 0x00, 0x25, 0x80, 0x1c, 0x28, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x25, 0x00, 0x68, 0x38, 0x28, 0x00, 0xda, 0x02, + 0x25, 0x80, 0x20, 0x00, 0x60, 0x38, 0x68, 0x78, + 0x28, 0x00, 0xda, 0x02, 0x25, 0x80, 0x20, 0x00, + 0x60, 0x78, 0x68, 0x38, 0x07, 0xc0, 0x0f, 0xc0, + 0xd0, 0x04, 0x25, 0x80, 0x68, 0x38, 0x08, 0x40, + 0x00, 0x40, 0x60, 0x38, 0x68, 0xb8, 0x07, 0xc0, + 0x0f, 0xc0, 0xd1, 0x09, 0x25, 0x80, 0x68, 0xb8, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x68, 0xb8, + 0xe0, 0x01, 0x68, 0xb8, 0x38, 0x01, 0x60, 0xb8, + 0x68, 0xb8, 0x68, 0x39, 0x42, 0x88, 0xdc, 0x03, + 0x25, 0x80, 0x68, 0x38, 0x30, 0x01, 0x60, 0xb8, + 0x68, 0x78, 0x68, 0xf9, 0x42, 0x88, 0xdb, 0x03, + 0x25, 0x80, 0x68, 0x78, 0x30, 0x01, 0x60, 0xf8, + 0x1c, 0x28, 0xb0, 0x01, 0xe7, 0xc5, 0xb0, 0x01, + 0xe7, 0xc3, 0x1c, 0x02, 0x21, 0x18, 0xe0, 0x00, + 0x31, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, + 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0a, 0xb0, 0x81, + 0x68, 0xb8, 0x68, 0x3b, 0x1a, 0xc0, 0x1c, 0x46, + 0x68, 0xf8, 0x68, 0x7b, 0x1a, 0xc0, 0x30, 0x01, + 0x90, 0x00, 0x00, 0x90, 0x4b, 0x15, 0x58, 0x1c, + 0x98, 0x00, 0x43, 0x46, 0x1c, 0x35, 0x07, 0xa0, + 0x0f, 0x80, 0x1c, 0x29, 0x40, 0x81, 0x2a, 0x0b, + 0xdb, 0x01, 0x2a, 0x12, 0xdd, 0x01, 0x2a, 0x13, + 0xd1, 0x01, 0x21, 0x00, 0xe0, 0x0a, 0x2a, 0x09, + 0xd0, 0x01, 0x2a, 0x0a, 0xd1, 0x03, 0x00, 0x69, + 0x19, 0x49, 0x00, 0xc9, 0xe0, 0x02, 0x2a, 0x08, + 0xd1, 0x00, 0x01, 0x29, 0x20, 0x04, 0x40, 0x20, + 0xd0, 0x00, 0x08, 0x49, 0x09, 0x4c, 0x06, 0xc8, + 0x0e, 0xc0, 0xd0, 0x00, 0x34, 0x01, 0x1c, 0x20, + 0xb0, 0x01, 0xbc, 0xf0, 0x47, 0x70, 0xb0, 0x01, + 0xe7, 0xfb, 0x00, 0x00, 0x2e, 0x03, 0xa8, 0x78, + 0xb4, 0x80, 0x23, 0x00, 0x22, 0x01, 0x21, 0x00, + 0x29, 0x08, 0xdb, 0x02, 0xe0, 0x09, 0x31, 0x01, + 0xe7, 0xfa, 0x00, 0x88, 0x4f, 0x05, 0x58, 0x38, + 0x28, 0x00, 0xd0, 0x00, 0x43, 0x13, 0x00, 0x52, + 0xe7, 0xf5, 0x1c, 0x18, 0xbc, 0x80, 0x47, 0x70, + 0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xc4, + 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x81, 0x20, 0x39, + 0x06, 0x40, 0x69, 0xc0, 0x23, 0x18, 0x40, 0x18, + 0x90, 0x00, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x03, + 0x48, 0x32, 0x49, 0x33, 0x60, 0x08, 0xe0, 0x03, + 0x20, 0xff, 0x30, 0xe0, 0x49, 0x30, 0x60, 0x08, + 0x24, 0x00, 0x99, 0x01, 0x48, 0x2f, 0xf7, 0xfc, + 0xfa, 0x1f, 0x48, 0x2e, 0x68, 0x00, 0x28, 0x00, + 0xda, 0x03, 0x20, 0x00, 0x49, 0x2b, 0x60, 0x08, + 0x24, 0x80, 0x48, 0x2a, 0x68, 0x40, 0x28, 0x00, + 0xda, 0x03, 0x20, 0x00, 0x49, 0x27, 0x60, 0x48, + 0x24, 0x80, 0x48, 0x26, 0x68, 0x80, 0x4b, 0x26, + 0x42, 0x98, 0xdd, 0x03, 0x48, 0x24, 0x49, 0x23, + 0x60, 0x88, 0x24, 0x80, 0x48, 0x21, 0x68, 0xc0, + 0x49, 0x1f, 0x68, 0x09, 0x42, 0x88, 0xd9, 0x04, + 0x48, 0x1d, 0x68, 0x00, 0x49, 0x1d, 0x60, 0xc8, + 0x24, 0x80, 0x48, 0x1e, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x27, 0x2f, 0x01, 0xd1, 0x25, 0x48, 0x19, + 0x68, 0x06, 0x48, 0x18, 0x68, 0x45, 0x23, 0xff, + 0x33, 0x68, 0x42, 0x9e, 0xdd, 0x01, 0x26, 0xff, + 0x36, 0x68, 0x48, 0x13, 0x68, 0x00, 0x08, 0x40, + 0x42, 0xa8, 0xd2, 0x02, 0x48, 0x10, 0x68, 0x00, + 0x08, 0x45, 0x48, 0x13, 0x49, 0x13, 0x65, 0x48, + 0x48, 0x13, 0x43, 0x70, 0x23, 0x01, 0x04, 0x1b, + 0x18, 0xc0, 0x14, 0x40, 0x49, 0x0f, 0x65, 0x88, + 0x20, 0x00, 0x49, 0x0e, 0x65, 0xc8, 0x48, 0x0d, + 0x66, 0x05, 0x1c, 0x38, 0x21, 0x00, 0xf7, 0xfe, + 0xff, 0x13, 0x1c, 0x20, 0xb0, 0x01, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, + 0xe7, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3f, + 0x2e, 0x08, 0x9d, 0xec, 0x2e, 0x08, 0xbb, 0x0c, + 0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0xba, 0x28, + 0x00, 0x00, 0x07, 0xfa, 0xcc, 0x00, 0x00, 0x00, + 0x00, 0x0b, 0x60, 0xb6, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x0f, 0xb0, 0x81, 0x1c, 0x26, 0x69, 0x30, + 0x90, 0x00, 0x98, 0x00, 0x28, 0x13, 0xd1, 0x04, + 0x20, 0x75, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0xf5, 0x68, 0x38, 0x08, 0x40, + 0x00, 0x40, 0x60, 0x38, 0x68, 0x78, 0x08, 0x40, + 0x00, 0x40, 0x60, 0x78, 0x68, 0xb8, 0x07, 0xc0, + 0x0f, 0xc0, 0xd1, 0x02, 0x68, 0xb8, 0x38, 0x01, + 0x60, 0xb8, 0x68, 0xf8, 0x07, 0xc0, 0x0f, 0xc0, + 0xd1, 0x02, 0x68, 0xf8, 0x38, 0x01, 0x60, 0xf8, + 0x1d, 0xf0, 0x30, 0x49, 0x1c, 0x39, 0xf7, 0xfc, + 0xf9, 0x8b, 0x48, 0x1c, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x01, + 0xe7, 0xcc, 0x49, 0x13, 0x20, 0x91, 0xf0, 0x14, + 0xff, 0x47, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x05, 0xfa, 0xf4, 0xe7, 0xf5, 0x00, 0xa8, + 0x49, 0x0e, 0x58, 0x08, 0x42, 0xa0, 0xd0, 0x05, + 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0x20, 0xff, + 0xb0, 0x01, 0xe7, 0xb7, 0x48, 0x0a, 0x68, 0x00, + 0x42, 0xa0, 0xd1, 0x03, 0x1c, 0x39, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x10, 0x20, 0x92, 0x49, 0x04, + 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xa9, + 0xb0, 0x01, 0xe7, 0xa7, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, + 0x2e, 0x08, 0xba, 0x28, 0xb5, 0xf3, 0x1c, 0x0f, + 0xb0, 0x9b, 0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, + 0x23, 0x18, 0x40, 0x18, 0x90, 0x01, 0x98, 0x01, + 0x28, 0x00, 0xd0, 0x03, 0x48, 0xf8, 0x49, 0xf9, + 0x60, 0x08, 0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, + 0x49, 0xf6, 0x60, 0x08, 0x20, 0xff, 0x30, 0x01, + 0x90, 0x06, 0x98, 0x1b, 0x90, 0x1a, 0x98, 0x1a, + 0x69, 0x05, 0x98, 0x1a, 0x68, 0xc0, 0x90, 0x19, + 0x48, 0xf1, 0x68, 0x00, 0x99, 0x1b, 0x42, 0x88, + 0xd1, 0x73, 0x20, 0x02, 0x90, 0x08, 0x2d, 0x0c, + 0xd0, 0x01, 0x2d, 0x0f, 0xd1, 0x02, 0x20, 0x04, + 0x90, 0x08, 0xe0, 0x0c, 0x2d, 0x0d, 0xd0, 0x01, + 0x2d, 0x10, 0xd1, 0x02, 0x20, 0x08, 0x90, 0x08, + 0xe0, 0x05, 0x2d, 0x0e, 0xd0, 0x01, 0x2d, 0x11, + 0xd1, 0x01, 0x20, 0x01, 0x90, 0x08, 0x68, 0xf8, + 0x68, 0x79, 0x1a, 0x40, 0x1c, 0x44, 0x2d, 0x0b, + 0xd0, 0x05, 0x2d, 0x0f, 0xd0, 0x03, 0x2d, 0x10, + 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x11, 0x48, 0xdf, + 0x6c, 0x40, 0x1c, 0x06, 0x48, 0xdd, 0x6c, 0x81, + 0x91, 0x07, 0x2e, 0x00, 0xd0, 0x02, 0x99, 0x07, + 0x29, 0x00, 0xd1, 0x05, 0x26, 0x2d, 0x01, 0x36, + 0x48, 0xd6, 0x68, 0x00, 0x1c, 0x41, 0x91, 0x07, + 0xe0, 0x05, 0x26, 0x2d, 0x01, 0x36, 0x48, 0xd3, + 0x68, 0x00, 0x1c, 0x41, 0x91, 0x07, 0x49, 0xd4, + 0xa8, 0x15, 0xf7, 0xfc, 0xf8, 0xe9, 0x98, 0x17, + 0x1e, 0x71, 0x42, 0x88, 0xdd, 0x01, 0x1e, 0x70, + 0x90, 0x17, 0x98, 0x18, 0x99, 0x07, 0x39, 0x01, + 0x42, 0x88, 0xdd, 0x02, 0x99, 0x07, 0x1e, 0x48, + 0x90, 0x18, 0x98, 0x18, 0x99, 0x16, 0x1a, 0x40, + 0x00, 0x40, 0x1c, 0x81, 0x98, 0x08, 0xf0, 0x06, + 0xfb, 0xd3, 0x90, 0x0a, 0x98, 0x0a, 0x42, 0x84, + 0xdd, 0x00, 0x9c, 0x0a, 0x48, 0xc5, 0x6f, 0x00, + 0x90, 0x02, 0x20, 0x00, 0x90, 0x05, 0x98, 0x02, + 0x28, 0x02, 0xd0, 0x02, 0x98, 0x02, 0x28, 0x03, + 0xd1, 0x3a, 0x48, 0xc1, 0x6b, 0x00, 0x90, 0x04, + 0x48, 0xbe, 0x6e, 0xc1, 0x91, 0x03, 0x98, 0x04, + 0x99, 0x03, 0x42, 0x88, 0xdd, 0x21, 0x20, 0xc0, + 0x90, 0x06, 0x1d, 0x20, 0x28, 0x00, 0xda, 0x02, + 0xe0, 0x00, 0xe1, 0x8e, 0x30, 0x07, 0x10, 0xc0, + 0x90, 0x05, 0x98, 0x04, 0x28, 0x03, 0xd0, 0x14, + 0x99, 0x03, 0x29, 0x03, 0xd1, 0x07, 0x20, 0xcd, + 0x90, 0x06, 0x1d, 0x61, 0x20, 0x0a, 0xf0, 0x06, + 0xfb, 0xa3, 0x90, 0x05, 0xe0, 0x09, 0x98, 0x02, + 0x28, 0x02, 0xd1, 0x06, 0x20, 0x9a, 0x90, 0x06, + 0x1c, 0xa1, 0x20, 0x05, 0xf0, 0x06, 0xfb, 0x98, + 0x90, 0x05, 0x98, 0x06, 0x28, 0x9a, 0xd0, 0x02, + 0x98, 0x06, 0x28, 0xcd, 0xd1, 0x08, 0x2d, 0x0e, + 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x04, 0x20, 0x00, + 0x90, 0x05, 0x20, 0xff, 0x30, 0x01, 0x90, 0x06, + 0x2d, 0x12, 0xd1, 0x0b, 0x48, 0x9d, 0x68, 0x00, + 0x30, 0x01, 0x42, 0xa0, 0xd1, 0x06, 0x68, 0x78, + 0x28, 0x00, 0xd1, 0x03, 0x20, 0x01, 0x49, 0x9f, + 0x63, 0x48, 0xe0, 0x02, 0x20, 0x00, 0x49, 0x9d, + 0x63, 0x48, 0x98, 0x0a, 0x99, 0x06, 0x43, 0x48, + 0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 0x12, 0x00, + 0x42, 0xa0, 0xdd, 0x04, 0x20, 0x00, 0x90, 0x05, + 0x20, 0xff, 0x30, 0x01, 0x90, 0x06, 0x68, 0x78, + 0x99, 0x05, 0x18, 0x40, 0x60, 0x78, 0x1c, 0x39, + 0xa8, 0x11, 0xf7, 0xfc, 0xf8, 0x61, 0x1c, 0x29, + 0xa8, 0x11, 0xf7, 0xff, 0xfd, 0x71, 0x98, 0x12, + 0x49, 0x88, 0x68, 0x09, 0x39, 0x01, 0x42, 0x88, + 0xd1, 0x00, 0x24, 0x00, 0x99, 0x15, 0x91, 0x0d, + 0x98, 0x16, 0x90, 0x0f, 0x21, 0x00, 0x91, 0x10, + 0x68, 0x38, 0x28, 0x00, 0xda, 0x08, 0x68, 0x38, + 0x99, 0x08, 0x43, 0x48, 0x42, 0x41, 0x29, 0x00, + 0xda, 0x00, 0x31, 0x01, 0x10, 0x49, 0x91, 0x10, + 0x68, 0x78, 0x28, 0x00, 0xda, 0x0d, 0x68, 0x78, + 0x99, 0x08, 0x43, 0x48, 0x28, 0x00, 0xda, 0x00, + 0x30, 0x01, 0x10, 0x40, 0x02, 0x01, 0x98, 0x06, + 0xf0, 0x06, 0xfb, 0x36, 0x99, 0x0f, 0x1a, 0x08, + 0x90, 0x0f, 0x98, 0x18, 0x99, 0x0f, 0x42, 0x88, + 0xdc, 0x02, 0x98, 0x18, 0x30, 0x01, 0x90, 0x0f, + 0x98, 0x17, 0x99, 0x0d, 0x1a, 0x40, 0x30, 0x01, + 0x90, 0x0e, 0x98, 0x18, 0x99, 0x0f, 0x1a, 0x40, + 0x30, 0x01, 0x90, 0x09, 0x98, 0x09, 0x00, 0x41, + 0x98, 0x08, 0xf0, 0x06, 0xfb, 0x1d, 0x99, 0x06, + 0x43, 0x48, 0x28, 0x00, 0xda, 0x00, 0x30, 0xff, + 0x12, 0x00, 0x90, 0x09, 0x68, 0xb8, 0x68, 0x39, + 0x1a, 0x40, 0x1c, 0x41, 0x91, 0x0c, 0x98, 0x17, + 0x99, 0x15, 0x1a, 0x40, 0x00, 0x40, 0x1c, 0x81, + 0x98, 0x08, 0xf0, 0x06, 0xfb, 0x09, 0x90, 0x0b, + 0x98, 0x0b, 0x4b, 0x65, 0x40, 0x18, 0x90, 0x0b, + 0x98, 0x0b, 0x99, 0x08, 0x43, 0x48, 0x28, 0x00, + 0xda, 0x00, 0x30, 0x01, 0x10, 0x40, 0x90, 0x0e, + 0x99, 0x0c, 0x98, 0x0b, 0x42, 0x81, 0xdd, 0x01, + 0x98, 0x0b, 0x90, 0x0c, 0x99, 0x0c, 0x4b, 0x5c, + 0x40, 0x19, 0x91, 0x0c, 0x98, 0x0c, 0x28, 0x00, + 0xdd, 0x05, 0x68, 0x38, 0x99, 0x0c, 0x18, 0x40, + 0x38, 0x01, 0x90, 0x13, 0xe0, 0x02, 0x68, 0x38, + 0x30, 0x01, 0x90, 0x13, 0x98, 0x13, 0x28, 0x01, + 0xda, 0x01, 0x20, 0x01, 0x90, 0x13, 0x98, 0x13, + 0x4b, 0x52, 0x42, 0x98, 0xdd, 0x01, 0x48, 0x51, + 0x90, 0x13, 0x99, 0x06, 0x43, 0x4c, 0x1c, 0x20, + 0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 0x12, 0x04, + 0x98, 0x0a, 0x42, 0x84, 0xdd, 0x00, 0x9c, 0x0a, + 0x2c, 0x02, 0xda, 0x00, 0x24, 0x02, 0x68, 0x78, + 0x19, 0x00, 0x38, 0x01, 0x90, 0x14, 0x98, 0x14, + 0x28, 0x01, 0xda, 0x01, 0x20, 0x01, 0x90, 0x14, + 0x98, 0x14, 0x49, 0x3c, 0x68, 0x09, 0x42, 0x88, + 0xd9, 0x02, 0x48, 0x3a, 0x68, 0x00, 0x90, 0x14, + 0x98, 0x12, 0x49, 0x38, 0x68, 0x09, 0x39, 0x01, + 0x42, 0x88, 0xd9, 0x03, 0x48, 0x35, 0x68, 0x00, + 0x38, 0x01, 0x90, 0x12, 0x98, 0x09, 0x28, 0x04, + 0xdb, 0x01, 0x2c, 0x04, 0xda, 0x01, 0x20, 0x00, + 0x90, 0x0e, 0x98, 0x0e, 0x28, 0x03, 0xdb, 0x02, + 0x98, 0x0c, 0x28, 0x04, 0xda, 0x09, 0x20, 0x00, + 0x90, 0x0e, 0x48, 0x35, 0x90, 0x11, 0x48, 0x33, + 0x90, 0x13, 0x20, 0x00, 0x90, 0x12, 0x20, 0x01, + 0x90, 0x14, 0x21, 0x00, 0x91, 0x00, 0x98, 0x08, + 0x28, 0x01, 0xd1, 0x16, 0x98, 0x0e, 0x99, 0x10, + 0x1a, 0x40, 0x00, 0x40, 0x4b, 0x2b, 0x42, 0x98, + 0xdd, 0x0b, 0x98, 0x0e, 0x99, 0x10, 0x1a, 0x40, + 0x00, 0x40, 0x23, 0x2d, 0x01, 0x1b, 0x1a, 0xc1, + 0x29, 0x00, 0xda, 0x00, 0x31, 0x01, 0x10, 0x49, + 0x91, 0x00, 0x98, 0x0e, 0x42, 0xb0, 0xdd, 0x00, + 0x96, 0x0e, 0x99, 0x10, 0x42, 0xb1, 0xdd, 0x00, + 0x96, 0x10, 0x1c, 0x30, 0x21, 0x01, 0x07, 0x49, + 0xf0, 0x06, 0xfa, 0x76, 0x99, 0x0d, 0x43, 0x48, + 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, + 0x49, 0x1c, 0x65, 0x88, 0x1c, 0x30, 0x21, 0x01, + 0x07, 0x49, 0xf0, 0x06, 0xfa, 0x69, 0x99, 0x10, + 0x43, 0x48, 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0, + 0x14, 0x40, 0x49, 0x16, 0x65, 0xc8, 0x1c, 0x30, + 0x21, 0x01, 0x07, 0x49, 0xf0, 0x06, 0xfa, 0x5c, + 0x99, 0x0e, 0x43, 0x48, 0x23, 0x01, 0x04, 0x1b, + 0x18, 0xc0, 0x14, 0x40, 0x49, 0x0f, 0x65, 0x48, + 0x99, 0x07, 0x1f, 0x08, 0x99, 0x0f, 0x42, 0x88, + 0xdc, 0x1b, 0x99, 0x07, 0x1f, 0x08, 0xe0, 0x17, + 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x9d, 0xec, + 0x2e, 0x08, 0xba, 0x28, 0xcc, 0x00, 0x02, 0x00, + 0x2e, 0x08, 0xbb, 0x0c, 0xcc, 0x00, 0x0f, 0x80, + 0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x02, 0xcf, + 0x00, 0x00, 0x02, 0xce, 0xcc, 0x00, 0x00, 0x00, + 0x90, 0x0f, 0x98, 0x0f, 0x49, 0x0d, 0x66, 0x08, + 0x1c, 0x30, 0x21, 0x01, 0x07, 0x49, 0xf0, 0x06, + 0xfa, 0x2b, 0x99, 0x00, 0x43, 0x48, 0x23, 0x01, + 0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, 0x49, 0x07, + 0x66, 0x48, 0xa9, 0x11, 0x1c, 0x38, 0xf7, 0xfb, + 0xff, 0x1f, 0x20, 0x00, 0xb0, 0x1b, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x1b, + 0xe7, 0xf9, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x2a, 0x00, + 0xd1, 0x02, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, + 0x2f, 0x01, 0xd1, 0x20, 0x20, 0x00, 0x23, 0x00, + 0x4d, 0x13, 0x62, 0x2b, 0x23, 0x00, 0x4d, 0x12, + 0x62, 0xab, 0x4b, 0x12, 0x68, 0x9b, 0x1c, 0x1c, + 0x4b, 0x11, 0x6e, 0xdb, 0x1c, 0x19, 0x2c, 0x02, + 0xd0, 0x01, 0x29, 0x02, 0xd1, 0x01, 0x20, 0x08, + 0xe0, 0x00, 0x20, 0x07, 0x79, 0x13, 0x2b, 0x00, + 0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0x4b, 0x08, + 0x62, 0x58, 0x79, 0x55, 0x23, 0x80, 0x43, 0x2b, + 0x4d, 0x05, 0x62, 0xab, 0xe0, 0x05, 0x48, 0x07, + 0x68, 0x05, 0x23, 0x80, 0x43, 0x9d, 0x1c, 0x2b, + 0x60, 0x03, 0x20, 0x00, 0xe7, 0xd2, 0xe7, 0xd1, + 0x72, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x0c, 0x00, + 0xcc, 0x00, 0x0f, 0x80, 0x72, 0x00, 0x01, 0x28, + 0xb5, 0xff, 0x9f, 0x09, 0xb0, 0x81, 0x98, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, + 0x06, 0x0c, 0x0e, 0x24, 0x98, 0x03, 0x06, 0x02, + 0x0e, 0x12, 0x9b, 0x04, 0x06, 0x1d, 0x0e, 0x2d, + 0x2f, 0x01, 0xd1, 0x1b, 0x20, 0x00, 0x4b, 0x14, + 0x62, 0x18, 0x20, 0x00, 0x4b, 0x12, 0x62, 0x98, + 0x98, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x01, 0x23, + 0x43, 0x18, 0x06, 0x01, 0x0e, 0x09, 0x48, 0x0e, + 0x62, 0x41, 0x07, 0x50, 0x0f, 0x40, 0x07, 0x6b, + 0x0f, 0x5b, 0x00, 0xdb, 0x43, 0x18, 0x06, 0x01, + 0x0e, 0x09, 0x20, 0x80, 0x43, 0x08, 0x4b, 0x08, + 0x62, 0x98, 0xe0, 0x05, 0x48, 0x07, 0x68, 0x06, + 0x23, 0x80, 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x03, + 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, + 0x72, 0x00, 0x01, 0x00, 0x72, 0x00, 0x01, 0x28, + 0xb5, 0xf1, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f, + 0xb0, 0x81, 0x2f, 0x1f, 0xdb, 0x05, 0x20, 0xb3, + 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x48, 0x62, 0x23, 0x80, 0x68, 0x1b, + 0x60, 0x18, 0x48, 0x61, 0x23, 0x80, 0x6b, 0x1b, + 0x60, 0x18, 0x48, 0x60, 0x23, 0x80, 0x6b, 0x5b, + 0x60, 0x18, 0x48, 0x5f, 0x23, 0x80, 0x6b, 0x9b, + 0x60, 0x18, 0x20, 0x01, 0x40, 0xb8, 0x4b, 0x59, + 0x60, 0x18, 0x20, 0x00, 0x4b, 0x57, 0x71, 0x18, + 0x20, 0x00, 0x4b, 0x56, 0x71, 0x58, 0x48, 0x55, + 0x68, 0x00, 0x4b, 0x58, 0x60, 0x58, 0x48, 0x58, + 0x4b, 0x56, 0x60, 0x98, 0x48, 0x57, 0x4b, 0x55, + 0x60, 0xd8, 0x20, 0xff, 0x30, 0x01, 0x4b, 0x53, + 0x62, 0x18, 0x20, 0xff, 0x30, 0x01, 0x4b, 0x51, + 0x62, 0x58, 0x20, 0x03, 0x4b, 0x52, 0x75, 0x18, + 0x20, 0x0e, 0x4b, 0x51, 0x75, 0x58, 0x20, 0x04, + 0x4b, 0x4f, 0x75, 0x98, 0x20, 0x03, 0x4b, 0x4e, + 0x75, 0xd8, 0x20, 0x00, 0x4b, 0x4d, 0x60, 0x18, + 0x20, 0x00, 0x4b, 0x4d, 0x60, 0x18, 0x20, 0x0d, + 0x23, 0x19, 0x06, 0x9b, 0x63, 0x18, 0x22, 0x00, + 0x2a, 0x20, 0xdb, 0x04, 0xe0, 0x21, 0x1c, 0x50, + 0x06, 0x02, 0x0e, 0x12, 0xe7, 0xf8, 0x25, 0x00, + 0x00, 0x93, 0x4e, 0x46, 0x50, 0xf5, 0x25, 0xff, + 0x4b, 0x45, 0x54, 0x9d, 0x01, 0x15, 0x4b, 0x45, + 0x18, 0xec, 0x01, 0x15, 0x4b, 0x44, 0x18, 0xe8, + 0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc4, 0x20, + 0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc4, 0x20, + 0x25, 0x00, 0xc0, 0x20, 0x25, 0x00, 0xc0, 0x20, + 0x25, 0x00, 0xc0, 0x20, 0x25, 0x00, 0xc0, 0x20, + 0xe7, 0xdd, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, + 0xe0, 0x0b, 0x1c, 0x48, 0x04, 0x01, 0x0c, 0x09, + 0xe7, 0xf8, 0x23, 0x00, 0x00, 0x88, 0x4c, 0x2a, + 0x50, 0x23, 0x23, 0x00, 0x48, 0x35, 0x54, 0x43, + 0xe7, 0xf3, 0x4c, 0x35, 0x94, 0x00, 0x22, 0x00, + 0x2a, 0x10, 0xdb, 0x04, 0xe0, 0x0f, 0x1c, 0x50, + 0x06, 0x02, 0x0e, 0x12, 0xe7, 0xf8, 0x20, 0x00, + 0x00, 0x93, 0x4c, 0x30, 0x50, 0xe0, 0x23, 0xff, + 0x48, 0x2f, 0x54, 0x83, 0x20, 0x00, 0x00, 0x93, + 0x9c, 0x00, 0x50, 0xe0, 0xe7, 0xef, 0x21, 0x00, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xdb, 0x04, + 0xe0, 0x2a, 0x1c, 0x48, 0x04, 0x01, 0x0c, 0x09, + 0xe7, 0xf6, 0x23, 0x00, 0x00, 0x88, 0x4c, 0x1a, + 0x50, 0x23, 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x18, + 0x19, 0x1c, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xe3, + 0x60, 0x18, 0x20, 0x00, 0x4b, 0x14, 0x18, 0x5c, + 0x23, 0x01, 0x02, 0xdb, 0x18, 0xe3, 0x70, 0x18, + 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x11, 0x50, 0xe0, + 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x0f, 0x19, 0x1c, + 0x23, 0x01, 0x02, 0x9b, 0x18, 0xe3, 0x60, 0x18, + 0x20, 0x00, 0x4b, 0x0c, 0x18, 0x5c, 0x23, 0x01, + 0x02, 0xdb, 0x18, 0xe3, 0x70, 0x18, 0xe7, 0xd4, + 0x20, 0x00, 0xb0, 0x01, 0xe7, 0x39, 0xb0, 0x01, + 0xe7, 0x37, 0x00, 0x00, 0x2e, 0x08, 0xb0, 0x58, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0xaf, 0xfc, + 0x2e, 0x08, 0xb0, 0x08, 0x9e, 0x00, 0x04, 0x80, + 0x2e, 0x08, 0x9d, 0xfc, 0x2e, 0x08, 0xa6, 0xfc, + 0x9e, 0x00, 0x04, 0xa0, 0x2e, 0x08, 0x9c, 0x48, + 0x2e, 0x08, 0x9c, 0x4c, 0x2e, 0x08, 0x9c, 0x50, + 0x2e, 0x08, 0x9d, 0x10, 0x64, 0x00, 0x08, 0x00, + 0x64, 0x00, 0x10, 0x00, 0x2e, 0x08, 0xb9, 0x60, + 0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x9c, 0xd0, + 0x2e, 0x08, 0x9d, 0x30, 0xb4, 0xb0, 0x1c, 0x07, + 0x1c, 0x0a, 0x06, 0x11, 0x0e, 0x09, 0x29, 0x20, + 0xdb, 0x02, 0x20, 0xa2, 0xbc, 0xb0, 0x47, 0x70, + 0x00, 0x88, 0x4b, 0x0a, 0x58, 0x18, 0x1c, 0x05, + 0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x68, 0xe8, + 0x1c, 0x04, 0xd1, 0x01, 0x20, 0xb6, 0xe7, 0xf1, + 0x68, 0x60, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, + 0x08, 0x80, 0x60, 0x38, 0x20, 0x00, 0xe7, 0xe9, + 0xe7, 0xe8, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xc8, + 0xb5, 0xff, 0xb0, 0x82, 0x9a, 0x04, 0x06, 0x11, + 0x0e, 0x09, 0x91, 0x00, 0x9b, 0x05, 0x06, 0x18, + 0x0e, 0x00, 0x90, 0x01, 0xb0, 0x83, 0x99, 0x03, + 0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x05, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x05, 0x28, 0x00, 0xd0, 0x64, 0x98, 0x05, + 0x23, 0x0d, 0x06, 0x9b, 0x42, 0xd8, 0xd3, 0x02, + 0x20, 0xb4, 0xb0, 0x05, 0xe7, 0xf0, 0x99, 0x06, + 0x23, 0xff, 0x33, 0x81, 0x42, 0x99, 0xd2, 0x02, + 0x20, 0xb5, 0xb0, 0x05, 0xe7, 0xe8, 0x99, 0x03, + 0x00, 0x88, 0x49, 0x2c, 0x58, 0x08, 0x90, 0x02, + 0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x05, + 0xe7, 0xde, 0x99, 0x06, 0x00, 0x88, 0x1f, 0xc1, + 0x39, 0x05, 0x91, 0x00, 0x9e, 0x05, 0x98, 0x05, + 0x1d, 0xc5, 0x35, 0x05, 0x60, 0x35, 0x99, 0x06, + 0x60, 0x71, 0x20, 0x00, 0x60, 0xb0, 0x98, 0x04, + 0x28, 0x10, 0xd1, 0x0a, 0x98, 0x02, 0x68, 0x84, + 0x98, 0x02, 0x30, 0x18, 0x90, 0x01, 0x1c, 0x2a, + 0x99, 0x00, 0x98, 0x01, 0xf0, 0x00, 0xfc, 0x86, + 0xe0, 0x25, 0x98, 0x04, 0x28, 0x20, 0xd1, 0x1f, + 0x98, 0x02, 0x68, 0xc0, 0x1c, 0x07, 0xd1, 0x02, + 0x20, 0xb6, 0xb0, 0x05, 0xe7, 0xb8, 0x78, 0xb8, + 0x08, 0x40, 0x00, 0x40, 0x70, 0xb8, 0x69, 0x3c, + 0x1d, 0xf8, 0x30, 0x05, 0x90, 0x01, 0x68, 0xb8, + 0x28, 0x00, 0xd1, 0x00, 0x60, 0xbd, 0x1c, 0x2a, + 0x99, 0x00, 0x98, 0x01, 0xf0, 0x00, 0xfc, 0x6a, + 0x68, 0x79, 0x18, 0x40, 0x60, 0x78, 0x78, 0x78, + 0x99, 0x03, 0xf0, 0x00, 0xf8, 0xb9, 0xe0, 0x02, + 0x20, 0xbc, 0xb0, 0x05, 0xe7, 0x9c, 0x68, 0xa0, + 0x28, 0x00, 0xd0, 0x01, 0x68, 0xa4, 0xe7, 0xfa, + 0x60, 0xa6, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x93, + 0x20, 0xb4, 0xb0, 0x05, 0xe7, 0x90, 0xb0, 0x03, + 0xb0, 0x02, 0xe7, 0x8d, 0x2e, 0x08, 0x9b, 0xc8, + 0xb5, 0xff, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x16, + 0x0e, 0x36, 0x9b, 0x04, 0x06, 0x18, 0x0e, 0x00, + 0x90, 0x00, 0xb0, 0x83, 0x27, 0x00, 0x2e, 0x20, + 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x04, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb0, + 0x49, 0x45, 0x58, 0x08, 0x1c, 0x04, 0xd1, 0x02, + 0x20, 0xb0, 0xb0, 0x04, 0xe7, 0xf3, 0x78, 0xe0, + 0x28, 0x00, 0xd1, 0x73, 0x98, 0x03, 0x28, 0x20, + 0xd1, 0x19, 0x68, 0xe0, 0x1c, 0x07, 0xd1, 0x02, + 0x20, 0xb6, 0xb0, 0x04, 0xe7, 0xe7, 0x69, 0x38, + 0x49, 0x3c, 0x60, 0x48, 0x48, 0x3b, 0x68, 0x40, + 0x68, 0x00, 0x60, 0xb8, 0x1d, 0xf8, 0x30, 0x05, + 0x90, 0x02, 0x20, 0x01, 0x90, 0x00, 0x48, 0x37, + 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, 0x1f, 0xc1, + 0x39, 0x19, 0x91, 0x01, 0xe0, 0x1d, 0x98, 0x03, + 0x28, 0x10, 0xd1, 0x17, 0x68, 0xa0, 0x49, 0x31, + 0x60, 0x48, 0x48, 0x30, 0x68, 0x40, 0x68, 0x00, + 0x61, 0x20, 0x48, 0x2e, 0x68, 0x40, 0x68, 0x00, + 0x61, 0x60, 0x1d, 0xe0, 0x30, 0x11, 0x90, 0x02, + 0x48, 0x2a, 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, + 0x1f, 0xc1, 0x39, 0x21, 0x91, 0x01, 0x20, 0x00, + 0x90, 0x00, 0xe0, 0x02, 0x20, 0xbc, 0xb0, 0x04, + 0xe7, 0xb5, 0x48, 0x24, 0x68, 0x40, 0x68, 0x80, + 0x28, 0x00, 0xd0, 0x37, 0x25, 0x00, 0x48, 0x21, + 0x68, 0x40, 0x68, 0x02, 0x99, 0x01, 0x98, 0x02, + 0xf0, 0x00, 0xfb, 0xe8, 0x19, 0x45, 0x48, 0x1d, + 0x68, 0x40, 0x49, 0x1c, 0x60, 0x08, 0x48, 0x1b, + 0x68, 0x00, 0x68, 0x80, 0x49, 0x19, 0x60, 0x48, + 0x48, 0x18, 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, + 0x1f, 0xc1, 0x39, 0x05, 0x91, 0x01, 0x48, 0x15, + 0x68, 0x40, 0x68, 0x80, 0x28, 0x00, 0xd1, 0xe2, + 0x20, 0x00, 0x49, 0x12, 0x68, 0x09, 0x60, 0x88, + 0x48, 0x10, 0x68, 0x40, 0x99, 0x04, 0x60, 0x08, + 0x48, 0x0e, 0x68, 0x40, 0x68, 0x40, 0x99, 0x05, + 0x60, 0x08, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x06, + 0x60, 0x7d, 0x78, 0x78, 0x1c, 0x31, 0xf0, 0x00, + 0xf8, 0x13, 0xe0, 0x00, 0xe0, 0x05, 0x20, 0x00, + 0xb0, 0x04, 0xe7, 0x78, 0x20, 0xb4, 0xb0, 0x04, + 0xe7, 0x75, 0x20, 0xbc, 0xb0, 0x04, 0xe7, 0x72, + 0xb0, 0x03, 0xb0, 0x01, 0xe7, 0x6f, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9d, 0xf4, + 0xb5, 0xf3, 0x98, 0x00, 0x06, 0x02, 0x0e, 0x12, + 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0xb0, 0x81, + 0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x01, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0xa0, 0x4b, 0x14, 0x58, 0x18, 0x1c, 0x05, + 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x01, 0xe7, 0xf3, + 0x68, 0xe8, 0x1c, 0x01, 0xd1, 0x02, 0x20, 0xb6, + 0xb0, 0x01, 0xe7, 0xed, 0x11, 0x10, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x00, 0x28, 0x00, 0xd1, 0x04, + 0x68, 0x48, 0x40, 0xd0, 0x06, 0x07, 0x0e, 0x3f, + 0xe0, 0x09, 0x68, 0x48, 0x07, 0x16, 0x0f, 0x36, + 0x40, 0xf0, 0x68, 0x4e, 0x40, 0xd6, 0x1c, 0x33, + 0x18, 0xc0, 0x06, 0x07, 0x0e, 0x3f, 0x70, 0x0f, + 0x70, 0x4a, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xd3, + 0xb0, 0x01, 0xe7, 0xd1, 0x2e, 0x08, 0x9b, 0xc8, + 0xb4, 0xb0, 0x1c, 0x03, 0x1c, 0x0a, 0x06, 0x11, + 0x0e, 0x09, 0x29, 0x20, 0xdb, 0x02, 0x20, 0xa2, + 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x88, 0x4d, 0x08, + 0x58, 0x28, 0x1c, 0x04, 0xd1, 0x01, 0x20, 0xb0, + 0xe7, 0xf6, 0x68, 0xe0, 0x1c, 0x07, 0xd1, 0x01, + 0x20, 0xb6, 0xe7, 0xf1, 0x78, 0x78, 0x70, 0x18, + 0x20, 0x00, 0xe7, 0xed, 0xe7, 0xec, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0xc8, 0xb5, 0xf3, 0xb0, 0x81, + 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, + 0x99, 0x02, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x86, + 0x20, 0x00, 0x90, 0x00, 0x2d, 0x20, 0xdd, 0x05, + 0x20, 0xa2, 0xb0, 0x07, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0xa8, 0x49, 0xa2, + 0x58, 0x08, 0x90, 0x04, 0x28, 0x00, 0xd1, 0x02, + 0x20, 0xb0, 0xb0, 0x07, 0xe7, 0xf2, 0x00, 0xa8, + 0x49, 0x9e, 0x68, 0x09, 0x18, 0x40, 0x90, 0x05, + 0x00, 0xe8, 0x1b, 0x40, 0x00, 0x80, 0x49, 0x9c, + 0x68, 0x09, 0x18, 0x46, 0x98, 0x06, 0x28, 0x00, + 0xd0, 0x73, 0x28, 0x01, 0xd0, 0x4f, 0x28, 0x02, + 0xd0, 0x00, 0xe1, 0x1d, 0x98, 0x04, 0x69, 0x00, + 0x60, 0x70, 0x98, 0x04, 0x78, 0x40, 0x06, 0xc0, + 0x0e, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x13, + 0xd0, 0x16, 0x27, 0x00, 0x2f, 0x20, 0xdb, 0x04, + 0xe0, 0x11, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, + 0xe7, 0xf8, 0x48, 0x8e, 0x5d, 0xc0, 0x42, 0xa8, + 0xd1, 0x08, 0x00, 0xb8, 0x49, 0x8c, 0x58, 0x08, + 0x30, 0x01, 0x78, 0x01, 0x23, 0x80, 0x43, 0xdb, + 0x40, 0x19, 0x70, 0x01, 0xe7, 0xed, 0xe0, 0x1e, + 0x27, 0x00, 0x2f, 0x10, 0xdb, 0x04, 0xe0, 0x1a, + 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, + 0x48, 0x84, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x11, + 0x00, 0xb8, 0x49, 0x83, 0x58, 0x08, 0x30, 0x01, + 0x78, 0x01, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x19, + 0x70, 0x01, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x02, + 0xd1, 0x00, 0xe0, 0x00, 0xe7, 0xe4, 0x88, 0x30, + 0x4b, 0x7a, 0x40, 0x18, 0x80, 0x30, 0x98, 0x05, + 0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x99, 0x05, 0x60, 0x08, 0xe0, 0xd3, 0x98, 0x05, + 0x68, 0x00, 0x4b, 0x75, 0x40, 0x18, 0x99, 0x05, + 0x60, 0x08, 0x20, 0x00, 0x60, 0xb0, 0x20, 0x00, + 0x70, 0xf0, 0x20, 0x00, 0x60, 0xf0, 0x98, 0x04, + 0x78, 0x40, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, + 0x98, 0x02, 0x28, 0x13, 0xd0, 0x16, 0x27, 0x00, + 0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x11, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x63, + 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x08, 0x00, 0xb8, + 0xe0, 0x00, 0xe0, 0x27, 0x49, 0x60, 0x58, 0x0c, + 0x78, 0x60, 0x23, 0x80, 0x43, 0x18, 0x70, 0x60, + 0xe7, 0xed, 0xe0, 0x1e, 0x27, 0x00, 0x2f, 0x10, + 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x59, 0x5d, 0xc0, + 0x42, 0xa8, 0xd1, 0x11, 0x00, 0xb8, 0x49, 0x58, + 0x58, 0x08, 0x30, 0x01, 0x78, 0x01, 0x23, 0x80, + 0x43, 0xdb, 0x40, 0x19, 0x70, 0x01, 0x98, 0x00, + 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, + 0x98, 0x00, 0x28, 0x02, 0xd1, 0x00, 0xe0, 0x00, + 0xe7, 0xe4, 0xe0, 0x88, 0x98, 0x05, 0x68, 0x00, + 0x4b, 0x4f, 0x40, 0x18, 0x99, 0x05, 0x60, 0x08, + 0x20, 0x00, 0x60, 0xb0, 0x20, 0x00, 0x70, 0xf0, + 0x20, 0x00, 0x60, 0xf0, 0x98, 0x04, 0x78, 0x40, + 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, 0x98, 0x04, + 0x78, 0x40, 0x21, 0x20, 0x40, 0x01, 0x91, 0x03, + 0x98, 0x02, 0x28, 0x13, 0xd0, 0x4c, 0x27, 0x00, + 0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x47, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x3b, + 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x3e, 0x00, 0xb8, + 0x49, 0x39, 0x58, 0x0c, 0x20, 0x80, 0x70, 0x60, + 0x99, 0x03, 0x1c, 0x20, 0xf7, 0xfd, 0xfb, 0x30, + 0x78, 0xa0, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x28, + 0x6a, 0xe0, 0x22, 0x00, 0x92, 0x01, 0x99, 0x01, + 0x29, 0x08, 0xdb, 0x06, 0xe0, 0x1f, 0x99, 0x01, + 0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x91, 0x01, + 0xe7, 0xf5, 0x99, 0x01, 0x00, 0x89, 0x18, 0x09, + 0x68, 0x49, 0x9a, 0x01, 0x00, 0x92, 0x18, 0x12, + 0x64, 0x51, 0x22, 0x00, 0x99, 0x01, 0x00, 0x89, + 0x18, 0x09, 0x62, 0x4a, 0x99, 0x01, 0x00, 0x89, + 0x18, 0x09, 0x6c, 0x49, 0x29, 0x00, 0xd0, 0x05, + 0x9a, 0x01, 0x21, 0x80, 0x41, 0x11, 0x88, 0x02, + 0x43, 0x11, 0x80, 0x01, 0xe7, 0xdf, 0x88, 0x01, + 0x80, 0x41, 0x78, 0xa0, 0x23, 0x20, 0x40, 0x18, + 0xd0, 0x04, 0x98, 0x04, 0x68, 0xc1, 0x1c, 0x20, + 0xf0, 0x00, 0xfa, 0x3d, 0xe7, 0xb7, 0xe0, 0x1e, + 0x27, 0x00, 0x2f, 0x10, 0xdb, 0x04, 0xe0, 0x1a, + 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, + 0x48, 0x16, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x11, + 0x00, 0xb8, 0x49, 0x15, 0x58, 0x0c, 0x20, 0x80, + 0x70, 0x60, 0x99, 0x03, 0x1c, 0x20, 0xf7, 0xfd, + 0xfa, 0xe3, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x02, + 0xd1, 0x00, 0xe0, 0x00, 0xe7, 0xe4, 0xe0, 0x02, + 0x20, 0xbc, 0xb0, 0x07, 0xe6, 0xbe, 0x98, 0x06, + 0x99, 0x04, 0x70, 0xc8, 0x20, 0x00, 0xb0, 0x07, + 0xe6, 0xb8, 0xb0, 0x06, 0xb0, 0x01, 0xe6, 0xb5, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x38, + 0x2e, 0x08, 0x9b, 0x30, 0x2e, 0x08, 0x9d, 0x10, + 0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x9d, 0x30, + 0x2e, 0x08, 0x9c, 0xd0, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xb4, 0x90, 0x1c, 0x03, + 0x1c, 0x0a, 0x06, 0x11, 0x0e, 0x09, 0x29, 0x20, + 0xdd, 0x02, 0x20, 0xa2, 0xbc, 0x90, 0x47, 0x70, + 0x00, 0x88, 0x4c, 0x05, 0x58, 0x20, 0x1c, 0x07, + 0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x78, 0xf8, + 0x70, 0x18, 0x20, 0x00, 0xe7, 0xf2, 0xe7, 0xf1, + 0x2e, 0x08, 0x9b, 0xc8, 0xb4, 0x90, 0x1c, 0x02, + 0x1c, 0x0f, 0x06, 0x38, 0x16, 0x04, 0x2a, 0x02, + 0xda, 0x02, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70, + 0x2c, 0x01, 0xd1, 0x01, 0x21, 0x28, 0xe0, 0x09, + 0x2c, 0x02, 0xd1, 0x01, 0x21, 0x20, 0xe0, 0x05, + 0x2c, 0x00, 0xd1, 0x01, 0x21, 0x0c, 0xe0, 0x01, + 0x20, 0x00, 0xe7, 0xef, 0x00, 0x50, 0x18, 0x80, + 0x01, 0x80, 0x18, 0x41, 0x1c, 0xc8, 0x08, 0x81, + 0x1c, 0x08, 0xe7, 0xe7, 0xe7, 0xe6, 0xb5, 0xf7, + 0x1c, 0x07, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x11, + 0x0e, 0x09, 0x91, 0x00, 0xb0, 0x84, 0x99, 0x04, + 0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x05, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x99, 0x04, 0x00, 0x88, 0x49, 0x29, 0x58, 0x08, + 0x1c, 0x06, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x05, + 0xe7, 0xf2, 0x2f, 0x00, 0xd1, 0x02, 0x20, 0xb4, + 0xb0, 0x05, 0xe7, 0xed, 0x4b, 0x24, 0x42, 0x9f, + 0xd1, 0x0a, 0x78, 0xf0, 0x28, 0x00, 0xd0, 0x02, + 0x20, 0xbc, 0xb0, 0x05, 0xe7, 0xe4, 0x20, 0x00, + 0x60, 0xf0, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0xdf, + 0x68, 0xf0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0xb4, + 0xb0, 0x05, 0xe7, 0xd9, 0x99, 0x06, 0x00, 0x88, + 0x1f, 0xc1, 0x39, 0x19, 0x91, 0x02, 0x20, 0xff, + 0x30, 0x81, 0x90, 0x01, 0x99, 0x02, 0x98, 0x01, + 0x42, 0x81, 0xda, 0x02, 0x20, 0xb5, 0xb0, 0x05, + 0xe7, 0xca, 0x1c, 0x3c, 0x60, 0xf4, 0x37, 0x14, + 0x1c, 0x3d, 0x37, 0x0c, 0x60, 0x2f, 0x99, 0x06, + 0x60, 0x69, 0x20, 0x00, 0x60, 0xa8, 0x97, 0x03, + 0x20, 0x00, 0x60, 0xe0, 0x1d, 0xe0, 0x30, 0x05, + 0x9a, 0x03, 0x99, 0x02, 0xf0, 0x00, 0xf9, 0x56, + 0x90, 0x00, 0x20, 0x00, 0x70, 0xa0, 0x98, 0x00, + 0x60, 0x60, 0x9a, 0x03, 0x60, 0xa2, 0x61, 0x25, + 0x99, 0x04, 0x20, 0x54, 0xf7, 0xff, 0xfd, 0xa0, + 0xb0, 0x05, 0xe7, 0xa9, 0xb0, 0x04, 0xb0, 0x01, + 0xe7, 0xa6, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xc8, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0xff, 0xb0, 0x83, + 0x9a, 0x05, 0x06, 0x11, 0x0e, 0x09, 0x91, 0x00, + 0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, + 0x98, 0x0c, 0x06, 0x01, 0x0e, 0x09, 0x91, 0x02, + 0xb0, 0x85, 0x99, 0x05, 0x29, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x08, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x08, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0xb4, 0xb0, 0x08, 0xe7, 0xf5, + 0x99, 0x05, 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, + 0x49, 0x83, 0x68, 0x09, 0x18, 0x47, 0x98, 0x08, + 0x4b, 0x82, 0x42, 0x98, 0xd1, 0x73, 0x99, 0x05, + 0x00, 0x88, 0x49, 0x81, 0x58, 0x08, 0x1c, 0x05, + 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x08, 0xe7, 0xe1, + 0x68, 0xe8, 0x28, 0x00, 0xd1, 0x02, 0x78, 0xe8, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0xbc, 0xb0, 0x08, + 0xe7, 0xd8, 0x78, 0xa8, 0x28, 0x00, 0xd0, 0x54, + 0x20, 0x00, 0x42, 0x80, 0xd0, 0x1d, 0x24, 0x00, + 0x2c, 0x20, 0xdb, 0x04, 0xe0, 0x18, 0x1c, 0x60, + 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x48, 0x73, + 0x5d, 0x00, 0x99, 0x05, 0x42, 0x88, 0xd1, 0x0e, + 0x20, 0x01, 0x40, 0xa0, 0x43, 0xc0, 0x49, 0x70, + 0x68, 0x09, 0x40, 0x08, 0x49, 0x6e, 0x60, 0x08, + 0x20, 0x00, 0x00, 0xa1, 0x4a, 0x6d, 0x50, 0x50, + 0x20, 0xff, 0x49, 0x6a, 0x55, 0x08, 0xe7, 0xe6, + 0xe0, 0x33, 0x4a, 0x6b, 0x92, 0x03, 0x7e, 0x38, + 0x1c, 0x06, 0x28, 0xff, 0xd0, 0x14, 0x20, 0x00, + 0x00, 0xb1, 0x4a, 0x68, 0x50, 0x50, 0x20, 0x01, + 0x40, 0xb0, 0x43, 0xc0, 0x49, 0x66, 0x68, 0x09, + 0x40, 0x08, 0x49, 0x65, 0x60, 0x08, 0x20, 0xff, + 0x76, 0x38, 0x21, 0xff, 0x48, 0x63, 0x55, 0x81, + 0x21, 0x00, 0x00, 0xb0, 0x9a, 0x03, 0x50, 0x11, + 0x7e, 0x78, 0x1c, 0x06, 0x28, 0xff, 0xd0, 0x14, + 0x21, 0x00, 0x00, 0xb0, 0x4a, 0x5b, 0x50, 0x11, + 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, 0x49, 0x5a, + 0x68, 0x09, 0x40, 0x08, 0x49, 0x58, 0x60, 0x08, + 0x20, 0xff, 0x76, 0x78, 0x20, 0xff, 0x49, 0x51, + 0x55, 0x88, 0x21, 0x00, 0x00, 0xb0, 0x9a, 0x03, + 0x50, 0x11, 0x20, 0x00, 0x99, 0x05, 0x00, 0x89, + 0x4a, 0x4b, 0x50, 0x50, 0x24, 0x00, 0x2c, 0x0c, + 0xdb, 0x06, 0xe0, 0x09, 0xe0, 0x00, 0xe0, 0x0e, + 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf6, + 0x20, 0x00, 0x19, 0x39, 0x73, 0x08, 0xe7, 0xf7, + 0x20, 0x00, 0x83, 0x38, 0x20, 0x00, 0x70, 0xf8, + 0x20, 0x00, 0xb0, 0x08, 0xe7, 0x66, 0x99, 0x05, + 0x00, 0x88, 0x49, 0x3f, 0x58, 0x08, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0xb0, 0xb0, 0x08, 0xe7, 0x5d, + 0x99, 0x07, 0x29, 0x11, 0xdb, 0x02, 0x99, 0x07, + 0x29, 0x13, 0xdd, 0x02, 0x20, 0xb1, 0xb0, 0x08, + 0xe7, 0x54, 0x99, 0x09, 0x00, 0x88, 0x1f, 0xc1, + 0x39, 0x21, 0x91, 0x01, 0x20, 0xff, 0x30, 0x81, + 0x90, 0x00, 0x99, 0x01, 0x98, 0x00, 0x42, 0x81, + 0xda, 0x02, 0x20, 0xb5, 0xb0, 0x08, 0xe7, 0x45, + 0x9d, 0x08, 0x98, 0x08, 0x30, 0x1c, 0x90, 0x08, + 0x98, 0x08, 0x90, 0x04, 0x98, 0x08, 0x30, 0x0c, + 0x90, 0x08, 0x98, 0x08, 0x90, 0x02, 0x9a, 0x02, + 0x98, 0x04, 0x60, 0x02, 0x99, 0x09, 0x98, 0x04, + 0x60, 0x41, 0x20, 0x00, 0x99, 0x04, 0x60, 0x88, + 0x20, 0x00, 0x61, 0xa8, 0x1d, 0xe8, 0x30, 0x11, + 0x9a, 0x02, 0x99, 0x01, 0xf0, 0x00, 0xf8, 0x56, + 0x20, 0x00, 0x70, 0x28, 0x98, 0x06, 0x99, 0x07, + 0x43, 0x08, 0x70, 0x68, 0x20, 0x00, 0x70, 0xa8, + 0x20, 0x02, 0x70, 0xe8, 0x20, 0x00, 0x71, 0x28, + 0x98, 0x04, 0x60, 0xa8, 0x20, 0x00, 0x60, 0xe8, + 0x9a, 0x02, 0x61, 0x2a, 0x9a, 0x02, 0x61, 0x6a, + 0x99, 0x05, 0x00, 0x88, 0x49, 0x16, 0x50, 0x0d, + 0x20, 0x00, 0x60, 0xf8, 0x88, 0x38, 0x4b, 0x1c, + 0x40, 0x18, 0x80, 0x38, 0x20, 0x00, 0x60, 0xb8, + 0x9a, 0x02, 0x60, 0x7a, 0x98, 0x06, 0x99, 0x07, + 0x43, 0x08, 0x70, 0xb8, 0x24, 0x00, 0x2c, 0x0c, + 0xdb, 0x04, 0xe0, 0x07, 0x1c, 0x60, 0x06, 0x04, + 0x0e, 0x24, 0xe7, 0xf8, 0x20, 0x00, 0x19, 0x39, + 0x74, 0x08, 0xe7, 0xf7, 0x20, 0x00, 0x83, 0x38, + 0x20, 0x00, 0x70, 0xf8, 0x20, 0xff, 0x76, 0x38, + 0x20, 0xff, 0x76, 0x78, 0x20, 0x00, 0xb0, 0x08, + 0xe6, 0xec, 0xb0, 0x05, 0xb0, 0x03, 0xe6, 0xe9, + 0x2e, 0x08, 0x9b, 0x30, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9d, 0x10, + 0x2e, 0x08, 0x9c, 0x48, 0x2e, 0x08, 0x9c, 0x50, + 0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x9c, 0xd0, + 0x2e, 0x08, 0x9c, 0x4c, 0x2e, 0x08, 0x9d, 0x30, + 0xff, 0xff, 0xfb, 0xff, 0xb4, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0x1c, 0x13, 0x21, 0x00, 0x68, 0x22, + 0x2a, 0x00, 0xd0, 0x00, 0x60, 0x13, 0x1d, 0xd8, + 0x30, 0xb9, 0x60, 0x18, 0x33, 0xc0, 0x31, 0x01, + 0x3f, 0xc0, 0x2f, 0xc0, 0xd8, 0xf7, 0x20, 0x00, + 0x60, 0x18, 0x60, 0x23, 0x31, 0x01, 0x1c, 0x08, + 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0xb4, 0x90, + 0x1c, 0x03, 0x1c, 0x0a, 0x6b, 0x18, 0x68, 0xd1, + 0x68, 0x07, 0x2f, 0x00, 0xd0, 0x0c, 0x68, 0x07, + 0x60, 0x0f, 0x68, 0x41, 0x68, 0x57, 0x68, 0x84, + 0x19, 0x3f, 0x60, 0x57, 0x27, 0x00, 0x60, 0x07, + 0x27, 0x00, 0x60, 0x47, 0x27, 0x00, 0x60, 0x87, + 0x6a, 0xc7, 0x2f, 0x00, 0xd0, 0x0c, 0x6a, 0xc7, + 0x60, 0x0f, 0x6b, 0x01, 0x68, 0x57, 0x6b, 0x44, + 0x19, 0x3f, 0x60, 0x57, 0x27, 0x00, 0x62, 0xc7, + 0x27, 0x00, 0x63, 0x07, 0x27, 0x00, 0x63, 0x47, + 0x60, 0xd1, 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, + 0x20, 0x00, 0x49, 0x01, 0x70, 0x08, 0x47, 0x70, + 0x2e, 0x08, 0xb9, 0x80, 0xb5, 0xff, 0xb0, 0x82, + 0x9b, 0x05, 0x06, 0x18, 0x16, 0x00, 0x90, 0x00, + 0x98, 0x0c, 0x06, 0x01, 0x16, 0x09, 0x91, 0x01, + 0x98, 0x00, 0x28, 0x1f, 0xdd, 0x05, 0x20, 0xaf, + 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x48, 0x37, 0x78, 0x00, 0x28, 0x00, + 0xd0, 0x03, 0x20, 0xd2, 0xb0, 0x02, 0xe7, 0xf4, + 0xe0, 0x64, 0x20, 0xff, 0x49, 0x32, 0x70, 0x08, + 0x49, 0x32, 0x98, 0x00, 0xf0, 0x0a, 0xff, 0x04, + 0x9a, 0x04, 0x2a, 0x00, 0xd9, 0x52, 0x20, 0xff, + 0x49, 0x2f, 0x70, 0x08, 0x9d, 0x02, 0x98, 0x0b, + 0x99, 0x01, 0x18, 0x44, 0x99, 0x01, 0x20, 0xc0, + 0x1a, 0x40, 0x9a, 0x04, 0x42, 0x90, 0xd9, 0x01, + 0x9f, 0x04, 0xe0, 0x02, 0x99, 0x01, 0x20, 0xc0, + 0x1a, 0x47, 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, + 0x23, 0xfe, 0xf0, 0x05, 0xfa, 0xa5, 0x1c, 0x06, + 0x2e, 0xd0, 0xd1, 0x0a, 0x20, 0x03, 0xf0, 0x04, + 0xf9, 0xa9, 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, + 0x23, 0xfe, 0xf0, 0x05, 0xfa, 0x99, 0x1c, 0x06, + 0xe7, 0xf2, 0x98, 0x02, 0x19, 0xc0, 0x90, 0x02, + 0x9a, 0x04, 0x1b, 0xd2, 0x92, 0x04, 0x9d, 0x0b, + 0x9c, 0x03, 0x9b, 0x00, 0x1c, 0x3a, 0x1c, 0x21, + 0x1c, 0x28, 0xf0, 0x05, 0xfa, 0x89, 0x1c, 0x06, + 0x2e, 0xd0, 0xd1, 0x0a, 0x20, 0x03, 0xf0, 0x04, + 0xf9, 0x8d, 0x9b, 0x00, 0x1c, 0x3a, 0x1c, 0x21, + 0x1c, 0x28, 0xf0, 0x05, 0xfa, 0x7d, 0x1c, 0x06, + 0xe7, 0xf2, 0x99, 0x03, 0x29, 0x20, 0xd3, 0x04, + 0x99, 0x01, 0x18, 0x78, 0x99, 0x03, 0x18, 0x41, + 0x91, 0x03, 0x48, 0x0b, 0x78, 0x00, 0x28, 0x00, + 0xd0, 0x03, 0x20, 0x03, 0xf0, 0x04, 0xf9, 0x76, + 0xe7, 0xf7, 0xe7, 0xa9, 0x20, 0x00, 0x49, 0x04, + 0x70, 0x08, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x90, + 0xb0, 0x02, 0xe7, 0x8e, 0xe7, 0x8d, 0x00, 0x00, + 0x2e, 0x08, 0x20, 0x20, 0x2e, 0x01, 0x8b, 0x35, + 0x2e, 0x08, 0xb9, 0x80, 0xb5, 0xff, 0x1c, 0x0f, + 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, 0x9b, 0x03, + 0x06, 0x1d, 0x0e, 0x2d, 0x2c, 0x1f, 0xdb, 0x04, + 0x20, 0xb3, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x04, 0x3a, 0x0c, 0x12, 0x2d, 0x01, + 0xd1, 0x73, 0x20, 0x01, 0x03, 0x40, 0x40, 0x10, + 0xd0, 0x0a, 0x4b, 0x6f, 0x40, 0x1a, 0x48, 0x6f, + 0x68, 0x00, 0x68, 0x00, 0x23, 0x02, 0x43, 0xdb, + 0x40, 0x18, 0x4b, 0x6c, 0x68, 0x1b, 0x60, 0x18, + 0x20, 0x01, 0x02, 0x40, 0x40, 0x10, 0xd0, 0x0a, + 0x4b, 0x69, 0x40, 0x1a, 0x48, 0x67, 0x68, 0x00, + 0x68, 0x00, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, + 0x4b, 0x64, 0x68, 0x1b, 0x60, 0x18, 0x20, 0x01, + 0x05, 0x00, 0x40, 0x38, 0xd0, 0x08, 0x48, 0x63, + 0x68, 0x00, 0x69, 0x80, 0x23, 0x01, 0x05, 0x1b, + 0x43, 0x18, 0x4b, 0x60, 0x68, 0x1b, 0x61, 0x98, + 0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x08, + 0x48, 0x5c, 0x68, 0x00, 0x69, 0x80, 0x23, 0x01, + 0x05, 0x5b, 0x43, 0x18, 0x4b, 0x59, 0x68, 0x1b, + 0x61, 0x98, 0x0a, 0x12, 0x48, 0x55, 0x68, 0x00, + 0x68, 0x00, 0x43, 0x90, 0x4b, 0x53, 0x68, 0x1b, + 0x60, 0x18, 0x48, 0x52, 0x68, 0x00, 0x68, 0x00, + 0x4b, 0x53, 0x65, 0x18, 0x48, 0x51, 0x68, 0x00, + 0x77, 0x04, 0x20, 0x09, 0x04, 0x80, 0x40, 0x38, + 0xd0, 0x35, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, + 0xe0, 0x31, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x20, 0x01, 0x40, 0x88, 0x9b, 0x00, + 0x40, 0x18, 0xd0, 0x27, 0x20, 0x01, 0x05, 0x40, + 0x40, 0x38, 0xd0, 0x0e, 0x00, 0xc8, 0x1a, 0x40, + 0x00, 0x80, 0x4b, 0x46, 0x68, 0x1b, 0x5a, 0x18, + 0x23, 0xff, 0x33, 0x01, 0x43, 0x18, 0x00, 0xcb, + 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x41, 0x68, 0x36, + 0x52, 0xf0, 0x20, 0x01, 0x04, 0x80, 0x40, 0x38, + 0xd0, 0x10, 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, + 0xe0, 0x00, 0xe0, 0x0d, 0x4b, 0x3b, 0x68, 0x1b, + 0x5a, 0x18, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, + 0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x37, + 0x68, 0x36, 0x52, 0xf0, 0xe7, 0xcd, 0xe0, 0x5c, + 0x2d, 0x02, 0xd1, 0x5a, 0x0a, 0x12, 0x48, 0x2f, + 0x68, 0x00, 0x68, 0x00, 0x43, 0x10, 0x4b, 0x2d, + 0x68, 0x1b, 0x60, 0x18, 0x48, 0x2b, 0x68, 0x00, + 0x68, 0x00, 0x4b, 0x2d, 0x65, 0x18, 0x20, 0x01, + 0x05, 0x00, 0x40, 0x38, 0xd0, 0x07, 0x48, 0x29, + 0x68, 0x00, 0x69, 0x80, 0x4b, 0x2a, 0x40, 0x18, + 0x4b, 0x26, 0x68, 0x1b, 0x61, 0x98, 0x20, 0x01, + 0x05, 0x40, 0x40, 0x38, 0xd0, 0x07, 0x48, 0x23, + 0x68, 0x00, 0x69, 0x80, 0x4b, 0x25, 0x40, 0x18, + 0x4b, 0x20, 0x68, 0x1b, 0x61, 0x98, 0x21, 0x00, + 0x29, 0x20, 0xdb, 0x04, 0xe0, 0x31, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x09, + 0x04, 0x80, 0x40, 0x38, 0xd0, 0x28, 0x20, 0x01, + 0x40, 0x88, 0x9b, 0x00, 0x40, 0x18, 0xd0, 0x23, + 0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x0d, + 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, 0x4b, 0x15, + 0x68, 0x1b, 0x5a, 0x18, 0x4b, 0x16, 0x40, 0x18, + 0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x11, + 0x68, 0x36, 0x52, 0xf0, 0x20, 0x01, 0x04, 0x80, + 0x40, 0x38, 0xd0, 0x0d, 0x00, 0xc8, 0x1a, 0x40, + 0x00, 0x80, 0x4b, 0x0c, 0x68, 0x1b, 0x5a, 0x18, + 0x4b, 0x05, 0x40, 0x18, 0x00, 0xcb, 0x1a, 0x5b, + 0x00, 0x9b, 0x4e, 0x08, 0x68, 0x36, 0x52, 0xf0, + 0xe7, 0xcd, 0x20, 0x00, 0xe7, 0x15, 0xe7, 0x14, + 0xff, 0xff, 0xfd, 0xff, 0x2e, 0x08, 0xb9, 0x84, + 0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x9b, 0x78, + 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x9b, 0x30, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xb5, 0x80, 0x1c, 0x07, + 0x48, 0x17, 0x68, 0x01, 0x20, 0x00, 0xf0, 0x13, + 0xfc, 0xa3, 0x60, 0x38, 0x48, 0x14, 0x68, 0x00, + 0x1d, 0x01, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x9c, + 0x60, 0x78, 0x48, 0x11, 0x68, 0x00, 0x1d, 0xc1, + 0x31, 0x05, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x94, + 0x60, 0xf8, 0x48, 0x0d, 0x68, 0x00, 0x1d, 0xc1, + 0x31, 0x09, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x8c, + 0x61, 0x38, 0x48, 0x09, 0x68, 0x00, 0x1d, 0xc1, + 0x31, 0x0d, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x84, + 0x61, 0x78, 0x48, 0x05, 0x68, 0x00, 0x1d, 0xc1, + 0x31, 0x01, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x7c, + 0x60, 0xb8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x9b, 0x78, 0xb5, 0xf0, 0x1c, 0x07, + 0xb0, 0x82, 0x26, 0x00, 0x89, 0xb8, 0x23, 0x08, + 0x40, 0x18, 0xd0, 0x08, 0x48, 0x59, 0x6e, 0xc2, + 0x48, 0x58, 0x6f, 0x01, 0x48, 0x57, 0x6a, 0x00, + 0xf7, 0xfd, 0xff, 0x5c, 0x1c, 0x06, 0x89, 0xb8, + 0x23, 0x10, 0x40, 0x18, 0xd0, 0x02, 0x48, 0x53, + 0x69, 0x40, 0x1c, 0x06, 0x89, 0xb8, 0x07, 0xc0, + 0x0f, 0xc0, 0xd0, 0x21, 0x48, 0x50, 0x68, 0xc0, + 0x90, 0x00, 0x68, 0x78, 0x02, 0x40, 0x99, 0x00, + 0x1a, 0x08, 0x90, 0x01, 0x98, 0x01, 0x21, 0x33, + 0x06, 0x49, 0x65, 0xc8, 0x98, 0x00, 0x21, 0x33, + 0x06, 0x49, 0x66, 0x08, 0x98, 0x01, 0x49, 0x48, + 0x60, 0x88, 0x98, 0x00, 0x49, 0x46, 0x60, 0xc8, + 0x20, 0x01, 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, + 0x20, 0x00, 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, + 0x89, 0xb8, 0x23, 0x02, 0x43, 0x18, 0x81, 0xb8, + 0x89, 0xb8, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x3e, + 0x48, 0x3d, 0x68, 0x80, 0x1f, 0xc4, 0x3c, 0xff, + 0x3c, 0xfa, 0x68, 0x38, 0x02, 0x40, 0x1a, 0x25, + 0x48, 0x38, 0x60, 0x45, 0x48, 0x37, 0x60, 0x84, + 0x20, 0x33, 0x06, 0x40, 0x65, 0x45, 0x20, 0x33, + 0x06, 0x40, 0x65, 0x84, 0x1b, 0x60, 0x38, 0xc0, + 0x21, 0x33, 0x06, 0x49, 0x66, 0x88, 0x21, 0x00, + 0x48, 0x32, 0xf7, 0xfd, 0xfb, 0x89, 0x48, 0x32, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x00, 0xe7, 0xfa, + 0x48, 0x30, 0x68, 0x01, 0x23, 0xff, 0x33, 0x01, + 0x43, 0x19, 0x60, 0x01, 0x48, 0x2e, 0x6d, 0x80, + 0x49, 0x2d, 0x65, 0x88, 0x48, 0x2c, 0x6b, 0xc0, + 0x23, 0x01, 0x07, 0x9b, 0x40, 0x18, 0xd0, 0x00, + 0xe7, 0xf8, 0x20, 0x33, 0x06, 0x40, 0x66, 0x45, + 0x20, 0x33, 0x06, 0x40, 0x66, 0x84, 0x21, 0x00, + 0x20, 0xff, 0xf7, 0xfd, 0xfb, 0x69, 0x48, 0x20, + 0x60, 0x05, 0x48, 0x1f, 0x60, 0x44, 0x89, 0xb8, + 0x23, 0x04, 0x40, 0x18, 0xd0, 0x21, 0x68, 0xb8, + 0x28, 0x00, 0xd1, 0x06, 0x48, 0x1f, 0x68, 0x01, + 0x23, 0x02, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, + 0xe0, 0x17, 0x69, 0x38, 0x49, 0x1a, 0x65, 0x88, + 0x69, 0x38, 0x68, 0xb9, 0x02, 0x49, 0x18, 0x40, + 0x49, 0x17, 0x65, 0xc8, 0x20, 0x03, 0x02, 0x00, + 0x49, 0x15, 0x67, 0x48, 0x20, 0x02, 0x49, 0x14, + 0x67, 0x88, 0x20, 0x40, 0x49, 0x12, 0x66, 0x08, + 0x48, 0x12, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, + 0x60, 0x01, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, + 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x60, 0x38, + 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d, + 0x06, 0x9b, 0x1a, 0xc0, 0x60, 0x78, 0x48, 0x0a, + 0x43, 0x30, 0x60, 0xb8, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0f, 0x80, + 0x2e, 0x08, 0xb9, 0x88, 0x00, 0x00, 0x80, 0x0f, + 0xcc, 0x00, 0x05, 0x00, 0x66, 0x00, 0x00, 0xe0, + 0x66, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0xf0, + 0xcc, 0x00, 0x00, 0x00, 0xb5, 0xf3, 0x1c, 0x02, + 0xb0, 0x81, 0x68, 0x93, 0x68, 0x54, 0x21, 0x00, + 0x1d, 0xd8, 0x30, 0xb9, 0x1b, 0x00, 0x06, 0x05, + 0x0e, 0x2d, 0x2d, 0x12, 0xda, 0x12, 0x21, 0x00, + 0x42, 0xa9, 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x78, 0x26, + 0x34, 0x01, 0x98, 0x02, 0x54, 0x46, 0xe7, 0xf6, + 0x68, 0x1b, 0x1d, 0x18, 0x90, 0x00, 0x98, 0x00, + 0x78, 0x80, 0x18, 0xc4, 0x1c, 0x0f, 0x2f, 0x12, + 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0xe7, 0xf8, 0x78, 0x26, 0x34, 0x01, + 0x98, 0x02, 0x55, 0xc6, 0xe7, 0xf6, 0x20, 0x00, + 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0xb4, 0xf0, + 0x1c, 0x07, 0x1c, 0x0d, 0x1c, 0x14, 0xb0, 0x82, + 0x20, 0x00, 0x70, 0x20, 0x78, 0x78, 0x23, 0x80, + 0x40, 0x18, 0xd0, 0x03, 0x20, 0xb1, 0xb0, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x78, 0xba, 0x20, 0x40, + 0x40, 0x10, 0xd0, 0x2a, 0x07, 0x12, 0x0f, 0x12, + 0x07, 0xd0, 0x0f, 0xc0, 0xd0, 0x25, 0x20, 0x40, + 0x70, 0x20, 0x35, 0x0a, 0x21, 0x00, 0x1d, 0xf8, + 0x30, 0x0d, 0x90, 0x01, 0x1d, 0xf8, 0x30, 0x1d, + 0x90, 0x00, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, + 0xe0, 0x14, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x78, 0x2e, 0x35, 0x01, 0x98, 0x00, + 0x78, 0x03, 0x30, 0x01, 0x90, 0x00, 0x40, 0x33, + 0x98, 0x01, 0x78, 0x06, 0x30, 0x01, 0x90, 0x01, + 0x42, 0xb3, 0xd0, 0x02, 0x20, 0x00, 0x70, 0x20, + 0xe0, 0x00, 0xe7, 0xea, 0x20, 0x00, 0xb0, 0x02, + 0xe7, 0xce, 0x20, 0xb1, 0xb0, 0x02, 0xe7, 0xcb, + 0xb0, 0x02, 0xe7, 0xc9, 0xb5, 0xf7, 0x1c, 0x07, + 0xb0, 0x8d, 0x20, 0x00, 0x9a, 0x0f, 0x70, 0x10, + 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x05, + 0x20, 0xb1, 0xb0, 0x0d, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x78, 0xb8, 0x90, 0x05, + 0x98, 0x05, 0x23, 0x40, 0x40, 0x18, 0xd0, 0x73, + 0x98, 0x05, 0x07, 0x00, 0x0f, 0x00, 0x90, 0x05, + 0x98, 0x05, 0x23, 0x02, 0x40, 0x18, 0xd1, 0x03, + 0x98, 0x05, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x68, + 0x99, 0x0e, 0x79, 0x48, 0x23, 0x3e, 0x40, 0x18, + 0x90, 0x0c, 0x78, 0xf8, 0x90, 0x04, 0x98, 0x04, + 0x01, 0x00, 0x4b, 0x81, 0x18, 0xc0, 0x90, 0x02, + 0x98, 0x02, 0x68, 0x00, 0x90, 0x01, 0x78, 0x7c, + 0x23, 0xbf, 0x40, 0x1c, 0x23, 0xfe, 0x40, 0x1c, + 0x20, 0x00, 0x90, 0x03, 0x98, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x99, 0x0c, 0x42, 0x88, 0xd0, 0x08, + 0x06, 0x20, 0x0e, 0x00, 0x24, 0x01, 0x43, 0x04, + 0x20, 0x01, 0x90, 0x03, 0x23, 0xdf, 0x40, 0x1c, + 0xe0, 0x06, 0x20, 0x02, 0x40, 0x20, 0xd0, 0x03, + 0x70, 0x7c, 0x20, 0x00, 0xb0, 0x0d, 0xe7, 0xbd, + 0x23, 0xfd, 0x40, 0x1c, 0x98, 0x05, 0x23, 0x04, + 0x40, 0x18, 0xd0, 0x73, 0x6a, 0xfd, 0x98, 0x03, + 0x28, 0x00, 0xd0, 0x14, 0x26, 0x00, 0x2e, 0x08, + 0xdb, 0x04, 0xe0, 0x0e, 0x1c, 0x70, 0x06, 0x06, + 0x0e, 0x36, 0xe7, 0xf8, 0x00, 0xb0, 0x19, 0x40, + 0x68, 0x40, 0x00, 0xb1, 0x19, 0x49, 0x64, 0x48, + 0x20, 0x00, 0x00, 0xb1, 0x19, 0x49, 0x62, 0x48, + 0xe7, 0xf0, 0x88, 0x28, 0x80, 0x68, 0x20, 0x20, + 0x40, 0x20, 0xd1, 0x3e, 0x99, 0x0e, 0x79, 0xc8, + 0x09, 0x40, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x0a, + 0x99, 0x0e, 0x79, 0xc8, 0x06, 0xc0, 0x0e, 0xc0, + 0x90, 0x09, 0x98, 0x0a, 0x30, 0x01, 0x06, 0x06, + 0x0e, 0x36, 0x2e, 0x08, 0xdb, 0x04, 0xe0, 0x10, + 0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0xe7, 0xf8, + 0x20, 0x00, 0x00, 0xb1, 0x19, 0x49, 0xe0, 0x01, + 0xe0, 0x9d, 0xe0, 0x9c, 0x64, 0x48, 0x88, 0x68, + 0x21, 0x80, 0x41, 0x31, 0x43, 0x88, 0x80, 0x68, + 0xe7, 0xee, 0x98, 0x0a, 0x00, 0x80, 0x19, 0x40, + 0x6c, 0x41, 0x98, 0x09, 0x00, 0x80, 0x4a, 0x4b, + 0x58, 0x10, 0x40, 0x08, 0x99, 0x0a, 0x00, 0x89, + 0x19, 0x49, 0x64, 0x48, 0x06, 0x20, 0x0e, 0x00, + 0x24, 0x20, 0x43, 0x04, 0x98, 0x01, 0x0a, 0x00, + 0x02, 0x00, 0x90, 0x01, 0x98, 0x01, 0x99, 0x0c, + 0x43, 0x08, 0x90, 0x01, 0x98, 0x01, 0x99, 0x02, + 0x60, 0x08, 0x78, 0x38, 0x23, 0x80, 0x40, 0x18, + 0xd0, 0x19, 0x99, 0x0e, 0x7b, 0x08, 0x07, 0x42, + 0x0f, 0x52, 0x92, 0x07, 0x99, 0x0e, 0x7b, 0x08, + 0x08, 0xc0, 0x06, 0x02, 0x0e, 0x12, 0x92, 0x08, + 0x1d, 0xe9, 0x31, 0x3d, 0x91, 0x06, 0x99, 0x06, + 0x9a, 0x08, 0x5c, 0x88, 0x49, 0x36, 0x9a, 0x07, + 0x5c, 0x89, 0xe0, 0x00, 0xe0, 0x4e, 0x40, 0x08, + 0x99, 0x06, 0x9a, 0x08, 0x54, 0x88, 0x99, 0x0e, + 0x79, 0x88, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x00, + 0x98, 0x00, 0x49, 0x30, 0x40, 0xc1, 0x91, 0x00, + 0x99, 0x0e, 0x79, 0x88, 0x09, 0x40, 0x06, 0x02, + 0x0e, 0x12, 0x92, 0x0b, 0x9a, 0x0b, 0x00, 0x90, + 0x19, 0x40, 0x6c, 0x40, 0x99, 0x00, 0x40, 0x08, + 0xd0, 0x33, 0x06, 0x20, 0x0e, 0x00, 0x24, 0x40, + 0x43, 0x04, 0x9a, 0x0b, 0x00, 0x90, 0x19, 0x40, + 0x6c, 0x40, 0x99, 0x00, 0x40, 0x41, 0x00, 0x90, + 0x19, 0x40, 0x64, 0x41, 0x9a, 0x0b, 0x00, 0x90, + 0x19, 0x40, 0x6a, 0x40, 0x99, 0x00, 0x43, 0x01, + 0x00, 0x90, 0x19, 0x40, 0x62, 0x41, 0x9a, 0x0b, + 0x00, 0x90, 0x19, 0x40, 0x6c, 0x40, 0x28, 0x00, + 0xd1, 0x17, 0x88, 0x68, 0x9a, 0x0b, 0x21, 0x80, + 0x41, 0x11, 0x43, 0x88, 0x80, 0x68, 0x88, 0x68, + 0x28, 0x00, 0xd1, 0x0e, 0x06, 0x20, 0x0e, 0x00, + 0x24, 0x02, 0x43, 0x04, 0x23, 0xfe, 0x40, 0x1c, + 0x98, 0x0c, 0x30, 0x02, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x0c, 0x98, 0x0c, 0x23, 0x3e, 0x40, 0x18, + 0x90, 0x0c, 0xe0, 0x0a, 0x06, 0x20, 0x0e, 0x00, + 0x24, 0x40, 0x43, 0x04, 0x23, 0xfe, 0x40, 0x1c, + 0x98, 0x0c, 0x1c, 0x41, 0x98, 0x04, 0xf0, 0x00, + 0xf8, 0x13, 0x9a, 0x0f, 0x70, 0x14, 0x70, 0x7c, + 0x20, 0x00, 0xb0, 0x0d, 0xe6, 0xe2, 0x20, 0xb1, + 0xb0, 0x0d, 0xe6, 0xdf, 0xb0, 0x0d, 0xe6, 0xdd, + 0x64, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x20, 0x90, + 0x2e, 0x08, 0x21, 0x10, 0x80, 0x00, 0x00, 0x00, + 0xb5, 0xf3, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f, + 0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, 0x00, 0xf8, + 0x4b, 0x13, 0x18, 0xc5, 0x01, 0x38, 0x4b, 0x13, + 0x18, 0xc4, 0x01, 0x38, 0x4b, 0x12, 0x18, 0xc2, + 0x68, 0x10, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, + 0x60, 0x10, 0x2e, 0x3e, 0xdc, 0x15, 0x68, 0x20, + 0x1c, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x31, + 0x60, 0x21, 0x68, 0x28, 0x1c, 0x01, 0x0a, 0x09, + 0x02, 0x09, 0x23, 0x3e, 0x43, 0x19, 0x60, 0x29, + 0x68, 0x10, 0x23, 0x40, 0x43, 0x18, 0x60, 0x10, + 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0xbd, 0xe7, 0xf9, 0xe7, 0xf8, + 0x64, 0x00, 0x10, 0x00, 0x64, 0x00, 0x08, 0x00, + 0x64, 0x00, 0x08, 0x08, 0xb5, 0xf3, 0xb0, 0x93, + 0x98, 0x13, 0x69, 0x00, 0x90, 0x01, 0x98, 0x01, + 0x78, 0x40, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x05, + 0x20, 0xbe, 0xb0, 0x13, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x78, 0x80, + 0x90, 0x08, 0x98, 0x08, 0x23, 0x40, 0x40, 0x18, + 0xd0, 0x73, 0x98, 0x08, 0x23, 0x20, 0x40, 0x18, + 0xd0, 0x6f, 0x98, 0x01, 0x6b, 0x07, 0x98, 0x01, + 0x79, 0xc0, 0x00, 0x80, 0x49, 0x76, 0x58, 0x08, + 0x90, 0x00, 0x98, 0x00, 0x68, 0xc0, 0x1c, 0x06, + 0xd1, 0x02, 0x20, 0xb6, 0xb0, 0x13, 0xe7, 0xe1, + 0x78, 0xb0, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x02, + 0x20, 0xb6, 0xb0, 0x13, 0xe7, 0xda, 0xa9, 0x11, + 0x1c, 0x30, 0xf0, 0x00, 0xf9, 0x2b, 0x90, 0x02, + 0x98, 0x11, 0x28, 0x00, 0xd1, 0x02, 0x98, 0x02, + 0xb0, 0x13, 0xe7, 0xcf, 0x98, 0x11, 0x90, 0x0e, + 0x20, 0x01, 0x90, 0x0b, 0x98, 0x13, 0x88, 0x40, + 0x90, 0x0d, 0x98, 0x13, 0x68, 0x40, 0x90, 0x06, + 0x98, 0x13, 0x68, 0x81, 0x91, 0x10, 0x99, 0x10, + 0x1d, 0xc8, 0x30, 0xb9, 0x90, 0x05, 0x98, 0x05, + 0x99, 0x06, 0x1a, 0x40, 0x04, 0x04, 0x0c, 0x24, + 0x99, 0x14, 0x79, 0x88, 0x90, 0x03, 0x98, 0x03, + 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x0a, 0x98, 0x0a, + 0x49, 0x5a, 0x40, 0xc1, 0x91, 0x0a, 0x98, 0x03, + 0x09, 0x40, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x09, + 0x98, 0x09, 0x00, 0x80, 0x19, 0xc0, 0x6b, 0x80, + 0x99, 0x0a, 0x40, 0x08, 0xd0, 0x02, 0x20, 0xb1, + 0xb0, 0x13, 0xe7, 0x9f, 0x20, 0xb8, 0x90, 0x0c, + 0x98, 0x11, 0x30, 0x08, 0x90, 0x04, 0x20, 0x00, + 0x90, 0x07, 0x98, 0x07, 0x28, 0x00, 0xd0, 0x10, + 0x99, 0x10, 0x68, 0x09, 0x91, 0x10, 0x99, 0x10, + 0x1d, 0x08, 0x90, 0x12, 0x98, 0x12, 0x78, 0x80, + 0x99, 0x10, 0x18, 0x40, 0x90, 0x06, 0x98, 0x12, + 0x78, 0x81, 0x20, 0xc0, 0x1a, 0x40, 0x04, 0x04, + 0x0c, 0x24, 0x98, 0x0d, 0x42, 0x84, 0xdb, 0x05, + 0xe0, 0x00, 0xe0, 0x7c, 0x9c, 0x0d, 0x20, 0x00, + 0x90, 0x0d, 0xe0, 0x06, 0x98, 0x0d, 0x1b, 0x00, + 0x04, 0x00, 0x0c, 0x00, 0x90, 0x0d, 0x20, 0x01, + 0x90, 0x07, 0x98, 0x0c, 0x42, 0xa0, 0xda, 0x2e, + 0x25, 0x00, 0x98, 0x0c, 0x42, 0x85, 0xdb, 0x04, + 0xe0, 0x0c, 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, + 0xe7, 0xf7, 0x98, 0x06, 0x78, 0x01, 0x30, 0x01, + 0x90, 0x06, 0x98, 0x04, 0x70, 0x01, 0x30, 0x01, + 0x90, 0x04, 0xe7, 0xf2, 0x98, 0x0c, 0x1a, 0x20, + 0x04, 0x04, 0x0c, 0x24, 0xa9, 0x11, 0x1c, 0x30, + 0xf0, 0x00, 0xf8, 0xac, 0x90, 0x02, 0x98, 0x11, + 0x28, 0x00, 0xd1, 0x08, 0x98, 0x0e, 0x60, 0xb0, + 0x68, 0x70, 0x99, 0x0b, 0x18, 0x40, 0x60, 0x70, + 0x98, 0x02, 0xb0, 0x13, 0xe7, 0x4a, 0x98, 0x0b, + 0x30, 0x01, 0x90, 0x0b, 0x20, 0xb8, 0x90, 0x0c, + 0x98, 0x11, 0x30, 0x08, 0x90, 0x04, 0x25, 0x00, + 0x42, 0xa5, 0xdb, 0x04, 0xe0, 0x0c, 0x1c, 0x68, + 0x06, 0x05, 0x0e, 0x2d, 0xe7, 0xf8, 0x98, 0x06, + 0x78, 0x01, 0x30, 0x01, 0x90, 0x06, 0x98, 0x04, + 0x70, 0x01, 0x30, 0x01, 0x90, 0x04, 0xe7, 0xf2, + 0x98, 0x0c, 0x1b, 0x00, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x0c, 0x98, 0x0d, 0x28, 0x00, 0xd1, 0x90, + 0x6b, 0x39, 0x91, 0x0f, 0x6a, 0xf8, 0x28, 0x00, + 0xd1, 0x02, 0x98, 0x0e, 0x62, 0xf8, 0xe0, 0x05, + 0x98, 0x0e, 0x99, 0x0f, 0x60, 0x08, 0x98, 0x0e, + 0x6d, 0xb9, 0x60, 0x08, 0x98, 0x09, 0x00, 0x80, + 0x19, 0xc0, 0x6b, 0x80, 0x99, 0x0a, 0x43, 0x01, + 0x98, 0x09, 0x00, 0x80, 0x19, 0xc0, 0x63, 0x81, + 0x6b, 0x78, 0x99, 0x0b, 0x18, 0x40, 0x63, 0x78, + 0x20, 0x00, 0x99, 0x11, 0x60, 0x08, 0x98, 0x11, + 0x63, 0x38, 0x98, 0x0e, 0x30, 0x04, 0x65, 0xb8, + 0x98, 0x02, 0xb0, 0x13, 0xe7, 0x02, 0x20, 0xb1, + 0xb0, 0x13, 0xe6, 0xff, 0xb0, 0x13, 0xe6, 0xfd, + 0x2e, 0x08, 0x9b, 0xc8, 0x80, 0x00, 0x00, 0x00, + 0xb4, 0xf0, 0x1c, 0x01, 0x78, 0x88, 0x23, 0x20, + 0x40, 0x18, 0xd0, 0x42, 0x79, 0xc8, 0x00, 0x80, + 0x4b, 0x21, 0x58, 0x1d, 0x6b, 0x0a, 0x68, 0xef, + 0x68, 0x10, 0x28, 0x00, 0xd0, 0x17, 0x68, 0xfe, + 0x68, 0x10, 0x60, 0x30, 0x68, 0x50, 0x60, 0xf8, + 0x68, 0x78, 0x68, 0x93, 0x18, 0xc0, 0x60, 0x78, + 0x20, 0x00, 0x60, 0x10, 0x20, 0x00, 0x60, 0x50, + 0x20, 0x00, 0x60, 0x90, 0x68, 0x78, 0x78, 0x3b, + 0x42, 0x98, 0xd9, 0x04, 0x78, 0xb8, 0x23, 0x02, + 0x43, 0xdb, 0x40, 0x18, 0x70, 0xb8, 0x6a, 0xd0, + 0x60, 0x10, 0x6b, 0x10, 0x60, 0x50, 0x6b, 0x50, + 0x60, 0x90, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04, + 0xe0, 0x0e, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, + 0xe7, 0xf8, 0x00, 0xa0, 0x18, 0x80, 0x6b, 0x80, + 0x00, 0xa3, 0x18, 0x9b, 0x60, 0xd8, 0x23, 0x00, + 0x00, 0xa0, 0x18, 0x80, 0x63, 0x83, 0xe7, 0xf0, + 0x20, 0x00, 0x62, 0xd0, 0x20, 0x00, 0x63, 0x10, + 0x20, 0x00, 0x63, 0x50, 0x20, 0x00, 0xbc, 0xf0, + 0x47, 0x70, 0x20, 0xb1, 0xe7, 0xfb, 0xe7, 0xfa, + 0x2e, 0x08, 0x9b, 0xc8, 0xb4, 0x90, 0x1c, 0x02, + 0x1c, 0x0f, 0x78, 0x14, 0x68, 0x90, 0x1c, 0x01, + 0xd1, 0x08, 0x20, 0x00, 0x60, 0x38, 0x78, 0x90, + 0x23, 0x01, 0x43, 0x18, 0x70, 0x90, 0x20, 0xb7, + 0xbc, 0x90, 0x47, 0x70, 0x68, 0x08, 0x60, 0x90, + 0x20, 0x00, 0x60, 0x48, 0x60, 0x39, 0x68, 0x50, + 0x38, 0x01, 0x60, 0x50, 0x68, 0x50, 0x42, 0xa0, + 0xd1, 0x02, 0x20, 0xbf, 0xe7, 0xf0, 0xe0, 0x01, + 0x20, 0x00, 0xe7, 0xed, 0xe7, 0xec, 0x00, 0x00, + 0x1c, 0x01, 0x22, 0x00, 0x6a, 0x50, 0x68, 0x02, + 0x60, 0x0a, 0x4a, 0x05, 0x6f, 0xd2, 0x60, 0x8a, + 0x4a, 0x04, 0x68, 0x12, 0x60, 0x4a, 0x22, 0x1d, + 0x02, 0x92, 0x68, 0x12, 0x60, 0xca, 0x47, 0x70, + 0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0x20, 0x24, + 0x1c, 0x01, 0x48, 0x02, 0x60, 0x01, 0x20, 0x00, + 0x47, 0x70, 0xe7, 0xfd, 0x66, 0x00, 0x01, 0x00, + 0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, 0x62, 0x01, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, + 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 0x23, 0x7f, + 0x03, 0x9b, 0x40, 0x18, 0x03, 0x8a, 0x43, 0x10, + 0x22, 0x33, 0x06, 0x52, 0x62, 0xd0, 0x20, 0x00, + 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x20, 0x33, + 0x06, 0x40, 0x6a, 0xc0, 0x23, 0x03, 0x03, 0x1b, + 0x40, 0x18, 0x43, 0x08, 0x22, 0x33, 0x06, 0x52, + 0x62, 0xd0, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, + 0x1c, 0x01, 0x06, 0x0a, 0x0e, 0x12, 0x2a, 0x00, + 0xd0, 0x06, 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, + 0x23, 0x01, 0x05, 0x5b, 0x43, 0x18, 0xe0, 0x04, + 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 0x4b, 0x04, + 0x40, 0x18, 0x23, 0x33, 0x06, 0x5b, 0x62, 0xd8, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, + 0xff, 0xdf, 0xff, 0xff, 0x48, 0x04, 0x69, 0x80, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x20, 0xff, + 0x47, 0x70, 0x20, 0x00, 0xe7, 0xfc, 0xe7, 0xfb, + 0x66, 0x00, 0x00, 0x80, 0xb4, 0x80, 0x1c, 0x01, + 0x06, 0x0f, 0x0e, 0x3f, 0x4a, 0x08, 0x2f, 0x00, + 0xd0, 0x03, 0x68, 0x10, 0x23, 0x01, 0x43, 0x18, + 0xe0, 0x02, 0x68, 0x10, 0x08, 0x40, 0x00, 0x40, + 0x68, 0x13, 0x43, 0x18, 0x60, 0x10, 0x20, 0x00, + 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x98, 0xb4, 0x80, 0x1c, 0x07, + 0x1c, 0x0a, 0x4b, 0x06, 0x40, 0x1a, 0x4b, 0x06, + 0x40, 0x1f, 0x0b, 0x10, 0x02, 0x39, 0x43, 0x08, + 0x49, 0x04, 0x61, 0xc8, 0x20, 0x00, 0xbc, 0x80, + 0x47, 0x70, 0xe7, 0xfc, 0x01, 0xff, 0xf0, 0x00, + 0x00, 0xff, 0xf0, 0x00, 0x66, 0x00, 0x00, 0x80, + 0x48, 0x01, 0x69, 0xc0, 0x47, 0x70, 0xe7, 0xfd, + 0x66, 0x00, 0x00, 0x80, 0x1c, 0x01, 0x48, 0x07, + 0x68, 0x02, 0x4b, 0x07, 0x40, 0x1a, 0x60, 0x02, + 0x23, 0x01, 0x05, 0x9b, 0x42, 0x99, 0xd1, 0x03, + 0x48, 0x02, 0x68, 0x02, 0x43, 0x0a, 0x60, 0x02, + 0x47, 0x70, 0x00, 0x00, 0x66, 0x00, 0x00, 0x2c, + 0xff, 0xbf, 0xff, 0xff, 0x1c, 0x01, 0x20, 0x33, + 0x06, 0x40, 0x67, 0x41, 0x47, 0x70, 0x1c, 0x01, + 0x20, 0x33, 0x06, 0x40, 0x67, 0x81, 0x47, 0x70, + 0xb5, 0x90, 0x4c, 0x21, 0x20, 0x01, 0x60, 0x20, + 0xf0, 0x12, 0xff, 0xa4, 0x48, 0x1f, 0x69, 0x84, + 0x27, 0x00, 0x2f, 0x04, 0xd3, 0x04, 0xe0, 0x06, + 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, + 0x21, 0x00, 0xc4, 0x02, 0xe7, 0xf8, 0x20, 0x00, + 0x49, 0x18, 0x69, 0x49, 0x60, 0x08, 0x20, 0x00, + 0x49, 0x16, 0x69, 0x49, 0x60, 0x48, 0x20, 0x00, + 0x49, 0x14, 0x69, 0x49, 0x60, 0x88, 0x20, 0x00, + 0x49, 0x12, 0x69, 0x49, 0x60, 0xc8, 0x20, 0x00, + 0x49, 0x10, 0x69, 0x49, 0x61, 0x08, 0x20, 0x00, + 0x49, 0x0e, 0x69, 0x49, 0x61, 0x48, 0x20, 0x00, + 0x49, 0x0c, 0x69, 0x49, 0x61, 0x88, 0x20, 0x00, + 0x49, 0x0a, 0x69, 0x49, 0x61, 0xc8, 0x20, 0x00, + 0x49, 0x08, 0x69, 0x49, 0x62, 0x08, 0x20, 0x00, + 0x49, 0x06, 0x69, 0x49, 0x62, 0x48, 0x20, 0x18, + 0x49, 0x04, 0x69, 0x49, 0x62, 0x88, 0x20, 0x00, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xfb, + 0x70, 0x00, 0x00, 0x38, 0x2e, 0x08, 0x20, 0x28, + 0xb5, 0xff, 0x1c, 0x0f, 0xb0, 0x81, 0x9c, 0x01, + 0x69, 0x20, 0x28, 0x08, 0xd1, 0x01, 0x08, 0x7f, + 0x00, 0x7f, 0x6b, 0xa0, 0x9a, 0x03, 0x43, 0x50, + 0x19, 0xc6, 0x69, 0x20, 0x00, 0x80, 0x49, 0x34, + 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, + 0x08, 0x76, 0x69, 0x20, 0x00, 0x80, 0x49, 0x31, + 0x58, 0x08, 0x43, 0x70, 0x90, 0x00, 0x69, 0xa0, + 0x99, 0x00, 0x09, 0x49, 0x18, 0x45, 0x6b, 0xe0, + 0x28, 0x00, 0xd1, 0x02, 0x03, 0x28, 0x0b, 0x00, + 0xe0, 0x01, 0x02, 0x28, 0x0a, 0x00, 0x1c, 0x05, + 0xf0, 0x12, 0xff, 0x42, 0xf0, 0x12, 0xff, 0x1e, + 0x48, 0x27, 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, + 0x00, 0xc0, 0x49, 0x25, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x40, 0x48, 0x23, 0x69, 0x80, 0x68, 0x00, + 0x01, 0x40, 0x09, 0x40, 0x49, 0x20, 0x69, 0x89, + 0x60, 0x08, 0x6b, 0xe0, 0x49, 0x1e, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x1e, 0x40, 0x19, 0x07, 0xc0, + 0x0c, 0x80, 0x43, 0x08, 0x49, 0x1a, 0x69, 0x89, + 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x21, + 0x1c, 0x20, 0xf0, 0x00, 0xfe, 0x51, 0x48, 0x16, + 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x16, 0x40, 0x18, + 0x02, 0x29, 0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, + 0x49, 0x11, 0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, + 0x48, 0x0f, 0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, + 0x09, 0x40, 0x99, 0x00, 0x06, 0xc9, 0x43, 0x08, + 0x49, 0x0b, 0x69, 0xc9, 0x60, 0x08, 0x99, 0x04, + 0x1c, 0x20, 0x22, 0x00, 0xf0, 0x00, 0xfe, 0xbc, + 0xf0, 0x00, 0xff, 0x9d, 0xf0, 0x12, 0xff, 0x14, + 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, + 0x2e, 0x03, 0xa8, 0x78, 0x2e, 0x03, 0xa8, 0xc8, + 0x2e, 0x08, 0x20, 0x28, 0xff, 0xff, 0xdf, 0xff, + 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0x1c, 0x0f, + 0xb0, 0x81, 0x9c, 0x01, 0x69, 0x20, 0x28, 0x08, + 0xd1, 0x01, 0x08, 0x7f, 0x00, 0x7f, 0x6b, 0xa0, + 0x9a, 0x03, 0x43, 0x50, 0x19, 0xc6, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x37, 0x58, 0x08, 0x23, 0x04, + 0x40, 0x18, 0xd0, 0x00, 0x08, 0x76, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x43, 0x70, + 0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x09, 0x49, + 0x18, 0x45, 0x6b, 0xe0, 0x28, 0x00, 0xd1, 0x02, + 0x03, 0x28, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x28, + 0x0a, 0x00, 0x1c, 0x05, 0xf0, 0x12, 0xfe, 0xc0, + 0xf0, 0x12, 0xfe, 0x9c, 0x48, 0x2a, 0x69, 0x80, + 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x01, + 0x43, 0x18, 0x49, 0x27, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x40, 0x6b, 0xe0, 0x49, 0x24, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x24, 0x40, 0x19, 0x07, 0xc0, + 0x0c, 0x80, 0x43, 0x08, 0x49, 0x20, 0x69, 0x89, + 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x48, 0x1e, + 0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, + 0x99, 0x00, 0x06, 0xc9, 0x43, 0x01, 0x48, 0x1a, + 0x69, 0x80, 0x60, 0x01, 0x1c, 0x21, 0x1c, 0x20, + 0xf0, 0x00, 0xfd, 0xca, 0x48, 0x16, 0x69, 0xc0, + 0x68, 0x00, 0x4b, 0x17, 0x40, 0x18, 0x02, 0x29, + 0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 0x49, 0x12, + 0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 0x48, 0x10, + 0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, + 0x49, 0x0d, 0x69, 0xc9, 0x60, 0x08, 0xf0, 0x00, + 0xff, 0x1e, 0xf0, 0x12, 0xfe, 0x73, 0x48, 0x0a, + 0x6b, 0x81, 0x1c, 0x20, 0xf0, 0x00, 0xfe, 0xf0, + 0x9b, 0x04, 0x60, 0x18, 0xf0, 0x12, 0xfe, 0x8c, + 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, + 0x2e, 0x03, 0xa8, 0x78, 0x2e, 0x03, 0xa8, 0xc8, + 0x2e, 0x08, 0x20, 0x28, 0xff, 0xff, 0xdf, 0xff, + 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0x1c, 0x0c, + 0x1c, 0x1f, 0xb0, 0x83, 0x9d, 0x03, 0x6b, 0x28, + 0x6a, 0xa9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, + 0x19, 0xe0, 0x99, 0x00, 0x42, 0x88, 0xd9, 0x01, + 0x98, 0x00, 0x1b, 0x07, 0x69, 0x28, 0x28, 0x08, + 0xd1, 0x02, 0x08, 0x7f, 0x08, 0x64, 0x00, 0x64, + 0x6b, 0xa8, 0x9a, 0x05, 0x43, 0x50, 0x19, 0x01, + 0x91, 0x01, 0x69, 0x28, 0x00, 0x80, 0x49, 0x38, + 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, + 0x99, 0x01, 0x08, 0x49, 0x91, 0x01, 0x69, 0x28, + 0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x99, 0x01, + 0x43, 0x48, 0x90, 0x02, 0x69, 0xa8, 0x99, 0x02, + 0x09, 0x49, 0x18, 0x46, 0x6b, 0xe8, 0x28, 0x00, + 0xd1, 0x02, 0x03, 0x30, 0x0b, 0x00, 0xe0, 0x01, + 0x02, 0x30, 0x0a, 0x00, 0x1c, 0x06, 0xf0, 0x12, + 0xfe, 0x27, 0xf0, 0x12, 0xfe, 0x03, 0x48, 0x2a, + 0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, + 0x49, 0x27, 0x69, 0x89, 0x60, 0x08, 0x48, 0x26, + 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, + 0x23, 0x02, 0x43, 0x18, 0x49, 0x22, 0x69, 0x89, + 0x60, 0x08, 0x07, 0x40, 0x6b, 0xe8, 0x49, 0x20, + 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1f, 0x40, 0x19, + 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 0x49, 0x1c, + 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, + 0x1c, 0x29, 0x1c, 0x28, 0xf0, 0x00, 0xfd, 0x34, + 0x48, 0x17, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x18, + 0x40, 0x18, 0x02, 0x31, 0x0a, 0x09, 0x00, 0x89, + 0x43, 0x08, 0x49, 0x13, 0x69, 0xc9, 0x60, 0x08, + 0x01, 0x80, 0x48, 0x11, 0x69, 0xc0, 0x68, 0x00, + 0x01, 0x40, 0x09, 0x40, 0x99, 0x02, 0x06, 0xc9, + 0x43, 0x08, 0x49, 0x0d, 0x69, 0xc9, 0x60, 0x08, + 0x99, 0x0c, 0x1c, 0x28, 0x22, 0x02, 0xf0, 0x00, + 0xfd, 0x9f, 0x48, 0x09, 0x69, 0x40, 0x62, 0x07, + 0xf0, 0x00, 0xfe, 0x7d, 0xf0, 0x12, 0xfd, 0xf4, + 0x20, 0x00, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x03, 0xe7, 0xf9, + 0x2e, 0x03, 0xa8, 0x78, 0x2e, 0x03, 0xa8, 0xc8, + 0x2e, 0x08, 0x20, 0x28, 0xff, 0xff, 0xdf, 0xff, + 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0xb0, 0x81, + 0x9f, 0x01, 0x6b, 0x78, 0x6a, 0xf9, 0x1a, 0x40, + 0x30, 0x01, 0x90, 0x00, 0x9a, 0x03, 0x9b, 0x04, + 0x18, 0xd0, 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, + 0x98, 0x00, 0x9a, 0x03, 0x1a, 0x83, 0x93, 0x04, + 0x69, 0x38, 0x28, 0x08, 0xd1, 0x03, 0x99, 0x02, + 0x08, 0x49, 0x00, 0x49, 0x91, 0x02, 0x6b, 0xb8, + 0x9a, 0x03, 0x43, 0x50, 0x99, 0x02, 0x18, 0x45, + 0x69, 0x38, 0x00, 0x80, 0x49, 0x3c, 0x58, 0x08, + 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, 0x08, 0x6d, + 0x69, 0x38, 0x00, 0x80, 0x49, 0x39, 0x58, 0x08, + 0x1c, 0x06, 0x43, 0x6e, 0x69, 0xb8, 0x09, 0x71, + 0x18, 0x44, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x02, + 0x03, 0x20, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x20, + 0x0a, 0x00, 0x1c, 0x04, 0xf0, 0x12, 0xfd, 0x90, + 0xf0, 0x12, 0xfd, 0x6c, 0x48, 0x30, 0x69, 0x80, + 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x49, 0x2e, + 0x69, 0x89, 0x60, 0x08, 0x48, 0x2c, 0x69, 0x80, + 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x03, + 0x43, 0x18, 0x49, 0x29, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x40, 0x6b, 0xf8, 0x49, 0x26, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x26, 0x40, 0x19, 0x07, 0xc0, + 0x0c, 0x80, 0x43, 0x08, 0x49, 0x22, 0x69, 0x89, + 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x39, + 0x1c, 0x38, 0xf0, 0x00, 0xfc, 0x9d, 0x99, 0x0a, + 0x1c, 0x38, 0x22, 0x03, 0xf0, 0x00, 0xfd, 0x20, + 0x69, 0xf8, 0x49, 0x1b, 0x69, 0x49, 0x61, 0x08, + 0x48, 0x19, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x1a, + 0x40, 0x18, 0x02, 0x21, 0x0a, 0x09, 0x00, 0x89, + 0x43, 0x08, 0x49, 0x15, 0x69, 0xc9, 0x60, 0x08, + 0x01, 0x80, 0x48, 0x13, 0x69, 0xc0, 0x68, 0x00, + 0x01, 0x40, 0x09, 0x40, 0x06, 0xf1, 0x43, 0x08, + 0x49, 0x0f, 0x69, 0xc9, 0x60, 0x08, 0x48, 0x0e, + 0x69, 0x40, 0x61, 0x84, 0x06, 0xf0, 0x0e, 0xc0, + 0x49, 0x0b, 0x69, 0x49, 0x61, 0x48, 0x9b, 0x04, + 0x48, 0x09, 0x69, 0x40, 0x62, 0x43, 0xf0, 0x00, + 0xfd, 0xda, 0xf0, 0x12, 0xfd, 0x51, 0x20, 0x00, + 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0x00, 0x00, + 0x2e, 0x03, 0xa8, 0x78, 0x2e, 0x03, 0xa8, 0xc8, + 0x2e, 0x08, 0x20, 0x28, 0xff, 0xff, 0xdf, 0xff, + 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xf3, 0xb0, 0x86, + 0x9f, 0x06, 0x99, 0x07, 0x68, 0x8c, 0x99, 0x07, + 0x68, 0xc8, 0x90, 0x03, 0x99, 0x07, 0x68, 0x0d, + 0x99, 0x07, 0x68, 0x49, 0x91, 0x02, 0x6b, 0x78, + 0x6a, 0xf9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x01, + 0x6b, 0x38, 0x6a, 0xb9, 0x1a, 0x40, 0x30, 0x01, + 0x90, 0x00, 0x99, 0x02, 0x98, 0x03, 0x18, 0x08, + 0x99, 0x01, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x01, + 0x99, 0x02, 0x1a, 0x40, 0x90, 0x03, 0x19, 0x28, + 0x99, 0x00, 0x42, 0x88, 0xd9, 0x01, 0x98, 0x00, + 0x1b, 0x44, 0x69, 0x38, 0x28, 0x08, 0xd1, 0x02, + 0x08, 0x64, 0x08, 0x6d, 0x00, 0x6d, 0x6b, 0xb8, + 0x99, 0x02, 0x43, 0x48, 0x19, 0x41, 0x91, 0x04, + 0x69, 0x38, 0x00, 0x80, 0x49, 0x41, 0x58, 0x08, + 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 0x99, 0x04, + 0x08, 0x49, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80, + 0x49, 0x3d, 0x58, 0x08, 0x99, 0x04, 0x43, 0x48, + 0x90, 0x05, 0x69, 0xb8, 0x99, 0x05, 0x09, 0x49, + 0x18, 0x46, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x02, + 0x03, 0x30, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x30, + 0x0a, 0x00, 0x1c, 0x06, 0xf0, 0x12, 0xfc, 0xd4, + 0xf0, 0x12, 0xfc, 0xb0, 0x48, 0x33, 0x69, 0x80, + 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x49, 0x31, + 0x69, 0x89, 0x60, 0x08, 0x48, 0x2f, 0x69, 0x80, + 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x04, + 0x43, 0x18, 0x49, 0x2c, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x40, 0x48, 0x2a, 0x69, 0xc0, 0x68, 0x00, + 0x01, 0x40, 0x09, 0x40, 0x99, 0x05, 0x06, 0xc9, + 0x43, 0x08, 0x49, 0x26, 0x69, 0xc9, 0x60, 0x08, + 0x48, 0x24, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x24, + 0x40, 0x18, 0x02, 0x31, 0x0a, 0x09, 0x00, 0x89, + 0x43, 0x08, 0x49, 0x20, 0x69, 0xc9, 0x60, 0x08, + 0x01, 0x80, 0x1c, 0x39, 0x1c, 0x38, 0xf0, 0x00, + 0xfb, 0xd7, 0x6b, 0xf8, 0x49, 0x1b, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x1c, 0x40, 0x19, 0x07, 0xc0, + 0x0c, 0x80, 0x43, 0x08, 0x49, 0x17, 0x69, 0x89, + 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x99, 0x07, + 0x69, 0x09, 0x1c, 0x38, 0x22, 0x04, 0xf0, 0x00, + 0xfc, 0x4b, 0x69, 0xf8, 0x49, 0x11, 0x69, 0x49, + 0x61, 0x08, 0x98, 0x05, 0x06, 0xc0, 0x0e, 0xc0, + 0x49, 0x0e, 0x69, 0x49, 0x61, 0x48, 0x48, 0x0d, + 0x69, 0x40, 0x61, 0x86, 0x48, 0x0b, 0x69, 0x40, + 0x62, 0x04, 0x98, 0x03, 0x49, 0x09, 0x69, 0x49, + 0x62, 0x48, 0xf0, 0x00, 0xfd, 0x18, 0xf0, 0x12, + 0xfc, 0x8f, 0x20, 0x00, 0xb0, 0x06, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x06, + 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x03, 0xa8, 0x78, + 0x2e, 0x03, 0xa8, 0xc8, 0x2e, 0x08, 0x20, 0x28, + 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xdf, 0xff, + 0xb5, 0xff, 0x9d, 0x09, 0xb0, 0x81, 0x98, 0x0b, + 0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x93, + 0x98, 0x14, 0x90, 0x12, 0x99, 0x15, 0x91, 0x11, + 0xaf, 0x0c, 0x1c, 0x38, 0x9a, 0x16, 0xca, 0x5e, + 0xc0, 0x5e, 0x68, 0x39, 0x91, 0x04, 0x68, 0x79, + 0x91, 0x03, 0x98, 0x12, 0x99, 0x11, 0x42, 0x88, + 0xd1, 0x73, 0x99, 0x03, 0x42, 0x8d, 0xd9, 0x71, + 0x68, 0xb8, 0x90, 0x01, 0x68, 0xf8, 0x90, 0x02, + 0x99, 0x11, 0x6b, 0x48, 0x6a, 0xc9, 0x1a, 0x40, + 0x1c, 0x44, 0x99, 0x11, 0x6b, 0x08, 0x6a, 0x89, + 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x98, 0x02, + 0x18, 0x28, 0x42, 0xa0, 0xd9, 0x01, 0x1b, 0x61, + 0x91, 0x02, 0x9b, 0x17, 0x98, 0x01, 0x18, 0x18, + 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x00, + 0x9b, 0x17, 0x1a, 0xc0, 0x90, 0x01, 0x98, 0x01, + 0x60, 0xb8, 0x98, 0x02, 0x60, 0xf8, 0x98, 0x12, + 0x69, 0xc0, 0x90, 0x0a, 0x98, 0x12, 0x6b, 0x80, + 0x99, 0x03, 0x43, 0x48, 0x99, 0x04, 0x18, 0x41, + 0x91, 0x05, 0x98, 0x12, 0x69, 0x00, 0x00, 0x80, + 0x49, 0x48, 0x58, 0x08, 0x99, 0x05, 0x43, 0x48, + 0x90, 0x0b, 0x98, 0x12, 0x69, 0x80, 0x99, 0x0b, + 0x09, 0x49, 0x18, 0x41, 0x91, 0x07, 0x98, 0x0a, + 0x99, 0x02, 0x43, 0x48, 0x90, 0x0b, 0x98, 0x0b, + 0x09, 0x40, 0x99, 0x07, 0x18, 0x40, 0x90, 0x06, + 0x98, 0x06, 0x0b, 0xc0, 0x99, 0x07, 0x0b, 0xc9, + 0x1a, 0x40, 0x90, 0x09, 0x98, 0x09, 0x28, 0x00, + 0xd0, 0x56, 0x9e, 0x02, 0x98, 0x06, 0x04, 0x40, + 0x0c, 0x40, 0x01, 0x41, 0x91, 0x08, 0x99, 0x08, + 0x98, 0x0a, 0xf0, 0x04, 0xf9, 0x17, 0x1c, 0x04, + 0x2c, 0x00, 0xd1, 0x00, 0x34, 0x01, 0x99, 0x03, + 0x98, 0x02, 0x18, 0x08, 0x1b, 0x00, 0x60, 0x78, + 0x60, 0xfc, 0x98, 0x02, 0x18, 0x28, 0x1b, 0x05, + 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, + 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, + 0xf8, 0x57, 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x09, + 0xe0, 0x01, 0xe0, 0x3c, 0xe0, 0x3b, 0x38, 0x01, + 0x90, 0x09, 0x98, 0x09, 0x28, 0x00, 0xd0, 0x1a, + 0x98, 0x0a, 0x21, 0x01, 0x03, 0x09, 0xf0, 0x04, + 0xf8, 0xf1, 0x1c, 0x04, 0x68, 0x78, 0x1b, 0x80, + 0x60, 0x78, 0x60, 0xfc, 0x68, 0xf8, 0x1a, 0x2d, + 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, + 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, + 0xf8, 0x37, 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x09, + 0x38, 0x01, 0x90, 0x09, 0xe7, 0xe1, 0x68, 0x78, + 0x1b, 0x80, 0x60, 0x78, 0x60, 0xfe, 0x68, 0xf8, + 0x1a, 0x2d, 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, + 0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, + 0xf0, 0x00, 0xf8, 0x22, 0xb0, 0x02, 0xe0, 0x09, + 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, + 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, + 0xf8, 0x17, 0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x13, + 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a, + 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 0xf8, 0xb8, + 0xb0, 0x02, 0x20, 0x00, 0xb0, 0x14, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x13, + 0xb0, 0x01, 0xe7, 0xf8, 0x2e, 0x03, 0xa8, 0xc8, + 0xb5, 0xff, 0x9d, 0x09, 0xb0, 0x81, 0x98, 0x0b, + 0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x92, + 0x98, 0x13, 0x90, 0x11, 0x99, 0x14, 0x91, 0x10, + 0xaf, 0x0b, 0x1c, 0x38, 0x9a, 0x15, 0xca, 0x5e, + 0xc0, 0x5e, 0x68, 0x38, 0x90, 0x03, 0x68, 0x78, + 0x90, 0x02, 0x68, 0xb8, 0x90, 0x00, 0x68, 0xf9, + 0x91, 0x01, 0x98, 0x11, 0x69, 0xc0, 0x90, 0x09, + 0x99, 0x10, 0x6b, 0x88, 0x43, 0x68, 0x9b, 0x16, + 0x18, 0xc1, 0x91, 0x04, 0x99, 0x10, 0x69, 0x08, + 0x00, 0x80, 0x49, 0x42, 0x58, 0x08, 0x99, 0x04, + 0x43, 0x48, 0x90, 0x0a, 0x99, 0x10, 0x69, 0x88, + 0x99, 0x0a, 0x09, 0x49, 0x18, 0x40, 0x90, 0x06, + 0x98, 0x09, 0x99, 0x01, 0x43, 0x48, 0x90, 0x0a, + 0x98, 0x0a, 0x09, 0x40, 0x99, 0x06, 0x18, 0x40, + 0x90, 0x05, 0x98, 0x05, 0x0b, 0xc0, 0x99, 0x06, + 0x0b, 0xc9, 0x1a, 0x40, 0x90, 0x08, 0x98, 0x08, + 0x28, 0x00, 0xd0, 0x53, 0x9e, 0x01, 0x98, 0x05, + 0x04, 0x40, 0x0c, 0x40, 0x01, 0x41, 0x91, 0x07, + 0x99, 0x07, 0x98, 0x09, 0xf0, 0x04, 0xf8, 0x5e, + 0x1c, 0x04, 0x2c, 0x00, 0xd1, 0x00, 0x34, 0x01, + 0x98, 0x02, 0x99, 0x01, 0x18, 0x40, 0x1b, 0x00, + 0x60, 0x78, 0x60, 0xfc, 0x99, 0x01, 0x18, 0x68, + 0x1b, 0x05, 0x9a, 0x12, 0x1c, 0x29, 0xb4, 0x06, + 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, 0x98, 0x15, + 0xf0, 0x00, 0xf8, 0x4a, 0xb0, 0x02, 0x1b, 0x36, + 0x98, 0x08, 0x38, 0x01, 0x90, 0x08, 0x98, 0x08, + 0x28, 0x00, 0xd0, 0x1a, 0x98, 0x09, 0x21, 0x01, + 0x03, 0x09, 0xf0, 0x04, 0xf8, 0x3b, 0x1c, 0x04, + 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, 0x60, 0xfc, + 0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x12, 0x1c, 0x29, + 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, + 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x2d, 0xb0, 0x02, + 0x1b, 0x36, 0x98, 0x08, 0x38, 0x01, 0x90, 0x08, + 0xe7, 0xe1, 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, + 0x60, 0xfe, 0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x12, + 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, + 0x99, 0x16, 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x18, + 0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x12, 0x1c, 0x29, + 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, + 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x0d, 0xb0, 0x02, + 0x20, 0x00, 0xb0, 0x13, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x12, 0xb0, 0x01, + 0xe7, 0xf8, 0x00, 0x00, 0x2e, 0x03, 0xa8, 0xc8, + 0xb5, 0xff, 0xb0, 0x81, 0x98, 0x0b, 0x06, 0x02, + 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x8e, 0x9f, 0x0f, + 0x9c, 0x10, 0x9a, 0x11, 0x68, 0x10, 0x90, 0x07, + 0x9a, 0x11, 0x68, 0x50, 0x90, 0x06, 0x9a, 0x11, + 0x68, 0x91, 0x91, 0x08, 0x9a, 0x11, 0x68, 0xd0, + 0x90, 0x09, 0x6b, 0x60, 0x6a, 0xe1, 0x1a, 0x40, + 0x30, 0x01, 0x90, 0x01, 0x6b, 0x20, 0x6a, 0xa1, + 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x99, 0x18, + 0x98, 0x09, 0x18, 0x08, 0x99, 0x01, 0x42, 0x88, + 0xd9, 0x03, 0x98, 0x01, 0x99, 0x18, 0x1a, 0x41, + 0x91, 0x09, 0x9b, 0x12, 0x99, 0x08, 0x18, 0x58, + 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x00, + 0x9b, 0x12, 0x1a, 0xc1, 0x91, 0x08, 0x22, 0x00, + 0x92, 0x05, 0x42, 0xa7, 0xd1, 0x20, 0x99, 0x18, + 0x98, 0x06, 0x42, 0x81, 0xd9, 0x0c, 0x22, 0x02, + 0x92, 0x05, 0x99, 0x06, 0x98, 0x09, 0x18, 0x08, + 0x1e, 0x41, 0x91, 0x06, 0x99, 0x18, 0x98, 0x09, + 0x18, 0x08, 0x1e, 0x41, 0x91, 0x18, 0xe0, 0x0f, + 0x9b, 0x12, 0x98, 0x07, 0x42, 0x83, 0xd9, 0x0b, + 0x22, 0x01, 0x92, 0x05, 0x98, 0x07, 0x99, 0x08, + 0x18, 0x40, 0x38, 0x01, 0x90, 0x07, 0x9b, 0x12, + 0x99, 0x08, 0x18, 0x58, 0x1e, 0x43, 0x93, 0x12, + 0x69, 0x38, 0x28, 0x08, 0xd1, 0x0a, 0x99, 0x08, + 0x08, 0x49, 0x91, 0x08, 0x98, 0x07, 0x08, 0x40, + 0x00, 0x40, 0x90, 0x07, 0x9b, 0x12, 0x08, 0x5b, + 0x00, 0x5b, 0x93, 0x12, 0x69, 0x38, 0x00, 0x80, + 0x49, 0xc6, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, + 0x08, 0x80, 0x90, 0x03, 0x69, 0x20, 0x00, 0x80, + 0x49, 0xc2, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, + 0x08, 0x80, 0x90, 0x02, 0x6b, 0xb8, 0x99, 0x06, + 0x43, 0x48, 0x99, 0x07, 0x18, 0x41, 0x91, 0x04, + 0x98, 0x03, 0x28, 0x00, 0xd0, 0x02, 0x99, 0x04, + 0x08, 0x49, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80, + 0x49, 0xb9, 0x58, 0x08, 0x99, 0x04, 0x1c, 0x06, + 0x43, 0x4e, 0x6b, 0xa0, 0x99, 0x18, 0x43, 0x48, + 0x9b, 0x12, 0x18, 0xc1, 0x91, 0x04, 0x98, 0x02, + 0x28, 0x00, 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, + 0x91, 0x04, 0x69, 0x20, 0x00, 0x80, 0x49, 0xb0, + 0x58, 0x08, 0x99, 0x04, 0x1c, 0x05, 0x43, 0x4d, + 0x9a, 0x05, 0x2a, 0x01, 0xd1, 0x3d, 0x69, 0x38, + 0x28, 0x08, 0xd0, 0x3a, 0x69, 0x38, 0x28, 0x09, + 0xd0, 0x02, 0x69, 0x38, 0x28, 0x0a, 0xd1, 0x0a, + 0x36, 0x10, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41, + 0x91, 0x0b, 0x06, 0xf0, 0x0e, 0xc0, 0x1d, 0xc1, + 0x31, 0x01, 0x91, 0x0a, 0xe0, 0x0b, 0x69, 0xb8, + 0x09, 0x71, 0x18, 0x41, 0x91, 0x0b, 0x69, 0x38, + 0x00, 0x80, 0x49, 0x9f, 0x58, 0x08, 0x19, 0x86, + 0x06, 0xf1, 0x0e, 0xc9, 0x91, 0x0a, 0x69, 0x20, + 0x28, 0x09, 0xd0, 0x02, 0x69, 0x20, 0x28, 0x0a, + 0xd1, 0x0a, 0x35, 0x10, 0x69, 0xa0, 0x09, 0x69, + 0x18, 0x41, 0x91, 0x0d, 0x06, 0xe8, 0x0e, 0xc0, + 0x1d, 0xc1, 0x31, 0x01, 0x91, 0x0c, 0xe0, 0x0b, + 0x69, 0xa0, 0x09, 0x69, 0x18, 0x41, 0x91, 0x0d, + 0x69, 0x20, 0x00, 0x80, 0x49, 0x90, 0x58, 0x08, + 0x19, 0x45, 0x06, 0xe9, 0x0e, 0xc9, 0x91, 0x0c, + 0xe0, 0x0d, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41, + 0x91, 0x0b, 0x69, 0xa0, 0x09, 0x69, 0x18, 0x41, + 0x91, 0x0d, 0x06, 0xf1, 0x0e, 0xc9, 0x91, 0x0a, + 0x06, 0xe9, 0x0e, 0xc9, 0x91, 0x0c, 0x6b, 0xf8, + 0x28, 0x00, 0xd1, 0x03, 0x99, 0x0b, 0x03, 0x09, + 0x0b, 0x09, 0xe0, 0x02, 0x99, 0x0b, 0x02, 0x09, + 0x0a, 0x09, 0x91, 0x0b, 0x6b, 0xe0, 0x28, 0x00, + 0xd1, 0x03, 0x99, 0x0d, 0x03, 0x09, 0x0b, 0x09, + 0xe0, 0x02, 0x99, 0x0d, 0x02, 0x09, 0x0a, 0x09, + 0x91, 0x0d, 0xf0, 0x12, 0xf9, 0xd5, 0xf0, 0x12, + 0xf9, 0xb1, 0x48, 0x7a, 0x69, 0x80, 0x68, 0x00, + 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x05, 0x43, 0x18, + 0x49, 0x76, 0x69, 0x89, 0x60, 0x08, 0x07, 0x40, + 0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xf8, + 0x98, 0x03, 0x28, 0x00, 0xd0, 0x18, 0x98, 0x02, + 0x28, 0x00, 0xd0, 0x15, 0x48, 0x6f, 0x69, 0x80, + 0x68, 0x00, 0x23, 0x08, 0x43, 0xdb, 0x40, 0x18, + 0x49, 0x6c, 0x69, 0x89, 0x60, 0x08, 0x07, 0x00, + 0x48, 0x6a, 0x69, 0x80, 0x68, 0x00, 0x4b, 0x6a, + 0x40, 0x18, 0x49, 0x68, 0x69, 0x89, 0x60, 0x08, + 0x05, 0xc0, 0x99, 0x08, 0x08, 0x49, 0x91, 0x08, + 0x6b, 0xf8, 0x49, 0x64, 0x69, 0x89, 0x68, 0x09, + 0x4b, 0x64, 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x40, + 0x43, 0x08, 0x49, 0x60, 0x69, 0x89, 0x60, 0x08, + 0x04, 0x40, 0x0f, 0xc0, 0x6b, 0xe0, 0x49, 0x5d, + 0x69, 0x89, 0x68, 0x09, 0x4b, 0x5e, 0x40, 0x19, + 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 0x49, 0x59, + 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, + 0x68, 0x38, 0x28, 0x00, 0xd0, 0x0d, 0x79, 0x38, + 0x49, 0x54, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x57, + 0x40, 0x19, 0x03, 0xc0, 0x43, 0x08, 0x49, 0x51, + 0x69, 0x89, 0x60, 0x08, 0x02, 0x40, 0x0e, 0x00, + 0xe0, 0x0d, 0x6a, 0x78, 0x78, 0x00, 0x49, 0x4d, + 0x69, 0x89, 0x68, 0x09, 0x4b, 0x4f, 0x40, 0x19, + 0x03, 0xc0, 0x43, 0x08, 0x49, 0x49, 0x69, 0x89, + 0x60, 0x08, 0x02, 0x40, 0x0e, 0x00, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x45, 0x58, 0x08, 0x99, 0x08, + 0x43, 0x48, 0x28, 0x40, 0xd9, 0x01, 0x21, 0x00, + 0xe0, 0x00, 0x21, 0x01, 0x1c, 0x08, 0x49, 0x41, + 0x69, 0x89, 0x68, 0x09, 0x4b, 0x44, 0x40, 0x19, + 0x07, 0xc2, 0x09, 0x52, 0x43, 0x11, 0x4a, 0x3d, + 0x69, 0x92, 0x60, 0x11, 0x01, 0x49, 0x0f, 0xc9, + 0x49, 0x3a, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x3f, + 0x40, 0x19, 0x9a, 0x05, 0x07, 0x92, 0x0f, 0x92, + 0x05, 0xd2, 0x43, 0x11, 0x4a, 0x35, 0x69, 0x92, + 0x60, 0x11, 0x01, 0xc9, 0x49, 0x33, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x39, 0x40, 0x19, 0x9a, 0x0e, + 0x07, 0xd2, 0x09, 0x92, 0x43, 0x11, 0x4a, 0x2f, + 0x69, 0x92, 0x60, 0x11, 0x01, 0x89, 0x69, 0xf9, + 0x4a, 0x2c, 0x69, 0x52, 0x60, 0x11, 0x49, 0x2b, + 0x69, 0x89, 0x68, 0x09, 0x01, 0x49, 0x09, 0x49, + 0x9a, 0x0a, 0x06, 0xd2, 0x43, 0x11, 0x4a, 0x27, + 0x69, 0x92, 0x60, 0x11, 0x99, 0x0a, 0x4a, 0x25, + 0x69, 0x52, 0x60, 0x51, 0x99, 0x0b, 0x4a, 0x23, + 0x69, 0x52, 0x60, 0x91, 0x99, 0x0b, 0x4a, 0x21, + 0x69, 0x52, 0x60, 0xd1, 0x69, 0xe1, 0x4a, 0x1f, + 0x69, 0x52, 0x61, 0x11, 0x49, 0x1d, 0x69, 0xc9, + 0x68, 0x09, 0x01, 0x49, 0x09, 0x49, 0x9a, 0x0c, + 0x06, 0xd2, 0x43, 0x11, 0x4a, 0x19, 0x69, 0xd2, + 0x60, 0x11, 0x99, 0x0c, 0x4a, 0x17, 0x69, 0x52, + 0x61, 0x51, 0x99, 0x0d, 0x4a, 0x15, 0x69, 0x52, + 0x61, 0x91, 0x99, 0x0d, 0x4a, 0x13, 0x69, 0x52, + 0x61, 0xd1, 0x99, 0x09, 0x4a, 0x11, 0x69, 0x52, + 0x62, 0x51, 0x99, 0x08, 0x4a, 0x0f, 0x69, 0x52, + 0x62, 0x11, 0x68, 0x38, 0x28, 0x00, 0xd0, 0x05, + 0x48, 0x14, 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, + 0x60, 0x01, 0xe0, 0x02, 0x48, 0x11, 0x21, 0x00, + 0x60, 0x01, 0xf0, 0x00, 0xf9, 0x8c, 0xf0, 0x12, + 0xf9, 0x03, 0x20, 0x00, 0xb0, 0x0f, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x0e, + 0xb0, 0x01, 0xe7, 0xf8, 0x2e, 0x03, 0xa8, 0x78, + 0x2e, 0x03, 0xa8, 0xc8, 0x2e, 0x08, 0x20, 0x28, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0x80, 0x7f, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x40, + 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x69, 0x38, + 0x00, 0x80, 0x49, 0x3c, 0x58, 0x08, 0x23, 0x18, + 0x40, 0x18, 0x08, 0xc0, 0x49, 0x3a, 0x69, 0x89, + 0x68, 0x09, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x19, + 0x07, 0x80, 0x0f, 0x80, 0x01, 0x80, 0x43, 0x08, + 0x49, 0x35, 0x69, 0x89, 0x60, 0x08, 0x06, 0x00, + 0x0f, 0x80, 0x69, 0x38, 0x00, 0x80, 0x49, 0x31, + 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0x08, 0x80, + 0x49, 0x2f, 0x69, 0x89, 0x68, 0x09, 0x23, 0x08, + 0x43, 0xdb, 0x40, 0x19, 0x07, 0xc0, 0x0f, 0x00, + 0x43, 0x08, 0x49, 0x2b, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x00, 0x0f, 0xc0, 0x69, 0x38, 0x00, 0x80, + 0x49, 0x26, 0x58, 0x08, 0x49, 0x26, 0x69, 0x89, + 0x68, 0x09, 0x23, 0x30, 0x43, 0xdb, 0x40, 0x19, + 0x07, 0x80, 0x0f, 0x80, 0x01, 0x00, 0x43, 0x08, + 0x49, 0x21, 0x69, 0x89, 0x60, 0x08, 0x06, 0x80, + 0x0f, 0x80, 0x69, 0x10, 0x00, 0x80, 0x49, 0x1d, + 0x58, 0x08, 0x23, 0x18, 0x40, 0x18, 0x08, 0xc0, + 0x49, 0x1b, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1b, + 0x40, 0x19, 0x07, 0x80, 0x0f, 0x80, 0x02, 0xc0, + 0x43, 0x08, 0x49, 0x17, 0x69, 0x89, 0x60, 0x08, + 0x04, 0xc0, 0x0f, 0x80, 0x69, 0x10, 0x00, 0x80, + 0x49, 0x12, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, + 0x08, 0x80, 0x49, 0x11, 0x69, 0x89, 0x68, 0x09, + 0x4b, 0x11, 0x40, 0x19, 0x07, 0xc0, 0x0d, 0xc0, + 0x43, 0x08, 0x49, 0x0d, 0x69, 0x89, 0x60, 0x08, + 0x05, 0xc0, 0x0f, 0xc0, 0x69, 0x10, 0x00, 0x80, + 0x49, 0x08, 0x58, 0x08, 0x49, 0x08, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x0a, 0x40, 0x19, 0x07, 0x80, + 0x0f, 0x80, 0x02, 0x40, 0x43, 0x08, 0x49, 0x04, + 0x69, 0x89, 0x60, 0x08, 0x05, 0x40, 0x0f, 0x80, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x03, 0xa8, 0x78, + 0x2e, 0x08, 0x20, 0x28, 0xff, 0xff, 0xe7, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xb4, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x15, + 0x2d, 0x00, 0xd0, 0x06, 0x2d, 0x02, 0xd0, 0x21, + 0x2d, 0x03, 0xd0, 0x02, 0x2d, 0x04, 0xd0, 0x1d, + 0xe0, 0xa3, 0x69, 0x20, 0x28, 0x0b, 0xd2, 0x14, + 0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, + 0x05, 0x07, 0x09, 0x0b, 0x05, 0x07, 0x09, 0x0b, + 0x0d, 0x0e, 0x0e, 0x00, 0x07, 0xff, 0xe0, 0x09, + 0x07, 0xbf, 0xe0, 0x07, 0x07, 0x3f, 0xe0, 0x05, + 0x06, 0x3f, 0xe0, 0x03, 0xe0, 0x02, 0x02, 0x3f, + 0xe0, 0x00, 0xe7, 0xff, 0x48, 0x46, 0x6a, 0x00, + 0x60, 0x07, 0xe0, 0x86, 0x69, 0x20, 0x28, 0x0b, + 0xd2, 0x73, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x06, 0x15, 0x24, 0x33, + 0x06, 0x15, 0x24, 0x33, 0x41, 0x45, 0x45, 0x00, + 0x01, 0xff, 0x48, 0x3d, 0x6a, 0x40, 0x68, 0x00, + 0x4b, 0x3c, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, + 0x00, 0x89, 0x43, 0x08, 0x49, 0x38, 0x6a, 0x49, + 0x60, 0x08, 0x05, 0x80, 0xe0, 0x69, 0x01, 0xbf, + 0x48, 0x35, 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x35, + 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, + 0x43, 0x08, 0x49, 0x31, 0x6a, 0x49, 0x60, 0x08, + 0x05, 0x80, 0xe0, 0x5a, 0x01, 0x3f, 0x48, 0x2e, + 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x2d, 0x40, 0x18, + 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 0x43, 0x08, + 0x49, 0x29, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80, + 0xe0, 0x4b, 0x48, 0x27, 0x6a, 0x40, 0x68, 0x00, + 0x4b, 0x26, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, + 0x00, 0x89, 0x43, 0x08, 0x49, 0x22, 0x6a, 0x49, + 0x60, 0x08, 0x05, 0x80, 0xe0, 0x3d, 0x48, 0x20, + 0x6a, 0x00, 0x60, 0x07, 0xe0, 0x39, 0x48, 0x1e, + 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x1d, 0x40, 0x18, + 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 0x43, 0x08, + 0x49, 0x19, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80, + 0x48, 0x17, 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x18, + 0x40, 0x18, 0x21, 0xff, 0x02, 0x09, 0x40, 0x39, + 0x00, 0x89, 0x43, 0x08, 0x49, 0x12, 0x6a, 0x49, + 0x60, 0x08, 0x03, 0x80, 0x48, 0x10, 0x6a, 0x40, + 0x68, 0x00, 0x4b, 0x12, 0x40, 0x18, 0x21, 0xff, + 0x04, 0x09, 0x40, 0x39, 0x00, 0x89, 0x43, 0x01, + 0x48, 0x0b, 0x6a, 0x40, 0x60, 0x01, 0x01, 0x88, + 0xe0, 0x00, 0xe0, 0x0d, 0x48, 0x08, 0x6a, 0x40, + 0x68, 0x00, 0x01, 0x80, 0x09, 0x80, 0x21, 0x3f, + 0x06, 0x09, 0x40, 0x39, 0x00, 0x89, 0x43, 0x08, + 0x49, 0x03, 0x6a, 0x49, 0x60, 0x08, 0xe0, 0x00, + 0xe7, 0xff, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x20, 0x28, 0xff, 0xff, 0xfc, 0x03, + 0xff, 0xfc, 0x03, 0xff, 0xfc, 0x03, 0xff, 0xff, + 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x69, 0x38, + 0x28, 0x0b, 0xd2, 0x1a, 0xa3, 0x01, 0x5c, 0x1b, + 0x00, 0x5b, 0x44, 0x9f, 0x05, 0x08, 0x0b, 0x0e, + 0x05, 0x08, 0x0b, 0x0e, 0x11, 0x13, 0x13, 0x00, + 0x68, 0x10, 0x0f, 0xc1, 0xe0, 0x0f, 0x68, 0x10, + 0x0f, 0x81, 0xe0, 0x0c, 0x68, 0x10, 0x0f, 0x01, + 0xe0, 0x09, 0x68, 0x10, 0x0e, 0x01, 0xe0, 0x06, + 0x68, 0x11, 0xe0, 0x04, 0x68, 0x10, 0x0a, 0x01, + 0xe0, 0x01, 0x68, 0x11, 0xe7, 0xff, 0x1c, 0x08, + 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x48, 0x14, + 0x69, 0x80, 0x68, 0x00, 0x49, 0x12, 0x6a, 0x89, + 0x60, 0x08, 0x48, 0x11, 0x69, 0xc0, 0x68, 0x00, + 0x49, 0x0f, 0x6a, 0xc9, 0x60, 0x08, 0x48, 0x0e, + 0x6a, 0x00, 0x68, 0x00, 0x49, 0x0c, 0x6b, 0x09, + 0x60, 0x08, 0x48, 0x0b, 0x6a, 0x40, 0x68, 0x00, + 0x49, 0x09, 0x6b, 0x49, 0x60, 0x08, 0x20, 0x01, + 0x49, 0x07, 0x6b, 0xc9, 0x60, 0x08, 0x20, 0x00, + 0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0x49, 0x05, + 0x60, 0x48, 0x20, 0x00, 0x49, 0x03, 0x60, 0x88, + 0x20, 0x00, 0x49, 0x02, 0x60, 0xc8, 0x47, 0x70, + 0x2e, 0x08, 0x20, 0x28, 0x2e, 0x08, 0x20, 0x2c, + 0xb4, 0x90, 0x1c, 0x01, 0x29, 0x00, 0xd1, 0x02, + 0x20, 0x8d, 0xbc, 0x90, 0x47, 0x70, 0x4c, 0x08, + 0x1c, 0x0f, 0x22, 0x00, 0x23, 0xff, 0x33, 0x01, + 0x42, 0x9a, 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, + 0xe7, 0xf8, 0xcf, 0x08, 0xc4, 0x08, 0xe7, 0xfa, + 0x20, 0x00, 0xe7, 0xee, 0xe7, 0xed, 0x00, 0x00, + 0x68, 0x00, 0x18, 0x00, 0xb4, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x1a, 0x0e, 0x12, + 0x1c, 0x21, 0x60, 0x0f, 0x71, 0x0a, 0x20, 0x00, + 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, + 0xb5, 0x00, 0x48, 0x1d, 0x69, 0x00, 0x23, 0x04, + 0x40, 0x18, 0xd0, 0x19, 0x48, 0x1a, 0x69, 0x00, + 0x23, 0x02, 0x40, 0x18, 0xd0, 0x09, 0x48, 0x18, + 0x69, 0x40, 0x49, 0x18, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x17, 0x68, 0x09, 0x70, 0x08, + 0xe0, 0x03, 0x20, 0x00, 0x49, 0x14, 0x68, 0x09, + 0x70, 0x08, 0x48, 0x14, 0x78, 0x01, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x08, 0xff, 0x9f, 0xe0, 0x18, + 0x48, 0x11, 0x6a, 0x80, 0x23, 0x02, 0x40, 0x18, + 0xd0, 0x13, 0x48, 0x0f, 0x6a, 0x80, 0x07, 0xc0, + 0x0f, 0xc0, 0xd0, 0x04, 0x20, 0xfe, 0x49, 0x0d, + 0x68, 0x09, 0x70, 0x08, 0xe0, 0x03, 0x20, 0x0e, + 0x49, 0x0a, 0x68, 0x09, 0x70, 0x08, 0x48, 0x0a, + 0x78, 0x01, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x08, + 0xff, 0x85, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x6e, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0xb9, 0x98, + 0x2e, 0x08, 0xb9, 0x9c, 0x2e, 0x08, 0xb9, 0xa0, + 0x6e, 0x00, 0x0e, 0x00, 0x2e, 0x08, 0xb9, 0xa4, + 0x2e, 0x08, 0xb9, 0xa8, 0xb5, 0xf0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2e, 0x0e, 0x36, + 0x2e, 0x1f, 0xdd, 0x03, 0x20, 0xaf, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x49, 0x08, 0x20, 0x0d, + 0xf0, 0x08, 0xff, 0x76, 0x48, 0x07, 0x60, 0x04, + 0x20, 0x00, 0x49, 0x06, 0x68, 0x09, 0x70, 0x08, + 0x48, 0x05, 0x60, 0x07, 0x48, 0x05, 0x70, 0x06, + 0x20, 0x00, 0xe7, 0xec, 0xe7, 0xeb, 0x00, 0x00, + 0x2e, 0x01, 0xa9, 0xed, 0x2e, 0x08, 0xb9, 0x9c, + 0x2e, 0x08, 0xb9, 0x98, 0x2e, 0x08, 0xb9, 0xa0, + 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, + 0x0e, 0x2d, 0x2d, 0x1f, 0xdd, 0x03, 0x20, 0xaf, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x49, 0x07, + 0x20, 0x0d, 0xf0, 0x08, 0xff, 0x51, 0x48, 0x06, + 0x60, 0x07, 0x20, 0x00, 0x49, 0x04, 0x68, 0x09, + 0x70, 0x08, 0x48, 0x04, 0x70, 0x05, 0x20, 0x00, + 0xe7, 0xee, 0xe7, 0xed, 0x2e, 0x01, 0xa9, 0xed, + 0x2e, 0x08, 0xb9, 0xa4, 0x2e, 0x08, 0xb9, 0xa8, + 0xb4, 0xb0, 0x1c, 0x01, 0x4a, 0x35, 0x23, 0x01, + 0x60, 0x13, 0x4a, 0x35, 0x1c, 0x0f, 0x68, 0x3d, + 0xc2, 0x20, 0x88, 0x8d, 0xc2, 0x20, 0x88, 0xcb, + 0x60, 0x13, 0x68, 0x8c, 0x2c, 0x00, 0xd0, 0x57, + 0x4a, 0x30, 0x1c, 0x27, 0x20, 0x00, 0x28, 0x13, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x2c, + 0x1d, 0xe7, 0x37, 0x45, 0x20, 0x00, 0x28, 0x0b, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x27, + 0x1d, 0xe7, 0x37, 0x71, 0x20, 0x00, 0x28, 0x07, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x22, + 0x1d, 0xe7, 0x37, 0x8d, 0x20, 0x00, 0x28, 0x09, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x1d, + 0x1d, 0xe7, 0x37, 0xb1, 0x20, 0x00, 0x28, 0x09, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x68, 0x0d, + 0x23, 0x01, 0x02, 0x9b, 0x40, 0x2b, 0xd0, 0x17, + 0x4a, 0x15, 0x1d, 0xe7, 0x37, 0xd5, 0x20, 0x00, + 0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, + 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, + 0x4a, 0x10, 0x1d, 0xe7, 0x37, 0xf9, 0x20, 0x00, + 0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, + 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, + 0x4a, 0x02, 0x23, 0x00, 0x60, 0x13, 0xbc, 0xb0, + 0x47, 0x70, 0x00, 0x00, 0x6e, 0x00, 0x0c, 0x0c, + 0x6e, 0x00, 0x0c, 0x00, 0x6e, 0x00, 0x08, 0x00, + 0x6e, 0x00, 0x08, 0x50, 0x6e, 0x00, 0x08, 0x80, + 0x6e, 0x00, 0x08, 0xa0, 0x6e, 0x00, 0x08, 0xd0, + 0x6e, 0x00, 0x09, 0x00, 0x6e, 0x00, 0x09, 0x30, + 0xb4, 0xf0, 0x1c, 0x01, 0x69, 0x08, 0x06, 0xc0, + 0x0e, 0xc0, 0x28, 0x01, 0xdb, 0x04, 0x69, 0x08, + 0x06, 0xc0, 0x0e, 0xc0, 0x28, 0x0a, 0xdd, 0x02, + 0x20, 0xc3, 0xbc, 0xf0, 0x47, 0x70, 0x69, 0x08, + 0x05, 0x80, 0x0e, 0xc0, 0x28, 0x01, 0xdb, 0x04, + 0x69, 0x08, 0x05, 0x80, 0x0e, 0xc0, 0x28, 0x0a, + 0xdd, 0x01, 0x20, 0xc4, 0xe7, 0xf1, 0x48, 0x4f, + 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x01, + 0x20, 0xc0, 0xe7, 0xea, 0x68, 0x08, 0x07, 0x00, + 0x0f, 0xc0, 0x4b, 0x4b, 0x70, 0x18, 0x4f, 0x49, + 0x1c, 0x0c, 0x22, 0x00, 0x2a, 0x04, 0xd3, 0x02, + 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, + 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x45, 0x69, 0x08, + 0x06, 0xc0, 0x0e, 0xc0, 0x00, 0x43, 0x18, 0x18, + 0x38, 0x03, 0x69, 0x0b, 0x05, 0x9b, 0x0e, 0xde, + 0x00, 0x73, 0x19, 0x9b, 0x3b, 0x03, 0x01, 0x5b, + 0x43, 0x18, 0x60, 0x38, 0x4f, 0x3e, 0x69, 0x48, + 0x60, 0x38, 0x4f, 0x3e, 0x69, 0x88, 0x05, 0x40, + 0x0d, 0x40, 0x69, 0x8b, 0x02, 0x9b, 0x0d, 0x5b, + 0x02, 0xdb, 0x43, 0x18, 0x60, 0x38, 0x69, 0xcd, + 0x2d, 0x00, 0xd0, 0x63, 0x4f, 0x38, 0x1c, 0x2c, + 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x34, 0x1d, 0xec, 0x34, 0x1d, + 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x2f, 0x1d, 0xec, 0x34, 0x41, + 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x2a, 0x1d, 0xec, 0x34, 0x65, + 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x25, 0x1d, 0xec, 0x34, 0x89, + 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x20, 0x1d, 0xec, 0x34, 0x9d, + 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x68, 0x08, 0x23, 0x01, 0x02, 0x9b, + 0x40, 0x18, 0xd0, 0x17, 0x4f, 0x18, 0x1d, 0xec, + 0x34, 0xb1, 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, + 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, + 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x13, 0x1d, 0xec, + 0x34, 0xc5, 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, + 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, + 0xc7, 0x08, 0xe7, 0xfa, 0x20, 0x00, 0xe7, 0x54, + 0xe7, 0x53, 0x00, 0x00, 0x6e, 0x00, 0x0e, 0x00, + 0x2e, 0x08, 0xb9, 0xa9, 0x6e, 0x00, 0x0e, 0x10, + 0x6e, 0x00, 0x0e, 0x14, 0x6e, 0x00, 0x0e, 0x18, + 0x6e, 0x00, 0x0a, 0x00, 0x6e, 0x00, 0x0a, 0x24, + 0x6e, 0x00, 0x0a, 0x48, 0x6e, 0x00, 0x0a, 0x90, + 0x6e, 0x00, 0x0a, 0xc0, 0x6e, 0x00, 0x0a, 0xe4, + 0x6e, 0x00, 0x09, 0xc0, 0x6e, 0x00, 0x09, 0xe4, + 0x1c, 0x01, 0x48, 0x0c, 0x78, 0x00, 0x28, 0x00, + 0xd0, 0x01, 0x20, 0xc1, 0x47, 0x70, 0x48, 0x0a, + 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x01, + 0x20, 0xc0, 0xe7, 0xf7, 0x20, 0x00, 0x4b, 0x06, + 0x61, 0x58, 0x4a, 0x06, 0x68, 0x08, 0x60, 0x10, + 0x4a, 0x05, 0x68, 0x48, 0x60, 0x10, 0x20, 0x00, + 0xe7, 0xec, 0xe7, 0xeb, 0x2e, 0x08, 0xb9, 0xa9, + 0x6e, 0x00, 0x0e, 0x00, 0x6e, 0x00, 0x0e, 0x20, + 0x6e, 0x00, 0x0e, 0x24, 0x48, 0x09, 0x78, 0x00, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0xc1, 0x47, 0x70, + 0x48, 0x07, 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, + 0xd0, 0x01, 0x20, 0xc2, 0xe7, 0xf7, 0x20, 0x01, + 0x49, 0x03, 0x61, 0x48, 0x20, 0x00, 0xe7, 0xf2, + 0xe7, 0xf1, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xa9, + 0x6e, 0x00, 0x0e, 0x00, 0xb5, 0xff, 0x1c, 0x04, + 0x1c, 0x0d, 0x1c, 0x17, 0x9e, 0x09, 0x20, 0x00, + 0x60, 0x30, 0x48, 0x13, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x07, 0x9b, 0x03, 0x2b, 0x00, 0xd1, 0x04, + 0x20, 0x8a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c, + 0xdd, 0x01, 0x20, 0x87, 0xe7, 0xf5, 0x19, 0x28, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 0xd9, 0x01, + 0x20, 0x88, 0xe7, 0xee, 0x68, 0x79, 0x1c, 0x20, + 0x80, 0x48, 0x70, 0x0d, 0x9b, 0x03, 0x60, 0x4b, + 0x68, 0x78, 0x60, 0xc8, 0x68, 0x38, 0x60, 0x88, + 0x60, 0x31, 0x20, 0x00, 0xe7, 0xe1, 0xe7, 0xe0, + 0x2e, 0x08, 0x9d, 0xf0, 0x1c, 0x03, 0x1c, 0x0a, + 0x1c, 0x19, 0x68, 0xc8, 0x60, 0x50, 0x68, 0x88, + 0x60, 0x10, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, + 0xb5, 0xf3, 0xb0, 0x87, 0x21, 0x00, 0x91, 0x06, + 0x26, 0x00, 0x98, 0x07, 0xf0, 0x00, 0xfa, 0xcb, + 0x90, 0x03, 0x9c, 0x07, 0x9d, 0x08, 0x88, 0x69, + 0x91, 0x04, 0x98, 0x03, 0x99, 0x04, 0x42, 0x88, + 0xd0, 0x09, 0x48, 0xbb, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x05, 0x20, 0xff, 0xb0, 0x07, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x28, + 0x90, 0x05, 0x99, 0x04, 0x23, 0xff, 0x33, 0x01, + 0x42, 0x99, 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x07, + 0xe7, 0xf1, 0x98, 0x05, 0x99, 0x04, 0x18, 0x40, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 0xdd, 0x02, + 0x20, 0xff, 0xb0, 0x07, 0xe7, 0xe7, 0x48, 0xad, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0a, 0x68, 0xa0, + 0x23, 0x01, 0x06, 0x1b, 0x40, 0x18, 0xd0, 0x05, + 0x68, 0x68, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x8a, + 0xb0, 0x07, 0xe7, 0xd8, 0x62, 0x65, 0x69, 0x60, + 0x4b, 0xa5, 0x40, 0x18, 0x99, 0x05, 0x06, 0x09, + 0x0e, 0x09, 0x04, 0x09, 0x43, 0x08, 0x61, 0x60, + 0x02, 0x00, 0x68, 0xe0, 0x90, 0x00, 0x48, 0x9e, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x98, 0x00, + 0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0xe0, 0x05, 0x98, 0x00, 0x28, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x07, + 0xe7, 0xb5, 0x48, 0x94, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x1e, 0x48, 0x91, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x1a, 0x68, 0xa0, 0x02, 0x00, 0x0e, 0x00, + 0x06, 0x01, 0x0e, 0x09, 0x91, 0x06, 0x99, 0x04, + 0x29, 0x04, 0xd0, 0x06, 0x29, 0x10, 0xd0, 0x07, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xd0, 0x06, + 0xe0, 0x08, 0x26, 0xff, 0x36, 0x01, 0xe0, 0x07, + 0x26, 0x01, 0x02, 0x76, 0xe0, 0x04, 0x26, 0x03, + 0x02, 0x36, 0xe0, 0x01, 0x26, 0x00, 0xe7, 0xff, + 0x49, 0x84, 0x20, 0x91, 0xf0, 0x11, 0xfc, 0x04, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, + 0xff, 0xb1, 0xe7, 0xf5, 0x98, 0x00, 0x00, 0x80, + 0x49, 0x7f, 0x58, 0x08, 0x99, 0x07, 0x42, 0x88, + 0xd0, 0x05, 0x20, 0x92, 0x49, 0x7b, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x07, 0xe7, 0x7b, 0x48, 0x77, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x73, 0x48, 0x74, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x6f, 0x98, 0x00, + 0xf0, 0x02, 0xfe, 0xd6, 0x28, 0x00, 0xd0, 0x6a, + 0xb0, 0x82, 0x49, 0x74, 0x20, 0x91, 0xf0, 0x11, + 0xfb, 0xdf, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0xf0, 0x02, 0xff, 0x25, 0x20, 0x92, 0x49, 0x6f, + 0x60, 0x08, 0x20, 0x01, 0x49, 0x6e, 0x68, 0x09, + 0x60, 0x08, 0x27, 0x00, 0x20, 0x00, 0x90, 0x00, + 0x98, 0x00, 0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07, + 0xd2, 0x13, 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 0x18, 0x18, + 0x00, 0xc0, 0x4a, 0x65, 0x68, 0x12, 0x18, 0x80, + 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, + 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x00, + 0xe7, 0xe6, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x14, + 0x2f, 0x18, 0xd2, 0x12, 0x6a, 0xe0, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, + 0x43, 0x58, 0x4a, 0x59, 0x68, 0x12, 0x18, 0x80, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, + 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x00, + 0xe7, 0xe7, 0x3f, 0x01, 0x2f, 0x07, 0xd2, 0x10, + 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x50, + 0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b, + 0x18, 0xc0, 0x1c, 0x21, 0xf0, 0x02, 0xfb, 0x38, + 0x48, 0x4b, 0x68, 0x00, 0xf0, 0x02, 0xfe, 0xee, + 0xe0, 0x46, 0x2f, 0x18, 0xd2, 0x44, 0x20, 0x4c, + 0x43, 0x78, 0x49, 0x47, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x1c, 0x21, + 0xf0, 0x02, 0xfb, 0x26, 0x20, 0x4c, 0x43, 0x78, + 0x49, 0x41, 0x68, 0x09, 0xe0, 0x00, 0xe0, 0x48, + 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x82, + 0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c, + 0x43, 0x78, 0x49, 0x3b, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, + 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c, + 0x43, 0x78, 0x49, 0x35, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, + 0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x2e, 0x68, 0x12, + 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, + 0x67, 0x48, 0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x29, 0x68, 0x12, 0x18, 0x89, + 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, + 0x49, 0x24, 0x20, 0x91, 0xf0, 0x11, 0xfb, 0x40, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x22, + 0x68, 0x00, 0x90, 0x01, 0x48, 0x21, 0x68, 0x00, + 0x49, 0x1f, 0x60, 0x08, 0x98, 0x01, 0x49, 0x1f, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, + 0xb0, 0x02, 0x48, 0x15, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x1d, 0x98, 0x00, 0x01, 0x00, 0x4b, 0x1a, + 0x18, 0xc1, 0x91, 0x01, 0x1d, 0xe0, 0x30, 0x0d, + 0x90, 0x02, 0x98, 0x02, 0x68, 0x00, 0x99, 0x01, + 0x60, 0x08, 0x48, 0x0e, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x0d, 0x68, 0x68, 0x08, 0x80, 0x99, 0x06, + 0x00, 0x89, 0x4b, 0x12, 0x18, 0xc9, 0x67, 0x08, + 0x98, 0x05, 0x43, 0x30, 0x99, 0x06, 0x00, 0x89, + 0x4b, 0x0f, 0x18, 0xc9, 0x61, 0x08, 0x20, 0x92, + 0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x07, + 0xe6, 0x91, 0xb0, 0x07, 0xe6, 0x8f, 0x00, 0x00, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0x9d, 0xf0, + 0xff, 0x00, 0xff, 0xff, 0x2e, 0x08, 0xba, 0x2c, + 0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0xd1, 0xf4, + 0x2e, 0x08, 0xbb, 0x20, 0x2e, 0x08, 0xbb, 0x24, + 0x68, 0x00, 0x0c, 0x00, 0x68, 0x00, 0x0e, 0x00, + 0x68, 0x00, 0x0e, 0x80, 0x1c, 0x01, 0x1c, 0x0a, + 0x6a, 0x53, 0x1c, 0x18, 0x47, 0x70, 0xe7, 0xfd, + 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x82, 0x48, 0x2b, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x8a, + 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x98, 0x02, 0x90, 0x01, 0x98, 0x01, + 0x88, 0x44, 0x98, 0x01, 0x78, 0x06, 0x23, 0xff, + 0x33, 0x01, 0x42, 0x9c, 0xdd, 0x02, 0x20, 0xff, + 0xb0, 0x02, 0xe7, 0xee, 0x19, 0x30, 0x23, 0xff, + 0x33, 0x01, 0x42, 0x98, 0xdd, 0x02, 0x20, 0xff, + 0xb0, 0x02, 0xe7, 0xe6, 0x49, 0x1c, 0x20, 0x91, + 0xf0, 0x11, 0xfa, 0xc2, 0x28, 0x92, 0xd0, 0x03, + 0x20, 0x01, 0xf0, 0x01, 0xfe, 0x6f, 0xe7, 0xf5, + 0x2c, 0x10, 0xda, 0x0d, 0x25, 0x00, 0x42, 0xa5, + 0xdb, 0x02, 0xe0, 0x08, 0x35, 0x01, 0xe7, 0xfa, + 0xcf, 0x01, 0x19, 0x71, 0x00, 0x89, 0x4b, 0x13, + 0x18, 0xc9, 0x60, 0x08, 0xe7, 0xf6, 0xe0, 0x15, + 0x4a, 0x11, 0x43, 0x22, 0x92, 0x00, 0x20, 0x91, + 0x49, 0x10, 0x60, 0x08, 0x00, 0xb0, 0x4b, 0x0d, + 0x18, 0xc1, 0x9a, 0x00, 0x1c, 0x38, 0x23, 0x02, + 0xf0, 0x00, 0xfa, 0xfe, 0x28, 0x00, 0xd0, 0x00, + 0xe7, 0xf4, 0x48, 0x0a, 0x68, 0x00, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xfa, 0x20, 0x92, 0x49, 0x04, + 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xb0, + 0xb0, 0x02, 0xe7, 0xae, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xba, 0x30, 0x68, 0x00, 0x08, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x2e, 0x08, 0xba, 0x34, + 0x21, 0x04, 0xe0, 0x00, 0x31, 0x01, 0x1c, 0x08, + 0x47, 0x70, 0xe7, 0xfd, 0xb5, 0xf3, 0x1c, 0x0f, + 0xb0, 0x82, 0x48, 0x2b, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x20, 0x8a, 0xb0, 0x02, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, + 0x90, 0x01, 0x98, 0x01, 0x88, 0x44, 0x98, 0x01, + 0x78, 0x06, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c, + 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xee, + 0x19, 0x30, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, + 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, + 0x49, 0x1c, 0x20, 0x91, 0xf0, 0x11, 0xfa, 0x58, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, + 0xfe, 0x05, 0xe7, 0xf5, 0x2c, 0x10, 0xda, 0x0d, + 0x25, 0x00, 0x42, 0xa5, 0xdb, 0x02, 0xe0, 0x08, + 0x35, 0x01, 0xe7, 0xfa, 0x19, 0x70, 0x00, 0x80, + 0x4b, 0x13, 0x18, 0xc0, 0x68, 0x01, 0xc7, 0x02, + 0xe7, 0xf6, 0xe0, 0x15, 0x4a, 0x11, 0x43, 0x22, + 0x92, 0x00, 0x20, 0x91, 0x49, 0x10, 0x60, 0x08, + 0x00, 0xb0, 0x4b, 0x0d, 0x18, 0xc0, 0x9a, 0x00, + 0x1c, 0x39, 0x23, 0x02, 0xf0, 0x00, 0xfa, 0x94, + 0x28, 0x00, 0xd0, 0x00, 0xe7, 0xf4, 0x48, 0x0a, + 0x68, 0x00, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xfa, + 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x02, 0xe7, 0xb0, 0xb0, 0x02, 0xe7, 0xae, + 0x2e, 0x08, 0x9d, 0xf0, 0x2e, 0x08, 0xba, 0x30, + 0x68, 0x00, 0x08, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0xba, 0x34, 0xb5, 0xf7, 0x9a, 0x02, + 0x06, 0x15, 0x0e, 0x2d, 0x9c, 0x00, 0x88, 0x66, + 0x42, 0xb5, 0xdd, 0x04, 0x20, 0xff, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x20, + 0x19, 0x40, 0x06, 0x07, 0x0e, 0x3f, 0x23, 0xff, + 0x33, 0x01, 0x42, 0x9f, 0xdd, 0x01, 0x20, 0xff, + 0xe7, 0xf1, 0x49, 0x0a, 0x20, 0x91, 0xf0, 0x11, + 0xf9, 0xff, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x01, 0xfd, 0xac, 0xe7, 0xf5, 0x99, 0x01, + 0x00, 0xb8, 0x4b, 0x05, 0x18, 0xc0, 0x60, 0x01, + 0x20, 0x92, 0x49, 0x02, 0x60, 0x08, 0x20, 0x00, + 0xe7, 0xdd, 0xe7, 0xdc, 0x2e, 0x08, 0xba, 0x30, + 0x68, 0x00, 0x08, 0x00, 0xb5, 0xf7, 0x9a, 0x02, + 0x06, 0x14, 0x0e, 0x24, 0x9f, 0x00, 0x88, 0x7d, + 0x78, 0x38, 0x19, 0x00, 0x06, 0x06, 0x0e, 0x36, + 0x42, 0xac, 0xdd, 0x04, 0x20, 0xff, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x49, 0x0b, + 0x20, 0x91, 0xf0, 0x11, 0xf9, 0xd5, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfd, 0x82, + 0xe7, 0xf5, 0x00, 0xb0, 0x4b, 0x06, 0x18, 0xc0, + 0x68, 0x00, 0x99, 0x01, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x02, 0x60, 0x08, 0x20, 0x00, 0xe7, 0xe6, + 0xe7, 0xe5, 0x00, 0x00, 0x2e, 0x08, 0xba, 0x30, + 0x68, 0x00, 0x08, 0x00, 0x1c, 0x01, 0x1c, 0x0a, + 0x88, 0x50, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x80, + 0x1c, 0x01, 0x1c, 0x0f, 0x69, 0x3a, 0x2a, 0x08, + 0xd2, 0x12, 0xa3, 0x02, 0x5c, 0x9b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x07, 0x09, 0x0b, + 0x04, 0x07, 0x09, 0x0b, 0x20, 0x02, 0xbc, 0x80, + 0x47, 0x70, 0x20, 0x04, 0xe7, 0xfb, 0x20, 0x10, + 0xe7, 0xf9, 0x20, 0xff, 0x30, 0x01, 0xe7, 0xf6, + 0x20, 0x00, 0xe7, 0xf4, 0xe7, 0xf3, 0xb5, 0xf3, + 0x98, 0x00, 0x06, 0x05, 0x0e, 0x2d, 0x48, 0x89, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x8b, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x48, 0x85, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x04, + 0x2d, 0x17, 0xdd, 0x02, 0x20, 0x8c, 0xe7, 0xf3, + 0xe0, 0xfe, 0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c, + 0xe7, 0xee, 0x49, 0x80, 0x20, 0x91, 0xf0, 0x11, + 0xf9, 0x7f, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x01, 0xfd, 0x2c, 0xe7, 0xf5, 0x1c, 0x28, + 0xf7, 0xf8, 0xfc, 0xd8, 0x1c, 0x04, 0x2c, 0x00, + 0xd0, 0x09, 0x68, 0xa0, 0x4b, 0x78, 0x40, 0x18, + 0x99, 0x01, 0x07, 0xc9, 0x09, 0xc9, 0x43, 0x08, + 0x60, 0xa0, 0x01, 0xc0, 0xe0, 0x04, 0x20, 0x92, + 0x49, 0x72, 0x60, 0x08, 0x20, 0xff, 0xe7, 0xcf, + 0x48, 0x6f, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x11, + 0x99, 0x01, 0x29, 0x00, 0xd0, 0x06, 0x48, 0x6f, + 0x21, 0x01, 0x40, 0xa9, 0x68, 0x02, 0x43, 0x11, + 0x60, 0x01, 0xe0, 0x06, 0x48, 0x6b, 0x21, 0x01, + 0x40, 0xa9, 0x43, 0xc9, 0x68, 0x02, 0x40, 0x11, + 0x60, 0x01, 0xe0, 0xbf, 0x68, 0xe0, 0xf0, 0x02, + 0xfc, 0x3b, 0x28, 0x00, 0xd0, 0x73, 0xb0, 0x81, + 0x49, 0x65, 0x20, 0x91, 0xf0, 0x11, 0xf9, 0x44, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x02, + 0xfc, 0x8a, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x60, 0x68, 0x09, 0x60, 0x08, + 0x27, 0x00, 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x14, + 0x2f, 0x07, 0xd2, 0x12, 0x6a, 0xe0, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, + 0x18, 0x18, 0x00, 0xc0, 0x4a, 0x57, 0x68, 0x12, + 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, + 0x6f, 0xc0, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01, + 0xe7, 0xe8, 0x2e, 0x00, 0xd1, 0x13, 0x2f, 0x18, + 0xd2, 0x11, 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, 0x43, 0x58, + 0x4a, 0x4c, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, + 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, + 0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe9, 0x3f, 0x01, + 0x2f, 0x07, 0xd2, 0x32, 0x99, 0x02, 0x29, 0x00, + 0xd0, 0x16, 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, + 0x49, 0x42, 0x68, 0x09, 0x18, 0x40, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc0, 0x6e, 0x80, 0x4b, 0x40, + 0x43, 0x18, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, + 0x4a, 0x3c, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x17, + 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x37, + 0x68, 0x09, 0x18, 0x40, 0x23, 0x05, 0x02, 0x1b, + 0x18, 0xc0, 0x6e, 0x80, 0x04, 0x00, 0x0c, 0x00, + 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x31, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, + 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x00, 0xe0, 0x45, + 0xe0, 0x2b, 0x99, 0x02, 0x29, 0x00, 0xd0, 0x14, + 0x20, 0x4c, 0x43, 0x78, 0x49, 0x29, 0x68, 0x09, + 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x68, 0x00, 0x4b, 0x27, 0x43, 0x18, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x24, 0x68, 0x12, 0x18, 0x89, + 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 0x60, 0x08, + 0xe0, 0x13, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x1f, + 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x19, 0x68, 0x12, + 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, + 0x60, 0x08, 0x48, 0x16, 0x68, 0x00, 0xf0, 0x02, + 0xfc, 0x05, 0x49, 0x13, 0x20, 0x91, 0xf0, 0x11, + 0xf8, 0x9f, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0x48, 0x10, 0x68, 0x00, 0x90, 0x00, 0x48, 0x11, + 0x68, 0x00, 0x49, 0x0e, 0x60, 0x08, 0x98, 0x00, + 0x49, 0x0e, 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, + 0x60, 0x08, 0xb0, 0x01, 0x20, 0x92, 0x49, 0x05, + 0x60, 0x08, 0x20, 0x00, 0xe6, 0xf4, 0xe6, 0xf3, + 0xe6, 0xf2, 0x00, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x30, + 0xfe, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x20, + 0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, + 0xff, 0xff, 0x00, 0x00, 0x2e, 0x08, 0xbb, 0x24, + 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x26, + 0x0e, 0x36, 0x48, 0x0f, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x2e, 0x07, 0xdd, 0x01, 0x20, 0x8c, + 0xe7, 0xf8, 0x1c, 0x30, 0xf7, 0xf8, 0xfb, 0xc2, + 0x1c, 0x05, 0x2d, 0x00, 0xd0, 0x04, 0x68, 0xa8, + 0x01, 0xc0, 0x0f, 0xc0, 0x60, 0x38, 0xe0, 0x04, + 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0xff, + 0xe7, 0xe8, 0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5, + 0x2e, 0x08, 0x9d, 0xf0, 0x2e, 0x08, 0xba, 0x30, + 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, + 0x0e, 0x2d, 0x48, 0x20, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x48, 0x1d, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x04, 0x2d, 0x17, 0xdd, 0x02, 0x20, 0x8c, + 0xe7, 0xf4, 0xe0, 0x2d, 0x2d, 0x07, 0xdd, 0x01, + 0x20, 0x8c, 0xe7, 0xef, 0x48, 0x16, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xe9, + 0x49, 0x14, 0x20, 0x91, 0xf0, 0x11, 0xf8, 0x28, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, + 0xfb, 0xd5, 0xe7, 0xf5, 0x2f, 0x00, 0xd0, 0x08, + 0x48, 0x0f, 0x1d, 0xe9, 0x31, 0x01, 0x22, 0x01, + 0x40, 0x8a, 0x68, 0x01, 0x43, 0x11, 0x60, 0x01, + 0xe0, 0x08, 0x48, 0x0b, 0x1d, 0xea, 0x32, 0x01, + 0x21, 0x01, 0x40, 0x91, 0x43, 0xc9, 0x68, 0x02, + 0x40, 0x11, 0x60, 0x01, 0x20, 0x92, 0x49, 0x05, + 0x60, 0x08, 0x20, 0x00, 0xe7, 0xc6, 0xe7, 0xc5, + 0xe7, 0xc4, 0x00, 0x00, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x30, + 0x68, 0x00, 0x00, 0x20, 0xb4, 0x90, 0x1c, 0x07, + 0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x48, 0x10, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x8b, + 0xbc, 0x90, 0x47, 0x70, 0x29, 0x07, 0xdd, 0x01, + 0x20, 0x8c, 0xe7, 0xf9, 0x48, 0x0b, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xf3, + 0x1d, 0xc8, 0x30, 0x01, 0x24, 0x01, 0x40, 0x84, + 0x1c, 0x23, 0x20, 0x0d, 0x06, 0xc0, 0x6a, 0x00, + 0x40, 0x18, 0x1d, 0xcc, 0x34, 0x01, 0x40, 0xe0, + 0x60, 0x10, 0x20, 0x00, 0xe7, 0xe4, 0xe7, 0xe3, + 0x2e, 0x08, 0x9d, 0xf0, 0x2e, 0x08, 0xd1, 0xf0, + 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, + 0x0e, 0x2d, 0x48, 0x13, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c, + 0xe7, 0xf8, 0x48, 0x0e, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xf2, 0x49, 0x0c, + 0x20, 0x91, 0xf0, 0x10, 0xff, 0xb9, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfb, 0x66, + 0xe7, 0xf5, 0x08, 0xb8, 0x00, 0xa9, 0x4b, 0x07, + 0x18, 0xc9, 0x67, 0x08, 0x20, 0x92, 0x49, 0x04, + 0x60, 0x08, 0x20, 0x00, 0xe7, 0xde, 0xe7, 0xdd, + 0x2e, 0x08, 0x9d, 0xf0, 0x2e, 0x08, 0xd1, 0xf0, + 0x2e, 0x08, 0xba, 0x30, 0x68, 0x00, 0x0e, 0x00, + 0xb4, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, + 0x1c, 0x1e, 0x04, 0x3f, 0x0c, 0x3f, 0x1c, 0x39, + 0x29, 0x00, 0xd8, 0x02, 0xe0, 0x04, 0x39, 0x01, + 0xe7, 0xfa, 0xcd, 0x04, 0xc4, 0x04, 0xe7, 0xfa, + 0x20, 0x92, 0x4a, 0x03, 0x60, 0x10, 0x20, 0x00, + 0xbc, 0xf0, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, + 0x2e, 0x08, 0xba, 0x34, 0x20, 0x00, 0x6b, 0x00, + 0x49, 0x63, 0x60, 0x08, 0x20, 0x00, 0x6b, 0x40, + 0x49, 0x62, 0x60, 0x08, 0x48, 0x62, 0x49, 0x63, + 0x60, 0x08, 0x48, 0x63, 0x49, 0x63, 0x60, 0x08, + 0x20, 0x00, 0x6a, 0xc0, 0x49, 0x62, 0x60, 0x08, + 0x48, 0x62, 0x49, 0x63, 0x60, 0x08, 0x48, 0x63, + 0x49, 0x63, 0x60, 0x08, 0x48, 0x63, 0x49, 0x64, + 0x60, 0x08, 0x20, 0x00, 0x6b, 0x80, 0x49, 0x63, + 0x60, 0x08, 0x20, 0x00, 0x6b, 0xc0, 0x49, 0x62, + 0x60, 0x08, 0x20, 0x00, 0x6c, 0x00, 0x49, 0x61, + 0x60, 0x08, 0x20, 0x00, 0x6c, 0x40, 0x49, 0x60, + 0x60, 0x08, 0x20, 0x00, 0x6c, 0x80, 0x49, 0x5f, + 0x60, 0x08, 0x20, 0x00, 0x6c, 0xc0, 0x49, 0x5e, + 0x60, 0x08, 0x20, 0x00, 0x6e, 0xc0, 0x49, 0x5d, + 0x60, 0x08, 0x20, 0x80, 0x6d, 0x00, 0x49, 0x5c, + 0x60, 0x08, 0x20, 0x80, 0x6d, 0x40, 0x49, 0x5b, + 0x60, 0x08, 0x20, 0x80, 0x6d, 0x80, 0x49, 0x5a, + 0x60, 0x08, 0x20, 0x00, 0x6d, 0x00, 0x49, 0x59, + 0x60, 0x08, 0x20, 0x00, 0x6d, 0x40, 0x49, 0x58, + 0x60, 0x08, 0x20, 0x00, 0x6d, 0x80, 0x49, 0x57, + 0x60, 0x08, 0x20, 0x00, 0x6d, 0xc0, 0x49, 0x56, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0xc0, 0x49, 0x55, + 0x60, 0x08, 0x20, 0x80, 0x6d, 0xc0, 0x49, 0x54, + 0x60, 0x08, 0x20, 0x80, 0x6c, 0xc0, 0x49, 0x53, + 0x60, 0x08, 0x20, 0x80, 0x68, 0x40, 0x49, 0x52, + 0x60, 0x08, 0x20, 0x80, 0x68, 0x80, 0x49, 0x51, + 0x60, 0x08, 0x20, 0x80, 0x68, 0xc0, 0x49, 0x50, + 0x60, 0x08, 0x20, 0x80, 0x69, 0x00, 0x49, 0x4f, + 0x60, 0x08, 0x20, 0x80, 0x69, 0x40, 0x49, 0x4e, + 0x60, 0x08, 0x20, 0x80, 0x69, 0x80, 0x49, 0x4d, + 0x60, 0x08, 0x20, 0x80, 0x69, 0xc0, 0x49, 0x4c, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0x00, 0x49, 0x4b, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0x40, 0x49, 0x4a, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0x80, 0x49, 0x49, + 0x60, 0x08, 0x20, 0x00, 0x6f, 0x00, 0x49, 0x48, + 0x60, 0x08, 0x20, 0x00, 0x6f, 0x40, 0x49, 0x47, + 0x60, 0x08, 0x20, 0x80, 0x6c, 0x40, 0x49, 0x46, + 0x60, 0x08, 0x20, 0x80, 0x6c, 0x80, 0x49, 0x45, + 0x60, 0x08, 0x20, 0x80, 0x6e, 0x40, 0x49, 0x44, + 0x60, 0x08, 0x20, 0x80, 0x6e, 0x80, 0x49, 0x43, + 0x60, 0x08, 0x20, 0x00, 0x49, 0x42, 0x60, 0x08, + 0x20, 0x00, 0x49, 0x41, 0x60, 0x48, 0x48, 0x41, + 0x49, 0x3f, 0x60, 0x88, 0x48, 0x40, 0x49, 0x3e, + 0x60, 0xc8, 0x20, 0xff, 0x30, 0x01, 0x68, 0x40, + 0x49, 0x3e, 0x60, 0x08, 0x20, 0x80, 0x6e, 0xc0, + 0x49, 0x3d, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x00, + 0x49, 0x3c, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x40, + 0x49, 0x3b, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x80, + 0x49, 0x3a, 0x60, 0x08, 0x20, 0x80, 0x6f, 0xc0, + 0x49, 0x39, 0x60, 0x08, 0x20, 0xff, 0x30, 0x01, + 0x68, 0x80, 0x49, 0x38, 0x60, 0x08, 0x47, 0x70, + 0x2e, 0x08, 0x9b, 0x28, 0x2e, 0x08, 0x9b, 0x2c, + 0x64, 0x00, 0x05, 0x00, 0x2e, 0x08, 0x9b, 0x34, + 0x64, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x9b, 0x38, + 0x2e, 0x08, 0x9b, 0x30, 0x64, 0x00, 0x04, 0x00, + 0x2e, 0x08, 0x9b, 0x3c, 0x9e, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x9b, 0x54, 0x9e, 0x00, 0x05, 0x00, + 0x2e, 0x08, 0x9b, 0x40, 0x2e, 0x08, 0xd2, 0x08, + 0x2e, 0x08, 0xd2, 0x0c, 0x2e, 0x08, 0xd2, 0x10, + 0x2e, 0x08, 0xd2, 0x14, 0x2e, 0x08, 0x9b, 0x44, + 0x2e, 0x08, 0x9b, 0x48, 0x2e, 0x08, 0x9b, 0x58, + 0x2e, 0x08, 0x9b, 0x5c, 0x2e, 0x08, 0x9b, 0x60, + 0x2e, 0x08, 0x9b, 0x64, 0x2e, 0x08, 0x9b, 0x4c, + 0x2e, 0x08, 0x9b, 0x50, 0x2e, 0x08, 0x9d, 0xd8, + 0x2e, 0x08, 0x9d, 0xdc, 0x2e, 0x08, 0x9b, 0x68, + 0x2e, 0x08, 0x9b, 0x6c, 0x2e, 0x08, 0x9b, 0x98, + 0x2e, 0x08, 0x9b, 0x70, 0x2e, 0x08, 0x9b, 0x74, + 0x2e, 0x08, 0x9b, 0x78, 0x2e, 0x08, 0x9b, 0x7c, + 0x2e, 0x08, 0x9b, 0x80, 0x2e, 0x08, 0x9b, 0x84, + 0x2e, 0x08, 0x9b, 0x88, 0x2e, 0x08, 0x9b, 0x8c, + 0x2e, 0x08, 0x9b, 0x90, 0x2e, 0x08, 0x9b, 0x94, + 0x2e, 0x08, 0x9b, 0x1c, 0x2e, 0x08, 0x9b, 0x20, + 0x2e, 0x08, 0xb9, 0xb0, 0x2e, 0x08, 0x9b, 0xc0, + 0x2e, 0x08, 0x9b, 0xa0, 0x2e, 0x08, 0x9d, 0xe0, + 0x2e, 0x08, 0xb9, 0x88, 0xcc, 0x1f, 0xe0, 0x00, + 0xcc, 0x1f, 0xfe, 0x00, 0x2e, 0x08, 0x9b, 0xac, + 0x2e, 0x08, 0x9b, 0xc4, 0x2e, 0x08, 0x9b, 0xa4, + 0x2e, 0x08, 0x9b, 0xa8, 0x2e, 0x08, 0xb9, 0xac, + 0x2e, 0x08, 0xb9, 0x84, 0x2e, 0x08, 0x9b, 0xb4, + 0x49, 0x4f, 0x68, 0x0a, 0x23, 0x04, 0x43, 0x1a, + 0x60, 0x0a, 0x21, 0xff, 0x4a, 0x4d, 0x68, 0x12, + 0x32, 0x40, 0x72, 0x11, 0x21, 0xff, 0x4a, 0x4b, + 0x68, 0x12, 0x32, 0x40, 0x76, 0x11, 0x21, 0xff, + 0x4a, 0x48, 0x68, 0x12, 0x32, 0x60, 0x72, 0x11, + 0x21, 0xff, 0x4a, 0x46, 0x68, 0x12, 0x32, 0x20, + 0x72, 0x11, 0x21, 0xff, 0x4a, 0x43, 0x68, 0x12, + 0x32, 0x20, 0x76, 0x11, 0x21, 0xff, 0x4a, 0x41, + 0x68, 0x12, 0x32, 0x60, 0x76, 0x11, 0x21, 0x00, + 0x4a, 0x3e, 0x68, 0x12, 0x32, 0x40, 0x72, 0x91, + 0x21, 0x00, 0x4a, 0x3c, 0x68, 0x12, 0x32, 0x40, + 0x76, 0x91, 0x21, 0x00, 0x4a, 0x39, 0x68, 0x12, + 0x32, 0x60, 0x72, 0x91, 0x21, 0x00, 0x4a, 0x37, + 0x68, 0x12, 0x32, 0x20, 0x72, 0x91, 0x21, 0x00, + 0x4a, 0x34, 0x68, 0x12, 0x32, 0x20, 0x76, 0x91, + 0x21, 0x00, 0x4a, 0x32, 0x68, 0x12, 0x32, 0x60, + 0x76, 0x91, 0x21, 0x00, 0x4a, 0x2f, 0x68, 0x12, + 0x32, 0x80, 0x70, 0xd1, 0x21, 0x00, 0x4a, 0x2d, + 0x68, 0x12, 0x32, 0x80, 0x70, 0x51, 0x21, 0x00, + 0x4a, 0x2a, 0x68, 0x12, 0x32, 0x80, 0x70, 0x91, + 0x21, 0x00, 0x4a, 0x29, 0x60, 0x11, 0x21, 0x00, + 0x4a, 0x28, 0x64, 0x11, 0x21, 0x03, 0x4a, 0x28, + 0x61, 0x11, 0x49, 0x28, 0x68, 0x0a, 0x4b, 0x28, + 0x43, 0x1a, 0x60, 0x0a, 0x49, 0x26, 0x22, 0x33, + 0x06, 0x52, 0x60, 0x51, 0x21, 0x00, 0x4a, 0x25, + 0x70, 0x11, 0x21, 0x00, 0x4a, 0x23, 0x70, 0x51, + 0x21, 0x00, 0x4a, 0x22, 0x70, 0x91, 0x21, 0x00, + 0x4a, 0x20, 0x70, 0xd1, 0x21, 0x00, 0x4a, 0x1f, + 0x71, 0x11, 0x21, 0x00, 0x4a, 0x1d, 0x71, 0x51, + 0x21, 0x00, 0x4a, 0x1c, 0x71, 0x91, 0x21, 0x00, + 0x4a, 0x1a, 0x71, 0xd1, 0x21, 0x00, 0x4a, 0x19, + 0x72, 0x11, 0x21, 0x00, 0x4a, 0x17, 0x72, 0x51, + 0x21, 0x00, 0x4a, 0x16, 0x72, 0x91, 0x21, 0x00, + 0x4a, 0x14, 0x72, 0xd1, 0x21, 0x00, 0x4a, 0x13, + 0x73, 0x11, 0x21, 0xff, 0x4a, 0x11, 0x70, 0x11, + 0x21, 0x00, 0x4a, 0x10, 0x70, 0x11, 0x21, 0x00, + 0x4a, 0x0e, 0x70, 0x51, 0x20, 0x00, 0x28, 0x20, + 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x41, 0x06, 0x08, + 0x0e, 0x00, 0xe7, 0xf8, 0x21, 0xff, 0x4a, 0x03, + 0x68, 0x12, 0x54, 0x11, 0xe7, 0xf6, 0x47, 0x70, + 0x66, 0x00, 0x01, 0x18, 0x2e, 0x08, 0xb9, 0xb0, + 0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, + 0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, + 0x23, 0x48, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xb4, + 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x39, + 0x0e, 0x09, 0x29, 0x05, 0xd2, 0x40, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x03, 0x14, 0x07, 0x0d, 0x13, 0x00, 0x78, 0x10, + 0x4b, 0x1f, 0x70, 0x18, 0xe0, 0x38, 0x78, 0x50, + 0x4b, 0x1e, 0x68, 0x1b, 0x33, 0x80, 0x71, 0x58, + 0xe0, 0x32, 0x78, 0x10, 0x4b, 0x1b, 0x68, 0x1b, + 0x33, 0x80, 0x71, 0x18, 0xe0, 0x2c, 0xe0, 0x2b, + 0x78, 0x10, 0x4b, 0x17, 0x70, 0x18, 0x78, 0x50, + 0x4b, 0x15, 0x70, 0x58, 0x78, 0x90, 0x4b, 0x14, + 0x70, 0x98, 0x78, 0xd0, 0x4b, 0x12, 0x70, 0xd8, + 0x79, 0x10, 0x4b, 0x11, 0x71, 0x18, 0x79, 0x50, + 0x4b, 0x0f, 0x71, 0x58, 0x79, 0x90, 0x4b, 0x0e, + 0x71, 0x98, 0x79, 0xd0, 0x4b, 0x0c, 0x71, 0xd8, + 0x7a, 0x10, 0x4b, 0x0b, 0x72, 0x18, 0x7a, 0x50, + 0x4b, 0x09, 0x72, 0x58, 0x7a, 0x90, 0x4b, 0x08, + 0x72, 0x98, 0x7a, 0xd0, 0x4b, 0x06, 0x72, 0xd8, + 0x7b, 0x10, 0x4b, 0x05, 0x73, 0x18, 0xe0, 0x03, + 0x20, 0x4a, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xff, + 0x20, 0x00, 0xe7, 0xfa, 0xe7, 0xf9, 0x00, 0x00, + 0x2e, 0x08, 0xb9, 0xb4, 0x2e, 0x08, 0xb9, 0xb0, + 0xb5, 0xf3, 0x1c, 0x07, 0x06, 0x3e, 0x0e, 0x36, + 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0x2e, 0x20, + 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x02, 0xd0, 0x03, + 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, + 0x48, 0xb8, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x39, 0x48, 0xb5, 0x68, 0x00, + 0x30, 0x20, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x33, + 0x2c, 0x00, 0xd1, 0x17, 0x48, 0xb1, 0x68, 0x00, + 0x30, 0x40, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x2b, + 0x48, 0xae, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80, + 0x28, 0x00, 0xd1, 0x25, 0x48, 0xab, 0x68, 0x00, + 0x30, 0x60, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x1f, + 0x48, 0xa8, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80, + 0x28, 0x00, 0xd1, 0x19, 0x2c, 0x01, 0xd1, 0x19, + 0x48, 0xa4, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x11, 0x48, 0xa1, 0x68, 0x00, + 0x30, 0x40, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x0b, + 0x48, 0x9e, 0x68, 0x00, 0x30, 0x60, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x05, 0x48, 0x9b, 0x68, 0x00, + 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 0xd0, 0x01, + 0x20, 0x49, 0xe7, 0xb3, 0x48, 0x97, 0x68, 0x00, + 0x55, 0x84, 0x2c, 0xff, 0xd0, 0x73, 0x20, 0x01, + 0x49, 0x95, 0x60, 0x48, 0x2c, 0x05, 0xd2, 0x6f, + 0xa3, 0x01, 0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, + 0x02, 0x34, 0x30, 0x30, 0x30, 0x00, 0x20, 0x02, + 0x49, 0x90, 0x61, 0x88, 0x48, 0x90, 0x6a, 0xc0, + 0x49, 0x90, 0x60, 0x08, 0x48, 0x90, 0x68, 0x01, + 0x23, 0x01, 0x07, 0x5b, 0x43, 0x19, 0x60, 0x01, + 0x48, 0x8e, 0x49, 0x8b, 0x62, 0xc8, 0x48, 0x8c, + 0x68, 0x01, 0x4b, 0x8d, 0x40, 0x19, 0x60, 0x01, + 0x20, 0x01, 0x21, 0x31, 0x06, 0x49, 0x61, 0x88, + 0x20, 0x15, 0x21, 0x31, 0x06, 0x49, 0x61, 0x08, + 0x20, 0x0f, 0x21, 0x31, 0x06, 0x49, 0x61, 0xc8, + 0x20, 0x0c, 0x21, 0x31, 0x06, 0x49, 0x61, 0xc8, + 0x20, 0x54, 0x21, 0x31, 0x06, 0x49, 0x62, 0xc8, + 0x20, 0x37, 0x21, 0x31, 0x06, 0x49, 0x60, 0x88, + 0xe0, 0x56, 0x20, 0x00, 0x49, 0x79, 0x61, 0x88, + 0xe0, 0x52, 0x20, 0x01, 0x49, 0x77, 0x61, 0x88, + 0x20, 0x01, 0x49, 0x7c, 0x62, 0x88, 0x48, 0x7c, + 0x78, 0x00, 0x06, 0x80, 0x0e, 0x80, 0x02, 0x80, + 0x49, 0x79, 0x78, 0x49, 0x07, 0xc9, 0x0d, 0x89, + 0x43, 0x08, 0x49, 0x77, 0x78, 0x89, 0x07, 0xc9, + 0x0d, 0xc9, 0x43, 0x08, 0x49, 0x74, 0x78, 0xc9, + 0x07, 0x89, 0x0f, 0x89, 0x01, 0x89, 0x43, 0x08, + 0x49, 0x71, 0x79, 0x09, 0x07, 0x89, 0x0f, 0x89, + 0x01, 0x09, 0x43, 0x08, 0x49, 0x6e, 0x79, 0x49, + 0x07, 0x89, 0x0f, 0x89, 0x00, 0x89, 0x43, 0x08, + 0x49, 0x6b, 0x79, 0x89, 0x07, 0x89, 0x0f, 0x89, + 0x43, 0x08, 0x49, 0x68, 0x62, 0x08, 0x48, 0x68, + 0x79, 0xc0, 0x07, 0xc0, 0x0e, 0x40, 0x49, 0x66, + 0x7a, 0x09, 0x07, 0xc9, 0xe0, 0x01, 0xe0, 0x21, + 0xe0, 0x18, 0x0e, 0xc9, 0x43, 0x08, 0x49, 0x62, + 0x7a, 0x49, 0x07, 0xc9, 0x0f, 0x09, 0x43, 0x08, + 0x49, 0x5f, 0x7a, 0x89, 0x07, 0xc9, 0x0f, 0x49, + 0x43, 0x08, 0x49, 0x5d, 0x7a, 0xc9, 0x07, 0xc9, + 0x0f, 0x89, 0x43, 0x08, 0x49, 0x5a, 0x7b, 0x09, + 0x07, 0xc9, 0x0f, 0xc9, 0x43, 0x08, 0x49, 0x57, + 0x62, 0x48, 0xe0, 0x01, 0x20, 0x4a, 0xe7, 0x1d, + 0x48, 0x51, 0x68, 0x01, 0x4b, 0x55, 0x40, 0x19, + 0x60, 0x01, 0xe0, 0x8f, 0x48, 0x49, 0x68, 0x00, + 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x08, + 0x22, 0x00, 0xb4, 0x04, 0x1c, 0x30, 0x23, 0x00, + 0x22, 0x00, 0x49, 0x4f, 0xf7, 0xf4, 0xfc, 0x10, + 0xb0, 0x01, 0x20, 0x00, 0x49, 0x42, 0x60, 0x48, + 0x48, 0x45, 0x68, 0x01, 0x4b, 0x4b, 0x43, 0x19, + 0x60, 0x01, 0x48, 0x4a, 0x21, 0x33, 0x06, 0x49, + 0x60, 0x48, 0x48, 0x49, 0x68, 0x01, 0x23, 0x04, + 0x43, 0x19, 0x60, 0x01, 0x2c, 0x00, 0xd1, 0x0e, + 0x48, 0x3c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0a, + 0x48, 0x3a, 0x68, 0x00, 0x49, 0x38, 0x62, 0xc8, + 0x20, 0x00, 0x49, 0x38, 0x60, 0x08, 0x20, 0x00, + 0x21, 0x31, 0x06, 0x49, 0x61, 0x88, 0x20, 0x00, + 0x49, 0x30, 0x68, 0x09, 0x31, 0x80, 0x70, 0x48, + 0x20, 0x00, 0x49, 0x2e, 0x68, 0x09, 0x31, 0x80, + 0x70, 0x88, 0x20, 0x00, 0x49, 0x39, 0x60, 0x08, + 0x20, 0x00, 0x49, 0x39, 0x64, 0x08, 0x20, 0x03, + 0x49, 0x2a, 0x61, 0x08, 0x25, 0x00, 0x2d, 0x20, + 0xd3, 0x02, 0xe0, 0x06, 0x35, 0x01, 0xe7, 0xfa, + 0x20, 0xff, 0x49, 0x24, 0x68, 0x09, 0x55, 0x48, + 0xe7, 0xf8, 0x20, 0xff, 0x49, 0x21, 0x68, 0x09, + 0x31, 0x40, 0x72, 0x08, 0x20, 0xff, 0x49, 0x1f, + 0x68, 0x09, 0x31, 0x40, 0x76, 0x08, 0x20, 0xff, + 0x49, 0x1c, 0x68, 0x09, 0x31, 0x60, 0x72, 0x08, + 0x20, 0xff, 0x49, 0x1a, 0x68, 0x09, 0x31, 0x20, + 0x72, 0x08, 0x20, 0xff, 0x49, 0x17, 0x68, 0x09, + 0x31, 0x20, 0x76, 0x08, 0x20, 0xff, 0x49, 0x15, + 0x68, 0x09, 0x31, 0x60, 0x76, 0x08, 0x20, 0x00, + 0x49, 0x12, 0x68, 0x09, 0x31, 0x40, 0x72, 0x88, + 0x20, 0x00, 0x49, 0x10, 0x68, 0x09, 0x31, 0x40, + 0x76, 0x88, 0x20, 0x00, 0x49, 0x0d, 0x68, 0x09, + 0x31, 0x60, 0x72, 0x88, 0x20, 0x00, 0x49, 0x0b, + 0x68, 0x09, 0x31, 0x20, 0x72, 0x88, 0x20, 0x00, + 0x49, 0x08, 0x68, 0x09, 0x31, 0x20, 0x76, 0x88, + 0x20, 0x00, 0x49, 0x06, 0x68, 0x09, 0x31, 0x60, + 0x76, 0x88, 0x20, 0x00, 0x49, 0x03, 0x68, 0x09, + 0x31, 0x80, 0x70, 0xc8, 0x20, 0x00, 0xe6, 0x85, + 0xe6, 0x84, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xb0, + 0x62, 0x00, 0x03, 0x00, 0x66, 0x00, 0x01, 0x00, + 0xa0, 0x00, 0x0d, 0x80, 0x2e, 0x08, 0x20, 0x88, + 0x66, 0x00, 0x00, 0x08, 0x2e, 0x01, 0xe1, 0xa8, + 0xdf, 0xff, 0xff, 0xff, 0x62, 0x01, 0x00, 0x00, + 0x2e, 0x08, 0xb9, 0xb4, 0xfc, 0xb7, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x23, 0x48, 0x00, 0x00, + 0x66, 0x00, 0x01, 0x18, 0x9e, 0x00, 0x0a, 0x00, + 0x9e, 0x00, 0x0a, 0x80, 0xb5, 0xf7, 0x1c, 0x17, + 0x98, 0x00, 0x06, 0x02, 0x0e, 0x12, 0x99, 0x01, + 0x06, 0x0d, 0x0e, 0x2d, 0x48, 0x6a, 0x68, 0x00, + 0x5c, 0x81, 0x2a, 0x20, 0xdb, 0x04, 0x20, 0xa2, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x29, 0xff, 0xd1, 0x01, 0x20, 0x4b, 0xe7, 0xf7, + 0x48, 0x64, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x03, + 0x29, 0x04, 0xd1, 0x01, 0x20, 0x58, 0xe7, 0xef, + 0x48, 0x60, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x03, + 0x29, 0x02, 0xd0, 0x01, 0x29, 0x03, 0xd1, 0x0b, + 0x48, 0x5c, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, + 0x29, 0x00, 0xd1, 0x05, 0x48, 0x59, 0x69, 0x80, + 0x28, 0x01, 0xd1, 0x03, 0x29, 0x01, 0xd0, 0x01, + 0x20, 0x4d, 0xe7, 0xd9, 0x29, 0x02, 0xd1, 0x05, + 0x48, 0x53, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x17, 0x29, 0x03, 0xd1, 0x05, + 0x48, 0x4f, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80, + 0x28, 0x00, 0xd1, 0x0f, 0x29, 0x00, 0xd1, 0x05, + 0x48, 0x4b, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x07, 0x29, 0x01, 0xd1, 0x07, + 0x48, 0x47, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0x4e, 0xe7, 0xb7, + 0x68, 0x78, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x4c, + 0xe7, 0xb2, 0x23, 0x01, 0x01, 0x08, 0x4e, 0x40, + 0x68, 0x36, 0x19, 0x80, 0x30, 0x20, 0x72, 0x83, + 0x2d, 0x01, 0xd1, 0x0b, 0x20, 0x33, 0x06, 0x40, + 0x6e, 0x40, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, + 0x00, 0xd3, 0x4e, 0x3b, 0x68, 0x36, 0x19, 0x9b, + 0x60, 0x58, 0xe0, 0x12, 0x2d, 0x02, 0xd1, 0x0a, + 0x48, 0x38, 0x6c, 0xc0, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc3, 0x00, 0xd0, 0x4e, 0x34, 0x68, 0x36, + 0x19, 0x80, 0x60, 0x43, 0xe0, 0x05, 0x68, 0x3b, + 0x00, 0xd0, 0x4e, 0x31, 0x68, 0x36, 0x19, 0x80, + 0x60, 0x43, 0x68, 0x3b, 0x01, 0x08, 0x4e, 0x2c, + 0x68, 0x36, 0x19, 0x80, 0x62, 0x03, 0x68, 0x7b, + 0x01, 0x08, 0x4e, 0x29, 0x68, 0x36, 0x19, 0x80, + 0x62, 0x43, 0x01, 0x08, 0x4b, 0x26, 0x68, 0x1b, + 0x18, 0xc0, 0x62, 0xc7, 0x01, 0x08, 0x4b, 0x24, + 0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20, 0x72, 0x45, + 0x01, 0x08, 0x4b, 0x21, 0x68, 0x1b, 0x18, 0xc0, + 0x30, 0x20, 0x72, 0x02, 0x20, 0x00, 0x60, 0x78, + 0x20, 0x00, 0x72, 0x78, 0x20, 0x00, 0x4b, 0x20, + 0x60, 0x18, 0x20, 0x00, 0x4b, 0x1f, 0x64, 0x18, + 0x01, 0x08, 0x4b, 0x19, 0x68, 0x1b, 0x18, 0xc0, + 0x6a, 0x40, 0x28, 0xbc, 0xdd, 0x01, 0x24, 0xbc, + 0xe0, 0x04, 0x01, 0x08, 0x4b, 0x14, 0x68, 0x1b, + 0x18, 0xc0, 0x6a, 0x44, 0x48, 0x18, 0x60, 0x04, + 0x29, 0x01, 0xd1, 0x14, 0x20, 0x01, 0x4b, 0x17, + 0x62, 0x98, 0x48, 0x17, 0x68, 0x03, 0x04, 0x1b, + 0x0c, 0x1b, 0x60, 0x03, 0x48, 0x14, 0x04, 0x23, + 0x68, 0x06, 0x43, 0x33, 0x60, 0x03, 0x48, 0x13, + 0x68, 0x06, 0x23, 0x20, 0x43, 0x33, 0x60, 0x03, + 0x20, 0x01, 0x4b, 0x0e, 0x63, 0x18, 0x48, 0x07, + 0x69, 0x80, 0x28, 0x00, 0xd1, 0x04, 0x48, 0x0e, + 0x68, 0x06, 0x23, 0x28, 0x43, 0x33, 0x60, 0x03, + 0x20, 0x00, 0xe7, 0x31, 0xe7, 0x30, 0x00, 0x00, + 0x2e, 0x08, 0xb9, 0xb0, 0x66, 0x00, 0x01, 0x00, + 0x2e, 0x08, 0x9b, 0x40, 0x66, 0x00, 0x00, 0x80, + 0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, + 0x62, 0x00, 0x03, 0x00, 0x62, 0x01, 0x00, 0x00, + 0x62, 0x01, 0x00, 0x20, 0x62, 0x01, 0x00, 0x24, + 0x64, 0x00, 0x00, 0x60, 0xb5, 0xf3, 0x1c, 0x0f, + 0x98, 0x00, 0x06, 0x06, 0x0e, 0x36, 0xb0, 0x82, + 0x4d, 0x68, 0x49, 0x69, 0x91, 0x01, 0x48, 0x69, + 0x68, 0x00, 0x5d, 0x84, 0x2e, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, + 0x20, 0x4b, 0xb0, 0x02, 0xe7, 0xf6, 0x48, 0x62, + 0x69, 0x80, 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, + 0xd0, 0x03, 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, + 0xd1, 0x0b, 0x48, 0x5d, 0x69, 0x80, 0x28, 0x02, + 0xd1, 0x01, 0x2c, 0x00, 0xd1, 0x05, 0x48, 0x5a, + 0x69, 0x80, 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, + 0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x02, 0xe7, 0xdd, + 0x48, 0x54, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x4f, 0xb0, 0x02, + 0xe7, 0xd4, 0x48, 0x50, 0x68, 0x00, 0x30, 0x80, + 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x50, + 0xb0, 0x02, 0xe7, 0xcb, 0x68, 0x78, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0x4c, 0xb0, 0x02, 0xe7, 0xc5, + 0x2c, 0x04, 0xd1, 0x08, 0x68, 0x79, 0x20, 0xbc, + 0xf0, 0x01, 0xff, 0xac, 0x29, 0x00, 0xd0, 0x02, + 0x20, 0x59, 0xb0, 0x02, 0xe7, 0xba, 0x48, 0x43, + 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x21, 0x01, + 0x40, 0x81, 0x48, 0x41, 0x68, 0x40, 0x40, 0x08, + 0x07, 0x80, 0x0f, 0x80, 0xd0, 0x02, 0x20, 0x51, + 0xb0, 0x02, 0xe7, 0xab, 0x20, 0x33, 0x06, 0x40, + 0x6b, 0x80, 0x90, 0x00, 0x23, 0x04, 0x40, 0x18, + 0xd0, 0x02, 0x20, 0x52, 0xb0, 0x02, 0xe7, 0xa1, + 0x2c, 0x00, 0xd1, 0x04, 0x48, 0x37, 0x68, 0x01, + 0x23, 0xfd, 0x40, 0x19, 0x60, 0x01, 0x20, 0x01, + 0x49, 0x32, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, + 0x68, 0x38, 0x49, 0x30, 0x68, 0x09, 0x67, 0x08, + 0x68, 0x78, 0x49, 0x2e, 0x68, 0x09, 0x67, 0x48, + 0x48, 0x2c, 0x68, 0x00, 0x67, 0xc7, 0x20, 0x00, + 0x49, 0x2a, 0x68, 0x09, 0x31, 0x60, 0x76, 0x48, + 0x48, 0x28, 0x68, 0x00, 0x30, 0x60, 0x76, 0x06, + 0x20, 0x00, 0x60, 0x78, 0x20, 0x00, 0x72, 0x78, + 0x48, 0x24, 0x68, 0x00, 0x5d, 0x80, 0x28, 0x01, + 0xd1, 0x02, 0x20, 0x01, 0x49, 0x24, 0x62, 0x88, + 0x98, 0x00, 0x01, 0x00, 0x19, 0x45, 0x48, 0x1f, + 0x68, 0x00, 0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07, + 0x48, 0x20, 0x60, 0xa8, 0x20, 0xbc, 0x49, 0x1b, + 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 0xe0, 0x0d, + 0x48, 0x18, 0x68, 0x00, 0x6f, 0x40, 0x23, 0x01, + 0x07, 0x9b, 0x43, 0x18, 0x60, 0xa8, 0x48, 0x15, + 0x68, 0x00, 0x6f, 0x40, 0x49, 0x13, 0x68, 0x09, + 0x31, 0x80, 0x70, 0x08, 0x48, 0x11, 0x68, 0x00, + 0x30, 0x80, 0x78, 0x80, 0x00, 0x43, 0x18, 0x18, + 0x01, 0x80, 0x99, 0x01, 0x18, 0x41, 0x91, 0x01, + 0x48, 0x0c, 0x68, 0x00, 0x6f, 0x00, 0x60, 0x28, + 0x99, 0x01, 0x1d, 0x08, 0x60, 0x68, 0x20, 0x01, + 0x06, 0x00, 0x60, 0xe8, 0x99, 0x00, 0x20, 0x01, + 0x40, 0x88, 0x21, 0x33, 0x06, 0x49, 0x63, 0x48, + 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x3a, 0xb0, 0x02, + 0xe7, 0x38, 0x00, 0x00, 0x9e, 0x00, 0x09, 0x80, + 0x9e, 0x00, 0x0b, 0x80, 0x2e, 0x08, 0xb9, 0xb0, + 0x66, 0x00, 0x01, 0x00, 0x62, 0x00, 0x00, 0x1c, + 0x62, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0xbc, + 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x81, 0x98, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0xb0, 0x82, + 0x48, 0xf9, 0x68, 0x00, 0x99, 0x02, 0x5c, 0x44, + 0x98, 0x02, 0x28, 0x20, 0xdb, 0x05, 0x20, 0xa2, + 0xb0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, 0x20, 0x4b, + 0xb0, 0x03, 0xe7, 0xf6, 0x48, 0xf1, 0x69, 0x80, + 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03, + 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, + 0x48, 0xec, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, + 0x2c, 0x00, 0xd1, 0x05, 0x48, 0xe9, 0x69, 0x80, + 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02, + 0x20, 0x4d, 0xb0, 0x03, 0xe7, 0xdd, 0x48, 0xe4, + 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0x4f, 0xb0, 0x03, 0xe7, 0xd4, + 0x68, 0x78, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x4c, + 0xb0, 0x03, 0xe7, 0xce, 0x2c, 0x04, 0xd1, 0x08, + 0x68, 0x79, 0x20, 0xbc, 0xf0, 0x01, 0xfe, 0xce, + 0x29, 0x00, 0xd0, 0x02, 0x20, 0x59, 0xb0, 0x03, + 0xe7, 0xc3, 0x48, 0xd7, 0x68, 0x00, 0x30, 0x80, + 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x50, + 0xb0, 0x03, 0xe7, 0xba, 0x2c, 0x00, 0xd1, 0x04, + 0x48, 0xd3, 0x68, 0x01, 0x23, 0xfd, 0x40, 0x19, + 0x60, 0x01, 0x48, 0xd2, 0x68, 0x01, 0x23, 0x8d, + 0x05, 0x9b, 0x43, 0x19, 0x60, 0x01, 0x48, 0xd0, + 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x20, 0x01, + 0x49, 0xc9, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, + 0x68, 0x38, 0x49, 0xc7, 0x68, 0x09, 0x67, 0x08, + 0x68, 0x78, 0x49, 0xc5, 0x68, 0x09, 0x67, 0x48, + 0x48, 0xc3, 0x68, 0x00, 0x67, 0xc7, 0x20, 0x00, + 0x49, 0xc1, 0x68, 0x09, 0x31, 0x60, 0x76, 0x48, + 0x98, 0x02, 0x49, 0xbf, 0x68, 0x09, 0x31, 0x60, + 0x76, 0x08, 0x20, 0x00, 0x49, 0xbc, 0x68, 0x09, + 0x6f, 0xc9, 0x60, 0x48, 0x20, 0x00, 0x49, 0xba, + 0x68, 0x09, 0x6f, 0xc9, 0x72, 0x48, 0x48, 0xb8, + 0x68, 0x00, 0x99, 0x02, 0x5c, 0x40, 0x28, 0x01, + 0xd1, 0x02, 0x20, 0x01, 0x49, 0xb9, 0x62, 0x88, + 0x48, 0xb3, 0x68, 0x00, 0x30, 0x80, 0x78, 0x81, + 0x20, 0x01, 0x40, 0x88, 0x49, 0xb1, 0x68, 0x49, + 0x40, 0x08, 0x07, 0x80, 0x0f, 0x80, 0xd0, 0x1b, + 0x20, 0x00, 0x49, 0xad, 0x68, 0x09, 0x31, 0x60, + 0x76, 0x88, 0x20, 0x51, 0x49, 0xaa, 0x68, 0x09, + 0x6f, 0xc9, 0x72, 0x48, 0x48, 0xa8, 0x68, 0x00, + 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x07, + 0x48, 0xa5, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, + 0x20, 0x01, 0x40, 0x88, 0xf0, 0x07, 0xf9, 0xea, + 0x20, 0x51, 0xb0, 0x03, 0xe7, 0x55, 0xe1, 0x6c, + 0x20, 0x33, 0x06, 0x40, 0x6b, 0x81, 0x91, 0x00, + 0x99, 0x00, 0x20, 0x04, 0x40, 0x08, 0xd0, 0x07, + 0x20, 0x04, 0xf0, 0x00, 0xfc, 0xb3, 0x20, 0x33, + 0x06, 0x40, 0x6b, 0x81, 0x91, 0x00, 0xe7, 0xf3, + 0x4d, 0x9d, 0x99, 0x00, 0x01, 0x08, 0x19, 0x45, + 0x48, 0x95, 0x68, 0x00, 0x6f, 0x40, 0x28, 0xbc, + 0xdd, 0x07, 0x48, 0x9a, 0x60, 0xa8, 0x20, 0xbc, + 0x49, 0x91, 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, + 0xe0, 0x0d, 0x48, 0x8f, 0x68, 0x00, 0x6f, 0x40, + 0x23, 0x01, 0x07, 0x9b, 0x43, 0x18, 0x60, 0xa8, + 0x48, 0x8b, 0x68, 0x00, 0x6f, 0x40, 0x49, 0x8a, + 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 0x48, 0x90, + 0x90, 0x01, 0x48, 0x87, 0x68, 0x00, 0x30, 0x80, + 0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, + 0x99, 0x01, 0x18, 0x40, 0x90, 0x01, 0x48, 0x82, + 0x68, 0x00, 0x6f, 0x00, 0x60, 0x28, 0x98, 0x01, + 0x30, 0x04, 0x60, 0x68, 0x20, 0x01, 0x06, 0x00, + 0x60, 0xe8, 0x99, 0x00, 0x20, 0x01, 0x40, 0x88, + 0x21, 0x33, 0x06, 0x49, 0x63, 0x48, 0x48, 0x83, + 0x6b, 0x00, 0x23, 0x01, 0x06, 0x1b, 0x40, 0x18, + 0xd1, 0x03, 0x20, 0x04, 0xf0, 0x00, 0xfc, 0x6a, + 0xe7, 0xf5, 0x20, 0x01, 0x06, 0x00, 0x21, 0x33, + 0x06, 0x49, 0x60, 0x48, 0x4e, 0x7c, 0x48, 0x72, + 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x01, 0x00, + 0x19, 0x86, 0x98, 0x01, 0x30, 0x04, 0x60, 0x30, + 0x48, 0x78, 0x60, 0x70, 0x48, 0x6c, 0x68, 0x00, + 0x30, 0x80, 0x78, 0x00, 0x23, 0x01, 0x07, 0x9b, + 0x43, 0x18, 0x60, 0xb0, 0x20, 0x01, 0x05, 0x80, + 0x60, 0xf0, 0x48, 0x67, 0x68, 0x00, 0x30, 0x80, + 0x78, 0x81, 0x20, 0x01, 0x40, 0x88, 0x49, 0x65, + 0x60, 0xc8, 0x48, 0x63, 0x68, 0x00, 0x30, 0x60, + 0x7e, 0x00, 0x49, 0x61, 0x68, 0x09, 0x5c, 0x08, + 0x28, 0x00, 0xd0, 0x48, 0x28, 0x01, 0xd0, 0x47, + 0x28, 0x02, 0xd0, 0x02, 0x28, 0x03, 0xd0, 0x21, + 0xe0, 0x5a, 0x48, 0x67, 0x68, 0x01, 0x23, 0x02, + 0x43, 0x19, 0x60, 0x01, 0x48, 0x58, 0x68, 0x00, + 0x6f, 0x40, 0x49, 0x57, 0x68, 0x09, 0x31, 0x80, + 0x78, 0x09, 0x1a, 0x40, 0x28, 0xbc, 0xd8, 0x05, + 0x48, 0x5f, 0x68, 0x01, 0x23, 0x10, 0x43, 0x19, + 0x60, 0x01, 0xe0, 0x05, 0x48, 0x5c, 0x68, 0x01, + 0x23, 0x10, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, + 0x48, 0x59, 0x68, 0x01, 0x23, 0x08, 0x43, 0x19, + 0x60, 0x01, 0xe0, 0x39, 0x48, 0x56, 0x68, 0x01, + 0x23, 0x04, 0x43, 0x19, 0x60, 0x01, 0x48, 0x48, + 0x68, 0x00, 0x6f, 0x40, 0x49, 0x46, 0x68, 0x09, + 0x31, 0x80, 0x78, 0x09, 0x1a, 0x40, 0x28, 0xbc, + 0xd8, 0x05, 0x48, 0x4f, 0x68, 0x01, 0x23, 0x10, + 0x43, 0x19, 0x60, 0x01, 0xe0, 0x05, 0x48, 0x4c, + 0x68, 0x01, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x19, + 0x60, 0x01, 0x48, 0x49, 0x68, 0x01, 0x23, 0x08, + 0x43, 0x19, 0x60, 0x01, 0xe0, 0x18, 0xe0, 0x17, + 0x48, 0x46, 0x68, 0x01, 0x04, 0x09, 0x0c, 0x09, + 0x60, 0x01, 0x48, 0x44, 0x49, 0x36, 0x68, 0x09, + 0x31, 0x80, 0x78, 0x09, 0x04, 0x09, 0x68, 0x02, + 0x43, 0x11, 0x60, 0x01, 0x48, 0x40, 0x68, 0x01, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, + 0x20, 0x01, 0x49, 0x34, 0x63, 0x08, 0xe7, 0xff, + 0x48, 0x36, 0x6b, 0x00, 0x23, 0x01, 0x05, 0x9b, + 0x40, 0x18, 0xd1, 0x03, 0x20, 0x04, 0xf0, 0x00, + 0xfb, 0xd1, 0xe7, 0xf5, 0x20, 0x01, 0x05, 0x80, + 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x48, 0x26, + 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x23, 0x01, + 0x40, 0x58, 0x49, 0x23, 0x68, 0x09, 0x31, 0x80, + 0x70, 0x88, 0x48, 0x21, 0x68, 0x00, 0x6f, 0x40, + 0x49, 0x1f, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, + 0x1a, 0x40, 0x49, 0x1d, 0x68, 0x09, 0x67, 0x48, + 0x48, 0x1b, 0x68, 0x00, 0x6f, 0xc0, 0x30, 0x04, + 0x49, 0x19, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, + 0x68, 0x02, 0x18, 0x89, 0x60, 0x01, 0x48, 0x16, + 0x68, 0x00, 0x6f, 0x00, 0x49, 0x14, 0x68, 0x09, + 0x31, 0x80, 0x78, 0x09, 0x18, 0x40, 0x49, 0x12, + 0x68, 0x09, 0x67, 0x08, 0x48, 0x10, 0x68, 0x00, + 0x6f, 0x40, 0x28, 0x00, 0xd0, 0x00, 0xe6, 0xb3, + 0x48, 0x11, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, + 0x48, 0x0e, 0x68, 0x01, 0x4b, 0x19, 0x40, 0x19, + 0x60, 0x01, 0x20, 0x48, 0x49, 0x08, 0x68, 0x09, + 0x6f, 0xc9, 0x72, 0x48, 0x20, 0x00, 0x49, 0x06, + 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x48, 0x04, + 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, + 0xd0, 0x29, 0x48, 0x01, 0xe0, 0x20, 0x00, 0x00, + 0x2e, 0x08, 0xb9, 0xb0, 0x66, 0x00, 0x01, 0x00, + 0x62, 0x00, 0x00, 0x1c, 0x66, 0x00, 0x00, 0x08, + 0x23, 0x48, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, + 0x9e, 0x00, 0x09, 0x80, 0x40, 0x00, 0x00, 0xbc, + 0x9e, 0x00, 0x0b, 0x80, 0x66, 0x00, 0x00, 0x80, + 0x9e, 0x00, 0x09, 0xc0, 0x66, 0x00, 0x01, 0xf0, + 0x64, 0x00, 0x00, 0x60, 0x62, 0x01, 0x00, 0x20, + 0x62, 0x01, 0x00, 0x24, 0xfc, 0xb7, 0xff, 0xff, + 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x07, 0xf8, 0x7f, 0x20, 0x00, + 0xb0, 0x03, 0xe5, 0xea, 0xb0, 0x02, 0xb0, 0x01, + 0xe5, 0xe7, 0xe5, 0xe6, 0xb5, 0xb0, 0x1c, 0x07, + 0x06, 0x3d, 0x0e, 0x2d, 0x48, 0x5d, 0x68, 0x00, + 0x5d, 0x44, 0x2d, 0x20, 0xdb, 0x03, 0x20, 0xa2, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x59, + 0x68, 0x00, 0x5d, 0x40, 0x28, 0xff, 0xd1, 0x01, + 0x20, 0x4b, 0xe7, 0xf5, 0x48, 0x56, 0x69, 0x80, + 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03, + 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, + 0x48, 0x51, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, + 0x2c, 0x00, 0xd1, 0x05, 0x48, 0x4e, 0x69, 0x80, + 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02, + 0x20, 0x4d, 0xe7, 0xdd, 0xe0, 0x90, 0x48, 0x4b, + 0x68, 0x01, 0x4b, 0x4b, 0x43, 0x19, 0x60, 0x01, + 0x48, 0x49, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, + 0x48, 0x48, 0x68, 0x01, 0x23, 0x04, 0x43, 0x19, + 0x60, 0x01, 0x20, 0x00, 0x49, 0x41, 0x68, 0x09, + 0x31, 0x80, 0x70, 0x88, 0x20, 0x00, 0x49, 0x3f, + 0x68, 0x09, 0x31, 0x80, 0x70, 0x48, 0x20, 0xff, + 0x49, 0x3c, 0x68, 0x09, 0x55, 0x48, 0x2c, 0x00, + 0xd1, 0x03, 0x20, 0x18, 0x21, 0x31, 0x06, 0x49, + 0x62, 0x48, 0x01, 0x20, 0x49, 0x37, 0x68, 0x09, + 0x18, 0x40, 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, + 0xd0, 0x28, 0x20, 0x00, 0x49, 0x38, 0x60, 0x08, + 0x20, 0x00, 0x49, 0x38, 0x64, 0x08, 0x20, 0x03, + 0x49, 0x31, 0x61, 0x08, 0x21, 0x55, 0x01, 0x20, + 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x80, 0x6a, 0xc0, + 0x72, 0x41, 0x21, 0x00, 0x01, 0x20, 0x4a, 0x2b, + 0x68, 0x12, 0x18, 0x80, 0x30, 0x20, 0x72, 0x81, + 0x01, 0x20, 0x49, 0x28, 0x68, 0x09, 0x18, 0x40, + 0x6a, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x09, + 0x01, 0x20, 0x49, 0x24, 0x68, 0x09, 0x18, 0x40, + 0x6a, 0xc0, 0x7a, 0x01, 0x20, 0x01, 0x40, 0x88, + 0xf0, 0x06, 0xff, 0xf8, 0x48, 0x1f, 0x68, 0x00, + 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x2b, + 0x48, 0x1c, 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, + 0x28, 0x00, 0xd0, 0x0d, 0x20, 0x00, 0x49, 0x19, + 0x68, 0x09, 0x31, 0x80, 0x70, 0xc8, 0x22, 0x00, + 0xb4, 0x04, 0x1c, 0x28, 0x23, 0x00, 0x22, 0x00, + 0x49, 0x1b, 0xf7, 0xf3, 0xfe, 0xcd, 0xb0, 0x01, + 0x20, 0x55, 0x49, 0x12, 0x68, 0x09, 0x6f, 0xc9, + 0x72, 0x48, 0x20, 0x00, 0x49, 0x0f, 0x68, 0x09, + 0x31, 0x60, 0x76, 0x88, 0x48, 0x0d, 0x68, 0x00, + 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x07, + 0x48, 0x0a, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, + 0x20, 0x01, 0x40, 0x88, 0xf0, 0x06, 0xff, 0xc6, + 0x48, 0x09, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, + 0x48, 0x06, 0x68, 0x01, 0x4b, 0x0b, 0x40, 0x19, + 0x60, 0x01, 0x20, 0x00, 0xe7, 0x4c, 0xe7, 0x4b, + 0xe7, 0x4a, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xb0, + 0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, + 0x23, 0x48, 0x00, 0x00, 0x66, 0x00, 0x01, 0x18, + 0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, + 0x00, 0x00, 0xff, 0xff, 0xfc, 0xb7, 0xff, 0xff, + 0xb5, 0xff, 0x1c, 0x1f, 0x98, 0x00, 0x06, 0x02, + 0x0e, 0x12, 0x99, 0x01, 0x06, 0x0d, 0x0e, 0x2d, + 0x98, 0x02, 0x06, 0x04, 0x0e, 0x24, 0x48, 0x2d, + 0x68, 0x00, 0x5c, 0x81, 0x2a, 0x20, 0xdb, 0x04, + 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x29, 0xff, 0xd1, 0x01, 0x20, 0x4b, + 0xe7, 0xf7, 0x48, 0x27, 0x69, 0x80, 0x28, 0x00, + 0xd1, 0x05, 0x29, 0x02, 0xd0, 0x03, 0x29, 0x03, + 0xd0, 0x01, 0x29, 0x04, 0xd1, 0x0b, 0x48, 0x22, + 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x29, 0x00, + 0xd1, 0x05, 0x48, 0x1f, 0x69, 0x80, 0x28, 0x01, + 0xd1, 0x03, 0x29, 0x01, 0xd0, 0x01, 0x20, 0x4d, + 0xe7, 0xdf, 0x29, 0x05, 0xd2, 0x2a, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x03, 0x07, 0x04, 0x05, 0x06, 0x00, 0xe0, 0x24, + 0xe0, 0x23, 0xe0, 0x22, 0xe0, 0x21, 0x01, 0x08, + 0x4b, 0x12, 0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20, + 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x05, 0x48, 0x0f, + 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0x49, 0xe7, 0xc1, 0xe0, 0x13, + 0x2d, 0x00, 0xd1, 0x05, 0x00, 0xa0, 0x4b, 0x0b, + 0x18, 0xc0, 0x68, 0x00, 0x60, 0x38, 0xe0, 0x04, + 0x68, 0x38, 0x00, 0xa6, 0x4b, 0x07, 0x18, 0xf3, + 0x60, 0x18, 0xe0, 0x02, 0x20, 0x4a, 0xe7, 0xb0, + 0xe7, 0xff, 0x20, 0x00, 0xe7, 0xad, 0xe7, 0xac, + 0xe7, 0xab, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xb0, + 0x66, 0x00, 0x01, 0x00, 0x62, 0x01, 0x00, 0x80, + 0xb5, 0xf7, 0xb0, 0x82, 0x98, 0x02, 0x06, 0x03, + 0x0e, 0x1b, 0x93, 0x00, 0x99, 0x03, 0x06, 0x08, + 0x0e, 0x00, 0x90, 0x01, 0x9a, 0x04, 0x06, 0x15, + 0x0e, 0x2d, 0xb0, 0x84, 0x4a, 0xca, 0x4f, 0xcb, + 0x48, 0xcb, 0x68, 0x00, 0x9b, 0x04, 0x5c, 0xc4, + 0x48, 0xca, 0x90, 0x02, 0x21, 0x00, 0x23, 0x00, + 0x93, 0x01, 0x9b, 0x04, 0x2b, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, + 0x20, 0x4b, 0xb0, 0x06, 0xe7, 0xf6, 0x48, 0xc2, + 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x2c, 0x00, + 0xd1, 0x03, 0x48, 0xbf, 0x69, 0x80, 0x28, 0x02, + 0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x06, 0xe7, 0xe9, + 0x98, 0x05, 0x28, 0x01, 0xd1, 0x08, 0x48, 0xb8, + 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0x50, 0xb0, 0x06, 0xe7, 0xdd, + 0x98, 0x05, 0x28, 0x00, 0xd1, 0x05, 0x48, 0xb2, + 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, + 0xd0, 0x08, 0x98, 0x05, 0x28, 0x01, 0xd1, 0x08, + 0x48, 0xad, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, + 0x28, 0x00, 0xd1, 0x02, 0x20, 0x5a, 0xb0, 0x06, + 0xe7, 0xc8, 0x20, 0x00, 0x4b, 0xa8, 0x68, 0x1b, + 0x6f, 0xdb, 0x72, 0x58, 0x98, 0x05, 0x28, 0x00, + 0xd1, 0x50, 0x2d, 0x01, 0xd0, 0x01, 0x2d, 0x02, + 0xd1, 0x32, 0x4e, 0xa6, 0x68, 0x30, 0x23, 0x01, + 0x04, 0xdb, 0x43, 0x18, 0x60, 0x30, 0x20, 0x00, + 0x4b, 0xa3, 0x60, 0x18, 0x48, 0x9e, 0x68, 0x00, + 0x30, 0x80, 0x78, 0x40, 0x00, 0x43, 0x18, 0x18, + 0x01, 0x80, 0x9b, 0x02, 0x18, 0xc0, 0x90, 0x02, + 0x98, 0x02, 0x68, 0x01, 0x48, 0x9a, 0x69, 0x80, + 0x07, 0x80, 0x0f, 0x80, 0x01, 0x80, 0x43, 0x01, + 0x23, 0x20, 0x43, 0x19, 0x4b, 0x99, 0x43, 0x19, + 0x98, 0x02, 0x60, 0x01, 0x4e, 0x98, 0x68, 0x30, + 0x23, 0x01, 0x04, 0xdb, 0x43, 0x18, 0x60, 0x30, + 0x4e, 0x92, 0x68, 0x30, 0x4b, 0x95, 0x40, 0x18, + 0x60, 0x30, 0x2c, 0x00, 0xd1, 0x04, 0x20, 0x00, + 0x4b, 0x8b, 0x68, 0x1b, 0x33, 0x20, 0x72, 0x98, + 0x2d, 0x02, 0xd0, 0x04, 0x20, 0x01, 0x04, 0xc0, + 0x23, 0x33, 0x06, 0x5b, 0x60, 0x18, 0x2c, 0x00, + 0xd1, 0x0f, 0x20, 0xff, 0x02, 0x00, 0x40, 0x08, + 0xd1, 0x0b, 0x2d, 0x02, 0xd0, 0x09, 0x48, 0x82, + 0x68, 0x00, 0x30, 0x80, 0x78, 0x40, 0x23, 0x01, + 0x40, 0x58, 0x4b, 0x7f, 0x68, 0x1b, 0x33, 0x80, + 0x70, 0x58, 0xe0, 0xed, 0x2d, 0x01, 0xd1, 0x73, + 0x2c, 0x00, 0xd1, 0x72, 0x20, 0x31, 0x06, 0x40, + 0x68, 0x80, 0x23, 0x08, 0x40, 0x18, 0xd1, 0x3a, + 0x48, 0x7a, 0x68, 0x06, 0x23, 0x05, 0x05, 0x9b, + 0x43, 0x33, 0x60, 0x03, 0x68, 0x10, 0x4b, 0x7c, + 0x40, 0x18, 0x60, 0x10, 0x32, 0xc0, 0x68, 0x10, + 0x4b, 0x79, 0x40, 0x18, 0x60, 0x10, 0x20, 0x00, + 0x4b, 0x6f, 0x68, 0x1b, 0x67, 0x58, 0x20, 0x00, + 0x4b, 0x6d, 0x68, 0x1b, 0x33, 0x80, 0x70, 0x18, + 0x48, 0x6d, 0x68, 0x80, 0x23, 0x02, 0x40, 0x18, + 0xd1, 0x04, 0x20, 0x00, 0x4b, 0x68, 0x68, 0x1b, + 0x33, 0x60, 0x76, 0x98, 0x20, 0x5b, 0x4b, 0x66, + 0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, 0x4e, 0x6d, + 0x68, 0x30, 0x23, 0x02, 0x43, 0x18, 0x60, 0x30, + 0x4e, 0x67, 0x68, 0x30, 0x23, 0x05, 0x05, 0x9b, + 0x43, 0x18, 0x60, 0x30, 0x4e, 0x61, 0x68, 0x30, + 0x4b, 0x67, 0x40, 0x18, 0x60, 0x30, 0x20, 0x5b, + 0xb0, 0x06, 0xe7, 0x2b, 0xe0, 0xae, 0x48, 0x5d, + 0x68, 0x06, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x33, + 0x60, 0x03, 0x20, 0x31, 0x06, 0x40, 0x6a, 0x00, + 0x23, 0x04, 0x40, 0x18, 0xd1, 0x27, 0x9b, 0x01, + 0x20, 0x31, 0x06, 0x40, 0x6b, 0x00, 0x18, 0x1b, + 0x93, 0x01, 0x4e, 0x5c, 0x68, 0x30, 0x23, 0x3b, + 0x40, 0x18, 0x60, 0x30, 0x4e, 0x57, 0x68, 0x30, + 0x23, 0x0e, 0x43, 0x18, 0x60, 0x30, 0x4e, 0x55, + 0x68, 0x30, 0x23, 0x0c, 0x40, 0x18, 0x60, 0x30, + 0x20, 0x37, 0x23, 0x31, 0x06, 0x5b, 0x60, 0x98, + 0x20, 0x01, 0x90, 0x00, 0x98, 0x00, 0x28, 0x64, + 0xd3, 0x04, 0xe0, 0x07, 0x98, 0x00, 0x30, 0x01, + 0x90, 0x00, 0xe7, 0xf7, 0xe7, 0xfa, 0xe0, 0x01, + 0xe0, 0x36, 0xe0, 0x34, 0xe7, 0xd1, 0x4e, 0x46, + 0x68, 0x30, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, + 0x60, 0x30, 0x4e, 0x40, 0x68, 0x30, 0x4b, 0x48, + 0x40, 0x18, 0x60, 0x30, 0x48, 0x3c, 0x68, 0x40, + 0x28, 0x00, 0xd0, 0x0d, 0x20, 0x5b, 0x4b, 0x38, + 0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, 0x20, 0x00, + 0x4b, 0x35, 0x68, 0x1b, 0x33, 0x60, 0x76, 0x98, + 0x20, 0x5b, 0xb0, 0x06, 0xe6, 0xda, 0xe0, 0x5d, + 0x48, 0x31, 0x68, 0x00, 0x6f, 0xc0, 0x1d, 0x06, + 0x48, 0x2f, 0x68, 0x00, 0x30, 0x80, 0x78, 0x00, + 0x9b, 0x01, 0x1a, 0xc0, 0x68, 0x33, 0x18, 0xc0, + 0x60, 0x30, 0x20, 0x5c, 0x4b, 0x2a, 0x68, 0x1b, + 0x6f, 0xdb, 0x72, 0x58, 0x20, 0x00, 0x4b, 0x28, + 0x68, 0x1b, 0x33, 0x60, 0x76, 0x98, 0xe0, 0x3f, + 0x20, 0x33, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x03, + 0x23, 0x04, 0x40, 0x18, 0xd0, 0x03, 0x20, 0x52, + 0xb0, 0x06, 0xe6, 0xb7, 0xe0, 0x3a, 0x98, 0x03, + 0x01, 0x00, 0x19, 0xc7, 0x48, 0x1e, 0x68, 0x00, + 0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07, 0x48, 0x29, + 0x60, 0xb8, 0x20, 0xbc, 0x4b, 0x1a, 0x68, 0x1b, + 0x33, 0x80, 0x70, 0x18, 0xe0, 0x0d, 0x48, 0x18, + 0x68, 0x00, 0x6f, 0x40, 0x23, 0x01, 0x07, 0x9b, + 0x43, 0x18, 0x60, 0xb8, 0x48, 0x14, 0x68, 0x00, + 0x6f, 0x40, 0x4b, 0x13, 0x68, 0x1b, 0x33, 0x80, + 0x70, 0x18, 0x48, 0x11, 0x68, 0x00, 0x30, 0x80, + 0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, + 0x18, 0x82, 0x48, 0x0d, 0x68, 0x00, 0x6f, 0x00, + 0x60, 0x38, 0x1d, 0x10, 0x60, 0x78, 0x20, 0x01, + 0x06, 0x00, 0x60, 0xf8, 0x9e, 0x03, 0x20, 0x01, + 0x40, 0xb0, 0x23, 0x33, 0x06, 0x5b, 0x63, 0x58, + 0x20, 0x00, 0xb0, 0x06, 0xe6, 0x7e, 0xb0, 0x04, + 0xb0, 0x02, 0xe6, 0x7b, 0xe6, 0x7a, 0x00, 0x00, + 0x9e, 0x00, 0x0b, 0x80, 0x9e, 0x00, 0x09, 0x80, + 0x2e, 0x08, 0xb9, 0xb0, 0x9e, 0x00, 0x0a, 0x00, + 0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, + 0x62, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x04, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x62, 0x00, 0x00, 0x1c, + 0xfe, 0xbf, 0xff, 0xff, 0x62, 0x00, 0x00, 0x08, + 0xff, 0xbf, 0xff, 0xff, 0x40, 0x00, 0x00, 0xbc, + 0x48, 0x07, 0x69, 0x80, 0x28, 0x02, 0xd0, 0x03, + 0x48, 0x05, 0x69, 0x80, 0x28, 0x03, 0xd1, 0x04, + 0x20, 0x31, 0x06, 0x40, 0x6a, 0x80, 0x47, 0x70, + 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xfb, 0xe7, 0xfa, + 0x66, 0x00, 0x01, 0x00, 0xb5, 0xb0, 0x27, 0x0f, + 0x20, 0x31, 0x06, 0x40, 0x68, 0xc0, 0x09, 0x05, + 0xf7, 0xff, 0xff, 0xe6, 0x43, 0xc4, 0x48, 0x18, + 0x69, 0x80, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x16, + 0x69, 0x80, 0x28, 0x01, 0xd1, 0x03, 0x1c, 0x38, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x09, + 0xd2, 0x1e, 0xa3, 0x02, 0x5d, 0x5b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x07, 0x07, 0x07, 0x0e, 0x00, 0x1c, 0x2f, + 0xe0, 0x13, 0x20, 0x08, 0x40, 0x20, 0xd0, 0x01, + 0x1c, 0x2f, 0xe0, 0x00, 0x27, 0x02, 0xe0, 0x0c, + 0x20, 0x08, 0x40, 0x20, 0xd0, 0x06, 0x20, 0x02, + 0x40, 0x20, 0xd0, 0x01, 0x27, 0x07, 0xe0, 0x00, + 0x27, 0x08, 0xe0, 0x00, 0x27, 0x02, 0xe0, 0x00, + 0xe7, 0xff, 0x1c, 0x38, 0xe7, 0xd8, 0xe7, 0xd7, + 0x66, 0x00, 0x01, 0x00, 0x1c, 0x01, 0x29, 0x07, + 0xd2, 0x0f, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x05, 0x06, 0x09, + 0x08, 0x07, 0x0a, 0x00, 0xe0, 0x06, 0xe0, 0x05, + 0xe0, 0x04, 0xe0, 0x03, 0xe0, 0x02, 0xe0, 0x01, + 0xe0, 0x00, 0xe7, 0xff, 0x20, 0x00, 0x47, 0x70, + 0xe7, 0xfd, 0x00, 0x00, 0x20, 0x1d, 0x02, 0x80, + 0x69, 0x80, 0x49, 0x06, 0x60, 0x08, 0x20, 0x1d, + 0x02, 0x80, 0x69, 0x40, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x1d, 0x02, 0x80, 0x69, 0xc0, 0x49, 0x03, + 0x60, 0x08, 0x47, 0x70, 0x2e, 0x08, 0xd1, 0xfc, + 0x2e, 0x08, 0xd2, 0x00, 0x2e, 0x08, 0xd2, 0x04, + 0xb5, 0xf1, 0xb0, 0x81, 0x20, 0x00, 0x4d, 0x21, + 0x95, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, + 0x43, 0xdb, 0x4c, 0x1f, 0x68, 0x64, 0x42, 0x8c, + 0xdd, 0x21, 0x1c, 0x0c, 0x31, 0x01, 0x00, 0xa4, + 0x9d, 0x00, 0x59, 0x2f, 0x42, 0x9f, 0xd0, 0xf8, + 0x4c, 0x19, 0x68, 0x64, 0x42, 0x8c, 0xda, 0x00, + 0xe0, 0x15, 0x32, 0x01, 0x1c, 0x0c, 0x31, 0x01, + 0x00, 0xa4, 0x9d, 0x00, 0x59, 0x2b, 0x42, 0x9f, + 0xd0, 0xf8, 0x02, 0x9c, 0x43, 0x3c, 0x1c, 0x25, + 0x1c, 0x04, 0x30, 0x01, 0x00, 0xa4, 0x9e, 0x01, + 0x51, 0x35, 0x4c, 0x0f, 0x68, 0x64, 0x42, 0x8c, + 0xdb, 0x00, 0x32, 0x01, 0xe7, 0xd9, 0x28, 0x08, + 0xd3, 0x02, 0xe0, 0x07, 0x30, 0x01, 0xe7, 0xfa, + 0x25, 0x00, 0x43, 0xed, 0x00, 0x84, 0x9e, 0x01, + 0x51, 0x35, 0xe7, 0xf7, 0x4c, 0x07, 0x68, 0x24, + 0x2c, 0x00, 0xd1, 0x02, 0x24, 0x0d, 0x06, 0xe4, + 0x61, 0x22, 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0xba, 0x38, + 0x2e, 0x08, 0xbb, 0x00, 0x2e, 0x08, 0xd1, 0xf0, + 0xb5, 0x80, 0x48, 0xdc, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x04, 0x48, 0xda, 0x68, 0x00, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x92, + 0x48, 0xd7, 0x49, 0xd8, 0x60, 0x08, 0x48, 0xd8, + 0x49, 0xd8, 0x60, 0x08, 0x48, 0xd8, 0x49, 0xd9, + 0x60, 0x08, 0x48, 0xd3, 0x49, 0xd8, 0x68, 0x0b, + 0x4a, 0xd8, 0x21, 0x00, 0xf0, 0x01, 0xf8, 0xda, + 0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x00, 0x49, 0xca, 0x68, 0x09, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xce, + 0x49, 0xc6, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x66, 0xc8, 0x20, 0x00, 0x49, 0xc5, + 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, + 0x66, 0x88, 0x48, 0xc7, 0x49, 0xc1, 0x68, 0x09, + 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x66, 0xc8, + 0x20, 0x00, 0x49, 0xc0, 0x68, 0x09, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xc0, + 0x49, 0xbc, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x66, 0xc8, 0x27, 0x00, 0x2f, 0x19, + 0xd3, 0x02, 0xe0, 0x38, 0x37, 0x01, 0xe7, 0xfa, + 0x48, 0xba, 0x00, 0xb9, 0x4a, 0xb1, 0x68, 0x12, + 0x18, 0x89, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, + 0x62, 0x08, 0x48, 0xb6, 0x00, 0xb9, 0x4a, 0xad, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x60, 0x48, 0x48, 0xb1, 0x00, 0xb9, + 0x4a, 0xaa, 0x68, 0x12, 0x18, 0x89, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x62, 0x08, 0x48, 0xad, + 0x00, 0xb9, 0x4a, 0xa6, 0x68, 0x12, 0x18, 0x89, + 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x60, 0x48, + 0x48, 0xa8, 0x00, 0xb9, 0x4a, 0xa3, 0x68, 0x12, + 0x18, 0x89, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, + 0x62, 0x08, 0x48, 0xa4, 0x00, 0xb9, 0x4a, 0x9f, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x60, 0x48, 0xe7, 0xc6, 0x27, 0x00, + 0x2f, 0x07, 0xd3, 0x02, 0xe0, 0x86, 0x37, 0x01, + 0xe7, 0xfa, 0x48, 0x9c, 0x00, 0xb9, 0x19, 0xc9, + 0x00, 0xc9, 0x4a, 0x92, 0x68, 0x12, 0x18, 0x89, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, + 0x48, 0x96, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, + 0x4a, 0x8c, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x91, + 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x87, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc9, 0x60, 0x48, 0x48, 0x8b, 0x00, 0xb9, + 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x81, 0x68, 0x12, + 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, + 0x67, 0x88, 0x48, 0x86, 0x00, 0xb9, 0x19, 0xc9, + 0x00, 0xc9, 0x4a, 0x7e, 0x68, 0x12, 0x18, 0x89, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, + 0x48, 0x80, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, + 0x4a, 0x78, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x7b, + 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x73, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc9, 0x60, 0x48, 0x48, 0x75, 0x00, 0xb9, + 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x6d, 0x68, 0x12, + 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, + 0x67, 0x88, 0x48, 0x70, 0x00, 0xb9, 0x19, 0xc9, + 0x00, 0xc9, 0x4a, 0x6a, 0x68, 0x12, 0x18, 0x89, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, + 0x48, 0x6a, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, + 0x4a, 0x64, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x65, + 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x5f, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc9, 0x60, 0x48, 0x48, 0x5f, 0x00, 0xb9, + 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x59, 0x68, 0x12, + 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, + 0x67, 0x88, 0xe7, 0x78, 0x27, 0x00, 0x2f, 0x12, + 0xd3, 0x02, 0xe0, 0x56, 0x37, 0x01, 0xe7, 0xfa, + 0x48, 0x56, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x4d, + 0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x53, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x49, 0x68, 0x12, + 0x18, 0x89, 0x62, 0x88, 0x48, 0x4f, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x46, 0x68, 0x12, 0x18, 0x89, + 0x63, 0x08, 0x48, 0x4c, 0x21, 0x4c, 0x43, 0x79, + 0x4a, 0x42, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, + 0x48, 0x48, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x41, + 0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x45, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x3d, 0x68, 0x12, + 0x18, 0x89, 0x62, 0x88, 0x48, 0x41, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x3a, 0x68, 0x12, 0x18, 0x89, + 0x63, 0x08, 0x48, 0x3e, 0x21, 0x4c, 0x43, 0x79, + 0x4a, 0x36, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, + 0x48, 0x3a, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x35, + 0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x37, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x31, 0x68, 0x12, + 0x18, 0x89, 0x62, 0x88, 0x48, 0x33, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x89, + 0x63, 0x08, 0x48, 0x30, 0x21, 0x4c, 0x43, 0x79, + 0x4a, 0x2a, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, + 0xe7, 0xa8, 0x20, 0x00, 0x49, 0x25, 0x68, 0x09, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0xc8, + 0x20, 0x00, 0x49, 0x22, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x20, 0x00, + 0x49, 0x1c, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc9, 0x61, 0xc8, 0x20, 0x00, 0x49, 0x19, + 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, + 0x61, 0x88, 0x20, 0x00, 0x49, 0x19, 0x68, 0x09, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0xc8, + 0x20, 0x00, 0x49, 0x16, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x20, 0x92, + 0x49, 0x17, 0x60, 0x08, 0x27, 0x00, 0x2f, 0x08, + 0xd3, 0x02, 0xe0, 0x08, 0x37, 0x01, 0xe7, 0xfa, + 0x20, 0x00, 0x43, 0xc0, 0x00, 0xb9, 0x4b, 0x13, + 0x18, 0xc9, 0x64, 0x08, 0xe7, 0xf6, 0x20, 0x10, + 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x08, 0x20, 0x01, + 0x49, 0x0f, 0x60, 0x08, 0x48, 0x0e, 0x68, 0x00, + 0xe6, 0x4d, 0xe6, 0x4c, 0x2e, 0x08, 0x9d, 0xf0, + 0x2e, 0x08, 0xbb, 0x28, 0x2e, 0x08, 0xbb, 0x1c, + 0x2e, 0x08, 0xc2, 0xc0, 0x2e, 0x08, 0xbb, 0x20, + 0x2e, 0x08, 0xca, 0x58, 0x2e, 0x08, 0xbb, 0x24, + 0x2e, 0x08, 0xd2, 0x00, 0x00, 0x00, 0x16, 0xc8, + 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0xd1, 0xf4, 0x68, 0x00, 0x0d, 0x00, + 0x2e, 0x08, 0xd1, 0xf0, 0xb5, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0x1c, 0x39, 0x20, 0x00, 0xf0, 0x00, + 0xf8, 0x4d, 0x1c, 0x39, 0x1c, 0x20, 0xf0, 0x00, + 0xf8, 0x03, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x68, 0x78, + 0x28, 0x07, 0xd9, 0x1d, 0x23, 0x03, 0x02, 0x5b, + 0x18, 0xf8, 0x6d, 0x40, 0x28, 0x00, 0xd0, 0x06, + 0x23, 0x03, 0x02, 0x5b, 0x18, 0xf8, 0x6d, 0x80, + 0x04, 0x00, 0x0c, 0x00, 0xd1, 0x02, 0x20, 0x02, + 0x60, 0xb8, 0xe0, 0x01, 0x20, 0x03, 0x60, 0xb8, + 0x1d, 0xfd, 0x35, 0x05, 0x23, 0x65, 0x01, 0x1b, + 0x18, 0xfe, 0x1c, 0x31, 0x1c, 0x28, 0x4a, 0x11, + 0x68, 0x13, 0x22, 0x28, 0xf0, 0x00, 0xfe, 0xee, + 0x2c, 0x06, 0xd0, 0x18, 0x00, 0xa0, 0x19, 0x00, + 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x2b, 0x01, 0x5b, + 0x18, 0xc6, 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0xb1, 0x00, 0xdb, 0x18, 0xc5, + 0x20, 0x06, 0x1b, 0x00, 0x00, 0x82, 0x18, 0x12, + 0x00, 0xd2, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x04, + 0x68, 0x1b, 0xf0, 0x00, 0xfe, 0xd3, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0xd1, 0xfc, + 0x2e, 0x08, 0xd2, 0x04, 0xb5, 0xf0, 0x1c, 0x07, + 0x1c, 0x0c, 0x2f, 0x10, 0xd0, 0x13, 0x20, 0x4c, + 0x43, 0x78, 0x19, 0x00, 0x1d, 0xc6, 0x36, 0x01, + 0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, 0x1d, 0xc5, + 0x35, 0x4d, 0x20, 0x10, 0x1b, 0xc0, 0x22, 0x4c, + 0x43, 0x42, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x03, + 0x68, 0x1b, 0xf0, 0x00, 0xfe, 0xb3, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0xd2, 0x04, + 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x39, + 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x07, 0x1c, 0x39, + 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x33, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x0f, 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0xb1, 0x00, 0xdb, 0x18, 0xc6, + 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, 0x19, 0xc0, + 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc5, 0x20, 0x06, + 0x1b, 0x00, 0x00, 0x82, 0x18, 0x12, 0x00, 0xd2, + 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x09, 0x68, 0x1b, + 0xf0, 0x00, 0xfe, 0x84, 0x1d, 0xfe, 0x36, 0x05, + 0x23, 0x65, 0x01, 0x1b, 0x18, 0xfd, 0x1c, 0x31, + 0x1c, 0x28, 0x4a, 0x05, 0x68, 0x13, 0x22, 0x28, + 0xf0, 0x00, 0xfe, 0x78, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0xd2, 0x04, + 0x2e, 0x08, 0xd1, 0xfc, 0xb5, 0xf0, 0x1c, 0x07, + 0x1c, 0x0c, 0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, + 0x1d, 0xc6, 0x36, 0x4d, 0x20, 0x4c, 0x43, 0x78, + 0x19, 0x00, 0x1d, 0xc5, 0x35, 0x01, 0x20, 0x10, + 0x1b, 0xc0, 0x22, 0x4c, 0x43, 0x42, 0x1c, 0x31, + 0x1c, 0x28, 0x4b, 0x03, 0x68, 0x1b, 0xf0, 0x00, + 0xfe, 0x59, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xd2, 0x04, 0xb4, 0xb0, 0x1c, 0x02, + 0x1c, 0x0f, 0x20, 0x00, 0x1c, 0x03, 0x30, 0x01, + 0x00, 0x9b, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xe3, 0x68, 0x5b, 0x10, 0x7c, 0x34, 0x01, + 0x42, 0xa3, 0xd2, 0x00, 0xe7, 0xf2, 0x38, 0x01, + 0x21, 0x18, 0x42, 0x81, 0xd8, 0x02, 0xe0, 0x1a, + 0x39, 0x01, 0xe7, 0xfa, 0x00, 0x8b, 0x18, 0x9c, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xe3, 0x69, 0xdc, + 0x00, 0x8b, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xeb, 0x62, 0x1c, 0x00, 0x8b, 0x18, 0x9c, + 0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x1c, + 0x00, 0x8b, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xeb, 0x60, 0x5c, 0xe7, 0xe4, 0x23, 0x00, + 0x2b, 0x00, 0xd0, 0x10, 0x10, 0x7b, 0x1c, 0x5c, + 0x00, 0x83, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xeb, 0x62, 0x1c, 0x10, 0x7b, 0x1c, 0x5c, + 0x00, 0x83, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xeb, 0x60, 0x5c, 0xe0, 0x0e, 0x10, 0x7c, + 0x00, 0x83, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xeb, 0x62, 0x1c, 0x10, 0x7b, 0x1c, 0x5c, + 0x00, 0x83, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xeb, 0x60, 0x5c, 0xbc, 0xb0, 0x47, 0x70, + 0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x21, 0x00, + 0x1c, 0x0b, 0x31, 0x01, 0x00, 0x9b, 0x18, 0x9c, + 0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x5b, + 0x10, 0x7c, 0x34, 0x01, 0x42, 0xa3, 0xd0, 0x00, + 0xe7, 0xf2, 0x39, 0x01, 0x1c, 0x08, 0x28, 0x18, + 0xd3, 0x02, 0xe0, 0x1a, 0x30, 0x01, 0xe7, 0xfa, + 0x00, 0x83, 0x18, 0x9c, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xe3, 0x6a, 0x5c, 0x00, 0x83, 0x18, 0x9d, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xeb, 0x62, 0x1c, + 0x00, 0x83, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xe3, 0x68, 0x9c, 0x00, 0x83, 0x18, 0x9d, + 0x23, 0x07, 0x02, 0x1b, 0x18, 0xeb, 0x60, 0x5c, + 0xe7, 0xe4, 0x4c, 0x06, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xd3, 0x60, 0x1c, 0x4c, 0x03, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xd3, 0x66, 0x5c, 0xbc, 0xb0, + 0x47, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0c, 0x1c, 0x15, + 0x6a, 0xa1, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x19, + 0x62, 0x39, 0x21, 0x01, 0x02, 0x89, 0x43, 0x29, + 0x62, 0x79, 0x6a, 0xe1, 0x05, 0x89, 0x0d, 0x89, + 0x61, 0xf9, 0x6b, 0x61, 0x31, 0x01, 0x05, 0x89, + 0x0d, 0x89, 0x61, 0xb9, 0x69, 0x61, 0x60, 0xf9, + 0x69, 0xa1, 0x61, 0x39, 0x69, 0xe1, 0x61, 0x79, + 0x68, 0xa1, 0x23, 0x01, 0x06, 0x1b, 0x40, 0x19, + 0xd0, 0x02, 0x49, 0x0f, 0x60, 0xb9, 0xe0, 0x01, + 0x21, 0x00, 0x60, 0xb9, 0x6a, 0x60, 0x28, 0x00, + 0xd0, 0x0b, 0x68, 0x41, 0x60, 0x39, 0x78, 0x01, + 0x00, 0x89, 0x4b, 0x0a, 0x18, 0xc9, 0x60, 0x79, + 0x68, 0xb9, 0x88, 0x42, 0x43, 0x11, 0x60, 0xb9, + 0xe0, 0x07, 0x21, 0x00, 0x60, 0x39, 0x21, 0x00, + 0x60, 0x79, 0x68, 0xb9, 0x0c, 0x09, 0x04, 0x09, + 0x60, 0xb9, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x68, 0x00, 0x08, 0x00, + 0xb4, 0x80, 0x1c, 0x02, 0x1c, 0x0f, 0x69, 0x79, + 0x60, 0xd1, 0x69, 0xb9, 0x61, 0x11, 0x69, 0xf9, + 0x61, 0x51, 0x68, 0xb9, 0x23, 0x01, 0x06, 0x1b, + 0x40, 0x19, 0xd0, 0x02, 0x49, 0x0e, 0x60, 0x91, + 0xe0, 0x01, 0x21, 0x00, 0x60, 0x91, 0x6a, 0x78, + 0x28, 0x00, 0xd0, 0x0b, 0x68, 0x41, 0x60, 0x11, + 0x78, 0x01, 0x00, 0x89, 0x4b, 0x09, 0x18, 0xc9, + 0x60, 0x51, 0x68, 0x91, 0x88, 0x43, 0x43, 0x19, + 0x60, 0x91, 0xe0, 0x07, 0x21, 0x00, 0x60, 0x11, + 0x21, 0x00, 0x60, 0x51, 0x68, 0x91, 0x0c, 0x09, + 0x04, 0x09, 0x60, 0x91, 0xbc, 0x80, 0x47, 0x70, + 0xff, 0xff, 0x00, 0x00, 0x68, 0x00, 0x08, 0x00, + 0x1c, 0x01, 0x48, 0x07, 0x62, 0x08, 0x48, 0x06, + 0x62, 0x48, 0x48, 0x05, 0x61, 0xc8, 0x48, 0x04, + 0x61, 0x88, 0x20, 0x00, 0x60, 0x08, 0x20, 0x00, + 0x60, 0x48, 0x20, 0x00, 0x60, 0x88, 0x47, 0x70, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0xb0, 0x1c, 0x07, + 0x1c, 0x0c, 0x2c, 0x07, 0xd2, 0x73, 0x25, 0x00, + 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x2f, 0x35, 0x01, + 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, + 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, + 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, + 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, + 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, + 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0xf8, + 0xf0, 0x00, 0xfb, 0xd2, 0xe7, 0xcf, 0x23, 0xcf, + 0x00, 0xdb, 0x18, 0xf8, 0xf7, 0xff, 0xfb, 0xb8, + 0x25, 0x00, 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x54, + 0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, + 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc0, 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, + 0x00, 0xc9, 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc9, 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, + 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, + 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0xdb, 0xf0, 0x00, 0xfb, 0x6b, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, + 0x43, 0x69, 0x19, 0xc9, 0xe0, 0x00, 0xe0, 0x94, + 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0xcc, + 0xf0, 0x00, 0xfb, 0x7a, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xfb, 0x60, + 0xe7, 0xaa, 0x25, 0x07, 0x2d, 0x11, 0xdb, 0x02, + 0xe0, 0x4e, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, + 0x69, 0xc9, 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x80, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x01, 0x48, 0xb1, 0xf0, 0x00, 0xfb, 0x16, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, + 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x01, 0x48, 0xa2, 0xf0, 0x00, + 0xfb, 0x27, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x30, 0x34, 0xf7, 0xff, 0xfb, 0x0d, 0xe7, 0xb0, + 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x1f, + 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0x8d, 0xf0, 0x00, 0xfa, 0xcf, 0xe7, 0xdf, + 0xe1, 0xca, 0x2c, 0x0e, 0xd3, 0x73, 0x3c, 0x07, + 0x1f, 0xe5, 0x42, 0xa5, 0xd3, 0x02, 0xe0, 0x1f, + 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0x79, 0xf0, 0x00, 0xfa, 0xd5, 0xe7, 0xdf, + 0x1c, 0x25, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x50, + 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, + 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 0x69, 0xc9, + 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x80, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0x61, 0xf0, 0x00, 0xfa, 0x77, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, + 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, + 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x01, 0x48, 0x53, 0xf0, 0x00, 0xfa, 0x88, + 0x20, 0x4c, 0x43, 0x68, 0xe0, 0x00, 0xe0, 0x29, + 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xfa, 0x6c, + 0xe7, 0xae, 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, + 0xe0, 0x1f, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, + 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, + 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x01, 0x48, 0x3d, 0xf0, 0x00, 0xfa, 0x2e, + 0xe7, 0xdf, 0xe1, 0x29, 0x3c, 0x07, 0x1c, 0x25, + 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x2f, 0x35, 0x01, + 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, + 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, + 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, + 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, + 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, + 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x22, + 0xf0, 0x00, 0xfa, 0x26, 0xe7, 0xcf, 0x25, 0x00, + 0x42, 0xa5, 0xd3, 0x02, 0xe0, 0x1f, 0x35, 0x01, + 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, + 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x10, + 0xf0, 0x00, 0xfa, 0x02, 0xe7, 0xdf, 0x1c, 0x25, + 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x55, 0x35, 0x01, + 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, + 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, + 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, + 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1d, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0xe0, 0x01, + 0x2e, 0x08, 0xbb, 0x00, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, 0x19, 0x40, + 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x01, 0x48, 0x50, 0xf0, 0x00, + 0xf9, 0x9d, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, + 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x42, + 0xf0, 0x00, 0xf9, 0xae, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xf9, 0x94, + 0xe7, 0xa9, 0x25, 0x07, 0x2d, 0x11, 0xdb, 0x02, + 0xe0, 0x4e, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, + 0x69, 0xc9, 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x80, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x01, 0x48, 0x27, 0xf0, 0x00, 0xf9, 0x4a, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, + 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x01, 0x48, 0x18, 0xf0, 0x00, + 0xf9, 0x5b, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x30, 0x34, 0xf7, 0xff, 0xf9, 0x41, 0xe7, 0xb0, + 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x1f, + 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0x03, 0xf0, 0x00, 0xf9, 0x03, 0xe7, 0xdf, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0xbb, 0x00, 0xb4, 0x90, 0x1c, 0x02, + 0x1c, 0x0f, 0x3a, 0x01, 0x2f, 0x01, 0xd1, 0x0d, + 0x09, 0x50, 0x00, 0x80, 0x49, 0x0d, 0x58, 0x08, + 0x06, 0xd4, 0x0e, 0xe4, 0x21, 0x01, 0x40, 0xa1, + 0x43, 0x08, 0x09, 0x51, 0x00, 0x89, 0x4b, 0x09, + 0x50, 0x58, 0xe0, 0x0d, 0x09, 0x50, 0x00, 0x80, + 0x49, 0x06, 0x58, 0x08, 0x06, 0xd4, 0x0e, 0xe4, + 0x21, 0x01, 0x40, 0xa1, 0x43, 0xc9, 0x40, 0x01, + 0x09, 0x50, 0x00, 0x80, 0x4b, 0x01, 0x50, 0x19, + 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0xd1, 0xf8, + 0xb4, 0x80, 0x1c, 0x01, 0x39, 0x01, 0x09, 0x48, + 0x00, 0x80, 0x4a, 0x08, 0x58, 0x10, 0x06, 0xca, + 0x0e, 0xd2, 0x27, 0x01, 0x40, 0x97, 0x1c, 0x3b, + 0x40, 0x18, 0xd0, 0x03, 0x20, 0x01, 0xbc, 0x80, + 0x47, 0x70, 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xfa, + 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0xd1, 0xf8, + 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0a, 0x68, 0x54, + 0x6a, 0xf8, 0x05, 0x86, 0x0d, 0xb6, 0x2c, 0x07, + 0xda, 0x01, 0x1c, 0x20, 0xe0, 0x00, 0x20, 0x07, + 0x1c, 0x05, 0x21, 0x00, 0x42, 0xa9, 0xd3, 0x02, + 0xe0, 0x15, 0x31, 0x01, 0xe7, 0xfa, 0x00, 0x88, + 0x18, 0x40, 0x00, 0xc0, 0x18, 0x80, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0xb0, + 0xd1, 0x08, 0x00, 0x88, 0x18, 0x40, 0x00, 0xc0, + 0x18, 0x80, 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, + 0xbc, 0xf0, 0x47, 0x70, 0xe7, 0xe9, 0x1f, 0xe0, + 0x28, 0x11, 0xda, 0x01, 0x1f, 0xe0, 0xe0, 0x00, + 0x20, 0x11, 0x1c, 0x05, 0x21, 0x00, 0x42, 0xa9, + 0xd3, 0x02, 0xe0, 0x0d, 0x31, 0x01, 0xe7, 0xfa, + 0x20, 0x4c, 0x43, 0x48, 0x18, 0x80, 0x6a, 0x80, + 0x42, 0xb0, 0xd1, 0x04, 0x20, 0x4c, 0x43, 0x48, + 0x18, 0x80, 0x30, 0x0c, 0xe7, 0xe4, 0xe7, 0xf1, + 0x20, 0x00, 0xe7, 0xe1, 0xe7, 0xe0, 0xb5, 0x90, + 0x48, 0x07, 0x68, 0x04, 0x48, 0x07, 0x68, 0x07, + 0x1c, 0x39, 0x1c, 0x20, 0x4a, 0x06, 0x68, 0x13, + 0x22, 0xf3, 0x00, 0xd2, 0xf0, 0x00, 0xf9, 0xca, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0xbb, 0x20, 0x2e, 0x08, 0xbb, 0x24, + 0x2e, 0x08, 0xd1, 0xfc, 0xb4, 0xf0, 0x1c, 0x01, + 0xb0, 0x83, 0x22, 0x00, 0x68, 0x4b, 0x2b, 0x07, + 0xdd, 0x01, 0x23, 0x07, 0xe0, 0x00, 0x68, 0x4b, + 0x1c, 0x1c, 0x23, 0x00, 0x43, 0xdb, 0x93, 0x02, + 0x23, 0x00, 0x43, 0xdb, 0x93, 0x01, 0x23, 0x00, + 0x93, 0x00, 0x4b, 0x17, 0x68, 0x1b, 0x2b, 0x00, + 0xd0, 0x07, 0x4b, 0x15, 0x68, 0x1b, 0x6a, 0xdb, + 0x93, 0x02, 0x4b, 0x13, 0x68, 0x1b, 0x6b, 0x5b, + 0x93, 0x01, 0x20, 0x00, 0x42, 0xa0, 0xd3, 0x02, + 0xe0, 0x16, 0x30, 0x01, 0xe7, 0xfa, 0x00, 0x83, + 0x18, 0x1b, 0x00, 0xdb, 0x18, 0x5d, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xeb, 0x6e, 0x9f, 0x04, 0x3b, + 0x0c, 0x1b, 0xd0, 0x08, 0x0c, 0x3b, 0x04, 0x1b, + 0xd0, 0x05, 0x9b, 0x00, 0x18, 0xc5, 0x26, 0x01, + 0x40, 0xae, 0x1c, 0x33, 0x43, 0x1a, 0xe7, 0xe8, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xcb, 0x61, 0xda, + 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0xb9, 0xc4, 0xb4, 0x80, 0x1c, 0x01, + 0x20, 0x00, 0x68, 0x0a, 0x42, 0x90, 0xdb, 0x02, + 0xe0, 0x07, 0x30, 0x01, 0xe7, 0xf9, 0x23, 0x00, + 0x43, 0xdb, 0x68, 0x8a, 0x00, 0x87, 0x51, 0xd3, + 0xe7, 0xf7, 0x22, 0x00, 0x43, 0xd2, 0x68, 0x8b, + 0x68, 0x0f, 0x00, 0xbf, 0x51, 0xda, 0x23, 0x00, + 0x43, 0xdb, 0x68, 0x8a, 0x68, 0x0f, 0x00, 0xbf, + 0x19, 0xd2, 0x60, 0x53, 0x22, 0x00, 0x60, 0x4a, + 0xbc, 0x80, 0x47, 0x70, 0xb4, 0xf0, 0x1c, 0x03, + 0x1c, 0x0c, 0x1c, 0x17, 0x68, 0x9a, 0xca, 0x40, + 0x42, 0xa6, 0xd2, 0x00, 0xe7, 0xfb, 0x3a, 0x04, + 0x1c, 0x11, 0xc9, 0x40, 0x42, 0xbe, 0xd2, 0x00, + 0xe7, 0xfb, 0x39, 0x04, 0x68, 0x10, 0x42, 0xa0, + 0xd1, 0x02, 0x68, 0x08, 0x42, 0xb8, 0xd0, 0x02, + 0x20, 0xff, 0xbc, 0xf0, 0x47, 0x70, 0x39, 0x04, + 0x68, 0x98, 0x68, 0x5e, 0x00, 0xb6, 0x19, 0x85, + 0x68, 0x58, 0x38, 0x02, 0x60, 0x58, 0x68, 0x50, + 0x60, 0x10, 0x32, 0x04, 0x42, 0x8a, 0xd3, 0xfa, + 0x68, 0x88, 0x60, 0x08, 0x31, 0x04, 0x42, 0xa9, + 0xd3, 0xfa, 0x20, 0x00, 0xe7, 0xe9, 0xe7, 0xe8, + 0xb4, 0xf0, 0x1c, 0x03, 0x1c, 0x0c, 0x1c, 0x17, + 0x68, 0x58, 0x68, 0x1e, 0x3e, 0x01, 0x42, 0xb0, + 0xdb, 0x02, 0x20, 0xff, 0xbc, 0xf0, 0x47, 0x70, + 0x68, 0x9a, 0xca, 0x40, 0x42, 0xa6, 0xd2, 0x00, + 0xe7, 0xfb, 0x3a, 0x04, 0x1c, 0x15, 0xcd, 0x40, + 0x42, 0xbe, 0xd2, 0x00, 0xe7, 0xfb, 0x68, 0x58, + 0x30, 0x02, 0x60, 0x58, 0x68, 0x98, 0x68, 0x5e, + 0x00, 0xb6, 0x19, 0x80, 0x1f, 0xc1, 0x39, 0x01, + 0x68, 0x08, 0x60, 0x88, 0x39, 0x04, 0x1d, 0xc8, + 0x30, 0x01, 0x42, 0xa8, 0xd8, 0xf8, 0x60, 0x8f, + 0x68, 0x08, 0x60, 0x48, 0x39, 0x04, 0x1d, 0x08, + 0x42, 0x90, 0xd8, 0xf9, 0x60, 0x14, 0x20, 0x00, + 0xe7, 0xd8, 0xe7, 0xd7, 0xb5, 0xf0, 0x1c, 0x07, + 0x1c, 0x0c, 0xb0, 0x81, 0x1c, 0x38, 0x21, 0x00, + 0xf0, 0x0e, 0xfc, 0x1a, 0x1c, 0x06, 0x1c, 0x38, + 0x21, 0x01, 0xf0, 0x0e, 0xfc, 0x15, 0x90, 0x00, + 0x1c, 0x31, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x50, + 0x49, 0x20, 0x68, 0x09, 0x60, 0x08, 0x99, 0x00, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x49, 0x49, 0x1e, + 0x68, 0x09, 0x60, 0x08, 0x48, 0x1b, 0x68, 0x00, + 0x68, 0x05, 0x48, 0x1c, 0x68, 0x01, 0x23, 0x02, + 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x2c, 0x00, + 0xd0, 0x0c, 0x48, 0x19, 0x68, 0x00, 0x78, 0x00, + 0x28, 0x00, 0xd0, 0x07, 0x48, 0x14, 0x68, 0x00, + 0x68, 0x05, 0x48, 0x14, 0x68, 0x01, 0x23, 0x02, + 0x43, 0x19, 0x60, 0x01, 0x1c, 0x20, 0x49, 0x13, + 0x68, 0x09, 0x70, 0x08, 0x48, 0x12, 0x63, 0xc5, + 0x20, 0x3f, 0x04, 0x00, 0x40, 0x28, 0x0c, 0x00, + 0x49, 0x10, 0x62, 0x08, 0x20, 0xff, 0x02, 0x00, + 0x40, 0x28, 0x0a, 0x00, 0x49, 0x0d, 0x62, 0x48, + 0x06, 0xa8, 0x0e, 0x80, 0x23, 0x80, 0x43, 0x18, + 0x49, 0x0a, 0x62, 0x88, 0x1c, 0x28, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, + 0xe7, 0xfa, 0x00, 0x00, 0x2e, 0x08, 0xd2, 0x08, + 0x2e, 0x08, 0xd2, 0x0c, 0x6a, 0x00, 0x00, 0x18, + 0x2e, 0x08, 0xd2, 0x10, 0x2e, 0x08, 0xd2, 0x14, + 0x68, 0x00, 0x0d, 0x00, 0x72, 0x00, 0x01, 0x00, + 0xb4, 0x80, 0x1c, 0x02, 0x1c, 0x0f, 0x06, 0xb9, + 0x0e, 0x89, 0x20, 0x01, 0x03, 0x80, 0x40, 0x10, + 0x09, 0xc0, 0x43, 0x01, 0x20, 0xf0, 0x40, 0x10, + 0x01, 0x40, 0x43, 0x01, 0x07, 0x10, 0x0f, 0x00, + 0x03, 0x00, 0x43, 0x01, 0x20, 0x07, 0x02, 0xc0, + 0x40, 0x10, 0x01, 0x40, 0x43, 0x01, 0x20, 0x07, + 0x02, 0x00, 0x40, 0x10, 0x02, 0xc0, 0x43, 0x01, + 0x1c, 0x08, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, + 0xb5, 0xff, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, + 0x9b, 0x03, 0x06, 0x18, 0x16, 0x06, 0x20, 0x33, + 0x06, 0x40, 0x6b, 0x80, 0x1c, 0x01, 0x20, 0x04, + 0x40, 0x08, 0xd0, 0x05, 0x20, 0xd0, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xe0, 0x17, + 0x23, 0x04, 0x43, 0xdb, 0x40, 0x19, 0x01, 0x08, + 0x4b, 0x0a, 0x68, 0x1b, 0x18, 0xc2, 0x60, 0x15, + 0x60, 0x54, 0x2e, 0xfe, 0xd0, 0x04, 0x20, 0x01, + 0x40, 0xb0, 0x60, 0xd0, 0x4b, 0x06, 0x43, 0x1f, + 0x60, 0x97, 0x20, 0x01, 0x40, 0x88, 0x23, 0x33, + 0x06, 0x5b, 0x63, 0x58, 0x20, 0x00, 0xe7, 0xe2, + 0xe7, 0xe1, 0x00, 0x00, 0x2e, 0x08, 0x20, 0x8c, + 0x80, 0x00, 0x00, 0x00, 0xb4, 0xb0, 0x1c, 0x01, + 0x06, 0x08, 0x16, 0x04, 0x4f, 0x0c, 0x22, 0x00, + 0x20, 0x00, 0x28, 0x04, 0xd3, 0x02, 0xe0, 0x0b, + 0x30, 0x01, 0xe7, 0xfa, 0x01, 0x03, 0x19, 0xdb, + 0x68, 0x5b, 0x42, 0xa3, 0xd1, 0x03, 0x25, 0x01, + 0x40, 0x85, 0x1c, 0x2b, 0x43, 0x1a, 0xe7, 0xf3, + 0x23, 0x33, 0x06, 0x5b, 0x6c, 0x1b, 0x40, 0x13, + 0xd0, 0x00, 0xe7, 0xf9, 0xbc, 0xb0, 0x47, 0x70, + 0x9e, 0x00, 0x00, 0xc0, 0xe3, 0xa0, 0x14, 0x62, + 0xe5, 0x91, 0x10, 0x14, 0xe2, 0x01, 0x00, 0xff, + 0xe5, 0x9f, 0x10, 0x2c, 0xe5, 0xd1, 0x10, 0x00, + 0xe3, 0x51, 0x00, 0xff, 0x0a, 0x00, 0x00, 0x05, + 0xe5, 0x9f, 0x10, 0x1c, 0xe5, 0xd1, 0x10, 0x00, + 0xe3, 0xa0, 0x20, 0x01, 0xe1, 0xa0, 0x11, 0x12, + 0xe3, 0xa0, 0x24, 0x66, 0xe5, 0x82, 0x10, 0x10, + 0xe3, 0xa0, 0x14, 0x62, 0xe5, 0x81, 0x00, 0x14, + 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0xb9, 0xb4, + 0x47, 0x00, 0x00, 0x00, 0x47, 0x08, 0x00, 0x00, + 0x47, 0x10, 0x00, 0x00, 0x47, 0x18, 0x00, 0x00, + 0x47, 0x20, 0x00, 0x00, 0x47, 0x28, 0x00, 0x00, + 0x47, 0x30, 0x00, 0x00, 0x47, 0x38, 0x00, 0x00, + 0x17, 0xcb, 0x40, 0x59, 0x1a, 0xc9, 0x17, 0xc2, + 0x40, 0x50, 0x1a, 0x80, 0xd1, 0x01, 0xf0, 0x00, + 0xf9, 0xf1, 0xb4, 0x0c, 0x08, 0x4b, 0x1c, 0x02, + 0x42, 0x9a, 0xd8, 0x00, 0x00, 0x52, 0xd3, 0xfb, + 0x23, 0x00, 0xe0, 0x00, 0x08, 0x52, 0x42, 0x91, + 0x41, 0x5b, 0x42, 0x91, 0xd3, 0x00, 0x1a, 0x89, + 0x42, 0x82, 0xd1, 0xf7, 0x1c, 0x18, 0xbc, 0x0c, + 0x40, 0x5a, 0x40, 0x50, 0x1a, 0x80, 0x40, 0x59, + 0x1a, 0xc9, 0x47, 0x70, 0x08, 0x4b, 0x1c, 0x02, + 0xd1, 0x01, 0xf0, 0x00, 0xf9, 0xd3, 0x42, 0x9a, + 0xd8, 0x00, 0x00, 0x52, 0xd3, 0xfb, 0x23, 0x00, + 0xe0, 0x00, 0x08, 0x52, 0x42, 0x91, 0x41, 0x5b, + 0x42, 0x91, 0xd3, 0x00, 0x1a, 0x89, 0x42, 0x82, + 0xd1, 0xf7, 0x1c, 0x18, 0x47, 0x70, 0x00, 0x00, + 0x3a, 0x20, 0xd5, 0x09, 0x42, 0x53, 0x32, 0x20, + 0x40, 0xd0, 0x46, 0x94, 0x1c, 0x0a, 0x40, 0x9a, + 0x43, 0x10, 0x46, 0x62, 0x40, 0xd1, 0x47, 0x70, + 0x1c, 0x08, 0x40, 0xd0, 0x21, 0x00, 0x47, 0x70, + 0x40, 0x10, 0x40, 0x19, 0x47, 0x70, 0x00, 0x00, + 0x47, 0x70, 0x00, 0x00, 0x1a, 0x43, 0x42, 0x93, + 0xd3, 0x30, 0x46, 0x84, 0x07, 0x8b, 0xd0, 0x07, + 0x1e, 0x52, 0xd3, 0x29, 0x78, 0x0b, 0x70, 0x03, + 0x1c, 0x40, 0x1c, 0x49, 0x07, 0x8b, 0xd1, 0xf7, + 0x07, 0x83, 0xd1, 0x17, 0x3a, 0x10, 0xd3, 0x05, + 0xb4, 0xb0, 0xc9, 0xb8, 0xc0, 0xb8, 0x3a, 0x10, + 0xd2, 0xfb, 0xbc, 0xb0, 0x32, 0x0c, 0xd3, 0x0f, + 0xc9, 0x08, 0xc0, 0x08, 0x1f, 0x12, 0xd2, 0xfb, + 0xe0, 0x0a, 0xc9, 0x08, 0x70, 0xc3, 0x0a, 0x1b, + 0x70, 0x83, 0x0a, 0x1b, 0x70, 0x43, 0x0a, 0x1b, + 0x70, 0x03, 0x1d, 0x00, 0x1f, 0x12, 0xd2, 0xf4, + 0x1c, 0xd2, 0xd3, 0x05, 0x78, 0x0b, 0x70, 0x03, + 0x1c, 0x49, 0x1c, 0x40, 0x1e, 0x52, 0xd2, 0xf9, + 0x46, 0x60, 0x47, 0x70, 0x1c, 0x03, 0x43, 0x0b, + 0x43, 0x13, 0x07, 0x9b, 0xd1, 0x04, 0x1f, 0x12, + 0x58, 0x8b, 0x50, 0x83, 0xd1, 0xfb, 0x47, 0x70, + 0x1e, 0x52, 0x5c, 0x8b, 0x54, 0x83, 0xd1, 0xfb, + 0x47, 0x70, 0x00, 0x00, 0x1c, 0x02, 0x43, 0x0a, + 0x07, 0x92, 0xd1, 0x1a, 0x46, 0xbc, 0xb4, 0x30, + 0x4c, 0x11, 0x01, 0xe5, 0xc8, 0x04, 0xc9, 0x08, + 0x1a, 0xd7, 0xd1, 0x09, 0x1b, 0x17, 0x43, 0x97, + 0x40, 0x2f, 0xd0, 0xf7, 0x20, 0x00, 0xbc, 0x30, + 0x46, 0x67, 0x47, 0x70, 0x02, 0x12, 0x02, 0x1b, + 0x0e, 0x11, 0x0e, 0x18, 0x1a, 0x08, 0xd1, 0x01, + 0x29, 0x00, 0xd1, 0xf7, 0xbc, 0x30, 0x46, 0x67, + 0x47, 0x70, 0x78, 0x02, 0x78, 0x0b, 0x1a, 0xd2, + 0xd1, 0x03, 0x1c, 0x40, 0x1c, 0x49, 0x2b, 0x00, + 0xd1, 0xf7, 0x1c, 0x10, 0x47, 0x70, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x42, 0x41, 0x46, 0x8c, + 0x07, 0x83, 0xd0, 0x05, 0x78, 0x03, 0x2b, 0x00, + 0xd0, 0x16, 0x1c, 0x40, 0x07, 0x83, 0xd1, 0xf9, + 0x49, 0x0a, 0xc8, 0x04, 0x09, 0xc9, 0x1a, 0x53, + 0x43, 0x93, 0x01, 0xc9, 0x40, 0x0b, 0xd0, 0xf8, + 0x1f, 0x00, 0x0e, 0x13, 0xd0, 0x08, 0x1c, 0x40, + 0x02, 0x13, 0x0e, 0x1b, 0xd0, 0x04, 0x1c, 0x40, + 0x04, 0x13, 0x0e, 0x1b, 0xd0, 0x00, 0x1c, 0x40, + 0x44, 0x60, 0x47, 0x70, 0x80, 0x80, 0x80, 0x80, + 0x46, 0xbc, 0xb4, 0x60, 0x1c, 0x03, 0x43, 0x08, + 0x07, 0x80, 0xd1, 0x1b, 0x1f, 0x12, 0xd3, 0x0b, + 0x4e, 0x0f, 0xcb, 0x01, 0xc9, 0x80, 0x1b, 0xc0, + 0xd1, 0x09, 0x1b, 0xbd, 0x43, 0xbd, 0x01, 0xf7, + 0x40, 0x3d, 0xd1, 0x04, 0x1f, 0x12, 0xd2, 0xf4, + 0x1c, 0xd2, 0xd3, 0x0e, 0xe0, 0x02, 0x1f, 0x1b, + 0x1f, 0x09, 0x1c, 0xd2, 0x78, 0x18, 0x78, 0x0f, + 0x1b, 0xc0, 0xd1, 0x06, 0x2f, 0x00, 0xd0, 0x04, + 0x1c, 0x5b, 0x1c, 0x49, 0x1e, 0x52, 0xd2, 0xf5, + 0x20, 0x00, 0xbc, 0x60, 0x46, 0x67, 0x47, 0x70, + 0x01, 0x01, 0x01, 0x01, 0x46, 0xbc, 0x1c, 0x03, + 0x43, 0x08, 0x07, 0x80, 0xd1, 0x13, 0x1f, 0x12, + 0xd3, 0x05, 0xcb, 0x01, 0xc9, 0x80, 0x1b, 0xc0, + 0xd1, 0x04, 0x1f, 0x12, 0xd2, 0xf9, 0x1c, 0xd2, + 0xd3, 0x0c, 0xe0, 0x02, 0x1f, 0x1b, 0x1f, 0x09, + 0x1c, 0xd2, 0x78, 0x18, 0x78, 0x0f, 0x1b, 0xc0, + 0xd1, 0x04, 0x1c, 0x5b, 0x1c, 0x49, 0x1e, 0x52, + 0xd2, 0xf7, 0x20, 0x00, 0x46, 0x67, 0x47, 0x70, + 0xb5, 0x80, 0xb0, 0x8f, 0x4b, 0x0a, 0x93, 0x08, + 0x4b, 0x0a, 0x93, 0x09, 0x4b, 0x0a, 0x93, 0x07, + 0x90, 0x0e, 0x46, 0x6b, 0xa8, 0x0e, 0xf0, 0x00, + 0xff, 0x4d, 0x1c, 0x07, 0x20, 0x00, 0xa9, 0x0e, + 0xf0, 0x00, 0xf8, 0xdc, 0x1c, 0x38, 0xb0, 0x0f, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x01, 0xe6, 0x39, 0x2e, 0x01, 0xe6, 0x47, + 0x2e, 0x01, 0xeb, 0xe3, 0x46, 0x84, 0x07, 0x83, + 0xd0, 0x05, 0x1e, 0x52, 0xd3, 0x12, 0x70, 0x01, + 0x1c, 0x40, 0x07, 0x83, 0xd1, 0xf9, 0x3a, 0x08, + 0xd3, 0x07, 0x02, 0x0b, 0x43, 0x19, 0x04, 0x0b, + 0x43, 0x19, 0x1c, 0x0b, 0xc0, 0x0a, 0x3a, 0x08, + 0xd2, 0xfc, 0x1d, 0xd2, 0xd3, 0x02, 0x54, 0x81, + 0x1e, 0x52, 0xd2, 0xfc, 0x46, 0x60, 0x47, 0x70, + 0x47, 0x78, 0x00, 0x00, 0xe2, 0x10, 0xc1, 0x02, + 0x12, 0x60, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, + 0x03, 0xa0, 0x10, 0x00, 0x01, 0x2f, 0xff, 0x1e, + 0xe3, 0x8c, 0xc1, 0x01, 0xe3, 0x8c, 0xc6, 0x1e, + 0xe1, 0xb0, 0x28, 0x20, 0x01, 0xa0, 0x08, 0x00, + 0x02, 0x4c, 0xc4, 0x01, 0xe1, 0xb0, 0x2c, 0x20, + 0x01, 0xa0, 0x04, 0x00, 0x02, 0x4c, 0xc5, 0x02, + 0xe1, 0xb0, 0x2e, 0x20, 0x01, 0xa0, 0x02, 0x00, + 0x02, 0x4c, 0xc5, 0x01, 0xe1, 0xb0, 0x2f, 0x20, + 0x01, 0xa0, 0x01, 0x00, 0x02, 0x4c, 0xc6, 0x02, + 0xe1, 0xb0, 0x2f, 0xa0, 0x01, 0xa0, 0x00, 0x80, + 0x02, 0x4c, 0xc6, 0x01, 0xe1, 0xa0, 0x00, 0x80, + 0xe1, 0xa0, 0x1a, 0x00, 0xe1, 0x8c, 0x06, 0x20, + 0xe1, 0x2f, 0xff, 0x1e, 0x22, 0x01, 0x07, 0xd2, + 0x40, 0x50, 0x47, 0x70, 0xe2, 0x20, 0x01, 0x02, + 0xe1, 0x2f, 0xff, 0x1e, 0x00, 0x40, 0x08, 0x40, + 0x47, 0x70, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0xc4, 0xff, 0xe3, 0x8c, 0xc6, 0x0e, + 0xe1, 0x5c, 0x00, 0x82, 0x9a, 0x00, 0x00, 0x0a, + 0xe1, 0xb0, 0x00, 0x80, 0x03, 0x31, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x0a, 0x3a, 0x00, 0x00, 0x12, + 0xe1, 0x50, 0x00, 0x0c, 0x03, 0x51, 0x00, 0x00, + 0x8a, 0x00, 0x04, 0xec, 0xe1, 0xb0, 0x20, 0x82, + 0x8a, 0x00, 0x00, 0x18, 0xe3, 0xa0, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0x03, 0x53, 0x00, 0x00, + 0x0a, 0xff, 0xff, 0xf2, 0xea, 0x00, 0x04, 0xe9, + 0xe1, 0x50, 0x00, 0x0c, 0x03, 0x51, 0x00, 0x00, + 0x8a, 0x00, 0x04, 0xe2, 0xe1, 0xb0, 0x20, 0x82, + 0x33, 0xa0, 0x00, 0x01, 0x23, 0xa0, 0x00, 0x00, + 0x03, 0x33, 0x00, 0x00, 0x03, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x0c, + 0x03, 0x51, 0x00, 0x00, 0x8a, 0x00, 0x04, 0xd9, + 0xe1, 0xb0, 0x20, 0x82, 0x23, 0xa0, 0x00, 0x00, + 0x21, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02, + 0x01, 0x51, 0x00, 0x03, 0x33, 0xa0, 0x00, 0x01, + 0x23, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03, + 0x83, 0xa0, 0x00, 0x01, 0x93, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe5, 0x9f, 0xc0, 0x28, 0xe8, 0xac, 0x7f, 0xff, + 0xe2, 0x8f, 0x00, 0x0c, 0xe2, 0x4c, 0x10, 0x3c, + 0xe2, 0x4e, 0xe0, 0x04, 0xe5, 0x8c, 0xe0, 0x00, + 0xea, 0x00, 0x05, 0x71, 0x80, 0x00, 0x00, 0x20, + 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x62, + 0x79, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x00, 0x00, + 0x2e, 0x08, 0x21, 0xd0, 0x06, 0x00, 0x0e, 0x00, + 0x68, 0x0a, 0x70, 0x10, 0x32, 0x01, 0x60, 0x0a, + 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 0x00, 0x00, + 0xb4, 0x90, 0x18, 0x42, 0x78, 0x17, 0x23, 0x00, + 0x2f, 0x00, 0xd0, 0x22, 0x2f, 0x35, 0xdb, 0x20, + 0x2f, 0x35, 0xd0, 0x01, 0x24, 0x30, 0xe0, 0x07, + 0x1c, 0x17, 0x78, 0x7c, 0x37, 0x01, 0x2c, 0x30, + 0xd0, 0xfb, 0x2c, 0x00, 0xd1, 0xf6, 0xe0, 0x14, + 0x3a, 0x01, 0x78, 0x17, 0x2f, 0x39, 0xd1, 0x01, + 0x70, 0x14, 0xe7, 0xf9, 0x37, 0x01, 0x70, 0x17, + 0x78, 0x02, 0x2a, 0x30, 0xd0, 0x09, 0x29, 0x00, + 0xdb, 0x04, 0x5c, 0x42, 0x18, 0x43, 0x70, 0x5a, + 0x39, 0x01, 0xd5, 0xfa, 0x20, 0x01, 0xbc, 0x90, + 0x47, 0x70, 0x1c, 0x18, 0xbc, 0x90, 0x47, 0x70, + 0xb5, 0x90, 0x1c, 0x0c, 0x1e, 0x57, 0x2a, 0x00, + 0xdd, 0x08, 0xf0, 0x01, 0xfc, 0x81, 0x31, 0x30, + 0x70, 0x21, 0x1c, 0x39, 0x3c, 0x01, 0x3f, 0x01, + 0x29, 0x00, 0xdc, 0xf6, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0xf7, 0x1c, 0x14, 0x1c, 0x0f, + 0xb0, 0x85, 0xa3, 0xfb, 0x1c, 0x08, 0x1c, 0x11, + 0xcb, 0x0c, 0xf7, 0xff, 0xff, 0x3b, 0x28, 0x00, + 0xd0, 0x05, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, + 0xff, 0x29, 0x1c, 0x0c, 0x1c, 0x07, 0xa3, 0xf4, + 0xcb, 0x0c, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x01, + 0xfc, 0x7b, 0x28, 0x00, 0xd0, 0x05, 0x27, 0x00, + 0x97, 0x01, 0x1f, 0x78, 0x90, 0x00, 0x1c, 0x3e, + 0xe1, 0xc8, 0xb0, 0x8a, 0x46, 0x6a, 0x1c, 0x38, + 0x1c, 0x21, 0xf0, 0x01, 0xfc, 0x93, 0x90, 0x08, + 0x91, 0x09, 0x20, 0xff, 0x30, 0x2e, 0x9f, 0x00, + 0x43, 0x78, 0x4b, 0xe9, 0x18, 0xc1, 0x20, 0x7d, + 0x00, 0xc0, 0xf7, 0xff, 0xfd, 0x71, 0x90, 0x0a, + 0x1b, 0xc2, 0xa1, 0xe6, 0xc9, 0x03, 0xf0, 0x01, + 0xfc, 0xc7, 0x9e, 0x0a, 0xb0, 0x83, 0xf0, 0x01, + 0xfd, 0x55, 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, + 0x2e, 0x00, 0xda, 0x04, 0x42, 0x76, 0x4d, 0xe1, + 0x4c, 0xe1, 0x1c, 0x67, 0xe0, 0x02, 0x4d, 0xe1, + 0x4c, 0xe1, 0x27, 0x00, 0x2e, 0x00, 0xd0, 0x16, + 0x08, 0x70, 0xd3, 0x0a, 0x46, 0x6b, 0x1c, 0x28, + 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x01, 0xfd, 0xba, + 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x2e, 0x01, + 0xd0, 0x09, 0x1c, 0x28, 0x1c, 0x21, 0x1c, 0x3a, + 0xf0, 0x01, 0xfd, 0xca, 0x10, 0x76, 0x1c, 0x0c, + 0x1c, 0x05, 0x1c, 0x17, 0xe7, 0xe8, 0xaa, 0x00, + 0xca, 0x07, 0xf0, 0x01, 0xfd, 0xdd, 0x90, 0x04, + 0x91, 0x05, 0xb0, 0x03, 0x98, 0x08, 0x99, 0x09, + 0x9a, 0x01, 0x9b, 0x02, 0xf0, 0x01, 0xfe, 0xd6, + 0x1c, 0x04, 0x1c, 0x0f, 0xa3, 0xcd, 0xcb, 0x0c, + 0xf7, 0xff, 0xfe, 0xd0, 0x28, 0x00, 0xd0, 0x1d, + 0xa3, 0xcc, 0x68, 0x1a, 0x68, 0x5b, 0x1c, 0x20, + 0x1c, 0x39, 0x1c, 0x15, 0x1c, 0x1e, 0xf0, 0x01, + 0xff, 0x6f, 0x1c, 0x04, 0x98, 0x0a, 0x38, 0x01, + 0x90, 0x0a, 0x1c, 0x0f, 0x98, 0x01, 0x99, 0x02, + 0x1c, 0x2a, 0x1c, 0x33, 0xf0, 0x01, 0xfe, 0xba, + 0x90, 0x01, 0x91, 0x02, 0xa3, 0xbf, 0xcb, 0x0c, + 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 0xfe, 0xb2, + 0x28, 0x00, 0xd1, 0xe1, 0xa3, 0xbf, 0xcb, 0x0c, + 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x01, 0xff, 0xc2, + 0x28, 0x00, 0xd0, 0x1d, 0xa3, 0xb9, 0x68, 0x1a, + 0x68, 0x5b, 0x1c, 0x20, 0x1c, 0x39, 0x1c, 0x15, + 0x1c, 0x1e, 0xf0, 0x01, 0xfe, 0x9f, 0x1c, 0x04, + 0x98, 0x0a, 0x30, 0x01, 0x90, 0x0a, 0x1c, 0x0f, + 0x98, 0x01, 0x99, 0x02, 0x1c, 0x2a, 0x1c, 0x33, + 0xf0, 0x01, 0xff, 0x3e, 0x90, 0x01, 0x91, 0x02, + 0xa3, 0xb0, 0xcb, 0x0c, 0x1c, 0x20, 0x1c, 0x39, + 0xf0, 0x01, 0xff, 0xa4, 0x28, 0x00, 0xd1, 0xe1, + 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x01, 0xff, 0xf6, + 0x90, 0x0b, 0x98, 0x0a, 0x42, 0x46, 0x96, 0x0e, + 0x98, 0x0b, 0xf7, 0xff, 0xfe, 0x3d, 0x9a, 0x00, + 0x9e, 0x0a, 0x1a, 0xb2, 0xf0, 0x01, 0xfc, 0x34, + 0x90, 0x06, 0x91, 0x07, 0xa0, 0x96, 0x68, 0x02, + 0x92, 0x04, 0x68, 0x41, 0x91, 0x05, 0x9e, 0x0a, + 0x2e, 0x00, 0xda, 0x25, 0x9e, 0x0e, 0xa1, 0xa1, + 0xc9, 0x03, 0xa2, 0x91, 0x68, 0x14, 0x68, 0x52, + 0x92, 0x03, 0x25, 0x00, 0x1c, 0x02, 0x1c, 0x2b, + 0x1c, 0x07, 0xf0, 0x02, 0xf8, 0x13, 0x1c, 0x02, + 0x1c, 0x0b, 0x99, 0x03, 0x1c, 0x20, 0xf0, 0x02, + 0xf8, 0x15, 0xa1, 0x9a, 0x68, 0x08, 0x68, 0x49, + 0x91, 0x0d, 0x1c, 0x3a, 0x1c, 0x2b, 0x1c, 0x04, + 0xf0, 0x01, 0xfe, 0xfe, 0xa3, 0x87, 0xcb, 0x0c, + 0xf0, 0x02, 0xf8, 0x76, 0x9b, 0x0d, 0x1c, 0x22, + 0xf0, 0x01, 0xfe, 0x4c, 0x1c, 0x04, 0xe0, 0x05, + 0xa0, 0x90, 0x68, 0x45, 0x68, 0x07, 0xa0, 0x7e, + 0x68, 0x41, 0x68, 0x04, 0x91, 0x03, 0x2e, 0x00, + 0xd0, 0x5d, 0x08, 0x70, 0xd3, 0x35, 0xb0, 0x82, + 0x98, 0x08, 0x99, 0x09, 0x9b, 0x05, 0x1c, 0x22, + 0xf0, 0x01, 0xfe, 0xe2, 0x90, 0x00, 0x91, 0x01, + 0x9b, 0x05, 0x1c, 0x38, 0x1c, 0x29, 0x1c, 0x22, + 0xf0, 0x01, 0xff, 0xe8, 0x9a, 0x06, 0x9b, 0x07, + 0xf0, 0x01, 0xfe, 0xd6, 0x9a, 0x00, 0x9b, 0x01, + 0xb0, 0x02, 0xf0, 0x01, 0xff, 0xdf, 0x90, 0x04, + 0x91, 0x05, 0x98, 0x06, 0x99, 0x07, 0x1c, 0x3a, + 0x1c, 0x2b, 0xf0, 0x01, 0xfe, 0xc9, 0xb0, 0x82, + 0x90, 0x00, 0x23, 0x00, 0x93, 0x01, 0x1c, 0x02, + 0xf0, 0x01, 0xff, 0xc8, 0x1c, 0x02, 0x1c, 0x0b, + 0x98, 0x06, 0x99, 0x07, 0xf0, 0x01, 0xff, 0xca, + 0x90, 0x06, 0x91, 0x07, 0x98, 0x00, 0x90, 0x08, + 0x99, 0x01, 0x91, 0x09, 0xb0, 0x02, 0x2e, 0x01, + 0xd0, 0x25, 0xa1, 0x72, 0xc9, 0x03, 0x1c, 0x3a, + 0x1c, 0x2b, 0xf0, 0x01, 0xfe, 0xad, 0x9b, 0x03, + 0x1c, 0x22, 0xf0, 0x01, 0xff, 0xb7, 0x9b, 0x03, + 0x1c, 0x22, 0xf0, 0x01, 0xfe, 0xa5, 0x91, 0x03, + 0x1c, 0x04, 0x1c, 0x38, 0x1c, 0x29, 0x1c, 0x3a, + 0x1c, 0x2b, 0xf0, 0x01, 0xfe, 0x9d, 0x25, 0x00, + 0x1c, 0x02, 0x1c, 0x2b, 0x1c, 0x07, 0xf0, 0x01, + 0xff, 0x9d, 0x1c, 0x02, 0x1c, 0x0b, 0x99, 0x03, + 0x1c, 0x20, 0xf0, 0x01, 0xff, 0x9f, 0x91, 0x03, + 0x10, 0x76, 0x1c, 0x04, 0xe7, 0xa1, 0xe7, 0xff, + 0xab, 0x06, 0xcb, 0x0f, 0xf0, 0x02, 0xf8, 0x0c, + 0x28, 0x00, 0xd1, 0x03, 0x98, 0x0b, 0x38, 0x01, + 0x90, 0x0b, 0xe7, 0x55, 0x98, 0x08, 0x99, 0x09, + 0x9a, 0x06, 0x9b, 0x07, 0xf0, 0x01, 0xff, 0x82, + 0x9a, 0x04, 0x9b, 0x05, 0xf0, 0x01, 0xff, 0x7e, + 0x9a, 0x01, 0x9b, 0x02, 0xf0, 0x01, 0xfd, 0xca, + 0xa3, 0x4c, 0x68, 0x1a, 0x68, 0x5b, 0x93, 0x0c, + 0x1c, 0x15, 0xf0, 0x01, 0xfe, 0x6d, 0x1c, 0x0c, + 0x1c, 0x07, 0xf0, 0x01, 0xff, 0x2f, 0x1c, 0x06, + 0xf7, 0xff, 0xfd, 0x7a, 0x1c, 0x3a, 0x1c, 0x23, + 0xf0, 0x01, 0xff, 0xde, 0x9b, 0x0c, 0x1c, 0x2a, + 0xf0, 0x01, 0xfe, 0x5e, 0xf0, 0x01, 0xff, 0x22, + 0x1c, 0x07, 0xd5, 0x04, 0x4b, 0x47, 0x18, 0xff, + 0x3e, 0x01, 0x2f, 0x00, 0xdb, 0xfa, 0x48, 0x45, + 0x42, 0x87, 0xdb, 0x04, 0x4b, 0x43, 0x1a, 0xff, + 0x36, 0x01, 0x42, 0x87, 0xda, 0xfa, 0x2e, 0x00, + 0xda, 0x06, 0x4b, 0x40, 0x18, 0xf6, 0x99, 0x0b, + 0x39, 0x01, 0x91, 0x0b, 0x2e, 0x00, 0xdb, 0xf8, + 0x42, 0x86, 0xdb, 0x06, 0x4b, 0x3b, 0x1a, 0xf6, + 0x99, 0x0b, 0x31, 0x01, 0x91, 0x0b, 0x42, 0x86, + 0xda, 0xf8, 0x99, 0x0b, 0x4b, 0x38, 0x42, 0x99, + 0xda, 0x17, 0x98, 0x0b, 0x00, 0x84, 0x18, 0x24, + 0x00, 0x64, 0x1c, 0x18, 0x1c, 0x31, 0xf7, 0xff, + 0xfb, 0xe3, 0x18, 0x20, 0x90, 0x0b, 0x00, 0x8c, + 0x18, 0x64, 0x00, 0x64, 0x1c, 0x39, 0x48, 0x30, + 0xf7, 0xff, 0xfb, 0xda, 0x18, 0x26, 0x00, 0x8f, + 0x18, 0x7f, 0x00, 0x7f, 0x98, 0x0a, 0x38, 0x01, + 0xe0, 0x16, 0x99, 0x0b, 0x42, 0x81, 0xdb, 0x14, + 0x98, 0x0b, 0xf0, 0x01, 0xfa, 0xa1, 0x4b, 0x27, + 0x43, 0x59, 0x19, 0x89, 0x90, 0x0b, 0x1c, 0x08, + 0xf0, 0x01, 0xfa, 0x9a, 0x4b, 0x23, 0x43, 0x59, + 0x19, 0xc9, 0x1c, 0x06, 0x1d, 0x48, 0xf0, 0x01, + 0xfa, 0x93, 0x1c, 0x07, 0x98, 0x0a, 0x30, 0x01, + 0x90, 0x0a, 0xb0, 0x0a, 0x24, 0x30, 0x98, 0x05, + 0x70, 0x04, 0x98, 0x05, 0x1d, 0x81, 0x22, 0x06, + 0x98, 0x01, 0xf7, 0xff, 0xfd, 0xfd, 0x98, 0x05, + 0x1d, 0xc1, 0x31, 0x05, 0x22, 0x06, 0x1c, 0x30, + 0xf7, 0xff, 0xfd, 0xf6, 0xe0, 0x2e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xea, 0x84, 0x3f, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, + 0xcc, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x40, 0x01, + 0xa0, 0x00, 0x00, 0x00, 0x40, 0xf8, 0x6a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x2e, 0x84, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc9, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x9a, 0x40, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x40, + 0x00, 0x01, 0x86, 0xa0, 0x98, 0x05, 0x1d, 0xc1, + 0x31, 0x0b, 0x22, 0x06, 0x1c, 0x38, 0xf7, 0xff, + 0xfd, 0xbf, 0x98, 0x05, 0x74, 0xc4, 0x27, 0x00, + 0x98, 0x05, 0x75, 0x07, 0x98, 0x00, 0x30, 0x05, + 0xb0, 0x05, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0x02, 0x08, 0x12, 0xd3, 0x01, + 0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, 0x60, 0x0a, + 0x68, 0x01, 0x4a, 0x08, 0x40, 0x0a, 0x4b, 0x07, + 0x42, 0x9a, 0xd0, 0x01, 0x20, 0x00, 0x47, 0x70, + 0x03, 0x09, 0xd1, 0x02, 0x68, 0x40, 0x28, 0x00, + 0xd0, 0x01, 0x20, 0x01, 0x47, 0x70, 0x20, 0x02, + 0x47, 0x70, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, + 0xb5, 0x90, 0x1c, 0x04, 0x54, 0x63, 0x1c, 0x4f, + 0x2a, 0x00, 0xda, 0x02, 0x42, 0x52, 0x21, 0x2d, + 0xe0, 0x00, 0x21, 0x2b, 0x1c, 0x38, 0x54, 0x21, + 0x23, 0x7d, 0x00, 0xdb, 0x37, 0x01, 0x42, 0x9a, + 0xdb, 0x09, 0x1c, 0x18, 0x1c, 0x11, 0xf7, 0xff, + 0xfb, 0x37, 0x1d, 0xc2, 0x32, 0x29, 0x1c, 0x38, + 0x54, 0x22, 0x1c, 0x0a, 0x37, 0x01, 0x2a, 0x64, + 0xdb, 0x09, 0x20, 0x64, 0x1c, 0x11, 0xf7, 0xff, + 0xfb, 0x2b, 0x1d, 0xc2, 0x32, 0x29, 0x1c, 0x38, + 0x54, 0x22, 0x1c, 0x0a, 0x37, 0x01, 0x1c, 0x10, + 0xf0, 0x01, 0xf9, 0xf6, 0x1d, 0xc2, 0x32, 0x29, + 0x1c, 0x38, 0x54, 0x22, 0x37, 0x01, 0x1c, 0x38, + 0x31, 0x30, 0x54, 0x21, 0x37, 0x01, 0x1c, 0x38, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, + 0x1c, 0x06, 0xb0, 0x82, 0x68, 0x10, 0x90, 0x00, + 0x1d, 0xd0, 0x30, 0x0d, 0xb0, 0x81, 0x1c, 0x0f, + 0x46, 0x69, 0x1c, 0x14, 0x1c, 0x05, 0xf7, 0xff, + 0xff, 0xa0, 0x99, 0x00, 0x29, 0x00, 0xd0, 0x01, + 0xa1, 0xc9, 0xe0, 0x0a, 0x99, 0x01, 0x08, 0x89, + 0xd3, 0x01, 0xa1, 0xc8, 0xe0, 0x05, 0x99, 0x01, + 0x08, 0xc9, 0xd3, 0x01, 0xa1, 0xc6, 0xe0, 0x00, + 0xa1, 0xc6, 0x60, 0x61, 0x28, 0x00, 0xd0, 0x15, + 0x28, 0x01, 0xd1, 0x01, 0xa0, 0xc4, 0xe0, 0x00, + 0xa0, 0xc4, 0x78, 0x01, 0x70, 0x39, 0x78, 0x41, + 0x70, 0x79, 0x78, 0x80, 0x70, 0xb8, 0x20, 0x00, + 0x70, 0xf8, 0x98, 0x01, 0x4b, 0xc0, 0x40, 0x18, + 0x60, 0x20, 0x20, 0x03, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xcd, 0x06, 0xb0, 0x01, + 0x48, 0xbc, 0x90, 0x01, 0x2e, 0x45, 0xd0, 0x74, + 0x2e, 0x65, 0xd0, 0x72, 0x2e, 0x66, 0xd1, 0x71, + 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0x2e, 0x1c, 0x06, + 0xd5, 0x4e, 0x42, 0x76, 0x68, 0xa0, 0x1c, 0x41, + 0x42, 0xb1, 0xda, 0x09, 0x21, 0x30, 0x70, 0x39, + 0x98, 0x01, 0x68, 0x00, 0x78, 0x00, 0x25, 0x02, + 0x70, 0x78, 0x68, 0xa0, 0x61, 0x20, 0xe0, 0x3b, + 0x1b, 0x80, 0x1c, 0x85, 0x2d, 0x12, 0xdd, 0x03, + 0x1f, 0xe8, 0x38, 0x0c, 0x25, 0x13, 0x61, 0x20, + 0x1c, 0x38, 0x1c, 0x29, 0xf7, 0xff, 0xfc, 0xd4, + 0x28, 0x00, 0xd0, 0x01, 0x35, 0x01, 0x3e, 0x01, + 0x2e, 0x00, 0xd1, 0x02, 0x78, 0x78, 0x70, 0x38, + 0xe0, 0x0d, 0x2e, 0x01, 0xd1, 0x10, 0x1c, 0x28, + 0x2d, 0x00, 0xdd, 0x05, 0x5c, 0x39, 0x18, 0x3a, + 0x70, 0x51, 0x38, 0x01, 0x28, 0x00, 0xdc, 0xf9, + 0x21, 0x30, 0x70, 0x39, 0x35, 0x01, 0x98, 0x01, + 0x68, 0x00, 0x78, 0x00, 0x70, 0x78, 0xe0, 0x13, + 0x1c, 0x28, 0x2d, 0x00, 0xdd, 0x05, 0x5c, 0x39, + 0x18, 0x3a, 0x70, 0x91, 0x38, 0x01, 0x28, 0x00, + 0xdc, 0xf9, 0x21, 0x30, 0x70, 0x39, 0x98, 0x01, + 0x68, 0x00, 0x78, 0x00, 0x70, 0x78, 0x20, 0x3c, + 0x70, 0xb8, 0x1e, 0x70, 0x60, 0xe0, 0x35, 0x02, + 0x69, 0x20, 0x28, 0x00, 0xdd, 0x5d, 0xe0, 0x26, + 0x68, 0xa0, 0x19, 0x80, 0x1c, 0x85, 0x2d, 0x12, + 0xdd, 0x41, 0x25, 0x13, 0x1c, 0x38, 0x1c, 0x29, + 0xf7, 0xff, 0xfc, 0x96, 0x28, 0x00, 0xd0, 0x01, + 0x25, 0x14, 0x36, 0x01, 0x1e, 0x69, 0x42, 0xb1, + 0xdd, 0x1a, 0x20, 0x00, 0x2e, 0x00, 0xdb, 0x05, + 0x18, 0x39, 0x78, 0x49, 0x54, 0x39, 0x30, 0x01, + 0x42, 0xb0, 0xdd, 0xf9, 0x98, 0x01, 0x68, 0x00, + 0xe0, 0x01, 0xe0, 0xc1, 0xe0, 0x45, 0x78, 0x00, + 0x19, 0xb9, 0x70, 0x48, 0x68, 0xa0, 0x19, 0x80, + 0x38, 0x11, 0x61, 0x20, 0xd0, 0x35, 0x21, 0x3e, + 0x1c, 0x28, 0x54, 0x39, 0x35, 0x01, 0xe0, 0x30, + 0x20, 0x00, 0x29, 0x00, 0xdd, 0x05, 0x18, 0x3a, + 0x78, 0x52, 0x54, 0x3a, 0x30, 0x01, 0x42, 0x81, + 0xdc, 0xf9, 0x20, 0x3c, 0x19, 0x79, 0x39, 0x20, + 0x77, 0xc8, 0x1b, 0x70, 0x30, 0x02, 0x60, 0xe0, + 0x98, 0x01, 0x68, 0x00, 0x78, 0x01, 0x1c, 0x28, + 0x54, 0x39, 0x68, 0xa0, 0x35, 0x01, 0x28, 0x00, + 0xd0, 0x17, 0x61, 0x20, 0xe7, 0xdf, 0x1c, 0x38, + 0x1c, 0x29, 0xf7, 0xff, 0xfc, 0x55, 0x28, 0x00, + 0xd0, 0x01, 0x35, 0x01, 0x36, 0x01, 0x20, 0x00, + 0x2e, 0x00, 0xdb, 0x05, 0x18, 0x39, 0x78, 0x49, + 0x54, 0x39, 0x30, 0x01, 0x42, 0xb0, 0xdd, 0xf9, + 0x98, 0x01, 0x68, 0x00, 0x78, 0x00, 0x19, 0xb9, + 0x70, 0x48, 0x68, 0xa0, 0x28, 0x00, 0xd1, 0x68, + 0x98, 0x00, 0x09, 0x00, 0xd2, 0x66, 0x3d, 0x01, + 0xe0, 0x75, 0x1c, 0x38, 0xb0, 0x81, 0xf7, 0xff, + 0xfc, 0x74, 0x90, 0x00, 0x68, 0xa0, 0x28, 0x01, + 0xda, 0x01, 0x20, 0x01, 0x60, 0xa0, 0x68, 0xa0, + 0x28, 0x11, 0xdd, 0x01, 0x25, 0x12, 0xe0, 0x00, + 0x1c, 0x45, 0x1c, 0x38, 0x1c, 0x29, 0xf7, 0xff, + 0xfc, 0x27, 0x99, 0x00, 0x18, 0x42, 0x68, 0xa0, + 0x42, 0x90, 0xdd, 0x02, 0x23, 0x04, 0x42, 0xda, + 0xda, 0x02, 0x78, 0x78, 0x70, 0x38, 0xe0, 0x22, + 0x26, 0x66, 0x2a, 0x00, 0xdb, 0x0e, 0x20, 0x00, + 0x2a, 0x00, 0xdb, 0x05, 0x18, 0x39, 0x78, 0x49, + 0x54, 0x39, 0x30, 0x01, 0x42, 0x90, 0xdd, 0xf9, + 0x98, 0x02, 0x68, 0x00, 0x78, 0x00, 0x18, 0xb9, + 0x70, 0x48, 0xe0, 0x14, 0x42, 0x52, 0x1c, 0x28, + 0xd4, 0x04, 0x5c, 0x3b, 0x18, 0x81, 0x54, 0x7b, + 0x38, 0x01, 0xd5, 0xfa, 0x18, 0xad, 0x20, 0x00, + 0x2a, 0x00, 0xdb, 0x04, 0x21, 0x30, 0x54, 0x39, + 0x30, 0x01, 0x42, 0x90, 0xdd, 0xfb, 0x98, 0x02, + 0x68, 0x00, 0x78, 0x00, 0x70, 0x78, 0x98, 0x01, + 0x09, 0x00, 0xd2, 0x1c, 0x20, 0x00, 0x43, 0xc0, + 0x61, 0x20, 0x5d, 0x78, 0x99, 0x02, 0x68, 0x09, + 0x78, 0x09, 0x42, 0x88, 0xd0, 0x0a, 0x19, 0x78, + 0x38, 0x20, 0x7f, 0xc0, 0x28, 0x30, 0xd1, 0x05, + 0x3d, 0x01, 0x19, 0x78, 0x38, 0x20, 0x7f, 0xc0, + 0x28, 0x30, 0xd0, 0xf9, 0x19, 0x78, 0x38, 0x20, + 0x7f, 0xc0, 0x42, 0x88, 0xd1, 0x0c, 0x3d, 0x01, + 0xe0, 0x0a, 0xe0, 0x10, 0xe0, 0x0f, 0x68, 0xa0, + 0x28, 0x11, 0xdd, 0x05, 0x38, 0x11, 0x21, 0x3e, + 0x61, 0x20, 0x1c, 0x28, 0x54, 0x39, 0x35, 0x01, + 0x2e, 0x66, 0xd0, 0x03, 0x1c, 0x38, 0x1c, 0x29, + 0x1e, 0xb3, 0xe0, 0x31, 0xb0, 0x01, 0x1c, 0x28, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x38, 0xb0, 0x81, 0xf7, 0xff, 0xfb, 0xf9, + 0x90, 0x00, 0x68, 0xa0, 0x28, 0x11, 0xdd, 0x03, + 0x38, 0x11, 0x61, 0x20, 0x20, 0x11, 0x60, 0xa0, + 0x68, 0xa0, 0x1c, 0x85, 0x1c, 0x38, 0x1c, 0x29, + 0xf7, 0xff, 0xfb, 0xae, 0x99, 0x00, 0x18, 0x42, + 0x78, 0x78, 0x70, 0x38, 0x68, 0xa0, 0x28, 0x00, + 0xd1, 0x04, 0x98, 0x01, 0x09, 0x00, 0xd2, 0x01, + 0x25, 0x01, 0xe0, 0x03, 0x98, 0x02, 0x68, 0x00, + 0x78, 0x00, 0x70, 0x78, 0x69, 0x20, 0x28, 0x00, + 0xdd, 0x03, 0x21, 0x3e, 0x1c, 0x28, 0x54, 0x39, + 0x35, 0x01, 0x1c, 0x38, 0x1c, 0x29, 0x1c, 0x33, + 0xf7, 0xff, 0xfe, 0x26, 0x1c, 0x05, 0xe7, 0xc9, + 0x2d, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x61, 0x4e, 0x00, 0x49, 0x6e, 0x66, 0x00, + 0xff, 0xff, 0xfe, 0xff, 0x2e, 0x08, 0x22, 0x10, + 0xb5, 0xf0, 0x1c, 0x04, 0x25, 0x00, 0x26, 0x00, + 0x1c, 0x18, 0xb0, 0x92, 0x68, 0x13, 0x93, 0x00, + 0x1c, 0x17, 0x43, 0xea, 0x60, 0xfa, 0x61, 0x3a, + 0x1c, 0x1a, 0x23, 0x21, 0x01, 0x1b, 0x40, 0x1a, + 0xd1, 0x01, 0x22, 0x01, 0x60, 0xba, 0x1d, 0xfa, + 0x32, 0x29, 0x29, 0x67, 0xd0, 0x0e, 0xdc, 0x2c, + 0x29, 0x64, 0xd0, 0x5b, 0xdc, 0x06, 0x29, 0x45, + 0xd0, 0x08, 0x29, 0x47, 0xd0, 0x06, 0x29, 0x58, + 0xd1, 0x0c, 0xe0, 0x58, 0x29, 0x65, 0xd0, 0x01, + 0x29, 0x66, 0xd1, 0x07, 0xab, 0x01, 0x1c, 0x08, + 0x1c, 0x19, 0x69, 0xfb, 0x1c, 0x3a, 0xf7, 0xff, + 0xf9, 0x29, 0x1c, 0x05, 0xb0, 0x82, 0x6a, 0xf9, + 0x91, 0x00, 0x23, 0x01, 0x02, 0x5b, 0x98, 0x02, + 0x40, 0x18, 0x90, 0x0d, 0xd0, 0x6c, 0x21, 0x00, + 0x91, 0x01, 0x68, 0xf8, 0x28, 0x00, 0xdd, 0x01, + 0x1e, 0x41, 0x91, 0x01, 0x69, 0x38, 0x28, 0x00, + 0xdd, 0x63, 0x99, 0x01, 0x18, 0x40, 0x1e, 0x41, + 0xe0, 0xca, 0x29, 0x70, 0xd0, 0x33, 0xdc, 0x2e, + 0x29, 0x69, 0xd0, 0x2b, 0x29, 0x6f, 0xd1, 0xe1, + 0x99, 0x00, 0x09, 0xc9, 0xd3, 0x63, 0xb0, 0x82, + 0x68, 0x10, 0x90, 0x00, 0x68, 0x51, 0x91, 0x01, + 0xa3, 0xc0, 0x93, 0x12, 0xcb, 0x0c, 0xf0, 0x01, + 0xfd, 0x2d, 0x28, 0x00, 0xd0, 0x18, 0x98, 0x00, + 0x99, 0x01, 0xf7, 0xff, 0xf9, 0x4d, 0x07, 0x40, + 0x0f, 0x40, 0x6a, 0xb9, 0x5c, 0x09, 0x1c, 0x28, + 0xaa, 0x03, 0x54, 0x11, 0x22, 0x03, 0x98, 0x00, + 0x99, 0x01, 0x35, 0x01, 0xf7, 0xff, 0xf9, 0x2c, + 0x90, 0x00, 0x91, 0x01, 0x9b, 0x12, 0xcb, 0x0c, + 0xf0, 0x01, 0xfd, 0x14, 0x28, 0x00, 0xd1, 0xe6, + 0xb0, 0x02, 0xe0, 0x49, 0xe0, 0x4f, 0x29, 0x75, + 0xd0, 0x4d, 0x29, 0x78, 0xd1, 0xb2, 0x99, 0x00, + 0x09, 0xc9, 0xd3, 0x27, 0xb0, 0x82, 0x68, 0x10, + 0x90, 0x00, 0x68, 0x51, 0x91, 0x01, 0xa3, 0xa9, + 0x93, 0x13, 0xcb, 0x0c, 0xf0, 0x01, 0xfc, 0xfe, + 0x28, 0x00, 0xd0, 0x71, 0x98, 0x00, 0x99, 0x01, + 0xf7, 0xff, 0xf9, 0x1e, 0x07, 0x00, 0x0f, 0x00, + 0x6a, 0xb9, 0x5c, 0x09, 0x1c, 0x28, 0xaa, 0x03, + 0x54, 0x11, 0x22, 0x04, 0x98, 0x00, 0x99, 0x01, + 0x35, 0x01, 0xf7, 0xff, 0xf8, 0xfd, 0x90, 0x00, + 0x91, 0x01, 0x9b, 0x13, 0xcb, 0x0c, 0xf0, 0x01, + 0xfc, 0xe5, 0x28, 0x00, 0xd1, 0xe6, 0xe0, 0x57, + 0xe0, 0x65, 0xe0, 0x6a, 0x28, 0x00, 0xd0, 0x85, + 0x07, 0x02, 0x0f, 0x12, 0x6a, 0xb9, 0x5c, 0x8a, + 0x1c, 0x29, 0xab, 0x01, 0x54, 0x5a, 0x35, 0x01, + 0x09, 0x00, 0xd1, 0xf5, 0xe7, 0x7a, 0xe7, 0xff, + 0x28, 0x00, 0xd0, 0x09, 0x07, 0x41, 0x0f, 0x49, + 0x1d, 0xca, 0x32, 0x29, 0x1c, 0x29, 0xab, 0x01, + 0x54, 0x5a, 0x35, 0x01, 0x08, 0xc0, 0xd1, 0xf5, + 0x98, 0x00, 0x09, 0x00, 0xd3, 0xee, 0x68, 0xb8, + 0x38, 0x01, 0x60, 0xb8, 0xe7, 0x66, 0x99, 0x00, + 0x09, 0xc9, 0xd3, 0x33, 0xb0, 0x82, 0x68, 0x10, + 0x90, 0x00, 0x68, 0x51, 0x91, 0x01, 0xa3, 0x83, + 0x93, 0x11, 0xcb, 0x0c, 0xf0, 0x01, 0xfc, 0xb2, + 0x28, 0x00, 0xd0, 0x25, 0xa3, 0x81, 0x93, 0x10, + 0xa3, 0x82, 0x93, 0x0f, 0xa3, 0x7f, 0x93, 0x0e, + 0x98, 0x00, 0x99, 0x01, 0x9b, 0x10, 0xcb, 0x0c, + 0xf0, 0x01, 0xfc, 0xac, 0x1c, 0x19, 0x1c, 0x10, + 0x9b, 0x0f, 0xcb, 0x0c, 0xf0, 0x01, 0xfc, 0xe8, + 0xf7, 0xff, 0xf8, 0xc2, 0x1c, 0x29, 0xaa, 0x03, + 0x54, 0x50, 0x98, 0x00, 0x99, 0x01, 0x9b, 0x0e, + 0xcb, 0x0c, 0x35, 0x01, 0xf0, 0x01, 0xfc, 0x9a, + 0x90, 0x00, 0x91, 0x01, 0x9b, 0x11, 0xcb, 0x0c, + 0xf0, 0x01, 0xfc, 0x8c, 0x28, 0x00, 0xd1, 0xdf, + 0xb0, 0x02, 0xe7, 0x2f, 0x28, 0x00, 0xd0, 0xb1, + 0xf0, 0x01, 0xfc, 0xd2, 0x1d, 0xca, 0x32, 0x29, + 0x1c, 0x29, 0xab, 0x01, 0x54, 0x5a, 0x35, 0x01, + 0x28, 0x00, 0xd1, 0xf5, 0xe7, 0x22, 0x68, 0xb8, + 0x1b, 0x41, 0x91, 0x01, 0xd5, 0x01, 0x21, 0x00, + 0x91, 0x01, 0x68, 0x78, 0xf7, 0xff, 0xf9, 0x0a, + 0x99, 0x01, 0x19, 0x49, 0x18, 0x40, 0x99, 0x00, + 0x1a, 0x08, 0x90, 0x00, 0x23, 0xff, 0x33, 0x01, + 0x98, 0x02, 0x40, 0x18, 0x90, 0x0c, 0xd1, 0x1b, + 0x98, 0x02, 0x08, 0x40, 0xd2, 0x18, 0xb0, 0x81, + 0x98, 0x0d, 0x28, 0x00, 0xd0, 0x01, 0x20, 0x30, + 0xe0, 0x00, 0x20, 0x20, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x00, 0x98, 0x01, 0x38, 0x01, 0x90, 0x01, + 0xd4, 0x09, 0x98, 0x00, 0x6a, 0x3a, 0x1c, 0x21, + 0x36, 0x01, 0xf7, 0xff, 0xf8, 0x1d, 0x98, 0x01, + 0x38, 0x01, 0x90, 0x01, 0xd5, 0xf5, 0xb0, 0x01, + 0x68, 0x79, 0x78, 0x08, 0x31, 0x01, 0xb0, 0x81, + 0x91, 0x00, 0x28, 0x00, 0xd0, 0x0a, 0x6a, 0x3a, + 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0x0d, 0x99, 0x00, + 0x78, 0x08, 0x31, 0x01, 0x91, 0x00, 0x36, 0x01, + 0x28, 0x00, 0xd1, 0xf4, 0xb0, 0x01, 0x98, 0x02, + 0x07, 0xc0, 0x0f, 0xc0, 0x90, 0x0b, 0xd1, 0x18, + 0xb0, 0x81, 0x98, 0x0d, 0x28, 0x00, 0xd0, 0x01, + 0x20, 0x30, 0xe0, 0x00, 0x20, 0x20, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x00, 0x98, 0x01, 0x38, 0x01, + 0x90, 0x01, 0xd4, 0x09, 0x98, 0x00, 0x6a, 0x3a, + 0x1c, 0x21, 0x36, 0x01, 0xf7, 0xfe, 0xff, 0xec, + 0x98, 0x01, 0x38, 0x01, 0x90, 0x01, 0xd5, 0xf5, + 0xb0, 0x01, 0x98, 0x0d, 0x28, 0x00, 0xd0, 0x35, + 0x21, 0x00, 0xb0, 0x81, 0x91, 0x00, 0x2d, 0x00, + 0xdd, 0x2e, 0xa8, 0x04, 0x99, 0x00, 0x5c, 0x40, + 0x28, 0x3c, 0xd0, 0x10, 0x28, 0x3e, 0xd1, 0x1d, + 0x69, 0x38, 0x38, 0x01, 0x61, 0x38, 0xd4, 0x1e, + 0x20, 0x30, 0x6a, 0x3a, 0x1c, 0x21, 0x36, 0x01, + 0xf7, 0xfe, 0xff, 0xce, 0x69, 0x38, 0x38, 0x01, + 0x61, 0x38, 0xd5, 0xf5, 0xe0, 0x13, 0x68, 0xf8, + 0x38, 0x01, 0x60, 0xf8, 0xd4, 0x0f, 0x20, 0x30, + 0x6a, 0x3a, 0x1c, 0x21, 0x36, 0x01, 0xf7, 0xfe, + 0xff, 0xbf, 0x68, 0xf8, 0x38, 0x01, 0x60, 0xf8, + 0xd5, 0xf5, 0xe0, 0x04, 0x6a, 0x3a, 0x1c, 0x21, + 0xf7, 0xfe, 0xff, 0xb6, 0x36, 0x01, 0x99, 0x00, + 0x31, 0x01, 0x91, 0x00, 0x42, 0xa9, 0xdb, 0xd0, + 0xb0, 0x01, 0xe0, 0x1c, 0x99, 0x01, 0x1e, 0x48, + 0x90, 0x01, 0xd4, 0x09, 0x20, 0x30, 0x6a, 0x3a, + 0x1c, 0x21, 0x36, 0x01, 0xf7, 0xfe, 0xff, 0xa4, + 0x98, 0x01, 0x38, 0x01, 0x90, 0x01, 0xd5, 0xf5, + 0x19, 0x76, 0x1c, 0x28, 0x3d, 0x01, 0x28, 0x00, + 0xdd, 0x09, 0xa8, 0x03, 0x5d, 0x40, 0x6a, 0x3a, + 0x1c, 0x21, 0xf7, 0xfe, 0xff, 0x95, 0x1c, 0x28, + 0x3d, 0x01, 0x28, 0x00, 0xdc, 0xf5, 0x98, 0x0b, + 0x28, 0x00, 0xd0, 0x0a, 0x98, 0x00, 0x1e, 0x45, + 0xd4, 0x07, 0x20, 0x20, 0x6a, 0x3a, 0x1c, 0x21, + 0x36, 0x01, 0xf7, 0xfe, 0xff, 0x85, 0x3d, 0x01, + 0xd5, 0xf7, 0x1c, 0x30, 0xb0, 0x14, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x00, 0x00, 0xb5, 0xff, 0x20, 0x00, + 0xb0, 0x88, 0x90, 0x00, 0x99, 0x09, 0x78, 0x08, + 0x31, 0x01, 0x91, 0x09, 0x1c, 0x1c, 0x1c, 0x17, + 0x28, 0x00, 0xd0, 0x74, 0xa3, 0xf4, 0x93, 0x07, + 0x1d, 0xe2, 0x32, 0x0d, 0x92, 0x06, 0x1d, 0xe1, + 0x31, 0x29, 0x91, 0x05, 0x28, 0x25, 0xd0, 0x07, + 0x99, 0x08, 0x6a, 0x22, 0xf7, 0xfe, 0xff, 0x58, + 0x98, 0x00, 0x30, 0x01, 0x90, 0x00, 0xe2, 0xc4, + 0x25, 0x00, 0x23, 0x00, 0xb0, 0x82, 0x93, 0x00, + 0x20, 0x00, 0x60, 0xa0, 0x99, 0x0b, 0x78, 0x0e, + 0x31, 0x01, 0x91, 0x0b, 0x2e, 0x2b, 0xd0, 0x16, + 0xdc, 0x06, 0x2e, 0x20, 0xd0, 0x16, 0x2e, 0x23, + 0xd1, 0x17, 0x23, 0x08, 0x43, 0x1d, 0xe7, 0xf1, + 0x2e, 0x2d, 0xd0, 0x05, 0x2e, 0x30, 0xd1, 0x10, + 0x23, 0xff, 0x33, 0x01, 0x43, 0x1d, 0xe7, 0xe9, + 0x23, 0xff, 0x33, 0x01, 0x43, 0x9d, 0x1c, 0x28, + 0x25, 0x01, 0x43, 0x05, 0xe7, 0xe2, 0x23, 0x02, + 0x43, 0x1d, 0xe7, 0xdf, 0x23, 0x04, 0x43, 0x1d, + 0xe7, 0xdc, 0x20, 0x00, 0x2e, 0x2a, 0xd1, 0x11, + 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, + 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc0, + 0x28, 0x00, 0xda, 0x02, 0x42, 0x40, 0x23, 0x01, + 0x40, 0x5d, 0x99, 0x0b, 0x78, 0x0e, 0x31, 0x01, + 0x91, 0x0b, 0xe0, 0x0f, 0x49, 0xce, 0x5d, 0x8a, + 0x09, 0x92, 0xd3, 0x0b, 0x00, 0x83, 0x18, 0x18, + 0x00, 0x40, 0x19, 0x80, 0x9a, 0x0b, 0x78, 0x16, + 0x32, 0x01, 0x92, 0x0b, 0x5d, 0x8a, 0x38, 0x30, + 0x09, 0x92, 0xd2, 0xf3, 0x28, 0x00, 0xda, 0x00, + 0x20, 0x00, 0x90, 0x01, 0x2e, 0x2e, 0xd1, 0x2a, + 0x20, 0x00, 0x99, 0x0b, 0x78, 0x0e, 0x31, 0x01, + 0x91, 0x0b, 0x2e, 0x2a, 0xd1, 0x0e, 0x68, 0x38, + 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, + 0x60, 0x38, 0x38, 0x80, 0xe0, 0x00, 0xe2, 0x67, + 0x6f, 0xc0, 0x99, 0x0b, 0x78, 0x0e, 0x31, 0x01, + 0x91, 0x0b, 0xe0, 0x0f, 0x49, 0xb8, 0x5d, 0x8a, + 0x09, 0x92, 0xd3, 0x0b, 0x00, 0x83, 0x18, 0x18, + 0x00, 0x40, 0x19, 0x80, 0x9a, 0x0b, 0x78, 0x16, + 0x32, 0x01, 0x92, 0x0b, 0x5d, 0x8a, 0x38, 0x30, + 0x09, 0x92, 0xd2, 0xf3, 0x28, 0x00, 0xdb, 0x02, + 0x23, 0x10, 0x43, 0x1d, 0x60, 0xa0, 0x2e, 0x6c, + 0xd0, 0x01, 0x2e, 0x4c, 0xd1, 0x0d, 0x99, 0x0b, + 0x78, 0x0e, 0x31, 0x01, 0x91, 0x0b, 0x2e, 0x6c, + 0xd0, 0x01, 0x2e, 0x4c, 0xd1, 0x02, 0x23, 0x40, + 0x43, 0x1d, 0xe0, 0x06, 0x23, 0x20, 0x43, 0x1d, + 0xe0, 0x07, 0x2e, 0x68, 0xd1, 0x05, 0x23, 0x80, + 0x43, 0x1d, 0x99, 0x0b, 0x78, 0x0e, 0x31, 0x01, + 0x91, 0x0b, 0x2e, 0x67, 0xd0, 0x63, 0xdc, 0x12, + 0x2e, 0x63, 0xd0, 0x21, 0xdc, 0x08, 0x2e, 0x00, + 0xd0, 0x5e, 0x2e, 0x45, 0xd0, 0x5b, 0x2e, 0x47, + 0xd0, 0x59, 0x2e, 0x58, 0xd0, 0x59, 0xe0, 0x1f, + 0x2e, 0x64, 0xd0, 0x57, 0x2e, 0x65, 0xd0, 0x52, + 0x2e, 0x66, 0xd0, 0x50, 0xe0, 0x18, 0x2e, 0x70, + 0xd0, 0x55, 0xdc, 0x06, 0x2e, 0x69, 0xd0, 0x4d, + 0x2e, 0x6e, 0xd0, 0x51, 0x2e, 0x6f, 0xd0, 0x5c, + 0xe0, 0x0e, 0x2e, 0x73, 0xd0, 0x5a, 0x2e, 0x75, + 0xd0, 0x59, 0x2e, 0x78, 0xd0, 0x58, 0xe0, 0x07, + 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, + 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc6, + 0x98, 0x01, 0x38, 0x01, 0x90, 0x01, 0x07, 0xe8, + 0x0f, 0xc0, 0x90, 0x06, 0xd1, 0x16, 0x0a, 0x68, + 0xd3, 0x01, 0x20, 0x30, 0xe0, 0x00, 0x20, 0x20, + 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x01, 0x38, 0x01, + 0x90, 0x01, 0xd4, 0x0b, 0x98, 0x02, 0x30, 0x01, + 0x90, 0x02, 0x99, 0x0a, 0x6a, 0x22, 0x1c, 0x28, + 0xf7, 0xfe, 0xfe, 0x72, 0x98, 0x01, 0x38, 0x01, + 0x90, 0x01, 0xd5, 0xf3, 0x99, 0x0a, 0x6a, 0x22, + 0x1c, 0x30, 0xf7, 0xfe, 0xfe, 0x69, 0x98, 0x02, + 0x30, 0x01, 0x90, 0x02, 0x98, 0x06, 0x28, 0x00, + 0xd0, 0x52, 0x98, 0x01, 0x1e, 0x45, 0xd4, 0x58, + 0x98, 0x02, 0x30, 0x01, 0x90, 0x02, 0x20, 0x20, + 0x99, 0x0a, 0x6a, 0x22, 0xf7, 0xfe, 0xfe, 0x58, + 0x3d, 0x01, 0xd5, 0xf5, 0xe1, 0xc4, 0xe1, 0xa0, + 0xe0, 0x01, 0xe0, 0x8e, 0xe1, 0x53, 0x99, 0x0b, + 0x39, 0x01, 0x91, 0x0b, 0xe1, 0xbc, 0xe0, 0xed, + 0x0a, 0x28, 0xd3, 0x0e, 0x98, 0x02, 0x68, 0x39, + 0x31, 0x03, 0x08, 0x89, 0x00, 0x89, 0x31, 0x04, + 0x60, 0x39, 0x39, 0x80, 0x6f, 0xc9, 0x80, 0x08, + 0xe1, 0xae, 0xe0, 0xf5, 0xe0, 0x1d, 0xe1, 0x1b, + 0xe0, 0xa0, 0x09, 0xe8, 0xd3, 0x0c, 0x98, 0x02, + 0x68, 0x39, 0x31, 0x03, 0x08, 0x89, 0x00, 0x89, + 0x31, 0x04, 0x60, 0x39, 0x39, 0x80, 0x6f, 0xcd, + 0xf0, 0x01, 0xfa, 0xda, 0xc5, 0x03, 0xe1, 0x9b, + 0x20, 0x20, 0x40, 0x28, 0x99, 0x02, 0x68, 0x38, + 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, + 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc0, 0x60, 0x01, + 0xe1, 0x8e, 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, + 0x00, 0x80, 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, + 0x6f, 0xc0, 0xb0, 0x81, 0x90, 0x00, 0x09, 0x68, + 0xd3, 0x0c, 0x26, 0x00, 0x68, 0xa0, 0xe0, 0x01, + 0xe1, 0x7e, 0x36, 0x01, 0x42, 0x86, 0xda, 0x09, + 0x99, 0x00, 0x5d, 0x89, 0x29, 0x00, 0xd1, 0xf8, + 0xe0, 0x04, 0xe1, 0x75, 0x98, 0x00, 0xf7, 0xfe, + 0xfe, 0xcd, 0x1c, 0x06, 0x98, 0x02, 0x1b, 0x80, + 0x90, 0x02, 0x07, 0xe8, 0x0f, 0xc0, 0x90, 0x06, + 0xd1, 0x16, 0x0a, 0x68, 0xd3, 0x01, 0x20, 0x30, + 0xe0, 0x00, 0x20, 0x20, 0x06, 0x05, 0x0e, 0x2d, + 0x98, 0x02, 0x38, 0x01, 0x90, 0x02, 0xd4, 0x0b, + 0x98, 0x03, 0x30, 0x01, 0x90, 0x03, 0x99, 0x0b, + 0x6a, 0x22, 0x1c, 0x28, 0xf7, 0xfe, 0xfd, 0xe8, + 0x98, 0x02, 0x38, 0x01, 0x90, 0x02, 0xd5, 0xf3, + 0x25, 0x00, 0x2e, 0x00, 0xdd, 0x08, 0x99, 0x00, + 0x5d, 0x48, 0x99, 0x0b, 0x6a, 0x22, 0xf7, 0xfe, + 0xfd, 0xdb, 0x35, 0x01, 0x42, 0xb5, 0xdb, 0xf6, + 0x98, 0x03, 0x19, 0x80, 0x90, 0x03, 0x98, 0x06, + 0x28, 0x00, 0xd0, 0x0c, 0x98, 0x02, 0x1e, 0x45, + 0xd4, 0x09, 0x98, 0x03, 0x30, 0x01, 0x90, 0x03, + 0x20, 0x20, 0x99, 0x0b, 0x6a, 0x22, 0xf7, 0xfe, + 0xfd, 0xc7, 0x3d, 0x01, 0xd5, 0xf5, 0xb0, 0x01, + 0xe1, 0x32, 0x09, 0xe8, 0xd3, 0x0c, 0x68, 0x38, + 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x08, + 0x1f, 0xc1, 0x39, 0x01, 0x60, 0x38, 0x22, 0x08, + 0x98, 0x07, 0xf7, 0xfe, 0xfe, 0x0f, 0xe0, 0x08, + 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, + 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc3, + 0x93, 0x00, 0x0a, 0x28, 0xd3, 0x03, 0x9b, 0x00, + 0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x00, 0xa0, 0x17, + 0x62, 0xa0, 0x09, 0x28, 0xd3, 0x01, 0xa0, 0x1a, + 0xe0, 0x00, 0xa0, 0x18, 0x60, 0x60, 0x09, 0x68, + 0xd3, 0x61, 0xe0, 0xe3, 0x09, 0xe8, 0xd3, 0x0c, + 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, + 0x30, 0x08, 0x1f, 0xc1, 0x39, 0x01, 0x60, 0x38, + 0x22, 0x08, 0x98, 0x07, 0xf7, 0xfe, 0xfd, 0xe6, + 0xe0, 0x08, 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, + 0x00, 0x80, 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, + 0x6f, 0xc3, 0x93, 0x00, 0x0a, 0x28, 0xd3, 0x16, + 0x9b, 0x00, 0x04, 0x1b, 0x0c, 0x1b, 0xe0, 0x11, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x22, 0x44, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x58, 0x00, 0x00, 0x93, 0x00, 0xa0, 0x78, + 0x62, 0xa0, 0x09, 0x28, 0xd3, 0x01, 0xa0, 0x7b, + 0xe0, 0x00, 0xa0, 0x79, 0x60, 0x60, 0x09, 0x68, + 0xd3, 0x25, 0xe0, 0xa7, 0x68, 0x38, 0x30, 0x03, + 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, 0x60, 0x38, + 0x38, 0x80, 0x6f, 0xc3, 0x93, 0x00, 0xa0, 0x6e, + 0x62, 0xa0, 0x09, 0x28, 0xd3, 0x01, 0xa0, 0x72, + 0xe0, 0x00, 0xa0, 0x6f, 0x60, 0x60, 0x20, 0x08, + 0x23, 0x10, 0x43, 0x1d, 0x60, 0xa0, 0xe0, 0x7e, + 0x09, 0xe8, 0xd3, 0x0d, 0x68, 0x38, 0x30, 0x03, + 0x08, 0x80, 0x00, 0x80, 0x30, 0x08, 0x1f, 0xc1, + 0x39, 0x01, 0x60, 0x38, 0x22, 0x08, 0x98, 0x07, + 0xf7, 0xfe, 0xfd, 0x94, 0xe0, 0x09, 0xe0, 0x9b, + 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, + 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc3, + 0x93, 0x00, 0x0a, 0x28, 0xd3, 0x03, 0x9b, 0x00, + 0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x00, 0x09, 0x28, + 0xd3, 0x01, 0xa0, 0x5e, 0xe0, 0x00, 0xa0, 0x5a, + 0x60, 0x60, 0x09, 0x68, 0xd3, 0x57, 0xe0, 0x69, + 0x09, 0xe8, 0xd3, 0x0c, 0x68, 0x38, 0x30, 0x03, + 0x08, 0x80, 0x00, 0x80, 0x30, 0x08, 0x1f, 0xc1, + 0x39, 0x01, 0x60, 0x38, 0x22, 0x08, 0x98, 0x07, + 0xf7, 0xfe, 0xfd, 0x6c, 0xe0, 0x08, 0x68, 0x38, + 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, + 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc3, 0x93, 0x00, + 0x0a, 0x28, 0xd3, 0x03, 0x9b, 0x00, 0x04, 0x1b, + 0x0c, 0x1b, 0x93, 0x00, 0xa0, 0x48, 0x60, 0x60, + 0x09, 0x68, 0xd3, 0x34, 0xe0, 0x46, 0x09, 0xe8, + 0xd3, 0x21, 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, + 0x00, 0x80, 0x30, 0x08, 0x1f, 0xc1, 0x39, 0x01, + 0x60, 0x38, 0x22, 0x08, 0x98, 0x07, 0xf7, 0xfe, + 0xfd, 0x49, 0x99, 0x07, 0x9b, 0x09, 0x68, 0x08, + 0x90, 0x04, 0x68, 0x49, 0x91, 0x03, 0xcb, 0x0c, + 0xf0, 0x01, 0xf9, 0x94, 0x28, 0x00, 0xd0, 0x08, + 0x98, 0x04, 0x99, 0x03, 0xf0, 0x01, 0xf9, 0x98, + 0x9a, 0x07, 0xc2, 0x03, 0x20, 0x00, 0x43, 0xc0, + 0xe0, 0x14, 0x20, 0x00, 0xe0, 0x12, 0x68, 0x38, + 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, + 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc0, 0x0a, 0x29, + 0xd3, 0x01, 0x04, 0x00, 0x14, 0x00, 0x28, 0x00, + 0xda, 0x02, 0x42, 0x43, 0xe0, 0x01, 0xe0, 0x2b, + 0x1c, 0x03, 0x93, 0x00, 0x28, 0x00, 0xda, 0x01, + 0xa0, 0x2d, 0xe0, 0x08, 0x08, 0xa8, 0xd3, 0x01, + 0xa0, 0x2c, 0xe0, 0x04, 0x08, 0xe8, 0xd3, 0x01, + 0xa0, 0x2b, 0xe0, 0x00, 0xa0, 0x24, 0x60, 0x60, + 0x09, 0x68, 0xd3, 0x19, 0x4b, 0x29, 0x40, 0x1d, + 0xe0, 0x16, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x1d, + 0x09, 0x68, 0xd2, 0x01, 0x20, 0x06, 0x60, 0xa0, + 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, + 0x30, 0x08, 0x1f, 0xc1, 0x39, 0x01, 0x60, 0x38, + 0x22, 0x08, 0x98, 0x08, 0xf7, 0xfe, 0xfc, 0xfa, + 0x20, 0x00, 0x23, 0x00, 0x60, 0x60, 0x93, 0x00, + 0x98, 0x01, 0x62, 0xe0, 0x60, 0x25, 0x98, 0x0a, + 0x9b, 0x00, 0x1c, 0x31, 0x1c, 0x22, 0xf7, 0xff, + 0xfb, 0x3f, 0x99, 0x02, 0x18, 0x40, 0x90, 0x02, + 0xb0, 0x02, 0x99, 0x09, 0x78, 0x08, 0x31, 0x01, + 0x91, 0x09, 0x28, 0x00, 0xd0, 0x00, 0xe5, 0x29, + 0x98, 0x08, 0x6a, 0x61, 0xf7, 0xfe, 0xfc, 0x82, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0x43, 0xc0, + 0xe0, 0x00, 0x98, 0x00, 0xb0, 0x08, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x2d, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xff, + 0xe3, 0x10, 0x06, 0x01, 0x13, 0xa0, 0x00, 0x00, + 0x11, 0x2f, 0xff, 0x1e, 0xea, 0x00, 0x00, 0x0a, + 0xe3, 0x12, 0x07, 0x02, 0x0a, 0x00, 0x00, 0x08, + 0xe1, 0x5c, 0x00, 0x80, 0x83, 0xa0, 0x00, 0x00, + 0x81, 0x2f, 0xff, 0x1e, 0x03, 0x51, 0x00, 0x00, + 0x03, 0xa0, 0x00, 0x00, 0x01, 0x2f, 0xff, 0x1e, + 0xe3, 0x10, 0x07, 0x02, 0x13, 0xa0, 0x00, 0x00, + 0x11, 0x2f, 0xff, 0x1e, 0xe3, 0xa0, 0x35, 0x06, + 0xea, 0x00, 0x07, 0x2e, 0xe1, 0x2f, 0xff, 0x1f, + 0xea, 0x00, 0x00, 0x3e, 0xe5, 0x9f, 0x04, 0x5c, + 0xe3, 0x50, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x02, + 0xe3, 0xa0, 0x00, 0x20, 0xe3, 0xa0, 0x10, 0x01, + 0xef, 0x12, 0x34, 0x56, 0xe5, 0x9f, 0x04, 0x48, + 0xe3, 0x50, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x05, + 0xe5, 0x90, 0x10, 0x00, 0xe5, 0x9f, 0x04, 0x3c, + 0xe5, 0x90, 0x30, 0x00, 0xe5, 0x9f, 0x04, 0x38, + 0xe5, 0x90, 0xd0, 0x00, 0xea, 0x00, 0x00, 0x0b, + 0xe3, 0xa0, 0x00, 0x16, 0xe5, 0x9f, 0x44, 0x18, + 0xe2, 0x84, 0x20, 0xa8, 0xe2, 0x84, 0x10, 0xa4, + 0xe5, 0x81, 0x20, 0x00, 0xef, 0x12, 0x34, 0x56, + 0xe2, 0x84, 0x00, 0xa8, 0xe5, 0x90, 0xd0, 0x08, + 0xe5, 0x90, 0x30, 0x04, 0xe5, 0x90, 0x10, 0x00, + 0xe3, 0x51, 0x00, 0x00, 0x05, 0x9f, 0x14, 0x04, + 0xe2, 0x8f, 0x00, 0x10, 0xeb, 0x00, 0x00, 0x36, + 0xe5, 0x9f, 0x03, 0xfc, 0xe5, 0x9f, 0x33, 0xfc, + 0xeb, 0x00, 0x00, 0x12, 0xea, 0x00, 0x00, 0x4e, + 0x2e, 0x00, 0x04, 0x04, 0x2e, 0x03, 0xa9, 0xd0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe9, 0x2d, 0x40, 0x00, 0xe3, 0x1c, 0x00, 0x01, + 0x1a, 0x00, 0x00, 0x03, 0xe1, 0xa0, 0xe0, 0x0f, + 0xe1, 0x2f, 0xff, 0x1c, 0xe8, 0xbd, 0x40, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x8f, 0xe0, 0x01, + 0xe1, 0x2f, 0xff, 0x1c, 0x47, 0x78, 0x00, 0x00, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x1c, 0x02, 0x1c, 0x13, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x40, 0x00, 0xe3, 0x13, 0x00, 0x01, + 0x1a, 0x00, 0x00, 0x03, 0xe1, 0xa0, 0xe0, 0x0f, + 0xe1, 0x2f, 0xff, 0x13, 0xe8, 0xbd, 0x40, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x8f, 0xe0, 0x01, + 0xe1, 0x2f, 0xff, 0x13, 0x47, 0x78, 0x00, 0x00, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe5, 0x9f, 0xc0, 0x44, 0xe8, 0x8c, 0xff, 0xff, + 0xe2, 0x8f, 0x00, 0x00, 0xea, 0x00, 0x0e, 0xf4, + 0x00, 0x80, 0x0e, 0x09, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x63, 0x61, + 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x72, + 0x75, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x20, + 0x54, 0x68, 0x75, 0x6d, 0x62, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x00, 0x00, 0x2e, 0x08, 0x21, 0xd0, + 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0x73, 0x08, + 0xe5, 0x87, 0x00, 0x00, 0xe2, 0x8f, 0x50, 0xc9, + 0xe2, 0x85, 0x5c, 0x02, 0xe5, 0x87, 0x50, 0x10, + 0xe2, 0x8f, 0x50, 0xe9, 0xe2, 0x85, 0x5c, 0x02, + 0xe5, 0x87, 0x50, 0x14, 0xe1, 0xa0, 0x80, 0x0e, + 0xe2, 0x87, 0x00, 0x04, 0xeb, 0x00, 0x04, 0x1d, + 0xe9, 0x2d, 0x01, 0x00, 0xe3, 0xa0, 0x00, 0x00, + 0xe5, 0xc7, 0x00, 0x2c, 0xe2, 0x87, 0x00, 0x04, + 0xeb, 0x00, 0x00, 0xce, 0xe3, 0xa0, 0x40, 0x00, + 0xe2, 0x8d, 0x00, 0x04, 0xe5, 0x97, 0x10, 0x00, + 0xe3, 0xa0, 0x30, 0x00, 0xe5, 0xc7, 0x30, 0x2e, + 0xe2, 0x81, 0x30, 0x08, 0xe8, 0x91, 0x00, 0x06, + 0xe5, 0x9f, 0xc2, 0xcc, 0xeb, 0xff, 0xff, 0xb7, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x80, 0x01, + 0xea, 0x00, 0x00, 0x01, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xa0, 0x70, 0x00, + 0xeb, 0x00, 0x04, 0x15, 0xe1, 0xa0, 0x00, 0x08, + 0xeb, 0x00, 0x00, 0x0d, 0xe1, 0xa0, 0x20, 0x07, + 0xe3, 0x52, 0x00, 0x00, 0x12, 0x8f, 0x00, 0x08, + 0x15, 0x9f, 0x10, 0x00, 0xeb, 0x00, 0x0e, 0xb5, + 0x41, 0x42, 0x45, 0x58, 0x00, 0x80, 0x0e, 0x06, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x6f, 0x64, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x20, + 0x6c, 0x61, 0x72, 0x67, 0x65, 0x00, 0x00, 0x00, + 0xe3, 0xa0, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, + 0xe5, 0x9f, 0x32, 0x60, 0xeb, 0xff, 0xff, 0xa9, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc2, 0x28, + 0xe5, 0xdc, 0x00, 0x2c, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x30, 0x00, 0xe5, 0x9f, 0x12, 0x14, + 0xe4, 0x81, 0xf0, 0x04, 0xe8, 0xb3, 0x00, 0x04, + 0xe8, 0xa1, 0x00, 0x04, 0xe4, 0xd3, 0x20, 0x01, + 0xe4, 0xc1, 0x20, 0x01, 0xe3, 0x52, 0x00, 0x00, + 0x1a, 0xff, 0xff, 0xfb, 0xe1, 0xa0, 0xf0, 0x0e, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0xa0, 0x80, 0x01, + 0xeb, 0xff, 0xff, 0xf2, 0xe5, 0x9f, 0x71, 0xe8, + 0xe5, 0xd7, 0x20, 0x2f, 0xe3, 0x52, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x2c, 0xe3, 0xa0, 0x20, 0x01, + 0xe5, 0xc7, 0x20, 0x2f, 0xeb, 0x00, 0x00, 0x3b, + 0xe1, 0xa0, 0x10, 0x08, 0xeb, 0x00, 0x03, 0xde, + 0xe3, 0x50, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x1b, + 0xe2, 0x88, 0xb0, 0x40, 0xe9, 0x3b, 0x01, 0xef, + 0xe9, 0x2c, 0x01, 0xef, 0xe9, 0x3b, 0x01, 0xef, + 0xe9, 0x2c, 0x01, 0xef, 0xe5, 0x9f, 0x71, 0xa8, + 0xe5, 0x97, 0x40, 0xa0, 0xe3, 0x84, 0x40, 0x80, + 0xe1, 0x21, 0xf0, 0x04, 0xe1, 0xa0, 0xd0, 0x0c, + 0xe1, 0xa0, 0xb0, 0x04, 0xe5, 0x9f, 0x01, 0x8c, + 0xe5, 0x90, 0x00, 0x04, 0xe1, 0xa0, 0x10, 0x0d, + 0xeb, 0x00, 0x03, 0xfe, 0xe3, 0xa0, 0x10, 0x00, + 0xe5, 0xc7, 0x10, 0x2f, 0xe1, 0xa0, 0x10, 0x0d, + 0xe3, 0x54, 0x00, 0x10, 0x1a, 0x00, 0x00, 0x02, + 0xe3, 0xa0, 0x00, 0x17, 0xef, 0x12, 0x34, 0x56, + 0xe3, 0x21, 0xf0, 0x93, 0xe1, 0xa0, 0x00, 0x00, + 0xe2, 0x81, 0xe0, 0x3c, 0xe9, 0x5e, 0x7f, 0xff, + 0xe1, 0xa0, 0x00, 0x00, 0xe8, 0xde, 0x80, 0x00, + 0xe2, 0x8f, 0x00, 0x00, 0xea, 0x00, 0x0e, 0x72, + 0x00, 0x80, 0x0e, 0x07, 0x4e, 0x6f, 0x20, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x54, 0x72, 0x61, 0x70, 0x20, 0x48, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00, 0x00, 0x00, + 0xe2, 0x8f, 0x00, 0x00, 0xea, 0x00, 0x0e, 0x68, + 0x00, 0x80, 0x0e, 0x00, 0x52, 0x65, 0x63, 0x75, + 0x72, 0x73, 0x69, 0x76, 0x65, 0x20, 0x54, 0x72, + 0x61, 0x70, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe5, 0x9f, 0xc1, 0x04, 0xe3, 0xa0, 0x00, 0x00, + 0xe5, 0xcc, 0x00, 0x2f, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0x00, 0xf0, + 0xe5, 0x90, 0x00, 0x00, 0xe5, 0x90, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe5, 0x9f, 0x00, 0xdc, 0xe2, 0x80, 0x00, 0x04, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe5, 0x9f, 0xc0, 0xcc, 0xe3, 0x50, 0x0b, 0x02, + 0x33, 0xa0, 0x0b, 0x02, 0xe2, 0x8c, 0xc0, 0x04, + 0xe9, 0x9c, 0x00, 0x0c, 0xe0, 0x53, 0x31, 0x00, + 0x21, 0x53, 0x00, 0x02, 0x3a, 0x00, 0x00, 0x03, + 0xe5, 0x81, 0x20, 0x00, 0xe0, 0x82, 0x21, 0x00, + 0xe5, 0x8c, 0x20, 0x04, 0xe1, 0x2f, 0xff, 0x1e, + 0xe9, 0x2d, 0x50, 0x03, 0xe1, 0xa0, 0x10, 0x0c, + 0xeb, 0x00, 0x00, 0x44, 0xe3, 0x50, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x0d, 0xe5, 0x9d, 0xc0, 0x08, + 0xe9, 0x9c, 0x40, 0x04, 0xe1, 0x5e, 0x00, 0x01, + 0x10, 0x4e, 0x30, 0x02, 0xe0, 0x81, 0xe0, 0x00, + 0x11, 0xa0, 0x00, 0x02, 0x11, 0xa0, 0x20, 0x01, + 0xe9, 0x8c, 0x40, 0x04, 0x13, 0x53, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x03, 0xe8, 0xbd, 0x50, 0x03, + 0xe5, 0x81, 0x00, 0x00, 0xe1, 0xa0, 0x01, 0x43, + 0xe1, 0x2f, 0xff, 0x1e, 0xe8, 0xbd, 0x50, 0x03, + 0xe9, 0x9c, 0x00, 0x0c, 0xe0, 0x43, 0x00, 0x02, + 0xe1, 0xb0, 0x01, 0x40, 0x03, 0xa0, 0x20, 0x00, + 0x15, 0x8c, 0x30, 0x04, 0xe5, 0x81, 0x20, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe2, 0x80, 0x20, 0x03, 0xe3, 0xc2, 0x20, 0x03, + 0xe5, 0x9f, 0xc0, 0x24, 0xe2, 0x8c, 0xc0, 0x08, + 0xe8, 0x9c, 0x00, 0x03, 0xe0, 0x90, 0x20, 0x02, + 0x31, 0x52, 0x00, 0x01, 0x35, 0x8c, 0x20, 0x00, + 0x23, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x2e, 0x08, 0x21, 0x4c, 0x2e, 0x08, 0x21, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x02, 0xcc, 0x18, + 0x2e, 0x02, 0xcc, 0x14, 0x2e, 0x02, 0xcc, 0x10, + 0x2e, 0x08, 0xd7, 0x68, 0x2e, 0x00, 0x1a, 0xf9, + 0x2e, 0x02, 0x0e, 0x19, 0x2e, 0x02, 0x0c, 0xcd, + 0x2e, 0x02, 0x0d, 0x8d, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0x00, 0x04, 0xe5, 0x90, 0x00, 0x00, + 0xe2, 0x00, 0x04, 0xff, 0xe3, 0x50, 0x04, 0xea, + 0x03, 0xa0, 0x00, 0x01, 0x13, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe2, 0x40, 0x0b, 0x05, 0xe3, 0x50, 0x0b, 0x1b, + 0x33, 0xa0, 0x00, 0x01, 0x23, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe2, 0x8f, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x55, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x54, + 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x5a, + 0x65, 0x72, 0x6f, 0x00, 0x00, 0x02, 0x00, 0x01, + 0x55, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x02, 0x55, 0x6e, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x53, 0x57, + 0x49, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x03, 0x50, 0x72, 0x65, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x20, 0x41, 0x62, 0x6f, + 0x72, 0x74, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x41, 0x62, 0x6f, + 0x72, 0x74, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, + 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, + 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x64, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, + 0x75, 0x70, 0x74, 0x00, 0x00, 0x02, 0x00, 0x07, + 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x64, 0x20, 0x46, 0x61, 0x73, 0x74, 0x20, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xfe, 0x80, + 0x2e, 0x01, 0xfe, 0x98, 0x2e, 0x01, 0xfe, 0xb4, + 0x2e, 0x01, 0xfe, 0xd4, 0x2e, 0x01, 0xfe, 0xe8, + 0x2e, 0x01, 0xfe, 0xf8, 0x2e, 0x01, 0xff, 0x10, + 0x2e, 0x01, 0xff, 0x28, 0xe2, 0x4f, 0x20, 0x28, + 0xe7, 0x92, 0x01, 0x00, 0xea, 0xff, 0xff, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x17, 0xc3, 0x40, 0x58, 0x1a, 0xc0, 0x1c, 0x01, + 0x08, 0x40, 0x08, 0x42, 0x18, 0x80, 0x09, 0x02, + 0x18, 0x80, 0x0a, 0x02, 0x18, 0x80, 0x0c, 0x02, + 0x18, 0x80, 0x08, 0xc0, 0x00, 0x82, 0x18, 0x12, + 0x00, 0x52, 0x1a, 0x89, 0x29, 0x0a, 0xdb, 0x01, + 0x1c, 0x40, 0x39, 0x0a, 0x40, 0x58, 0x1a, 0xc0, + 0x40, 0x59, 0x1a, 0xc9, 0x47, 0x70, 0x00, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0x30, 0x00, 0x02, + 0x01, 0x31, 0x00, 0x03, 0x0a, 0x00, 0x00, 0x05, + 0xe1, 0x80, 0xc0, 0x02, 0xe3, 0x3c, 0x01, 0x02, + 0x01, 0x91, 0xc0, 0x03, 0x03, 0xa0, 0x00, 0x01, + 0x13, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0xa0, 0xc4, 0xff, 0xe3, 0x8c, 0xc6, 0x0e, + 0xe1, 0x5c, 0x00, 0x80, 0x83, 0xa0, 0x00, 0x01, + 0x81, 0x2f, 0xff, 0x1e, 0x03, 0x51, 0x00, 0x00, + 0x03, 0xa0, 0x00, 0x01, 0x13, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xb5, 0x04, 0xf0, 0x00, + 0xf8, 0x04, 0xbc, 0x08, 0x60, 0x1a, 0xbc, 0x08, + 0x47, 0x18, 0x47, 0x78, 0xe1, 0xb0, 0x00, 0x80, + 0x03, 0x31, 0x00, 0x00, 0x01, 0xa0, 0x00, 0x60, + 0x03, 0xa0, 0x20, 0x00, 0x01, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x2a, 0xa0, 0xe1, 0xc0, 0x0a, 0x82, + 0xe1, 0xa0, 0x00, 0x60, 0xe3, 0x32, 0x00, 0x00, + 0xe2, 0x42, 0x2c, 0x03, 0xe2, 0x42, 0x20, 0xfe, + 0x0a, 0x00, 0x00, 0x06, 0xe3, 0x80, 0x04, 0x3f, + 0xe3, 0x80, 0x06, 0x0e, 0xe2, 0x22, 0x3b, 0x01, + 0xe3, 0x33, 0x00, 0x01, 0x11, 0x2f, 0xff, 0x1e, + 0xe3, 0xa0, 0x10, 0x01, 0xea, 0x00, 0x04, 0x70, + 0xe2, 0x00, 0xc1, 0x02, 0xe1, 0xa0, 0x06, 0x00, + 0xe2, 0x42, 0x20, 0x01, 0xe1, 0xb0, 0x00, 0x80, + 0x4a, 0x00, 0x00, 0x02, 0xe1, 0xb0, 0x10, 0x81, + 0x23, 0x80, 0x0a, 0x01, 0xea, 0xff, 0xff, 0xf9, + 0xe1, 0xa0, 0x04, 0xc0, 0xe3, 0xc0, 0x05, 0x01, + 0xe1, 0x8c, 0x01, 0x20, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, + 0xe2, 0x00, 0xc1, 0x02, 0xe1, 0xb0, 0x30, 0x80, + 0xe1, 0xb0, 0x3a, 0xa3, 0x0a, 0x00, 0x00, 0x0b, + 0xe2, 0x83, 0xe0, 0x01, 0xe3, 0x5e, 0x0b, 0x02, + 0xaa, 0x00, 0x00, 0x39, 0xe0, 0x93, 0x30, 0x02, + 0xda, 0x00, 0x00, 0x11, 0xe2, 0x83, 0xe0, 0x01, + 0xe3, 0x5e, 0x0b, 0x02, 0xaa, 0x00, 0x00, 0x37, + 0xe1, 0x83, 0x06, 0x00, 0xe1, 0x8c, 0x06, 0x60, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0x91, 0x30, 0x80, 0x01, 0xa0, 0x00, 0x0c, + 0x08, 0xbd, 0x40, 0x00, 0x01, 0x2f, 0xff, 0x1e, + 0xe1, 0xb0, 0x10, 0x81, 0xe0, 0xa0, 0x00, 0x00, + 0xe2, 0x42, 0x20, 0x01, 0xe3, 0x10, 0x06, 0x01, + 0x0a, 0xff, 0xff, 0xfa, 0xe3, 0xa0, 0x30, 0x01, + 0xea, 0xff, 0xff, 0xeb, 0xe1, 0xa0, 0x05, 0x80, + 0xe3, 0x80, 0x01, 0x02, 0xe3, 0x73, 0x00, 0x14, + 0xca, 0x00, 0x00, 0x05, 0xe3, 0x73, 0x00, 0x34, + 0xaa, 0x00, 0x00, 0x0d, 0xe1, 0xa0, 0x00, 0x0c, + 0xe3, 0xa0, 0x10, 0x00, 0xe8, 0xbd, 0x40, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x05, 0xa0, + 0xe2, 0x63, 0x30, 0x01, 0xe2, 0x63, 0x20, 0x20, + 0xe1, 0xa0, 0xe2, 0x11, 0xe1, 0xb0, 0xe0, 0x8e, + 0xe1, 0xa0, 0xe2, 0x10, 0xe1, 0x8e, 0x13, 0x31, + 0xe1, 0xa0, 0x03, 0x30, 0xe1, 0x80, 0x00, 0x0c, + 0xea, 0x00, 0x00, 0x0a, 0xe2, 0x93, 0x30, 0x20, + 0xda, 0x00, 0x00, 0x03, 0xe1, 0x80, 0x0a, 0xa1, + 0xe1, 0xb0, 0xe3, 0x11, 0xe2, 0x63, 0x30, 0x0c, + 0xea, 0x00, 0x00, 0x02, 0xe2, 0x83, 0x30, 0x15, + 0xe1, 0x91, 0xe3, 0x10, 0xe2, 0x63, 0x30, 0x21, + 0xe1, 0xa0, 0x13, 0x30, 0xe1, 0xa0, 0x00, 0x0c, + 0x03, 0x11, 0x00, 0x01, 0x98, 0xbd, 0x40, 0x00, + 0x91, 0x2f, 0xff, 0x1e, 0xe2, 0x91, 0x10, 0x01, + 0x22, 0x80, 0x00, 0x01, 0xe8, 0xbd, 0x40, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe8, 0xbd, 0x40, 0x00, + 0xe3, 0xa0, 0x10, 0x01, 0xea, 0x00, 0x04, 0x1e, + 0xe8, 0xbd, 0x40, 0x00, 0xe3, 0xa0, 0x10, 0x01, + 0xea, 0x00, 0x04, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, + 0xe1, 0xa0, 0x35, 0x0c, 0xe1, 0xa0, 0x0a, 0x2c, + 0xe1, 0xa0, 0x25, 0x81, 0xe1, 0x83, 0x1a, 0xa1, + 0x12, 0x80, 0x0b, 0x1e, 0xe1, 0xa0, 0x00, 0x60, + 0x13, 0x81, 0x11, 0x02, 0xe1, 0xb0, 0xca, 0xcc, + 0x0a, 0x00, 0x00, 0x02, 0xe3, 0x7c, 0x00, 0x01, + 0x03, 0x80, 0x01, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0x11, 0x01, 0x02, 0x01, 0x2f, 0xff, 0x1e, + 0xe3, 0xd1, 0x11, 0x02, 0x0a, 0x00, 0x00, 0x15, + 0xe1, 0xb0, 0x38, 0x21, 0x01, 0xa0, 0x18, 0x01, + 0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, + 0xe1, 0xb0, 0x3c, 0x21, 0x01, 0xa0, 0x14, 0x01, + 0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x3e, 0x21, + 0x01, 0xa0, 0x12, 0x01, 0x02, 0x8c, 0xc0, 0x04, + 0xe1, 0xb0, 0x3f, 0x21, 0x01, 0xa0, 0x11, 0x01, + 0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x3f, 0xa1, + 0x01, 0xa0, 0x10, 0x81, 0x02, 0x8c, 0xc0, 0x01, + 0xe2, 0x6c, 0x30, 0x20, 0xe1, 0x81, 0x13, 0x32, + 0xe1, 0xa0, 0x2c, 0x12, 0xe0, 0x40, 0x00, 0x0c, + 0xe2, 0x80, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xb0, 0x38, 0x22, 0x01, 0xa0, 0x28, 0x02, + 0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, + 0xe1, 0xb0, 0x3c, 0x22, 0x01, 0xa0, 0x24, 0x02, + 0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x3e, 0x22, + 0x01, 0xa0, 0x22, 0x02, 0x02, 0x8c, 0xc0, 0x04, + 0xe1, 0xb0, 0x3f, 0x22, 0x01, 0xa0, 0x21, 0x02, + 0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x3f, 0xa2, + 0x01, 0xa0, 0x20, 0x82, 0x02, 0x8c, 0xc0, 0x01, + 0xe1, 0xa0, 0x10, 0x02, 0xe3, 0xa0, 0x20, 0x00, + 0xe2, 0x40, 0x00, 0x1f, 0xe0, 0x40, 0x00, 0x0c, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x4b, 0xf0, 0xe8, 0x93, 0x00, 0x38, + 0xe3, 0x10, 0x01, 0x01, 0x03, 0x13, 0x01, 0x01, + 0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x03, 0xe5, + 0xeb, 0x00, 0x05, 0x39, 0xe8, 0xbd, 0x4b, 0xf0, + 0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14, + 0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x04, 0x7f, + 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, + 0xe1, 0xa0, 0x30, 0x00, 0xe1, 0xa0, 0x40, 0x01, + 0xe1, 0xa0, 0x50, 0x02, 0xe3, 0x10, 0x01, 0x01, + 0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x03, 0xd7, + 0xeb, 0x00, 0x05, 0x2b, 0xe8, 0xbd, 0x4b, 0xf0, + 0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14, + 0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x04, 0x71, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0xa0, 0x38, 0x80, + 0xe1, 0xa0, 0x38, 0xa3, 0xe1, 0xc0, 0x00, 0x03, + 0xe1, 0xd1, 0xc0, 0x80, 0x5a, 0x00, 0x00, 0x0c, + 0xe2, 0x53, 0x3b, 0x0f, 0x4a, 0x00, 0x00, 0x13, + 0x12, 0x83, 0xc0, 0x01, 0x13, 0x5c, 0x0b, 0x02, + 0xaa, 0x00, 0x00, 0x0d, 0xe1, 0xb0, 0xc5, 0xa2, + 0x2a, 0x00, 0x00, 0x58, 0xe1, 0x80, 0x0a, 0x03, + 0xe3, 0xc1, 0x11, 0x02, 0xe1, 0x80, 0x05, 0xa1, + 0xe1, 0x8c, 0x1a, 0x81, 0xe3, 0xa0, 0x30, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x10, 0x01, 0x01, + 0x1a, 0x00, 0x00, 0x40, 0xe2, 0x00, 0x01, 0x02, + 0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x30, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x33, 0x00, 0x00, + 0x13, 0xa0, 0x33, 0x19, 0x11, 0x2f, 0xff, 0x1e, + 0xe2, 0x93, 0x30, 0x34, 0x0a, 0x00, 0x00, 0x31, + 0x42, 0x00, 0x01, 0x02, 0x43, 0xa0, 0x10, 0x00, + 0x43, 0xa0, 0x30, 0x00, 0x41, 0x2f, 0xff, 0x1e, + 0xe2, 0x53, 0x30, 0x20, 0x0a, 0x00, 0x00, 0x13, + 0xba, 0x00, 0x00, 0x1a, 0xe1, 0xb0, 0xc3, 0x12, + 0x4a, 0x00, 0x00, 0x05, 0xe2, 0x63, 0xc0, 0x20, + 0xe1, 0x80, 0x0c, 0x31, 0xe1, 0xa0, 0x2c, 0x32, + 0xe1, 0x82, 0x13, 0x11, 0xe3, 0xa0, 0x30, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x96, 0xc0, 0x8c, + 0xe2, 0x63, 0xc0, 0x20, 0xe1, 0x80, 0x0c, 0x31, + 0xe1, 0xa0, 0x2c, 0x32, 0xe1, 0x82, 0x13, 0x11, + 0xe3, 0xa0, 0x30, 0x00, 0x03, 0x11, 0x00, 0x01, + 0x01, 0x2f, 0xff, 0x1e, 0xe2, 0x91, 0x10, 0x01, + 0x22, 0x80, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0xa0, 0x30, 0x00, 0xe3, 0x32, 0x01, 0x02, + 0x41, 0x2f, 0xff, 0x1e, 0x03, 0x11, 0x00, 0x01, + 0x01, 0x2f, 0xff, 0x1e, 0xe2, 0x91, 0x10, 0x01, + 0x22, 0x80, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0xe2, 0x83, 0x30, 0x20, 0xe1, 0xb0, 0xc3, 0x11, + 0x4a, 0x00, 0x00, 0x04, 0xe2, 0x63, 0xc0, 0x20, + 0xe1, 0xa0, 0x1c, 0x31, 0xe2, 0x00, 0x01, 0x02, + 0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0x3c, 0x01, 0x02, 0x01, 0x92, 0xc0, 0x06, + 0xe2, 0x63, 0xc0, 0x20, 0xe1, 0xa0, 0x1c, 0x31, + 0x03, 0x11, 0x00, 0x01, 0x12, 0x81, 0x10, 0x01, + 0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0x31, 0x01, 0x02, 0x03, 0x32, 0x00, 0x00, + 0x03, 0xa0, 0x10, 0x00, 0x13, 0xa0, 0x10, 0x01, + 0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0x10, 0x02, 0x02, 0x1a, 0x00, 0x00, 0x0b, + 0xe3, 0xa0, 0x30, 0x00, 0xe3, 0x31, 0x00, 0x00, + 0x11, 0xb0, 0x10, 0x81, 0x43, 0xe0, 0x00, 0x00, + 0x41, 0x2f, 0xff, 0x1e, 0x03, 0x32, 0x00, 0x00, + 0x13, 0xa0, 0x34, 0x61, 0x11, 0x2f, 0xff, 0x1e, + 0xe2, 0x00, 0x01, 0x02, 0xe3, 0x80, 0x02, 0x07, + 0xe3, 0x80, 0x06, 0xff, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe3, 0xc1, 0x11, 0x02, 0xe1, 0xa0, 0xcb, 0x02, + 0xe1, 0x9c, 0xc0, 0x06, 0xe2, 0x00, 0xc1, 0x02, + 0xe1, 0xa0, 0x0a, 0x03, 0xe1, 0x80, 0x05, 0xa1, + 0xe1, 0xa0, 0x1a, 0x81, 0xe1, 0x81, 0x15, 0xa2, + 0xe3, 0xa0, 0x30, 0x00, 0x0a, 0x00, 0x00, 0x06, + 0xe2, 0x91, 0x10, 0x01, 0x22, 0x80, 0x00, 0x01, + 0xe2, 0x90, 0x26, 0x01, 0xe1, 0x80, 0x00, 0x0c, + 0x51, 0x2f, 0xff, 0x1e, 0xe3, 0xa0, 0x33, 0x19, + 0xe1, 0x2f, 0xff, 0x1e, 0x03, 0x11, 0x00, 0x01, + 0x01, 0x80, 0x00, 0x0c, 0x01, 0x2f, 0xff, 0x1e, + 0xe2, 0x91, 0x10, 0x01, 0x22, 0x80, 0x00, 0x01, + 0xe2, 0x90, 0x26, 0x01, 0xe1, 0x80, 0x00, 0x0c, + 0x51, 0x2f, 0xff, 0x1e, 0xe3, 0xa0, 0x33, 0x19, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x4b, 0xf0, 0xe1, 0xb0, 0xc0, 0x82, + 0x03, 0x33, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x3c, + 0xe1, 0xa0, 0x85, 0x0c, 0xe1, 0xa0, 0x2a, 0x2c, + 0xe1, 0xa0, 0x55, 0x83, 0xe1, 0x88, 0x4a, 0xa3, + 0x12, 0x82, 0x2b, 0x1e, 0xe1, 0xa0, 0x30, 0x62, + 0x13, 0x84, 0x41, 0x02, 0xe1, 0xb0, 0xca, 0xcc, + 0x02, 0x8f, 0xe0, 0x08, 0x0a, 0x00, 0x04, 0xf8, + 0xe3, 0x7c, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x16, + 0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x3c, 0xe1, 0xa0, 0x85, 0x0c, + 0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, + 0xe1, 0x88, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, + 0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, + 0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, + 0x0a, 0x00, 0x04, 0xb9, 0xe3, 0x7c, 0x00, 0x01, + 0x0a, 0x00, 0x00, 0x16, 0xe3, 0xa0, 0xb0, 0x02, + 0xeb, 0x00, 0x05, 0x15, 0xeb, 0xff, 0xff, 0x5f, + 0xe3, 0x13, 0x02, 0x02, 0x08, 0xbd, 0x4b, 0xf0, + 0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x83, 0x35, 0x02, + 0xea, 0x00, 0x04, 0x0f, 0xe3, 0x83, 0x31, 0x01, + 0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x0e, 0xe1, 0xa0, 0x85, 0x0c, + 0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, + 0xe1, 0x88, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, + 0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, + 0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, + 0x0a, 0x00, 0x04, 0xa1, 0xe3, 0x7c, 0x00, 0x01, + 0x03, 0x80, 0x01, 0x01, 0xe2, 0x4f, 0xe0, 0x60, + 0xe3, 0xa0, 0xb0, 0x02, 0xea, 0x00, 0x06, 0x2b, + 0xe1, 0x95, 0xc0, 0x84, 0x0a, 0x00, 0x00, 0x13, + 0xe1, 0xb0, 0x40, 0x84, 0x5a, 0x00, 0x00, 0x0d, + 0xe3, 0xe0, 0x00, 0x00, 0xe8, 0xbd, 0x4b, 0xf0, + 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xb0, 0xc0, 0x80, + 0x03, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x07, + 0xe1, 0xf0, 0xca, 0x4c, 0x08, 0xbd, 0x4b, 0xf0, + 0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x3c, 0x00, 0x01, + 0x1a, 0x00, 0x00, 0x04, 0xe1, 0x91, 0xc6, 0x00, + 0x08, 0xbd, 0x4b, 0xf0, 0x01, 0x2f, 0xff, 0x1e, + 0xe3, 0xa0, 0x35, 0x06, 0xea, 0x00, 0x03, 0xe8, + 0xe3, 0xa0, 0x35, 0x0a, 0xea, 0x00, 0x03, 0xe6, + 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, + 0xe8, 0xbd, 0x4b, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, + 0xe1, 0xb0, 0xc0, 0x82, 0x03, 0x33, 0x00, 0x00, + 0xe1, 0xa0, 0x85, 0x0c, 0xe1, 0xa0, 0x2a, 0x2c, + 0xe1, 0xa0, 0x55, 0x83, 0xe1, 0x88, 0x4a, 0xa3, + 0x12, 0x82, 0x2b, 0x1e, 0xe1, 0xa0, 0x30, 0x62, + 0x13, 0x84, 0x41, 0x02, 0xe1, 0xb0, 0xca, 0xcc, + 0x02, 0x8f, 0xe0, 0x08, 0x0a, 0x00, 0x04, 0xa4, + 0xe3, 0x7c, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x14, + 0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, + 0xe1, 0xa0, 0x85, 0x0c, 0xe1, 0xa0, 0x0a, 0x2c, + 0xe1, 0xa0, 0x25, 0x81, 0xe1, 0x88, 0x1a, 0xa1, + 0x12, 0x80, 0x0b, 0x1e, 0xe1, 0xa0, 0x00, 0x60, + 0x13, 0x81, 0x11, 0x02, 0xe1, 0xb0, 0xca, 0xcc, + 0x02, 0x8f, 0xe0, 0x08, 0x0a, 0x00, 0x04, 0x66, + 0xe3, 0x7c, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x14, + 0xeb, 0x00, 0x02, 0xdc, 0xeb, 0xff, 0xff, 0x0d, + 0xe3, 0x13, 0x02, 0x02, 0x08, 0xbd, 0x4b, 0xf0, + 0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x83, 0x35, 0x02, + 0xea, 0x00, 0x03, 0xbd, 0xe3, 0x83, 0x31, 0x01, + 0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, + 0xe1, 0xa0, 0x85, 0x0c, 0xe1, 0xa0, 0x0a, 0x2c, + 0xe1, 0xa0, 0x25, 0x81, 0xe1, 0x88, 0x1a, 0xa1, + 0x12, 0x80, 0x0b, 0x1e, 0xe1, 0xa0, 0x00, 0x60, + 0x13, 0x81, 0x11, 0x02, 0xe1, 0xb0, 0xca, 0xcc, + 0x02, 0x8f, 0xe0, 0x08, 0x0a, 0x00, 0x04, 0x50, + 0xe3, 0x7c, 0x00, 0x01, 0x03, 0x80, 0x01, 0x01, + 0xe2, 0x4f, 0xe0, 0x5c, 0xe3, 0xa0, 0xb0, 0x02, + 0xea, 0x00, 0x03, 0x64, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0xc4, 0xff, 0xe3, 0x8c, 0xc6, 0x0e, + 0xe1, 0x5c, 0x00, 0x82, 0x9a, 0x00, 0x00, 0x0a, + 0xe1, 0xb0, 0x00, 0x80, 0x03, 0x31, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x0a, 0x3a, 0x00, 0x00, 0x12, + 0xe1, 0x50, 0x00, 0x0c, 0x03, 0x51, 0x00, 0x00, + 0x8a, 0xff, 0xfc, 0x60, 0xe1, 0xb0, 0x20, 0x82, + 0x8a, 0x00, 0x00, 0x18, 0xe3, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x03, 0x53, 0x00, 0x00, + 0x0a, 0xff, 0xff, 0xf2, 0xea, 0xff, 0xfc, 0x5d, + 0xe1, 0x50, 0x00, 0x0c, 0x03, 0x51, 0x00, 0x00, + 0x8a, 0xff, 0xfc, 0x56, 0xe1, 0xb0, 0x20, 0x82, + 0x33, 0xa0, 0x00, 0x00, 0x23, 0xa0, 0x00, 0x01, + 0x03, 0x33, 0x00, 0x00, 0x03, 0xa0, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x0c, + 0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfc, 0x4d, + 0xe1, 0xb0, 0x20, 0x82, 0x23, 0xa0, 0x00, 0x01, + 0x21, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02, + 0x01, 0x51, 0x00, 0x03, 0x33, 0xa0, 0x00, 0x00, + 0x23, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03, + 0x83, 0xa0, 0x00, 0x00, 0x93, 0xa0, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0xb0, 0x20, 0x80, 0xe1, 0xa0, 0x2a, 0xa2, + 0xe1, 0xa0, 0x05, 0x80, 0xe1, 0x80, 0x0a, 0xa1, + 0xe3, 0x80, 0x01, 0x02, 0xe2, 0x42, 0x2c, 0x03, + 0x2a, 0x00, 0x00, 0x08, 0xe2, 0x52, 0x20, 0xff, + 0x4a, 0x00, 0x00, 0x04, 0xe2, 0x72, 0x20, 0x1f, + 0xc1, 0xa0, 0x02, 0x30, 0xc1, 0x2f, 0xff, 0x1e, + 0xe3, 0xc0, 0x01, 0x02, 0xea, 0x00, 0x00, 0x09, + 0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe2, 0x52, 0x20, 0xff, 0x4a, 0xff, 0xff, 0xfb, + 0xe2, 0x72, 0x20, 0x1f, 0xc1, 0xa0, 0x02, 0x30, + 0xc2, 0x60, 0x00, 0x00, 0xc1, 0x2f, 0xff, 0x1e, + 0x01, 0x91, 0xc0, 0x80, 0x01, 0x2f, 0xff, 0x1e, + 0xe3, 0xa0, 0x36, 0x12, 0xe2, 0x82, 0x2e, 0x3e, + 0xe3, 0x72, 0x00, 0x01, 0x1a, 0x00, 0x03, 0x63, + 0xe1, 0x91, 0xc0, 0x80, 0x13, 0xa0, 0x37, 0x42, + 0xea, 0x00, 0x03, 0x60, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x4b, 0xf0, 0xe2, 0x22, 0x21, 0x02, + 0xea, 0x00, 0x00, 0x01, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x4b, 0xf0, 0xe1, 0xb0, 0xc0, 0x82, + 0x03, 0x33, 0x00, 0x00, 0xe1, 0xa0, 0x85, 0x0c, + 0xe1, 0xa0, 0x2a, 0x2c, 0xe1, 0xa0, 0x55, 0x83, + 0xe1, 0x88, 0x4a, 0xa3, 0x12, 0x82, 0x2b, 0x1e, + 0xe1, 0xa0, 0x30, 0x62, 0x13, 0x84, 0x41, 0x02, + 0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, + 0x0a, 0x00, 0x04, 0x1d, 0xe3, 0x7c, 0x00, 0x01, + 0x0a, 0x00, 0x00, 0x14, 0xe1, 0xb0, 0xc0, 0x80, + 0x03, 0x31, 0x00, 0x00, 0xe1, 0xa0, 0x85, 0x0c, + 0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, + 0xe1, 0x88, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, + 0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, + 0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, + 0x0a, 0x00, 0x03, 0xdf, 0xe3, 0x7c, 0x00, 0x01, + 0x0a, 0x00, 0x00, 0x14, 0xeb, 0x00, 0x05, 0xbb, + 0xeb, 0xff, 0xfe, 0x86, 0xe3, 0x13, 0x02, 0x02, + 0x08, 0xbd, 0x4b, 0xf0, 0x01, 0x2f, 0xff, 0x1e, + 0xe3, 0x83, 0x35, 0x02, 0xea, 0x00, 0x03, 0x36, + 0xe3, 0x83, 0x31, 0x01, 0xe1, 0xb0, 0xc0, 0x80, + 0x03, 0x31, 0x00, 0x00, 0xe1, 0xa0, 0x85, 0x0c, + 0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, + 0xe1, 0x88, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, + 0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, + 0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, + 0x0a, 0x00, 0x03, 0xc9, 0xe3, 0x7c, 0x00, 0x01, + 0x03, 0x80, 0x01, 0x01, 0xe2, 0x4f, 0xe0, 0x5c, + 0xe3, 0xa0, 0xb0, 0x02, 0xea, 0x00, 0x05, 0xff, + 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, + 0xe2, 0x20, 0x01, 0x02, 0xea, 0xff, 0xff, 0xc6, + 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0xc4, 0xff, + 0xe3, 0x8c, 0xc6, 0x0e, 0xe1, 0x5c, 0x00, 0x82, + 0x9a, 0x00, 0x00, 0x0a, 0xe1, 0xb0, 0x00, 0x80, + 0x03, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0a, + 0x3a, 0x00, 0x00, 0x11, 0xe1, 0x50, 0x00, 0x0c, + 0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfb, 0xd5, + 0xe1, 0xb0, 0x20, 0x82, 0x8a, 0x00, 0x00, 0x17, + 0xe3, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0x03, 0x53, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xf2, + 0xea, 0xff, 0xfb, 0xd2, 0xe1, 0x50, 0x00, 0x0c, + 0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfb, 0xcb, + 0xe1, 0xb0, 0x20, 0x82, 0x03, 0x33, 0x00, 0x00, + 0x83, 0xa0, 0x00, 0x00, 0x93, 0xa0, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x0c, + 0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfb, 0xc3, + 0xe1, 0xb0, 0x20, 0x82, 0x23, 0xa0, 0x00, 0x00, + 0x21, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02, + 0x01, 0x51, 0x00, 0x03, 0x93, 0xa0, 0x00, 0x01, + 0x83, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03, + 0x33, 0xa0, 0x00, 0x00, 0x23, 0xa0, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0x42, 0x99, 0xd1, 0x03, + 0x42, 0x90, 0xd1, 0x01, 0x20, 0x00, 0x47, 0x70, + 0x20, 0x01, 0x47, 0x70, 0xb5, 0x70, 0x1c, 0x04, + 0x1c, 0x0d, 0x1c, 0x16, 0x46, 0x9e, 0x47, 0x78, + 0xe3, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x10, 0x00, + 0xe1, 0xa0, 0x30, 0x05, 0xe1, 0xa0, 0x20, 0x04, + 0xe3, 0x3e, 0x00, 0x00, 0x03, 0x36, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x14, 0xe3, 0xb0, 0xc0, 0x00, + 0xe0, 0x96, 0x60, 0x06, 0xe0, 0xbe, 0xe0, 0x0e, + 0x2a, 0x00, 0x00, 0x04, 0xe1, 0x5e, 0x00, 0x03, + 0x01, 0x56, 0x00, 0x02, 0x92, 0x8c, 0xc0, 0x01, + 0x9a, 0xff, 0xff, 0xf8, 0xe2, 0x9c, 0xc0, 0x00, + 0xe1, 0xb0, 0xe0, 0x6e, 0xe1, 0xa0, 0x60, 0x66, + 0xe0, 0x52, 0x40, 0x06, 0xe0, 0xd3, 0x50, 0x0e, + 0x21, 0xa0, 0x30, 0x05, 0x21, 0xa0, 0x20, 0x04, + 0xe0, 0xb0, 0x00, 0x00, 0xe0, 0xa1, 0x10, 0x01, + 0xe1, 0xb0, 0xe0, 0xae, 0xe1, 0xa0, 0x60, 0x66, + 0xe2, 0x5c, 0xc0, 0x01, 0xaa, 0xff, 0xff, 0xf5, + 0xe8, 0xbd, 0x40, 0x70, 0xe1, 0x2f, 0xff, 0x1e, + 0x18, 0x80, 0x41, 0x59, 0x47, 0x70, 0x00, 0x00, + 0x1c, 0x01, 0x08, 0x40, 0x08, 0x42, 0x18, 0x80, + 0x09, 0x02, 0x18, 0x80, 0x0a, 0x02, 0x18, 0x80, + 0x0c, 0x02, 0x18, 0x80, 0x08, 0xc0, 0x00, 0x82, + 0x18, 0x12, 0x00, 0x52, 0x1a, 0x89, 0x29, 0x0a, + 0xdb, 0x01, 0x1c, 0x40, 0x39, 0x0a, 0x47, 0x70, + 0xb4, 0x80, 0x20, 0x03, 0x43, 0xc0, 0x23, 0x00, + 0x49, 0x07, 0x54, 0x0b, 0x30, 0x01, 0xd4, 0xfc, + 0x20, 0x00, 0x4a, 0x06, 0x5c, 0x17, 0x54, 0x0f, + 0x18, 0x0f, 0x37, 0x80, 0x70, 0x3b, 0x30, 0x01, + 0x28, 0x80, 0xd3, 0xf7, 0xbc, 0x80, 0x47, 0x70, + 0x2e, 0x08, 0x22, 0x44, 0x2e, 0x03, 0xa9, 0x2c, + 0x17, 0xc1, 0x47, 0x70, 0x42, 0x99, 0xdb, 0x04, + 0xdc, 0x01, 0x42, 0x90, 0xd3, 0x01, 0x20, 0x00, + 0x47, 0x70, 0x20, 0x01, 0x47, 0x70, 0x00, 0x00, + 0x1c, 0x0b, 0x21, 0x00, 0x42, 0x40, 0x41, 0x99, + 0x47, 0x70, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0xb0, 0x00, 0xe1, 0xa0, 0x20, 0x01, + 0xe8, 0x80, 0x00, 0x0e, 0xe5, 0x9f, 0xc0, 0x38, + 0xe5, 0x8c, 0xd0, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0x20, 0x28, + 0xe5, 0x92, 0x20, 0x00, 0xe5, 0x91, 0x40, 0x2c, + 0xe5, 0x91, 0xc0, 0x34, 0xe1, 0x5c, 0x00, 0x02, + 0x23, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc0, 0x08, + 0xe5, 0x9c, 0xd0, 0x00, 0xe3, 0xa0, 0xb0, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x23, 0x44, + 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, + 0xe5, 0x9f, 0xc0, 0xe4, 0xe5, 0x9c, 0x00, 0x00, + 0xe3, 0x50, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x04, + 0x15, 0x8c, 0x00, 0x04, 0x0b, 0x00, 0x00, 0x01, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe5, 0x9f, 0xc0, 0xcc, 0xea, 0xff, 0xfb, 0x87, + 0xe3, 0xa0, 0x10, 0x0a, 0xe3, 0x50, 0x01, 0x02, + 0x13, 0x50, 0x01, 0x06, 0x13, 0x50, 0x01, 0x16, + 0x03, 0xa0, 0x10, 0x03, 0xe3, 0x50, 0x01, 0x0a, + 0x13, 0x50, 0x01, 0x0e, 0x03, 0xa0, 0x10, 0x05, + 0xe5, 0x9f, 0x20, 0xa8, 0xe1, 0x50, 0x00, 0x02, + 0xe2, 0x82, 0x20, 0xff, 0x21, 0x52, 0x00, 0x00, + 0x23, 0xa0, 0x10, 0x02, 0xe3, 0x50, 0x01, 0x82, + 0x03, 0xa0, 0x10, 0x02, 0xe3, 0x50, 0x01, 0x86, + 0x03, 0xa0, 0x10, 0x07, 0xe5, 0x9f, 0x20, 0x88, + 0xe0, 0x50, 0x20, 0x02, 0x13, 0x52, 0x00, 0x01, + 0x03, 0xa0, 0x10, 0x05, 0xe1, 0xa0, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x40, 0x02, 0xe1, 0xa0, 0x30, 0x00, + 0xeb, 0xff, 0xff, 0xe4, 0xe8, 0xbd, 0x40, 0x02, + 0xe5, 0x9f, 0xc0, 0x50, 0xe3, 0xa0, 0x20, 0x01, + 0xe5, 0xcc, 0x20, 0x00, 0xe9, 0x2d, 0x00, 0x0a, + 0xeb, 0xff, 0xff, 0xdc, 0xea, 0x00, 0x00, 0x09, + 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc0, 0x30, + 0xe3, 0xa0, 0x10, 0x00, 0xe5, 0x8c, 0x10, 0x00, + 0xe5, 0x9c, 0x00, 0x04, 0xe3, 0x50, 0x00, 0x00, + 0x01, 0x2f, 0xff, 0x1e, 0xe5, 0x8c, 0x10, 0x04, + 0xea, 0xff, 0xff, 0xd2, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0xa0, 0xc0, 0x0d, 0xe9, 0x2d, 0xd9, 0xf0, + 0xe2, 0x4c, 0xb0, 0x04, 0xe3, 0xa0, 0x10, 0x01, + 0xea, 0xff, 0xfb, 0xa4, 0x2e, 0x08, 0x21, 0x34, + 0x2e, 0x08, 0x21, 0x46, 0x2e, 0x02, 0x24, 0x85, + 0x80, 0x00, 0x02, 0x00, 0x80, 0x80, 0x0e, 0xa0, + 0xb5, 0xff, 0xa6, 0x23, 0xa5, 0x22, 0xa4, 0x22, + 0x68, 0x5a, 0x68, 0x1f, 0x4b, 0x21, 0x60, 0x5a, + 0x23, 0x00, 0x4a, 0x21, 0x70, 0x13, 0x70, 0x53, + 0x70, 0x93, 0x4a, 0x20, 0x2a, 0x00, 0xd0, 0x02, + 0x9a, 0x02, 0xf7, 0xff, 0xff, 0xfe, 0x48, 0x1e, + 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, + 0x48, 0x1c, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, + 0xff, 0xfe, 0x48, 0x1b, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xff, 0xff, 0x06, 0x48, 0x19, 0x28, 0x00, + 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, 0x48, 0x18, + 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x01, 0xfb, 0xf8, + 0x48, 0x16, 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x01, + 0xfd, 0x69, 0x48, 0x15, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xff, 0xa0, + 0x48, 0x12, 0x28, 0x00, 0xd0, 0x04, 0x1c, 0x30, + 0x1c, 0x29, 0x1c, 0x22, 0xf0, 0x01, 0xff, 0x6e, + 0x2f, 0x00, 0xd0, 0x01, 0xf7, 0xfd, 0xfa, 0x5a, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x3a, 0x74, 0x74, 0x00, 0x2e, 0x08, 0x23, 0x48, + 0x2e, 0x08, 0x23, 0x48, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x02, 0x0b, 0x1d, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x02, 0x25, 0x15, 0x2e, 0x02, 0x28, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x02, 0x2c, 0x29, + 0xb5, 0x90, 0x28, 0x00, 0xd0, 0x04, 0x48, 0x12, + 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, + 0x4f, 0x10, 0x68, 0x78, 0x28, 0x00, 0xd0, 0x03, + 0xf7, 0xfd, 0xfa, 0x22, 0x20, 0x00, 0x60, 0x78, + 0x4f, 0x0d, 0x78, 0x78, 0x24, 0x01, 0x28, 0x00, + 0xd1, 0x05, 0x70, 0x7c, 0x48, 0x0b, 0x28, 0x00, + 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, 0x78, 0xb8, + 0x28, 0x00, 0xd1, 0x05, 0x70, 0xbc, 0x48, 0x08, + 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x01, 0xff, 0x7a, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x23, 0x48, + 0x2e, 0x08, 0x23, 0x48, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x02, 0x2c, 0xc9, 0xb5, 0x90, 0x1c, 0x0c, + 0x21, 0x01, 0x1c, 0x17, 0xf0, 0x01, 0xfb, 0x9c, + 0x21, 0x00, 0x1c, 0x20, 0xf0, 0x01, 0xfb, 0x98, + 0x21, 0x02, 0x1c, 0x38, 0xf0, 0x01, 0xfb, 0x94, + 0x20, 0x01, 0xf7, 0xfe, 0xfe, 0x95, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf1, 0x20, 0x00, + 0xb0, 0x89, 0x90, 0x06, 0x26, 0x00, 0x90, 0x05, + 0x20, 0x01, 0x90, 0x04, 0x27, 0x00, 0x20, 0x00, + 0x90, 0x03, 0x90, 0x02, 0x25, 0x00, 0x90, 0x01, + 0xf0, 0x01, 0xfc, 0xc2, 0x1c, 0x04, 0x78, 0x00, + 0x28, 0x00, 0xd0, 0x17, 0x49, 0xe3, 0x5d, 0xe0, + 0x5c, 0x08, 0x08, 0x40, 0xd3, 0x06, 0x37, 0x01, + 0x5d, 0xe0, 0x5c, 0x08, 0x08, 0x40, 0xd2, 0xfa, + 0xe0, 0x00, 0x37, 0x01, 0x5d, 0xe0, 0x5c, 0x0a, + 0x08, 0x52, 0xd2, 0x01, 0x28, 0x00, 0xd1, 0xf8, + 0x98, 0x04, 0x30, 0x01, 0x90, 0x04, 0x5d, 0xe0, + 0x28, 0x00, 0xd1, 0xe8, 0x98, 0x04, 0x00, 0x80, + 0xf0, 0x01, 0xfc, 0xde, 0x4b, 0xd6, 0x93, 0x08, + 0x60, 0x18, 0x1c, 0x78, 0xf0, 0x01, 0xfc, 0xd8, + 0x9b, 0x08, 0x60, 0x58, 0x48, 0xd3, 0x28, 0x00, + 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, 0x21, 0x00, + 0x20, 0x00, 0x90, 0x04, 0x48, 0xd0, 0x90, 0x07, + 0x78, 0x27, 0x34, 0x01, 0x2e, 0x00, 0xd1, 0x58, + 0x2f, 0x22, 0xd0, 0x01, 0x2f, 0x27, 0xd1, 0x02, + 0x97, 0x05, 0x1c, 0x3e, 0xe0, 0x93, 0x98, 0x06, + 0x42, 0x81, 0xd1, 0x4e, 0x98, 0x03, 0x28, 0x00, + 0xd1, 0x4b, 0x25, 0x00, 0x43, 0xed, 0x1c, 0x2a, + 0x95, 0x01, 0x22, 0x00, 0xab, 0x00, 0x70, 0x1a, + 0x70, 0x5a, 0x1e, 0x60, 0x78, 0x02, 0x2a, 0x30, + 0xdb, 0x04, 0x2a, 0x39, 0xdc, 0x02, 0x30, 0x01, + 0x1f, 0xd5, 0x3d, 0x29, 0x78, 0x02, 0x2a, 0x3e, + 0xd0, 0x01, 0x2a, 0x3c, 0xd1, 0x35, 0x2a, 0x3e, + 0xd1, 0x0e, 0x22, 0x77, 0xab, 0x00, 0x70, 0x1a, + 0x2d, 0x00, 0xd0, 0x63, 0x2d, 0x02, 0xdc, 0x62, + 0x78, 0x42, 0x30, 0x01, 0x2a, 0x3e, 0xd1, 0x13, + 0x22, 0x61, 0x70, 0x1a, 0x30, 0x01, 0xe0, 0x0f, + 0x30, 0x01, 0x1c, 0x02, 0xe0, 0x02, 0x2b, 0x3e, + 0xd0, 0x56, 0x32, 0x01, 0x78, 0x13, 0x2b, 0x00, + 0xd0, 0x01, 0x2b, 0x20, 0xd1, 0xf7, 0x2d, 0x00, + 0xdc, 0x4d, 0x22, 0x72, 0xab, 0x00, 0x70, 0x1a, + 0x78, 0x02, 0x2a, 0x26, 0xd1, 0x24, 0x23, 0x01, + 0x42, 0xdd, 0xd0, 0x19, 0x2d, 0x00, 0xdd, 0x5e, + 0x78, 0x42, 0x30, 0x01, 0x2a, 0x30, 0xdb, 0x5b, + 0x2a, 0x32, 0xdc, 0x3c, 0x30, 0x01, 0x1c, 0x2b, + 0xd5, 0x04, 0x07, 0xdb, 0x0f, 0xdb, 0x42, 0x5b, + 0xe0, 0x02, 0xe0, 0x42, 0x07, 0xdb, 0x0f, 0xdb, + 0x33, 0x31, 0x42, 0x9a, 0xd1, 0x63, 0x22, 0x00, + 0xab, 0x00, 0x70, 0x1a, 0x95, 0x01, 0xe0, 0x11, + 0x22, 0x02, 0x92, 0x01, 0xaa, 0x00, 0x78, 0x12, + 0x30, 0x01, 0x2a, 0x72, 0xd0, 0x09, 0xe0, 0x06, + 0x23, 0x01, 0x42, 0xdd, 0xd1, 0x06, 0xaa, 0x00, + 0x78, 0x12, 0x2a, 0x72, 0xd0, 0x01, 0x25, 0x01, + 0xe0, 0x00, 0x25, 0x00, 0xaa, 0x00, 0x78, 0x12, + 0x2a, 0x00, 0xd0, 0x16, 0x22, 0x01, 0x92, 0x03, + 0x4a, 0x8c, 0x78, 0x03, 0x5c, 0xd3, 0x08, 0x5b, + 0xd3, 0x04, 0x78, 0x43, 0x5c, 0xd3, 0x30, 0x01, + 0x08, 0x5b, 0xd2, 0xfa, 0x78, 0x02, 0x2a, 0x22, + 0xd0, 0x01, 0x2a, 0x27, 0xd1, 0x0c, 0x30, 0x01, + 0x1c, 0x16, 0xe0, 0x09, 0xe0, 0x6a, 0xe0, 0xfb, + 0xe0, 0x23, 0x78, 0x02, 0x2a, 0x00, 0xd0, 0x03, + 0x4b, 0x80, 0x5c, 0x9a, 0x08, 0x52, 0xd3, 0x61, + 0x22, 0x01, 0x92, 0x02, 0x1c, 0x04, 0x78, 0x27, + 0x34, 0x01, 0x2e, 0x00, 0xd0, 0x15, 0x2f, 0x5c, + 0xd1, 0x0b, 0x78, 0x20, 0x28, 0x22, 0xd0, 0x03, + 0x28, 0x5c, 0xd0, 0x01, 0x28, 0x27, 0xd1, 0x04, + 0x34, 0x01, 0x1c, 0x07, 0xe0, 0x09, 0xe0, 0xdf, + 0xe0, 0xde, 0x1c, 0x30, 0x42, 0xb7, 0xd1, 0x04, + 0x40, 0x7e, 0x78, 0x27, 0x34, 0x01, 0x42, 0x87, + 0xd0, 0xfa, 0x2f, 0x00, 0xd0, 0x0c, 0x2e, 0x00, + 0xd1, 0x03, 0x48, 0x6e, 0x5d, 0xc0, 0x08, 0x40, + 0xd2, 0x06, 0x1c, 0x08, 0x9b, 0x08, 0x68, 0x5a, + 0x54, 0x17, 0x31, 0x01, 0xe0, 0x97, 0xe0, 0xc7, + 0x98, 0x06, 0x42, 0x81, 0xd1, 0x08, 0x98, 0x05, + 0x28, 0x00, 0xd1, 0x05, 0x98, 0x02, 0x28, 0x00, + 0xd0, 0x74, 0x98, 0x03, 0x28, 0x00, 0xd1, 0x72, + 0x22, 0x00, 0x1c, 0x08, 0x9b, 0x08, 0x68, 0x5b, + 0x54, 0x1a, 0x98, 0x02, 0x31, 0x01, 0x28, 0x00, + 0xd0, 0x6a, 0x98, 0x03, 0x28, 0x00, 0xd0, 0x13, + 0x01, 0xa8, 0x99, 0x07, 0x18, 0x42, 0x9b, 0x08, + 0x68, 0x58, 0x99, 0x06, 0x18, 0x40, 0x46, 0x69, + 0xf0, 0x01, 0xfd, 0x3a, 0x28, 0x00, 0xd1, 0x07, + 0x9b, 0x08, 0x68, 0x58, 0x99, 0x06, 0x18, 0x41, + 0xa2, 0x58, 0xa0, 0x5e, 0xf7, 0xff, 0xfe, 0xb6, + 0x23, 0x01, 0x98, 0x01, 0x42, 0xd8, 0xdd, 0x51, + 0x98, 0x01, 0x28, 0x00, 0xda, 0x03, 0x40, 0x18, + 0x42, 0x40, 0xe0, 0x02, 0xe0, 0x90, 0x07, 0xc0, + 0x0f, 0xc0, 0x1c, 0x41, 0x98, 0x01, 0xf0, 0x01, + 0xfe, 0x29, 0x01, 0x80, 0x99, 0x07, 0x18, 0x40, + 0xf0, 0x01, 0xfa, 0xdc, 0x28, 0x00, 0xd1, 0x3d, + 0xb0, 0x82, 0x98, 0x03, 0x01, 0x80, 0x99, 0x09, + 0x18, 0x40, 0x90, 0x01, 0x9a, 0x03, 0x2a, 0x00, + 0xda, 0x03, 0x07, 0xd2, 0x0f, 0xd2, 0x42, 0x52, + 0xe0, 0x01, 0x07, 0xd2, 0x0f, 0xd2, 0x01, 0x90, + 0x99, 0x09, 0x18, 0x40, 0x30, 0x40, 0x90, 0x00, + 0x20, 0xff, 0x30, 0x01, 0xf0, 0x01, 0xfb, 0xa8, + 0x1c, 0x01, 0x23, 0xff, 0x22, 0x01, 0x02, 0x52, + 0x98, 0x01, 0x33, 0x01, 0xf0, 0x01, 0xfe, 0x1e, + 0x98, 0x01, 0x68, 0xc0, 0x23, 0x01, 0x02, 0xdb, + 0x43, 0x18, 0x99, 0x01, 0x60, 0xc8, 0x08, 0xd8, + 0xf0, 0x01, 0xfb, 0x96, 0x1c, 0x01, 0x23, 0xff, + 0x22, 0x01, 0x02, 0x52, 0x98, 0x00, 0x33, 0x01, + 0xf0, 0x01, 0xfe, 0x0c, 0x98, 0x00, 0x68, 0xc0, + 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, 0x99, 0x00, + 0x60, 0xc8, 0xe0, 0x02, 0xe0, 0x13, 0xe0, 0x12, + 0xe0, 0x05, 0xb0, 0x02, 0x20, 0x00, 0x90, 0x02, + 0x90, 0x03, 0x99, 0x06, 0xe0, 0x0b, 0x9b, 0x08, + 0x68, 0x58, 0x9a, 0x06, 0x18, 0x82, 0x98, 0x04, + 0x1c, 0x43, 0x93, 0x04, 0x00, 0x80, 0x9b, 0x08, + 0x68, 0x1b, 0x50, 0x1a, 0x91, 0x06, 0x2f, 0x00, + 0xd0, 0x01, 0x26, 0x00, 0x96, 0x05, 0x2f, 0x00, + 0xd0, 0x00, 0xe6, 0x9d, 0x2e, 0x00, 0xd0, 0x0a, + 0xb0, 0x81, 0xab, 0x00, 0x70, 0x1e, 0x22, 0x00, + 0x70, 0x5a, 0x46, 0x69, 0xa2, 0x24, 0xa0, 0x25, + 0xf7, 0xff, 0xfe, 0x3c, 0xb0, 0x01, 0x22, 0x00, + 0x98, 0x04, 0x00, 0x80, 0x9b, 0x08, 0x68, 0x19, + 0x50, 0x0a, 0x98, 0x04, 0x28, 0x00, 0xdd, 0x0f, + 0x9b, 0x08, 0x68, 0x18, 0x68, 0x01, 0x68, 0x09, + 0x4b, 0x21, 0x40, 0x19, 0xa2, 0x21, 0x68, 0x12, + 0x42, 0x91, 0xd1, 0x05, 0x9b, 0x04, 0x3b, 0x01, + 0x93, 0x04, 0x30, 0x04, 0x9b, 0x08, 0x60, 0x18, + 0x9a, 0x09, 0x9b, 0x08, 0x68, 0x19, 0x98, 0x04, + 0xf7, 0xfe, 0xfc, 0x47, 0xf7, 0xfe, 0xfc, 0xc0, + 0x1e, 0x61, 0xa2, 0x19, 0xa0, 0x19, 0xf7, 0xff, + 0xfe, 0x15, 0xb0, 0x09, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x22, 0x44, + 0x2e, 0x08, 0x23, 0x50, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0xd3, 0x48, 0x27, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x49, 0x2f, 0x4f, 0x20, 0x72, 0x65, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x0a, 0x00, 0x00, 0x63, 0x61, 0x6e, 0x27, + 0x74, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x27, + 0x00, 0x00, 0x00, 0x00, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6c, 0x6f, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x00, 0x00, 0x00, 0x00, + 0xdf, 0xdf, 0xdf, 0xdf, 0x52, 0x55, 0x4e, 0x00, + 0x27, 0x0a, 0x00, 0x00, 0x75, 0x6e, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, + 0x6f, 0x72, 0x20, 0x69, 0x6c, 0x6c, 0x65, 0x67, + 0x61, 0x6c, 0x20, 0x49, 0x2f, 0x4f, 0x20, 0x72, + 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x27, 0x00, 0x00, 0x00, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x20, 0x01, + 0xea, 0x00, 0x00, 0x01, 0x47, 0x78, 0x00, 0x00, + 0xe3, 0xa0, 0x20, 0x02, 0xe2, 0x00, 0x31, 0x02, + 0xe5, 0x9f, 0x00, 0x18, 0xe5, 0x80, 0x20, 0x00, + 0xe3, 0x31, 0x00, 0x00, 0x03, 0xa0, 0x00, 0x00, + 0x15, 0x9f, 0x00, 0x0c, 0x18, 0x90, 0x00, 0x03, + 0xe1, 0x80, 0x00, 0x03, 0xe1, 0x2f, 0xff, 0x1e, + 0x2e, 0x08, 0x21, 0x30, 0x2e, 0x08, 0x21, 0x3c, + 0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, + 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, + 0xe0, 0x88, 0x30, 0x09, 0xe2, 0x43, 0x3c, 0x3f, + 0xe2, 0x43, 0x30, 0xfe, 0xe3, 0x32, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x5d, 0xe3, 0x35, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x3d, 0xe9, 0x2d, 0x48, 0x81, + 0xe1, 0xa0, 0x08, 0x21, 0xe1, 0xc1, 0x78, 0x00, + 0xe1, 0xa0, 0x68, 0x24, 0xe1, 0xc4, 0x88, 0x06, + 0xe0, 0x09, 0x06, 0x90, 0xe0, 0x06, 0x06, 0x97, + 0xe0, 0x07, 0x07, 0x98, 0xe0, 0x97, 0x78, 0x06, + 0xe0, 0xa9, 0x98, 0x26, 0xe0, 0x08, 0x08, 0x90, + 0xe0, 0x97, 0x78, 0x08, 0xe0, 0xa9, 0x08, 0x28, + 0xe1, 0xa0, 0xb8, 0x22, 0xe1, 0xc2, 0xe8, 0x0b, + 0xe1, 0xa0, 0x68, 0x25, 0xe1, 0xc5, 0x88, 0x06, + 0xe0, 0x09, 0x06, 0x9b, 0xe0, 0x06, 0x06, 0x9e, + 0xe0, 0x0e, 0x0e, 0x98, 0xe0, 0x9e, 0xe8, 0x06, + 0xe0, 0xa9, 0x98, 0x26, 0xe0, 0x08, 0x08, 0x9b, + 0xe0, 0x9e, 0xe8, 0x08, 0xe0, 0xa9, 0xb8, 0x28, + 0xe0, 0x97, 0x70, 0x0b, 0xe2, 0xa0, 0x00, 0x00, + 0xe0, 0x97, 0xb0, 0x0e, 0xe0, 0xb7, 0x70, 0x00, + 0xe2, 0xa0, 0x00, 0x00, 0xe0, 0x51, 0x80, 0x02, + 0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x60, 0x00, + 0x31, 0xe0, 0x10, 0x01, 0x30, 0x44, 0x60, 0x05, + 0x10, 0x55, 0x90, 0x04, 0x03, 0xa0, 0x10, 0x00, + 0x31, 0xe0, 0x10, 0x01, 0x30, 0x46, 0x60, 0x08, + 0xe1, 0xa0, 0x48, 0x28, 0xe1, 0xc8, 0x58, 0x04, + 0xe1, 0xa0, 0x88, 0x29, 0xe1, 0xc9, 0x98, 0x08, + 0xe0, 0x22, 0x68, 0x94, 0xe0, 0x08, 0x08, 0x95, + 0xe0, 0x06, 0x05, 0x99, 0xe0, 0x96, 0x68, 0x08, + 0xe0, 0xa2, 0x28, 0x28, 0xe0, 0x09, 0x09, 0x94, + 0xe0, 0x96, 0x68, 0x09, 0xe0, 0xa2, 0x28, 0x29, + 0xe0, 0x9b, 0x60, 0x06, 0xe0, 0xb7, 0x20, 0x02, + 0xe0, 0xb0, 0x10, 0x01, 0xe1, 0x8e, 0xe1, 0x0e, + 0xe1, 0x86, 0x61, 0x2e, 0x48, 0xbd, 0x88, 0x81, + 0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, + 0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, + 0xe8, 0xbd, 0x88, 0x81, 0xe1, 0xa0, 0x58, 0x24, + 0xe1, 0xc4, 0x68, 0x05, 0xe1, 0xa0, 0x88, 0x21, + 0xe1, 0xc1, 0x98, 0x08, 0xe0, 0x04, 0x08, 0x95, + 0xe0, 0x08, 0x08, 0x96, 0xe0, 0x01, 0x06, 0x99, + 0xe0, 0x91, 0x18, 0x08, 0xe0, 0xa4, 0x48, 0x28, + 0xe0, 0x09, 0x09, 0x95, 0xe0, 0x91, 0x18, 0x09, + 0xe0, 0xa4, 0x48, 0x29, 0xe1, 0xa0, 0x88, 0x22, + 0xe1, 0xc2, 0x98, 0x08, 0xe0, 0x02, 0x08, 0x95, + 0xe0, 0x08, 0x08, 0x96, 0xe0, 0x06, 0x06, 0x99, + 0xe0, 0x96, 0x68, 0x08, 0xe0, 0xa2, 0x28, 0x28, + 0xe0, 0x09, 0x09, 0x95, 0xe0, 0x96, 0x68, 0x09, + 0xe0, 0xa2, 0x58, 0x29, 0xe0, 0x95, 0x20, 0x01, + 0xe2, 0xb4, 0x10, 0x00, 0x41, 0xa0, 0xf0, 0x0e, + 0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, + 0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x35, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x24, 0xe1, 0xa0, 0x28, 0x21, + 0xe1, 0xc1, 0x68, 0x02, 0xe1, 0xa0, 0x88, 0x24, + 0xe1, 0xc4, 0x98, 0x08, 0xe0, 0x01, 0x08, 0x92, + 0xe0, 0x08, 0x08, 0x96, 0xe0, 0x04, 0x06, 0x99, + 0xe0, 0x94, 0x48, 0x08, 0xe0, 0xa1, 0x18, 0x28, + 0xe0, 0x09, 0x09, 0x92, 0xe0, 0x94, 0x48, 0x09, + 0xe0, 0xa1, 0x18, 0x29, 0xe1, 0xa0, 0x88, 0x25, + 0xe1, 0xc5, 0x98, 0x08, 0xe0, 0x05, 0x08, 0x92, + 0xe0, 0x08, 0x08, 0x96, 0xe0, 0x06, 0x06, 0x99, + 0xe0, 0x96, 0x68, 0x08, 0xe0, 0xa5, 0x58, 0x28, + 0xe0, 0x09, 0x09, 0x92, 0xe0, 0x96, 0x68, 0x09, + 0xe0, 0xa5, 0x28, 0x29, 0xe0, 0x92, 0x20, 0x04, + 0xe2, 0xb1, 0x10, 0x00, 0x41, 0xa0, 0xf0, 0x0e, + 0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, + 0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0xc0, 0x81, 0x03, + 0xe3, 0xc3, 0x91, 0x03, 0xe0, 0x20, 0x00, 0x03, + 0xe2, 0x00, 0x01, 0x02, 0xe0, 0x88, 0x30, 0x09, + 0xe2, 0x43, 0x3c, 0x3f, 0xe2, 0x43, 0x30, 0xfe, + 0xe1, 0xa0, 0x58, 0x24, 0xe1, 0xc4, 0x68, 0x05, + 0xe1, 0xa0, 0x88, 0x21, 0xe1, 0xc1, 0x98, 0x08, + 0xe0, 0x01, 0x08, 0x95, 0xe0, 0x08, 0x08, 0x96, + 0xe0, 0x02, 0x06, 0x99, 0xe0, 0x92, 0x28, 0x08, + 0xe0, 0xa1, 0x18, 0x28, 0xe0, 0x09, 0x09, 0x95, + 0xe0, 0x92, 0x28, 0x09, 0xe0, 0xb1, 0x18, 0x29, + 0xe3, 0xa0, 0x60, 0x00, 0x41, 0xa0, 0xf0, 0x0e, + 0xe0, 0x92, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, + 0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0xa0, 0x98, 0x83, 0xe3, 0x79, 0x08, 0x02, + 0x30, 0x09, 0x90, 0x04, 0xe0, 0x19, 0x90, 0x83, + 0xe1, 0xa0, 0x88, 0x80, 0xe3, 0x78, 0x08, 0x02, + 0x30, 0x08, 0x80, 0x01, 0xe0, 0x18, 0x80, 0x80, + 0x4a, 0x00, 0x00, 0x1f, 0xe3, 0x19, 0x01, 0x02, + 0x1a, 0x00, 0x00, 0x2f, 0xe1, 0x91, 0x80, 0x02, + 0x11, 0x94, 0x80, 0x05, 0x0a, 0x00, 0x00, 0x13, + 0xe0, 0x11, 0x60, 0x80, 0x43, 0xc1, 0x11, 0x02, + 0x42, 0x80, 0x00, 0x01, 0xe0, 0x14, 0x60, 0x83, + 0x43, 0xc4, 0x41, 0x02, 0x42, 0x83, 0x30, 0x01, + 0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, + 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, + 0xe0, 0x88, 0x30, 0x09, 0xe2, 0x43, 0x3c, 0x3f, + 0xe2, 0x43, 0x30, 0xfe, 0xe9, 0x2d, 0x40, 0x00, + 0xe3, 0x11, 0x01, 0x02, 0x0b, 0x00, 0x06, 0x7c, + 0xe3, 0x14, 0x01, 0x02, 0x0b, 0x00, 0x06, 0x93, + 0xe8, 0xbd, 0x40, 0x00, 0xea, 0xff, 0xff, 0x44, + 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, + 0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x20, 0x00, + 0xe3, 0xa0, 0x30, 0x00, 0xe3, 0xa0, 0x60, 0x00, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x19, 0x01, 0x02, + 0x0a, 0x00, 0x00, 0x09, 0xe1, 0x82, 0x80, 0x81, + 0xe1, 0x88, 0x80, 0x05, 0xe1, 0x98, 0x80, 0x84, + 0x1a, 0x00, 0x06, 0xbc, 0xe0, 0x20, 0x80, 0x03, + 0xe2, 0x08, 0x81, 0x02, 0xe2, 0x8f, 0x00, 0x44, + 0xe8, 0x90, 0x00, 0x07, 0xe1, 0x80, 0x00, 0x08, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x92, 0x80, 0x81, + 0x1a, 0x00, 0x06, 0xc5, 0xe1, 0x94, 0x80, 0x05, + 0x1a, 0xff, 0xff, 0xf5, 0xe3, 0x80, 0x04, 0x61, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x95, 0x80, 0x84, + 0x1a, 0x00, 0x06, 0xb6, 0xe1, 0x91, 0x80, 0x02, + 0x1a, 0xff, 0xff, 0xef, 0xe3, 0x80, 0x04, 0x61, + 0xe1, 0xa0, 0xf0, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x4b, 0xf0, + 0xe5, 0x9f, 0x20, 0x6c, 0xe5, 0x92, 0x10, 0x00, + 0xe1, 0xa0, 0xc1, 0x83, 0xe1, 0xa0, 0xcd, 0xac, + 0xe1, 0x81, 0x10, 0x0c, 0xe5, 0x82, 0x10, 0x00, + 0xe3, 0x13, 0x03, 0x01, 0x1a, 0x00, 0x00, 0x05, + 0xe3, 0x13, 0x04, 0x02, 0x1a, 0x00, 0x00, 0x07, + 0xe3, 0x11, 0x08, 0x01, 0x0a, 0x00, 0x00, 0x44, + 0xe2, 0x8f, 0x00, 0x54, 0xea, 0x00, 0x00, 0x06, + 0xe3, 0x11, 0x07, 0x01, 0x0a, 0x00, 0x00, 0x34, + 0xe2, 0x8f, 0x00, 0x74, 0xea, 0x00, 0x00, 0x02, + 0xe3, 0x11, 0x08, 0x02, 0x0a, 0x00, 0x00, 0x30, + 0xe2, 0x8f, 0x00, 0x8c, 0xe5, 0x9f, 0x10, 0x1c, + 0xe2, 0x4e, 0xe0, 0x04, 0xe5, 0x81, 0xe0, 0x3c, + 0xe3, 0xa0, 0xec, 0xde, 0xe3, 0x8e, 0xe0, 0xad, + 0xe1, 0x8e, 0xe8, 0x0e, 0xe8, 0x81, 0x7f, 0xff, + 0xea, 0x00, 0x00, 0x01, 0x2e, 0x08, 0x23, 0x5c, + 0x2e, 0x08, 0x23, 0x60, 0xe5, 0x9f, 0xc1, 0x2c, + 0xe3, 0x5c, 0x00, 0x00, 0x11, 0x2f, 0xff, 0x1c, + 0xe6, 0x00, 0x00, 0x10, 0x80, 0x00, 0x02, 0x00, + 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x45, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3a, 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x20, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x00, 0x80, 0x00, 0x02, 0x01, + 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x45, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3a, 0x20, 0x4f, 0x76, 0x65, 0x72, 0x66, 0x6c, + 0x6f, 0x77, 0x00, 0x00, 0x80, 0x00, 0x02, 0x02, + 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x45, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x3a, 0x20, 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, + 0x20, 0x42, 0x79, 0x20, 0x5a, 0x65, 0x72, 0x6f, + 0x00, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x21, 0x02, + 0xe3, 0x13, 0x07, 0x0f, 0x1a, 0x00, 0x00, 0x13, + 0xe3, 0x13, 0x05, 0x02, 0x12, 0x8f, 0x00, 0x0c, + 0x18, 0x90, 0x00, 0x03, 0x05, 0x9f, 0x00, 0x0c, + 0xe1, 0x80, 0x00, 0x02, 0xe1, 0x2f, 0xff, 0x1e, + 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0xe3, 0x13, 0x07, 0x0f, + 0x12, 0x00, 0x21, 0x02, 0x1a, 0x00, 0x00, 0x07, + 0xe3, 0x13, 0x05, 0x02, 0x12, 0x8f, 0x00, 0x08, + 0x18, 0x90, 0x00, 0x03, 0x05, 0x9f, 0x00, 0x08, + 0xe1, 0x2f, 0xff, 0x1e, 0x7f, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, + 0xe3, 0x13, 0x07, 0x02, 0x13, 0xa0, 0x00, 0x00, + 0x13, 0xa0, 0x10, 0x00, 0x11, 0x2f, 0xff, 0x1e, + 0xe3, 0x13, 0x07, 0x01, 0x13, 0xe0, 0x00, 0x00, + 0x13, 0xe0, 0x10, 0x00, 0x11, 0x2f, 0xff, 0x1e, + 0xe3, 0x13, 0x06, 0x01, 0x13, 0xa0, 0x00, 0x00, + 0x13, 0xa0, 0x11, 0x02, 0x03, 0xa0, 0x01, 0x02, + 0xe3, 0x32, 0x01, 0x02, 0x11, 0xe0, 0x00, 0x00, + 0x11, 0xe0, 0x10, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0x2e, 0x01, 0xfb, 0xe5, 0xe3, 0x10, 0x02, 0x06, + 0x1a, 0x00, 0x00, 0x0d, 0xe1, 0xb0, 0x80, 0x86, + 0x0a, 0x00, 0x00, 0x0d, 0x22, 0x92, 0x20, 0x01, + 0x22, 0x91, 0x10, 0x01, 0x23, 0xa0, 0x11, 0x02, + 0xe2, 0xb3, 0x30, 0x00, 0x4a, 0x00, 0x00, 0x0a, + 0xe2, 0x83, 0xc0, 0x01, 0xe3, 0xcc, 0xc1, 0x01, + 0xe3, 0x5c, 0x09, 0x02, 0xc3, 0xa0, 0x33, 0x19, + 0xe2, 0x00, 0x01, 0x02, 0xe1, 0x83, 0x00, 0x00, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0xa0, 0x30, 0x00, + 0xe1, 0xa0, 0xf0, 0x0e, 0x21, 0xb0, 0x80, 0xa2, + 0xea, 0xff, 0xff, 0xef, 0xe3, 0x11, 0x01, 0x02, + 0x1a, 0x00, 0x00, 0x04, 0xe3, 0xa0, 0x10, 0x00, + 0xe3, 0xa0, 0x20, 0x00, 0xe2, 0x00, 0x01, 0x02, + 0xe3, 0xa0, 0x30, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0xb0, 0xc8, 0x21, 0x01, 0xa0, 0xc8, 0x22, + 0x01, 0x8c, 0x18, 0x01, 0x02, 0x83, 0x30, 0x10, + 0xe1, 0xb0, 0xcc, 0x21, 0x01, 0xa0, 0xcc, 0x22, + 0x01, 0x8c, 0x14, 0x01, 0x02, 0x83, 0x30, 0x08, + 0xe1, 0xb0, 0xce, 0x21, 0x01, 0xa0, 0xce, 0x22, + 0x01, 0x8c, 0x12, 0x01, 0x02, 0x83, 0x30, 0x04, + 0xe1, 0xb0, 0xcf, 0x21, 0x01, 0xa0, 0xcf, 0x22, + 0x01, 0x8c, 0x11, 0x01, 0x02, 0x83, 0x30, 0x02, + 0xe1, 0xb0, 0xcf, 0xa1, 0x01, 0xa0, 0xcf, 0xa2, + 0x01, 0x8c, 0x10, 0x81, 0x02, 0x83, 0x30, 0x01, + 0xe1, 0xb0, 0x30, 0x03, 0x4a, 0xff, 0xff, 0xe4, + 0x5a, 0xff, 0xff, 0xda, 0xe3, 0x11, 0x01, 0x02, + 0x01, 0xa0, 0xf0, 0x0e, 0xe9, 0x2d, 0x40, 0x08, + 0xe3, 0xd1, 0x11, 0x02, 0x0a, 0x00, 0x00, 0x15, + 0xe1, 0xb0, 0x38, 0x21, 0x01, 0xa0, 0x18, 0x01, + 0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, + 0xe1, 0xb0, 0x3c, 0x21, 0x01, 0xa0, 0x14, 0x01, + 0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x3e, 0x21, + 0x01, 0xa0, 0x12, 0x01, 0x02, 0x8c, 0xc0, 0x04, + 0xe1, 0xb0, 0x3f, 0x21, 0x01, 0xa0, 0x11, 0x01, + 0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x3f, 0xa1, + 0x01, 0xa0, 0x10, 0x81, 0x02, 0x8c, 0xc0, 0x01, + 0xe2, 0x6c, 0x30, 0x20, 0xe1, 0x81, 0x13, 0x32, + 0xe1, 0xa0, 0x2c, 0x12, 0xe0, 0x40, 0x00, 0x0c, + 0xe2, 0x80, 0x00, 0x01, 0xe8, 0xbd, 0x80, 0x08, + 0xe1, 0xb0, 0x38, 0x22, 0x01, 0xa0, 0x28, 0x02, + 0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, + 0xe1, 0xb0, 0x3c, 0x22, 0x01, 0xa0, 0x24, 0x02, + 0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x3e, 0x22, + 0x01, 0xa0, 0x22, 0x02, 0x02, 0x8c, 0xc0, 0x04, + 0xe1, 0xb0, 0x3f, 0x22, 0x01, 0xa0, 0x21, 0x02, + 0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x3f, 0xa2, + 0x01, 0xa0, 0x20, 0x82, 0x02, 0x8c, 0xc0, 0x01, + 0xe1, 0xa0, 0x10, 0x02, 0xe3, 0xa0, 0x20, 0x00, + 0xe2, 0x40, 0x00, 0x1f, 0xe0, 0x40, 0x00, 0x0c, + 0xe8, 0xbd, 0x80, 0x08, 0xe3, 0x14, 0x01, 0x02, + 0x01, 0xa0, 0xf0, 0x0e, 0xe9, 0x2d, 0x40, 0x01, + 0xe3, 0xd4, 0x41, 0x02, 0x0a, 0x00, 0x00, 0x15, + 0xe1, 0xb0, 0x08, 0x24, 0x01, 0xa0, 0x48, 0x04, + 0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, + 0xe1, 0xb0, 0x0c, 0x24, 0x01, 0xa0, 0x44, 0x04, + 0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x0e, 0x24, + 0x01, 0xa0, 0x42, 0x04, 0x02, 0x8c, 0xc0, 0x04, + 0xe1, 0xb0, 0x0f, 0x24, 0x01, 0xa0, 0x41, 0x04, + 0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x0f, 0xa4, + 0x01, 0xa0, 0x40, 0x84, 0x02, 0x8c, 0xc0, 0x01, + 0xe2, 0x6c, 0x00, 0x20, 0xe1, 0x84, 0x40, 0x35, + 0xe1, 0xa0, 0x5c, 0x15, 0xe0, 0x43, 0x30, 0x0c, + 0xe2, 0x83, 0x30, 0x01, 0xe8, 0xbd, 0x80, 0x01, + 0xe1, 0xb0, 0x08, 0x25, 0x01, 0xa0, 0x58, 0x05, + 0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, + 0xe1, 0xb0, 0x0c, 0x25, 0x01, 0xa0, 0x54, 0x05, + 0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x0e, 0x25, + 0x01, 0xa0, 0x52, 0x05, 0x02, 0x8c, 0xc0, 0x04, + 0xe1, 0xb0, 0x0f, 0x25, 0x01, 0xa0, 0x51, 0x05, + 0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x0f, 0xa5, + 0x01, 0xa0, 0x50, 0x85, 0x02, 0x8c, 0xc0, 0x01, + 0xe1, 0xa0, 0x40, 0x05, 0xe3, 0xa0, 0x50, 0x00, + 0xe2, 0x43, 0x30, 0x1f, 0xe0, 0x43, 0x30, 0x0c, + 0xe8, 0xbd, 0x80, 0x01, 0xe1, 0xa0, 0x80, 0x00, + 0xe1, 0xa0, 0x00, 0x03, 0xe1, 0xa0, 0x30, 0x08, + 0xe1, 0xa0, 0x80, 0x01, 0xe1, 0xa0, 0x10, 0x04, + 0xe1, 0xa0, 0x40, 0x08, 0xe1, 0xa0, 0x80, 0x02, + 0xe1, 0xa0, 0x20, 0x05, 0xe1, 0xa0, 0x50, 0x08, + 0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, + 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, + 0xe0, 0x49, 0x30, 0x08, 0xe2, 0x83, 0x3c, 0x3f, + 0xe2, 0x83, 0x30, 0xff, 0xe9, 0x2d, 0x48, 0x89, + 0xe1, 0xa0, 0x08, 0x21, 0xe1, 0xc1, 0x78, 0x00, + 0xe1, 0xa0, 0xb8, 0x22, 0xe1, 0xc2, 0xe8, 0x0b, + 0xe2, 0x8f, 0x6e, 0x36, 0xe7, 0xd6, 0x64, 0x20, + 0xe0, 0x28, 0x66, 0x90, 0xe2, 0x68, 0x85, 0x02, + 0xe0, 0x06, 0x06, 0x98, 0xe1, 0xa0, 0x69, 0xa6, + 0xe2, 0x86, 0x60, 0x02, 0xe1, 0xa0, 0x86, 0xa1, + 0xe0, 0x29, 0x66, 0x98, 0xe2, 0x69, 0x92, 0x02, + 0xe1, 0xa0, 0x88, 0x29, 0xe1, 0xc9, 0x98, 0x08, + 0xe0, 0x02, 0x06, 0x99, 0xe0, 0x01, 0x06, 0x98, + 0xe0, 0x81, 0x68, 0x22, 0xe1, 0xa0, 0x63, 0x26, + 0xe1, 0xb0, 0x40, 0xa4, 0xe1, 0xb0, 0x50, 0x65, + 0x33, 0xa0, 0x30, 0x00, 0x23, 0xa0, 0x31, 0x02, + 0xe1, 0xa0, 0x87, 0xa4, 0xe0, 0x09, 0x08, 0x96, + 0xe1, 0xa0, 0x98, 0x29, 0xe0, 0x08, 0x0b, 0x99, + 0xe0, 0x55, 0x50, 0x08, 0xe0, 0x08, 0x09, 0x90, + 0xe0, 0xc4, 0x40, 0x08, 0xe0, 0x08, 0x0e, 0x99, + 0xe0, 0x53, 0x38, 0x08, 0xe0, 0xd5, 0x58, 0x28, + 0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x58, 0x08, + 0x20, 0x55, 0x58, 0x08, 0xe0, 0xc4, 0x48, 0x28, + 0xe1, 0xa0, 0x18, 0x09, 0xe1, 0xa0, 0x81, 0x24, + 0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29, + 0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x53, 0x39, 0x88, + 0xe0, 0xd5, 0x56, 0xa8, 0xe0, 0x08, 0x09, 0x90, + 0x30, 0x45, 0x59, 0x88, 0x20, 0x55, 0x59, 0x88, + 0xe0, 0xc4, 0x46, 0xa8, 0xe0, 0x08, 0x0e, 0x99, + 0xe0, 0x53, 0x31, 0x88, 0xe0, 0xd5, 0x5e, 0xa8, + 0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x51, 0x88, + 0x20, 0x55, 0x51, 0x88, 0xe0, 0xc4, 0x4e, 0xa8, + 0xe1, 0xa0, 0x4d, 0x04, 0xe1, 0x84, 0x43, 0x25, + 0xe1, 0xa0, 0x5d, 0x05, 0xe1, 0x85, 0x53, 0x23, + 0xe1, 0xa0, 0x3d, 0x03, 0xe0, 0x81, 0x11, 0x89, + 0xe5, 0x9d, 0x80, 0x0c, 0xe3, 0x18, 0x00, 0x01, + 0x1a, 0x00, 0x00, 0x94, 0xe1, 0xa0, 0x87, 0xa4, + 0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29, + 0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x55, 0x50, 0x08, + 0xe0, 0x08, 0x09, 0x90, 0xe0, 0xc4, 0x40, 0x08, + 0xe0, 0x08, 0x0e, 0x99, 0xe0, 0x53, 0x38, 0x08, + 0xe0, 0xd5, 0x58, 0x28, 0xe0, 0x08, 0x07, 0x99, + 0x30, 0x45, 0x58, 0x08, 0x20, 0x55, 0x58, 0x08, + 0xe0, 0xc4, 0x48, 0x28, 0xe1, 0xa0, 0x2b, 0x09, + 0xe0, 0x81, 0x15, 0x29, 0xe1, 0xa0, 0x81, 0x24, + 0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29, + 0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x53, 0x39, 0x88, + 0xe0, 0xd5, 0x56, 0xa8, 0xe0, 0x08, 0x09, 0x90, + 0x30, 0x45, 0x59, 0x88, 0x20, 0x55, 0x59, 0x88, + 0xe0, 0xc4, 0x46, 0xa8, 0xe0, 0x08, 0x0e, 0x99, + 0xe0, 0x53, 0x31, 0x88, 0xe0, 0xd5, 0x5e, 0xa8, + 0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x51, 0x88, + 0x20, 0x55, 0x51, 0x88, 0xe0, 0xc4, 0x4e, 0xa8, + 0xe1, 0xa0, 0x4d, 0x04, 0xe1, 0x84, 0x43, 0x25, + 0xe1, 0xa0, 0x5d, 0x05, 0xe1, 0x85, 0x53, 0x23, + 0xe1, 0xa0, 0x3d, 0x03, 0xe0, 0x92, 0x24, 0x89, + 0xe2, 0xa1, 0x10, 0x00, 0xe5, 0x9d, 0x80, 0x0c, + 0xe3, 0x18, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x3f, + 0xe1, 0xa0, 0x87, 0xa4, 0xe0, 0x09, 0x08, 0x96, + 0xe1, 0xa0, 0x98, 0x29, 0xe0, 0x08, 0x0b, 0x99, + 0xe0, 0x55, 0x50, 0x08, 0xe0, 0x08, 0x09, 0x90, + 0xe0, 0xc4, 0x40, 0x08, 0xe0, 0x08, 0x0e, 0x99, + 0xe0, 0x53, 0x38, 0x08, 0xe0, 0xd5, 0x58, 0x28, + 0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x58, 0x08, + 0x20, 0x55, 0x58, 0x08, 0xe0, 0xc4, 0x48, 0x28, + 0xe1, 0xa0, 0x47, 0x04, 0xe1, 0x84, 0x49, 0x25, + 0xe1, 0xa0, 0x57, 0x05, 0xe1, 0x85, 0x59, 0x23, + 0xe1, 0xa0, 0x37, 0x03, 0xe1, 0xa0, 0x6e, 0x09, + 0xe0, 0x92, 0x22, 0x29, 0xe2, 0xa1, 0x10, 0x00, + 0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b, + 0xe3, 0xa0, 0xe0, 0x00, 0xe0, 0x55, 0x90, 0x07, + 0xe0, 0xd4, 0x80, 0x00, 0x21, 0xa0, 0x50, 0x09, + 0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e, + 0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03, + 0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04, + 0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07, + 0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00, + 0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, + 0xe0, 0xae, 0xe0, 0x0e, 0xe3, 0xa0, 0xb0, 0x00, + 0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, + 0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b, + 0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, + 0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09, + 0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e, + 0xe1, 0x94, 0x80, 0x05, 0x13, 0x86, 0x60, 0x01, + 0xe0, 0x96, 0x6e, 0x0e, 0xe2, 0xb2, 0x20, 0x00, + 0xe2, 0xb1, 0x10, 0x00, 0x48, 0xbd, 0x88, 0x89, + 0xe8, 0xbd, 0x48, 0x89, 0xe0, 0x96, 0x60, 0x06, + 0xe0, 0xb2, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, + 0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b, + 0xe3, 0xa0, 0xe0, 0x00, 0xe0, 0x93, 0x30, 0x03, + 0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xa4, 0x40, 0x04, + 0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, + 0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, + 0xe0, 0xae, 0xe0, 0x0e, 0xe3, 0xa0, 0xb0, 0x00, + 0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, + 0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b, + 0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, + 0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09, + 0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e, + 0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03, + 0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04, + 0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07, + 0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00, + 0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, + 0xe0, 0xae, 0xe0, 0x0e, 0xe1, 0x84, 0x60, 0x05, + 0xe0, 0x92, 0x24, 0x8e, 0xe2, 0xb1, 0x10, 0x00, + 0x48, 0xbd, 0x88, 0x89, 0xe8, 0xbd, 0x48, 0x89, + 0xe0, 0x92, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01, + 0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b, + 0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, + 0xe0, 0xa4, 0x40, 0x04, 0xe0, 0x55, 0x90, 0x07, + 0xe0, 0xd4, 0x80, 0x00, 0x21, 0xa0, 0x50, 0x09, + 0x21, 0xa0, 0x40, 0x08, 0x22, 0x81, 0x10, 0x20, + 0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03, + 0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04, + 0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07, + 0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00, + 0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08, + 0x22, 0x81, 0x10, 0x10, 0xe3, 0xa0, 0xb0, 0x00, + 0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05, + 0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b, + 0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00, + 0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09, + 0x21, 0xa0, 0x40, 0x08, 0x22, 0x81, 0x10, 0x08, + 0xe1, 0x84, 0x60, 0x05, 0xe3, 0xa0, 0x20, 0x00, + 0xe3, 0x31, 0x00, 0x00, 0x48, 0xbd, 0x88, 0x89, + 0xe8, 0xbd, 0x48, 0x89, 0xe1, 0xa0, 0x10, 0x81, + 0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e, + 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, + 0x79, 0x78, 0x77, 0x76, 0x76, 0x75, 0x74, 0x73, + 0x72, 0x71, 0x71, 0x70, 0x6f, 0x6e, 0x6e, 0x6d, + 0x6c, 0x6c, 0x6b, 0x6a, 0x6a, 0x69, 0x68, 0x68, + 0x67, 0x66, 0x66, 0x65, 0x64, 0x64, 0x63, 0x63, + 0x62, 0x61, 0x61, 0x60, 0x60, 0x5f, 0x5f, 0x5e, + 0x5e, 0x5d, 0x5d, 0x5c, 0x5c, 0x5b, 0x5b, 0x5a, + 0x5a, 0x59, 0x59, 0x58, 0x58, 0x57, 0x57, 0x56, + 0x56, 0x55, 0x55, 0x55, 0x54, 0x54, 0x53, 0x53, + 0x52, 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x50, + 0x4f, 0x4f, 0x4f, 0x4e, 0x4e, 0x4d, 0x4d, 0x4d, + 0x4c, 0x4c, 0x4c, 0x4b, 0x4b, 0x4b, 0x4a, 0x4a, + 0x4a, 0x49, 0x49, 0x49, 0x48, 0x48, 0x48, 0x47, + 0x47, 0x47, 0x47, 0x46, 0x46, 0x46, 0x45, 0x45, + 0x45, 0x44, 0x44, 0x44, 0x44, 0x43, 0x43, 0x43, + 0x43, 0x42, 0x42, 0x42, 0x42, 0x41, 0x41, 0x41, + 0xe1, 0xa0, 0x98, 0x83, 0xe3, 0x79, 0x08, 0x02, + 0x30, 0x09, 0x90, 0x04, 0xe0, 0x19, 0x90, 0x83, + 0xe1, 0xa0, 0x88, 0x80, 0xe3, 0x78, 0x08, 0x02, + 0x30, 0x08, 0x80, 0x01, 0xe0, 0x18, 0x80, 0x80, + 0x4a, 0x00, 0x00, 0x20, 0xe3, 0x19, 0x01, 0x02, + 0x1a, 0x00, 0x00, 0x32, 0xe3, 0x1b, 0x00, 0x04, + 0x1a, 0x00, 0x00, 0x08, 0xe1, 0xa0, 0x80, 0x00, + 0xe1, 0xa0, 0x00, 0x03, 0xe1, 0xa0, 0x30, 0x08, + 0xe1, 0xa0, 0x80, 0x01, 0xe1, 0xa0, 0x10, 0x04, + 0xe1, 0xa0, 0x40, 0x08, 0xe1, 0xa0, 0x80, 0x02, + 0xe1, 0xa0, 0x20, 0x05, 0xe1, 0xa0, 0x50, 0x08, + 0xe0, 0x11, 0x60, 0x80, 0x43, 0xc1, 0x11, 0x02, + 0x42, 0x80, 0x00, 0x01, 0xe0, 0x14, 0x60, 0x83, + 0x43, 0xc4, 0x41, 0x02, 0x42, 0x83, 0x30, 0x01, + 0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03, + 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, + 0xe0, 0x49, 0x30, 0x08, 0xe2, 0x83, 0x3c, 0x3f, + 0xe2, 0x83, 0x30, 0xff, 0xe9, 0x2d, 0x40, 0x00, + 0xe3, 0x11, 0x01, 0x02, 0x0b, 0x00, 0x04, 0x30, + 0xe3, 0x14, 0x01, 0x02, 0x0b, 0x00, 0x04, 0x15, + 0xe8, 0xbd, 0x40, 0x00, 0xea, 0xff, 0xfe, 0xb6, + 0xe3, 0x19, 0x01, 0x02, 0x0a, 0x00, 0x00, 0x05, + 0xe1, 0x82, 0x80, 0x81, 0xe1, 0x88, 0x80, 0x05, + 0xe1, 0x98, 0x80, 0x84, 0x1a, 0x00, 0x04, 0x45, + 0xe3, 0x80, 0x04, 0x61, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0x92, 0x80, 0x81, 0x1a, 0x00, 0x04, 0x52, + 0xe0, 0x20, 0x80, 0x03, 0xe2, 0x08, 0x81, 0x02, + 0xe3, 0x1b, 0x00, 0x04, 0x02, 0x8f, 0x00, 0x50, + 0x12, 0x8f, 0x00, 0x40, 0xe8, 0x90, 0x00, 0x07, + 0xe1, 0x80, 0x00, 0x08, 0xe3, 0xa0, 0x30, 0x00, + 0xe3, 0xa0, 0x60, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0x95, 0x80, 0x84, 0x1a, 0x00, 0x04, 0x3d, + 0xe0, 0x20, 0x80, 0x03, 0xe2, 0x08, 0x81, 0x02, + 0xe3, 0x1b, 0x00, 0x04, 0x12, 0x8f, 0x00, 0x20, + 0x02, 0x8f, 0x00, 0x10, 0xe8, 0x90, 0x00, 0x07, + 0xe1, 0x80, 0x00, 0x08, 0xe3, 0xa0, 0x30, 0x00, + 0xe3, 0xa0, 0x60, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7f, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe9, 0x2d, 0x40, 0x00, 0xe1, 0xa0, 0x68, 0x80, + 0xe0, 0x56, 0x88, 0x83, 0xe0, 0x20, 0xe0, 0x03, + 0xe2, 0x00, 0x01, 0x02, 0xe1, 0xa0, 0x38, 0xa6, + 0x8a, 0x00, 0x00, 0x1a, 0x01, 0xa0, 0x90, 0x08, + 0x0a, 0x00, 0x00, 0x2e, 0xe2, 0x68, 0x60, 0x00, + 0xe1, 0xa0, 0x68, 0xa6, 0xe0, 0x83, 0x30, 0x06, + 0xe1, 0xa0, 0x92, 0xa6, 0xe1, 0xc6, 0x62, 0x89, + 0xe3, 0x59, 0x00, 0x02, 0x33, 0x39, 0x00, 0x00, + 0xe2, 0x66, 0x90, 0x20, 0xe1, 0xa0, 0x89, 0x12, + 0xe1, 0xa0, 0x26, 0x32, 0xe1, 0x82, 0x29, 0x11, + 0xe1, 0xa0, 0x16, 0x31, 0x0a, 0x00, 0x00, 0x03, + 0x11, 0x88, 0x81, 0x08, 0x11, 0x82, 0x81, 0x28, + 0x11, 0xa0, 0x20, 0x01, 0x13, 0xa0, 0x10, 0x00, + 0x3a, 0x00, 0x00, 0x04, 0x21, 0x88, 0x80, 0x02, + 0x21, 0x88, 0x81, 0x08, 0x21, 0x81, 0x81, 0x28, + 0x23, 0xa0, 0x20, 0x00, 0x23, 0xa0, 0x10, 0x00, + 0xe3, 0xa0, 0x90, 0x00, 0xea, 0x00, 0x00, 0x15, + 0xe1, 0xa0, 0x68, 0xa8, 0xe1, 0xa0, 0x82, 0xa6, + 0xe1, 0xc6, 0x62, 0x88, 0xe3, 0x58, 0x00, 0x02, + 0x33, 0x38, 0x00, 0x00, 0xe2, 0x66, 0x80, 0x20, + 0xe1, 0xa0, 0x98, 0x15, 0xe1, 0xa0, 0x56, 0x35, + 0xe1, 0x85, 0x58, 0x14, 0xe1, 0xa0, 0x46, 0x34, + 0x0a, 0x00, 0x00, 0x03, 0x11, 0x89, 0x91, 0x09, + 0x11, 0x85, 0x91, 0x29, 0x11, 0xa0, 0x50, 0x04, + 0x13, 0xa0, 0x40, 0x00, 0x3a, 0x00, 0x00, 0x04, + 0x21, 0x89, 0x90, 0x05, 0x21, 0x89, 0x91, 0x09, + 0x21, 0x84, 0x91, 0x29, 0x23, 0xa0, 0x50, 0x00, + 0x23, 0xa0, 0x40, 0x00, 0xe3, 0xa0, 0x80, 0x00, + 0xe3, 0x1e, 0x01, 0x02, 0x1a, 0x00, 0x00, 0x09, + 0xe0, 0x98, 0x60, 0x09, 0xe0, 0xb2, 0x20, 0x05, + 0xe0, 0xb1, 0x10, 0x04, 0x38, 0xbd, 0x80, 0x00, + 0xe2, 0x83, 0x30, 0x01, 0xe1, 0xb0, 0x10, 0x61, + 0xe1, 0xb0, 0x20, 0x62, 0xe1, 0x86, 0x60, 0x86, + 0xe1, 0xa0, 0x60, 0x66, 0xe8, 0xbd, 0x80, 0x00, + 0xe0, 0x58, 0x60, 0x09, 0xe0, 0xd2, 0x20, 0x05, + 0xe0, 0xd1, 0x10, 0x04, 0x2a, 0x00, 0x00, 0x03, + 0xe2, 0x20, 0x01, 0x02, 0xe2, 0x76, 0x60, 0x00, + 0xe2, 0xf2, 0x20, 0x00, 0xe2, 0xe1, 0x10, 0x00, + 0xe3, 0x11, 0x01, 0x02, 0x18, 0xbd, 0x80, 0x00, + 0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02, + 0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01, + 0xe3, 0x11, 0x01, 0x02, 0x18, 0xbd, 0x80, 0x00, + 0xe1, 0x91, 0xe0, 0x02, 0x1b, 0x00, 0x03, 0x7e, + 0x18, 0xbd, 0x80, 0x00, 0xe3, 0xa0, 0x00, 0x00, + 0xe3, 0xa0, 0x10, 0x00, 0xe2, 0x8d, 0xd0, 0x04, + 0xe8, 0xbd, 0x4b, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x98, 0x83, 0xe3, 0x79, 0x08, 0x02, + 0x30, 0x09, 0x90, 0x04, 0xe0, 0x19, 0x90, 0x83, + 0xe1, 0xa0, 0x88, 0x80, 0xe3, 0x78, 0x08, 0x02, + 0x30, 0x08, 0x80, 0x01, 0xe0, 0x18, 0x80, 0x80, + 0x4a, 0x00, 0x00, 0x14, 0xe3, 0x19, 0x01, 0x02, + 0x1a, 0x00, 0x00, 0x22, 0xe9, 0x2d, 0x40, 0x00, + 0xe0, 0x11, 0x60, 0x80, 0x43, 0xc1, 0x11, 0x02, + 0x42, 0x80, 0x00, 0x01, 0xe0, 0x14, 0x60, 0x83, + 0x43, 0xc4, 0x41, 0x02, 0x42, 0x83, 0x30, 0x01, + 0xe3, 0x10, 0x01, 0x01, 0x11, 0xb0, 0x68, 0x80, + 0x1b, 0x00, 0x02, 0xe6, 0xe3, 0x13, 0x01, 0x01, + 0x11, 0xb0, 0x68, 0x83, 0x1b, 0x00, 0x03, 0x1d, + 0xeb, 0xff, 0xff, 0x8a, 0xe3, 0x11, 0x01, 0x02, + 0x18, 0xbd, 0x80, 0x00, 0xe1, 0x91, 0xe0, 0x02, + 0x1b, 0x00, 0x03, 0x5b, 0xe8, 0xbd, 0x80, 0x00, + 0xe3, 0x19, 0x01, 0x02, 0x0a, 0x00, 0x00, 0x09, + 0xe1, 0x82, 0x80, 0x81, 0xe1, 0x88, 0x80, 0x05, + 0xe1, 0x98, 0x80, 0x84, 0x1a, 0x00, 0x03, 0xa5, + 0xe0, 0x23, 0x85, 0x0b, 0xe0, 0x38, 0x80, 0x00, + 0x52, 0x00, 0x81, 0x02, 0x5a, 0x00, 0x00, 0x0a, + 0xe3, 0x80, 0x04, 0x61, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0x92, 0x80, 0x81, 0x1a, 0x00, 0x03, 0xae, + 0xe2, 0x00, 0x81, 0x02, 0xea, 0x00, 0x00, 0x04, + 0xe1, 0x95, 0x80, 0x84, 0x1a, 0x00, 0x03, 0xa1, + 0xe2, 0x03, 0x81, 0x02, 0xe3, 0x1b, 0x06, 0x02, + 0x12, 0x28, 0x81, 0x02, 0xe3, 0x1b, 0x06, 0x01, + 0x12, 0x28, 0x81, 0x02, 0xe2, 0x8f, 0x00, 0x14, + 0xe8, 0x90, 0x00, 0x07, 0xe1, 0x80, 0x00, 0x08, + 0xe1, 0xa0, 0xf0, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x49, 0x02, + 0xf0, 0x00, 0xf9, 0x2a, 0xbc, 0x08, 0x47, 0x18, + 0xff, 0xff, 0xff, 0xfd, 0xb5, 0x80, 0x1c, 0x07, + 0x28, 0x0a, 0xd2, 0x14, 0xa3, 0x01, 0x5c, 0x1b, + 0x00, 0x5b, 0x44, 0x9f, 0x10, 0x04, 0x10, 0x06, + 0x08, 0x0a, 0x0c, 0x10, 0x0e, 0x0e, 0xa0, 0x0f, + 0xe0, 0x0c, 0xa0, 0x1a, 0xe0, 0x0a, 0xa0, 0x33, + 0xe0, 0x08, 0xa0, 0x3f, 0xe0, 0x06, 0xa0, 0x4b, + 0xe0, 0x04, 0xa0, 0x52, 0xe0, 0x02, 0x1c, 0x38, + 0xf0, 0x00, 0xff, 0x71, 0x21, 0x03, 0xf0, 0x00, + 0xf9, 0x27, 0x2f, 0x04, 0xd1, 0x05, 0x20, 0x01, + 0xf7, 0xfd, 0xfc, 0x2c, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0xf7, 0xfe, 0xfc, 0xd3, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x41, 0x62, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x61, + 0x62, 0x6f, 0x72, 0x74, 0x28, 0x29, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x29, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x6c, 0x6c, 0x65, + 0x67, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, + 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x6f, + 0x64, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x75, + 0x70, 0x74, 0x65, 0x64, 0x29, 0x0a, 0x5b, 0x69, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x65, 0x6d, 0x75, + 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x3f, + 0x5d, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x72, 0x75, 0x70, 0x74, 0x20, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x20, 0x2d, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, + 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x77, 0x69, + 0x6c, 0x64, 0x6c, 0x79, 0x20, 0x6f, 0x75, 0x74, + 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x73, 0x29, 0x00, 0x00, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x73, 0x65, 0x72, + 0x2d, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x00, + 0xb5, 0x00, 0x20, 0x01, 0x49, 0x05, 0x70, 0x08, + 0xa0, 0x05, 0x21, 0x03, 0xf0, 0x00, 0xf8, 0x78, + 0x20, 0x64, 0xf7, 0xfd, 0xfb, 0x7f, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x23, 0x48, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x76, + 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x0a, 0x00, + 0xb5, 0x00, 0x28, 0x07, 0xd1, 0x03, 0xf7, 0xff, + 0xff, 0xe3, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, + 0xff, 0x19, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, + 0xf7, 0xff, 0xff, 0xf2, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x90, 0x28, 0x00, 0xdd, 0x01, 0x28, 0x0b, + 0xdb, 0x05, 0x20, 0x03, 0x49, 0x0b, 0x60, 0x08, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x87, + 0x4b, 0x09, 0x59, 0xd9, 0x4a, 0x09, 0x42, 0x91, + 0xd1, 0x02, 0xf7, 0xff, 0xff, 0xdd, 0xe0, 0x05, + 0x4c, 0x07, 0x42, 0xa1, 0xd0, 0x02, 0x51, 0xda, + 0xf7, 0xfb, 0xfe, 0x9c, 0x20, 0x00, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0x30, + 0x2e, 0x08, 0xd2, 0x18, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x28, 0x00, 0xdd, 0x09, + 0x28, 0x0b, 0xda, 0x07, 0x00, 0x80, 0x49, 0x04, + 0x58, 0x08, 0x49, 0x04, 0x42, 0x88, 0xd0, 0x01, + 0x20, 0x01, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, + 0x2e, 0x08, 0xd2, 0x18, 0xff, 0xff, 0xff, 0xff, + 0x28, 0x00, 0xdd, 0x01, 0x28, 0x0b, 0xdb, 0x01, + 0x48, 0x03, 0x47, 0x70, 0x00, 0x83, 0x4a, 0x03, + 0x58, 0xd0, 0x50, 0xd1, 0x47, 0x70, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xfe, 0x2e, 0x08, 0xd2, 0x18, + 0xb5, 0x90, 0x27, 0x01, 0x4c, 0x05, 0x1c, 0x38, + 0x1c, 0x21, 0xf7, 0xff, 0xff, 0xe9, 0x37, 0x01, + 0x2f, 0x0b, 0xdb, 0xf8, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0x48, 0x12, + 0x28, 0x00, 0xd0, 0x09, 0x48, 0x11, 0x78, 0x00, + 0x28, 0x00, 0xd1, 0x05, 0x1c, 0x38, 0x1c, 0x21, + 0xf0, 0x00, 0xfb, 0x2c, 0x28, 0x00, 0xd1, 0x13, + 0x08, 0x60, 0xd3, 0x02, 0x20, 0x0a, 0xf0, 0x00, + 0xf8, 0xd3, 0x78, 0x38, 0x28, 0x00, 0xd0, 0x06, + 0x78, 0x38, 0x37, 0x01, 0xf0, 0x00, 0xf8, 0xcc, + 0x78, 0x38, 0x28, 0x00, 0xd1, 0xf8, 0x08, 0xa0, + 0xd3, 0x02, 0x20, 0x0a, 0xf0, 0x00, 0xf8, 0xc4, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x02, 0x2b, 0xa9, 0x2e, 0x08, 0x23, 0x48, + 0xb5, 0x80, 0xb0, 0x83, 0x90, 0x00, 0x91, 0x01, + 0xf7, 0xfb, 0xfe, 0xf8, 0x90, 0x02, 0x46, 0x69, + 0x20, 0x01, 0xf0, 0x01, 0xf8, 0x49, 0x23, 0x01, + 0x1c, 0x07, 0x42, 0xd8, 0xd1, 0x05, 0x21, 0x00, + 0x20, 0x13, 0xf0, 0x01, 0xf8, 0x41, 0x49, 0x03, + 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x03, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0x30, + 0xb5, 0x80, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, + 0x20, 0x02, 0xf0, 0x01, 0xf8, 0x31, 0x1c, 0x07, + 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, + 0xf8, 0x2b, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, + 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x21, 0x30, 0xb5, 0x80, 0xb0, 0x84, + 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x46, 0x69, + 0x20, 0x05, 0xf0, 0x01, 0xf8, 0x19, 0x1c, 0x07, + 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, + 0xf8, 0x13, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, + 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x21, 0x30, 0xb5, 0x80, 0xb0, 0x84, + 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x93, 0x03, + 0x46, 0x69, 0x20, 0x06, 0xf0, 0x01, 0xf8, 0x00, + 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, + 0xf0, 0x00, 0xff, 0xfa, 0x49, 0x03, 0x60, 0x08, + 0x1c, 0x38, 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x30, + 0xb5, 0x00, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, + 0x20, 0x08, 0xf0, 0x00, 0xff, 0xe9, 0xb0, 0x01, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x69, 0x40, + 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, 0x20, 0x09, + 0xf0, 0x00, 0xff, 0xde, 0xb0, 0x01, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x80, 0xb0, 0x82, 0x90, 0x00, + 0x91, 0x01, 0x46, 0x69, 0x20, 0x0a, 0xf0, 0x00, + 0xff, 0xd3, 0x1c, 0x07, 0xd5, 0x05, 0x21, 0x00, + 0x20, 0x13, 0xf0, 0x00, 0xff, 0xcd, 0x49, 0x03, + 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0x30, + 0xb5, 0x80, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, + 0x20, 0x0b, 0xf0, 0x00, 0xff, 0xbd, 0x1c, 0x07, + 0xd5, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, + 0xff, 0xb7, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, + 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x21, 0x30, 0xb5, 0x00, 0xb0, 0x81, + 0x90, 0x00, 0x46, 0x69, 0x20, 0x0c, 0xf0, 0x00, + 0xff, 0xa7, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x00, 0xb0, 0x83, 0x90, 0x00, 0x91, 0x01, + 0x92, 0x02, 0x46, 0x69, 0x20, 0x0d, 0xf0, 0x00, + 0xff, 0x9b, 0xb0, 0x03, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x01, 0x46, 0x69, 0x20, 0x03, 0xf0, 0x00, + 0xff, 0x93, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x80, 0xb0, 0x82, 0x90, 0x00, 0xf7, 0xfb, + 0xfe, 0x35, 0x90, 0x01, 0x46, 0x69, 0x20, 0x12, + 0xf0, 0x00, 0xff, 0x86, 0x1c, 0x07, 0xd0, 0x05, + 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x80, + 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x02, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x21, 0x30, 0xb5, 0x80, 0xb0, 0x82, + 0x90, 0x00, 0xf7, 0xfb, 0xfe, 0x1b, 0x90, 0x01, + 0x46, 0x69, 0x20, 0x0e, 0xf0, 0x00, 0xff, 0x6c, + 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, + 0xf0, 0x00, 0xff, 0x66, 0x49, 0x03, 0x60, 0x08, + 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x30, + 0xb5, 0x80, 0xb0, 0x84, 0x90, 0x00, 0x1c, 0x0f, + 0xf7, 0xfb, 0xfe, 0x00, 0x90, 0x01, 0x97, 0x02, + 0x1c, 0x38, 0xf7, 0xfb, 0xfd, 0xfb, 0x90, 0x03, + 0x46, 0x69, 0x20, 0x0f, 0xf0, 0x00, 0xff, 0x4c, + 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, + 0xf0, 0x00, 0xff, 0x46, 0x49, 0x03, 0x60, 0x08, + 0x1c, 0x38, 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x30, + 0xb5, 0x80, 0xb0, 0x82, 0x4f, 0x08, 0x97, 0x00, + 0x20, 0xff, 0x30, 0x01, 0x90, 0x01, 0x46, 0x69, + 0x20, 0x15, 0xf0, 0x00, 0xff, 0x31, 0x28, 0x00, + 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x1c, 0x38, + 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xd2, 0x48, 0xb5, 0x00, 0x21, 0x00, + 0x20, 0x10, 0xf0, 0x00, 0xff, 0x21, 0x49, 0x02, + 0x68, 0x09, 0x1a, 0x40, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x23, 0x58, 0xb5, 0x00, 0x21, 0x00, + 0x20, 0x10, 0xf0, 0x00, 0xff, 0x15, 0x49, 0x02, + 0x60, 0x08, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x23, 0x58, 0xb5, 0x80, 0x21, 0x00, + 0x1c, 0x07, 0x20, 0x11, 0xf0, 0x00, 0xff, 0x08, + 0x2f, 0x00, 0xd0, 0x00, 0x60, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x47, 0x70, + 0xb5, 0x80, 0x49, 0x07, 0x68, 0x09, 0xf7, 0xfb, + 0xfc, 0xd9, 0x1c, 0x07, 0xd1, 0x03, 0xa1, 0x05, + 0xa0, 0x05, 0xf0, 0x00, 0xfc, 0xe7, 0x1c, 0x38, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x21, 0x28, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x6f, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x49, 0x2f, 0x4f, 0x20, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, + 0x00, 0x00, 0x00, 0x00, 0x23, 0x80, 0x68, 0xc1, + 0x43, 0x19, 0x60, 0xc1, 0x21, 0x00, 0x60, 0x01, + 0x60, 0x81, 0x47, 0x70, 0xb5, 0xf7, 0x68, 0xd5, + 0x69, 0x56, 0x1c, 0x0c, 0x1c, 0x17, 0x0d, 0x68, + 0xd3, 0x05, 0x23, 0x10, 0x43, 0x1d, 0x1c, 0x30, + 0xf7, 0xff, 0xff, 0x14, 0x61, 0xb8, 0x48, 0x12, + 0x40, 0x28, 0xd0, 0x08, 0x69, 0xb9, 0x1c, 0x30, + 0xf7, 0xff, 0xfe, 0xdf, 0x28, 0x00, 0xdb, 0x10, + 0x4b, 0x0e, 0x40, 0x1d, 0x60, 0xfd, 0x99, 0x00, + 0x1c, 0x30, 0x1c, 0x22, 0x1c, 0x2b, 0xf7, 0xff, + 0xfe, 0x8d, 0x00, 0x41, 0x08, 0x49, 0x1a, 0x61, + 0x69, 0xba, 0x18, 0x51, 0x61, 0xb9, 0x28, 0x00, + 0xd0, 0x08, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xce, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xe7, 0xf9, + 0x00, 0x02, 0x00, 0x10, 0xff, 0xfd, 0xff, 0xef, + 0xb5, 0xb0, 0x48, 0x15, 0x68, 0xc1, 0x4b, 0x15, + 0x40, 0x19, 0x1c, 0x1d, 0x42, 0x99, 0xd1, 0x01, + 0xf0, 0x00, 0xfc, 0xd6, 0x48, 0x12, 0x68, 0xc1, + 0x4b, 0x10, 0x40, 0x19, 0x42, 0xa9, 0xd1, 0x01, + 0xf0, 0x00, 0xfc, 0xce, 0x48, 0x0f, 0x68, 0xc1, + 0x4b, 0x0c, 0x40, 0x19, 0x42, 0xa9, 0xd1, 0x01, + 0xf0, 0x00, 0xfc, 0xc6, 0x27, 0x00, 0x4c, 0x0c, + 0x01, 0xb8, 0x19, 0x00, 0x68, 0xc1, 0x4b, 0x07, + 0x40, 0x19, 0x42, 0xa9, 0xd1, 0x01, 0xf0, 0x00, + 0xfc, 0xbb, 0x37, 0x01, 0x2f, 0x0d, 0xdb, 0xf3, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0xd3, 0x48, 0x00, 0x00, 0x02, 0x02, + 0x2e, 0x08, 0xd3, 0x88, 0x2e, 0x08, 0xd3, 0xc8, + 0x2e, 0x08, 0xd4, 0x08, 0xb5, 0xf0, 0x1c, 0x07, + 0x69, 0x04, 0x6a, 0xc0, 0x68, 0x79, 0x42, 0x88, + 0xd9, 0x00, 0x1c, 0x01, 0x68, 0xf8, 0x4b, 0x13, + 0x40, 0x18, 0x07, 0x82, 0x0f, 0x92, 0x25, 0x00, + 0x60, 0xf8, 0x2a, 0x01, 0xd0, 0x1a, 0x22, 0x82, + 0x40, 0x02, 0x15, 0x1e, 0x2a, 0x02, 0xd1, 0x0a, + 0x0c, 0x40, 0xd3, 0x13, 0x42, 0xa1, 0xd0, 0x0a, + 0x1b, 0x09, 0x1c, 0x20, 0x1c, 0x3a, 0xf7, 0xff, + 0xff, 0x75, 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x30, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x62, 0xfc, + 0x60, 0x7c, 0x60, 0xbd, 0x68, 0xf8, 0x4b, 0x04, + 0x40, 0x18, 0x60, 0xf8, 0x1c, 0x28, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xb5, 0x80, 0x1c, 0x07, + 0x68, 0xc0, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, + 0x60, 0xf8, 0x69, 0xb8, 0x6a, 0xb9, 0x42, 0x88, + 0xd0, 0x0d, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xbe, + 0x68, 0xf8, 0x4b, 0x08, 0x40, 0x18, 0x23, 0x10, + 0x43, 0x18, 0x60, 0xf8, 0x6a, 0xb8, 0x61, 0xb8, + 0x69, 0x38, 0x62, 0xf8, 0x60, 0x78, 0x68, 0xf8, + 0x4b, 0x03, 0x40, 0x18, 0x60, 0xf8, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xbf, 0xbf, 0xb5, 0xf0, 0x1c, 0x07, + 0x69, 0x40, 0xb0, 0x83, 0x90, 0x01, 0x69, 0x38, + 0x90, 0x00, 0x25, 0x00, 0x68, 0xfe, 0x07, 0xb0, + 0xd1, 0x01, 0x43, 0xc0, 0xe0, 0x48, 0x09, 0x30, + 0xd2, 0x40, 0x24, 0x10, 0x1c, 0x38, 0xf0, 0x00, + 0xfc, 0x3f, 0x1c, 0x05, 0x0d, 0x70, 0xd3, 0x1b, + 0x24, 0x00, 0x49, 0x21, 0x91, 0x02, 0x01, 0xa0, + 0x99, 0x02, 0x18, 0x40, 0x42, 0xb8, 0xd0, 0x10, + 0x68, 0xc1, 0x07, 0x8a, 0xd0, 0x0d, 0x69, 0x42, + 0x9b, 0x01, 0x42, 0x9a, 0xd1, 0x09, 0x0d, 0x49, + 0xd3, 0x07, 0x68, 0xc1, 0x4b, 0x19, 0x40, 0x19, + 0x60, 0xc1, 0x68, 0xf8, 0x40, 0x18, 0x60, 0xf8, + 0xe0, 0x02, 0x34, 0x01, 0x2c, 0x10, 0xdb, 0xe6, + 0x2c, 0x10, 0xd1, 0x06, 0x98, 0x01, 0xf7, 0xff, + 0xfd, 0x9b, 0x28, 0x00, 0xda, 0x01, 0x25, 0x00, + 0x43, 0xed, 0x0b, 0x30, 0xd3, 0x04, 0x98, 0x00, + 0x49, 0x0f, 0x68, 0x09, 0xf7, 0xfb, 0xfb, 0xa6, + 0x0d, 0xf0, 0x05, 0xc0, 0x23, 0xa5, 0x05, 0xdb, + 0x42, 0xd8, 0xd1, 0x07, 0x48, 0x0b, 0x28, 0x00, + 0xd0, 0x04, 0x1c, 0x38, 0x1c, 0x29, 0xf7, 0xff, + 0xff, 0xfe, 0x1c, 0x05, 0x22, 0x40, 0x21, 0x00, + 0x1c, 0x38, 0xf7, 0xfb, 0xfc, 0xe7, 0x1c, 0x28, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xd3, 0x48, 0xff, 0xef, 0xff, 0xff, + 0x2e, 0x08, 0x21, 0x2c, 0x00, 0x00, 0x00, 0x00, + 0xb5, 0xf7, 0x1c, 0x10, 0x1c, 0x0c, 0x1c, 0x17, + 0xf7, 0xff, 0xff, 0x98, 0x78, 0x20, 0x34, 0x01, + 0x28, 0x61, 0xd0, 0x09, 0x28, 0x72, 0xd0, 0x04, + 0x28, 0x77, 0xd1, 0x25, 0x26, 0x02, 0x25, 0x04, + 0xe0, 0x04, 0x26, 0x01, 0x25, 0x00, 0xe0, 0x01, + 0x4e, 0x1a, 0x25, 0x08, 0x78, 0x20, 0x34, 0x01, + 0x28, 0x2b, 0xd0, 0x06, 0x28, 0x62, 0xd1, 0x09, + 0x23, 0x04, 0x43, 0x1e, 0x23, 0x01, 0x43, 0x1d, + 0xe7, 0xf4, 0x23, 0x03, 0x43, 0x1e, 0x23, 0x02, + 0x43, 0x1d, 0xe7, 0xef, 0x1f, 0xe0, 0x38, 0x19, + 0x7f, 0xc0, 0x28, 0x74, 0xd1, 0x01, 0x23, 0x10, + 0x43, 0x1d, 0x98, 0x00, 0x1c, 0x29, 0xf7, 0xff, + 0xfd, 0x23, 0x23, 0x01, 0x42, 0xd8, 0xd1, 0x04, + 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x00, 0x60, 0x79, 0x61, 0x39, + 0x21, 0x01, 0x03, 0x09, 0x61, 0x78, 0x61, 0xf9, + 0x60, 0xfe, 0x09, 0x28, 0xd3, 0x04, 0x22, 0x02, + 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xfb, 0xc4, + 0x1c, 0x38, 0xe7, 0xea, 0x00, 0x00, 0x80, 0x02, + 0xb5, 0x90, 0x23, 0x03, 0x4f, 0x08, 0x01, 0x9a, + 0x19, 0xd2, 0x68, 0xd4, 0x07, 0xa4, 0xd1, 0x04, + 0xf7, 0xff, 0xff, 0xaa, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x33, 0x01, 0x2b, 0x10, 0xdb, 0xf2, + 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xd3, 0x48, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x0f, 0x4d, 0x10, 0x68, 0xe8, 0x08, 0x80, + 0xd3, 0x18, 0x20, 0x01, 0x4e, 0x0e, 0x70, 0x30, + 0x40, 0x38, 0xd0, 0x03, 0x20, 0x0a, 0x1c, 0x29, + 0xf0, 0x00, 0xfc, 0x1e, 0x1c, 0x20, 0x1c, 0x29, + 0xf0, 0x00, 0xfc, 0x2c, 0x08, 0xb8, 0xd3, 0x03, + 0x20, 0x0a, 0x1c, 0x29, 0xf0, 0x00, 0xfc, 0x14, + 0x20, 0x00, 0x70, 0x30, 0x20, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0xd3, 0xc8, + 0x2e, 0x08, 0x23, 0x48, 0xb5, 0x80, 0x1c, 0x07, + 0xa0, 0x06, 0x21, 0x01, 0xf7, 0xff, 0xfc, 0x98, + 0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x94, + 0x20, 0x01, 0xf7, 0xfc, 0xff, 0x95, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x43, 0x6f, 0x75, 0x6c, + 0x64, 0x6e, 0x27, 0x74, 0x20, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x00, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x15, 0x1c, 0x0f, 0x48, 0x20, 0x22, 0x01, + 0x02, 0x92, 0x21, 0x00, 0x1c, 0x06, 0xf7, 0xfb, + 0xfc, 0x2d, 0x4a, 0x1e, 0x1c, 0x28, 0xa1, 0x1e, + 0xf7, 0xff, 0xff, 0x4e, 0x28, 0x00, 0xd1, 0x02, + 0x1c, 0x28, 0xf7, 0xff, 0xff, 0xd3, 0x1c, 0x20, + 0x1c, 0x32, 0xa1, 0x1a, 0xf7, 0xff, 0xff, 0x44, + 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x20, 0xf7, 0xff, + 0xff, 0xc9, 0x4a, 0x17, 0x1c, 0x38, 0x1c, 0x15, + 0xa1, 0x13, 0xf7, 0xff, 0xff, 0x39, 0x28, 0x00, + 0xd1, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xbe, + 0x1c, 0x30, 0x26, 0x01, 0x03, 0x36, 0x08, 0xf2, + 0x21, 0x00, 0x1c, 0x33, 0xf0, 0x00, 0xf8, 0x52, + 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x20, 0xf7, 0xff, + 0xff, 0xb1, 0x22, 0x01, 0x02, 0x52, 0x21, 0x00, + 0x1c, 0x28, 0x1c, 0x33, 0xf0, 0x00, 0xf8, 0x46, + 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38, 0xf7, 0xff, + 0xff, 0xa5, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0xd3, 0x48, 0x2e, 0x08, 0xd3, 0xc8, + 0x77, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0xd3, 0x88, 0xb5, 0x90, 0x27, 0x03, + 0x4c, 0x09, 0x01, 0xb8, 0x19, 0x00, 0xf7, 0xff, + 0xfe, 0xa5, 0x37, 0x01, 0x2f, 0x10, 0xdb, 0xf8, + 0x27, 0x00, 0x01, 0xb8, 0x19, 0x00, 0xf7, 0xff, + 0xfe, 0x9d, 0x37, 0x01, 0x2f, 0x03, 0xdb, 0xf8, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0xd3, 0x48, 0xb5, 0xb0, 0x01, 0x80, + 0x1c, 0x0f, 0x4c, 0x0a, 0x19, 0x00, 0x1c, 0x05, + 0xf7, 0xff, 0xfe, 0x8c, 0x01, 0xb8, 0x19, 0x00, + 0x23, 0x01, 0x05, 0x1b, 0x68, 0xc1, 0x43, 0x19, + 0x60, 0xc1, 0x4b, 0x05, 0x40, 0x19, 0x60, 0xe9, + 0x69, 0x40, 0x61, 0x68, 0x1c, 0x38, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0xd3, 0x48, + 0x00, 0x10, 0x8f, 0x03, 0xb4, 0xf0, 0x1c, 0x1f, + 0x68, 0xc3, 0x07, 0x9e, 0x0f, 0xb6, 0x25, 0x01, + 0x1c, 0x1c, 0x2e, 0x00, 0xd0, 0x13, 0x1c, 0x1e, + 0x0d, 0xf3, 0xd2, 0x10, 0x02, 0x2b, 0x42, 0x9a, + 0xd0, 0x09, 0x00, 0x5b, 0x42, 0x9a, 0xd0, 0x06, + 0x00, 0x5b, 0x42, 0x9a, 0xd1, 0x07, 0x27, 0x01, + 0x1d, 0xc1, 0x31, 0x1d, 0xe0, 0x06, 0x1e, 0x7e, + 0x4b, 0x08, 0x42, 0x9e, 0xd3, 0x02, 0x1c, 0x28, + 0xbc, 0xf0, 0x47, 0x70, 0x61, 0x01, 0x23, 0x0f, + 0x02, 0x1b, 0x43, 0x9c, 0x60, 0x41, 0x61, 0xc7, + 0x1c, 0x21, 0x43, 0x11, 0x60, 0xc1, 0x20, 0x00, + 0xbc, 0xf0, 0x47, 0x70, 0x00, 0xff, 0xff, 0xff, + 0xe2, 0x00, 0x01, 0x02, 0xe3, 0x31, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x17, 0xe3, 0xa0, 0x80, 0x00, + 0xe1, 0xb0, 0x98, 0x21, 0x01, 0xa0, 0x18, 0x01, + 0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x21, + 0x01, 0xa0, 0x14, 0x01, 0x02, 0x88, 0x80, 0x08, + 0xe1, 0xb0, 0x9e, 0x21, 0x01, 0xa0, 0x12, 0x01, + 0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x21, + 0x01, 0xa0, 0x11, 0x01, 0x02, 0x88, 0x80, 0x02, + 0xe1, 0xb0, 0x9f, 0xa1, 0x01, 0xa0, 0x10, 0x81, + 0x02, 0x88, 0x80, 0x01, 0xe0, 0x58, 0x98, 0xa6, + 0x81, 0xa0, 0x19, 0x31, 0x81, 0xa0, 0x88, 0xa6, + 0xe2, 0x68, 0x60, 0x20, 0xe1, 0x81, 0x16, 0x32, + 0xe1, 0xa0, 0x28, 0x12, 0x30, 0x40, 0x00, 0x09, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x56, 0x05, 0x01, + 0x3a, 0x00, 0x00, 0x16, 0xe1, 0xb0, 0x10, 0x02, + 0x01, 0xa0, 0xf0, 0x0e, 0xe3, 0xa0, 0x20, 0x00, + 0xe3, 0xa0, 0x80, 0x20, 0xe1, 0xb0, 0x98, 0x21, + 0x01, 0xa0, 0x18, 0x01, 0x02, 0x88, 0x80, 0x10, + 0xe1, 0xb0, 0x9c, 0x21, 0x01, 0xa0, 0x14, 0x01, + 0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x21, + 0x01, 0xa0, 0x12, 0x01, 0x02, 0x88, 0x80, 0x04, + 0xe1, 0xb0, 0x9f, 0x21, 0x01, 0xa0, 0x11, 0x01, + 0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa1, + 0x01, 0xa0, 0x10, 0x81, 0x02, 0x88, 0x80, 0x01, + 0xe0, 0x58, 0x98, 0xa6, 0x81, 0xa0, 0x19, 0x31, + 0x30, 0x40, 0x00, 0x09, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0xa0, 0x88, 0xa6, 0xe2, 0x68, 0x90, 0x20, + 0xe1, 0xa0, 0x18, 0x11, 0xe1, 0x81, 0x19, 0x32, + 0xe1, 0xa0, 0x28, 0x12, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe2, 0x03, 0x31, 0x02, 0xe3, 0x34, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x17, 0xe3, 0xa0, 0x80, 0x00, + 0xe1, 0xb0, 0x98, 0x24, 0x01, 0xa0, 0x48, 0x04, + 0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x24, + 0x01, 0xa0, 0x44, 0x04, 0x02, 0x88, 0x80, 0x08, + 0xe1, 0xb0, 0x9e, 0x24, 0x01, 0xa0, 0x42, 0x04, + 0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x24, + 0x01, 0xa0, 0x41, 0x04, 0x02, 0x88, 0x80, 0x02, + 0xe1, 0xb0, 0x9f, 0xa4, 0x01, 0xa0, 0x40, 0x84, + 0x02, 0x88, 0x80, 0x01, 0xe0, 0x58, 0x98, 0xa6, + 0x81, 0xa0, 0x49, 0x34, 0x81, 0xa0, 0x88, 0xa6, + 0xe2, 0x68, 0x60, 0x20, 0xe1, 0x84, 0x46, 0x35, + 0xe1, 0xa0, 0x58, 0x15, 0x30, 0x43, 0x30, 0x09, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x56, 0x05, 0x01, + 0x3a, 0x00, 0x00, 0x16, 0xe1, 0xb0, 0x40, 0x05, + 0x01, 0xa0, 0xf0, 0x0e, 0xe3, 0xa0, 0x50, 0x00, + 0xe3, 0xa0, 0x80, 0x20, 0xe1, 0xb0, 0x98, 0x24, + 0x01, 0xa0, 0x48, 0x04, 0x02, 0x88, 0x80, 0x10, + 0xe1, 0xb0, 0x9c, 0x24, 0x01, 0xa0, 0x44, 0x04, + 0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x24, + 0x01, 0xa0, 0x42, 0x04, 0x02, 0x88, 0x80, 0x04, + 0xe1, 0xb0, 0x9f, 0x24, 0x01, 0xa0, 0x41, 0x04, + 0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa4, + 0x01, 0xa0, 0x40, 0x84, 0x02, 0x88, 0x80, 0x01, + 0xe0, 0x58, 0x98, 0xa6, 0x81, 0xa0, 0x49, 0x34, + 0x30, 0x43, 0x30, 0x09, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe1, 0xa0, 0x88, 0xa6, 0xe2, 0x68, 0x90, 0x20, + 0xe1, 0xa0, 0x48, 0x14, 0xe1, 0x84, 0x49, 0x35, + 0xe1, 0xa0, 0x58, 0x15, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe3, 0xa0, 0x20, 0x00, 0xe2, 0x16, 0x01, 0x02, + 0x12, 0x66, 0x10, 0x00, 0x01, 0xb0, 0x10, 0x06, + 0x03, 0xa0, 0x30, 0x00, 0x01, 0xa0, 0xf0, 0x0e, + 0xe3, 0xa0, 0x39, 0x01, 0xe3, 0x83, 0x30, 0x1e, + 0xe3, 0xa0, 0x60, 0x00, 0xe3, 0x31, 0x00, 0x00, + 0x01, 0xa0, 0x10, 0x02, 0x03, 0xa0, 0x20, 0x00, + 0x02, 0x43, 0x30, 0x20, 0xe3, 0xa0, 0x80, 0x00, + 0xe1, 0xb0, 0x98, 0x21, 0x01, 0xa0, 0x18, 0x01, + 0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x21, + 0x01, 0xa0, 0x14, 0x01, 0x02, 0x88, 0x80, 0x08, + 0xe1, 0xb0, 0x9e, 0x21, 0x01, 0xa0, 0x12, 0x01, + 0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x21, + 0x01, 0xa0, 0x11, 0x01, 0x02, 0x88, 0x80, 0x02, + 0xe1, 0xb0, 0x9f, 0xa1, 0x01, 0xa0, 0x10, 0x81, + 0x02, 0x88, 0x80, 0x01, 0xe2, 0x78, 0x90, 0x20, + 0xe1, 0x81, 0x19, 0x32, 0xe1, 0xa0, 0x28, 0x12, + 0xe0, 0x43, 0x30, 0x08, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe3, 0x34, 0x00, 0x00, 0x01, 0xa0, 0x40, 0x05, + 0x03, 0xa0, 0x50, 0x00, 0x02, 0x43, 0x30, 0x20, + 0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x24, + 0x01, 0xa0, 0x48, 0x04, 0x02, 0x88, 0x80, 0x10, + 0xe1, 0xb0, 0x9c, 0x24, 0x01, 0xa0, 0x44, 0x04, + 0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x24, + 0x01, 0xa0, 0x42, 0x04, 0x02, 0x88, 0x80, 0x04, + 0xe1, 0xb0, 0x9f, 0x24, 0x01, 0xa0, 0x41, 0x04, + 0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa4, + 0x01, 0xa0, 0x40, 0x84, 0x02, 0x88, 0x80, 0x01, + 0xe2, 0x78, 0x90, 0x20, 0xe1, 0x84, 0x49, 0x35, + 0xe1, 0xa0, 0x58, 0x15, 0xe0, 0x43, 0x30, 0x08, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x31, 0x00, 0x00, + 0x01, 0xa0, 0x10, 0x02, 0x03, 0xa0, 0x20, 0x00, + 0x02, 0x83, 0x30, 0x20, 0xe3, 0xa0, 0x80, 0x00, + 0xe1, 0xb0, 0x98, 0x21, 0x01, 0xa0, 0x18, 0x01, + 0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x21, + 0x01, 0xa0, 0x14, 0x01, 0x02, 0x88, 0x80, 0x08, + 0xe1, 0xb0, 0x9e, 0x21, 0x01, 0xa0, 0x12, 0x01, + 0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x21, + 0x01, 0xa0, 0x11, 0x01, 0x02, 0x88, 0x80, 0x02, + 0xe1, 0xb0, 0x9f, 0xa1, 0x01, 0xa0, 0x10, 0x81, + 0x02, 0x88, 0x80, 0x01, 0xe2, 0x78, 0x90, 0x20, + 0xe1, 0x81, 0x19, 0x32, 0xe1, 0xa0, 0x28, 0x12, + 0xe0, 0x83, 0x30, 0x08, 0xe1, 0xa0, 0xf0, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7f, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe1, 0x92, 0x80, 0x81, 0x0a, 0x00, 0x00, 0x05, + 0xe3, 0x11, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x0c, + 0xe1, 0x95, 0x80, 0x84, 0x0a, 0x00, 0x00, 0x0a, + 0xe3, 0x14, 0x01, 0x01, 0x1a, 0x00, 0x00, 0x08, + 0xe3, 0x14, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x28, + 0xe1, 0xa0, 0x00, 0x03, 0xe1, 0xa0, 0x10, 0x04, + 0xe1, 0xa0, 0x20, 0x05, 0xea, 0x00, 0x00, 0x04, + 0xe3, 0x11, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x22, + 0xea, 0x00, 0x00, 0x01, 0xe3, 0x11, 0x01, 0x01, + 0x0a, 0x00, 0x00, 0x1f, 0xe3, 0x1b, 0x00, 0x01, + 0x1a, 0x00, 0x00, 0x16, 0xe3, 0x1b, 0x00, 0x02, + 0x1a, 0x00, 0x00, 0x0c, 0xe3, 0x1b, 0x0c, 0x02, + 0x1a, 0x00, 0x00, 0x05, 0xe3, 0xc0, 0x81, 0x03, + 0xe3, 0xa0, 0x90, 0xff, 0xe3, 0x89, 0x9c, 0x43, + 0xe1, 0x58, 0x00, 0x09, 0x33, 0xc2, 0x20, 0x01, + 0x03, 0x82, 0x20, 0x01, 0xe2, 0x00, 0x01, 0x03, + 0xe3, 0x80, 0x00, 0xff, 0xe3, 0x80, 0x0c, 0x7f, + 0xe1, 0x30, 0x00, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe2, 0x00, 0x01, 0x03, 0xe3, 0x80, 0x00, 0xff, + 0xe3, 0x80, 0x0c, 0x43, 0xe1, 0xa0, 0x25, 0xa2, + 0xe1, 0xa0, 0x25, 0x82, 0xe3, 0x81, 0x11, 0x02, + 0xe1, 0x30, 0x00, 0x00, 0xe1, 0xa0, 0xf0, 0x0e, + 0xe2, 0x00, 0x01, 0x03, 0xe3, 0x80, 0x00, 0x7f, + 0xe3, 0x80, 0x09, 0x01, 0xe3, 0xa0, 0x20, 0x00, + 0xe3, 0xc1, 0x10, 0xff, 0xe3, 0x81, 0x11, 0x02, + 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x80, 0x04, 0x61, + 0xe1, 0xa0, 0xf0, 0x0e, 0xb5, 0x80, 0x1c, 0x0f, + 0x29, 0x0f, 0xdd, 0x04, 0x11, 0x39, 0xf7, 0xff, + 0xff, 0xf9, 0x07, 0x3f, 0x0f, 0x3f, 0x2f, 0x09, + 0xdd, 0x02, 0x1d, 0xf9, 0x31, 0x29, 0xe0, 0x01, + 0x1d, 0xf9, 0x31, 0x50, 0x70, 0x01, 0x30, 0x01, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, + 0x1c, 0x07, 0x48, 0x0d, 0x68, 0x01, 0x29, 0x00, + 0xd1, 0x12, 0x4c, 0x0c, 0x1c, 0x20, 0xa1, 0x0c, + 0x22, 0x14, 0xf7, 0xfb, 0xf8, 0x67, 0x1d, 0xe0, + 0x30, 0x0b, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0xda, + 0x21, 0x29, 0x70, 0x01, 0x21, 0x00, 0x70, 0x41, + 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x30, 0x08, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x21, 0x4c, 0x2e, 0x08, 0xd7, 0x48, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x28, + 0x30, 0x78, 0x00, 0x00, 0xb5, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0xa0, 0x09, 0x21, 0x01, 0xf7, 0xff, + 0xf9, 0x87, 0x21, 0x00, 0x1c, 0x20, 0xf7, 0xff, + 0xf9, 0x83, 0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, + 0xf9, 0x7f, 0x20, 0x01, 0xf7, 0xfc, 0xfc, 0x80, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2a, 0x2a, 0x2a, 0x20, 0x66, 0x61, 0x74, 0x61, + 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, + 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x74, + 0x69, 0x6d, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x3a, 0x20, 0x00, 0x00, 0x00, 0x00, + 0xb5, 0xb0, 0x1c, 0x07, 0x68, 0xc0, 0x07, 0x81, + 0xd0, 0x1f, 0x23, 0x20, 0x40, 0x18, 0xd0, 0x01, + 0x6a, 0xbd, 0xe0, 0x04, 0x68, 0x79, 0x69, 0xba, + 0x18, 0x89, 0x69, 0x3a, 0x1a, 0x8d, 0x28, 0x00, + 0xd0, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xfb, 0xa2, + 0x68, 0xf8, 0x4b, 0x0a, 0x40, 0x18, 0x60, 0xf8, + 0x1c, 0x38, 0xf7, 0xff, 0xfb, 0x67, 0x1c, 0x04, + 0x22, 0x00, 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x00, + 0xf8, 0x27, 0x1c, 0x20, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, 0xcf, 0xff, + 0xb5, 0xb0, 0x24, 0x00, 0x28, 0x00, 0xd0, 0x03, + 0xf7, 0xff, 0xff, 0xce, 0x1c, 0x04, 0xe0, 0x0c, + 0x27, 0x00, 0x4d, 0x08, 0x01, 0xb8, 0x19, 0x40, + 0xf7, 0xff, 0xff, 0xc6, 0x28, 0x00, 0xd0, 0x01, + 0x24, 0x00, 0x43, 0xe4, 0x37, 0x01, 0x2f, 0x10, + 0xdb, 0xf4, 0x1c, 0x20, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0xd3, 0x48, + 0xb5, 0xf7, 0x68, 0xc5, 0x69, 0x46, 0x1c, 0x0c, + 0x1c, 0x07, 0xb0, 0x81, 0x48, 0x3c, 0x40, 0x28, + 0xd0, 0x04, 0x1c, 0x38, 0xf7, 0xff, 0xf9, 0xaa, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0x02, 0xe0, 0x6a, + 0x9a, 0x03, 0x2a, 0x00, 0xd0, 0x26, 0x2a, 0x01, + 0xd0, 0x0b, 0x2a, 0x02, 0xd1, 0x24, 0x1c, 0x30, + 0xf7, 0xff, 0xf9, 0xd4, 0x28, 0x00, 0xda, 0x09, + 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0xa7, 0x20, 0x01, + 0xe0, 0x59, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x8c, + 0x19, 0x04, 0xe0, 0x13, 0x68, 0x79, 0x6a, 0xfa, + 0x42, 0x8a, 0xd9, 0x00, 0x1c, 0x11, 0x69, 0xba, + 0x18, 0x89, 0x69, 0x3a, 0x1a, 0x89, 0x68, 0xfa, + 0x09, 0x92, 0xd3, 0x03, 0x6a, 0xba, 0x42, 0x8a, + 0xdd, 0x00, 0x1c, 0x11, 0x42, 0x81, 0xdd, 0x00, + 0x1c, 0x08, 0x18, 0x24, 0x2c, 0x00, 0xda, 0x03, + 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x87, 0xe7, 0xcd, + 0x0b, 0xa8, 0xd3, 0x04, 0x68, 0x78, 0x6a, 0xf9, + 0x42, 0x81, 0xd2, 0x00, 0x62, 0xf8, 0x69, 0xb8, + 0x42, 0xa0, 0xdc, 0x10, 0x68, 0x79, 0x6a, 0xfa, + 0x42, 0x8a, 0xd9, 0x01, 0x1c, 0x13, 0xe0, 0x00, + 0x1c, 0x0b, 0x18, 0x1b, 0x69, 0x3e, 0x1b, 0x9b, + 0x42, 0xa3, 0xdb, 0x04, 0x6b, 0x3b, 0x93, 0x00, + 0x18, 0xc3, 0x42, 0xa3, 0xdc, 0x06, 0x20, 0x20, + 0x43, 0x28, 0x21, 0x00, 0x60, 0x39, 0x60, 0xb9, + 0x62, 0xbc, 0xe0, 0x14, 0x1a, 0x24, 0x08, 0xa8, + 0xd3, 0x03, 0x9b, 0x00, 0x1b, 0x18, 0x42, 0x40, + 0x60, 0xb8, 0x08, 0x68, 0xd3, 0x06, 0x42, 0x8a, + 0xd9, 0x00, 0x1c, 0x11, 0x1b, 0x88, 0x1b, 0x00, + 0x42, 0x40, 0x60, 0x38, 0x19, 0x30, 0x23, 0x20, + 0x43, 0x9d, 0x60, 0x78, 0x1c, 0x28, 0x4b, 0x05, + 0x40, 0x18, 0x60, 0xf8, 0x20, 0x00, 0xb0, 0x01, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x10, 0x00, 0x03, 0xff, 0xf7, 0xcf, 0xbf, + 0xb5, 0x00, 0x68, 0x8a, 0x68, 0x4b, 0x3a, 0x01, + 0xd5, 0x03, 0xf0, 0x00, 0xf8, 0x3f, 0xbc, 0x08, + 0x47, 0x18, 0x06, 0x00, 0x0e, 0x00, 0x70, 0x18, + 0x33, 0x01, 0x60, 0x8a, 0x60, 0x4b, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xb5, 0xb0, 0x1c, 0x07, + 0x78, 0x00, 0x1c, 0x0c, 0x37, 0x01, 0x28, 0x00, + 0xd0, 0x0e, 0x25, 0x00, 0x43, 0xed, 0x1c, 0x21, + 0xf0, 0x00, 0xf8, 0xe8, 0x42, 0xa8, 0xd1, 0x03, + 0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x78, 0x38, 0x37, 0x01, 0x28, 0x00, 0xd1, 0xf2, + 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x68, 0xc1, 0x07, 0x8a, 0xd1, 0x04, 0x20, 0x01, + 0x49, 0x09, 0x60, 0x08, 0x42, 0x40, 0x47, 0x70, + 0x09, 0x8a, 0xd3, 0x01, 0x6a, 0x80, 0xe0, 0x04, + 0x68, 0x42, 0x69, 0x83, 0x18, 0xd2, 0x69, 0x00, + 0x1a, 0x10, 0x0d, 0x09, 0xd3, 0xf3, 0x28, 0x00, + 0xdd, 0xf1, 0x38, 0x01, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x21, 0x30, 0xb5, 0xf0, 0x1c, 0x04, + 0x68, 0xc8, 0x1c, 0x0f, 0x4b, 0x5a, 0x40, 0x18, + 0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, 0x60, 0xc8, + 0x09, 0x80, 0xd3, 0x02, 0x1c, 0x38, 0xf7, 0xff, + 0xfa, 0x95, 0x06, 0x26, 0x0e, 0x36, 0x68, 0xb9, + 0x29, 0x00, 0xda, 0x12, 0x68, 0xf8, 0x0a, 0x82, + 0xd2, 0x0f, 0x22, 0x00, 0x43, 0xd2, 0x1a, 0x51, + 0x23, 0x09, 0x03, 0x5b, 0x43, 0x18, 0x60, 0xf8, + 0x60, 0xb9, 0x68, 0x79, 0x70, 0x0e, 0x31, 0x01, + 0x60, 0x79, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0xf8, 0x49, 0x49, 0x40, 0x01, + 0x29, 0x02, 0xd0, 0x03, 0x1c, 0x38, 0xf7, 0xff, + 0xf9, 0xcd, 0xe0, 0x7f, 0x49, 0x46, 0x40, 0x01, + 0x23, 0x01, 0x03, 0xdb, 0x42, 0x99, 0xd1, 0x0b, + 0x22, 0x02, 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff, + 0xfe, 0xfb, 0x68, 0xf8, 0x09, 0x80, 0xd3, 0x02, + 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x63, 0x68, 0xf8, + 0x25, 0x09, 0x03, 0x6d, 0x43, 0x05, 0x60, 0xfd, + 0x69, 0x38, 0x28, 0x00, 0xd1, 0x2f, 0x1c, 0x38, + 0xf7, 0xff, 0xf8, 0xa0, 0x28, 0x00, 0xd0, 0x18, + 0x68, 0xf8, 0x0a, 0x00, 0x07, 0x80, 0xd0, 0x09, + 0x69, 0xf8, 0xf7, 0xff, 0xf9, 0x7d, 0x61, 0x38, + 0x60, 0x78, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x1d, + 0x68, 0xf8, 0xe0, 0x1a, 0x1d, 0xf8, 0x30, 0x1d, + 0x61, 0x38, 0x60, 0x78, 0x20, 0x01, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x1d, 0x61, 0xf8, 0x60, 0xfd, + 0xe0, 0x11, 0x69, 0xf8, 0xf7, 0xff, 0xf9, 0x68, + 0x61, 0x38, 0x60, 0x78, 0x23, 0x01, 0x02, 0xdb, + 0x43, 0x1d, 0x68, 0xf8, 0x43, 0x28, 0x60, 0xf8, + 0x0a, 0x29, 0x07, 0x89, 0xd1, 0x03, 0x08, 0xdb, + 0x43, 0x1d, 0x43, 0x28, 0x60, 0xf8, 0x0a, 0x68, + 0xd3, 0x19, 0x68, 0x78, 0x6a, 0xf9, 0x69, 0x3c, + 0x42, 0x81, 0xd9, 0x00, 0x1c, 0x08, 0x1b, 0x01, + 0xd0, 0x05, 0x1c, 0x20, 0x1c, 0x3a, 0xf7, 0xff, + 0xf9, 0x7d, 0x28, 0x00, 0xd1, 0x26, 0x1c, 0x60, + 0x62, 0xf8, 0x60, 0x78, 0x69, 0xf8, 0x1e, 0x41, + 0x63, 0x38, 0x60, 0xb9, 0x70, 0x26, 0x1c, 0x30, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x69, 0x38, + 0x68, 0x7a, 0x70, 0x14, 0x32, 0x01, 0x60, 0x7a, + 0x6a, 0xf9, 0x42, 0x91, 0xd8, 0x00, 0x1c, 0x11, + 0x1a, 0x09, 0x69, 0xfa, 0x63, 0x3a, 0x0a, 0xeb, + 0xd2, 0x03, 0x2e, 0x0a, 0xd0, 0x01, 0x42, 0x8a, + 0xdc, 0x0d, 0x62, 0xf8, 0x22, 0x00, 0x60, 0x78, + 0x60, 0xba, 0x1c, 0x3a, 0xf7, 0xff, 0xf9, 0x56, + 0x28, 0x00, 0xd0, 0x04, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x30, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0xff, 0xf7, 0xff, 0xff, 0x00, 0x00, 0x10, 0x8a, + 0x00, 0x00, 0xa0, 0x10, 0xb5, 0x00, 0x68, 0x8a, + 0x68, 0x4b, 0x3a, 0x01, 0xd5, 0x03, 0xf7, 0xff, + 0xff, 0x39, 0xbc, 0x08, 0x47, 0x18, 0x06, 0x00, + 0x0e, 0x00, 0x70, 0x18, 0x33, 0x01, 0x60, 0x8a, + 0x60, 0x4b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x47, 0x78, 0x46, 0xc0, 0xe9, 0x2d, 0x40, 0x00, + 0xe2, 0x8f, 0xe0, 0x00, 0xef, 0x12, 0x34, 0x56, + 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x00, 0x18, + 0xe5, 0x9f, 0x10, 0x18, 0xef, 0x12, 0x34, 0x56, + 0xea, 0xff, 0xff, 0xfe, 0xe1, 0xa0, 0x10, 0x00, + 0xe3, 0xa0, 0x00, 0x18, 0xe5, 0x9f, 0x10, 0x08, + 0xef, 0x12, 0x34, 0x56, 0xea, 0xff, 0xff, 0xfe, + 0x00, 0x02, 0x00, 0x26, 0x00, 0x02, 0x00, 0x23, + 0xe8, 0xb0, 0x01, 0xf0, 0xe8, 0xa1, 0x01, 0xf0, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe8, 0xb0, 0x01, 0xf8, 0xe8, 0xa1, 0x01, 0xf8, + 0xe2, 0x52, 0x20, 0xbc, 0x1a, 0xff, 0xff, 0xed, + 0xe8, 0xbd, 0x01, 0xf8, 0xe1, 0x2f, 0xff, 0x1e, + 0xe4, 0x90, 0x40, 0x04, 0xe1, 0x85, 0x54, 0x24, + 0xe4, 0x81, 0x50, 0x04, 0xe1, 0xa0, 0x5c, 0x04, + 0xe2, 0x53, 0x30, 0x04, 0x1a, 0xff, 0xff, 0xf9, + 0xe5, 0x9f, 0xf0, 0x88, 0xe4, 0x90, 0x40, 0x04, + 0xe1, 0x85, 0x5c, 0x24, 0xe4, 0x81, 0x50, 0x04, + 0xe1, 0xa0, 0x54, 0x04, 0xe2, 0x53, 0x30, 0x04, + 0x1a, 0xff, 0xff, 0xf9, 0xe5, 0x9f, 0xf0, 0x70, + 0xe4, 0x90, 0x40, 0x04, 0xe1, 0xa0, 0x58, 0x24, + 0xe0, 0xc1, 0x50, 0xb2, 0xe0, 0xc1, 0x40, 0xb2, + 0xe2, 0x53, 0x30, 0x04, 0x1a, 0xff, 0xff, 0xf9, + 0xe5, 0x9f, 0xf0, 0x4c, 0xe2, 0x03, 0x40, 0x0f, + 0xe0, 0x53, 0x40, 0x04, 0x0a, 0x00, 0x00, 0x0a, + 0xe9, 0x2d, 0x00, 0xc4, 0xe1, 0xa0, 0x20, 0x03, + 0xe1, 0xa0, 0x30, 0x04, 0xe8, 0xb0, 0x00, 0xf0, + 0xe8, 0xa1, 0x00, 0xf0, 0xe2, 0x53, 0x30, 0x10, + 0x1a, 0xff, 0xff, 0xfb, 0xe1, 0xa0, 0x30, 0x02, + 0xe8, 0xbd, 0x00, 0xc4, 0xe2, 0x13, 0x30, 0x0f, + 0x0a, 0x00, 0x00, 0x03, 0xe4, 0x90, 0x40, 0x04, + 0xe4, 0x81, 0x40, 0x04, 0xe2, 0x53, 0x30, 0x04, + 0x1a, 0xff, 0xff, 0xfb, 0xe5, 0x9f, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x02, 0x38, 0x58, + 0x2e, 0x02, 0x37, 0xfc, 0x2e, 0x02, 0x38, 0x2c, + 0xe9, 0x2d, 0x00, 0x38, 0xe3, 0x52, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x3f, 0xe3, 0xe0, 0x30, 0x03, + 0xe0, 0x12, 0x30, 0x03, 0x0a, 0x00, 0x00, 0x30, + 0xe2, 0x10, 0x30, 0x01, 0x0a, 0x00, 0x00, 0x03, + 0xe4, 0xd0, 0x30, 0x01, 0xe4, 0xc1, 0x30, 0x01, + 0xe2, 0x52, 0x20, 0x01, 0x0a, 0x00, 0x00, 0x36, + 0xe2, 0x10, 0x30, 0x02, 0x0a, 0x00, 0x00, 0x05, + 0xe0, 0xd0, 0x30, 0xb2, 0xe1, 0xa0, 0x44, 0x23, + 0xe4, 0xc1, 0x40, 0x01, 0xe4, 0xc1, 0x30, 0x01, + 0xe2, 0x52, 0x20, 0x02, 0x0a, 0x00, 0x00, 0x2e, + 0xe3, 0xe0, 0x30, 0x03, 0xe0, 0x12, 0x30, 0x03, + 0x0a, 0x00, 0x00, 0x1f, 0xe2, 0x11, 0x40, 0x01, + 0x0a, 0x00, 0x00, 0x19, 0xe2, 0x11, 0x40, 0x02, + 0x1a, 0x00, 0x00, 0x0b, 0xe2, 0x41, 0x10, 0x01, + 0xe5, 0x91, 0x50, 0x00, 0xe1, 0xa0, 0x5c, 0x25, + 0xe1, 0xa0, 0x5c, 0x05, 0xe5, 0x9f, 0xf0, 0xa8, + 0xe5, 0x91, 0x40, 0x00, 0xe1, 0xa0, 0x44, 0x04, + 0xe1, 0xa0, 0x44, 0x24, 0xe1, 0x85, 0x50, 0x04, + 0xe5, 0x81, 0x50, 0x00, 0xe2, 0x81, 0x10, 0x01, + 0xea, 0x00, 0x00, 0x0f, 0xe2, 0x41, 0x10, 0x03, + 0xe5, 0x91, 0x50, 0x00, 0xe1, 0xa0, 0x54, 0x25, + 0xe1, 0xa0, 0x54, 0x05, 0xe5, 0x9f, 0xf0, 0x7c, + 0xe5, 0x91, 0x40, 0x00, 0xe1, 0xa0, 0x4c, 0x04, + 0xe1, 0xa0, 0x4c, 0x24, 0xe1, 0x85, 0x50, 0x04, + 0xe5, 0x81, 0x50, 0x00, 0xe2, 0x81, 0x10, 0x03, + 0xea, 0x00, 0x00, 0x03, 0xe2, 0x11, 0x40, 0x02, + 0x0a, 0x00, 0x00, 0x00, 0xe5, 0x9f, 0xf0, 0x5c, + 0xe5, 0x9f, 0xf0, 0x48, 0xe2, 0x12, 0x20, 0x03, + 0x0a, 0x00, 0x00, 0x09, 0xe4, 0xd0, 0x40, 0x01, + 0xe4, 0xc1, 0x40, 0x01, 0xe2, 0x52, 0x20, 0x01, + 0x0a, 0x00, 0x00, 0x05, 0xe4, 0xd0, 0x40, 0x01, + 0xe4, 0xc1, 0x40, 0x01, 0xe2, 0x52, 0x20, 0x01, + 0x0a, 0x00, 0x00, 0x01, 0xe4, 0xd0, 0x40, 0x01, + 0xe4, 0xc1, 0x40, 0x01, 0xe8, 0xbd, 0x00, 0x38, + 0xe3, 0x8e, 0xe0, 0x01, 0xe1, 0x2f, 0xff, 0x1e, + 0xe9, 0x2d, 0x01, 0xf8, 0xe5, 0x9f, 0xf0, 0x18, + 0x2e, 0x02, 0x36, 0xcc, 0x2e, 0x02, 0x37, 0x04, + 0x2e, 0x02, 0x37, 0x20, 0x2e, 0x02, 0x36, 0xcc, + 0x2e, 0x02, 0x36, 0xe8, 0x2e, 0x02, 0x37, 0x20, + 0x2e, 0x02, 0x37, 0x04, 0x2e, 0x02, 0x36, 0x7c, + 0xe9, 0x2d, 0x5f, 0xff, 0xe1, 0x4f, 0x00, 0x00, + 0xe9, 0x2d, 0x00, 0x01, 0xe2, 0x8f, 0x00, 0x01, + 0xe1, 0x2f, 0xff, 0x10, 0x21, 0xff, 0x48, 0x37, + 0x68, 0x00, 0x40, 0x52, 0x42, 0x08, 0xd1, 0x0b, + 0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x07, + 0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x03, + 0x0a, 0x00, 0x42, 0x08, 0xd0, 0x23, 0x32, 0x20, + 0x21, 0x0f, 0x42, 0x08, 0xd1, 0x01, 0x32, 0x10, + 0x09, 0x00, 0x21, 0x01, 0x42, 0x08, 0xd1, 0x08, + 0x1d, 0x12, 0x21, 0x02, 0x42, 0x08, 0xd1, 0x04, + 0x1d, 0x12, 0x21, 0x04, 0x42, 0x08, 0xd1, 0x00, + 0x1d, 0x12, 0x48, 0x25, 0x68, 0x00, 0xb4, 0x01, + 0x08, 0x90, 0x21, 0x01, 0x40, 0x81, 0x48, 0x21, + 0x60, 0x01, 0x48, 0x1d, 0x58, 0x82, 0x48, 0x01, + 0x46, 0x86, 0x47, 0x10, 0x2e, 0x02, 0x39, 0x35, + 0xbc, 0x02, 0x48, 0x1d, 0x60, 0x01, 0x00, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe8, 0xbd, 0x00, 0x01, + 0xe1, 0x69, 0xf0, 0x00, 0xe8, 0xbd, 0x5f, 0xff, + 0xe2, 0x5e, 0xf0, 0x04, 0x48, 0x12, 0x21, 0x20, + 0x4a, 0x12, 0x60, 0x02, 0x1d, 0x00, 0x1e, 0x49, + 0xd1, 0xfb, 0x20, 0x00, 0x47, 0x70, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0x46, 0x73, 0x49, 0x0e, + 0x60, 0x08, 0x20, 0x00, 0x47, 0x18, 0x46, 0x73, + 0x49, 0x0c, 0x60, 0x08, 0x20, 0x00, 0x47, 0x18, + 0x46, 0x73, 0x48, 0x0b, 0x68, 0x00, 0x47, 0x18, + 0x46, 0x73, 0x49, 0x09, 0x60, 0x08, 0x47, 0x18, + 0x46, 0x73, 0x4a, 0x03, 0x00, 0x80, 0x18, 0x12, + 0x68, 0x10, 0x60, 0x11, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x3b, 0xa4, 0x2e, 0x02, 0x39, 0x64, + 0x66, 0x00, 0x00, 0x10, 0x66, 0x00, 0x00, 0x14, + 0x66, 0x00, 0x00, 0x18, 0x66, 0x00, 0x00, 0x1c, + 0xe9, 0x2d, 0x5f, 0xf0, 0xe1, 0x4f, 0x40, 0x00, + 0xe3, 0x14, 0x00, 0x20, 0x11, 0x5e, 0x40, 0xb2, + 0x13, 0xc4, 0x4c, 0xff, 0x05, 0x1e, 0x40, 0x04, + 0x03, 0xc4, 0x44, 0xff, 0xe5, 0x9f, 0x50, 0x14, + 0xe7, 0x95, 0x51, 0x04, 0xe5, 0x9f, 0xe0, 0x00, + 0xe1, 0x2f, 0xff, 0x15, 0x2e, 0x02, 0x39, 0xe4, + 0xe8, 0xbd, 0x5f, 0xf0, 0xe1, 0xb0, 0xf0, 0x0e, + 0x2e, 0x08, 0x20, 0x68, 0x00, 0x00, 0x00, 0xc0, + 0x46, 0x73, 0x47, 0x78, 0xe1, 0x0f, 0x10, 0x00, + 0xe3, 0x81, 0x00, 0x80, 0xe1, 0x29, 0xf0, 0x00, + 0xe2, 0x01, 0x00, 0x80, 0xe1, 0x2f, 0xff, 0x13, + 0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x4f, 0x10, 0x00, 0xe3, 0x81, 0x00, 0x80, + 0xe1, 0x69, 0xf0, 0x00, 0xe2, 0x01, 0x00, 0x80, + 0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0x0f, 0x10, 0x00, + 0xe3, 0x81, 0x00, 0x40, 0xe1, 0x29, 0xf0, 0x00, + 0xe2, 0x01, 0x00, 0x40, 0xe1, 0x2f, 0xff, 0x13, + 0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x4f, 0x10, 0x00, 0xe3, 0x81, 0x00, 0x40, + 0xe1, 0x69, 0xf0, 0x00, 0xe2, 0x01, 0x00, 0x40, + 0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0x0f, 0x00, 0x00, + 0xe3, 0xc0, 0x00, 0x80, 0xe1, 0x29, 0xf0, 0x00, + 0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x13, + 0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x4f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x80, + 0xe1, 0x69, 0xf0, 0x00, 0xe3, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe1, 0x0f, 0x00, 0x00, + 0xe3, 0xc0, 0x00, 0x40, 0xe1, 0x29, 0xf0, 0x00, + 0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x13, + 0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, + 0xe1, 0x4f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x40, + 0xe1, 0x69, 0xf0, 0x00, 0xe3, 0xa0, 0x00, 0x00, + 0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x49, 0x02, + 0x60, 0x08, 0x20, 0x00, 0x46, 0x9f, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x00, 0x46, 0x73, 0x49, 0x02, + 0x60, 0x08, 0x20, 0x00, 0x46, 0x9f, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x04, 0x46, 0x73, 0x48, 0x03, + 0x68, 0x00, 0x47, 0x18, 0x46, 0x73, 0x49, 0x01, + 0x60, 0x08, 0x47, 0x18, 0x66, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x46, 0x6c, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x50, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x02, 0xd0, + 0x00, 0x00, 0x00, 0x15, 0x00, 0x03, 0xb1, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x90, 0x85, + 0x00, 0x00, 0xa6, 0xee, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x02, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0xa0, + 0x00, 0x08, 0x08, 0x28, 0x00, 0x08, 0x88, 0x68, + 0x00, 0x08, 0xa0, 0x98, 0x00, 0x08, 0x88, 0x68, + 0x00, 0x08, 0x28, 0x98, 0x00, 0x08, 0xac, 0xf4, + 0x00, 0x08, 0xb8, 0x7c, 0x00, 0x02, 0x02, 0x88, + 0x00, 0x02, 0x08, 0x22, 0x00, 0x02, 0x88, 0xaa, + 0x00, 0x02, 0x22, 0xaa, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x24, + 0x00, 0x04, 0x04, 0x24, 0x00, 0x04, 0x28, 0x6c, + 0x00, 0x04, 0x28, 0x6c, 0x00, 0x01, 0x10, 0x44, + 0x00, 0x01, 0x20, 0x44, 0x00, 0x01, 0x11, 0xaa, + 0x00, 0x01, 0x88, 0x55, 0x00, 0x01, 0x44, 0xaa, + 0x00, 0x01, 0x44, 0x55, 0x00, 0x20, 0x80, 0xa0, + 0x00, 0x20, 0x80, 0xc0, 0x00, 0x20, 0x20, 0xa0, + 0x00, 0x20, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, + 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x13, 0x16, + 0x1a, 0x1b, 0x1d, 0x22, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x13, 0x16, + 0x1a, 0x1b, 0x1d, 0x22, 0x10, 0x10, 0x16, 0x18, + 0x1b, 0x1d, 0x22, 0x25, 0x13, 0x16, 0x1a, 0x1b, + 0x1d, 0x22, 0x22, 0x26, 0x16, 0x16, 0x1a, 0x1b, + 0x1d, 0x22, 0x25, 0x28, 0x16, 0x1a, 0x1b, 0x1d, + 0x20, 0x23, 0x28, 0x30, 0x1a, 0x1b, 0x1d, 0x20, + 0x23, 0x28, 0x30, 0x3a, 0x1a, 0x1b, 0x1d, 0x22, + 0x26, 0x2e, 0x38, 0x45, 0x1b, 0x1d, 0x23, 0x26, + 0x2e, 0x38, 0x45, 0x53, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xd6, 0x00, + 0x00, 0x1b, 0x08, 0x00, 0x00, 0x1f, 0xde, 0x00, + 0x00, 0x00, 0x50, 0x00, 0x00, 0x09, 0xce, 0x00, + 0x00, 0x13, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x05, 0x28, 0x20, 0x01, 0x00, 0x00, 0x02, 0x40, + 0x71, 0x01, 0x00, 0x68, 0xe0, 0x7f, 0xb0, 0x7f, + 0x60, 0x40, 0xe0, 0x1d, 0x90, 0x10, 0xb4, 0x81, + 0xe8, 0xc0, 0xe0, 0xc2, 0x90, 0x18, 0x00, 0x8a, + 0x70, 0xc0, 0x0f, 0x87, 0xe3, 0xe8, 0xc0, 0x00, + 0x70, 0x40, 0xe0, 0x01, 0xe0, 0x86, 0x00, 0x26, + 0xd0, 0x28, 0xe0, 0x0e, 0xd0, 0x0e, 0x0f, 0x0b, + 0x70, 0x1d, 0xe0, 0x67, 0x0f, 0x87, 0x0f, 0x87, + 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 0x02, 0x20, + 0xd0, 0x01, 0xe0, 0x25, 0x0f, 0x45, 0x6f, 0x81, + 0xdf, 0xa6, 0xe0, 0x36, 0xe1, 0x30, 0xa0, 0x37, + 0xc0, 0x00, 0xe0, 0x26, 0x00, 0x33, 0xdf, 0x00, + 0xe0, 0x32, 0x0f, 0xc5, 0x0f, 0x87, 0x00, 0x27, + 0xd0, 0x4c, 0xe0, 0x21, 0x00, 0x33, 0xdf, 0x60, + 0x00, 0x27, 0xd0, 0x56, 0x60, 0x01, 0xe0, 0x2d, + 0x03, 0xa0, 0xd0, 0x41, 0xa0, 0x78, 0x00, 0x60, + 0xd0, 0x41, 0xa0, 0x77, 0x00, 0x22, 0xd0, 0x58, + 0xa0, 0x76, 0x00, 0x21, 0xd0, 0x7c, 0x00, 0x4a, + 0xd0, 0x72, 0x70, 0x40, 0x00, 0x06, 0x0f, 0x87, + 0x00, 0x22, 0xdc, 0xf8, 0xf0, 0x4a, 0xe1, 0x70, + 0x07, 0xef, 0xdd, 0xbf, 0x4f, 0x36, 0x1d, 0x99, + 0x4d, 0x80, 0x10, 0x18, 0xdd, 0x50, 0x60, 0x35, + 0xdd, 0x72, 0xdd, 0x10, 0x3d, 0xb4, 0xec, 0x57, + 0x2d, 0x36, 0x1d, 0x03, 0xbd, 0x04, 0xe4, 0x2b, + 0x01, 0x46, 0x00, 0x06, 0xac, 0xf6, 0x80, 0x3f, + 0x0d, 0x0a, 0x10, 0x02, 0x7d, 0x40, 0x10, 0x1e, + 0xb0, 0x20, 0xbc, 0xe0, 0x00, 0x06, 0x00, 0xc6, + 0xe0, 0x52, 0xb7, 0x60, 0xb7, 0x60, 0xc0, 0x5d, + 0x30, 0x5f, 0xe4, 0x72, 0xc7, 0x5e, 0x00, 0xed, + 0xd0, 0x28, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, + 0xc0, 0x1d, 0x30, 0x1c, 0xf8, 0x7e, 0x00, 0x21, + 0xd0, 0x01, 0x00, 0x26, 0xd0, 0x78, 0xa0, 0x38, + 0x80, 0x3f, 0x70, 0x01, 0xb0, 0x3f, 0x60, 0x01, + 0x0f, 0x87, 0x80, 0x34, 0x03, 0xef, 0xd8, 0x3f, + 0xa8, 0x38, 0x01, 0x35, 0xdc, 0x33, 0xe0, 0x46, + 0xc0, 0x1c, 0xe4, 0xa5, 0x97, 0x2e, 0x30, 0x1c, + 0xe8, 0x8e, 0x00, 0x21, 0xd0, 0x00, 0xa0, 0x38, + 0xc0, 0x5d, 0x00, 0x23, 0xd0, 0x00, 0x30, 0x40, + 0x30, 0x5e, 0xe4, 0x99, 0x20, 0x5e, 0xc0, 0x01, + 0x30, 0x1c, 0xec, 0xa4, 0xe0, 0x9d, 0x20, 0x5f, + 0xc0, 0x1c, 0x30, 0x01, 0xf4, 0xa5, 0xc0, 0x1c, + 0x30, 0x1d, 0xec, 0xa4, 0xe4, 0xa5, 0x90, 0x38, + 0x00, 0x1b, 0xe8, 0xa5, 0xa0, 0x66, 0xb1, 0x3f, + 0xe4, 0xb3, 0xe8, 0xb1, 0xc0, 0x4b, 0x30, 0x44, + 0xf8, 0xb3, 0x60, 0x45, 0xb1, 0x7c, 0x01, 0x20, + 0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 0x72, 0xc5, + 0x00, 0x06, 0x90, 0x55, 0xd0, 0x01, 0x00, 0x40, + 0xa0, 0x55, 0x0f, 0x87, 0x01, 0x46, 0x00, 0x06, + 0x03, 0xef, 0xd0, 0x3f, 0xa0, 0x38, 0xb0, 0x01, + 0xa0, 0x37, 0x80, 0x3f, 0x82, 0x34, 0x80, 0x3f, + 0xf2, 0x1a, 0x80, 0x34, 0x80, 0x3f, 0xf2, 0x1a, + 0xd8, 0x00, 0xd8, 0x40, 0xd8, 0x80, 0xd8, 0xc0, + 0xd9, 0x00, 0xd9, 0x40, 0xd9, 0x80, 0xd9, 0xc0, + 0xda, 0x00, 0xda, 0x40, 0xda, 0x80, 0xda, 0xc0, + 0xdb, 0x00, 0xdb, 0x40, 0xdb, 0x80, 0xdb, 0xc0, + 0xdc, 0x00, 0xdc, 0x40, 0xdc, 0x80, 0xdc, 0xc0, + 0xdd, 0x00, 0xdd, 0x40, 0xdd, 0x80, 0xdd, 0xc0, + 0xde, 0x00, 0xde, 0x40, 0xde, 0x80, 0xde, 0xc0, + 0xdf, 0x00, 0xdf, 0x40, 0xdf, 0x80, 0xdf, 0xc0, + 0xde, 0x80, 0xde, 0xc1, 0x00, 0x28, 0xd0, 0x60, + 0x6e, 0x81, 0x80, 0x00, 0x80, 0x05, 0x00, 0xe3, + 0xd1, 0x88, 0x00, 0x73, 0xd5, 0x80, 0x60, 0x06, + 0xb1, 0xbc, 0x00, 0xfa, 0xd0, 0x80, 0x60, 0x06, + 0x00, 0x26, 0xd0, 0x6c, 0x6e, 0x81, 0x04, 0xf4, + 0xdc, 0x00, 0x00, 0xee, 0xd1, 0x94, 0x60, 0x06, + 0x00, 0xed, 0xd0, 0x50, 0x6e, 0x81, 0x00, 0x22, + 0xd0, 0x70, 0x6e, 0x81, 0x00, 0xee, 0xd0, 0x74, + 0x6e, 0x81, 0xd0, 0x4c, 0x6e, 0x81, 0xd0, 0x02, + 0x00, 0xef, 0xd0, 0x6c, 0x60, 0x01, 0xd0, 0x03, + 0x00, 0xef, 0xd0, 0x70, 0x60, 0x01, 0x00, 0xe0, + 0xd0, 0x48, 0xd0, 0x02, 0x60, 0x01, 0x00, 0x32, + 0xdf, 0x20, 0xa0, 0x1c, 0x00, 0x21, 0xd0, 0x60, + 0xa0, 0x76, 0x00, 0x34, 0xd5, 0x70, 0x80, 0x3f, + 0x00, 0x23, 0xd0, 0x5c, 0x00, 0x4a, 0xd0, 0x72, + 0x70, 0x40, 0x00, 0x06, 0x00, 0x22, 0xd1, 0xa4, + 0x6e, 0xc6, 0xd0, 0x58, 0x6e, 0xc1, 0xd0, 0xc9, + 0x00, 0xed, 0xd0, 0x54, 0x60, 0xc1, 0x00, 0x22, + 0xd0, 0x40, 0x60, 0xc1, 0x00, 0x22, 0xd0, 0x60, + 0x60, 0xc1, 0x82, 0x34, 0x80, 0x3f, 0xd6, 0xd9, + 0x01, 0x2d, 0xd6, 0x0c, 0x16, 0x08, 0xd0, 0x55, + 0xd0, 0x2c, 0x60, 0x40, 0xd0, 0x70, 0x00, 0xfb, + 0xd1, 0x00, 0x60, 0x01, 0x00, 0x2b, 0xd4, 0x10, + 0x00, 0x29, 0xd4, 0x40, 0x00, 0x2b, 0xd0, 0x90, + 0xc0, 0xc2, 0xd1, 0x18, 0xd1, 0x44, 0xa1, 0x50, + 0x00, 0x21, 0xd0, 0xb6, 0xd0, 0xd7, 0x00, 0x29, + 0xd0, 0x04, 0x64, 0x00, 0xb0, 0x3c, 0x64, 0x40, + 0x80, 0x34, 0x80, 0x3f, 0xd0, 0x40, 0x00, 0x35, + 0xd0, 0x00, 0x60, 0x01, 0xd0, 0x48, 0x6e, 0x81, + 0xd0, 0x44, 0x6e, 0x81, 0x00, 0x64, 0xd1, 0x80, + 0x6e, 0x86, 0x01, 0x3c, 0xd2, 0x39, 0xe0, 0x46, + 0xd0, 0x00, 0xd0, 0x40, 0xd0, 0x80, 0xd0, 0xc0, + 0xd1, 0x00, 0xd1, 0x40, 0xd1, 0x80, 0xd1, 0xc0, + 0xd2, 0x00, 0xd2, 0x40, 0xd2, 0x80, 0xd2, 0xc0, + 0xd3, 0x00, 0xd3, 0x40, 0xd3, 0x80, 0xd3, 0xc0, + 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, + 0xd5, 0x00, 0xd5, 0x40, 0xd5, 0x80, 0xd5, 0xc0, + 0xd6, 0x00, 0xd6, 0x40, 0xd6, 0x80, 0xd6, 0xc0, + 0xd7, 0x00, 0xd7, 0x40, 0xd7, 0x80, 0xd7, 0xc0, + 0x0f, 0xc5, 0x50, 0x00, 0x01, 0x46, 0x00, 0x06, + 0xde, 0x80, 0xde, 0xc1, 0x03, 0x2f, 0xd0, 0x33, + 0xa0, 0x38, 0xb0, 0x01, 0xa0, 0x37, 0x80, 0x3f, + 0x08, 0x20, 0xdf, 0x00, 0x82, 0x34, 0x80, 0x3f, + 0x00, 0xee, 0xd0, 0x08, 0x77, 0xc0, 0xb0, 0x04, + 0x77, 0x80, 0xb0, 0x04, 0xc0, 0x5f, 0x30, 0x5e, + 0x60, 0x40, 0xd7, 0x00, 0xb7, 0x01, 0x80, 0x34, + 0x80, 0x3f, 0x00, 0x60, 0xd0, 0x80, 0x00, 0xec, + 0xd0, 0x40, 0x60, 0x81, 0xb0, 0x7c, 0x60, 0x81, + 0x00, 0xa0, 0xd0, 0x80, 0xb0, 0x74, 0x60, 0x81, + 0xb0, 0x7c, 0x60, 0x81, 0x00, 0x68, 0xd0, 0x80, + 0x6e, 0x82, 0x00, 0xef, 0xd0, 0x8c, 0x6e, 0x82, + 0x00, 0x06, 0xd0, 0x11, 0xa0, 0x38, 0x80, 0x3f, + 0x08, 0x20, 0xd0, 0x40, 0x10, 0x48, 0xa0, 0x4a, + 0xa0, 0x5b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08, + 0xa0, 0x27, 0xa0, 0x0a, 0x90, 0x4d, 0x0f, 0xff, + 0xd8, 0x1f, 0x40, 0x40, 0xa0, 0x4d, 0x80, 0x0a, + 0x80, 0x07, 0x80, 0x1b, 0x80, 0x27, 0x00, 0x60, + 0xd0, 0x00, 0xa0, 0x09, 0x80, 0x28, 0x01, 0x20, + 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, + 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, + 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x29, + 0x80, 0x2b, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38, + 0x80, 0x3f, 0x01, 0xb0, 0xd0, 0x10, 0xa0, 0x37, + 0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38, + 0x00, 0xea, 0xd0, 0x00, 0xd0, 0x4e, 0x0f, 0x0b, + 0x70, 0x40, 0x00, 0x06, 0x00, 0x21, 0xd0, 0x88, + 0x00, 0xe1, 0xd0, 0x60, 0x60, 0x81, 0x00, 0x2b, + 0xd0, 0x80, 0x00, 0xe0, 0xd0, 0x6c, 0x60, 0x81, + 0xb0, 0x7c, 0x00, 0x29, 0xd0, 0x80, 0x60, 0x81, + 0xb0, 0x7c, 0xd0, 0x82, 0x60, 0x81, 0xb0, 0x7c, + 0xd0, 0x85, 0x60, 0x81, 0xb0, 0x7c, 0x03, 0xaa, + 0xd0, 0x98, 0x60, 0x81, 0xb0, 0x7c, 0x6e, 0x81, + 0x00, 0x27, 0xd0, 0x40, 0x6e, 0x81, 0xb0, 0x7c, + 0x6e, 0x81, 0xb0, 0x7c, 0x6e, 0x81, 0x00, 0x27, + 0xd1, 0x90, 0x6e, 0x86, 0x00, 0x21, 0xd1, 0xb8, + 0x6e, 0x86, 0x00, 0x66, 0xd1, 0xa0, 0xd0, 0x00, + 0x01, 0x64, 0xd0, 0x58, 0x30, 0x01, 0x60, 0x06, + 0x00, 0xed, 0xd1, 0xbc, 0x6e, 0x86, 0x00, 0xec, + 0xd1, 0xb8, 0x6e, 0x86, 0xb1, 0x84, 0x6e, 0x86, + 0x00, 0xee, 0xd1, 0x84, 0x70, 0x46, 0x00, 0x65, + 0xd1, 0x94, 0x60, 0x46, 0x00, 0x64, 0xd1, 0xbc, + 0x6e, 0x86, 0x00, 0x65, 0xd1, 0x80, 0x6e, 0x86, + 0xb1, 0xbc, 0x6e, 0x86, 0xb1, 0xbc, 0x6e, 0x86, + 0x00, 0xed, 0xd1, 0xa8, 0x6e, 0x86, 0xd0, 0x0e, + 0xb1, 0xbc, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, + 0x00, 0x65, 0xd1, 0xa4, 0x60, 0x06, 0x00, 0x28, + 0xd1, 0xa4, 0x6e, 0x86, 0x00, 0x27, 0xd1, 0x98, + 0x6e, 0x86, 0x00, 0x64, 0xd1, 0xa4, 0x6e, 0x86, + 0xd2, 0x01, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, + 0x00, 0x64, 0xd1, 0x80, 0x70, 0x46, 0x6e, 0x86, + 0x00, 0xef, 0xd1, 0x98, 0x70, 0x86, 0x08, 0x20, + 0xd0, 0xcf, 0x30, 0xc1, 0xea, 0x42, 0xd0, 0x81, + 0x00, 0x21, 0xd1, 0xa8, 0x60, 0x86, 0x00, 0xed, + 0xd1, 0xa0, 0x6e, 0xc6, 0x00, 0x65, 0xd1, 0x98, + 0x6e, 0xc6, 0x00, 0x22, 0xd0, 0x00, 0xa0, 0x05, + 0x80, 0x40, 0x00, 0xc6, 0x01, 0x73, 0xd4, 0x3d, + 0xe0, 0x46, 0x50, 0x00, 0x08, 0x20, 0xd0, 0x00, + 0x5f, 0x00, 0x00, 0x64, 0xd0, 0x60, 0x70, 0xc1, + 0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0xb0, 0x7c, + 0x71, 0xc1, 0xc0, 0x87, 0x30, 0x86, 0xf9, 0x83, + 0x10, 0xee, 0xe9, 0x76, 0x10, 0xe1, 0xe9, 0x76, + 0xe2, 0x57, 0x00, 0x63, 0xd0, 0xbf, 0x72, 0x06, + 0xb1, 0xbc, 0x41, 0x82, 0x02, 0x1b, 0xe9, 0x8d, + 0x72, 0x86, 0xb1, 0xbc, 0x41, 0x82, 0xd0, 0x75, + 0x30, 0x48, 0xe9, 0xfe, 0xb0, 0x7f, 0xea, 0x00, + 0x02, 0x1c, 0xe9, 0x96, 0x15, 0xa3, 0xea, 0x57, + 0x10, 0xf0, 0xe9, 0x9a, 0x10, 0xfa, 0xf9, 0xa1, + 0x15, 0xa3, 0xea, 0x57, 0x00, 0x21, 0xd0, 0x4c, + 0x70, 0x41, 0x10, 0x61, 0xfa, 0x57, 0x00, 0xed, + 0xd0, 0x08, 0x70, 0x40, 0xd0, 0x85, 0x40, 0x42, + 0x60, 0x40, 0x00, 0x64, 0xd0, 0x64, 0x62, 0x01, + 0x12, 0x2b, 0xe9, 0xeb, 0x12, 0x3b, 0xe9, 0xd5, + 0x00, 0xec, 0xd0, 0x40, 0x61, 0x81, 0x12, 0x2d, + 0xe9, 0xbf, 0x12, 0x30, 0xe9, 0xd4, 0x12, 0x36, + 0xe9, 0xd4, 0x12, 0x3a, 0xe9, 0xd4, 0xd0, 0x62, + 0x30, 0x48, 0xe9, 0xf2, 0x12, 0x2e, 0xe9, 0xf9, + 0xe1, 0x76, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x40, + 0xd0, 0x85, 0x40, 0x42, 0x60, 0x40, 0xb0, 0x08, + 0x00, 0x21, 0xd0, 0x41, 0x60, 0x40, 0x00, 0x64, + 0xd0, 0x60, 0x62, 0x01, 0xf2, 0x5a, 0x00, 0xed, + 0xd0, 0x20, 0xd0, 0x41, 0x60, 0x40, 0x10, 0xe1, + 0xea, 0x3a, 0xe2, 0x57, 0xe2, 0x53, 0x10, 0xee, + 0xf9, 0xe9, 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, + 0x97, 0x2e, 0xc7, 0x5c, 0xa7, 0x66, 0x81, 0x34, + 0x80, 0x3f, 0x00, 0x21, 0xd0, 0x01, 0xa0, 0x38, + 0x00, 0xc6, 0x00, 0x21, 0xd0, 0x15, 0x0b, 0x09, + 0x00, 0x4d, 0xb0, 0x01, 0xed, 0xe5, 0xd2, 0x1a, + 0xe1, 0xec, 0xf1, 0x18, 0x00, 0xec, 0xd0, 0x40, + 0x71, 0x81, 0xd0, 0x4e, 0x60, 0x46, 0xe2, 0x54, + 0xc0, 0x0a, 0x10, 0x06, 0x52, 0x80, 0x00, 0xed, + 0xd0, 0x40, 0x62, 0x81, 0xe2, 0x53, 0x00, 0x64, + 0xd0, 0x60, 0x62, 0x01, 0xf2, 0x5a, 0xe1, 0x70, + 0x12, 0xa3, 0xf6, 0x57, 0x15, 0xa1, 0xfa, 0x57, + 0x12, 0xa0, 0xea, 0x23, 0x00, 0x65, 0xd1, 0x1c, + 0xd0, 0x75, 0x30, 0x48, 0xea, 0x0a, 0xb1, 0x3c, + 0x71, 0x04, 0x11, 0x20, 0xfa, 0x11, 0x00, 0xec, + 0xd0, 0x40, 0x61, 0x81, 0xe2, 0x57, 0x12, 0xa1, + 0xea, 0x33, 0x00, 0xe2, 0xd0, 0x60, 0x70, 0x01, + 0xb0, 0x7c, 0x70, 0x41, 0x10, 0x0c, 0x50, 0x40, + 0x0c, 0x30, 0xd0, 0x00, 0x31, 0x01, 0xee, 0x21, + 0x21, 0x00, 0xe6, 0x57, 0xe2, 0x23, 0x31, 0x00, + 0xfe, 0x57, 0xd0, 0x75, 0x30, 0x48, 0xea, 0x28, + 0xf2, 0x5a, 0xe2, 0x0d, 0x00, 0xec, 0xd0, 0x40, + 0x71, 0x81, 0x00, 0x63, 0xd1, 0x3f, 0xb1, 0xbc, + 0x41, 0x84, 0x61, 0x81, 0xd0, 0x50, 0x60, 0x46, + 0xe2, 0x57, 0x00, 0xed, 0xd0, 0x7c, 0x70, 0x41, + 0x08, 0x20, 0xd0, 0x00, 0x10, 0x08, 0xe2, 0x1c, + 0xd2, 0x84, 0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86, + 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x46, 0x82, 0x34, + 0x80, 0x3f, 0xc7, 0x5e, 0x97, 0x2e, 0x81, 0x34, + 0x80, 0x3f, 0x02, 0xe8, 0xd0, 0x30, 0xa0, 0x37, + 0xa0, 0x38, 0x08, 0x20, 0xdf, 0x00, 0x80, 0x73, + 0x80, 0x3f, 0x00, 0xc6, 0x01, 0x7a, 0xde, 0x1a, + 0xe0, 0x46, 0xf2, 0x5a, 0x00, 0x64, 0xd0, 0x60, + 0x62, 0x01, 0x02, 0x3c, 0xdc, 0x89, 0xe0, 0x46, + 0x00, 0x28, 0xd0, 0x64, 0x70, 0x81, 0x00, 0x22, + 0xd0, 0x00, 0x50, 0x80, 0x60, 0x81, 0x0f, 0xc5, + 0x50, 0x00, 0x50, 0x00, 0x00, 0xed, 0xd1, 0xa4, + 0x72, 0x86, 0x00, 0xef, 0xd1, 0x90, 0x70, 0x46, + 0x10, 0x5c, 0x10, 0x65, 0xed, 0x7d, 0xd0, 0x46, + 0xc0, 0x0a, 0x10, 0x40, 0x60, 0x46, 0x00, 0x22, + 0xd0, 0x73, 0x30, 0x54, 0xe9, 0x8e, 0x12, 0xa4, + 0xe9, 0xb5, 0x15, 0x20, 0xe9, 0xc0, 0xb0, 0x7b, + 0xe9, 0xc3, 0xb0, 0x41, 0xe9, 0xc9, 0xc0, 0x54, + 0x10, 0x5c, 0x10, 0x6e, 0xe9, 0xc6, 0xe1, 0xb5, + 0x00, 0x28, 0xd1, 0xb0, 0xd0, 0x00, 0x60, 0x06, + 0x12, 0xa4, 0xf9, 0xb2, 0x00, 0xed, 0xd1, 0x9c, + 0x62, 0x86, 0xd2, 0x80, 0x00, 0xed, 0xd1, 0xa4, + 0x62, 0x86, 0xd0, 0x02, 0x00, 0xec, 0xd1, 0xbc, + 0x60, 0x06, 0x00, 0x64, 0xd1, 0xa0, 0x72, 0x06, + 0x12, 0x21, 0xf9, 0xa6, 0xd2, 0x0d, 0x62, 0x06, + 0x00, 0xed, 0xd1, 0xa0, 0x61, 0x86, 0xd0, 0x0e, + 0x00, 0xed, 0xd1, 0xac, 0x60, 0x06, 0xb1, 0xbc, + 0x60, 0x06, 0x00, 0x65, 0xd1, 0xa4, 0x60, 0x06, + 0x01, 0x7e, 0xd2, 0x32, 0xe1, 0xcb, 0x01, 0x46, + 0x90, 0x49, 0x00, 0x60, 0xd0, 0x00, 0x50, 0x40, + 0xa0, 0x49, 0x80, 0x3f, 0x00, 0xc6, 0x0c, 0x09, + 0x05, 0x0d, 0xe1, 0x70, 0x01, 0xbf, 0xd0, 0x41, + 0xe1, 0xcb, 0x01, 0xbb, 0xda, 0x10, 0xe1, 0xcb, + 0x01, 0xbd, 0xda, 0x0b, 0xe1, 0xcb, 0x03, 0xb9, + 0xd8, 0x10, 0x01, 0x46, 0x90, 0x49, 0x00, 0x60, + 0xd1, 0x00, 0x50, 0x44, 0x30, 0x44, 0xa0, 0x49, + 0x80, 0x3f, 0x00, 0xc6, 0xe0, 0x46, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x01, 0xfa, 0xd4, 0x3d, + 0x00, 0x25, 0xdc, 0xd8, 0xf0, 0x4a, 0x00, 0x26, + 0xd0, 0x18, 0xd0, 0x40, 0x60, 0x40, 0x00, 0x28, + 0xd0, 0x24, 0x70, 0x40, 0xd0, 0x82, 0x50, 0x42, + 0x60, 0x40, 0x00, 0xec, 0xd0, 0xa4, 0x70, 0xc2, + 0x10, 0xe0, 0xf9, 0x81, 0x00, 0xec, 0xd1, 0x98, + 0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0, + 0xe9, 0x8e, 0xd0, 0x40, 0x60, 0x46, 0xe1, 0x81, + 0xd0, 0x40, 0x00, 0xe6, 0xd0, 0x10, 0x60, 0x40, + 0xb0, 0x3c, 0x60, 0x40, 0xb0, 0x3c, 0x60, 0x40, + 0xd0, 0xe0, 0x00, 0xea, 0xd0, 0x40, 0x00, 0xe8, + 0xd0, 0x82, 0x01, 0x46, 0x70, 0x01, 0xb0, 0x7c, + 0x60, 0x02, 0xb0, 0xbc, 0x00, 0x06, 0x00, 0xc6, + 0xb0, 0xc1, 0xed, 0x9b, 0x80, 0x49, 0xd6, 0x44, + 0xd5, 0x43, 0x00, 0xe0, 0xd1, 0x80, 0x00, 0x06, + 0x0b, 0x09, 0x01, 0x0d, 0x0b, 0x09, 0x61, 0x06, + 0xb1, 0xbc, 0x01, 0x4d, 0x09, 0x09, 0x61, 0x46, + 0xb1, 0xbc, 0x00, 0xcd, 0x09, 0x09, 0x10, 0xe4, + 0xed, 0xb8, 0x60, 0xc6, 0xb1, 0xbc, 0x00, 0xcd, + 0x60, 0xc6, 0x00, 0xed, 0xd0, 0x04, 0x70, 0x00, + 0x10, 0x20, 0xf9, 0xd8, 0xd0, 0x0a, 0x40, 0x03, + 0xe9, 0xc9, 0x10, 0xe2, 0xe9, 0xc9, 0x10, 0xe7, + 0xe9, 0xc9, 0x10, 0xe8, 0xf9, 0xd8, 0x01, 0x46, + 0x90, 0x10, 0x00, 0x20, 0xd0, 0x44, 0x50, 0x40, + 0x00, 0xc6, 0xa0, 0x50, 0x00, 0xa0, 0xd0, 0x00, + 0xa0, 0x05, 0x80, 0x40, 0x00, 0xed, 0xd1, 0xa4, + 0xd0, 0x04, 0x60, 0x06, 0x00, 0xee, 0xd1, 0xac, + 0x73, 0x86, 0x10, 0xe3, 0xe5, 0xe3, 0xe9, 0xe8, + 0x00, 0xe7, 0xd0, 0x40, 0x00, 0xae, 0xd0, 0xbb, + 0xe1, 0xec, 0x01, 0x24, 0xd0, 0x6b, 0x00, 0xea, + 0xd0, 0xa6, 0xe1, 0xec, 0x01, 0x21, 0xd0, 0x7b, + 0x00, 0xe8, 0xd0, 0x90, 0x13, 0xa0, 0xf9, 0xef, + 0xc0, 0x42, 0x00, 0xe0, 0xd1, 0xa8, 0x60, 0x46, + 0xb1, 0x98, 0x0b, 0xc9, 0x00, 0x4d, 0x09, 0x09, + 0x10, 0x44, 0x00, 0x8d, 0x20, 0x42, 0x10, 0x5f, + 0x60, 0x46, 0xb1, 0xb8, 0x00, 0x90, 0xea, 0x1c, + 0x0a, 0x89, 0x00, 0x8d, 0x60, 0x86, 0xb1, 0xbc, + 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, + 0xea, 0x10, 0x00, 0xe8, 0xd1, 0x80, 0xf2, 0xb0, + 0x10, 0x60, 0xfa, 0x1c, 0x08, 0x49, 0x00, 0xe0, + 0xd1, 0xa4, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, + 0xea, 0x20, 0x00, 0xe9, 0xd1, 0x80, 0xf2, 0xb0, + 0x10, 0x60, 0xea, 0x20, 0x00, 0xe0, 0xd1, 0x88, + 0xd0, 0x40, 0x60, 0x46, 0xd0, 0x00, 0x00, 0xe0, + 0xd1, 0xa8, 0x70, 0x46, 0x00, 0xef, 0xd1, 0x9c, + 0x70, 0x86, 0xb0, 0xb0, 0xee, 0x2a, 0xd0, 0x81, + 0x00, 0x90, 0xea, 0x2d, 0x20, 0x01, 0x10, 0x41, + 0x10, 0x9f, 0x10, 0xa0, 0xee, 0x2a, 0x10, 0x1c, + 0x00, 0x65, 0xd1, 0xa8, 0x60, 0x06, 0x01, 0xb4, + 0xd6, 0x3a, 0xe0, 0x46, 0x02, 0x31, 0xde, 0x13, + 0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x0c, 0x09, + 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, + 0x30, 0x54, 0xe9, 0xea, 0xb0, 0x7d, 0xfa, 0x05, + 0x09, 0x09, 0x01, 0xcd, 0x11, 0xe1, 0xf9, 0xc7, + 0x80, 0x09, 0x80, 0x27, 0x0a, 0x09, 0xd6, 0x45, + 0x00, 0xe1, 0xd1, 0xa0, 0x00, 0x4d, 0x60, 0x46, + 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, + 0x00, 0x50, 0xe9, 0x91, 0xd4, 0x01, 0xb1, 0xbc, + 0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0x00, 0xe0, + 0xd1, 0x80, 0x08, 0x89, 0x00, 0x4d, 0x08, 0x89, + 0x10, 0x4c, 0x71, 0x06, 0x21, 0x01, 0x61, 0x06, + 0xb1, 0xbc, 0x00, 0x4d, 0x0b, 0x49, 0x10, 0x4c, + 0x71, 0x46, 0x21, 0x41, 0x61, 0x46, 0xb1, 0xb0, + 0x00, 0x4d, 0x10, 0x5f, 0x60, 0x46, 0xb1, 0xbc, + 0x0a, 0x09, 0x00, 0x4d, 0x10, 0x4a, 0x70, 0x86, + 0x20, 0x81, 0x60, 0x86, 0x00, 0xe1, 0xd1, 0xac, + 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x09, 0x49, 0x00, 0x8d, 0x60, 0x86, 0xc0, 0x02, + 0x00, 0xe0, 0xd1, 0xa8, 0x70, 0xc6, 0x10, 0xc0, + 0xd0, 0x20, 0x30, 0x01, 0x10, 0xc0, 0x60, 0xc6, + 0xe1, 0x75, 0x11, 0xe2, 0xf9, 0x75, 0x00, 0xe2, + 0xd1, 0x80, 0x08, 0xc9, 0x00, 0x4d, 0x60, 0x46, + 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, + 0xb1, 0xbc, 0x10, 0x60, 0xf9, 0xd7, 0xb1, 0xb4, + 0xe1, 0xde, 0xd2, 0x03, 0x0a, 0x09, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0xb2, 0x01, 0xf9, 0xd8, + 0x0b, 0xc9, 0x00, 0x4d, 0x10, 0x49, 0x10, 0x56, + 0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x89, 0x00, 0x4d, + 0x10, 0x4a, 0x10, 0x56, 0x60, 0x46, 0xe1, 0x75, + 0x0b, 0x2c, 0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0x77, + 0x00, 0xe0, 0xd0, 0x6c, 0x00, 0xe0, 0xd1, 0x80, + 0xd0, 0x0a, 0xf1, 0xfe, 0x00, 0xe1, 0xd1, 0xb0, + 0xd0, 0x02, 0xf1, 0xfe, 0x00, 0xe0, 0xd1, 0x80, + 0x76, 0x86, 0xb1, 0xbc, 0x73, 0x46, 0xe2, 0x3c, + 0x70, 0x81, 0x60, 0x86, 0xb1, 0xbc, 0xb0, 0x7c, + 0xb0, 0x01, 0xed, 0xfe, 0x0f, 0xc5, 0x00, 0xe1, + 0xd1, 0xa0, 0x70, 0x46, 0xd0, 0x8f, 0x40, 0x42, + 0x00, 0x25, 0xd0, 0xe0, 0x00, 0x24, 0xd1, 0x20, + 0x10, 0x6a, 0xea, 0x1e, 0x00, 0x66, 0xd0, 0xe0, + 0x00, 0x62, 0xd1, 0x00, 0x10, 0x66, 0xea, 0x1e, + 0x00, 0x6e, 0xd0, 0xc0, 0x10, 0x64, 0xea, 0x1e, + 0x00, 0x2b, 0xd0, 0xd0, 0x00, 0x29, 0xd1, 0x00, + 0x00, 0xe0, 0xd1, 0x80, 0x76, 0x86, 0x16, 0xa0, + 0xe9, 0xee, 0x30, 0xda, 0xe5, 0xee, 0xb1, 0xbc, + 0x73, 0x46, 0x13, 0x60, 0xe9, 0xee, 0x31, 0x0d, + 0xe5, 0xee, 0xd0, 0x82, 0xb1, 0xbc, 0x70, 0x46, + 0x10, 0x60, 0xe9, 0xee, 0xb0, 0x81, 0xee, 0x2c, + 0x00, 0xe0, 0xd0, 0x40, 0x00, 0xe0, 0xd1, 0xac, + 0xd0, 0x0a, 0xf1, 0xfe, 0x00, 0xe1, 0xd0, 0x70, + 0xd0, 0x02, 0xf1, 0xfe, 0x00, 0xec, 0xd1, 0x98, + 0xd0, 0x40, 0x60, 0x46, 0x00, 0xe0, 0xd0, 0x8c, + 0x70, 0x82, 0x00, 0x21, 0xd0, 0x70, 0x60, 0x81, + 0xd0, 0x40, 0x00, 0x25, 0xd0, 0x20, 0x30, 0x1a, + 0xfa, 0x50, 0x00, 0x24, 0xd0, 0x20, 0x30, 0x0d, + 0xfa, 0x50, 0xd0, 0x41, 0x00, 0x21, 0xd1, 0x84, + 0x60, 0x46, 0xb6, 0xb1, 0x16, 0x9c, 0x01, 0x7a, + 0xde, 0x1a, 0xe0, 0x46, 0x02, 0x31, 0xde, 0x13, + 0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x00, 0xec, + 0xd0, 0xa8, 0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x77, + 0x00, 0xec, 0xd1, 0x9c, 0xd0, 0x41, 0x60, 0x46, + 0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x84, 0xd0, 0x40, + 0x60, 0x46, 0xe1, 0x77, 0x0b, 0x49, 0x00, 0xe2, + 0xd1, 0xa0, 0x00, 0x4d, 0x10, 0x5f, 0x00, 0x6f, + 0xd0, 0xff, 0x40, 0x43, 0x60, 0x46, 0xb1, 0xbc, + 0x0b, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x61, + 0xf9, 0x9b, 0xd3, 0xc2, 0x00, 0xec, 0xd1, 0xbc, + 0x63, 0xc6, 0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, + 0xe5, 0x9c, 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, + 0xd0, 0x72, 0x30, 0x54, 0xf9, 0xa9, 0x0b, 0xa0, + 0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0xa0, 0x00, 0xec, + 0xd1, 0x9c, 0xd0, 0x40, 0x60, 0x46, 0x01, 0x7a, + 0xde, 0x1a, 0xe0, 0x46, 0x0b, 0x09, 0x00, 0x4d, + 0x0b, 0x09, 0x00, 0x4d, 0x0a, 0x09, 0x01, 0x4d, + 0x0a, 0x09, 0x00, 0x4d, 0x01, 0x59, 0xe9, 0x96, + 0x09, 0x09, 0x00, 0x4d, 0x10, 0x5f, 0x10, 0x61, + 0xf9, 0x96, 0x09, 0x09, 0x01, 0x4d, 0x11, 0x5f, + 0x0b, 0xc9, 0x00, 0x4d, 0xc0, 0x01, 0x10, 0x5f, + 0x11, 0x4e, 0x51, 0x41, 0x08, 0x49, 0x00, 0x4d, + 0x0b, 0xc9, 0x10, 0x0f, 0x00, 0x4d, 0x50, 0x01, + 0x00, 0xed, 0xd1, 0xb6, 0x01, 0x46, 0x00, 0x06, + 0xa0, 0x3c, 0xa1, 0x7d, 0x60, 0x06, 0x00, 0xc6, + 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, + 0xe0, 0x46, 0x50, 0x00, 0x00, 0xec, 0xd0, 0xac, + 0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x70, 0x00, 0xec, + 0xd1, 0xa0, 0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, + 0x10, 0xe0, 0xe9, 0x7f, 0xd0, 0x40, 0x60, 0x46, + 0xe1, 0x70, 0x0a, 0x89, 0x0b, 0xcd, 0x00, 0xe3, + 0xd1, 0x80, 0x6b, 0xc6, 0x08, 0xc9, 0x05, 0x8d, + 0x15, 0xa3, 0xee, 0x6e, 0x15, 0xa0, 0xea, 0x6e, + 0x90, 0x4d, 0xd0, 0x9f, 0xd0, 0xdf, 0x40, 0x81, + 0x10, 0x55, 0x40, 0xc1, 0x01, 0x46, 0x82, 0x34, + 0x80, 0x3f, 0xc8, 0x1d, 0x81, 0x34, 0x80, 0x3f, + 0x00, 0xc6, 0xd1, 0x23, 0x31, 0x03, 0x11, 0x02, + 0x38, 0x04, 0xb0, 0x8d, 0x10, 0x9d, 0x28, 0x02, + 0xc0, 0x60, 0x00, 0x65, 0xd1, 0x94, 0x71, 0x06, + 0x68, 0x06, 0x30, 0x44, 0x00, 0xed, 0xd1, 0xa8, + 0x70, 0x06, 0x10, 0x20, 0xe9, 0xb0, 0x00, 0xee, + 0xd0, 0xc0, 0x70, 0xc3, 0x20, 0x43, 0xb0, 0x01, + 0xf9, 0xac, 0x60, 0x06, 0x00, 0x64, 0xd1, 0xbc, + 0x71, 0x06, 0xc0, 0x04, 0x21, 0x01, 0x61, 0x06, + 0x10, 0x20, 0xf5, 0xbb, 0x11, 0x20, 0xe5, 0xbb, + 0xb0, 0x41, 0x00, 0x65, 0xd1, 0x80, 0x71, 0x06, + 0x21, 0x01, 0x61, 0x06, 0x00, 0xed, 0xd1, 0xac, + 0x71, 0x06, 0x15, 0xa1, 0xe9, 0xcb, 0xb1, 0x3f, + 0x61, 0x06, 0x15, 0xa3, 0xf9, 0xd6, 0xd0, 0xbf, + 0xe1, 0xd3, 0xd0, 0x40, 0x60, 0x46, 0xb1, 0xbc, + 0x70, 0x86, 0x61, 0x06, 0x31, 0x02, 0xe5, 0xd3, + 0x20, 0x84, 0x00, 0x65, 0xd1, 0xa4, 0x60, 0x86, + 0xd9, 0x40, 0x00, 0xec, 0xd1, 0x94, 0x79, 0x06, + 0xb1, 0x84, 0x78, 0xc6, 0xc0, 0x63, 0x30, 0x64, + 0xe9, 0xf8, 0x00, 0xa7, 0xd0, 0xff, 0x7a, 0x63, + 0x00, 0x65, 0xd0, 0x00, 0x71, 0x00, 0x31, 0x29, + 0xe5, 0xf8, 0xc0, 0x63, 0xc8, 0xc1, 0xb0, 0x78, + 0x40, 0x43, 0xc0, 0xa4, 0x30, 0x81, 0xe9, 0xf2, + 0x7a, 0x41, 0x31, 0x29, 0xf5, 0xe8, 0x21, 0x29, + 0x61, 0x00, 0xb8, 0xfc, 0x79, 0x63, 0xb8, 0xfc, + 0x48, 0xc3, 0x68, 0xc6, 0x00, 0xed, 0xd1, 0xb8, + 0x69, 0x46, 0x80, 0x28, 0x0b, 0xc9, 0x00, 0x4d, + 0x08, 0x49, 0x10, 0x41, 0x00, 0xe3, 0xd1, 0x84, + 0x00, 0x8d, 0x20, 0x42, 0x60, 0x46, 0x00, 0xee, + 0xd1, 0xa4, 0x70, 0x86, 0x10, 0xa1, 0xee, 0x18, + 0xe6, 0x6b, 0x90, 0x86, 0x00, 0x90, 0xea, 0x18, + 0x00, 0xed, 0xd0, 0x1c, 0x70, 0x80, 0xb0, 0x81, + 0xe6, 0x6b, 0x60, 0x80, 0xb1, 0xa8, 0x70, 0x86, + 0x10, 0xa0, 0xfa, 0x6b, 0x00, 0x21, 0xd0, 0x38, + 0x70, 0x80, 0x10, 0xa0, 0xfa, 0x6b, 0x0f, 0xef, + 0xd0, 0xbf, 0x30, 0x81, 0xfa, 0x22, 0x60, 0x00, + 0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, 0x15, 0xa3, + 0xea, 0x6b, 0x00, 0xee, 0xd1, 0x80, 0x79, 0x46, + 0x00, 0xf8, 0xd0, 0x00, 0xc4, 0x40, 0x00, 0xe3, + 0xd1, 0x84, 0x78, 0x46, 0x0f, 0xef, 0xd0, 0x3f, + 0x30, 0x21, 0xea, 0x48, 0x00, 0xe0, 0xd1, 0x90, + 0x78, 0x06, 0xc0, 0xa1, 0x18, 0x43, 0x28, 0x42, + 0x18, 0x43, 0x28, 0x42, 0x18, 0x1e, 0xd8, 0x80, + 0x08, 0x11, 0xea, 0x41, 0x28, 0xa1, 0x18, 0x01, + 0x18, 0x5f, 0x18, 0x60, 0xee, 0x3e, 0xc0, 0x51, + 0x30, 0x62, 0xee, 0x4e, 0xc8, 0x91, 0x18, 0x9f, + 0x00, 0x21, 0xd1, 0xb8, 0xd0, 0x01, 0x60, 0x06, + 0x00, 0xef, 0xd0, 0x10, 0xd0, 0x72, 0x60, 0x40, + 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc8, 0xdc, + 0xc9, 0x1d, 0x81, 0x34, 0x80, 0x3f, 0x00, 0xc6, + 0x38, 0xe4, 0xee, 0x5e, 0xea, 0x52, 0x28, 0xe5, + 0x01, 0x46, 0x90, 0x6d, 0x28, 0xc1, 0x00, 0xc6, + 0x38, 0xe2, 0xf6, 0x6b, 0xdb, 0x08, 0xf1, 0x16, + 0xf1, 0x18, 0x00, 0x21, 0xd1, 0xb4, 0x61, 0x86, + 0xe2, 0x52, 0x01, 0xf7, 0xd2, 0x19, 0xe0, 0x46, + 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, + 0xe0, 0x46, 0x50, 0x00, 0x02, 0x31, 0xde, 0x13, + 0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0xdb, 0x09, + 0x00, 0xe3, 0xd0, 0x1c, 0x6b, 0x00, 0xda, 0xc1, + 0x00, 0xe6, 0xd1, 0x98, 0x70, 0x06, 0xb1, 0x84, + 0x60, 0x06, 0xb1, 0x84, 0x60, 0x06, 0x05, 0x9f, + 0xe9, 0x9f, 0x08, 0x49, 0xd1, 0x17, 0x46, 0x44, + 0x00, 0x4d, 0x10, 0x43, 0x26, 0x41, 0x08, 0xc9, + 0x05, 0xcd, 0xb5, 0xc1, 0xe5, 0xcc, 0xc0, 0x57, + 0x15, 0xc6, 0x25, 0xc1, 0x15, 0xa3, 0xf9, 0x9f, + 0x08, 0x49, 0xd1, 0x0f, 0x46, 0x44, 0x00, 0x4d, + 0x10, 0x44, 0x26, 0x41, 0x08, 0xc9, 0x06, 0x0d, + 0xb6, 0x01, 0xe5, 0xcc, 0xc0, 0x58, 0x16, 0x06, + 0x26, 0x01, 0x08, 0x49, 0x00, 0x4d, 0x10, 0x60, + 0xe9, 0xa6, 0x0a, 0x09, 0x00, 0x4d, 0xe1, 0x9f, + 0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, 0xe5, 0xa7, + 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, + 0x30, 0x54, 0xf9, 0xb3, 0xd4, 0x40, 0xf3, 0xb0, + 0xe1, 0xab, 0xb0, 0x7d, 0xf9, 0xb8, 0x02, 0x34, + 0xd4, 0x44, 0xe0, 0x46, 0x00, 0xec, 0xd1, 0xa0, + 0xd0, 0x40, 0x60, 0x46, 0x02, 0x3c, 0xdc, 0x89, + 0x00, 0xec, 0xd1, 0x80, 0x70, 0x46, 0xb1, 0xbc, + 0x70, 0x86, 0x30, 0x81, 0xe8, 0x46, 0x15, 0x63, + 0xe9, 0xc9, 0x05, 0x5e, 0xe8, 0x46, 0x01, 0x73, + 0xd4, 0x3d, 0xe0, 0x46, 0xd5, 0x00, 0xb5, 0x01, + 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0xcc, 0xc0, 0xcd, 0x01, + 0xcd, 0x42, 0xcd, 0x83, 0x00, 0xa0, 0xd0, 0x01, + 0xa0, 0x38, 0xc8, 0x7f, 0xc8, 0x06, 0xb1, 0xbe, + 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x58, 0x80, + 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x96, 0xc9, 0x00, + 0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, 0xc9, 0x40, + 0xf3, 0x92, 0x59, 0x40, 0xc0, 0x22, 0xc0, 0x65, + 0xc0, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0x80, + 0xf3, 0x92, 0x59, 0x00, 0xf3, 0x96, 0xc9, 0x40, + 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x59, 0x40, + 0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x92, 0x58, 0x80, + 0xc0, 0x23, 0xc0, 0x62, 0xd0, 0x88, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, + 0x58, 0xc0, 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, + 0x59, 0xc0, 0xc0, 0x24, 0xc0, 0x67, 0xd0, 0x90, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x00, + 0xf3, 0x92, 0x59, 0x80, 0xf3, 0x96, 0xc9, 0xc0, + 0xf3, 0x96, 0xca, 0x00, 0xf3, 0x92, 0x59, 0xc0, + 0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, 0x59, 0x00, + 0xc0, 0x25, 0xc0, 0x64, 0xd0, 0x98, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, + 0x58, 0x80, 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, + 0x59, 0x00, 0xc0, 0x23, 0xc0, 0x64, 0xd0, 0x84, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0xc0, + 0xf3, 0x92, 0x59, 0x40, 0xf3, 0x96, 0xc9, 0x00, + 0xf3, 0x92, 0x5a, 0x40, 0xc0, 0x26, 0xc0, 0x69, + 0xd0, 0xa0, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, + 0xc9, 0x80, 0xf3, 0x92, 0x5a, 0x00, 0xf3, 0x96, + 0xca, 0x40, 0xf3, 0x92, 0x5a, 0x40, 0xf3, 0x96, + 0xca, 0x80, 0xf3, 0x92, 0x59, 0x80, 0xc0, 0x27, + 0xc0, 0x66, 0xd0, 0xa8, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x92, 0x59, 0x00, + 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x58, 0xc0, + 0xc0, 0x22, 0xc0, 0x63, 0xd0, 0x8c, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x92, 0x59, 0x80, 0xc0, 0x25, + 0xc0, 0x66, 0xd0, 0x94, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x59, 0xc0, + 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, 0x5a, 0x80, + 0xc0, 0x28, 0xc0, 0x6a, 0xd0, 0xb0, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, + 0x59, 0x40, 0xc0, 0x29, 0xc0, 0x65, 0xd0, 0xb8, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x80, + 0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, 0xca, 0x00, + 0xf3, 0x92, 0x58, 0x80, 0xc0, 0x24, 0xc0, 0x62, + 0xd0, 0x9c, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92, + 0x5a, 0x00, 0xc0, 0x27, 0xc0, 0x68, 0xd0, 0xa4, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xca, 0x80, + 0xf3, 0x92, 0x59, 0x80, 0xf3, 0x96, 0xca, 0x40, + 0xf3, 0x92, 0x5a, 0x40, 0xf3, 0x96, 0xc9, 0x40, + 0xf3, 0x92, 0x5a, 0x80, 0xc0, 0x23, 0xc0, 0x6a, + 0xd0, 0xac, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92, + 0x59, 0x40, 0xc0, 0x26, 0xc0, 0x65, 0xd0, 0xb4, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x00, + 0xf3, 0x92, 0x59, 0x00, 0xc0, 0x29, 0xc0, 0x64, + 0xd0, 0xbc, 0x20, 0x86, 0xf3, 0x9a, 0xc0, 0x33, + 0xc0, 0x74, 0xc0, 0xb5, 0xc0, 0xf6, 0xd0, 0x40, + 0x00, 0xa0, 0xd8, 0x00, 0xa8, 0x38, 0x08, 0x45, + 0x0a, 0x09, 0x00, 0x0d, 0x0f, 0xc5, 0x50, 0x00, + 0x0a, 0x09, 0x00, 0x0d, 0x10, 0x08, 0x0f, 0xc5, + 0x01, 0x46, 0x00, 0x06, 0xa0, 0x7c, 0xa0, 0x3d, + 0x60, 0x42, 0x00, 0xc6, 0x0f, 0xc5, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x14, 0x48, 0xd0, 0x81, + 0x00, 0xef, 0xd1, 0x8c, 0x71, 0x46, 0x11, 0x60, + 0xfb, 0xb1, 0x60, 0x86, 0x71, 0x46, 0x31, 0x42, + 0xfb, 0xb1, 0x00, 0xec, 0xd1, 0x0c, 0x74, 0x84, + 0x00, 0x68, 0xd0, 0x80, 0x70, 0x02, 0x10, 0x20, + 0xfb, 0xc4, 0xc4, 0x82, 0xc4, 0xd2, 0xb4, 0xfc, + 0xda, 0x00, 0xda, 0x4f, 0x0a, 0x09, 0x0f, 0xef, + 0xd0, 0x3f, 0xb4, 0x7f, 0xca, 0x29, 0x1a, 0x18, + 0x4a, 0x00, 0x1a, 0x48, 0x00, 0x8d, 0x2a, 0x42, + 0xd0, 0x03, 0x40, 0x11, 0xfb, 0xe3, 0xb4, 0x44, + 0x00, 0xa0, 0xd0, 0xc0, 0x30, 0xd3, 0xff, 0xe3, + 0xb4, 0xfe, 0x01, 0x46, 0x00, 0x06, 0xaa, 0x3d, + 0xaa, 0x7c, 0x6a, 0x53, 0x00, 0xc6, 0xb4, 0xfe, + 0xb4, 0x7c, 0x1a, 0x61, 0xfb, 0xc8, 0xb4, 0x43, + 0x00, 0xef, 0xd0, 0x3f, 0x40, 0x11, 0xeb, 0xf7, + 0xb0, 0xc4, 0xe7, 0xf7, 0xeb, 0xee, 0x61, 0x53, + 0x64, 0x52, 0x64, 0xc4, 0x00, 0x28, 0xd1, 0x24, + 0x70, 0x04, 0x00, 0x21, 0xd0, 0x80, 0x50, 0x02, + 0x60, 0x04, 0x61, 0x46, 0x0a, 0x09, 0x0f, 0xc5, + 0x50, 0x00, 0x50, 0x00, 0x02, 0x31, 0xde, 0x13, + 0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x01, 0xfa, + 0xd4, 0x3d, 0x00, 0x25, 0xdc, 0xd8, 0xf0, 0x4a, + 0x09, 0x09, 0x01, 0xcd, 0x11, 0xe8, 0xf9, 0xe2, + 0x00, 0xe3, 0xd1, 0x9c, 0x09, 0x09, 0x05, 0xcd, + 0xb5, 0xc1, 0x09, 0x09, 0x00, 0x4d, 0xb0, 0x41, + 0x10, 0x46, 0x25, 0xc1, 0x09, 0x09, 0x06, 0x0d, + 0xb6, 0x01, 0x09, 0x09, 0x00, 0x4d, 0x08, 0x89, + 0xb0, 0x41, 0x10, 0x46, 0x26, 0x01, 0x00, 0x8d, + 0x08, 0x89, 0x10, 0x82, 0xd0, 0x04, 0xc0, 0x55, + 0x00, 0x40, 0x40, 0x40, 0x05, 0x4d, 0x08, 0x49, + 0x0b, 0x0d, 0xd1, 0x00, 0x15, 0x63, 0xe9, 0xa2, + 0xd1, 0x01, 0x55, 0x41, 0xdb, 0x01, 0x4b, 0x15, + 0xa1, 0x1b, 0x08, 0x89, 0x00, 0x4d, 0x08, 0x49, + 0x10, 0x41, 0xd1, 0x19, 0x46, 0x44, 0x26, 0x41, + 0x00, 0xcd, 0x08, 0x49, 0x10, 0xc4, 0x00, 0x4d, + 0x08, 0x49, 0x10, 0x41, 0x20, 0x81, 0xa0, 0x89, + 0x00, 0x4d, 0x10, 0x43, 0x20, 0xc1, 0xa0, 0xe8, + 0x08, 0x49, 0x00, 0x4d, 0x1b, 0x03, 0x5b, 0x01, + 0xbb, 0x3f, 0x6b, 0x06, 0x08, 0x49, 0xb1, 0xbc, + 0x00, 0x4d, 0x60, 0x46, 0x08, 0x49, 0xb1, 0xbc, + 0x0a, 0xcd, 0x1a, 0xc2, 0x4a, 0xd9, 0x1a, 0xde, + 0x6a, 0xc6, 0x08, 0x49, 0xb1, 0xbc, 0x00, 0x4d, + 0x60, 0x46, 0x10, 0x60, 0xea, 0x3e, 0xb1, 0xbc, + 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x08, 0xc9, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x09, 0xc9, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0x0a, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xe2, 0x3e, + 0x11, 0xe3, 0xfa, 0x00, 0x00, 0xe7, 0xd0, 0xc0, + 0xd0, 0x84, 0xb0, 0x81, 0xe6, 0x3e, 0x08, 0x49, + 0x00, 0x4d, 0x60, 0x43, 0xb0, 0xfc, 0x10, 0x60, + 0xe9, 0xe7, 0x10, 0xa3, 0xf9, 0xf4, 0x00, 0xe8, + 0xd1, 0x80, 0xe1, 0xf8, 0x10, 0xa2, 0xf9, 0xfa, + 0x00, 0xe9, 0xd1, 0x80, 0xf2, 0xb0, 0xe1, 0xe7, + 0xd2, 0x3f, 0x0a, 0x09, 0x00, 0x4d, 0xb2, 0x01, + 0xf5, 0xfb, 0xe1, 0xe7, 0x11, 0xe7, 0xfa, 0x3e, + 0xd4, 0x01, 0x00, 0xe1, 0xd0, 0x24, 0x70, 0x00, + 0x10, 0x21, 0xea, 0x0d, 0x15, 0x63, 0xfa, 0x0d, + 0xd4, 0x03, 0x44, 0x2c, 0xb4, 0x3f, 0x00, 0xe6, + 0xd1, 0x90, 0x0b, 0x09, 0x00, 0x4d, 0x09, 0x49, + 0x10, 0x45, 0x00, 0x8d, 0x50, 0x81, 0xd0, 0x40, + 0x10, 0x87, 0x10, 0x98, 0x30, 0x42, 0xf2, 0x61, + 0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x09, 0x00, 0x0d, + 0x09, 0x49, 0x00, 0x0d, 0xb4, 0x01, 0xfa, 0x0f, + 0x00, 0xe6, 0xd0, 0x18, 0x30, 0x06, 0xe6, 0x29, + 0x60, 0x46, 0xb1, 0xbc, 0xe2, 0x22, 0x00, 0xe0, + 0xd1, 0x88, 0x70, 0x46, 0x10, 0x63, 0xea, 0x39, + 0x10, 0x64, 0xea, 0x39, 0x00, 0xe6, 0xd1, 0x90, + 0xd0, 0x00, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, + 0xb1, 0xbc, 0x60, 0x06, 0xe2, 0x3e, 0x00, 0xef, + 0xd1, 0x84, 0x70, 0x46, 0x10, 0x60, 0xfa, 0x30, + 0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, 0xe6, 0x3f, + 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, + 0x30, 0x54, 0xfa, 0x4b, 0xd4, 0x40, 0xf3, 0xb0, + 0xe2, 0x43, 0xb0, 0x7d, 0xe9, 0x7a, 0x00, 0xec, + 0xd1, 0xa0, 0xd0, 0x40, 0x60, 0x46, 0x02, 0x3c, + 0xdc, 0x89, 0x00, 0xec, 0xd1, 0x80, 0x70, 0x46, + 0xb1, 0xbc, 0x70, 0x86, 0x30, 0x81, 0xe8, 0x46, + 0x15, 0x63, 0xea, 0x5e, 0x05, 0x5e, 0xe8, 0x46, + 0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, 0x00, 0xe0, + 0xd0, 0x00, 0x70, 0xc0, 0x10, 0xc1, 0x00, 0xe0, + 0xd0, 0x08, 0x70, 0x00, 0x10, 0x23, 0xea, 0x75, + 0xc0, 0x83, 0x10, 0x9d, 0x30, 0xc2, 0x10, 0x9f, + 0x30, 0xc2, 0x00, 0xef, 0xd0, 0xac, 0x70, 0x82, + 0x10, 0xa3, 0xea, 0x75, 0x10, 0xc1, 0xc0, 0x83, + 0x30, 0x81, 0xe6, 0x7e, 0xc0, 0x83, 0x20, 0x81, + 0xf6, 0x7f, 0xd0, 0x40, 0x30, 0x43, 0x0f, 0xc5, + 0xc0, 0x43, 0x0f, 0xc5, 0x00, 0xed, 0xd1, 0xa4, + 0x72, 0x86, 0x15, 0xa3, 0xee, 0x23, 0x15, 0xa1, + 0xe6, 0x23, 0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, + 0xd8, 0xc4, 0x15, 0x63, 0xe9, 0x7e, 0x48, 0xd5, + 0x18, 0xde, 0x18, 0xe0, 0xe9, 0xc2, 0x00, 0xed, + 0xd1, 0xb4, 0x79, 0xc6, 0x19, 0xe0, 0xe9, 0x8c, + 0x00, 0xed, 0xd0, 0x3a, 0x79, 0xc6, 0x69, 0xc0, + 0xd9, 0xc0, 0x69, 0xc6, 0x00, 0xed, 0xd0, 0x38, + 0x79, 0x40, 0x19, 0x60, 0xe9, 0x98, 0x00, 0x28, + 0xd0, 0x24, 0x70, 0x40, 0x02, 0x20, 0xd0, 0x80, + 0x50, 0x42, 0x60, 0x40, 0x15, 0xa3, 0xe9, 0x9f, + 0x00, 0xec, 0xd1, 0xb8, 0x79, 0xc6, 0x69, 0x46, + 0xc9, 0x67, 0x00, 0xec, 0xd9, 0xb4, 0x70, 0x66, + 0x00, 0xec, 0xd1, 0xbc, 0x70, 0x06, 0x10, 0x20, + 0xed, 0xbe, 0x10, 0x60, 0xe9, 0xc1, 0x00, 0xe0, + 0xda, 0xa8, 0x7a, 0xaa, 0xc0, 0x2a, 0x10, 0x1f, + 0x00, 0x22, 0xd0, 0xa0, 0x70, 0x82, 0x20, 0x6a, + 0x00, 0x9f, 0xe9, 0xb5, 0x20, 0x40, 0x19, 0x60, + 0xf9, 0xb8, 0xc9, 0x41, 0xb0, 0x48, 0x30, 0x65, + 0xf5, 0xbd, 0xb0, 0x70, 0xed, 0xbe, 0xd9, 0x40, + 0x00, 0xed, 0xd1, 0xbc, 0x69, 0x46, 0x69, 0x66, + 0x12, 0xa4, 0xea, 0x21, 0x00, 0xec, 0xd1, 0xbc, + 0x73, 0xc6, 0x15, 0xa3, 0xe9, 0xdf, 0x33, 0xe3, + 0xe5, 0xd3, 0xed, 0xd2, 0x63, 0xc6, 0x00, 0x21, + 0xd1, 0xa8, 0x63, 0xc6, 0x00, 0xed, 0xd1, 0xa0, + 0x63, 0xc6, 0x15, 0xa1, 0xf9, 0xdc, 0x12, 0xa3, + 0xe5, 0xe3, 0xd3, 0xc2, 0x00, 0xec, 0xd1, 0xbc, + 0x63, 0xc6, 0xe1, 0xe3, 0x12, 0xa3, 0xea, 0x21, + 0xe1, 0xe3, 0x12, 0xa2, 0xf6, 0x21, 0x13, 0xe0, + 0xfa, 0x21, 0x00, 0xee, 0xd1, 0x8c, 0x78, 0x06, + 0xb1, 0xbc, 0x78, 0x46, 0xb1, 0xbc, 0x78, 0x86, + 0xd1, 0x88, 0x72, 0x46, 0xd1, 0x84, 0x73, 0x06, + 0x13, 0x20, 0xf9, 0xe3, 0x00, 0x64, 0xd1, 0xa0, + 0x70, 0x46, 0xd0, 0xa2, 0x30, 0x81, 0xe9, 0xff, + 0x10, 0x70, 0xea, 0x11, 0x10, 0x6d, 0xea, 0x14, + 0x10, 0x76, 0xea, 0x19, 0x10, 0x7a, 0xea, 0x28, + 0xe2, 0x3b, 0x18, 0xe0, 0xea, 0x3b, 0x00, 0xed, + 0xd1, 0x80, 0x70, 0x86, 0xb0, 0x81, 0xd0, 0x3f, + 0x40, 0x02, 0x10, 0x20, 0xea, 0x0c, 0x60, 0x86, + 0xf3, 0x8a, 0xe1, 0xe3, 0xc0, 0x02, 0x10, 0x1a, + 0x50, 0x80, 0x60, 0x86, 0xe2, 0x3b, 0x15, 0xa3, + 0xea, 0x21, 0xe2, 0xe9, 0xd2, 0x80, 0x00, 0xed, + 0xd1, 0xa4, 0x62, 0x86, 0xe3, 0x0c, 0x00, 0xed, + 0xd1, 0x88, 0xd0, 0x60, 0x70, 0x06, 0x50, 0x40, + 0x60, 0x46, 0x15, 0xa3, 0xfb, 0x0c, 0xd5, 0x84, + 0xe3, 0x0c, 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, + 0xde, 0x1a, 0xe0, 0x46, 0x00, 0xed, 0xd1, 0x88, + 0xd0, 0x60, 0x70, 0x06, 0x50, 0x40, 0x60, 0x46, + 0x15, 0xa2, 0xe7, 0x0c, 0xee, 0x21, 0x00, 0x21, + 0xd1, 0x8c, 0x18, 0xe0, 0xfa, 0x39, 0x70, 0x46, + 0x10, 0x61, 0xea, 0x70, 0xe2, 0x21, 0x65, 0x86, + 0xe2, 0x21, 0x18, 0xe0, 0xea, 0x70, 0xd1, 0x80, + 0x73, 0x06, 0x15, 0xa2, 0xee, 0x68, 0x00, 0x22, + 0xd1, 0x80, 0x70, 0x46, 0x6b, 0x06, 0xcb, 0x01, + 0xb1, 0xb4, 0x70, 0x46, 0x6a, 0xc6, 0xca, 0xc1, + 0x00, 0x65, 0xd1, 0x98, 0x70, 0x46, 0x10, 0x61, + 0xfa, 0x50, 0x02, 0x41, 0xc3, 0x21, 0xc7, 0xe0, + 0x02, 0x50, 0xea, 0x56, 0xc3, 0x20, 0xc7, 0xe1, + 0xd1, 0x88, 0xd0, 0x01, 0x02, 0x40, 0x62, 0x46, + 0x0f, 0xef, 0xd0, 0x7f, 0x30, 0x6f, 0xfa, 0x5f, + 0xc3, 0x20, 0xc7, 0x4c, 0xd0, 0x00, 0x00, 0x65, + 0xd1, 0x98, 0x70, 0x46, 0x60, 0x06, 0xb0, 0x41, + 0x43, 0x01, 0xe2, 0x70, 0xc3, 0x22, 0xc7, 0xcc, + 0xc7, 0x60, 0xc7, 0xa1, 0x02, 0x50, 0xea, 0x70, + 0xc7, 0x61, 0xc7, 0xa0, 0xdb, 0x80, 0xd1, 0x00, + 0x00, 0xef, 0xd1, 0xa8, 0x70, 0x46, 0x10, 0x60, + 0xfa, 0x7a, 0x00, 0xe0, 0xd1, 0x88, 0x70, 0x46, + 0x00, 0x22, 0xd1, 0xb0, 0x70, 0x86, 0x30, 0x81, + 0xea, 0x82, 0x60, 0x46, 0xd0, 0x20, 0xf3, 0x06, + 0x10, 0x63, 0xea, 0x87, 0x10, 0x64, 0xea, 0x87, + 0xe2, 0x95, 0x00, 0xef, 0xd1, 0x6c, 0x71, 0x45, + 0xc0, 0x05, 0x30, 0x01, 0xf6, 0x95, 0xdb, 0x82, + 0xd1, 0x01, 0x10, 0x63, 0xea, 0x95, 0xd1, 0x02, + 0x11, 0x62, 0xea, 0x95, 0xd1, 0x03, 0xd1, 0x8c, + 0x61, 0x06, 0xdb, 0x40, 0x00, 0xe0, 0xd0, 0x00, + 0x71, 0x00, 0xc0, 0x84, 0x10, 0x9c, 0xb0, 0x96, + 0xfa, 0xa0, 0xb1, 0x38, 0xb0, 0x96, 0xfa, 0xa3, + 0xb1, 0x30, 0x00, 0x29, 0xd1, 0x84, 0x00, 0x22, + 0xd0, 0x74, 0x70, 0x86, 0x70, 0xc1, 0x61, 0x06, + 0x30, 0xc2, 0xea, 0xae, 0x60, 0x81, 0xdb, 0x41, + 0xb0, 0x3c, 0xb1, 0xbc, 0xb0, 0x7c, 0x71, 0x00, + 0x70, 0x86, 0x70, 0xc1, 0x61, 0x06, 0x30, 0xc2, + 0xea, 0xb9, 0x60, 0x81, 0xdb, 0x41, 0x00, 0xee, + 0xd1, 0xb4, 0x70, 0x06, 0xb1, 0xbc, 0x70, 0x46, + 0x30, 0x40, 0xea, 0xc2, 0x60, 0x06, 0xdb, 0x41, + 0x00, 0x24, 0xd0, 0x60, 0x30, 0x81, 0xea, 0xc7, + 0x30, 0x81, 0x50, 0x02, 0xea, 0xca, 0xd0, 0x01, + 0x00, 0x22, 0xd1, 0xbc, 0x70, 0x86, 0x30, 0x80, + 0xea, 0xd2, 0x60, 0x06, 0xd0, 0x10, 0xf3, 0x06, + 0x00, 0x22, 0xd1, 0xa4, 0x71, 0x06, 0xd0, 0x01, + 0x41, 0x00, 0x5b, 0x44, 0x5b, 0x6e, 0x6b, 0x46, + 0x00, 0x28, 0xd0, 0x70, 0x70, 0x41, 0x10, 0x62, + 0xfa, 0xe6, 0xd1, 0x84, 0x70, 0x06, 0x10, 0x20, + 0xfa, 0xdf, 0x00, 0x22, 0xd0, 0x00, 0xf3, 0x06, + 0x02, 0x7d, 0xde, 0x68, 0xe0, 0x46, 0x00, 0xed, + 0xd1, 0x88, 0x71, 0x06, 0x01, 0x1f, 0xfa, 0xfd, + 0xd0, 0x41, 0x41, 0x01, 0xd0, 0x62, 0x00, 0x65, + 0xd0, 0x30, 0x70, 0x00, 0x10, 0x21, 0xea, 0xfa, + 0xee, 0xf9, 0x1a, 0xe1, 0xfa, 0xfa, 0xd0, 0x52, + 0x51, 0x01, 0x61, 0x06, 0xe3, 0x0c, 0x18, 0xe0, + 0xea, 0x70, 0xc7, 0x60, 0xc7, 0xe1, 0x02, 0x50, + 0xea, 0x70, 0xc7, 0x61, 0xc7, 0xe0, 0xe2, 0x70, + 0x00, 0x28, 0xdc, 0xa4, 0x7c, 0x72, 0x5c, 0x40, + 0x6c, 0x72, 0x0f, 0xc5, 0x18, 0xe0, 0xeb, 0x82, + 0xd9, 0x0d, 0x00, 0xee, 0xd1, 0xa4, 0x70, 0x06, + 0x10, 0x21, 0xfb, 0x7f, 0xd9, 0x0c, 0x90, 0x06, + 0x00, 0x10, 0xeb, 0x7f, 0x00, 0x21, 0xd1, 0x88, + 0x7a, 0x06, 0x1a, 0x20, 0xeb, 0x7f, 0xd9, 0x00, + 0x00, 0xed, 0xd1, 0xbc, 0x79, 0x46, 0x19, 0x60, + 0xeb, 0x7f, 0x39, 0x68, 0xc0, 0xe5, 0xc0, 0x25, + 0x10, 0x13, 0xb0, 0x0f, 0xef, 0x7f, 0xb0, 0x22, + 0xe7, 0x7f, 0x00, 0xe0, 0xd1, 0xa8, 0x71, 0x46, + 0x11, 0x5f, 0x29, 0x45, 0x00, 0x22, 0xd0, 0x18, + 0x00, 0x22, 0xd4, 0x54, 0x00, 0x22, 0xd0, 0x9c, + 0x70, 0x00, 0x74, 0x51, 0x70, 0x42, 0x34, 0x40, + 0xe7, 0x3c, 0xd0, 0x40, 0x00, 0x22, 0xd4, 0x50, + 0x74, 0x51, 0x34, 0x40, 0xef, 0x42, 0x20, 0x45, + 0x60, 0x42, 0x39, 0x41, 0x19, 0x60, 0xf7, 0x5e, + 0x00, 0x65, 0xd1, 0xa8, 0x7a, 0x86, 0x29, 0x6a, + 0x19, 0x59, 0xb9, 0x7e, 0xf7, 0x75, 0x15, 0xa3, + 0xf7, 0x57, 0x00, 0xed, 0xd1, 0xac, 0x70, 0x06, + 0x00, 0xed, 0xd1, 0xb0, 0x70, 0x46, 0x30, 0x01, + 0xfb, 0x7f, 0x00, 0x65, 0xd1, 0x84, 0x70, 0x46, + 0xb0, 0x7f, 0x60, 0x46, 0xd5, 0x84, 0xe3, 0x7f, + 0x11, 0x41, 0xd0, 0x4a, 0x00, 0xed, 0xd1, 0xa0, + 0x74, 0x46, 0xd0, 0x00, 0x60, 0x06, 0x30, 0xc5, + 0x39, 0x45, 0xe7, 0x6e, 0x14, 0x60, 0xeb, 0x6b, + 0xf3, 0x85, 0xb0, 0x41, 0xef, 0x65, 0xe3, 0x71, + 0x00, 0x66, 0xd1, 0xa0, 0x60, 0xc6, 0x15, 0xa3, + 0xeb, 0x7f, 0xf3, 0x85, 0xe3, 0x7f, 0xd9, 0x01, + 0x00, 0x66, 0xd1, 0xa0, 0x70, 0x06, 0x30, 0x03, + 0xe7, 0x7e, 0x10, 0x1d, 0x10, 0x3b, 0xe7, 0x7f, + 0x60, 0xc6, 0x00, 0x66, 0xd1, 0xa4, 0x69, 0x06, + 0x15, 0xa4, 0xea, 0x23, 0xe2, 0x3b, 0x00, 0x65, + 0xdd, 0x08, 0x7c, 0xf4, 0xbc, 0xff, 0x6c, 0xf4, + 0x00, 0xef, 0xdd, 0x10, 0x7c, 0xf4, 0xbc, 0xfe, + 0x6c, 0xf4, 0xc0, 0x3f, 0xf1, 0x18, 0xf1, 0x16, + 0xf1, 0x18, 0x00, 0x05, 0x08, 0x20, 0xd0, 0x40, + 0x5f, 0x01, 0x15, 0x63, 0xe9, 0x77, 0x05, 0x5e, + 0xeb, 0x08, 0x00, 0x22, 0xd1, 0xa0, 0x6b, 0x06, + 0x00, 0x22, 0xd1, 0xa8, 0x6b, 0xc6, 0x00, 0x22, + 0xd1, 0xac, 0x6a, 0xc6, 0x00, 0xee, 0xd0, 0x0c, + 0x00, 0xe6, 0xd1, 0x9c, 0x70, 0x40, 0x30, 0x5f, + 0xe9, 0x8d, 0xb0, 0x3c, 0xb1, 0xb4, 0x70, 0x40, + 0x30, 0x5f, 0xe9, 0x8d, 0xb1, 0xb4, 0x00, 0xe6, + 0xd0, 0x10, 0xd0, 0x83, 0x70, 0x40, 0x60, 0x46, + 0xb0, 0x3c, 0xb1, 0xbc, 0xb0, 0x81, 0xed, 0x90, + 0x00, 0xee, 0xd0, 0x0c, 0x00, 0xe6, 0xd1, 0x9c, + 0x70, 0x40, 0x30, 0x4c, 0xe9, 0xa3, 0xb0, 0x3c, + 0xb1, 0xb4, 0x70, 0x40, 0x30, 0x4c, 0xe9, 0xa3, + 0xb1, 0xb4, 0x00, 0xe6, 0xd0, 0x00, 0x61, 0x80, + 0x00, 0x21, 0xd1, 0xb4, 0x70, 0x06, 0x10, 0x20, + 0xe9, 0xae, 0xd0, 0x00, 0x60, 0x06, 0xf1, 0x18, + 0x00, 0x21, 0xd1, 0x8c, 0x70, 0x46, 0x65, 0x86, + 0xde, 0xc0, 0x00, 0xee, 0xd0, 0x20, 0x70, 0x00, + 0x10, 0x22, 0xfd, 0xb9, 0xde, 0xc2, 0x00, 0x21, + 0xd0, 0x04, 0x70, 0x00, 0x10, 0x21, 0xe9, 0xc0, + 0x15, 0xa3, 0xe9, 0xdc, 0xd0, 0x02, 0x4c, 0x00, + 0x10, 0x63, 0xe9, 0xc5, 0xcc, 0x3b, 0xd0, 0x04, + 0x63, 0x00, 0xd0, 0x00, 0x70, 0x00, 0x30, 0x1f, + 0xfb, 0x08, 0xd0, 0x18, 0x70, 0x00, 0x10, 0x20, + 0xed, 0xc7, 0xd0, 0x04, 0x70, 0x80, 0x10, 0xa0, + 0xeb, 0x08, 0xf1, 0x16, 0x00, 0x21, 0xd0, 0x9a, + 0xc0, 0x39, 0x30, 0x1f, 0x10, 0x18, 0x30, 0x02, + 0xfd, 0xcf, 0xe3, 0x08, 0x00, 0xe0, 0xd9, 0x04, + 0x79, 0x24, 0xb9, 0x38, 0x19, 0x1c, 0xdc, 0x88, + 0x4c, 0xac, 0xd0, 0x02, 0x40, 0x2c, 0x10, 0x02, + 0x0c, 0x80, 0x10, 0x63, 0xea, 0x70, 0x15, 0x63, + 0xf9, 0xec, 0xf1, 0x18, 0x00, 0xef, 0xdc, 0x00, + 0x7c, 0x30, 0x00, 0x24, 0xd0, 0x30, 0x70, 0x00, + 0x10, 0x21, 0xf9, 0xf6, 0xbc, 0x3b, 0xe1, 0xfd, + 0x10, 0x22, 0xf9, 0xfa, 0xbc, 0x38, 0xe1, 0xfd, + 0x10, 0x23, 0xf9, 0xfd, 0xbc, 0x3c, 0x1e, 0xe0, + 0xea, 0x03, 0x15, 0x63, 0xfa, 0x02, 0xbe, 0xfc, + 0xdc, 0x12, 0x0e, 0xde, 0xfa, 0x09, 0xc0, 0x24, + 0x30, 0x30, 0xf6, 0x09, 0x2c, 0x00, 0xd0, 0x2c, + 0x6c, 0x00, 0x1e, 0xe0, 0xea, 0x0f, 0xcc, 0x24, + 0x1c, 0x1f, 0xd9, 0x40, 0x06, 0x50, 0xea, 0x22, + 0xc0, 0x24, 0xb0, 0x12, 0xfe, 0x22, 0xd9, 0x74, + 0x79, 0x65, 0x19, 0x5f, 0x30, 0x25, 0xee, 0x1b, + 0x29, 0x40, 0x19, 0x5f, 0x19, 0x41, 0xc0, 0x25, + 0x20, 0x30, 0x30, 0x24, 0xe6, 0x22, 0x3c, 0x00, + 0xd0, 0x38, 0x69, 0x40, 0x1c, 0x05, 0xbc, 0x38, + 0x3c, 0x32, 0x5c, 0x3b, 0xbc, 0x3f, 0xd8, 0xec, + 0x78, 0xe3, 0xc0, 0xa3, 0x10, 0xb2, 0xf6, 0x2f, + 0xd0, 0x92, 0x02, 0xe4, 0xd8, 0x00, 0xd0, 0xc0, + 0x20, 0xe0, 0xb0, 0x81, 0xee, 0x32, 0xd0, 0x30, + 0x60, 0xc0, 0x00, 0xac, 0xd0, 0x20, 0xc0, 0xc0, + 0xd8, 0x40, 0xc1, 0x23, 0xd4, 0x64, 0x34, 0x63, + 0xdc, 0x40, 0x0c, 0x1f, 0xfa, 0x5b, 0xc0, 0x65, + 0xb0, 0x41, 0xe6, 0x47, 0x68, 0x40, 0xb0, 0x3c, + 0xe2, 0x42, 0xc0, 0xc0, 0x34, 0x65, 0xdc, 0x48, + 0x4c, 0x70, 0x1c, 0x5f, 0x20, 0xf1, 0x15, 0x63, + 0xfa, 0x5c, 0xf2, 0x54, 0xc1, 0x11, 0xc0, 0x83, + 0xf2, 0xa5, 0xe2, 0x6f, 0xb1, 0x01, 0xe6, 0x5a, + 0x68, 0x40, 0x28, 0x60, 0xb0, 0x3c, 0xe2, 0x54, + 0x0f, 0xc5, 0xd9, 0x40, 0xb1, 0x12, 0x11, 0x01, + 0x21, 0x25, 0xf2, 0x54, 0xc1, 0x11, 0xb1, 0x01, + 0xe6, 0x6f, 0x20, 0x31, 0x68, 0x40, 0x30, 0x31, + 0xb0, 0x3c, 0x28, 0x60, 0x70, 0x43, 0x30, 0x31, + 0x60, 0x40, 0x20, 0x31, 0xb0, 0x3c, 0xb0, 0xf8, + 0xe2, 0x61, 0xe2, 0xf7, 0xd8, 0xec, 0x78, 0xe3, + 0x00, 0xa8, 0xd0, 0x80, 0x00, 0xa8, 0xd1, 0x44, + 0x00, 0xac, 0xd0, 0x20, 0xc0, 0xc0, 0x0c, 0x1f, + 0xfa, 0xb3, 0xd9, 0x78, 0x79, 0x65, 0x39, 0x25, + 0x19, 0x5f, 0xc9, 0xa5, 0x19, 0x83, 0x20, 0x26, + 0x20, 0xe6, 0x20, 0xa6, 0x21, 0x66, 0xc1, 0x23, + 0xc0, 0x64, 0x10, 0x5f, 0x10, 0x9d, 0x20, 0x81, + 0x31, 0x01, 0x30, 0x44, 0xf6, 0x8e, 0x21, 0x01, + 0x30, 0x84, 0x10, 0x83, 0xc4, 0x64, 0x34, 0x63, + 0xdc, 0x48, 0x4c, 0x70, 0x1c, 0x5f, 0x15, 0x63, + 0xfa, 0xc3, 0x20, 0xb1, 0xf2, 0xa5, 0xc1, 0x24, + 0x11, 0x1f, 0xc0, 0x85, 0x30, 0xb1, 0xf2, 0xa5, + 0xc1, 0x11, 0xc0, 0x83, 0x0c, 0x9d, 0xfa, 0xa3, + 0xb0, 0xbc, 0xf2, 0xa5, 0xe2, 0xec, 0xb1, 0x01, + 0xe6, 0x5a, 0x70, 0x42, 0xb0, 0xb8, 0x60, 0x40, + 0xb0, 0x3c, 0xe2, 0xa5, 0xb1, 0x01, 0xe6, 0x5a, + 0x70, 0x42, 0xb0, 0xb8, 0x60, 0x40, 0xb0, 0x38, + 0xe2, 0xac, 0x00, 0xac, 0xd0, 0x24, 0xc1, 0x23, + 0xb1, 0x12, 0xf2, 0xac, 0xd1, 0x24, 0x31, 0x23, + 0x00, 0xa8, 0xd0, 0x84, 0xf2, 0xac, 0xd1, 0x12, + 0x00, 0xa8, 0xd0, 0x84, 0xc0, 0x03, 0xf2, 0xac, + 0xe2, 0xec, 0xd8, 0x82, 0x48, 0x95, 0x18, 0x81, + 0xb1, 0x01, 0xe6, 0xd9, 0x20, 0xb1, 0x70, 0x42, + 0x30, 0xb1, 0x20, 0x22, 0x60, 0x40, 0x30, 0x22, + 0xb0, 0xbc, 0xb0, 0x3c, 0x30, 0xb1, 0x70, 0x42, + 0x20, 0xb1, 0x30, 0x22, 0x60, 0x40, 0x20, 0x22, + 0xb0, 0xbc, 0xb0, 0x3c, 0xe2, 0xc6, 0xc1, 0x11, + 0xc0, 0x85, 0x30, 0xb1, 0x20, 0xe2, 0xb1, 0x01, + 0xe6, 0xec, 0x70, 0x42, 0xb0, 0xb8, 0x20, 0x22, + 0x60, 0x40, 0x30, 0x22, 0xb0, 0x3c, 0x70, 0x43, + 0xb0, 0xf8, 0x30, 0x22, 0x60, 0x40, 0x20, 0x22, + 0xb0, 0x3c, 0xe2, 0xdd, 0xd0, 0x08, 0x5c, 0x00, + 0x3c, 0x32, 0xd0, 0x04, 0x40, 0x30, 0x3c, 0x00, + 0x15, 0x63, 0xfa, 0xf7, 0x1e, 0xe0, 0xea, 0xf7, + 0xbc, 0x3c, 0x00, 0xac, 0xd0, 0xa0, 0x00, 0xa8, + 0xd0, 0x00, 0x00, 0x20, 0xd1, 0x24, 0x70, 0x42, + 0xb0, 0xbc, 0x60, 0x40, 0xb0, 0x3c, 0xb1, 0x01, + 0xee, 0xfd, 0xd0, 0x30, 0x30, 0x30, 0xef, 0x03, + 0xd0, 0x04, 0x63, 0x00, 0x08, 0x20, 0xd0, 0x40, + 0x3f, 0x01, 0x02, 0xba, 0xde, 0x3c, 0xe0, 0x46, + 0x50, 0x00, 0x50, 0x00, 0x01, 0x46, 0xd0, 0x08, + 0x94, 0x89, 0xd0, 0x8c, 0x44, 0x82, 0x14, 0x9e, + 0x30, 0x12, 0xd0, 0x88, 0x10, 0x80, 0x00, 0xe8, + 0xd1, 0x80, 0x70, 0xc6, 0x00, 0x06, 0xa0, 0xbd, + 0xa0, 0xfc, 0x80, 0x3f, 0xb1, 0xbe, 0x60, 0xc6, + 0x00, 0x06, 0x80, 0xa9, 0x80, 0x3f, 0x80, 0x2a, + 0x80, 0x3f, 0x00, 0x21, 0xd0, 0x3c, 0x00, 0x0a, + 0xb1, 0x82, 0xd0, 0x6b, 0x70, 0x46, 0x00, 0x06, + 0x80, 0x07, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, + 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, + 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, + 0xd0, 0x00, 0xa0, 0x29, 0x80, 0x2b, 0x0c, 0x20, + 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0x90, 0x09, + 0xd0, 0x41, 0x40, 0x01, 0xd0, 0x44, 0x40, 0x70, + 0x20, 0x01, 0xa0, 0x27, 0x80, 0x3f, 0x00, 0xc6, + 0x15, 0x63, 0xe9, 0xae, 0x05, 0x5e, 0xe9, 0xbe, + 0x00, 0xe0, 0xd0, 0x40, 0x70, 0x81, 0x10, 0x9c, + 0xb0, 0x96, 0xf9, 0xb7, 0x00, 0x21, 0xd0, 0x40, + 0xe1, 0xbb, 0xb0, 0x96, 0xf9, 0xbe, 0x00, 0x22, + 0xd0, 0x40, 0x27, 0xc1, 0x27, 0x41, 0x27, 0x81, + 0x90, 0x83, 0x00, 0x64, 0xd0, 0x10, 0x60, 0x80, + 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0x00, 0x64, + 0xd0, 0x14, 0x67, 0x40, 0x80, 0x34, 0x80, 0x3f, + 0x00, 0xc6, 0x90, 0xae, 0x00, 0x64, 0xd0, 0x18, + 0x60, 0x80, 0x90, 0xa6, 0x00, 0x64, 0xd0, 0x1c, + 0x60, 0x80, 0x15, 0x63, 0xe9, 0xe3, 0x0c, 0x1f, + 0xe9, 0xe3, 0x05, 0x50, 0xf9, 0xe3, 0x15, 0xa3, + 0xf9, 0xe3, 0x90, 0x4d, 0x10, 0x60, 0xe5, 0xdb, + 0x00, 0x06, 0x05, 0x0d, 0x01, 0x7a, 0xde, 0x1a, + 0xe0, 0x46, 0x15, 0xa3, 0xf9, 0xfb, 0x00, 0x21, + 0xd0, 0x04, 0x70, 0x00, 0x10, 0x21, 0xe9, 0xfb, + 0xd0, 0x38, 0x70, 0x00, 0x15, 0x63, 0xe9, 0xef, + 0x10, 0x1f, 0x15, 0x21, 0xe5, 0xe0, 0xd0, 0x64, + 0x30, 0x54, 0xe5, 0xe0, 0xc0, 0x40, 0xb0, 0x7f, + 0x30, 0x54, 0xe9, 0xfb, 0x0c, 0x09, 0x05, 0x0d, + 0xe1, 0xef, 0xc0, 0x5f, 0x10, 0x58, 0x10, 0x48, + 0x00, 0xee, 0xd0, 0x8c, 0xd0, 0xc3, 0x70, 0x02, + 0x30, 0x01, 0xea, 0x10, 0xb0, 0xbc, 0xb0, 0xc1, + 0xee, 0x01, 0x00, 0x26, 0xd0, 0x20, 0x70, 0x40, + 0xb0, 0x7f, 0x60, 0x40, 0x15, 0xa3, 0xea, 0x0f, + 0xb0, 0x88, 0x77, 0xc2, 0x80, 0x07, 0x09, 0x49, + 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, + 0x00, 0x4d, 0xa0, 0x6c, 0xd3, 0x80, 0xd0, 0xa1, + 0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, + 0xfa, 0x1a, 0x0c, 0x49, 0x00, 0x8d, 0xc0, 0x42, + 0x10, 0x60, 0xea, 0x2a, 0xb0, 0x5e, 0xb0, 0x43, + 0xfe, 0x34, 0xd0, 0x61, 0x23, 0x81, 0xe2, 0x1f, + 0x0c, 0x09, 0x05, 0x0d, 0x15, 0x20, 0xfe, 0x31, + 0xd0, 0x65, 0x30, 0x54, 0xee, 0x10, 0x03, 0xb4, + 0xd6, 0x29, 0xe0, 0x46, 0xc6, 0xd4, 0xb6, 0xc1, + 0xe6, 0x31, 0xd0, 0x64, 0x30, 0x5b, 0xfe, 0x31, + 0xd7, 0x00, 0xb7, 0x01, 0xd3, 0x81, 0x00, 0x27, + 0xd0, 0x10, 0xd0, 0x81, 0x60, 0x80, 0x15, 0x63, + 0xfa, 0x54, 0x00, 0x22, 0xdc, 0xd8, 0x03, 0xf8, + 0xd0, 0x10, 0xf0, 0x4a, 0x15, 0xa3, 0xfa, 0x51, + 0x02, 0xf7, 0xdc, 0x26, 0x0c, 0x10, 0xf8, 0x46, + 0x02, 0xfc, 0xd8, 0x22, 0xe0, 0x46, 0x02, 0xf2, + 0xd6, 0x2b, 0xe0, 0x46, 0x00, 0x22, 0xdc, 0xd8, + 0x03, 0xfa, 0xd0, 0x10, 0xf0, 0x4a, 0x03, 0x35, + 0xda, 0x20, 0x15, 0xa3, 0xe8, 0x46, 0x03, 0x30, + 0xdc, 0x27, 0xe0, 0x46, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xe0, + 0xe1, 0xec, 0xe2, 0x12, 0xe2, 0x14, 0xe1, 0xc7, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50, + 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, + 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x64, + 0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31, + 0x10, 0x12, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10, + 0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44, + 0xe1, 0x79, 0x03, 0xde, 0xf9, 0xba, 0x03, 0xdf, + 0xe9, 0x99, 0xd3, 0x40, 0xca, 0x50, 0xd1, 0x42, + 0xe2, 0xea, 0xc0, 0x50, 0x10, 0x54, 0xc0, 0x90, + 0x10, 0x8c, 0x10, 0x92, 0x10, 0xe0, 0xe5, 0xa8, + 0xc0, 0x01, 0x10, 0x01, 0x20, 0x40, 0xc0, 0x02, + 0x10, 0x01, 0x20, 0x80, 0x10, 0x60, 0xfd, 0xab, + 0xb0, 0x7f, 0x10, 0xa0, 0xfd, 0xae, 0xb0, 0xbf, + 0x10, 0x5f, 0x10, 0x9f, 0x00, 0xef, 0xd0, 0x3e, + 0x20, 0x52, 0x20, 0x83, 0x20, 0x93, 0x10, 0x4c, + 0x10, 0x82, 0x40, 0x80, 0x50, 0x42, 0x0f, 0xc5, + 0xcb, 0xaa, 0xcb, 0xeb, 0xca, 0x50, 0xd0, 0xc0, + 0xb0, 0xc1, 0xf1, 0x9b, 0xcb, 0x01, 0xd0, 0xc1, + 0xf1, 0x9b, 0xcb, 0x41, 0xba, 0x7f, 0xbb, 0x3f, + 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, + 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, + 0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0xd5, + 0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, + 0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, + 0x01, 0xb5, 0xd4, 0x00, 0x2c, 0x80, 0xde, 0x84, + 0xde, 0xc4, 0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, + 0x13, 0xa0, 0xed, 0xe5, 0xf2, 0x32, 0xb3, 0x81, + 0xe9, 0xec, 0x80, 0x07, 0xd4, 0x00, 0xc4, 0x50, + 0xd3, 0x08, 0xe2, 0x95, 0xd0, 0x71, 0x20, 0x56, + 0x00, 0x48, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, + 0xe9, 0xfa, 0x06, 0x5e, 0xfa, 0x03, 0x08, 0x89, + 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xfa, 0xd3, 0xc4, + 0x06, 0x5e, 0xfa, 0x03, 0xd0, 0x43, 0x40, 0x4c, + 0xea, 0x03, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87, + 0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, + 0x03, 0x1c, 0xea, 0x0a, 0x09, 0x49, 0x00, 0x0d, + 0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19, + 0xea, 0x10, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b, + 0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50, + 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xd3, + 0xe1, 0xdc, 0xe2, 0x00, 0xe2, 0x02, 0xe1, 0xac, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x91, 0x06, 0x50, + 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, + 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x64, + 0x30, 0x5b, 0xfc, 0x11, 0xbc, 0x10, 0xd0, 0x10, + 0x0c, 0x1e, 0xf9, 0x8e, 0xbc, 0x10, 0xd0, 0x30, + 0xc0, 0x40, 0x30, 0x70, 0xed, 0x8e, 0x03, 0x10, + 0xe9, 0x97, 0x0f, 0x19, 0xf9, 0x93, 0xd1, 0x44, + 0xe1, 0x79, 0x03, 0xdf, 0xe9, 0xa1, 0xd3, 0x40, + 0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa8, + 0xca, 0x12, 0xca, 0x52, 0xe1, 0xa5, 0x03, 0x1d, + 0xf9, 0xa8, 0xca, 0x12, 0xca, 0x53, 0xca, 0xae, + 0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea, + 0xb1, 0x7e, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, + 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xd2, + 0x00, 0xa8, 0xd0, 0x00, 0xcc, 0x5b, 0x1c, 0x5f, + 0x1c, 0x43, 0x20, 0x31, 0x7c, 0x40, 0xb0, 0x3c, + 0x7e, 0x80, 0xcc, 0xb1, 0xce, 0xfa, 0x1c, 0x9f, + 0x1e, 0xdf, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, + 0xe9, 0xc4, 0x3c, 0x80, 0x0e, 0xd9, 0xe9, 0xc7, + 0x3e, 0xc0, 0x3e, 0xf2, 0x3e, 0xb1, 0xd0, 0x01, + 0x40, 0x1b, 0x10, 0x05, 0x20, 0x1f, 0x2c, 0x40, + 0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, + 0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0, + 0xed, 0xd8, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xdc, + 0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c, + 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xe8, 0x06, 0x5e, + 0xf9, 0xf1, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, + 0xf9, 0xe8, 0xd3, 0xc4, 0x06, 0x5e, 0xf9, 0xf1, + 0xd0, 0x43, 0x40, 0x4c, 0xe9, 0xf1, 0x08, 0x49, + 0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46, + 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xf8, + 0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02, + 0xb0, 0x20, 0x03, 0x19, 0xe9, 0xfe, 0xb0, 0x20, + 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80, + 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, + 0xe2, 0x8d, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xc1, + 0xe1, 0xca, 0xe1, 0xee, 0xe1, 0xf0, 0xe1, 0xa8, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50, + 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, + 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x64, + 0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31, + 0x10, 0x12, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10, + 0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44, + 0xe1, 0x79, 0x03, 0xdf, 0xe9, 0x9d, 0xd3, 0x40, + 0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa4, + 0xca, 0x12, 0xca, 0x52, 0xe1, 0xa1, 0x03, 0x1d, + 0xf9, 0xa4, 0xca, 0x12, 0xca, 0x53, 0xca, 0xae, + 0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea, + 0xb1, 0x7e, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, + 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, + 0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0, + 0xe9, 0xb6, 0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80, + 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40, + 0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, + 0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, 0xd3, 0xc2, + 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xc6, 0xf2, 0x32, + 0xb3, 0x81, 0xe9, 0xca, 0x80, 0x07, 0xe2, 0x95, + 0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, + 0xe9, 0xd6, 0x06, 0x5e, 0xf9, 0xdf, 0x08, 0x89, + 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xd6, 0xd3, 0xc4, + 0x06, 0x5e, 0xf9, 0xdf, 0xd0, 0x43, 0x40, 0x4c, + 0xe9, 0xdf, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87, + 0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, + 0x03, 0x1c, 0xe9, 0xe6, 0x09, 0x49, 0x00, 0x0d, + 0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19, + 0xe9, 0xec, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b, + 0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50, + 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xdb, + 0xe1, 0xe9, 0xe2, 0x00, 0xe2, 0x02, 0xe1, 0xc3, + 0xe1, 0x65, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50, + 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, + 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x52, + 0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31, + 0x10, 0x11, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10, + 0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44, + 0xe1, 0x79, 0x03, 0xd0, 0xf9, 0x98, 0xca, 0x50, + 0x03, 0xde, 0xf9, 0x9a, 0xd1, 0x42, 0xe2, 0xea, + 0xcb, 0xaa, 0xcb, 0xeb, 0xc0, 0x50, 0x10, 0x54, + 0xc0, 0x90, 0x10, 0x8c, 0x10, 0x92, 0xd0, 0xc1, + 0x05, 0x50, 0xe9, 0xa5, 0xb0, 0xc2, 0x10, 0x60, + 0xfd, 0xa8, 0xb0, 0x7f, 0x10, 0xa0, 0xfd, 0xab, + 0xb0, 0xbf, 0x10, 0x5f, 0x10, 0x9f, 0x00, 0xef, + 0xd0, 0x3e, 0x20, 0x52, 0x20, 0x83, 0x20, 0x93, + 0x10, 0x4c, 0x10, 0x82, 0x40, 0x80, 0x50, 0x42, + 0xd0, 0x81, 0x14, 0x1f, 0x14, 0x01, 0x05, 0x50, + 0xe9, 0xbd, 0x50, 0x42, 0xe1, 0xbe, 0x54, 0x02, + 0xca, 0x10, 0xca, 0x50, 0xcb, 0x01, 0xcb, 0x41, + 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, + 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x49, + 0xcc, 0xb1, 0x1c, 0x9f, 0xc0, 0x1c, 0x10, 0x08, + 0x20, 0x1f, 0x05, 0x50, 0xf9, 0xd2, 0xb0, 0x3c, + 0x2c, 0x40, 0x2c, 0x80, 0x01, 0xb5, 0xd4, 0x00, + 0x2c, 0x80, 0x02, 0xe4, 0xde, 0x80, 0xde, 0xc1, + 0xe3, 0x1e, 0xd3, 0xc0, 0xf2, 0xd3, 0x13, 0xa0, + 0xed, 0xe0, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xe9, + 0x80, 0x07, 0xd4, 0x02, 0x44, 0x15, 0x14, 0x1f, + 0xc4, 0x50, 0xd3, 0x08, 0xe2, 0x95, 0xd0, 0x71, + 0x20, 0x56, 0x00, 0x48, 0xd1, 0x8c, 0x03, 0x0d, + 0x41, 0x8c, 0xe9, 0xf7, 0x08, 0x89, 0x03, 0xcd, + 0x13, 0xe3, 0xf9, 0xf6, 0xd3, 0xc4, 0xe1, 0xf7, + 0xb3, 0xc1, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, + 0x03, 0x1c, 0xe9, 0xfe, 0x09, 0x49, 0x00, 0x0d, + 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x7f, + 0xd4, 0x02, 0x44, 0x15, 0x14, 0x1f, 0xc4, 0x50, + 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xc9, + 0xe1, 0xd2, 0xe1, 0xe7, 0xe1, 0xe9, 0xe1, 0xab, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x91, 0x06, 0x50, + 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42, + 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x52, + 0x30, 0x5b, 0xfc, 0x11, 0xbc, 0x10, 0xd0, 0x10, + 0x0c, 0x1e, 0xf9, 0x8e, 0xbc, 0x10, 0xd0, 0x20, + 0xc0, 0x40, 0x30, 0x70, 0xed, 0x8e, 0x03, 0x10, + 0xe9, 0x97, 0x0f, 0x19, 0xf9, 0x93, 0xd1, 0x44, + 0xe1, 0x79, 0x03, 0xd0, 0xf9, 0xa0, 0xca, 0x50, + 0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa7, 0xca, 0x12, + 0xca, 0x52, 0xe1, 0xa4, 0x03, 0x1d, 0xf9, 0xa7, + 0xca, 0x12, 0xca, 0x53, 0xca, 0xae, 0xca, 0xef, + 0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, + 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, + 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xc8, 0x00, 0x2a, + 0xd0, 0x00, 0x20, 0x1b, 0x20, 0x1b, 0x05, 0x50, + 0xf9, 0xb8, 0xb0, 0x3f, 0x10, 0x02, 0x7c, 0x40, + 0xcc, 0xb1, 0x1c, 0x9f, 0x01, 0x69, 0xd0, 0x3c, + 0x0c, 0x99, 0xe9, 0xc1, 0x3c, 0x80, 0xde, 0xa0, + 0x2c, 0x5f, 0x2c, 0x9f, 0xd0, 0x30, 0x70, 0x00, + 0x2c, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 0xd3, 0xc0, + 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xce, 0xf2, 0x32, + 0xb3, 0x81, 0xe9, 0xd2, 0x80, 0x07, 0xe2, 0x95, + 0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, + 0xe9, 0xde, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, + 0xf9, 0xdd, 0xd3, 0xc4, 0xe1, 0xde, 0xb3, 0xc1, + 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, + 0xe9, 0xe5, 0x09, 0x49, 0x00, 0x0d, 0xa0, 0x2c, + 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x7f, 0xd4, 0x00, + 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, + 0x50, 0x00, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xa3, + 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8a, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x87, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x64, 0x30, 0x5b, 0xfd, 0xb4, + 0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20, + 0xe9, 0x82, 0xd1, 0x42, 0xd3, 0x40, 0xe2, 0xea, + 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, + 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1, + 0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0x98, 0x01, 0x69, + 0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08, + 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0x01, 0xb5, + 0xd4, 0x00, 0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4, + 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, + 0x30, 0x5a, 0xe5, 0xc8, 0x00, 0x26, 0xd0, 0x00, + 0x70, 0x00, 0x10, 0x20, 0xe9, 0xbf, 0x00, 0xe0, + 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5c, 0x30, 0x5b, + 0xb0, 0x41, 0xed, 0xc8, 0x0f, 0x17, 0xf9, 0xb4, + 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xb8, + 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb4, 0xd6, 0x29, + 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, + 0xe5, 0xc8, 0x0f, 0x17, 0xf9, 0xc3, 0x02, 0xf2, + 0xd6, 0x2b, 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, + 0xe2, 0x95, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xb5, + 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8e, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8b, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x64, 0x30, 0x5b, 0xfd, 0xc6, + 0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x88, + 0xbc, 0x10, 0xd0, 0x30, 0xc0, 0x40, 0x30, 0x70, + 0xed, 0x88, 0xd1, 0x42, 0xd3, 0x40, 0xe2, 0xea, + 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, + 0x17, 0x20, 0xf9, 0xb4, 0x00, 0xa8, 0xd0, 0x00, + 0xcc, 0x5b, 0x1c, 0x5f, 0x1c, 0x43, 0x20, 0x31, + 0x7c, 0x40, 0xb0, 0x3c, 0x7e, 0x80, 0xcc, 0xb1, + 0xce, 0xfa, 0x1c, 0x9f, 0x1e, 0xdf, 0x01, 0x69, + 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xa6, 0x3c, 0x80, + 0x0e, 0xd9, 0xe9, 0xa9, 0x3e, 0xc0, 0x3e, 0xf2, + 0x3e, 0xb1, 0xd0, 0x01, 0x40, 0x1b, 0x10, 0x05, + 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30, + 0x70, 0x00, 0x2c, 0x80, 0xe3, 0x1e, 0xf2, 0xd3, + 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xda, + 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, + 0xe9, 0xd1, 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, + 0x10, 0x5c, 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xda, + 0x0f, 0x17, 0xf9, 0xc6, 0x0f, 0x49, 0xf2, 0xd3, + 0x0f, 0x19, 0xf9, 0xca, 0xdf, 0x00, 0x00, 0x06, + 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, 0xc0, 0x5b, + 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xda, 0x0f, 0x17, + 0xf9, 0xd5, 0x02, 0xf7, 0xdc, 0x26, 0xe0, 0x46, + 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xa2, + 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8a, + 0xe1, 0x65, 0x30, 0x5a, 0xe5, 0x87, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x52, 0x30, 0x5b, 0xfd, 0xb3, + 0xc0, 0x39, 0x30, 0x31, 0x10, 0x11, 0x10, 0x20, + 0xe9, 0x82, 0xd1, 0x42, 0xd3, 0x41, 0xe2, 0xea, + 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, + 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x49, 0xcc, 0xb1, + 0x1c, 0x9f, 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, + 0x05, 0x50, 0xf9, 0x99, 0xb0, 0x3c, 0x2c, 0x40, + 0x2c, 0x80, 0x01, 0xb5, 0xd4, 0x00, 0x2c, 0x80, + 0x02, 0xe4, 0xde, 0x80, 0xde, 0xc1, 0xe3, 0x1e, + 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, + 0xe5, 0xc7, 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, + 0x10, 0x20, 0xe9, 0xbe, 0x00, 0xe0, 0xd0, 0x44, + 0x70, 0x41, 0x10, 0x5b, 0x30, 0x5b, 0xb0, 0x41, + 0xed, 0xc7, 0x0f, 0x17, 0xf9, 0xb3, 0x0f, 0x49, + 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xb7, 0xdf, 0x00, + 0x00, 0x06, 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, + 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xc7, + 0x0f, 0x17, 0xf9, 0xc2, 0x03, 0x30, 0xdc, 0x27, + 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, + 0x50, 0x00, 0x50, 0x00, 0x03, 0x76, 0xd0, 0x73, + 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xac, + 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8e, + 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8b, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x52, 0x30, 0x5b, 0xfd, 0xbd, + 0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x88, + 0xbc, 0x10, 0xd0, 0x20, 0xc0, 0x40, 0x30, 0x70, + 0xed, 0x88, 0xd1, 0x42, 0xd3, 0x41, 0xe2, 0xea, + 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, + 0x17, 0x20, 0xf9, 0xab, 0x00, 0x2a, 0xd0, 0x00, + 0x20, 0x1b, 0x20, 0x1b, 0x05, 0x50, 0xf9, 0x9b, + 0xb0, 0x3f, 0x10, 0x02, 0x7c, 0x40, 0xcc, 0xb1, + 0x1c, 0x9f, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, + 0xe9, 0xa4, 0x3c, 0x80, 0xde, 0xa0, 0x2c, 0x5f, + 0x2c, 0x9f, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, + 0xde, 0xc1, 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, + 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xd1, 0x00, 0x26, + 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 0xe9, 0xc8, + 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5b, + 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xd1, 0x0f, 0x17, + 0xf9, 0xbd, 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, + 0xf9, 0xc1, 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb4, + 0xd6, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, + 0xb0, 0x7e, 0xe5, 0xd1, 0x0f, 0x17, 0xf9, 0xcc, + 0x03, 0x35, 0xda, 0x20, 0xe0, 0x46, 0xd3, 0x08, + 0xd3, 0xc0, 0xe2, 0x95, 0xd0, 0x61, 0x23, 0x81, + 0x0c, 0x49, 0xd0, 0x61, 0x00, 0x8d, 0x10, 0xa0, + 0xea, 0x3b, 0x30, 0x42, 0xe6, 0x30, 0x23, 0x82, + 0x0f, 0xc5, 0x0c, 0x09, 0x05, 0x0d, 0x15, 0x20, + 0xfe, 0x45, 0xd0, 0x65, 0x15, 0x63, 0xea, 0x43, + 0xd0, 0x53, 0x30, 0x54, 0xee, 0x4a, 0x0f, 0x17, + 0xfa, 0x45, 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, + 0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40, + 0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c, + 0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d, + 0x00, 0x50, 0xfa, 0x53, 0xf2, 0x32, 0xd3, 0x80, + 0xe1, 0x76, 0xd1, 0xc2, 0x41, 0xcf, 0x11, 0xdf, + 0xd0, 0x41, 0x01, 0xc1, 0x00, 0xef, 0xd0, 0xbe, + 0x03, 0x10, 0xf9, 0x77, 0x80, 0x07, 0x21, 0x96, + 0x11, 0xa2, 0xe9, 0x78, 0x03, 0x1d, 0xea, 0x73, + 0xc0, 0xd7, 0xc2, 0x90, 0xf2, 0xa4, 0xc4, 0x0a, + 0x03, 0xd0, 0xea, 0x72, 0xc2, 0x91, 0xf2, 0xa4, + 0xc4, 0x4a, 0x03, 0x1e, 0xea, 0x8d, 0xc0, 0xd8, + 0xc2, 0x92, 0xf2, 0xa4, 0xc4, 0x8a, 0x03, 0xd0, + 0xea, 0x7d, 0xc2, 0x93, 0xf2, 0xa4, 0xc4, 0xca, + 0xe2, 0x8d, 0xd3, 0xc0, 0xc0, 0xd7, 0xc2, 0x90, + 0xf2, 0xa4, 0xc4, 0x0a, 0x03, 0xd0, 0xea, 0x88, + 0xc2, 0x91, 0xf2, 0xa4, 0xc4, 0x4a, 0x08, 0x49, + 0x00, 0x4d, 0x10, 0x61, 0xf8, 0x11, 0x03, 0x1f, + 0xea, 0x93, 0x0d, 0xc9, 0x00, 0x4d, 0xd0, 0x1a, + 0xe2, 0x98, 0x03, 0x10, 0xfa, 0x97, 0xd0, 0x1d, + 0xe2, 0x98, 0xd0, 0x18, 0x0f, 0x16, 0xfa, 0x98, + 0xd0, 0x4c, 0x40, 0x4c, 0x10, 0x6c, 0xea, 0xa2, + 0x03, 0xde, 0xfa, 0xa2, 0x0f, 0x12, 0xfa, 0xa0, + 0x00, 0x08, 0xe2, 0xd9, 0xd2, 0x00, 0x13, 0xe1, + 0xee, 0xa9, 0x08, 0x49, 0x02, 0x0d, 0x00, 0xc8, + 0xc2, 0xca, 0x12, 0x94, 0xd0, 0x1f, 0x30, 0x07, + 0x12, 0xc0, 0xc2, 0x43, 0x12, 0x5a, 0x00, 0x0d, + 0x03, 0xde, 0xea, 0xb6, 0x0e, 0xc9, 0x04, 0x8d, + 0x02, 0x48, 0x22, 0x80, 0x12, 0x88, 0xd0, 0x0b, + 0x30, 0x03, 0x12, 0x80, 0xd0, 0x19, 0x20, 0x03, + 0x12, 0x80, 0x00, 0x0d, 0x22, 0xc0, 0x12, 0xc8, + 0xd0, 0x0b, 0x30, 0x09, 0x12, 0xc0, 0x12, 0xd8, + 0xd0, 0x16, 0x20, 0x09, 0x20, 0x07, 0x12, 0xc0, + 0x42, 0xc2, 0x22, 0x8b, 0x22, 0x88, 0x03, 0xde, + 0xea, 0xd2, 0x0e, 0xc9, 0xc4, 0x4a, 0x04, 0xcd, + 0x0f, 0xc5, 0x01, 0x46, 0x90, 0x4d, 0x00, 0xc6, + 0x10, 0x60, 0xe6, 0xd3, 0x0f, 0xc5, 0x01, 0xb5, + 0xd4, 0x00, 0xca, 0x9d, 0xcb, 0x9e, 0xca, 0xea, + 0xcb, 0xee, 0x2a, 0xc0, 0x2b, 0xc0, 0xca, 0x10, + 0xca, 0x51, 0xcb, 0x12, 0xcb, 0x53, 0xd1, 0x40, + 0xd3, 0x41, 0xb7, 0x3f, 0xc0, 0x5c, 0xe1, 0x7b, + 0xd0, 0xc0, 0xc1, 0x28, 0xc2, 0x2a, 0xc2, 0xab, + 0xf1, 0x7a, 0x0f, 0x17, 0xfa, 0xef, 0xcc, 0xe8, + 0xcd, 0x29, 0xcd, 0x6c, 0xcd, 0xad, 0xc8, 0x08, + 0xc8, 0x49, 0xca, 0x0a, 0xca, 0x4b, 0xf3, 0x31, + 0xd0, 0xc1, 0xc1, 0x34, 0xc2, 0x2a, 0xc2, 0xab, + 0xf1, 0x7a, 0x00, 0x28, 0xd9, 0xc0, 0xc8, 0x88, + 0xc8, 0xc9, 0xa9, 0xf8, 0xca, 0x8a, 0xca, 0xcb, + 0x11, 0x62, 0xe9, 0x79, 0xd0, 0xc0, 0xc1, 0x35, + 0xc2, 0x2e, 0xc2, 0xaf, 0xf1, 0x7a, 0xc9, 0x08, + 0xc9, 0x49, 0xa9, 0xf8, 0xcb, 0x0a, 0xcb, 0x4b, + 0xd0, 0xc1, 0xc1, 0x36, 0xc2, 0x2e, 0xc2, 0xaf, + 0xf1, 0x7a, 0xc0, 0x27, 0xc9, 0x88, 0xc9, 0xc9, + 0xa0, 0x38, 0xcb, 0x8a, 0xcb, 0xcb, 0xe1, 0x79, + 0x5f, 0x0d, 0x07, 0x7d, 0xde, 0x07, 0x11, 0x5e, + 0x30, 0x05, 0xcd, 0xc0, 0x00, 0x28, 0xd0, 0x00, + 0xa0, 0x38, 0x11, 0x61, 0xf9, 0x75, 0x00, 0xe2, + 0xd0, 0x00, 0x0f, 0x1d, 0xeb, 0x29, 0x00, 0x2d, + 0xdf, 0x4b, 0xf3, 0x3f, 0xe1, 0x75, 0x04, 0xeb, + 0xd0, 0x00, 0x11, 0x62, 0xeb, 0x36, 0xb0, 0x20, + 0x0f, 0x19, 0xfb, 0x36, 0xac, 0xe0, 0x01, 0xa4, + 0xde, 0x00, 0x5e, 0x0d, 0x00, 0x2d, 0xdf, 0x7a, + 0xdd, 0xc0, 0xd8, 0x80, 0xd9, 0x00, 0xd9, 0x80, + 0x5f, 0x00, 0x01, 0x46, 0x00, 0x28, 0xd0, 0x01, + 0x00, 0x06, 0xa0, 0x37, 0x80, 0x3f, 0x00, 0xc6, + 0x0f, 0xc5, 0xad, 0xda, 0xc6, 0xb1, 0xd0, 0x01, + 0x01, 0xa3, 0xde, 0x1d, 0x40, 0x30, 0x3e, 0x00, + 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 0xc8, 0x28, + 0xc8, 0x69, 0xc8, 0xaa, 0xc8, 0xeb, 0x0c, 0x1e, + 0xfb, 0x68, 0x26, 0xba, 0x07, 0x7d, 0xdc, 0x00, + 0x1d, 0xcf, 0x1d, 0xd1, 0x5d, 0xc0, 0x00, 0x2d, + 0xdf, 0x64, 0x0f, 0x87, 0xad, 0xda, 0x80, 0x3f, + 0x0e, 0x0a, 0x66, 0xda, 0xc9, 0x2c, 0xc9, 0x6d, + 0xc9, 0xae, 0xc9, 0xef, 0x0f, 0x2f, 0xd0, 0x37, + 0x4f, 0x00, 0x0f, 0x1a, 0xeb, 0xbe, 0x01, 0xa4, + 0xde, 0x20, 0xd0, 0x01, 0x40, 0x3c, 0x2e, 0x00, + 0x00, 0x2d, 0xdf, 0x7a, 0xac, 0xe0, 0x0f, 0x87, + 0x0e, 0x0a, 0x76, 0xe0, 0xbf, 0x79, 0xbe, 0x3c, + 0x0f, 0x1b, 0xeb, 0x9e, 0x0f, 0x87, 0x0e, 0x0a, + 0x76, 0xe1, 0xbf, 0x79, 0xbe, 0x34, 0x18, 0xa0, + 0xeb, 0xb9, 0x0f, 0x87, 0xad, 0x20, 0x80, 0x3f, + 0x0e, 0x0a, 0x76, 0xe2, 0xbf, 0x79, 0xbe, 0x3c, + 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe3, 0x0f, 0x1b, + 0xeb, 0xb3, 0xbf, 0x77, 0xbe, 0x0c, 0x19, 0x20, + 0xeb, 0xb9, 0x0f, 0x87, 0xad, 0x60, 0x80, 0x3f, + 0x0e, 0x0a, 0x76, 0xe4, 0xbe, 0x3c, 0xbf, 0x75, + 0x0f, 0x15, 0xf8, 0x1c, 0x1f, 0x0a, 0x1f, 0x16, + 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe5, 0xbf, 0x79, + 0xbe, 0x34, 0x19, 0xa0, 0xeb, 0xb9, 0x0f, 0x87, + 0xad, 0xa0, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe6, + 0xbe, 0x3c, 0xbf, 0x79, 0x0f, 0x87, 0x0e, 0x0a, + 0x76, 0xe7, 0x0f, 0x15, 0xeb, 0xbe, 0x00, 0x2f, + 0xdf, 0x72, 0x1d, 0xe0, 0xf8, 0x1c, 0x00, 0x28, + 0xd0, 0x01, 0xa0, 0x38, 0x80, 0x3f, 0x0f, 0x87, + 0xd0, 0x01, 0x4d, 0xc0, 0x1f, 0x0f, 0x1f, 0x11, + 0x00, 0x2f, 0xdf, 0x76, 0xc6, 0xb2, 0x03, 0x7d, + 0xde, 0x0e, 0x01, 0xa3, 0xde, 0x2d, 0x5d, 0xc0, + 0x0f, 0x87, 0x1e, 0xe1, 0xeb, 0xdb, 0xad, 0xda, + 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 0x0c, 0x1e, + 0xfb, 0xe4, 0x26, 0xbb, 0x03, 0xff, 0xdd, 0xff, + 0x4d, 0xc0, 0x00, 0xa3, 0xde, 0x2d, 0xbf, 0x56, + 0x0f, 0x87, 0x07, 0x7d, 0xde, 0x0e, 0x5d, 0xc0, + 0x00, 0xa3, 0xde, 0x1d, 0xad, 0xda, 0x80, 0x3f, + 0x0e, 0x0a, 0x66, 0xda, 0xdf, 0x5c, 0xd0, 0x0e, + 0x4f, 0x00, 0x0f, 0x87, 0xd0, 0x06, 0x40, 0x3c, + 0xeb, 0xf0, 0xbf, 0x3e, 0xb0, 0x04, 0xe7, 0xf2, + 0xeb, 0xf6, 0xbf, 0x0c, 0xbf, 0x3a, 0x0f, 0x87, + 0x0f, 0x1d, 0xfb, 0x4b, 0xbf, 0x38, 0x0f, 0x87, + 0x0f, 0x1c, 0xfb, 0xcb, 0xbf, 0x30, 0x0f, 0x87, + 0x50, 0x00, 0x50, 0x00, 0x0f, 0x17, 0xf9, 0x70, + 0x90, 0x4d, 0x10, 0x60, 0xe5, 0x72, 0x0f, 0x49, + 0x90, 0x4d, 0x10, 0x60, 0xe5, 0x76, 0x0f, 0x19, + 0xf9, 0x79, 0x01, 0x46, 0xd0, 0x11, 0xa0, 0x38, + 0x80, 0x3f, 0x00, 0xc6, 0xdf, 0x00, 0x00, 0x06, + 0x08, 0x20, 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x0a, + 0xa0, 0x1b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08, + 0xa0, 0x27, 0x90, 0x4d, 0x0f, 0xff, 0xd8, 0x1f, + 0x40, 0x40, 0xa0, 0x4d, 0x80, 0x0a, 0xd0, 0x00, + 0x06, 0x50, 0xf9, 0x95, 0xd0, 0x01, 0xa0, 0x09, + 0x80, 0x1b, 0xa0, 0x27, 0x01, 0x20, 0xd0, 0x67, + 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, + 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, + 0x01, 0x20, 0xd0, 0x40, 0xa0, 0x69, 0x80, 0x2b, + 0x80, 0x07, 0x08, 0x20, 0xdf, 0x00, 0x02, 0x30, + 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb0, + 0xd0, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30, + 0xd0, 0x01, 0xa0, 0x38, 0xd0, 0x10, 0xa0, 0x38, + 0x15, 0x63, 0xe9, 0xba, 0x05, 0x5e, 0xf9, 0xfa, + 0xc0, 0xdf, 0x00, 0xe0, 0xd1, 0x80, 0x70, 0x06, + 0x10, 0x1c, 0xc1, 0x40, 0x11, 0x48, 0xd3, 0x10, + 0x00, 0x21, 0xd0, 0x80, 0xb0, 0x16, 0xe9, 0xca, + 0xd3, 0x20, 0x10, 0x81, 0xb0, 0x16, 0xf9, 0xfa, + 0x30, 0xc2, 0xd2, 0x64, 0xd0, 0x92, 0x00, 0xee, + 0xd0, 0x54, 0x70, 0x41, 0x30, 0x43, 0xed, 0xd7, + 0xd2, 0x6c, 0x72, 0x49, 0xc0, 0x89, 0xb0, 0xbf, + 0x10, 0x9f, 0x22, 0x42, 0x04, 0x31, 0xd0, 0x10, + 0xc0, 0x42, 0x30, 0x49, 0xe5, 0xde, 0x10, 0x03, + 0xc1, 0x0c, 0xc1, 0x83, 0xb1, 0xbe, 0x01, 0x46, + 0x00, 0x06, 0xa0, 0x3d, 0xa0, 0x3c, 0x60, 0x06, + 0x00, 0xc6, 0xb1, 0xbc, 0xb1, 0x01, 0xed, 0xe1, + 0xc1, 0x0c, 0x21, 0x85, 0x01, 0x46, 0x00, 0x06, + 0xa0, 0x3d, 0xa0, 0x3c, 0x60, 0x06, 0x00, 0xc6, + 0xb1, 0xbc, 0xb1, 0x01, 0xed, 0xec, 0x02, 0xe4, + 0xd0, 0x00, 0x20, 0xc0, 0xb2, 0x41, 0xed, 0xd8, + 0x15, 0xa3, 0xfa, 0x00, 0xbc, 0x10, 0x0c, 0x1e, + 0xfa, 0x00, 0xbc, 0x10, 0xd0, 0x04, 0x70, 0x00, + 0x10, 0x20, 0xfa, 0x00, 0x00, 0x27, 0xd0, 0x10, + 0xd0, 0x40, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x14, + 0x60, 0x40, 0xb0, 0x28, 0x70, 0x40, 0xb0, 0x7f, + 0x60, 0x40, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, + 0x50, 0x00, 0x50, 0x00, 0x00, 0x28, 0xd1, 0xb0, + 0x70, 0x06, 0xd0, 0x81, 0x60, 0x86, 0x10, 0x20, + 0xe9, 0xab, 0xb0, 0x3f, 0x60, 0x06, 0x00, 0xec, + 0xd1, 0x84, 0x70, 0x46, 0xb1, 0x84, 0x70, 0x86, + 0x30, 0x42, 0xe9, 0xab, 0x70, 0x42, 0xd0, 0x35, + 0x30, 0x40, 0xf9, 0xab, 0x00, 0x63, 0xd0, 0x3f, + 0xb0, 0xbc, 0x40, 0x80, 0x70, 0xc2, 0x10, 0xe3, + 0xe5, 0xab, 0xb0, 0xbc, 0x40, 0x80, 0x60, 0x86, + 0x00, 0x28, 0xd0, 0x24, 0x70, 0x40, 0x00, 0x22, + 0xd0, 0x80, 0x50, 0x42, 0x60, 0x40, 0x00, 0x64, + 0xd0, 0x60, 0xd0, 0x90, 0x60, 0x81, 0x00, 0xed, + 0xd1, 0x88, 0x70, 0x46, 0x10, 0xe4, 0xe9, 0xa8, + 0x00, 0x21, 0xd0, 0xe8, 0xd0, 0x00, 0x60, 0x03, + 0xd0, 0x81, 0x40, 0x42, 0x60, 0x46, 0x02, 0x3c, + 0xdc, 0x89, 0xe0, 0x46, 0xd0, 0x82, 0x50, 0x42, + 0x60, 0x46, 0x00, 0x23, 0xd5, 0x3e, 0x01, 0x7a, + 0xde, 0x1a, 0xe0, 0x46, 0x01, 0x46, 0xdf, 0x5c, + 0x08, 0x20, 0xd1, 0x00, 0xcf, 0x04, 0x11, 0x08, + 0xa1, 0x0a, 0xa1, 0x1b, 0x11, 0x1f, 0xa1, 0x27, + 0xd2, 0x80, 0xb2, 0x81, 0x90, 0x4d, 0xc0, 0x01, + 0x10, 0x14, 0x00, 0x16, 0xe9, 0x8d, 0x80, 0x33, + 0x80, 0x3f, 0x92, 0x8b, 0x00, 0x23, 0xd0, 0x3f, + 0x42, 0x80, 0xe9, 0x8d, 0x0f, 0xff, 0xdf, 0xff, + 0x40, 0x01, 0xa0, 0x0d, 0xe1, 0x94, 0xa1, 0x0a, + 0x00, 0xea, 0xd0, 0x00, 0xd0, 0x8e, 0x00, 0x06, + 0x0f, 0x0b, 0x70, 0x80, 0x80, 0x73, 0x80, 0x0a, + 0xd0, 0x00, 0x06, 0x50, 0xf9, 0x9a, 0xd0, 0x01, + 0xd0, 0x44, 0x40, 0x70, 0x20, 0x01, 0x15, 0x63, + 0xf9, 0xa1, 0x80, 0x1b, 0xe1, 0xa2, 0x80, 0x5b, + 0xa0, 0x27, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, + 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, + 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, + 0xd0, 0x40, 0xa0, 0x69, 0x80, 0x2b, 0x80, 0x07, + 0x08, 0x20, 0xd0, 0x00, 0xcf, 0x00, 0x02, 0x30, + 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb2, + 0xd2, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30, + 0xd0, 0x01, 0xa0, 0x38, 0x00, 0x30, 0xd0, 0x10, + 0xa0, 0x38, 0x80, 0x3f, 0x00, 0xc6, 0x00, 0x28, + 0xd1, 0x24, 0x70, 0x04, 0xd0, 0x41, 0x50, 0x01, + 0x60, 0x04, 0x00, 0x27, 0xd0, 0x18, 0x70, 0x40, + 0xb0, 0x7f, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x20, + 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x08, 0x20, + 0xdf, 0x00, 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, + 0xd4, 0xc0, 0xd3, 0x81, 0x12, 0xa0, 0xed, 0xe3, + 0xd0, 0x08, 0x0a, 0x09, 0x00, 0x4d, 0xb0, 0x01, + 0xed, 0xdf, 0x03, 0xbf, 0xd4, 0x27, 0xe0, 0x46, + 0x50, 0x00, 0x50, 0x00, 0x02, 0x24, 0xd0, 0x00, + 0xa0, 0x37, 0x00, 0x27, 0xd3, 0xd0, 0x00, 0x26, + 0xd0, 0x04, 0x73, 0xcf, 0x13, 0xe1, 0xe9, 0x7b, + 0xb0, 0x3c, 0xf2, 0x00, 0x00, 0x26, 0xd0, 0x40, + 0xd0, 0x00, 0x60, 0x01, 0x00, 0x26, 0xd0, 0x14, + 0xf2, 0x00, 0x00, 0x26, 0xd0, 0x18, 0xf2, 0x00, + 0x00, 0xee, 0xd0, 0x1c, 0x71, 0x40, 0xd1, 0x24, + 0x15, 0x63, 0xe9, 0x8d, 0x11, 0x1f, 0xc7, 0x1a, + 0xb7, 0x01, 0xd3, 0x81, 0xc4, 0xd4, 0xf2, 0x04, + 0x00, 0x26, 0xd0, 0x18, 0x70, 0x40, 0xb0, 0x54, + 0xfd, 0x9b, 0x00, 0xed, 0xd0, 0x24, 0xd0, 0x44, + 0x60, 0x40, 0x13, 0xe1, 0xf9, 0xbc, 0x15, 0xa3, + 0xf9, 0xa1, 0x0c, 0x10, 0xe9, 0xb9, 0x11, 0x61, + 0xe5, 0xb3, 0xed, 0xb9, 0x15, 0xa3, 0xf9, 0xab, + 0x00, 0x26, 0xd0, 0x14, 0x70, 0x40, 0x10, 0x62, + 0xf5, 0xb3, 0x15, 0x22, 0xe5, 0xb3, 0xc0, 0x44, + 0x30, 0x54, 0xe5, 0xb3, 0x34, 0xd4, 0xf5, 0xb3, + 0xe1, 0xbf, 0x03, 0xb4, 0xd6, 0x29, 0x00, 0x26, + 0xd0, 0x40, 0x60, 0x01, 0xe1, 0xdb, 0x03, 0xb4, + 0xd6, 0x29, 0xe0, 0x46, 0x01, 0x7a, 0xde, 0x1a, + 0xe0, 0x46, 0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, + 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, + 0xa0, 0x6c, 0xd3, 0x80, 0xd0, 0xa1, 0x00, 0x88, + 0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, 0xf9, 0xc9, + 0x0c, 0x49, 0xd0, 0x61, 0x00, 0x8d, 0x10, 0xa0, + 0xe9, 0x90, 0x30, 0x42, 0xf5, 0xd8, 0xd0, 0x61, + 0x23, 0x81, 0xe1, 0xce, 0x23, 0x82, 0x13, 0xa1, + 0xf9, 0x90, 0xd0, 0x42, 0x15, 0xa1, 0xf9, 0xdf, + 0xb0, 0x7f, 0x00, 0x26, 0xd0, 0x14, 0x70, 0x00, + 0x30, 0x01, 0xf5, 0xe8, 0x16, 0xe0, 0xe5, 0xe8, + 0xb6, 0xc1, 0xbc, 0x20, 0xc0, 0x44, 0x30, 0x5b, + 0xfd, 0xb9, 0xc0, 0x44, 0x30, 0x54, 0xe5, 0xb9, + 0x15, 0x63, 0xf9, 0xf8, 0x15, 0xa3, 0xf9, 0xf5, + 0x03, 0x3c, 0xd8, 0x1c, 0xe0, 0x46, 0x03, 0x39, + 0xda, 0x17, 0xe0, 0x46, 0x15, 0xa3, 0xf9, 0xfd, + 0x03, 0x72, 0xde, 0x19, 0xe0, 0x46, 0x03, 0x70, + 0xd0, 0x17, 0xe0, 0x46, 0x70, 0x40, 0xb0, 0x7f, + 0x60, 0x40, 0x0f, 0xc5, 0xdf, 0x00, 0x0c, 0x09, + 0x05, 0x0d, 0x08, 0x20, 0xdf, 0x00, 0x0f, 0xc5, + 0x50, 0x00, 0x50, 0x00, 0x00, 0xef, 0xd0, 0x14, + 0x70, 0x40, 0x10, 0x60, 0xe9, 0x45, 0xb0, 0x04, + 0x70, 0x40, 0xb0, 0x41, 0xed, 0x44, 0x00, 0xed, + 0xd0, 0x24, 0xd0, 0x44, 0x60, 0x40, 0x00, 0x64, + 0xd0, 0x20, 0x70, 0x00, 0x10, 0x30, 0xe9, 0x45, + 0x00, 0x21, 0xd0, 0x28, 0x60, 0x40, 0x00, 0x64, + 0xd2, 0xc0, 0x70, 0x0b, 0x00, 0x11, 0xe9, 0x6a, + 0x08, 0x20, 0xd0, 0x4f, 0x30, 0x40, 0xe9, 0x55, + 0xb0, 0x4f, 0xf9, 0x6a, 0x03, 0xef, 0xdf, 0xbf, + 0xaf, 0xb8, 0xdf, 0x80, 0x0f, 0x87, 0xd0, 0x18, + 0x70, 0x00, 0x10, 0x20, 0xed, 0x6c, 0xdf, 0x84, + 0xd0, 0x40, 0x60, 0x7e, 0x00, 0x27, 0xd0, 0x54, + 0x70, 0x41, 0x10, 0x60, 0x01, 0xa0, 0xd0, 0x40, + 0xa0, 0x78, 0x80, 0x34, 0x80, 0x3f, 0x01, 0x3c, + 0xd2, 0x39, 0x00, 0x21, 0xdf, 0x86, 0x0f, 0x87, + 0xd0, 0x40, 0x60, 0x4b, 0x03, 0xe6, 0xd0, 0x08, + 0xe0, 0x36, 0x50, 0x00, 0x00, 0x28, 0xd0, 0x24, + 0x72, 0xc0, 0xd0, 0x40, 0x60, 0x40, 0xd0, 0x0c, + 0x52, 0xc0, 0xc0, 0x1c, 0x30, 0x1d, 0xf5, 0x3c, + 0x20, 0x1f, 0x30, 0x1e, 0x90, 0x6d, 0x20, 0x01, + 0x00, 0x22, 0xd0, 0x58, 0x60, 0x01, 0x00, 0xe3, + 0xd0, 0x48, 0x70, 0x41, 0x30, 0x40, 0xf5, 0x47, + 0xb2, 0xc8, 0x00, 0xe3, 0xd0, 0x4c, 0x70, 0x41, + 0x30, 0x40, 0xfd, 0x4d, 0xb2, 0xc4, 0x00, 0x28, + 0xd0, 0x20, 0x70, 0x00, 0x42, 0xc0, 0xa2, 0xc5, + 0x12, 0xe0, 0xe9, 0x55, 0x80, 0x40, 0x80, 0x34, + 0x80, 0x3f, 0xcf, 0x95, 0x82, 0x34, 0x80, 0x3f, + 0x03, 0xe8, 0xd0, 0x00, 0x1f, 0xa3, 0xe9, 0x60, + 0x03, 0xea, 0xd0, 0x00, 0x00, 0x27, 0xd0, 0x4c, + 0x7f, 0x81, 0x00, 0x27, 0xd0, 0x54, 0x70, 0x41, + 0x10, 0x60, 0x03, 0xa0, 0xd0, 0x40, 0xa0, 0x78, + 0xe0, 0x3c, 0x50, 0x00, 0xc0, 0x84, 0x10, 0x8c, + 0x10, 0x92, 0xd0, 0x41, 0x30, 0x4d, 0x40, 0x43, + 0x10, 0x43, 0x20, 0x81, 0xd1, 0x8f, 0x41, 0x82, + 0x10, 0x9c, 0x20, 0x9b, 0xc1, 0xc2, 0x10, 0x82, + 0x20, 0x87, 0xc0, 0x42, 0x10, 0x43, 0x20, 0x81, + 0x10, 0x88, 0x22, 0x02, 0x10, 0x97, 0x01, 0xd0, + 0xe9, 0x48, 0xb0, 0x96, 0x10, 0x88, 0x22, 0x82, + 0xc0, 0x5c, 0x10, 0x48, 0xc0, 0x84, 0x10, 0x91, + 0x10, 0x86, 0x20, 0x42, 0x41, 0x0d, 0x11, 0x02, + 0x20, 0x44, 0x22, 0x01, 0x22, 0x81, 0x02, 0xe4, + 0xd2, 0x40, 0xc2, 0xca, 0xb2, 0xe0, 0x01, 0xd0, + 0xe9, 0x5e, 0xc2, 0xca, 0x22, 0xc9, 0xb2, 0xa0, + 0x22, 0x48, 0xd0, 0x78, 0x03, 0x50, 0xf9, 0x69, + 0xd0, 0x7c, 0x01, 0x9d, 0xf9, 0x69, 0xc2, 0x48, + 0xb2, 0x60, 0xc2, 0xca, 0xb2, 0xf0, 0x11, 0x82, + 0x41, 0x81, 0x22, 0x06, 0x11, 0x9f, 0x41, 0x81, + 0x22, 0x86, 0x0f, 0xc5, 0xc0, 0x84, 0x10, 0x8c, + 0x10, 0x92, 0xd1, 0x8f, 0x41, 0x82, 0x10, 0x9c, + 0xc1, 0xdb, 0x11, 0xc1, 0x21, 0xc3, 0x20, 0x87, + 0xc1, 0xc2, 0x10, 0x82, 0x20, 0x87, 0xc0, 0x42, + 0x10, 0x43, 0x20, 0x81, 0x10, 0x88, 0x22, 0x02, + 0x10, 0x97, 0x01, 0xd0, 0xe9, 0x46, 0xb0, 0x96, + 0x10, 0x88, 0x22, 0x82, 0xc0, 0x5c, 0x10, 0x48, + 0xc0, 0x84, 0x10, 0x91, 0x10, 0x86, 0x20, 0x42, + 0xd0, 0x81, 0x41, 0x02, 0x11, 0x02, 0x20, 0x44, + 0x22, 0x01, 0x22, 0x81, 0x02, 0xe4, 0xd2, 0x40, + 0xc2, 0xca, 0xb2, 0xe0, 0x01, 0xd0, 0xe9, 0x5d, + 0xc2, 0xca, 0x22, 0xc9, 0xb2, 0xa0, 0x22, 0x48, + 0x11, 0x9f, 0x11, 0x83, 0x22, 0x06, 0x11, 0x9c, + 0x11, 0x83, 0x22, 0x86, 0x0f, 0xc5, 0xd0, 0x41, + 0x40, 0x44, 0x20, 0x55, 0x10, 0x62, 0xf9, 0x6f, + 0x01, 0xb5, 0xd4, 0x00, 0xc2, 0x9f, 0xc2, 0x1f, + 0x22, 0x80, 0xe1, 0x30, 0x0f, 0x11, 0xf9, 0x51, + 0x90, 0x38, 0x80, 0x3f, 0x00, 0x1b, 0xf9, 0x51, + 0x00, 0x27, 0xd0, 0x04, 0x70, 0x40, 0x30, 0x71, + 0xf9, 0x51, 0xb0, 0x3c, 0x70, 0x40, 0x30, 0x5d, + 0xf9, 0x51, 0xb0, 0x08, 0x70, 0x40, 0xb0, 0x7f, + 0x60, 0x40, 0x10, 0x63, 0xe5, 0x5d, 0x02, 0x20, + 0xd0, 0x01, 0xa0, 0x37, 0x00, 0x26, 0xd0, 0x24, + 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x08, + 0x70, 0x40, 0xb0, 0x41, 0x60, 0x40, 0x00, 0x26, + 0xd0, 0x30, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, + 0xb0, 0x30, 0xd0, 0x40, 0x60, 0x40, 0xb0, 0x3c, + 0x6c, 0x40, 0xb0, 0x3c, 0x67, 0x40, 0x00, 0x33, + 0xdf, 0xb0, 0xe0, 0x36, 0x00, 0x26, 0xd0, 0x1c, + 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x3c, + 0x70, 0x40, 0xb0, 0x41, 0x60, 0x40, 0x08, 0x20, + 0xdf, 0x00, 0x80, 0x35, 0xc0, 0x3c, 0x10, 0x08, + 0xa0, 0x0a, 0xa0, 0x27, 0xa0, 0x1b, 0xdf, 0x5c, + 0x01, 0xa0, 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, + 0x80, 0x34, 0x80, 0x3f, 0x03, 0xbb, 0xd8, 0x1e, + 0xcf, 0x95, 0x82, 0x34, 0x80, 0x3f, 0x03, 0xe8, + 0xd0, 0x00, 0x1f, 0xa3, 0xe9, 0x55, 0x1f, 0xa0, + 0xe9, 0x55, 0x03, 0xea, 0xd0, 0x00, 0x00, 0x21, + 0xdf, 0x86, 0xe0, 0x3c, 0x89, 0x78, 0x89, 0x37, + 0x00, 0xee, 0xd0, 0x14, 0x76, 0x00, 0xd0, 0x30, + 0x76, 0x40, 0x26, 0x58, 0xd6, 0xd9, 0x00, 0xee, + 0xd0, 0x20, 0x75, 0x40, 0xd0, 0x1c, 0x71, 0x40, + 0xd0, 0x20, 0x71, 0x00, 0xd0, 0x24, 0x70, 0x80, + 0xc4, 0x02, 0xd0, 0x28, 0x70, 0xc0, 0x00, 0x21, + 0xd0, 0x10, 0x72, 0x00, 0x93, 0x90, 0xd4, 0x81, + 0x13, 0x96, 0x43, 0x92, 0x34, 0x8e, 0x00, 0x22, + 0xd1, 0xa4, 0x71, 0x86, 0xde, 0x40, 0x7e, 0x79, + 0xd0, 0x18, 0x70, 0x40, 0xb0, 0x41, 0xf5, 0x58, + 0xd3, 0x42, 0x50, 0x4d, 0x60, 0x40, 0x10, 0x60, + 0xe5, 0x62, 0xd0, 0x54, 0x70, 0x01, 0xb0, 0x3c, + 0x60, 0x01, 0x04, 0x2d, 0xd0, 0x30, 0xe0, 0x36, + 0x00, 0x22, 0xd0, 0x60, 0x71, 0xc1, 0xd0, 0x4f, + 0x41, 0xc1, 0x04, 0x20, 0xd0, 0x28, 0xe0, 0x36, + 0x50, 0x00, 0x50, 0x00, 0x04, 0x22, 0xd0, 0x18, + 0xd3, 0x44, 0x72, 0x8d, 0x12, 0xa0, 0xe8, 0x36, + 0xc0, 0x47, 0x10, 0x5d, 0x30, 0x4e, 0xf8, 0x36, + 0xb2, 0x3e, 0x60, 0x4d, 0x00, 0xed, 0xd0, 0x48, + 0x70, 0x01, 0xde, 0x45, 0x50, 0x39, 0x00, 0x1b, + 0xf9, 0x44, 0xb0, 0x01, 0x00, 0x1c, 0xf9, 0x47, + 0xb0, 0x04, 0x60, 0x01, 0xd0, 0x40, 0x62, 0x81, + 0xce, 0x4a, 0xd0, 0x43, 0x41, 0xc1, 0xd0, 0x58, + 0x61, 0xc1, 0x90, 0x43, 0x00, 0xe0, 0xd0, 0x28, + 0x70, 0x00, 0x10, 0x1f, 0x20, 0x40, 0xb1, 0xc1, + 0xf5, 0x54, 0x00, 0x21, 0xd0, 0x08, 0x60, 0x40, + 0x00, 0xe6, 0xd0, 0x40, 0x70, 0x41, 0xd2, 0x94, + 0x60, 0x4a, 0x04, 0x2c, 0xd0, 0x08, 0x01, 0x90, + 0xf8, 0x36, 0x04, 0x2d, 0xd0, 0x30, 0xe0, 0x36, + 0x50, 0x00, 0x50, 0x00, 0xc0, 0x47, 0x10, 0x5d, + 0x30, 0x4e, 0xf9, 0x41, 0x90, 0x43, 0x00, 0xe0, + 0xd0, 0x28, 0x70, 0x00, 0x20, 0x40, 0x00, 0x21, + 0xd0, 0x08, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x74, + 0x70, 0x01, 0xb0, 0x3f, 0x60, 0x01, 0x00, 0xed, + 0xd0, 0x48, 0x70, 0x41, 0x00, 0x5e, 0xf9, 0x4b, + 0x00, 0x21, 0xd0, 0x00, 0x73, 0x80, 0xd4, 0x81, + 0x34, 0x8e, 0x00, 0x34, 0xd3, 0x70, 0xe0, 0x36, + 0x50, 0x00, 0x50, 0x00, 0xd1, 0x88, 0xd1, 0xc8, + 0x01, 0x1b, 0xe9, 0x39, 0x11, 0x9f, 0x11, 0xdf, + 0xd4, 0x80, 0xd3, 0x81, 0xe1, 0x43, 0x00, 0xed, + 0xd0, 0x08, 0x70, 0x00, 0x00, 0x10, 0xf9, 0x37, + 0x0c, 0x1f, 0xf9, 0x36, 0x13, 0xa1, 0xe9, 0x43, + 0xbe, 0x7c, 0x00, 0x69, 0xd2, 0x54, 0x12, 0x48, + 0xc0, 0x39, 0x30, 0x18, 0xe5, 0x4b, 0xd2, 0x70, + 0x72, 0x49, 0x22, 0x79, 0x00, 0x21, 0xd0, 0x00, + 0x63, 0x80, 0x04, 0x24, 0xd0, 0x38, 0x02, 0x10, + 0xe9, 0x56, 0xd0, 0x41, 0x51, 0x41, 0xe0, 0x36, + 0x15, 0x61, 0xe8, 0x36, 0xd5, 0x80, 0xd3, 0x00, + 0xd3, 0x40, 0x04, 0x28, 0xd0, 0x18, 0xe0, 0x36, + 0x50, 0x00, 0x50, 0x00, 0x00, 0x21, 0xd0, 0x18, + 0x73, 0x00, 0xb0, 0x04, 0x73, 0x80, 0xd2, 0x80, + 0xb0, 0x38, 0x72, 0xc0, 0x31, 0x0d, 0xc0, 0x0e, + 0x10, 0x0b, 0x10, 0x20, 0xe9, 0x42, 0xf5, 0x3f, + 0x22, 0x8d, 0x10, 0x01, 0x13, 0x5f, 0xe1, 0x3b, + 0x33, 0x8b, 0x15, 0x61, 0xf9, 0x49, 0x00, 0x21, + 0xd0, 0x64, 0x70, 0x41, 0x33, 0x81, 0x03, 0xd0, + 0xe9, 0x4c, 0x20, 0x0b, 0x13, 0xdf, 0x12, 0xc1, + 0x13, 0xe0, 0xf9, 0x49, 0x10, 0x03, 0xc0, 0x50, + 0x10, 0x4b, 0x13, 0x0b, 0x23, 0x00, 0x13, 0x20, + 0xe9, 0x5c, 0xf5, 0x59, 0x22, 0x81, 0x13, 0x01, + 0x10, 0x5f, 0xe1, 0x55, 0x12, 0x99, 0x12, 0x87, + 0x21, 0x0a, 0x00, 0xa0, 0xd2, 0x80, 0xc3, 0x0a, + 0x03, 0x90, 0xe9, 0x66, 0x22, 0x82, 0x23, 0x03, + 0x10, 0x81, 0x10, 0xc1, 0x13, 0x9f, 0x13, 0xa0, + 0xed, 0x62, 0xc0, 0x8a, 0xc0, 0xcc, 0x04, 0x26, + 0xd0, 0x38, 0xe0, 0x36, 0x15, 0x61, 0xf9, 0x3d, + 0x07, 0x32, 0xd0, 0x00, 0x30, 0x03, 0xed, 0x3d, + 0xc0, 0x03, 0x10, 0x1d, 0x30, 0xc0, 0xc0, 0x02, + 0x10, 0x1d, 0x30, 0x80, 0xe1, 0x32, 0x10, 0x94, + 0x10, 0xd4, 0x00, 0x21, 0xd0, 0x20, 0x73, 0x00, + 0xc5, 0x8c, 0xd3, 0x4e, 0x01, 0x1b, 0xe9, 0x48, + 0x13, 0x1f, 0xd3, 0x4f, 0x43, 0x4c, 0x13, 0x1c, + 0xc0, 0x0c, 0x10, 0x03, 0x20, 0x0c, 0xc0, 0x40, + 0x10, 0x42, 0x20, 0x40, 0x10, 0x46, 0x20, 0x4d, + 0x10, 0x42, 0x2e, 0x41, 0x10, 0x5c, 0x10, 0x43, + 0x00, 0x59, 0xe9, 0x5b, 0x01, 0x69, 0xd0, 0x20, + 0x30, 0x40, 0x22, 0x41, 0x04, 0x28, 0xd0, 0x18, + 0xe0, 0x36, 0x50, 0x00, 0x2c, 0x14, 0xd0, 0x34, + 0x63, 0x00, 0xd0, 0x38, 0x72, 0xc0, 0xc0, 0x51, + 0x10, 0x5c, 0x30, 0x4b, 0x10, 0x44, 0xd4, 0xc0, + 0xd5, 0x00, 0xc0, 0x18, 0x30, 0x39, 0xed, 0x5f, + 0xd4, 0xd0, 0xc5, 0x01, 0xd0, 0x18, 0x70, 0x00, + 0x0c, 0x1f, 0xe9, 0x48, 0x10, 0x20, 0xfd, 0x48, + 0xd4, 0xc0, 0xd5, 0x00, 0x10, 0x22, 0xe5, 0x4e, + 0xd4, 0xc0, 0xbc, 0x30, 0xd5, 0x00, 0xb5, 0x10, + 0xb0, 0x3f, 0xf9, 0x52, 0x3c, 0x01, 0x3c, 0x01, + 0x02, 0x1f, 0xe9, 0x5f, 0x00, 0xa8, 0xd3, 0xc0, + 0xd3, 0xa4, 0x00, 0xaa, 0xd0, 0x10, 0x70, 0x4f, + 0xb3, 0xfc, 0x60, 0x40, 0xb0, 0x3c, 0xb3, 0x81, + 0xed, 0x59, 0x00, 0x21, 0xd0, 0x28, 0x70, 0x00, + 0x10, 0x20, 0xf9, 0x69, 0x02, 0x1f, 0xf9, 0x6a, + 0x90, 0x10, 0x00, 0x1e, 0xe9, 0x6a, 0xb1, 0x7c, + 0x04, 0x2a, 0xd0, 0x18, 0xe0, 0x36, 0x50, 0x00, + 0x50, 0x00, 0x50, 0x00, 0x01, 0x5e, 0xf9, 0x35, + 0x01, 0x50, 0xe9, 0x35, 0xb1, 0x78, 0xd2, 0x00, + 0x01, 0x5c, 0xf9, 0x5f, 0xc0, 0x18, 0x30, 0x39, + 0xed, 0x5f, 0x11, 0x9f, 0xce, 0x58, 0xc2, 0x59, + 0x00, 0xaa, 0xd2, 0x10, 0x14, 0x82, 0x22, 0x12, + 0xc0, 0x0c, 0x10, 0x1f, 0x10, 0x03, 0x22, 0x00, + 0x70, 0x48, 0x03, 0x10, 0xe9, 0x4c, 0xb2, 0x38, + 0xbe, 0x60, 0xb2, 0x60, 0x2e, 0x41, 0x10, 0x5f, + 0x00, 0x59, 0xe9, 0x53, 0x01, 0x69, 0xd0, 0x3c, + 0x30, 0x40, 0x22, 0x41, 0x13, 0x41, 0x2e, 0x4d, + 0x13, 0x5d, 0x13, 0x43, 0x22, 0x4d, 0x14, 0xe0, + 0xe9, 0x5f, 0x33, 0x0b, 0x13, 0x04, 0x2c, 0x0c, + 0x35, 0x0c, 0xc3, 0x46, 0xc3, 0x87, 0x04, 0x62, + 0xd0, 0x10, 0x15, 0x62, 0xfc, 0x36, 0x04, 0x60, + 0xd0, 0x10, 0xe0, 0x36, 0x00, 0x22, 0xd0, 0x74, + 0x74, 0x01, 0xb0, 0x7c, 0x74, 0x41, 0xb0, 0x7c, + 0x71, 0x41, 0xd1, 0x18, 0xc0, 0x10, 0x10, 0x1c, + 0xb0, 0x16, 0xf9, 0x45, 0x00, 0x24, 0xd0, 0x20, + 0x30, 0x11, 0xf9, 0x45, 0xb1, 0x70, 0x01, 0x50, + 0xf9, 0x45, 0xb1, 0x20, 0x14, 0x41, 0xc0, 0x90, + 0x00, 0x2b, 0xd0, 0xd0, 0x01, 0x50, 0xe9, 0x4b, + 0xc0, 0xd0, 0x00, 0x35, 0xdc, 0x00, 0x20, 0x11, + 0x10, 0x1f, 0xa0, 0x1c, 0x00, 0x21, 0xd0, 0x2c, + 0x70, 0x00, 0x10, 0x05, 0x51, 0x40, 0xd0, 0x1c, + 0x61, 0x40, 0xd0, 0x20, 0x61, 0x00, 0xd0, 0x24, + 0x60, 0x80, 0xd0, 0x28, 0x60, 0xc0, 0x04, 0x2d, + 0xd0, 0x30, 0x00, 0x22, 0xd0, 0x64, 0xb1, 0x81, + 0x61, 0x81, 0xe0, 0x36, 0x90, 0x50, 0xd0, 0x3c, + 0x10, 0x41, 0x60, 0x40, 0x15, 0x62, 0xfd, 0x3d, + 0xc0, 0x10, 0x10, 0x1e, 0x10, 0x07, 0x21, 0x00, + 0x10, 0x16, 0x34, 0x00, 0xc0, 0x90, 0xd3, 0x40, + 0x00, 0x24, 0xd3, 0xc0, 0x04, 0x23, 0xd0, 0x18, + 0x01, 0x9f, 0xe8, 0x36, 0xd0, 0x54, 0x70, 0x41, + 0x73, 0x41, 0x04, 0x2e, 0xd0, 0x28, 0xe0, 0x36, + 0x50, 0x00, 0x50, 0x00, 0x00, 0xef, 0xd3, 0x30, + 0x73, 0x0c, 0xd0, 0x0c, 0x70, 0x00, 0xc0, 0x40, + 0x13, 0x24, 0xf5, 0x42, 0x13, 0x22, 0xe9, 0x41, + 0xe5, 0x43, 0xd3, 0x00, 0x10, 0x22, 0xf9, 0x41, + 0xd0, 0x01, 0xd0, 0x43, 0xd3, 0x01, 0x21, 0x00, + 0xd3, 0x40, 0x03, 0x10, 0xf9, 0x47, 0xd3, 0x40, + 0xe1, 0x61, 0x00, 0x23, 0xd0, 0x00, 0x10, 0x61, + 0xe9, 0x50, 0xb0, 0x33, 0x10, 0x63, 0xe9, 0x50, + 0x00, 0x22, 0xd0, 0x1a, 0xc3, 0xc0, 0xd2, 0xc0, + 0x00, 0x10, 0xe9, 0x55, 0x22, 0xd0, 0x10, 0x1f, + 0x14, 0x01, 0x10, 0x20, 0xed, 0x52, 0x14, 0x18, + 0x12, 0xd8, 0xc0, 0x8b, 0x32, 0xd0, 0x12, 0xc3, + 0x33, 0x4b, 0x13, 0x47, 0x21, 0x0d, 0x04, 0x23, + 0xd0, 0x18, 0xe0, 0x36, 0x00, 0x24, 0xd0, 0x30, + 0xd0, 0x40, 0x60, 0x40, 0xd3, 0xc7, 0x43, 0xc4, + 0x31, 0x0f, 0xd5, 0xd4, 0x25, 0xcf, 0x15, 0xc4, + 0x10, 0xdf, 0xc2, 0xc6, 0xc3, 0x07, 0x11, 0x81, + 0xb1, 0x3b, 0x15, 0x64, 0xe9, 0x47, 0x10, 0xdf, + 0x12, 0xc1, 0x11, 0x81, 0x11, 0xc1, 0xb1, 0x3f, + 0xb5, 0xf8, 0x90, 0x10, 0x00, 0x16, 0xf9, 0x5e, + 0xb5, 0xfc, 0xd0, 0x20, 0x40, 0x39, 0x2e, 0x4b, + 0x22, 0x4c, 0x12, 0x20, 0xe9, 0x59, 0x20, 0x39, + 0x00, 0x1b, 0xe9, 0x59, 0x2c, 0x13, 0x35, 0x13, + 0x0e, 0x5a, 0xf9, 0x59, 0xb2, 0x38, 0x02, 0xe3, + 0xd0, 0x00, 0x0e, 0x5a, 0xe9, 0x5e, 0x2e, 0x40, + 0x01, 0xee, 0xd2, 0x80, 0x42, 0x84, 0xc0, 0x03, + 0x30, 0x02, 0xf5, 0x6b, 0x31, 0x0a, 0x12, 0x98, + 0x20, 0x03, 0xf5, 0x69, 0x12, 0x9f, 0x12, 0x87, + 0x51, 0x0a, 0x00, 0x34, 0xd4, 0xf0, 0xe0, 0x36, + 0x50, 0x00, 0x50, 0x00, 0xd3, 0xc7, 0x43, 0xc4, + 0x15, 0x61, 0xf9, 0x48, 0x10, 0xc1, 0xd5, 0xe0, + 0xd1, 0x80, 0xd1, 0xc0, 0x31, 0x0f, 0x13, 0xe1, + 0xe9, 0x3c, 0xd3, 0xc0, 0x00, 0x24, 0xd0, 0x30, + 0x63, 0xc0, 0x25, 0xcf, 0x15, 0xc2, 0xd0, 0x03, + 0x40, 0x16, 0x25, 0xc0, 0x15, 0xc2, 0x15, 0x81, + 0x35, 0x91, 0xe1, 0x5c, 0x00, 0x24, 0xd0, 0x30, + 0x63, 0xc0, 0x01, 0x50, 0xe9, 0x54, 0x15, 0xa0, + 0xf9, 0x55, 0x00, 0x24, 0xd0, 0x34, 0x70, 0x00, + 0x10, 0x20, 0xe9, 0x55, 0xd3, 0xc0, 0x31, 0x0f, + 0xd5, 0xfc, 0x25, 0xcf, 0x15, 0xc3, 0x14, 0xa0, + 0xe9, 0x5c, 0xb5, 0xfc, 0x00, 0x34, 0xd4, 0xf0, + 0xe0, 0x36, 0x50, 0x00, 0xc4, 0x91, 0x34, 0x96, + 0xed, 0x34, 0xd4, 0x80, 0x14, 0x84, 0xb3, 0xc1, + 0xe5, 0x41, 0xc0, 0x52, 0x10, 0x5e, 0x34, 0x81, + 0xb3, 0xc1, 0xe5, 0x41, 0xc0, 0x52, 0x10, 0x5c, + 0x24, 0x81, 0xb3, 0xc1, 0xe5, 0x37, 0x02, 0xe8, + 0xd0, 0x00, 0xb4, 0xb0, 0x14, 0x9b, 0x00, 0x24, + 0xd0, 0x60, 0x30, 0x52, 0xed, 0x4a, 0x24, 0x81, + 0x20, 0x12, 0xa0, 0x1c, 0x10, 0x8a, 0x50, 0x83, + 0xa0, 0x96, 0xa1, 0x50, 0xa1, 0x11, 0xc0, 0x52, + 0xd4, 0x84, 0x10, 0x6c, 0xed, 0x56, 0xd4, 0x81, + 0xd1, 0x00, 0xb1, 0x17, 0x00, 0x23, 0xd1, 0x40, + 0xc2, 0xb9, 0x22, 0x86, 0x12, 0x20, 0xf9, 0x66, + 0x02, 0xe3, 0xd0, 0x40, 0x02, 0x9a, 0xe9, 0x63, + 0x22, 0x81, 0x02, 0x5a, 0xe9, 0x66, 0x22, 0x41, + 0x75, 0xd7, 0xc3, 0xd7, 0xd0, 0xd7, 0x00, 0x21, + 0xd0, 0xb6, 0x8b, 0x38, 0x00, 0x33, 0xdd, 0x08, + 0xe0, 0x36, 0x50, 0x00, 0xd0, 0x7c, 0x60, 0x01, + 0xae, 0x52, 0xd0, 0x60, 0x40, 0x79, 0x00, 0x13, + 0xe8, 0xc9, 0xa2, 0x94, 0x22, 0x86, 0x13, 0xe0, + 0xe4, 0xd0, 0x13, 0xc1, 0x15, 0x62, 0xfc, 0xd1, + 0x13, 0xc1, 0xe0, 0xd1, 0xc3, 0xd7, 0x03, 0xd9, + 0xe8, 0xd4, 0x22, 0x8d, 0x15, 0x62, 0xfc, 0xda, + 0x03, 0xda, 0xe8, 0xda, 0x22, 0x8d, 0x22, 0x8d, + 0xce, 0x4a, 0x22, 0x86, 0x00, 0x14, 0xe8, 0xe0, + 0xa2, 0x53, 0x22, 0x47, 0x03, 0xd1, 0xe8, 0xe8, + 0x22, 0x4e, 0x15, 0x62, 0xfc, 0xe8, 0x03, 0xd2, + 0xe8, 0xe8, 0x22, 0x4e, 0x12, 0x20, 0xe9, 0x09, + 0x20, 0x79, 0x00, 0x5b, 0xe8, 0xf4, 0x15, 0x20, + 0xfc, 0xf1, 0x2c, 0x13, 0x35, 0x13, 0x0e, 0x5b, + 0xe8, 0xf4, 0xb2, 0x38, 0x02, 0x9a, 0xe8, 0xfb, + 0x70, 0x08, 0xd0, 0x7c, 0x42, 0x81, 0x22, 0x98, + 0x22, 0x80, 0x02, 0x5a, 0xe9, 0x11, 0x70, 0x08, + 0xd0, 0x78, 0x42, 0x41, 0x22, 0x59, 0x10, 0x1f, + 0x22, 0x40, 0x00, 0x19, 0xe9, 0x11, 0x01, 0x69, + 0xd0, 0x7c, 0x32, 0x41, 0xe1, 0x11, 0x02, 0xe3, + 0xd0, 0x40, 0x02, 0x9a, 0xe9, 0x0e, 0x22, 0x81, + 0x02, 0x5a, 0xe9, 0x11, 0x22, 0x41, 0x0e, 0x5a, + 0xe9, 0x15, 0xce, 0x4a, 0x3e, 0x46, 0x0f, 0x87, + 0xdd, 0x48, 0xe1, 0x19, 0xdd, 0x40, 0xdc, 0xc8, + 0xdd, 0x3c, 0x7d, 0x34, 0x1d, 0x19, 0x3d, 0x35, + 0x4d, 0x33, 0x4c, 0xec, 0x3d, 0x33, 0xf9, 0x17, + 0x0f, 0xc5, 0x50, 0x00, 0xd0, 0x39, 0xd0, 0x35, + 0xd0, 0x1d, 0xd0, 0x2d, 0xd0, 0x3f, 0xd0, 0x2e, + 0xd0, 0x3c, 0xd0, 0x37, 0xd0, 0x33, 0xd0, 0x19, + 0xd0, 0x33, 0xd0, 0x2e, 0xd0, 0x3d, 0xd0, 0x3e, + 0xd0, 0x27, 0xd0, 0x3e, 0xd0, 0x3a, 0xd0, 0x2f, + 0xd0, 0x32, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x80, + 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0xd0, + 0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x05, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x90, 0x85, 0x00, 0x00, 0xa6, 0xee, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xd0, + 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x08, 0xa0, 0x00, 0x08, 0x08, 0x28, + 0x00, 0x08, 0x88, 0x68, 0x00, 0x08, 0xa0, 0x98, + 0x00, 0x08, 0x88, 0x68, 0x00, 0x08, 0x28, 0x98, + 0x00, 0x08, 0xac, 0xf4, 0x00, 0x08, 0xb8, 0x7c, + 0x00, 0x02, 0x02, 0x88, 0x00, 0x02, 0x08, 0x22, + 0x00, 0x02, 0x88, 0xaa, 0x00, 0x02, 0x22, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x04, 0x24, 0x00, 0x04, 0x04, 0x24, + 0x00, 0x04, 0x28, 0x6c, 0x00, 0x04, 0x28, 0x6c, + 0x00, 0x01, 0x10, 0x44, 0x00, 0x01, 0x20, 0x44, + 0x00, 0x01, 0x11, 0xaa, 0x00, 0x01, 0x88, 0x55, + 0x00, 0x01, 0x44, 0xaa, 0x00, 0x01, 0x44, 0x55, + 0x00, 0x20, 0x80, 0xa0, 0x00, 0x20, 0x80, 0xc0, + 0x00, 0x20, 0x20, 0xa0, 0x00, 0x20, 0x40, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x10, 0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x10, 0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22, + 0x10, 0x10, 0x16, 0x18, 0x1b, 0x1d, 0x22, 0x25, + 0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 0x22, 0x26, + 0x16, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 0x25, 0x28, + 0x16, 0x1a, 0x1b, 0x1d, 0x20, 0x23, 0x28, 0x30, + 0x1a, 0x1b, 0x1d, 0x20, 0x23, 0x28, 0x30, 0x3a, + 0x1a, 0x1b, 0x1d, 0x22, 0x26, 0x2e, 0x38, 0x45, + 0x1b, 0x1d, 0x23, 0x26, 0x2e, 0x38, 0x45, 0x53, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0xd6, 0x00, 0x00, 0x1b, 0x08, 0x00, + 0x00, 0x1f, 0xde, 0x00, 0x00, 0x00, 0x50, 0x00, + 0x00, 0x08, 0x39, 0x00, 0x00, 0x10, 0x22, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x05, 0x28, 0x20, 0x01, + 0x00, 0x00, 0x01, 0xe0, 0x71, 0x01, 0x00, 0x68, + 0xe0, 0x7f, 0xb0, 0x7f, 0x60, 0x40, 0xe0, 0x1d, + 0x90, 0x10, 0xb4, 0x81, 0xe8, 0xc0, 0xe0, 0xc2, + 0x90, 0x18, 0x00, 0x8a, 0x70, 0xc0, 0x0f, 0x87, + 0xe3, 0xe8, 0xc0, 0x00, 0x70, 0x40, 0xe0, 0x01, + 0xe0, 0x86, 0x00, 0x26, 0xd0, 0x28, 0xe0, 0x0e, + 0xd0, 0x0e, 0x0f, 0x0b, 0x70, 0x1d, 0xe0, 0x67, + 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, + 0x0f, 0x87, 0x02, 0x20, 0xd0, 0x01, 0xe0, 0x25, + 0x0f, 0x45, 0x6f, 0x81, 0xdf, 0xa6, 0xe0, 0x36, + 0xe1, 0x30, 0xa0, 0x37, 0xc0, 0x00, 0xe0, 0x26, + 0x00, 0x33, 0xde, 0xc8, 0xe0, 0x32, 0x0f, 0xc5, + 0x0f, 0x87, 0x00, 0x27, 0xd0, 0x4c, 0xe0, 0x21, + 0x00, 0x33, 0xdf, 0x28, 0x00, 0x27, 0xd0, 0x56, + 0x60, 0x01, 0xe0, 0x2d, 0x03, 0xa0, 0xd0, 0x41, + 0xa0, 0x78, 0x00, 0x60, 0xd0, 0x41, 0xa0, 0x77, + 0x00, 0x22, 0xd0, 0x58, 0xa0, 0x76, 0x00, 0x21, + 0xd0, 0x7c, 0x00, 0x4a, 0xd0, 0x72, 0x70, 0x40, + 0x00, 0x06, 0x0f, 0x87, 0x00, 0x22, 0xdc, 0xf8, + 0xf0, 0x4a, 0xe1, 0x70, 0x07, 0xef, 0xdd, 0xbf, + 0x4f, 0x36, 0x1d, 0x99, 0x4d, 0x80, 0x10, 0x18, + 0xdd, 0x50, 0x60, 0x35, 0xdd, 0x72, 0xdd, 0x10, + 0x3d, 0xb4, 0xec, 0x57, 0x2d, 0x36, 0x1d, 0x03, + 0xbd, 0x04, 0xe4, 0x2b, 0x01, 0x46, 0x00, 0x06, + 0xac, 0xf6, 0x80, 0x3f, 0x0d, 0x0a, 0x10, 0x02, + 0x7d, 0x40, 0x10, 0x1e, 0xb0, 0x20, 0xbc, 0xe0, + 0x00, 0x06, 0x00, 0xc6, 0xe0, 0x52, 0xb7, 0x60, + 0xb7, 0x60, 0xc0, 0x5d, 0x30, 0x5f, 0xe4, 0x72, + 0xc7, 0x5e, 0x00, 0xed, 0xd0, 0x28, 0x70, 0x40, + 0xb0, 0x7f, 0x60, 0x40, 0xc0, 0x1d, 0x30, 0x1c, + 0xf8, 0x7e, 0x00, 0x21, 0xd0, 0x01, 0x00, 0x26, + 0xd0, 0x78, 0xa0, 0x38, 0x80, 0x3f, 0x70, 0x01, + 0xb0, 0x3f, 0x60, 0x01, 0x0f, 0x87, 0x80, 0x34, + 0x03, 0xef, 0xd8, 0x3f, 0xa8, 0x38, 0x01, 0x35, + 0xdc, 0x33, 0xe0, 0x46, 0xc0, 0x1c, 0xe4, 0xa5, + 0x97, 0x2e, 0x30, 0x1c, 0xe8, 0x8e, 0x00, 0x21, + 0xd0, 0x00, 0xa0, 0x38, 0xc0, 0x5d, 0x00, 0x23, + 0xd0, 0x00, 0x30, 0x40, 0x30, 0x5e, 0xe4, 0x99, + 0x20, 0x5e, 0xc0, 0x01, 0x30, 0x1c, 0xec, 0xa4, + 0xe0, 0x9d, 0x20, 0x5f, 0xc0, 0x1c, 0x30, 0x01, + 0xf4, 0xa5, 0xc0, 0x1c, 0x30, 0x1d, 0xec, 0xa4, + 0xe4, 0xa5, 0x90, 0x38, 0x00, 0x1b, 0xe8, 0xa5, + 0xa0, 0x66, 0xb1, 0x3f, 0xe4, 0xb3, 0xe8, 0xb1, + 0xc0, 0x4b, 0x30, 0x44, 0xf8, 0xb3, 0x60, 0x45, + 0xb1, 0x7c, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x05, + 0x80, 0x40, 0x72, 0xc5, 0x00, 0x06, 0x90, 0x55, + 0xd0, 0x01, 0x00, 0x40, 0xa0, 0x55, 0x0f, 0x87, + 0x01, 0x46, 0x00, 0x06, 0x03, 0xef, 0xd0, 0x3f, + 0xa0, 0x38, 0xb0, 0x01, 0xa0, 0x37, 0x80, 0x3f, + 0x82, 0x34, 0x80, 0x3f, 0xf2, 0x1a, 0x80, 0x34, + 0x80, 0x3f, 0xf2, 0x1a, 0xd8, 0x00, 0xd8, 0x40, + 0xd8, 0x80, 0xd8, 0xc0, 0xd9, 0x00, 0xd9, 0x40, + 0xd9, 0x80, 0xd9, 0xc0, 0xda, 0x00, 0xda, 0x40, + 0xda, 0x80, 0xda, 0xc0, 0xdb, 0x00, 0xdb, 0x40, + 0xdb, 0x80, 0xdb, 0xc0, 0xdc, 0x00, 0xdc, 0x40, + 0xdc, 0x80, 0xdc, 0xc0, 0xdd, 0x00, 0xdd, 0x40, + 0xdd, 0x80, 0xdd, 0xc0, 0xde, 0x00, 0xde, 0x40, + 0xde, 0x80, 0xde, 0xc0, 0xdf, 0x00, 0xdf, 0x40, + 0xdf, 0x80, 0xdf, 0xc0, 0xde, 0x80, 0xde, 0xc1, + 0x00, 0x28, 0xd0, 0x60, 0x6e, 0x81, 0x80, 0x00, + 0x80, 0x05, 0x00, 0xe3, 0xd1, 0x88, 0x00, 0x73, + 0xd5, 0x80, 0x60, 0x06, 0xb1, 0xbc, 0x00, 0xfa, + 0xd0, 0x80, 0x60, 0x06, 0x00, 0x26, 0xd0, 0x6c, + 0x6e, 0x81, 0x04, 0x32, 0xd2, 0x00, 0x00, 0xee, + 0xd1, 0x94, 0x60, 0x06, 0x00, 0xed, 0xd0, 0x50, + 0x6e, 0x81, 0x00, 0x22, 0xd0, 0x70, 0x6e, 0x81, + 0x00, 0xee, 0xd0, 0x74, 0x6e, 0x81, 0xd0, 0x4c, + 0x6e, 0x81, 0xd0, 0x02, 0x00, 0xef, 0xd0, 0x6c, + 0x60, 0x01, 0xd0, 0x03, 0x00, 0xef, 0xd0, 0x70, + 0x60, 0x01, 0x00, 0xe0, 0xd0, 0x48, 0xd0, 0x02, + 0x60, 0x01, 0x00, 0x32, 0xd6, 0xf0, 0xa0, 0x1c, + 0x00, 0x21, 0xd0, 0x60, 0xa0, 0x76, 0x00, 0x34, + 0xd5, 0x48, 0x80, 0x3f, 0x00, 0x23, 0xd0, 0x5c, + 0x00, 0x4a, 0xd0, 0x72, 0x70, 0x40, 0x00, 0x06, + 0x00, 0x22, 0xd1, 0xa4, 0x6e, 0xc6, 0xd0, 0x58, + 0x6e, 0xc1, 0xd0, 0xc9, 0x00, 0xed, 0xd0, 0x54, + 0x60, 0xc1, 0x00, 0x22, 0xd0, 0x40, 0x60, 0xc1, + 0x00, 0x22, 0xd0, 0x60, 0x60, 0xc1, 0x82, 0x34, + 0x80, 0x3f, 0xd6, 0xd9, 0x01, 0x20, 0xd6, 0x22, + 0x16, 0x08, 0xd0, 0x5e, 0xd0, 0x2c, 0x60, 0x40, + 0xd0, 0x70, 0x01, 0x74, 0xd6, 0x00, 0x60, 0x01, + 0x00, 0x2b, 0xd4, 0x10, 0x00, 0x27, 0xd4, 0x60, + 0x00, 0x2b, 0xd0, 0x90, 0xc0, 0xc2, 0xd1, 0x08, + 0xd1, 0x44, 0xa1, 0x50, 0x00, 0x21, 0xd0, 0xb6, + 0xd0, 0xd7, 0x00, 0x29, 0xd0, 0x04, 0x64, 0x00, + 0xb0, 0x3c, 0x64, 0x40, 0x80, 0x34, 0x80, 0x3f, + 0xd0, 0x40, 0x00, 0x35, 0xd0, 0x00, 0x60, 0x01, + 0xd0, 0x48, 0x6e, 0x81, 0xd0, 0x44, 0x6e, 0x81, + 0x00, 0x64, 0xd1, 0x80, 0x6e, 0x86, 0x01, 0x3c, + 0xd2, 0x39, 0xe0, 0x46, 0xd0, 0x00, 0xd0, 0x40, + 0xd0, 0x80, 0xd0, 0xc0, 0xd1, 0x00, 0xd1, 0x40, + 0xd1, 0x80, 0xd1, 0xc0, 0xd2, 0x00, 0xd2, 0x40, + 0xd2, 0x80, 0xd2, 0xc0, 0xd3, 0x00, 0xd3, 0x40, + 0xd3, 0x80, 0xd3, 0xc0, 0xd4, 0x00, 0xd4, 0x40, + 0xd4, 0x80, 0xd4, 0xc0, 0xd5, 0x00, 0xd5, 0x40, + 0xd5, 0x80, 0xd5, 0xc0, 0xd6, 0x00, 0xd6, 0x40, + 0xd6, 0x80, 0xd6, 0xc0, 0xd7, 0x00, 0xd7, 0x40, + 0xd7, 0x80, 0xd7, 0xc0, 0x0f, 0xc5, 0x50, 0x00, + 0x01, 0x46, 0x00, 0x06, 0xde, 0x80, 0xde, 0xc1, + 0x03, 0x2f, 0xd0, 0x33, 0xa0, 0x38, 0xb0, 0x01, + 0xa0, 0x37, 0x80, 0x3f, 0x08, 0x20, 0xdf, 0x00, + 0x82, 0x34, 0x80, 0x3f, 0x00, 0xee, 0xd0, 0x08, + 0x77, 0xc0, 0xb0, 0x04, 0x77, 0x80, 0xb0, 0x04, + 0xc0, 0x5f, 0x30, 0x5e, 0x60, 0x40, 0xd7, 0x00, + 0xb7, 0x01, 0x80, 0x34, 0x80, 0x3f, 0x00, 0x60, + 0xd0, 0x80, 0x00, 0xec, 0xd0, 0x40, 0x60, 0x81, + 0xb0, 0x7c, 0x60, 0x81, 0x00, 0xa0, 0xd0, 0x80, + 0xb0, 0x74, 0x60, 0x81, 0xb0, 0x7c, 0x60, 0x81, + 0x00, 0x68, 0xd0, 0x80, 0x6e, 0x82, 0x00, 0xef, + 0xd0, 0x8c, 0x6e, 0x82, 0x00, 0x06, 0xd0, 0x11, + 0xa0, 0x38, 0x80, 0x3f, 0x08, 0x20, 0xd0, 0x40, + 0x10, 0x48, 0xa0, 0x4a, 0xa0, 0x5b, 0x0c, 0x20, + 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0xa0, 0x0a, + 0x90, 0x4d, 0x0f, 0xff, 0xd8, 0x1f, 0x40, 0x40, + 0xa0, 0x4d, 0x80, 0x0a, 0x80, 0x07, 0x80, 0x1b, + 0x80, 0x27, 0x00, 0x60, 0xd0, 0x00, 0xa0, 0x09, + 0x80, 0x28, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, + 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, + 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, + 0xd0, 0x00, 0xa0, 0x29, 0x80, 0x2b, 0x02, 0x30, + 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb0, + 0xd0, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30, + 0xd0, 0x01, 0xa0, 0x38, 0x00, 0xea, 0xd0, 0x00, + 0xd0, 0x4e, 0x0f, 0x0b, 0x70, 0x40, 0x00, 0x06, + 0x00, 0x21, 0xd0, 0x88, 0x00, 0xe1, 0xd0, 0x60, + 0x60, 0x81, 0x00, 0x2b, 0xd0, 0x80, 0x00, 0xe0, + 0xd0, 0x6c, 0x60, 0x81, 0xb0, 0x7c, 0x00, 0x27, + 0xd0, 0xa0, 0x60, 0x81, 0xb0, 0x7c, 0xd0, 0x82, + 0x60, 0x81, 0xb0, 0x7c, 0xd0, 0x85, 0x60, 0x81, + 0xb0, 0x7c, 0x03, 0xaa, 0xd0, 0x98, 0x60, 0x81, + 0xb0, 0x7c, 0x6e, 0x81, 0x00, 0x27, 0xd0, 0x40, + 0x6e, 0x81, 0xb0, 0x7c, 0x6e, 0x81, 0xb0, 0x7c, + 0x6e, 0x81, 0x00, 0x27, 0xd1, 0x90, 0x6e, 0x86, + 0x00, 0x21, 0xd1, 0xb8, 0x6e, 0x86, 0x00, 0x66, + 0xd1, 0xa0, 0xd0, 0x00, 0x01, 0x26, 0xd0, 0x58, + 0x30, 0x01, 0x60, 0x06, 0x00, 0xed, 0xd1, 0xbc, + 0x6e, 0x86, 0x00, 0xec, 0xd1, 0xb8, 0x6e, 0x86, + 0xb1, 0x84, 0x6e, 0x86, 0x00, 0xee, 0xd1, 0x84, + 0x70, 0x46, 0x00, 0x65, 0xd1, 0x94, 0x60, 0x46, + 0x00, 0x64, 0xd1, 0xbc, 0x6e, 0x86, 0x00, 0x65, + 0xd1, 0x80, 0x6e, 0x86, 0xb1, 0xbc, 0x6e, 0x86, + 0xb1, 0xbc, 0x6e, 0x86, 0x00, 0xed, 0xd1, 0xa8, + 0x6e, 0x86, 0xd0, 0x0e, 0xb1, 0xbc, 0x60, 0x06, + 0xb1, 0xbc, 0x60, 0x06, 0x00, 0x65, 0xd1, 0xa4, + 0x60, 0x06, 0x00, 0x28, 0xd1, 0xa4, 0x6e, 0x86, + 0x00, 0x27, 0xd1, 0x98, 0x6e, 0x86, 0x00, 0x64, + 0xd1, 0xa4, 0x6e, 0x86, 0xd2, 0x01, 0x00, 0x64, + 0xd0, 0x60, 0x62, 0x01, 0x00, 0x64, 0xd1, 0x80, + 0x70, 0x46, 0x6e, 0x86, 0x00, 0xef, 0xd1, 0x98, + 0x70, 0x86, 0x08, 0x20, 0xd0, 0xcf, 0x30, 0xc1, + 0xea, 0x42, 0xd0, 0x81, 0x00, 0x21, 0xd1, 0xa8, + 0x60, 0x86, 0x00, 0xed, 0xd1, 0xa0, 0x6e, 0xc6, + 0x00, 0x65, 0xd1, 0x98, 0x6e, 0xc6, 0x00, 0x22, + 0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 0x00, 0xc6, + 0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, 0x50, 0x00, + 0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, 0x00, 0x64, + 0xd0, 0x60, 0x70, 0xc1, 0x00, 0xec, 0xd0, 0x40, + 0x71, 0x81, 0xb0, 0x7c, 0x71, 0xc1, 0xc0, 0x87, + 0x30, 0x86, 0xf9, 0x83, 0x10, 0xee, 0xe9, 0x76, + 0x10, 0xe1, 0xe9, 0x76, 0xe2, 0x57, 0x00, 0x63, + 0xd0, 0xbf, 0x72, 0x06, 0xb1, 0xbc, 0x41, 0x82, + 0x02, 0x1b, 0xe9, 0x8d, 0x72, 0x86, 0xb1, 0xbc, + 0x41, 0x82, 0xd0, 0x75, 0x30, 0x48, 0xe9, 0xfe, + 0xb0, 0x7f, 0xea, 0x00, 0x02, 0x1c, 0xe9, 0x96, + 0x15, 0xa3, 0xea, 0x57, 0x10, 0xf0, 0xe9, 0x9a, + 0x10, 0xfa, 0xf9, 0xa1, 0x15, 0xa3, 0xea, 0x57, + 0x00, 0x21, 0xd0, 0x4c, 0x70, 0x41, 0x10, 0x61, + 0xfa, 0x57, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x40, + 0xd0, 0x85, 0x40, 0x42, 0x60, 0x40, 0x00, 0x64, + 0xd0, 0x64, 0x62, 0x01, 0x12, 0x2b, 0xe9, 0xeb, + 0x12, 0x3b, 0xe9, 0xd5, 0x00, 0xec, 0xd0, 0x40, + 0x61, 0x81, 0x12, 0x2d, 0xe9, 0xbf, 0x12, 0x30, + 0xe9, 0xd4, 0x12, 0x36, 0xe9, 0xd4, 0x12, 0x3a, + 0xe9, 0xd4, 0xd0, 0x62, 0x30, 0x48, 0xe9, 0xf2, + 0x12, 0x2e, 0xe9, 0xf9, 0xe1, 0x76, 0x00, 0xed, + 0xd0, 0x08, 0x70, 0x40, 0xd0, 0x85, 0x40, 0x42, + 0x60, 0x40, 0xb0, 0x08, 0x00, 0x21, 0xd0, 0x41, + 0x60, 0x40, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, + 0xf2, 0x5a, 0x00, 0xed, 0xd0, 0x20, 0xd0, 0x41, + 0x60, 0x40, 0x10, 0xe1, 0xea, 0x3a, 0xe2, 0x57, + 0xe2, 0x53, 0x10, 0xee, 0xf9, 0xe9, 0x01, 0x46, + 0x82, 0x34, 0x80, 0x3f, 0x97, 0x2e, 0xc7, 0x5c, + 0xa7, 0x66, 0x81, 0x34, 0x80, 0x3f, 0x00, 0x21, + 0xd0, 0x01, 0xa0, 0x38, 0x00, 0xc6, 0x00, 0x21, + 0xd0, 0x15, 0x0b, 0x09, 0x00, 0x4d, 0xb0, 0x01, + 0xed, 0xe5, 0xd2, 0x1a, 0xe1, 0xec, 0xf1, 0x18, + 0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0xd0, 0x4e, + 0x60, 0x46, 0xe2, 0x54, 0xc0, 0x0a, 0x10, 0x06, + 0x52, 0x80, 0x00, 0xed, 0xd0, 0x40, 0x62, 0x81, + 0xe2, 0x53, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, + 0xf2, 0x5a, 0xe1, 0x70, 0x12, 0xa3, 0xf6, 0x57, + 0x15, 0xa1, 0xfa, 0x57, 0x12, 0xa0, 0xea, 0x23, + 0x00, 0x65, 0xd1, 0x1c, 0xd0, 0x75, 0x30, 0x48, + 0xea, 0x0a, 0xb1, 0x3c, 0x71, 0x04, 0x11, 0x20, + 0xfa, 0x11, 0x00, 0xec, 0xd0, 0x40, 0x61, 0x81, + 0xe2, 0x57, 0x12, 0xa1, 0xea, 0x33, 0x00, 0xe2, + 0xd0, 0x60, 0x70, 0x01, 0xb0, 0x7c, 0x70, 0x41, + 0x10, 0x0c, 0x50, 0x40, 0x0c, 0x30, 0xd0, 0x00, + 0x31, 0x01, 0xee, 0x21, 0x21, 0x00, 0xe6, 0x57, + 0xe2, 0x23, 0x31, 0x00, 0xfe, 0x57, 0xd0, 0x75, + 0x30, 0x48, 0xea, 0x28, 0xf2, 0x5a, 0xe2, 0x0d, + 0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0x00, 0x63, + 0xd1, 0x3f, 0xb1, 0xbc, 0x41, 0x84, 0x61, 0x81, + 0xd0, 0x50, 0x60, 0x46, 0xe2, 0x57, 0x00, 0xed, + 0xd0, 0x7c, 0x70, 0x41, 0x08, 0x20, 0xd0, 0x00, + 0x10, 0x08, 0xe2, 0x1c, 0xd2, 0x84, 0x00, 0xed, + 0xd1, 0xa4, 0x62, 0x86, 0xd5, 0x00, 0xb5, 0x01, + 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc7, 0x5e, + 0x97, 0x2e, 0x81, 0x34, 0x80, 0x3f, 0x02, 0xe8, + 0xd0, 0x30, 0xa0, 0x37, 0xa0, 0x38, 0x08, 0x20, + 0xdf, 0x00, 0x80, 0x73, 0x80, 0x3f, 0x00, 0xc6, + 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0xf2, 0x5a, + 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, 0x02, 0x3c, + 0xda, 0x89, 0xe0, 0x46, 0x00, 0x28, 0xd0, 0x64, + 0x70, 0x81, 0x00, 0x22, 0xd0, 0x00, 0x50, 0x80, + 0x60, 0x81, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, + 0x00, 0xed, 0xd1, 0xa4, 0x72, 0x86, 0x00, 0xef, + 0xd1, 0x90, 0x70, 0x46, 0x10, 0x5c, 0x10, 0x65, + 0xed, 0x7d, 0xd0, 0x46, 0xc0, 0x0a, 0x10, 0x40, + 0x60, 0x46, 0x00, 0x22, 0xd0, 0x73, 0x30, 0x54, + 0xe9, 0x8e, 0x12, 0xa4, 0xe9, 0xb5, 0x15, 0x20, + 0xe9, 0xc0, 0xb0, 0x7b, 0xe9, 0xc3, 0xb0, 0x41, + 0xe9, 0xc9, 0xc0, 0x54, 0x10, 0x5c, 0x10, 0x6e, + 0xe9, 0xc6, 0xe1, 0xb5, 0x00, 0x28, 0xd1, 0xb0, + 0xd0, 0x00, 0x60, 0x06, 0x12, 0xa4, 0xf9, 0xb2, + 0x00, 0xed, 0xd1, 0x9c, 0x62, 0x86, 0xd2, 0x80, + 0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86, 0xd0, 0x02, + 0x00, 0xec, 0xd1, 0xbc, 0x60, 0x06, 0x00, 0x64, + 0xd1, 0xa0, 0x72, 0x06, 0x12, 0x21, 0xf9, 0xa6, + 0xd2, 0x0d, 0x62, 0x06, 0x00, 0xed, 0xd1, 0xa0, + 0x61, 0x86, 0xd0, 0x0e, 0x00, 0xed, 0xd1, 0xac, + 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, 0x00, 0x65, + 0xd1, 0xa4, 0x60, 0x06, 0x01, 0x7e, 0xd2, 0x31, + 0xe1, 0xcb, 0x01, 0x46, 0x90, 0x49, 0x00, 0x60, + 0xd0, 0x00, 0x50, 0x40, 0xa0, 0x49, 0x80, 0x3f, + 0x00, 0xc6, 0x0c, 0x09, 0x05, 0x0d, 0xe1, 0x70, + 0x01, 0xbe, 0xde, 0x41, 0xe1, 0xcb, 0x01, 0xbb, + 0xd8, 0x10, 0xe1, 0xcb, 0x01, 0xbd, 0xd8, 0x0b, + 0xe1, 0xcb, 0x03, 0xb8, 0xda, 0x10, 0x01, 0x46, + 0x90, 0x49, 0x00, 0x60, 0xd1, 0x00, 0x50, 0x44, + 0x30, 0x44, 0xa0, 0x49, 0x80, 0x3f, 0x00, 0xc6, + 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x01, 0xfa, 0xd2, 0x3d, 0x00, 0x25, 0xdc, 0xd8, + 0xf0, 0x4a, 0x00, 0x26, 0xd0, 0x18, 0xd0, 0x40, + 0x60, 0x40, 0x00, 0x28, 0xd0, 0x24, 0x70, 0x40, + 0xd0, 0x82, 0x50, 0x42, 0x60, 0x40, 0x00, 0xec, + 0xd0, 0xa4, 0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x81, + 0x00, 0xec, 0xd1, 0x98, 0xd0, 0x41, 0x60, 0x46, + 0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x8e, 0xd0, 0x40, + 0x60, 0x46, 0xe1, 0x81, 0xd0, 0x40, 0x00, 0xe6, + 0xd0, 0x10, 0x60, 0x40, 0xb0, 0x3c, 0x60, 0x40, + 0xb0, 0x3c, 0x60, 0x40, 0xd0, 0xe0, 0x00, 0xea, + 0xd0, 0x40, 0x00, 0xe8, 0xd0, 0x82, 0x01, 0x46, + 0x70, 0x01, 0xb0, 0x7c, 0x60, 0x02, 0xb0, 0xbc, + 0x00, 0x06, 0x00, 0xc6, 0xb0, 0xc1, 0xed, 0x9b, + 0x80, 0x49, 0xd6, 0x44, 0xd5, 0x43, 0x00, 0xe0, + 0xd1, 0x80, 0x00, 0x06, 0x0b, 0x09, 0x01, 0x0d, + 0x0b, 0x09, 0x61, 0x06, 0xb1, 0xbc, 0x01, 0x4d, + 0x09, 0x09, 0x61, 0x46, 0xb1, 0xbc, 0x00, 0xcd, + 0x09, 0x09, 0x10, 0xe4, 0xed, 0xb8, 0x60, 0xc6, + 0xb1, 0xbc, 0x00, 0xcd, 0x60, 0xc6, 0x00, 0xed, + 0xd0, 0x04, 0x70, 0x00, 0x10, 0x20, 0xf9, 0xd3, + 0x10, 0xe3, 0xe9, 0xc4, 0x10, 0xe6, 0xf9, 0xd3, + 0x01, 0x46, 0x90, 0x10, 0x00, 0x20, 0xd0, 0x44, + 0x50, 0x40, 0x00, 0xc6, 0xa0, 0x50, 0x00, 0xa0, + 0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 0x00, 0xed, + 0xd1, 0xa4, 0xd0, 0x04, 0x60, 0x06, 0x00, 0xee, + 0xd1, 0xac, 0x73, 0x86, 0x10, 0xe3, 0xe5, 0xde, + 0xe9, 0xe3, 0x00, 0xe7, 0xd0, 0x40, 0x00, 0xae, + 0xd0, 0xbb, 0xe1, 0xe7, 0x01, 0x24, 0xd0, 0x6b, + 0x00, 0xea, 0xd0, 0xa6, 0xe1, 0xe7, 0x01, 0x21, + 0xd0, 0x7b, 0x00, 0xe8, 0xd0, 0x90, 0x13, 0xa0, + 0xf9, 0xea, 0xc0, 0x42, 0x00, 0xe0, 0xd1, 0xa8, + 0x60, 0x46, 0xb1, 0x98, 0x0b, 0xc9, 0x00, 0x4d, + 0x09, 0x09, 0x10, 0x44, 0x00, 0x8d, 0x20, 0x42, + 0x10, 0x5f, 0x60, 0x46, 0xb1, 0xb8, 0x00, 0x90, + 0xea, 0x17, 0x0a, 0x89, 0x00, 0x8d, 0x60, 0x86, + 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, + 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, + 0x10, 0x60, 0xea, 0x0b, 0x00, 0xe8, 0xd1, 0x80, + 0xf2, 0xb0, 0x10, 0x60, 0xfa, 0x17, 0x08, 0x49, + 0x00, 0xe0, 0xd1, 0xa4, 0x00, 0x4d, 0x60, 0x46, + 0x10, 0x60, 0xea, 0x1b, 0x00, 0xe9, 0xd1, 0x80, + 0xf2, 0xb0, 0x10, 0x60, 0xea, 0x1b, 0x00, 0xe0, + 0xd1, 0x88, 0xd0, 0x40, 0x60, 0x46, 0xd0, 0x00, + 0x00, 0xe0, 0xd1, 0xa8, 0x70, 0x46, 0x00, 0xef, + 0xd1, 0x9c, 0x70, 0x86, 0xb0, 0xb0, 0xee, 0x25, + 0xd0, 0x81, 0x00, 0x90, 0xea, 0x28, 0x20, 0x01, + 0x10, 0x41, 0x10, 0x9f, 0x10, 0xa0, 0xee, 0x25, + 0x10, 0x1c, 0x00, 0x65, 0xd1, 0xa8, 0x60, 0x06, + 0x01, 0xb4, 0xd4, 0x3a, 0xe0, 0x46, 0x50, 0x00, + 0x02, 0x31, 0xdc, 0x13, 0x00, 0x27, 0xdc, 0xd8, + 0xf0, 0x4a, 0x0c, 0x09, 0x00, 0x06, 0x05, 0x0d, + 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xe9, 0xea, + 0xb0, 0x7d, 0xfa, 0x05, 0x09, 0x09, 0x01, 0xcd, + 0x11, 0xe1, 0xf9, 0xc7, 0x80, 0x09, 0x80, 0x27, + 0x0a, 0x09, 0xd6, 0x45, 0x00, 0xe1, 0xd1, 0xa0, + 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, + 0x00, 0x4d, 0x60, 0x46, 0x00, 0x50, 0xe9, 0x91, + 0xd4, 0x01, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d, + 0x60, 0x46, 0x00, 0xe0, 0xd1, 0x80, 0x08, 0x89, + 0x00, 0x4d, 0x08, 0x89, 0x10, 0x4c, 0x71, 0x06, + 0x21, 0x01, 0x61, 0x06, 0xb1, 0xbc, 0x00, 0x4d, + 0x0b, 0x49, 0x10, 0x4c, 0x71, 0x46, 0x21, 0x41, + 0x61, 0x46, 0xb1, 0xb0, 0x00, 0x4d, 0x10, 0x5f, + 0x60, 0x46, 0xb1, 0xbc, 0x0a, 0x09, 0x00, 0x4d, + 0x10, 0x4a, 0x70, 0x86, 0x20, 0x81, 0x60, 0x86, + 0x00, 0xe1, 0xd1, 0xac, 0x08, 0x49, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x09, 0x49, 0x00, 0x8d, + 0x60, 0x86, 0xc0, 0x02, 0x00, 0xe0, 0xd1, 0xa8, + 0x70, 0xc6, 0x10, 0xc0, 0xd0, 0x20, 0x30, 0x01, + 0x10, 0xc0, 0x60, 0xc6, 0xe1, 0x75, 0x11, 0xe2, + 0xf9, 0x75, 0x00, 0xe2, 0xd1, 0x80, 0x08, 0xc9, + 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, + 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x10, 0x60, + 0xf9, 0xd7, 0xb1, 0xb4, 0xe1, 0xde, 0xd2, 0x03, + 0x0a, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, + 0xb2, 0x01, 0xf9, 0xd8, 0x0b, 0xc9, 0x00, 0x4d, + 0x10, 0x49, 0x10, 0x56, 0x60, 0x46, 0xb1, 0xbc, + 0x0b, 0x89, 0x00, 0x4d, 0x10, 0x4a, 0x10, 0x56, + 0x60, 0x46, 0xe1, 0x75, 0x0b, 0x2c, 0xd4, 0x40, + 0xf3, 0xb0, 0xe1, 0x77, 0x00, 0xe0, 0xd0, 0x6c, + 0x00, 0xe0, 0xd1, 0x80, 0xd0, 0x0a, 0xf1, 0xfe, + 0x00, 0xe1, 0xd1, 0xb0, 0xd0, 0x02, 0xf1, 0xfe, + 0x00, 0xe0, 0xd1, 0x80, 0x76, 0x86, 0xb1, 0xbc, + 0x73, 0x46, 0xe2, 0x3c, 0x70, 0x81, 0x60, 0x86, + 0xb1, 0xbc, 0xb0, 0x7c, 0xb0, 0x01, 0xed, 0xfe, + 0x0f, 0xc5, 0x00, 0xe1, 0xd1, 0xa0, 0x70, 0x46, + 0xd0, 0x8f, 0x40, 0x42, 0x00, 0x25, 0xd0, 0xe0, + 0x00, 0x24, 0xd1, 0x20, 0x10, 0x6a, 0xea, 0x1e, + 0x00, 0x66, 0xd0, 0xe0, 0x00, 0x62, 0xd1, 0x00, + 0x10, 0x66, 0xea, 0x1e, 0x00, 0x6e, 0xd0, 0xc0, + 0x10, 0x64, 0xea, 0x1e, 0x00, 0x2b, 0xd0, 0xd0, + 0x00, 0x29, 0xd1, 0x00, 0x00, 0xe0, 0xd1, 0x80, + 0x76, 0x86, 0x16, 0xa0, 0xe9, 0xee, 0x30, 0xda, + 0xe5, 0xee, 0xb1, 0xbc, 0x73, 0x46, 0x13, 0x60, + 0xe9, 0xee, 0x31, 0x0d, 0xe5, 0xee, 0xd0, 0x82, + 0xb1, 0xbc, 0x70, 0x46, 0x10, 0x60, 0xe9, 0xee, + 0xb0, 0x81, 0xee, 0x2c, 0x00, 0xe0, 0xd0, 0x40, + 0x00, 0xe0, 0xd1, 0xac, 0xd0, 0x0a, 0xf1, 0xfe, + 0x00, 0xe1, 0xd0, 0x70, 0xd0, 0x02, 0xf1, 0xfe, + 0x00, 0xec, 0xd1, 0x98, 0xd0, 0x40, 0x60, 0x46, + 0x00, 0xe0, 0xd0, 0x8c, 0x70, 0x82, 0x00, 0x21, + 0xd0, 0x70, 0x60, 0x81, 0xd0, 0x40, 0x00, 0x25, + 0xd0, 0x20, 0x30, 0x1a, 0xfa, 0x50, 0x00, 0x23, + 0xd0, 0x30, 0x30, 0x0d, 0xfa, 0x50, 0xd0, 0x41, + 0x00, 0x21, 0xd1, 0x84, 0x60, 0x46, 0xb6, 0xb1, + 0x16, 0x9c, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, + 0x02, 0x31, 0xdc, 0x13, 0x00, 0x27, 0xdc, 0xd8, + 0xf0, 0x4a, 0x00, 0xec, 0xd0, 0xa8, 0x70, 0xc2, + 0x10, 0xe0, 0xf9, 0x77, 0x00, 0xec, 0xd1, 0x9c, + 0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0, + 0xe9, 0x84, 0xd0, 0x40, 0x60, 0x46, 0xe1, 0x77, + 0x0b, 0x49, 0x00, 0xe2, 0xd1, 0xa0, 0x00, 0x4d, + 0x10, 0x5f, 0x00, 0x6f, 0xd0, 0xff, 0x40, 0x43, + 0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x09, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d, + 0x60, 0x46, 0x10, 0x61, 0xf9, 0x9b, 0xd3, 0xc2, + 0x00, 0xec, 0xd1, 0xbc, 0x63, 0xc6, 0x0c, 0x09, + 0x90, 0x4d, 0x10, 0x60, 0xe5, 0x9c, 0x00, 0x06, + 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, + 0xf9, 0xa9, 0x0b, 0xa0, 0xd4, 0x40, 0xf3, 0xb0, + 0xe1, 0xa0, 0x00, 0xec, 0xd1, 0x9c, 0xd0, 0x40, + 0x60, 0x46, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, + 0x0b, 0x09, 0x00, 0x4d, 0x0b, 0x09, 0x00, 0x4d, + 0x0a, 0x09, 0x01, 0x4d, 0x0a, 0x09, 0x00, 0x4d, + 0x01, 0x59, 0xe9, 0x96, 0x09, 0x09, 0x00, 0x4d, + 0x10, 0x5f, 0x10, 0x61, 0xf9, 0x96, 0x09, 0x09, + 0x01, 0x4d, 0x11, 0x5f, 0x0b, 0xc9, 0x00, 0x4d, + 0xc0, 0x01, 0x10, 0x5f, 0x11, 0x4e, 0x51, 0x41, + 0x08, 0x49, 0x00, 0x4d, 0x0b, 0xc9, 0x10, 0x0f, + 0x00, 0x4d, 0x50, 0x01, 0x00, 0xed, 0xd1, 0xb6, + 0x01, 0x46, 0x00, 0x06, 0xa0, 0x3c, 0xa1, 0x7d, + 0x60, 0x06, 0x00, 0xc6, 0xd5, 0x00, 0xb5, 0x01, + 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, + 0x00, 0xec, 0xd0, 0xac, 0x70, 0xc2, 0x10, 0xe0, + 0xf9, 0x70, 0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x41, + 0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x7f, + 0xd0, 0x40, 0x60, 0x46, 0xe1, 0x70, 0x0a, 0x89, + 0x0b, 0xcd, 0x00, 0xe3, 0xd1, 0x80, 0x6b, 0xc6, + 0x08, 0xc9, 0x05, 0x8d, 0x15, 0xa3, 0xee, 0x6e, + 0x15, 0xa0, 0xea, 0x6e, 0x90, 0x4d, 0xd0, 0x9f, + 0xd0, 0xdf, 0x40, 0x81, 0x10, 0x55, 0x40, 0xc1, + 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc8, 0x1d, + 0x81, 0x34, 0x80, 0x3f, 0x00, 0xc6, 0xd1, 0x23, + 0x31, 0x03, 0x11, 0x02, 0x38, 0x04, 0xb0, 0x8d, + 0x10, 0x9d, 0x28, 0x02, 0xc0, 0x60, 0x00, 0x65, + 0xd1, 0x94, 0x71, 0x06, 0x68, 0x06, 0x30, 0x44, + 0x00, 0xed, 0xd1, 0xa8, 0x70, 0x06, 0x10, 0x20, + 0xe9, 0xb0, 0x00, 0xee, 0xd0, 0xc0, 0x70, 0xc3, + 0x20, 0x43, 0xb0, 0x01, 0xf9, 0xac, 0x60, 0x06, + 0x00, 0x64, 0xd1, 0xbc, 0x71, 0x06, 0xc0, 0x04, + 0x21, 0x01, 0x61, 0x06, 0x10, 0x20, 0xf5, 0xbb, + 0x11, 0x20, 0xe5, 0xbb, 0xb0, 0x41, 0x00, 0x65, + 0xd1, 0x80, 0x71, 0x06, 0x21, 0x01, 0x61, 0x06, + 0x00, 0xed, 0xd1, 0xac, 0x71, 0x06, 0x15, 0xa1, + 0xe9, 0xcb, 0xb1, 0x3f, 0x61, 0x06, 0x15, 0xa3, + 0xf9, 0xd6, 0xd0, 0xbf, 0xe1, 0xd3, 0xd0, 0x40, + 0x60, 0x46, 0xb1, 0xbc, 0x70, 0x86, 0x61, 0x06, + 0x31, 0x02, 0xe5, 0xd3, 0x20, 0x84, 0x00, 0x65, + 0xd1, 0xa4, 0x60, 0x86, 0xd9, 0x40, 0x00, 0xec, + 0xd1, 0x94, 0x79, 0x06, 0xb1, 0x84, 0x78, 0xc6, + 0xc0, 0x63, 0x30, 0x64, 0xe9, 0xf8, 0x00, 0xa7, + 0xd0, 0xff, 0x7a, 0x63, 0x00, 0x65, 0xd0, 0x00, + 0x71, 0x00, 0x31, 0x29, 0xe5, 0xf8, 0xc0, 0x63, + 0xc8, 0xc1, 0xb0, 0x78, 0x40, 0x43, 0xc0, 0xa4, + 0x30, 0x81, 0xe9, 0xf2, 0x7a, 0x41, 0x31, 0x29, + 0xf5, 0xe8, 0x21, 0x29, 0x61, 0x00, 0xb8, 0xfc, + 0x79, 0x63, 0xb8, 0xfc, 0x48, 0xc3, 0x68, 0xc6, + 0x00, 0xed, 0xd1, 0xb8, 0x69, 0x46, 0x80, 0x28, + 0x0b, 0xc9, 0x00, 0x4d, 0x08, 0x49, 0x10, 0x41, + 0x00, 0xe3, 0xd1, 0x84, 0x00, 0x8d, 0x20, 0x42, + 0x60, 0x46, 0x00, 0xee, 0xd1, 0xa4, 0x70, 0x86, + 0x10, 0xa1, 0xee, 0x18, 0xe6, 0x6b, 0x90, 0x86, + 0x00, 0x90, 0xea, 0x18, 0x00, 0xed, 0xd0, 0x1c, + 0x70, 0x80, 0xb0, 0x81, 0xe6, 0x6b, 0x60, 0x80, + 0xb1, 0xa8, 0x70, 0x86, 0x10, 0xa0, 0xfa, 0x6b, + 0x00, 0x21, 0xd0, 0x38, 0x70, 0x80, 0x10, 0xa0, + 0xfa, 0x6b, 0x0f, 0xef, 0xd0, 0xbf, 0x30, 0x81, + 0xfa, 0x22, 0x60, 0x00, 0x08, 0x20, 0xd0, 0x00, + 0x5f, 0x00, 0x15, 0xa3, 0xea, 0x6b, 0x00, 0xee, + 0xd1, 0x80, 0x79, 0x46, 0x00, 0xf8, 0xd0, 0x00, + 0xc4, 0x40, 0x00, 0xe3, 0xd1, 0x84, 0x78, 0x46, + 0x0f, 0xef, 0xd0, 0x3f, 0x30, 0x21, 0xea, 0x48, + 0x00, 0xe0, 0xd1, 0x90, 0x78, 0x06, 0xc0, 0xa1, + 0x18, 0x43, 0x28, 0x42, 0x18, 0x43, 0x28, 0x42, + 0x18, 0x1e, 0xd8, 0x80, 0x08, 0x11, 0xea, 0x41, + 0x28, 0xa1, 0x18, 0x01, 0x18, 0x5f, 0x18, 0x60, + 0xee, 0x3e, 0xc0, 0x51, 0x30, 0x62, 0xee, 0x4e, + 0xc8, 0x91, 0x18, 0x9f, 0x00, 0x21, 0xd1, 0xb8, + 0xd0, 0x01, 0x60, 0x06, 0x00, 0xef, 0xd0, 0x10, + 0xd0, 0x72, 0x60, 0x40, 0x01, 0x46, 0x82, 0x34, + 0x80, 0x3f, 0xc8, 0xdc, 0xc9, 0x1d, 0x81, 0x34, + 0x80, 0x3f, 0x00, 0xc6, 0x38, 0xe4, 0xee, 0x5e, + 0xea, 0x52, 0x28, 0xe5, 0x01, 0x46, 0x90, 0x6d, + 0x28, 0xc1, 0x00, 0xc6, 0x38, 0xe2, 0xf6, 0x6b, + 0xdb, 0x08, 0xf1, 0x16, 0xf1, 0x18, 0x00, 0x21, + 0xd1, 0xb4, 0x61, 0x86, 0xe2, 0x52, 0x01, 0xf7, + 0xd0, 0x19, 0xe0, 0x46, 0xd5, 0x00, 0xb5, 0x01, + 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, + 0x02, 0x31, 0xdc, 0x13, 0x00, 0x27, 0xdc, 0xd8, + 0xf0, 0x4a, 0xdb, 0x09, 0x00, 0xe3, 0xd0, 0x1c, + 0x6b, 0x00, 0xda, 0xc1, 0x00, 0xe6, 0xd1, 0x98, + 0x70, 0x06, 0xb1, 0x84, 0x60, 0x06, 0xb1, 0x84, + 0x60, 0x06, 0x05, 0x9f, 0xe9, 0x9f, 0x08, 0x49, + 0xd1, 0x17, 0x46, 0x44, 0x00, 0x4d, 0x10, 0x43, + 0x26, 0x41, 0x08, 0xc9, 0x05, 0xcd, 0xb5, 0xc1, + 0xe5, 0xcc, 0xc0, 0x57, 0x15, 0xc6, 0x25, 0xc1, + 0x15, 0xa3, 0xf9, 0x9f, 0x08, 0x49, 0xd1, 0x0f, + 0x46, 0x44, 0x00, 0x4d, 0x10, 0x44, 0x26, 0x41, + 0x08, 0xc9, 0x06, 0x0d, 0xb6, 0x01, 0xe5, 0xcc, + 0xc0, 0x58, 0x16, 0x06, 0x26, 0x01, 0x08, 0x49, + 0x00, 0x4d, 0x10, 0x60, 0xe9, 0xa6, 0x0a, 0x09, + 0x00, 0x4d, 0xe1, 0x9f, 0x0c, 0x09, 0x90, 0x4d, + 0x10, 0x60, 0xe5, 0xa7, 0x00, 0x06, 0x05, 0x0d, + 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xf9, 0xb3, + 0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0xab, 0xb0, 0x7d, + 0xf9, 0xb8, 0x02, 0x34, 0xd2, 0x44, 0xe0, 0x46, + 0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x40, 0x60, 0x46, + 0x02, 0x3c, 0xda, 0x89, 0x00, 0xec, 0xd1, 0x80, + 0x70, 0x46, 0xb1, 0xbc, 0x70, 0x86, 0x30, 0x81, + 0xe8, 0x46, 0x15, 0x63, 0xe9, 0xc9, 0x05, 0x5e, + 0xe8, 0x46, 0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, + 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, + 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0xcc, 0xc0, 0xcd, 0x01, 0xcd, 0x42, 0xcd, 0x83, + 0x00, 0xa0, 0xd0, 0x01, 0xa0, 0x38, 0xc8, 0x7f, + 0xc8, 0x06, 0xb1, 0xbe, 0xf3, 0x96, 0xc8, 0x80, + 0xf3, 0x92, 0x58, 0x80, 0xf3, 0x96, 0xc8, 0xc0, + 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x58, 0xc0, + 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 0x59, 0x40, + 0xc0, 0x22, 0xc0, 0x65, 0xc0, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x59, 0x00, + 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x96, 0xc9, 0x80, + 0xf3, 0x92, 0x59, 0x40, 0xf3, 0x96, 0xc9, 0xc0, + 0xf3, 0x92, 0x58, 0x80, 0xc0, 0x23, 0xc0, 0x62, + 0xd0, 0x88, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, + 0xc8, 0xc0, 0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, + 0xc8, 0x80, 0xf3, 0x92, 0x59, 0xc0, 0xc0, 0x24, + 0xc0, 0x67, 0xd0, 0x90, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x59, 0x80, + 0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x96, 0xca, 0x00, + 0xf3, 0x92, 0x59, 0xc0, 0xf3, 0x96, 0xca, 0x40, + 0xf3, 0x92, 0x59, 0x00, 0xc0, 0x25, 0xc0, 0x64, + 0xd0, 0x98, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, + 0xc9, 0x40, 0xf3, 0x92, 0x58, 0x80, 0xf3, 0x96, + 0xc9, 0x00, 0xf3, 0x92, 0x59, 0x00, 0xc0, 0x23, + 0xc0, 0x64, 0xd0, 0x84, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, 0x59, 0x40, + 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x5a, 0x40, + 0xc0, 0x26, 0xc0, 0x69, 0xd0, 0xa0, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, + 0x5a, 0x00, 0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, + 0x5a, 0x40, 0xf3, 0x96, 0xca, 0x80, 0xf3, 0x92, + 0x59, 0x80, 0xc0, 0x27, 0xc0, 0x66, 0xd0, 0xa8, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0xc0, + 0xf3, 0x92, 0x59, 0x00, 0xf3, 0x96, 0xc9, 0x80, + 0xf3, 0x92, 0x58, 0xc0, 0xc0, 0x22, 0xc0, 0x63, + 0xd0, 0x8c, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92, + 0x59, 0x80, 0xc0, 0x25, 0xc0, 0x66, 0xd0, 0x94, + 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0x80, + 0xf3, 0x92, 0x59, 0xc0, 0xf3, 0x96, 0xc8, 0xc0, + 0xf3, 0x92, 0x5a, 0x80, 0xc0, 0x28, 0xc0, 0x6a, + 0xd0, 0xb0, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, + 0xc9, 0x40, 0xf3, 0x92, 0x59, 0x40, 0xc0, 0x29, + 0xc0, 0x65, 0xd0, 0xb8, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x58, 0xc0, + 0xf3, 0x96, 0xca, 0x00, 0xf3, 0x92, 0x58, 0x80, + 0xc0, 0x24, 0xc0, 0x62, 0xd0, 0x9c, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x92, 0x5a, 0x00, 0xc0, 0x27, + 0xc0, 0x68, 0xd0, 0xa4, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xca, 0x80, 0xf3, 0x92, 0x59, 0x80, + 0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, 0x5a, 0x40, + 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 0x5a, 0x80, + 0xc0, 0x23, 0xc0, 0x6a, 0xd0, 0xac, 0x20, 0x86, + 0xf3, 0x9a, 0xf3, 0x92, 0x59, 0x40, 0xc0, 0x26, + 0xc0, 0x65, 0xd0, 0xb4, 0x20, 0x86, 0xf3, 0x9a, + 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x59, 0x00, + 0xc0, 0x29, 0xc0, 0x64, 0xd0, 0xbc, 0x20, 0x86, + 0xf3, 0x9a, 0xc0, 0x33, 0xc0, 0x74, 0xc0, 0xb5, + 0xc0, 0xf6, 0xd0, 0x40, 0x00, 0xa0, 0xd8, 0x00, + 0xa8, 0x38, 0x08, 0x45, 0x0a, 0x09, 0x00, 0x0d, + 0x0f, 0xc5, 0x50, 0x00, 0x0a, 0x09, 0x00, 0x0d, + 0x10, 0x08, 0x0f, 0xc5, 0x01, 0x46, 0x00, 0x06, + 0xa0, 0x7c, 0xa0, 0x3d, 0x60, 0x42, 0x00, 0xc6, + 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x14, 0x48, 0xd0, 0x81, 0x00, 0xef, 0xd1, 0x8c, + 0x71, 0x46, 0x11, 0x60, 0xfb, 0xb1, 0x60, 0x86, + 0x71, 0x46, 0x31, 0x42, 0xfb, 0xb1, 0x00, 0xec, + 0xd1, 0x0c, 0x74, 0x84, 0x00, 0x68, 0xd0, 0x80, + 0x70, 0x02, 0x10, 0x20, 0xfb, 0xc4, 0xc4, 0x82, + 0xc4, 0xd2, 0xb4, 0xfc, 0xda, 0x00, 0xda, 0x4f, + 0x0a, 0x09, 0x0f, 0xef, 0xd0, 0x3f, 0xb4, 0x7f, + 0xca, 0x29, 0x1a, 0x18, 0x4a, 0x00, 0x1a, 0x48, + 0x00, 0x8d, 0x2a, 0x42, 0xd0, 0x03, 0x40, 0x11, + 0xfb, 0xe3, 0xb4, 0x44, 0x00, 0xa0, 0xd0, 0xc0, + 0x30, 0xd3, 0xff, 0xe3, 0xb4, 0xfe, 0x01, 0x46, + 0x00, 0x06, 0xaa, 0x3d, 0xaa, 0x7c, 0x6a, 0x53, + 0x00, 0xc6, 0xb4, 0xfe, 0xb4, 0x7c, 0x1a, 0x61, + 0xfb, 0xc8, 0xb4, 0x43, 0x00, 0xef, 0xd0, 0x3f, + 0x40, 0x11, 0xeb, 0xf7, 0xb0, 0xc4, 0xe7, 0xf7, + 0xeb, 0xee, 0x61, 0x53, 0x64, 0x52, 0x64, 0xc4, + 0x00, 0x28, 0xd1, 0x24, 0x70, 0x04, 0x00, 0x21, + 0xd0, 0x80, 0x50, 0x02, 0x60, 0x04, 0x61, 0x46, + 0x0a, 0x09, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, + 0x02, 0x31, 0xdc, 0x13, 0x00, 0x27, 0xdc, 0xd8, + 0xf0, 0x4a, 0x01, 0xfa, 0xd2, 0x3d, 0x00, 0x25, + 0xdc, 0xd8, 0xf0, 0x4a, 0x09, 0x09, 0x01, 0xcd, + 0x11, 0xe8, 0xf9, 0xe2, 0x00, 0xe3, 0xd1, 0x9c, + 0x09, 0x09, 0x05, 0xcd, 0xb5, 0xc1, 0x09, 0x09, + 0x00, 0x4d, 0xb0, 0x41, 0x10, 0x46, 0x25, 0xc1, + 0x09, 0x09, 0x06, 0x0d, 0xb6, 0x01, 0x09, 0x09, + 0x00, 0x4d, 0x08, 0x89, 0xb0, 0x41, 0x10, 0x46, + 0x26, 0x01, 0x00, 0x8d, 0x08, 0x89, 0x10, 0x82, + 0xd0, 0x04, 0xc0, 0x55, 0x00, 0x40, 0x40, 0x40, + 0x05, 0x4d, 0x08, 0x49, 0x0b, 0x0d, 0xd1, 0x00, + 0x15, 0x63, 0xe9, 0xa2, 0xd1, 0x01, 0x55, 0x41, + 0xdb, 0x01, 0x4b, 0x15, 0xa1, 0x1b, 0x08, 0x89, + 0x00, 0x4d, 0x08, 0x49, 0x10, 0x41, 0xd1, 0x19, + 0x46, 0x44, 0x26, 0x41, 0x00, 0xcd, 0x08, 0x49, + 0x10, 0xc4, 0x00, 0x4d, 0x08, 0x49, 0x10, 0x41, + 0x20, 0x81, 0xa0, 0x89, 0x00, 0x4d, 0x10, 0x43, + 0x20, 0xc1, 0xa0, 0xe8, 0x08, 0x49, 0x00, 0x4d, + 0x1b, 0x03, 0x5b, 0x01, 0xbb, 0x3f, 0x6b, 0x06, + 0x08, 0x49, 0xb1, 0xbc, 0x00, 0x4d, 0x60, 0x46, + 0x08, 0x49, 0xb1, 0xbc, 0x0a, 0xcd, 0x1a, 0xc2, + 0x4a, 0xd9, 0x1a, 0xde, 0x6a, 0xc6, 0x08, 0x49, + 0xb1, 0xbc, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, + 0xea, 0x3e, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x08, 0xc9, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x09, 0xc9, 0x00, 0x4d, + 0x60, 0x46, 0xb1, 0xbc, 0x0a, 0x09, 0x00, 0x4d, + 0x60, 0x46, 0xe2, 0x3e, 0x11, 0xe3, 0xfa, 0x00, + 0x00, 0xe7, 0xd0, 0xc0, 0xd0, 0x84, 0xb0, 0x81, + 0xe6, 0x3e, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x43, + 0xb0, 0xfc, 0x10, 0x60, 0xe9, 0xe7, 0x10, 0xa3, + 0xf9, 0xf4, 0x00, 0xe8, 0xd1, 0x80, 0xe1, 0xf8, + 0x10, 0xa2, 0xf9, 0xfa, 0x00, 0xe9, 0xd1, 0x80, + 0xf2, 0xb0, 0xe1, 0xe7, 0xd2, 0x3f, 0x0a, 0x09, + 0x00, 0x4d, 0xb2, 0x01, 0xf5, 0xfb, 0xe1, 0xe7, + 0x11, 0xe7, 0xfa, 0x3e, 0xd4, 0x01, 0x00, 0xe1, + 0xd0, 0x24, 0x70, 0x00, 0x10, 0x21, 0xea, 0x0d, + 0x15, 0x63, 0xfa, 0x0d, 0xd4, 0x03, 0x44, 0x2c, + 0xb4, 0x3f, 0x00, 0xe6, 0xd1, 0x90, 0x0b, 0x09, + 0x00, 0x4d, 0x09, 0x49, 0x10, 0x45, 0x00, 0x8d, + 0x50, 0x81, 0xd0, 0x40, 0x10, 0x87, 0x10, 0x98, + 0x30, 0x42, 0xf2, 0x61, 0x60, 0x46, 0xb1, 0xbc, + 0x0b, 0x09, 0x00, 0x0d, 0x09, 0x49, 0x00, 0x0d, + 0xb4, 0x01, 0xfa, 0x0f, 0x00, 0xe6, 0xd0, 0x18, + 0x30, 0x06, 0xe6, 0x29, 0x60, 0x46, 0xb1, 0xbc, + 0xe2, 0x22, 0x00, 0xe0, 0xd1, 0x88, 0x70, 0x46, + 0x10, 0x63, 0xea, 0x39, 0x10, 0x64, 0xea, 0x39, + 0x00, 0xe6, 0xd1, 0x90, 0xd0, 0x00, 0x60, 0x06, + 0xb1, 0xbc, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, + 0xe2, 0x3e, 0x00, 0xef, 0xd1, 0x84, 0x70, 0x46, + 0x10, 0x60, 0xfa, 0x30, 0x0c, 0x09, 0x90, 0x4d, + 0x10, 0x60, 0xe6, 0x3f, 0x00, 0x06, 0x05, 0x0d, + 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xfa, 0x4b, + 0xd4, 0x40, 0xf3, 0xb0, 0xe2, 0x43, 0xb0, 0x7d, + 0xe9, 0x7a, 0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x40, + 0x60, 0x46, 0x02, 0x3c, 0xda, 0x89, 0x00, 0xec, + 0xd1, 0x80, 0x70, 0x46, 0xb1, 0xbc, 0x70, 0x86, + 0x30, 0x81, 0xe8, 0x46, 0x15, 0x63, 0xea, 0x5e, + 0x05, 0x5e, 0xe8, 0x46, 0x01, 0x73, 0xd4, 0x3d, + 0xe0, 0x46, 0x00, 0xe0, 0xd0, 0x00, 0x70, 0xc0, + 0x10, 0xc1, 0x00, 0xe0, 0xd0, 0x08, 0x70, 0x00, + 0x10, 0x23, 0xea, 0x75, 0xc0, 0x83, 0x10, 0x9d, + 0x30, 0xc2, 0x10, 0x9f, 0x30, 0xc2, 0x00, 0xef, + 0xd0, 0xac, 0x70, 0x82, 0x10, 0xa3, 0xea, 0x75, + 0x10, 0xc1, 0xc0, 0x83, 0x30, 0x81, 0xe6, 0x7e, + 0xc0, 0x83, 0x20, 0x81, 0xf6, 0x7f, 0xd0, 0x40, + 0x30, 0x43, 0x0f, 0xc5, 0xc0, 0x43, 0x0f, 0xc5, + 0x00, 0xed, 0xd1, 0xa4, 0x72, 0x86, 0x15, 0xa3, + 0xee, 0x23, 0x15, 0xa1, 0xe6, 0x23, 0x08, 0x20, + 0xd0, 0x00, 0x5f, 0x00, 0xd8, 0xc4, 0x15, 0x63, + 0xe9, 0x7e, 0x48, 0xd5, 0x18, 0xde, 0x18, 0xe0, + 0xe9, 0xc2, 0x00, 0xed, 0xd1, 0xb4, 0x79, 0xc6, + 0x19, 0xe0, 0xe9, 0x8c, 0x00, 0xed, 0xd0, 0x3a, + 0x79, 0xc6, 0x69, 0xc0, 0xd9, 0xc0, 0x69, 0xc6, + 0x00, 0xed, 0xd0, 0x38, 0x79, 0x40, 0x19, 0x60, + 0xe9, 0x98, 0x00, 0x28, 0xd0, 0x24, 0x70, 0x40, + 0x02, 0x20, 0xd0, 0x80, 0x50, 0x42, 0x60, 0x40, + 0x15, 0xa3, 0xe9, 0x9f, 0x00, 0xec, 0xd1, 0xb8, + 0x79, 0xc6, 0x69, 0x46, 0xc9, 0x67, 0x00, 0xec, + 0xd9, 0xb4, 0x70, 0x66, 0x00, 0xec, 0xd1, 0xbc, + 0x70, 0x06, 0x10, 0x20, 0xed, 0xbe, 0x10, 0x60, + 0xe9, 0xc1, 0x00, 0xe0, 0xda, 0xa8, 0x7a, 0xaa, + 0xc0, 0x2a, 0x10, 0x1f, 0x00, 0x22, 0xd0, 0xa0, + 0x70, 0x82, 0x20, 0x6a, 0x00, 0x9f, 0xe9, 0xb5, + 0x20, 0x40, 0x19, 0x60, 0xf9, 0xb8, 0xc9, 0x41, + 0xb0, 0x48, 0x30, 0x65, 0xf5, 0xbd, 0xb0, 0x70, + 0xed, 0xbe, 0xd9, 0x40, 0x00, 0xed, 0xd1, 0xbc, + 0x69, 0x46, 0x69, 0x66, 0x12, 0xa4, 0xea, 0x21, + 0x00, 0xec, 0xd1, 0xbc, 0x73, 0xc6, 0x15, 0xa3, + 0xe9, 0xdf, 0x33, 0xe3, 0xe5, 0xd3, 0xed, 0xd2, + 0x63, 0xc6, 0x00, 0x21, 0xd1, 0xa8, 0x63, 0xc6, + 0x00, 0xed, 0xd1, 0xa0, 0x63, 0xc6, 0x15, 0xa1, + 0xf9, 0xdc, 0x12, 0xa3, 0xe5, 0xe3, 0xd3, 0xc2, + 0x00, 0xec, 0xd1, 0xbc, 0x63, 0xc6, 0xe1, 0xe3, + 0x12, 0xa3, 0xea, 0x21, 0xe1, 0xe3, 0x12, 0xa2, + 0xf6, 0x21, 0x13, 0xe0, 0xfa, 0x21, 0x00, 0xee, + 0xd1, 0x8c, 0x78, 0x06, 0xb1, 0xbc, 0x78, 0x46, + 0xb1, 0xbc, 0x78, 0x86, 0xd1, 0x88, 0x72, 0x46, + 0xd1, 0x84, 0x73, 0x06, 0x13, 0x20, 0xf9, 0xe3, + 0x00, 0x64, 0xd1, 0xa0, 0x70, 0x46, 0xd0, 0xa2, + 0x30, 0x81, 0xe9, 0xff, 0x10, 0x70, 0xea, 0x11, + 0x10, 0x6d, 0xea, 0x14, 0x10, 0x76, 0xea, 0x19, + 0x10, 0x7a, 0xea, 0x28, 0xe2, 0x3b, 0x18, 0xe0, + 0xea, 0x3b, 0x00, 0xed, 0xd1, 0x80, 0x70, 0x86, + 0xb0, 0x81, 0xd0, 0x3f, 0x40, 0x02, 0x10, 0x20, + 0xea, 0x0c, 0x60, 0x86, 0xf3, 0x8a, 0xe1, 0xe3, + 0xc0, 0x02, 0x10, 0x1a, 0x50, 0x80, 0x60, 0x86, + 0xe2, 0x3b, 0x15, 0xa3, 0xea, 0x21, 0xe2, 0xe9, + 0xd2, 0x80, 0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86, + 0xe3, 0x0c, 0x00, 0xed, 0xd1, 0x88, 0xd0, 0x60, + 0x70, 0x06, 0x50, 0x40, 0x60, 0x46, 0x15, 0xa3, + 0xfb, 0x0c, 0xd5, 0x84, 0xe3, 0x0c, 0xd5, 0x00, + 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, + 0x00, 0xed, 0xd1, 0x88, 0xd0, 0x60, 0x70, 0x06, + 0x50, 0x40, 0x60, 0x46, 0x15, 0xa2, 0xe7, 0x0c, + 0xee, 0x21, 0x00, 0x21, 0xd1, 0x8c, 0x18, 0xe0, + 0xfa, 0x39, 0x70, 0x46, 0x10, 0x61, 0xea, 0x70, + 0xe2, 0x21, 0x65, 0x86, 0xe2, 0x21, 0x18, 0xe0, + 0xea, 0x70, 0xd1, 0x80, 0x73, 0x06, 0x15, 0xa2, + 0xee, 0x68, 0x00, 0x22, 0xd1, 0x80, 0x70, 0x46, + 0x6b, 0x06, 0xcb, 0x01, 0xb1, 0xb4, 0x70, 0x46, + 0x6a, 0xc6, 0xca, 0xc1, 0x00, 0x65, 0xd1, 0x98, + 0x70, 0x46, 0x10, 0x61, 0xfa, 0x50, 0x02, 0x41, + 0xc3, 0x21, 0xc7, 0xe0, 0x02, 0x50, 0xea, 0x56, + 0xc3, 0x20, 0xc7, 0xe1, 0xd1, 0x88, 0xd0, 0x01, + 0x02, 0x40, 0x62, 0x46, 0x0f, 0xef, 0xd0, 0x7f, + 0x30, 0x6f, 0xfa, 0x5f, 0xc3, 0x20, 0xc7, 0x4c, + 0xd0, 0x00, 0x00, 0x65, 0xd1, 0x98, 0x70, 0x46, + 0x60, 0x06, 0xb0, 0x41, 0x43, 0x01, 0xe2, 0x70, + 0xc3, 0x22, 0xc7, 0xcc, 0xc7, 0x60, 0xc7, 0xa1, + 0x02, 0x50, 0xea, 0x70, 0xc7, 0x61, 0xc7, 0xa0, + 0xdb, 0x80, 0xd1, 0x00, 0x00, 0xef, 0xd1, 0xa8, + 0x70, 0x46, 0x10, 0x60, 0xfa, 0x7a, 0x00, 0xe0, + 0xd1, 0x88, 0x70, 0x46, 0x00, 0x22, 0xd1, 0xb0, + 0x70, 0x86, 0x30, 0x81, 0xea, 0x82, 0x60, 0x46, + 0xd0, 0x20, 0xf3, 0x06, 0x10, 0x63, 0xea, 0x87, + 0x10, 0x64, 0xea, 0x87, 0xe2, 0x95, 0x00, 0xef, + 0xd1, 0x6c, 0x71, 0x45, 0xc0, 0x05, 0x30, 0x01, + 0xf6, 0x95, 0xdb, 0x82, 0xd1, 0x01, 0x10, 0x63, + 0xea, 0x95, 0xd1, 0x02, 0x11, 0x62, 0xea, 0x95, + 0xd1, 0x03, 0xd1, 0x8c, 0x61, 0x06, 0xdb, 0x40, + 0x00, 0xe0, 0xd0, 0x00, 0x71, 0x00, 0xc0, 0x84, + 0x10, 0x9c, 0xb0, 0x96, 0xfa, 0xa0, 0xb1, 0x38, + 0xb0, 0x96, 0xfa, 0xa3, 0xb1, 0x30, 0x00, 0x29, + 0xd1, 0x84, 0x00, 0x22, 0xd0, 0x74, 0x70, 0x86, + 0x70, 0xc1, 0x61, 0x06, 0x30, 0xc2, 0xea, 0xae, + 0x60, 0x81, 0xdb, 0x41, 0xb0, 0x3c, 0xb1, 0xbc, + 0xb0, 0x7c, 0x71, 0x00, 0x70, 0x86, 0x70, 0xc1, + 0x61, 0x06, 0x30, 0xc2, 0xea, 0xb9, 0x60, 0x81, + 0xdb, 0x41, 0x00, 0xee, 0xd1, 0xb4, 0x70, 0x06, + 0xb1, 0xbc, 0x70, 0x46, 0x30, 0x40, 0xea, 0xc2, + 0x60, 0x06, 0xdb, 0x41, 0x00, 0x23, 0xd0, 0x70, + 0x30, 0x81, 0xea, 0xc7, 0x30, 0x81, 0x50, 0x02, + 0xea, 0xca, 0xd0, 0x01, 0x00, 0x22, 0xd1, 0xbc, + 0x70, 0x86, 0x30, 0x80, 0xea, 0xd2, 0x60, 0x06, + 0xd0, 0x10, 0xf3, 0x06, 0x00, 0x22, 0xd1, 0xa4, + 0x71, 0x06, 0xd0, 0x01, 0x41, 0x00, 0x5b, 0x44, + 0x5b, 0x6e, 0x6b, 0x46, 0x00, 0x28, 0xd0, 0x70, + 0x70, 0x41, 0x10, 0x62, 0xfa, 0xe6, 0xd1, 0x84, + 0x70, 0x06, 0x10, 0x20, 0xfa, 0xdf, 0x00, 0x22, + 0xd0, 0x00, 0xf3, 0x06, 0x02, 0x7d, 0xdc, 0x62, + 0xe0, 0x46, 0x00, 0xed, 0xd1, 0x88, 0x71, 0x06, + 0x01, 0x1f, 0xfa, 0xfd, 0xd0, 0x41, 0x41, 0x01, + 0xd0, 0x62, 0x00, 0x65, 0xd0, 0x30, 0x70, 0x00, + 0x10, 0x21, 0xea, 0xfa, 0xee, 0xf9, 0x1a, 0xe1, + 0xfa, 0xfa, 0xd0, 0x52, 0x51, 0x01, 0x61, 0x06, + 0xe3, 0x0c, 0x18, 0xe0, 0xea, 0x70, 0xc7, 0x60, + 0xc7, 0xe1, 0x02, 0x50, 0xea, 0x70, 0xc7, 0x61, + 0xc7, 0xe0, 0xe2, 0x70, 0x00, 0x28, 0xdc, 0xa4, + 0x7c, 0x72, 0x5c, 0x40, 0x6c, 0x72, 0x0f, 0xc5, + 0x18, 0xe0, 0xeb, 0x82, 0xd9, 0x0d, 0x00, 0xee, + 0xd1, 0xa4, 0x70, 0x06, 0x10, 0x21, 0xfb, 0x7f, + 0xd9, 0x0c, 0x90, 0x06, 0x00, 0x10, 0xeb, 0x7f, + 0x00, 0x21, 0xd1, 0x88, 0x7a, 0x06, 0x1a, 0x20, + 0xeb, 0x7f, 0xd9, 0x00, 0x00, 0xed, 0xd1, 0xbc, + 0x79, 0x46, 0x19, 0x60, 0xeb, 0x7f, 0x39, 0x68, + 0xc0, 0xe5, 0xc0, 0x25, 0x10, 0x13, 0xb0, 0x0f, + 0xef, 0x7f, 0xb0, 0x22, 0xe7, 0x7f, 0x00, 0xe0, + 0xd1, 0xa8, 0x71, 0x46, 0x11, 0x5f, 0x29, 0x45, + 0x00, 0x22, 0xd0, 0x18, 0x00, 0x22, 0xd4, 0x54, + 0x00, 0x22, 0xd0, 0x9c, 0x70, 0x00, 0x74, 0x51, + 0x70, 0x42, 0x34, 0x40, 0xe7, 0x3c, 0xd0, 0x40, + 0x00, 0x22, 0xd4, 0x50, 0x74, 0x51, 0x34, 0x40, + 0xef, 0x42, 0x20, 0x45, 0x60, 0x42, 0x39, 0x41, + 0x19, 0x60, 0xf7, 0x5e, 0x00, 0x65, 0xd1, 0xa8, + 0x7a, 0x86, 0x29, 0x6a, 0x19, 0x59, 0xb9, 0x7e, + 0xf7, 0x75, 0x15, 0xa3, 0xf7, 0x57, 0x00, 0xed, + 0xd1, 0xac, 0x70, 0x06, 0x00, 0xed, 0xd1, 0xb0, + 0x70, 0x46, 0x30, 0x01, 0xfb, 0x7f, 0x00, 0x65, + 0xd1, 0x84, 0x70, 0x46, 0xb0, 0x7f, 0x60, 0x46, + 0xd5, 0x84, 0xe3, 0x7f, 0x11, 0x41, 0xd0, 0x4a, + 0x00, 0xed, 0xd1, 0xa0, 0x74, 0x46, 0xd0, 0x00, + 0x60, 0x06, 0x30, 0xc5, 0x39, 0x45, 0xe7, 0x6e, + 0x14, 0x60, 0xeb, 0x6b, 0xf3, 0x85, 0xb0, 0x41, + 0xef, 0x65, 0xe3, 0x71, 0x00, 0x66, 0xd1, 0xa0, + 0x60, 0xc6, 0x15, 0xa3, 0xeb, 0x7f, 0xf3, 0x85, + 0xe3, 0x7f, 0xd9, 0x01, 0x00, 0x66, 0xd1, 0xa0, + 0x70, 0x06, 0x30, 0x03, 0xe7, 0x7e, 0x10, 0x1d, + 0x10, 0x3b, 0xe7, 0x7f, 0x60, 0xc6, 0x00, 0x66, + 0xd1, 0xa4, 0x69, 0x06, 0x15, 0xa4, 0xea, 0x23, + 0xe2, 0x3b, 0x00, 0x65, 0xdd, 0x08, 0x7c, 0xf4, + 0xbc, 0xff, 0x6c, 0xf4, 0x00, 0xef, 0xdd, 0x10, + 0x7c, 0xf4, 0xbc, 0xfe, 0x6c, 0xf4, 0xc0, 0x3f, + 0xf1, 0x18, 0xf1, 0x16, 0xf1, 0x18, 0x00, 0x05, + 0x08, 0x20, 0xd0, 0x40, 0x5f, 0x01, 0x15, 0x63, + 0xe9, 0x77, 0x05, 0x5e, 0xea, 0xf2, 0x00, 0x22, + 0xd1, 0xa0, 0x6b, 0x06, 0x00, 0x22, 0xd1, 0xa8, + 0x6b, 0xc6, 0x00, 0x22, 0xd1, 0xac, 0x6a, 0xc6, + 0x00, 0xee, 0xd0, 0x0c, 0x00, 0xe6, 0xd1, 0x9c, + 0x70, 0x40, 0x30, 0x5f, 0xe9, 0x8d, 0xb0, 0x3c, + 0xb1, 0xb4, 0x70, 0x40, 0x30, 0x5f, 0xe9, 0x8d, + 0xb1, 0xb4, 0x00, 0xe6, 0xd0, 0x10, 0xd0, 0x83, + 0x70, 0x40, 0x60, 0x46, 0xb0, 0x3c, 0xb1, 0xbc, + 0xb0, 0x81, 0xed, 0x90, 0x00, 0xee, 0xd0, 0x0c, + 0x00, 0xe6, 0xd1, 0x9c, 0x70, 0x40, 0x30, 0x4c, + 0xe9, 0xa3, 0xb0, 0x3c, 0xb1, 0xb4, 0x70, 0x40, + 0x30, 0x4c, 0xe9, 0xa3, 0xb1, 0xb4, 0x00, 0xe6, + 0xd0, 0x00, 0x61, 0x80, 0x00, 0x21, 0xd1, 0xb4, + 0x70, 0x06, 0x10, 0x20, 0xe9, 0xae, 0xd0, 0x00, + 0x60, 0x06, 0xf1, 0x18, 0x00, 0x21, 0xd1, 0x8c, + 0x70, 0x46, 0x65, 0x86, 0xde, 0xc0, 0x00, 0xee, + 0xd0, 0x20, 0x70, 0x00, 0x10, 0x22, 0xfd, 0xb9, + 0xde, 0xc2, 0x00, 0x21, 0xd0, 0x04, 0x70, 0x00, + 0x10, 0x21, 0xe9, 0xc0, 0x15, 0xa3, 0xe9, 0xdc, + 0xd0, 0x02, 0x4c, 0x00, 0x10, 0x63, 0xe9, 0xc5, + 0xcc, 0x3b, 0xd0, 0x04, 0x63, 0x00, 0xd0, 0x00, + 0x70, 0x00, 0x30, 0x1f, 0xfa, 0xf2, 0xd0, 0x18, + 0x70, 0x00, 0x10, 0x20, 0xed, 0xc7, 0xd0, 0x04, + 0x70, 0x80, 0x10, 0xa0, 0xea, 0xf2, 0xf1, 0x16, + 0x00, 0x21, 0xd0, 0x9a, 0xc0, 0x39, 0x30, 0x1f, + 0x10, 0x18, 0x30, 0x02, 0xfd, 0xcf, 0xe2, 0xf2, + 0x00, 0xe0, 0xd9, 0x04, 0x79, 0x24, 0xb9, 0x38, + 0x19, 0x1c, 0xd0, 0x1e, 0x30, 0x24, 0xf5, 0xe5, + 0x29, 0x00, 0xdc, 0x88, 0x4c, 0xac, 0xd0, 0x02, + 0x40, 0x2c, 0x10, 0x02, 0x0c, 0x80, 0x10, 0x63, + 0xea, 0x5a, 0x15, 0x63, 0xf9, 0xf0, 0xf1, 0x18, + 0xdc, 0x1e, 0x1e, 0xe0, 0xe9, 0xf6, 0x15, 0x63, + 0xf9, 0xf6, 0xbe, 0xfc, 0xd0, 0x2c, 0x6c, 0x00, + 0xcc, 0x24, 0xd9, 0x40, 0x06, 0x50, 0xea, 0x0c, + 0xc0, 0x24, 0xb0, 0x0f, 0xfe, 0x0c, 0xd9, 0x74, + 0x79, 0x65, 0x19, 0x5f, 0x30, 0x25, 0xee, 0x05, + 0x29, 0x40, 0x19, 0x5f, 0x19, 0x41, 0xc0, 0x25, + 0x20, 0x30, 0x30, 0x24, 0xe6, 0x0c, 0x3c, 0x00, + 0xd0, 0x38, 0x69, 0x40, 0x1c, 0x05, 0xbc, 0x38, + 0x3c, 0x32, 0x5c, 0x3b, 0xbc, 0x3f, 0xd8, 0xec, + 0x78, 0xe3, 0xc0, 0xa3, 0x10, 0xaf, 0xf6, 0x19, + 0xd0, 0x8f, 0x02, 0xe4, 0xd8, 0x00, 0xd0, 0xc0, + 0x20, 0xe0, 0xb0, 0x81, 0xee, 0x1c, 0xd0, 0x30, + 0x60, 0xc0, 0x00, 0xab, 0xd0, 0x30, 0xc0, 0xc0, + 0xd8, 0x40, 0xc1, 0x23, 0xd4, 0x5e, 0x34, 0x63, + 0xdc, 0x40, 0x0c, 0x1f, 0xfa, 0x45, 0xc0, 0x65, + 0xb0, 0x41, 0xe6, 0x31, 0x68, 0x40, 0xb0, 0x3c, + 0xe2, 0x2c, 0xc0, 0xc0, 0x34, 0x65, 0xdc, 0x48, + 0x4c, 0x70, 0x1c, 0x5f, 0x20, 0xf1, 0x15, 0x63, + 0xfa, 0x46, 0xf2, 0x3e, 0xc1, 0x11, 0xc0, 0x83, + 0xf2, 0x8f, 0xe2, 0x59, 0xb1, 0x01, 0xe6, 0x44, + 0x68, 0x40, 0x28, 0x60, 0xb0, 0x3c, 0xe2, 0x3e, + 0x0f, 0xc5, 0xd9, 0x40, 0xb1, 0x0f, 0x11, 0x01, + 0x21, 0x25, 0xf2, 0x3e, 0xc1, 0x11, 0xb1, 0x01, + 0xe6, 0x59, 0x20, 0x31, 0x68, 0x40, 0x30, 0x31, + 0xb0, 0x3c, 0x28, 0x60, 0x70, 0x43, 0x30, 0x31, + 0x60, 0x40, 0x20, 0x31, 0xb0, 0x3c, 0xb0, 0xf8, + 0xe2, 0x4b, 0xe2, 0xe1, 0xd8, 0xec, 0x78, 0xe3, + 0x00, 0xa8, 0xd0, 0x80, 0x00, 0xa8, 0xd1, 0x44, + 0x00, 0xab, 0xd0, 0x30, 0xc0, 0xc0, 0x0c, 0x1f, + 0xfa, 0x9d, 0xd9, 0x78, 0x79, 0x65, 0x39, 0x25, + 0x19, 0x5f, 0xc9, 0xa5, 0x19, 0x83, 0x20, 0x26, + 0x20, 0xe6, 0x20, 0xa6, 0x21, 0x66, 0xc1, 0x23, + 0xc0, 0x64, 0x10, 0x5f, 0x10, 0x9d, 0x20, 0x81, + 0x31, 0x01, 0x30, 0x44, 0xf6, 0x78, 0x21, 0x01, + 0x30, 0x84, 0x10, 0x83, 0xc4, 0x64, 0x34, 0x63, + 0xdc, 0x48, 0x4c, 0x70, 0x1c, 0x5f, 0x15, 0x63, + 0xfa, 0xad, 0x20, 0xb1, 0xf2, 0x8f, 0xc1, 0x24, + 0x11, 0x1f, 0xc0, 0x85, 0x30, 0xb1, 0xf2, 0x8f, + 0xc1, 0x11, 0xc0, 0x83, 0x0c, 0x9d, 0xfa, 0x8d, + 0xb0, 0xbc, 0xf2, 0x8f, 0xe2, 0xd6, 0xb1, 0x01, + 0xe6, 0x44, 0x70, 0x42, 0xb0, 0xb8, 0x60, 0x40, + 0xb0, 0x3c, 0xe2, 0x8f, 0xb1, 0x01, 0xe6, 0x44, + 0x70, 0x42, 0xb0, 0xb8, 0x60, 0x40, 0xb0, 0x38, + 0xe2, 0x96, 0x00, 0xab, 0xd0, 0x34, 0xc1, 0x23, + 0xb1, 0x0f, 0xf2, 0x96, 0xd1, 0x1e, 0x31, 0x23, + 0x00, 0xa8, 0xd0, 0x84, 0xf2, 0x96, 0xd1, 0x0f, + 0x00, 0xa8, 0xd0, 0x84, 0xc0, 0x03, 0xf2, 0x96, + 0xe2, 0xd6, 0xd8, 0x82, 0x48, 0x95, 0x18, 0x81, + 0xb1, 0x01, 0xe6, 0xc3, 0x20, 0xb1, 0x70, 0x42, + 0x30, 0xb1, 0x20, 0x22, 0x60, 0x40, 0x30, 0x22, + 0xb0, 0xbc, 0xb0, 0x3c, 0x30, 0xb1, 0x70, 0x42, + 0x20, 0xb1, 0x30, 0x22, 0x60, 0x40, 0x20, 0x22, + 0xb0, 0xbc, 0xb0, 0x3c, 0xe2, 0xb0, 0xc1, 0x11, + 0xc0, 0x85, 0x30, 0xb1, 0x20, 0xe2, 0xb1, 0x01, + 0xe6, 0xd6, 0x70, 0x42, 0xb0, 0xb8, 0x20, 0x22, + 0x60, 0x40, 0x30, 0x22, 0xb0, 0x3c, 0x70, 0x43, + 0xb0, 0xf8, 0x30, 0x22, 0x60, 0x40, 0x20, 0x22, + 0xb0, 0x3c, 0xe2, 0xc7, 0xd0, 0x08, 0x5c, 0x00, + 0x3c, 0x32, 0xd0, 0x04, 0x40, 0x30, 0x3c, 0x00, + 0x15, 0x63, 0xfa, 0xe1, 0x1e, 0xe0, 0xea, 0xe1, + 0xbc, 0x3c, 0x00, 0xab, 0xd0, 0xb0, 0x00, 0xa8, + 0xd0, 0x00, 0x00, 0x20, 0xd1, 0x1e, 0x70, 0x42, + 0xb0, 0xbc, 0x60, 0x40, 0xb0, 0x3c, 0xb1, 0x01, + 0xee, 0xe7, 0xd0, 0x30, 0x30, 0x30, 0xee, 0xed, + 0xd0, 0x04, 0x63, 0x00, 0x08, 0x20, 0xd0, 0x40, + 0x3f, 0x01, 0x02, 0xba, 0xd0, 0x3c, 0xe0, 0x46, + 0x01, 0x46, 0xd0, 0x08, 0x94, 0x89, 0xd0, 0x8c, + 0x44, 0x82, 0x14, 0x9e, 0x30, 0x12, 0xd0, 0x88, + 0x10, 0x80, 0x00, 0xe8, 0xd1, 0x80, 0x70, 0xc6, + 0x00, 0x06, 0xa0, 0xbd, 0xa0, 0xfc, 0x80, 0x3f, + 0xb1, 0xbe, 0x60, 0xc6, 0x00, 0x06, 0x80, 0xa9, + 0x80, 0x3f, 0x80, 0x2a, 0x80, 0x3f, 0x00, 0x21, + 0xd0, 0x3c, 0x00, 0x0a, 0xb1, 0x82, 0xd0, 0x6b, + 0x70, 0x46, 0x00, 0x06, 0x80, 0x07, 0x01, 0x20, + 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, + 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, + 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x29, + 0x80, 0x2b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08, + 0xa0, 0x27, 0x90, 0x09, 0xd0, 0x41, 0x40, 0x01, + 0xd0, 0x44, 0x40, 0x70, 0x20, 0x01, 0xa0, 0x27, + 0x80, 0x3f, 0x00, 0xc6, 0x15, 0x63, 0xe9, 0xae, + 0x05, 0x5e, 0xe9, 0xbe, 0x00, 0xe0, 0xd0, 0x40, + 0x70, 0x81, 0x10, 0x9c, 0xb0, 0x96, 0xf9, 0xb7, + 0x00, 0x21, 0xd0, 0x40, 0xe1, 0xbb, 0xb0, 0x96, + 0xf9, 0xbe, 0x00, 0x22, 0xd0, 0x40, 0x27, 0xc1, + 0x27, 0x41, 0x27, 0x81, 0x90, 0x83, 0x00, 0x64, + 0xd0, 0x10, 0x60, 0x80, 0x01, 0x46, 0x82, 0x34, + 0x80, 0x3f, 0x00, 0x64, 0xd0, 0x14, 0x67, 0x40, + 0x80, 0x34, 0x80, 0x3f, 0x00, 0xc6, 0x90, 0xae, + 0x00, 0x64, 0xd0, 0x18, 0x60, 0x80, 0x90, 0xa6, + 0x00, 0x64, 0xd0, 0x1c, 0x60, 0x80, 0x15, 0x63, + 0xe9, 0xe3, 0x0c, 0x1f, 0xe9, 0xe3, 0x05, 0x50, + 0xf9, 0xe3, 0x15, 0xa3, 0xf9, 0xe3, 0x90, 0x4d, + 0x10, 0x60, 0xe5, 0xdb, 0x00, 0x06, 0x05, 0x0d, + 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x15, 0xa3, + 0xf9, 0xfb, 0x00, 0x21, 0xd0, 0x04, 0x70, 0x00, + 0x10, 0x21, 0xe9, 0xfb, 0xd0, 0x38, 0x70, 0x00, + 0x15, 0x63, 0xe9, 0xef, 0x10, 0x1f, 0x15, 0x21, + 0xe5, 0xe0, 0xd0, 0x5e, 0x30, 0x54, 0xe5, 0xe0, + 0xc0, 0x40, 0xb0, 0x7f, 0x30, 0x54, 0xe9, 0xfb, + 0x0c, 0x09, 0x05, 0x0d, 0xe1, 0xef, 0xc0, 0x5f, + 0x10, 0x58, 0x10, 0x48, 0x00, 0xee, 0xd0, 0x8c, + 0xd0, 0xc3, 0x70, 0x02, 0x30, 0x01, 0xea, 0x10, + 0xb0, 0xbc, 0xb0, 0xc1, 0xee, 0x01, 0x00, 0x26, + 0xd0, 0x20, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, + 0x15, 0xa3, 0xea, 0x0f, 0xb0, 0x88, 0x77, 0xc2, + 0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40, + 0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c, + 0xd3, 0x80, 0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, + 0x00, 0x4d, 0x00, 0x50, 0xfa, 0x1a, 0x0c, 0x49, + 0x00, 0x8d, 0xc0, 0x42, 0x10, 0x60, 0xea, 0x2a, + 0xb0, 0x5e, 0xb0, 0x43, 0xfe, 0x34, 0xd0, 0x61, + 0x23, 0x81, 0xe2, 0x1f, 0x0c, 0x09, 0x05, 0x0d, + 0x15, 0x20, 0xfe, 0x31, 0xd0, 0x5f, 0x30, 0x54, + 0xee, 0x10, 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, + 0xc6, 0xd4, 0xb6, 0xc1, 0xe6, 0x31, 0xd0, 0x5e, + 0x30, 0x5b, 0xfe, 0x31, 0xd7, 0x00, 0xb7, 0x01, + 0xd3, 0x81, 0x00, 0x27, 0xd0, 0x10, 0xd0, 0x81, + 0x60, 0x80, 0x15, 0x63, 0xfa, 0x54, 0x00, 0x22, + 0xdc, 0xd8, 0x03, 0xf7, 0xd2, 0x10, 0xf0, 0x4a, + 0x15, 0xa3, 0xfa, 0x51, 0x02, 0xf6, 0xde, 0x26, + 0x0c, 0x10, 0xf8, 0x46, 0x02, 0xfb, 0xda, 0x22, + 0xe0, 0x46, 0x02, 0xf1, 0xd8, 0x2b, 0xe0, 0x46, + 0x00, 0x22, 0xdc, 0xd8, 0x03, 0xf9, 0xd2, 0x10, + 0xf0, 0x4a, 0x03, 0x34, 0xdc, 0x20, 0x15, 0xa3, + 0xe8, 0x46, 0x02, 0xff, 0xde, 0x27, 0xe0, 0x46, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xe0, 0xe1, 0xec, 0xe2, 0x12, + 0xe2, 0x14, 0xe1, 0xc7, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, + 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x5e, 0x30, 0x5b, 0xfc, 0x11, + 0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20, + 0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19, + 0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xde, + 0xf9, 0xba, 0x03, 0xdf, 0xe9, 0x99, 0xd3, 0x40, + 0xca, 0x50, 0xd1, 0x42, 0xe2, 0xea, 0xc0, 0x50, + 0x10, 0x54, 0xc0, 0x90, 0x10, 0x8c, 0x10, 0x92, + 0x10, 0xe0, 0xe5, 0xa8, 0xc0, 0x01, 0x10, 0x01, + 0x20, 0x40, 0xc0, 0x02, 0x10, 0x01, 0x20, 0x80, + 0x10, 0x60, 0xfd, 0xab, 0xb0, 0x7f, 0x10, 0xa0, + 0xfd, 0xae, 0xb0, 0xbf, 0x10, 0x5f, 0x10, 0x9f, + 0x00, 0xef, 0xd0, 0x3e, 0x20, 0x52, 0x20, 0x83, + 0x20, 0x93, 0x10, 0x4c, 0x10, 0x82, 0x40, 0x80, + 0x50, 0x42, 0x0f, 0xc5, 0xcb, 0xaa, 0xcb, 0xeb, + 0xca, 0x50, 0xd0, 0xc0, 0xb0, 0xc1, 0xf1, 0x9b, + 0xcb, 0x01, 0xd0, 0xc1, 0xf1, 0x9b, 0xcb, 0x41, + 0xba, 0x7f, 0xbb, 0x3f, 0xe2, 0xea, 0xcc, 0x5b, + 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, + 0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, + 0x06, 0xd0, 0xe9, 0xd5, 0x01, 0x69, 0xd0, 0x20, + 0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, + 0x2c, 0x40, 0x2c, 0x80, 0x01, 0x74, 0xd6, 0x00, + 0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, + 0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xe5, + 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xec, 0x80, 0x07, + 0xd4, 0x00, 0xc4, 0x50, 0xd3, 0x08, 0xe2, 0x95, + 0xd0, 0x71, 0x20, 0x56, 0x00, 0x48, 0xd1, 0x8c, + 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xfa, 0x06, 0x5e, + 0xfa, 0x03, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, + 0xf9, 0xfa, 0xd3, 0xc4, 0x06, 0x5e, 0xfa, 0x03, + 0xd0, 0x43, 0x40, 0x4c, 0xea, 0x03, 0x08, 0x49, + 0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46, + 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xea, 0x0a, + 0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02, + 0xb0, 0x20, 0x03, 0x19, 0xea, 0x10, 0xb0, 0x20, + 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80, + 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, + 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xd3, 0xe1, 0xdc, 0xe2, 0x00, + 0xe2, 0x02, 0xe1, 0xac, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x91, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, + 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x5e, 0x30, 0x5b, 0xfc, 0x11, + 0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x8e, + 0xbc, 0x10, 0xd0, 0x30, 0xc0, 0x40, 0x30, 0x70, + 0xed, 0x8e, 0x03, 0x10, 0xe9, 0x97, 0x0f, 0x19, + 0xf9, 0x93, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xdf, + 0xe9, 0xa1, 0xd3, 0x40, 0xca, 0x50, 0xcb, 0x52, + 0x03, 0x1d, 0xf9, 0xa8, 0xca, 0x12, 0xca, 0x52, + 0xe1, 0xa5, 0x03, 0x1d, 0xf9, 0xa8, 0xca, 0x12, + 0xca, 0x53, 0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e, + 0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea, + 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, + 0x17, 0x20, 0xf9, 0xd2, 0x00, 0xa8, 0xd0, 0x00, + 0xcc, 0x5b, 0x1c, 0x5f, 0x1c, 0x43, 0x20, 0x31, + 0x7c, 0x40, 0xb0, 0x3c, 0x7e, 0x80, 0xcc, 0xb1, + 0xce, 0xfa, 0x1c, 0x9f, 0x1e, 0xdf, 0x01, 0x69, + 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xc4, 0x3c, 0x80, + 0x0e, 0xd9, 0xe9, 0xc7, 0x3e, 0xc0, 0x3e, 0xf2, + 0x3e, 0xb1, 0xd0, 0x01, 0x40, 0x1b, 0x10, 0x05, + 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30, + 0x70, 0x00, 0x2c, 0x80, 0xe3, 0x1e, 0xd3, 0xc2, + 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xd8, 0xf2, 0x32, + 0xb3, 0x81, 0xe9, 0xdc, 0x80, 0x07, 0xe2, 0x95, + 0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, + 0xe9, 0xe8, 0x06, 0x5e, 0xf9, 0xf1, 0x08, 0x89, + 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xe8, 0xd3, 0xc4, + 0x06, 0x5e, 0xf9, 0xf1, 0xd0, 0x43, 0x40, 0x4c, + 0xe9, 0xf1, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87, + 0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, + 0x03, 0x1c, 0xe9, 0xf8, 0x09, 0x49, 0x00, 0x0d, + 0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19, + 0xe9, 0xfe, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b, + 0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50, + 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xc1, 0xe1, 0xca, 0xe1, 0xee, + 0xe1, 0xf0, 0xe1, 0xa8, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, + 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x5e, 0x30, 0x5b, 0xfc, 0x11, + 0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20, + 0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19, + 0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xdf, + 0xe9, 0x9d, 0xd3, 0x40, 0xca, 0x50, 0xcb, 0x52, + 0x03, 0x1d, 0xf9, 0xa4, 0xca, 0x12, 0xca, 0x52, + 0xe1, 0xa1, 0x03, 0x1d, 0xf9, 0xa4, 0xca, 0x12, + 0xca, 0x53, 0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e, + 0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea, + 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, + 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1, + 0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0xb6, 0x01, 0x69, + 0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08, + 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30, + 0x70, 0x00, 0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4, + 0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0, + 0xed, 0xc6, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xca, + 0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c, + 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xd6, 0x06, 0x5e, + 0xf9, 0xdf, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, + 0xf9, 0xd6, 0xd3, 0xc4, 0x06, 0x5e, 0xf9, 0xdf, + 0xd0, 0x43, 0x40, 0x4c, 0xe9, 0xdf, 0x08, 0x49, + 0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46, + 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xe6, + 0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02, + 0xb0, 0x20, 0x03, 0x19, 0xe9, 0xec, 0xb0, 0x20, + 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80, + 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, + 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xdb, 0xe1, 0xe9, 0xe2, 0x00, + 0xe2, 0x02, 0xe1, 0xc3, 0xe1, 0x65, 0x30, 0x5a, + 0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, + 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x4f, 0x30, 0x5b, 0xfc, 0x11, + 0xc0, 0x39, 0x30, 0x31, 0x10, 0x11, 0x10, 0x20, + 0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19, + 0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xd0, + 0xf9, 0x98, 0xca, 0x50, 0x03, 0xde, 0xf9, 0x9a, + 0xd1, 0x42, 0xe2, 0xea, 0xcb, 0xaa, 0xcb, 0xeb, + 0xc0, 0x50, 0x10, 0x54, 0xc0, 0x90, 0x10, 0x8c, + 0x10, 0x92, 0xd0, 0xc1, 0x05, 0x50, 0xe9, 0xa5, + 0xb0, 0xc2, 0x10, 0x60, 0xfd, 0xa8, 0xb0, 0x7f, + 0x10, 0xa0, 0xfd, 0xab, 0xb0, 0xbf, 0x10, 0x5f, + 0x10, 0x9f, 0x00, 0xef, 0xd0, 0x3e, 0x20, 0x52, + 0x20, 0x83, 0x20, 0x93, 0x10, 0x4c, 0x10, 0x82, + 0x40, 0x80, 0x50, 0x42, 0xd0, 0x81, 0x14, 0x1f, + 0x14, 0x01, 0x05, 0x50, 0xe9, 0xbd, 0x50, 0x42, + 0xe1, 0xbe, 0x54, 0x02, 0xca, 0x10, 0xca, 0x50, + 0xcb, 0x01, 0xcb, 0x41, 0xe2, 0xea, 0xcc, 0x5b, + 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, + 0x2c, 0x40, 0x1c, 0x49, 0xcc, 0xb1, 0x1c, 0x9f, + 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x05, 0x50, + 0xf9, 0xd2, 0xb0, 0x3c, 0x2c, 0x40, 0x2c, 0x80, + 0x01, 0x74, 0xd6, 0x00, 0x2c, 0x80, 0x02, 0xe4, + 0xde, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 0xd3, 0xc0, + 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xe0, 0xf2, 0x32, + 0xb3, 0x81, 0xe9, 0xe9, 0x80, 0x07, 0xd4, 0x02, + 0x44, 0x15, 0x14, 0x1f, 0xc4, 0x50, 0xd3, 0x08, + 0xe2, 0x95, 0xd0, 0x71, 0x20, 0x56, 0x00, 0x48, + 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xf7, + 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xf6, + 0xd3, 0xc4, 0xe1, 0xf7, 0xb3, 0xc1, 0x01, 0x46, + 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xfe, + 0x09, 0x49, 0x00, 0x0d, 0xa0, 0x2c, 0xe2, 0x5b, + 0x06, 0x5f, 0xfa, 0x7f, 0xd4, 0x02, 0x44, 0x15, + 0x14, 0x1f, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, + 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xc9, 0xe1, 0xd2, 0xe1, 0xe7, + 0xe1, 0xe9, 0xe1, 0xab, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x91, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54, + 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a, + 0xb6, 0xff, 0xd0, 0x4f, 0x30, 0x5b, 0xfc, 0x11, + 0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x8e, + 0xbc, 0x10, 0xd0, 0x20, 0xc0, 0x40, 0x30, 0x70, + 0xed, 0x8e, 0x03, 0x10, 0xe9, 0x97, 0x0f, 0x19, + 0xf9, 0x93, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xd0, + 0xf9, 0xa0, 0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, + 0xf9, 0xa7, 0xca, 0x12, 0xca, 0x52, 0xe1, 0xa4, + 0x03, 0x1d, 0xf9, 0xa7, 0xca, 0x12, 0xca, 0x53, + 0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, + 0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea, 0x00, 0x24, + 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, + 0xf9, 0xc8, 0x00, 0x2a, 0xd0, 0x00, 0x20, 0x1b, + 0x20, 0x1b, 0x05, 0x50, 0xf9, 0xb8, 0xb0, 0x3f, + 0x10, 0x02, 0x7c, 0x40, 0xcc, 0xb1, 0x1c, 0x9f, + 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xc1, + 0x3c, 0x80, 0xde, 0xa0, 0x2c, 0x5f, 0x2c, 0x9f, + 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, 0xde, 0xc1, + 0xe3, 0x1e, 0xd3, 0xc0, 0xf2, 0xd3, 0x13, 0xa0, + 0xed, 0xce, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xd2, + 0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c, + 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xde, 0x08, 0x89, + 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xdd, 0xd3, 0xc4, + 0xe1, 0xde, 0xb3, 0xc1, 0x01, 0x46, 0x90, 0x2c, + 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xe5, 0x09, 0x49, + 0x00, 0x0d, 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, + 0xfa, 0x7f, 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, + 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xa3, 0xc0, 0x00, 0xc0, 0x00, + 0xc0, 0x00, 0xe1, 0x8a, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x87, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x5e, + 0x30, 0x5b, 0xfd, 0xb4, 0xc0, 0x39, 0x30, 0x31, + 0x10, 0x12, 0x10, 0x20, 0xe9, 0x82, 0xd1, 0x42, + 0xd3, 0x40, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, + 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, + 0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0, + 0xe9, 0x98, 0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80, + 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40, + 0x2c, 0x80, 0x01, 0x74, 0xd6, 0x00, 0x2c, 0x80, + 0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, 0xf2, 0xd3, + 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xc8, + 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, + 0xe9, 0xbf, 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, + 0x10, 0x5c, 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xc8, + 0x0f, 0x17, 0xf9, 0xb4, 0x0f, 0x49, 0xf2, 0xd3, + 0x0f, 0x19, 0xf9, 0xb8, 0xdf, 0x00, 0x00, 0x06, + 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, 0xc0, 0x5b, + 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xc8, 0x0f, 0x17, + 0xf9, 0xc3, 0x02, 0xf1, 0xd8, 0x2b, 0xe0, 0x46, + 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xb5, 0xc0, 0x00, 0xc0, 0x00, + 0xc0, 0x00, 0xe1, 0x8e, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x8b, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x5e, + 0x30, 0x5b, 0xfd, 0xc6, 0xbc, 0x10, 0xd0, 0x10, + 0x0c, 0x1e, 0xf9, 0x88, 0xbc, 0x10, 0xd0, 0x30, + 0xc0, 0x40, 0x30, 0x70, 0xed, 0x88, 0xd1, 0x42, + 0xd3, 0x40, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, + 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xb4, + 0x00, 0xa8, 0xd0, 0x00, 0xcc, 0x5b, 0x1c, 0x5f, + 0x1c, 0x43, 0x20, 0x31, 0x7c, 0x40, 0xb0, 0x3c, + 0x7e, 0x80, 0xcc, 0xb1, 0xce, 0xfa, 0x1c, 0x9f, + 0x1e, 0xdf, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, + 0xe9, 0xa6, 0x3c, 0x80, 0x0e, 0xd9, 0xe9, 0xa9, + 0x3e, 0xc0, 0x3e, 0xf2, 0x3e, 0xb1, 0xd0, 0x01, + 0x40, 0x1b, 0x10, 0x05, 0x20, 0x1f, 0x2c, 0x40, + 0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, + 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, + 0x30, 0x5a, 0xe5, 0xda, 0x00, 0x26, 0xd0, 0x00, + 0x70, 0x00, 0x10, 0x20, 0xe9, 0xd1, 0x00, 0xe0, + 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5c, 0x30, 0x5b, + 0xb0, 0x41, 0xed, 0xda, 0x0f, 0x17, 0xf9, 0xc6, + 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xca, + 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb3, 0xd8, 0x29, + 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, + 0xe5, 0xda, 0x0f, 0x17, 0xf9, 0xd5, 0x02, 0xf6, + 0xde, 0x26, 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, + 0xe2, 0x95, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xa2, 0xc0, 0x00, 0xc0, 0x00, + 0xc0, 0x00, 0xe1, 0x8a, 0xe1, 0x65, 0x30, 0x5a, + 0xe5, 0x87, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x4f, + 0x30, 0x5b, 0xfd, 0xb3, 0xc0, 0x39, 0x30, 0x31, + 0x10, 0x11, 0x10, 0x20, 0xe9, 0x82, 0xd1, 0x42, + 0xd3, 0x41, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, + 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, + 0x1c, 0x49, 0xcc, 0xb1, 0x1c, 0x9f, 0xc0, 0x1c, + 0x10, 0x08, 0x20, 0x1f, 0x05, 0x50, 0xf9, 0x99, + 0xb0, 0x3c, 0x2c, 0x40, 0x2c, 0x80, 0x01, 0x74, + 0xd6, 0x00, 0x2c, 0x80, 0x02, 0xe4, 0xde, 0x80, + 0xde, 0xc1, 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, + 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xc7, 0x00, 0x26, + 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 0xe9, 0xbe, + 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5b, + 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xc7, 0x0f, 0x17, + 0xf9, 0xb3, 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, + 0xf9, 0xb7, 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb3, + 0xd8, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, + 0xb0, 0x7e, 0xe5, 0xc7, 0x0f, 0x17, 0xf9, 0xc2, + 0x02, 0xff, 0xde, 0x27, 0xe0, 0x46, 0xd3, 0x08, + 0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00, 0x50, 0x00, + 0x03, 0x75, 0xd2, 0x73, 0x00, 0x24, 0xdc, 0xd8, + 0xf0, 0x4a, 0xe1, 0xac, 0xc0, 0x00, 0xc0, 0x00, + 0xc0, 0x00, 0xe1, 0x8e, 0xe1, 0x30, 0x30, 0x5a, + 0xe5, 0x8b, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x4f, + 0x30, 0x5b, 0xfd, 0xbd, 0xbc, 0x10, 0xd0, 0x10, + 0x0c, 0x1e, 0xf9, 0x88, 0xbc, 0x10, 0xd0, 0x20, + 0xc0, 0x40, 0x30, 0x70, 0xed, 0x88, 0xd1, 0x42, + 0xd3, 0x41, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, + 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xab, + 0x00, 0x2a, 0xd0, 0x00, 0x20, 0x1b, 0x20, 0x1b, + 0x05, 0x50, 0xf9, 0x9b, 0xb0, 0x3f, 0x10, 0x02, + 0x7c, 0x40, 0xcc, 0xb1, 0x1c, 0x9f, 0x01, 0x69, + 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xa4, 0x3c, 0x80, + 0xde, 0xa0, 0x2c, 0x5f, 0x2c, 0x9f, 0xd0, 0x30, + 0x70, 0x00, 0x2c, 0x80, 0xde, 0xc1, 0xe3, 0x1e, + 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, + 0xe5, 0xd1, 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, + 0x10, 0x20, 0xe9, 0xc8, 0x00, 0xe0, 0xd0, 0x44, + 0x70, 0x41, 0x10, 0x5b, 0x30, 0x5b, 0xb0, 0x41, + 0xed, 0xd1, 0x0f, 0x17, 0xf9, 0xbd, 0x0f, 0x49, + 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xc1, 0xdf, 0x00, + 0x00, 0x06, 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, + 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xd1, + 0x0f, 0x17, 0xf9, 0xcc, 0x03, 0x34, 0xdc, 0x20, + 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, + 0xd0, 0x61, 0x23, 0x81, 0x0c, 0x49, 0xd0, 0x61, + 0x00, 0x8d, 0x10, 0xa0, 0xea, 0x3b, 0x30, 0x42, + 0xe6, 0x30, 0x23, 0x82, 0x0f, 0xc5, 0x0c, 0x09, + 0x05, 0x0d, 0x15, 0x20, 0xfe, 0x45, 0xd0, 0x5f, + 0x15, 0x63, 0xea, 0x43, 0xd0, 0x50, 0x30, 0x54, + 0xee, 0x4a, 0x0f, 0x17, 0xfa, 0x45, 0x03, 0xb3, + 0xd8, 0x29, 0xe0, 0x46, 0x80, 0x07, 0x09, 0x49, + 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, + 0x00, 0x4d, 0xa0, 0x6c, 0xd0, 0xa1, 0x00, 0x88, + 0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, 0xfa, 0x53, + 0xf2, 0x32, 0xd3, 0x80, 0xe1, 0x76, 0xd1, 0xc2, + 0x41, 0xcf, 0x11, 0xdf, 0xd0, 0x41, 0x01, 0xc1, + 0x00, 0xef, 0xd0, 0xbe, 0x03, 0x10, 0xf9, 0x77, + 0x80, 0x07, 0x21, 0x96, 0x11, 0xa2, 0xe9, 0x78, + 0x03, 0x1d, 0xea, 0x73, 0xc0, 0xd7, 0xc2, 0x90, + 0xf2, 0xa4, 0xc4, 0x0a, 0x03, 0xd0, 0xea, 0x72, + 0xc2, 0x91, 0xf2, 0xa4, 0xc4, 0x4a, 0x03, 0x1e, + 0xea, 0x8d, 0xc0, 0xd8, 0xc2, 0x92, 0xf2, 0xa4, + 0xc4, 0x8a, 0x03, 0xd0, 0xea, 0x7d, 0xc2, 0x93, + 0xf2, 0xa4, 0xc4, 0xca, 0xe2, 0x8d, 0xd3, 0xc0, + 0xc0, 0xd7, 0xc2, 0x90, 0xf2, 0xa4, 0xc4, 0x0a, + 0x03, 0xd0, 0xea, 0x88, 0xc2, 0x91, 0xf2, 0xa4, + 0xc4, 0x4a, 0x08, 0x49, 0x00, 0x4d, 0x10, 0x61, + 0xf8, 0x11, 0x03, 0x1f, 0xea, 0x93, 0x0d, 0xc9, + 0x00, 0x4d, 0xd0, 0x1a, 0xe2, 0x98, 0x03, 0x10, + 0xfa, 0x97, 0xd0, 0x1d, 0xe2, 0x98, 0xd0, 0x18, + 0x0f, 0x16, 0xfa, 0x98, 0xd0, 0x4c, 0x40, 0x4c, + 0x10, 0x6c, 0xea, 0xa2, 0x03, 0xde, 0xfa, 0xa2, + 0x0f, 0x12, 0xfa, 0xa0, 0x00, 0x08, 0xe2, 0xd9, + 0xd2, 0x00, 0x13, 0xe1, 0xee, 0xa9, 0x08, 0x49, + 0x02, 0x0d, 0x00, 0xc8, 0xc2, 0xca, 0x12, 0x94, + 0xd0, 0x1f, 0x30, 0x07, 0x12, 0xc0, 0xc2, 0x43, + 0x12, 0x5a, 0x00, 0x0d, 0x03, 0xde, 0xea, 0xb6, + 0x0e, 0xc9, 0x04, 0x8d, 0x02, 0x48, 0x22, 0x80, + 0x12, 0x88, 0xd0, 0x0b, 0x30, 0x03, 0x12, 0x80, + 0xd0, 0x19, 0x20, 0x03, 0x12, 0x80, 0x00, 0x0d, + 0x22, 0xc0, 0x12, 0xc8, 0xd0, 0x0b, 0x30, 0x09, + 0x12, 0xc0, 0x12, 0xd8, 0xd0, 0x16, 0x20, 0x09, + 0x20, 0x07, 0x12, 0xc0, 0x42, 0xc2, 0x22, 0x8b, + 0x22, 0x88, 0x03, 0xde, 0xea, 0xd2, 0x0e, 0xc9, + 0xc4, 0x4a, 0x04, 0xcd, 0x0f, 0xc5, 0x01, 0x46, + 0x90, 0x4d, 0x00, 0xc6, 0x10, 0x60, 0xe6, 0xd3, + 0x0f, 0xc5, 0x01, 0x74, 0xd6, 0x00, 0xca, 0x9d, + 0xcb, 0x9e, 0xca, 0xea, 0xcb, 0xee, 0x2a, 0xc0, + 0x2b, 0xc0, 0xca, 0x10, 0xca, 0x51, 0xcb, 0x12, + 0xcb, 0x53, 0xd1, 0x40, 0xd3, 0x41, 0xb7, 0x3f, + 0xc0, 0x5c, 0xe1, 0x7b, 0xd0, 0xc0, 0xc1, 0x28, + 0xc2, 0x2a, 0xc2, 0xab, 0xf1, 0x7a, 0x0f, 0x17, + 0xfa, 0xef, 0xcc, 0xe8, 0xcd, 0x29, 0xcd, 0x6c, + 0xcd, 0xad, 0xc8, 0x08, 0xc8, 0x49, 0xca, 0x0a, + 0xca, 0x4b, 0xf3, 0x31, 0xd0, 0xc1, 0xc1, 0x34, + 0xc2, 0x2a, 0xc2, 0xab, 0xf1, 0x7a, 0x00, 0x28, + 0xd9, 0xc0, 0xc8, 0x88, 0xc8, 0xc9, 0xa9, 0xf8, + 0xca, 0x8a, 0xca, 0xcb, 0x11, 0x62, 0xe9, 0x79, + 0xd0, 0xc0, 0xc1, 0x35, 0xc2, 0x2e, 0xc2, 0xaf, + 0xf1, 0x7a, 0xc9, 0x08, 0xc9, 0x49, 0xa9, 0xf8, + 0xcb, 0x0a, 0xcb, 0x4b, 0xd0, 0xc1, 0xc1, 0x36, + 0xc2, 0x2e, 0xc2, 0xaf, 0xf1, 0x7a, 0xc0, 0x27, + 0xc9, 0x88, 0xc9, 0xc9, 0xa0, 0x38, 0xcb, 0x8a, + 0xcb, 0xcb, 0xe1, 0x79, 0x5f, 0x0d, 0x07, 0x7d, + 0xde, 0x07, 0x11, 0x5e, 0x30, 0x05, 0xcd, 0xc0, + 0x00, 0x28, 0xd0, 0x00, 0xa0, 0x38, 0x11, 0x61, + 0xf9, 0x75, 0x00, 0xe2, 0xd0, 0x00, 0x0f, 0x1d, + 0xeb, 0x29, 0x00, 0x2d, 0xdf, 0x4b, 0xf3, 0x3f, + 0xe1, 0x75, 0x04, 0xeb, 0xd0, 0x00, 0x11, 0x62, + 0xeb, 0x36, 0xb0, 0x20, 0x0f, 0x19, 0xfb, 0x36, + 0xac, 0xe0, 0x01, 0xa4, 0xde, 0x00, 0x5e, 0x0d, + 0x00, 0x2d, 0xdf, 0x7a, 0xdd, 0xc0, 0xd8, 0x80, + 0xd9, 0x00, 0xd9, 0x80, 0x5f, 0x00, 0x01, 0x46, + 0x00, 0x28, 0xd0, 0x01, 0x00, 0x06, 0xa0, 0x37, + 0x80, 0x3f, 0x00, 0xc6, 0x0f, 0xc5, 0xad, 0xda, + 0xc6, 0xb1, 0xd0, 0x01, 0x01, 0xa3, 0xde, 0x1d, + 0x40, 0x30, 0x3e, 0x00, 0x80, 0x3f, 0x0e, 0x0a, + 0x66, 0xda, 0xc8, 0x28, 0xc8, 0x69, 0xc8, 0xaa, + 0xc8, 0xeb, 0x0c, 0x1e, 0xfb, 0x68, 0x26, 0xba, + 0x07, 0x7d, 0xdc, 0x00, 0x1d, 0xcf, 0x1d, 0xd1, + 0x5d, 0xc0, 0x00, 0x2d, 0xdf, 0x64, 0x0f, 0x87, + 0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, + 0xc9, 0x2c, 0xc9, 0x6d, 0xc9, 0xae, 0xc9, 0xef, + 0x0f, 0x2f, 0xd0, 0x37, 0x4f, 0x00, 0x0f, 0x1a, + 0xeb, 0xbe, 0x01, 0xa4, 0xde, 0x20, 0xd0, 0x01, + 0x40, 0x3c, 0x2e, 0x00, 0x00, 0x2d, 0xdf, 0x7a, + 0xac, 0xe0, 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe0, + 0xbf, 0x79, 0xbe, 0x3c, 0x0f, 0x1b, 0xeb, 0x9e, + 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe1, 0xbf, 0x79, + 0xbe, 0x34, 0x18, 0xa0, 0xeb, 0xb9, 0x0f, 0x87, + 0xad, 0x20, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe2, + 0xbf, 0x79, 0xbe, 0x3c, 0x0f, 0x87, 0x0e, 0x0a, + 0x76, 0xe3, 0x0f, 0x1b, 0xeb, 0xb3, 0xbf, 0x77, + 0xbe, 0x0c, 0x19, 0x20, 0xeb, 0xb9, 0x0f, 0x87, + 0xad, 0x60, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe4, + 0xbe, 0x3c, 0xbf, 0x75, 0x0f, 0x15, 0xf8, 0x1c, + 0x1f, 0x0a, 0x1f, 0x16, 0x0f, 0x87, 0x0e, 0x0a, + 0x76, 0xe5, 0xbf, 0x79, 0xbe, 0x34, 0x19, 0xa0, + 0xeb, 0xb9, 0x0f, 0x87, 0xad, 0xa0, 0x80, 0x3f, + 0x0e, 0x0a, 0x76, 0xe6, 0xbe, 0x3c, 0xbf, 0x79, + 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe7, 0x0f, 0x15, + 0xeb, 0xbe, 0x00, 0x2f, 0xdf, 0x72, 0x1d, 0xe0, + 0xf8, 0x1c, 0x00, 0x28, 0xd0, 0x01, 0xa0, 0x38, + 0x80, 0x3f, 0x0f, 0x87, 0xd0, 0x01, 0x4d, 0xc0, + 0x1f, 0x0f, 0x1f, 0x11, 0x00, 0x2f, 0xdf, 0x76, + 0xc6, 0xb2, 0x03, 0x7d, 0xde, 0x0e, 0x01, 0xa3, + 0xde, 0x2d, 0x5d, 0xc0, 0x0f, 0x87, 0x1e, 0xe1, + 0xeb, 0xdb, 0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, + 0x66, 0xda, 0x0c, 0x1e, 0xfb, 0xe4, 0x26, 0xbb, + 0x03, 0xff, 0xdd, 0xff, 0x4d, 0xc0, 0x00, 0xa3, + 0xde, 0x2d, 0xbf, 0x56, 0x0f, 0x87, 0x07, 0x7d, + 0xde, 0x0e, 0x5d, 0xc0, 0x00, 0xa3, 0xde, 0x1d, + 0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, + 0xdf, 0x5c, 0xd0, 0x0e, 0x4f, 0x00, 0x0f, 0x87, + 0xd0, 0x06, 0x40, 0x3c, 0xeb, 0xf0, 0xbf, 0x3e, + 0xb0, 0x04, 0xe7, 0xf2, 0xeb, 0xf6, 0xbf, 0x0c, + 0xbf, 0x3a, 0x0f, 0x87, 0x0f, 0x1d, 0xfb, 0x4b, + 0xbf, 0x38, 0x0f, 0x87, 0x0f, 0x1c, 0xfb, 0xcb, + 0xbf, 0x30, 0x0f, 0x87, 0x50, 0x00, 0x50, 0x00, + 0x0f, 0x17, 0xf9, 0x70, 0x90, 0x4d, 0x10, 0x60, + 0xe5, 0x72, 0x0f, 0x49, 0x90, 0x4d, 0x10, 0x60, + 0xe5, 0x76, 0x0f, 0x19, 0xf9, 0x79, 0x01, 0x46, + 0xd0, 0x11, 0xa0, 0x38, 0x80, 0x3f, 0x00, 0xc6, + 0xdf, 0x00, 0x00, 0x06, 0x08, 0x20, 0xd0, 0x00, + 0x10, 0x08, 0xa0, 0x0a, 0xa0, 0x1b, 0x0c, 0x20, + 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0x90, 0x4d, + 0x0f, 0xff, 0xd8, 0x1f, 0x40, 0x40, 0xa0, 0x4d, + 0x80, 0x0a, 0xd0, 0x00, 0x06, 0x50, 0xf9, 0x95, + 0xd0, 0x01, 0xa0, 0x09, 0x80, 0x1b, 0xa0, 0x27, + 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, + 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, + 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x40, + 0xa0, 0x69, 0x80, 0x2b, 0x80, 0x07, 0x08, 0x20, + 0xdf, 0x00, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38, + 0x80, 0x3f, 0x01, 0xb0, 0xd0, 0x10, 0xa0, 0x37, + 0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38, + 0xd0, 0x10, 0xa0, 0x38, 0x15, 0x63, 0xe9, 0xba, + 0x05, 0x5e, 0xf9, 0xfa, 0xc0, 0xdf, 0x00, 0xe0, + 0xd1, 0x80, 0x70, 0x06, 0x10, 0x1c, 0xc1, 0x40, + 0x11, 0x48, 0xd3, 0x10, 0x00, 0x21, 0xd0, 0x80, + 0xb0, 0x16, 0xe9, 0xca, 0xd3, 0x20, 0x10, 0x81, + 0xb0, 0x16, 0xf9, 0xfa, 0x30, 0xc2, 0xd2, 0x5e, + 0xd0, 0x8f, 0x00, 0xee, 0xd0, 0x54, 0x70, 0x41, + 0x30, 0x43, 0xed, 0xd7, 0xd2, 0x6c, 0x72, 0x49, + 0xc0, 0x89, 0xb0, 0xbf, 0x10, 0x9f, 0x22, 0x42, + 0x04, 0x31, 0xd0, 0x10, 0xc0, 0x42, 0x30, 0x49, + 0xe5, 0xde, 0x10, 0x03, 0xc1, 0x0c, 0xc1, 0x83, + 0xb1, 0xbe, 0x01, 0x46, 0x00, 0x06, 0xa0, 0x3d, + 0xa0, 0x3c, 0x60, 0x06, 0x00, 0xc6, 0xb1, 0xbc, + 0xb1, 0x01, 0xed, 0xe1, 0xc1, 0x0c, 0x21, 0x85, + 0x01, 0x46, 0x00, 0x06, 0xa0, 0x3d, 0xa0, 0x3c, + 0x60, 0x06, 0x00, 0xc6, 0xb1, 0xbc, 0xb1, 0x01, + 0xed, 0xec, 0x02, 0xe4, 0xd0, 0x00, 0x20, 0xc0, + 0xb2, 0x41, 0xed, 0xd8, 0x15, 0xa3, 0xfa, 0x00, + 0xbc, 0x10, 0x0c, 0x1e, 0xfa, 0x00, 0xbc, 0x10, + 0xd0, 0x04, 0x70, 0x00, 0x10, 0x20, 0xfa, 0x00, + 0x00, 0x27, 0xd0, 0x10, 0xd0, 0x40, 0x60, 0x40, + 0x00, 0x26, 0xd0, 0x14, 0x60, 0x40, 0xb0, 0x28, + 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x01, 0x7a, + 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, + 0x00, 0x28, 0xd1, 0xb0, 0x70, 0x06, 0xd0, 0x81, + 0x60, 0x86, 0x10, 0x20, 0xe9, 0xab, 0xb0, 0x3f, + 0x60, 0x06, 0x00, 0xec, 0xd1, 0x84, 0x70, 0x46, + 0xb1, 0x84, 0x70, 0x86, 0x30, 0x42, 0xe9, 0xab, + 0x70, 0x42, 0xd0, 0x35, 0x30, 0x40, 0xf9, 0xab, + 0x00, 0x63, 0xd0, 0x3f, 0xb0, 0xbc, 0x40, 0x80, + 0x70, 0xc2, 0x10, 0xe3, 0xe5, 0xab, 0xb0, 0xbc, + 0x40, 0x80, 0x60, 0x86, 0x00, 0x28, 0xd0, 0x24, + 0x70, 0x40, 0x00, 0x22, 0xd0, 0x80, 0x50, 0x42, + 0x60, 0x40, 0x00, 0x64, 0xd0, 0x60, 0xd0, 0x90, + 0x60, 0x81, 0x00, 0xed, 0xd1, 0x88, 0x70, 0x46, + 0x10, 0xe4, 0xe9, 0xa8, 0x00, 0x21, 0xd0, 0xe8, + 0xd0, 0x00, 0x60, 0x03, 0xd0, 0x81, 0x40, 0x42, + 0x60, 0x46, 0x02, 0x3c, 0xda, 0x89, 0xe0, 0x46, + 0xd0, 0x82, 0x50, 0x42, 0x60, 0x46, 0x00, 0x23, + 0xd5, 0x3e, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, + 0x01, 0x46, 0xdf, 0x5c, 0x08, 0x20, 0xd1, 0x00, + 0xcf, 0x04, 0x11, 0x08, 0xa1, 0x0a, 0xa1, 0x1b, + 0x11, 0x1f, 0xa1, 0x27, 0xd2, 0x80, 0xb2, 0x81, + 0x90, 0x4d, 0xc0, 0x01, 0x10, 0x14, 0x00, 0x16, + 0xe9, 0x8d, 0x80, 0x33, 0x80, 0x3f, 0x92, 0x8b, + 0x00, 0x23, 0xd0, 0x3f, 0x42, 0x80, 0xe9, 0x8d, + 0x0f, 0xff, 0xdf, 0xff, 0x40, 0x01, 0xa0, 0x0d, + 0xe1, 0x94, 0xa1, 0x0a, 0x00, 0xea, 0xd0, 0x00, + 0xd0, 0x8e, 0x00, 0x06, 0x0f, 0x0b, 0x70, 0x80, + 0x80, 0x73, 0x80, 0x0a, 0xd0, 0x00, 0x06, 0x50, + 0xf9, 0x9a, 0xd0, 0x01, 0xd0, 0x44, 0x40, 0x70, + 0x20, 0x01, 0x15, 0x63, 0xf9, 0xa1, 0x80, 0x1b, + 0xe1, 0xa2, 0x80, 0x5b, 0xa0, 0x27, 0x01, 0x20, + 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, + 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, + 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x40, 0xa0, 0x69, + 0x80, 0x2b, 0x80, 0x07, 0x08, 0x20, 0xd0, 0x00, + 0xcf, 0x00, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38, + 0x80, 0x3f, 0x01, 0xb2, 0xd2, 0x10, 0xa0, 0x37, + 0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38, + 0x00, 0x30, 0xd0, 0x10, 0xa0, 0x38, 0x80, 0x3f, + 0x00, 0xc6, 0x00, 0x28, 0xd1, 0x24, 0x70, 0x04, + 0xd0, 0x41, 0x50, 0x01, 0x60, 0x04, 0x00, 0x27, + 0xd0, 0x18, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, + 0x00, 0x26, 0xd0, 0x20, 0x70, 0x40, 0xb0, 0x7f, + 0x60, 0x40, 0x08, 0x20, 0xdf, 0x00, 0xd4, 0x00, + 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 0xd3, 0x81, + 0x12, 0xa0, 0xed, 0xe3, 0xd0, 0x08, 0x0a, 0x09, + 0x00, 0x4d, 0xb0, 0x01, 0xed, 0xdf, 0x03, 0xbe, + 0xd6, 0x27, 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, + 0x02, 0x24, 0xd0, 0x00, 0xa0, 0x37, 0x00, 0x27, + 0xd3, 0xd0, 0x00, 0x26, 0xd0, 0x04, 0x73, 0xcf, + 0x13, 0xe1, 0xe9, 0x7b, 0xb0, 0x3c, 0xf2, 0x00, + 0x00, 0x26, 0xd0, 0x40, 0xd0, 0x00, 0x60, 0x01, + 0x00, 0x26, 0xd0, 0x14, 0xf2, 0x00, 0x00, 0x26, + 0xd0, 0x18, 0xf2, 0x00, 0x00, 0xee, 0xd0, 0x1c, + 0x71, 0x40, 0xd1, 0x1e, 0x15, 0x63, 0xe9, 0x8d, + 0x11, 0x1f, 0xc7, 0x1a, 0xb7, 0x01, 0xd3, 0x81, + 0xc4, 0xd4, 0xf2, 0x04, 0x00, 0x26, 0xd0, 0x18, + 0x70, 0x40, 0xb0, 0x54, 0xfd, 0x9b, 0x00, 0xed, + 0xd0, 0x24, 0xd0, 0x44, 0x60, 0x40, 0x13, 0xe1, + 0xf9, 0xbc, 0x15, 0xa3, 0xf9, 0xa1, 0x0c, 0x10, + 0xe9, 0xb9, 0x11, 0x61, 0xe5, 0xb3, 0xed, 0xb9, + 0x15, 0xa3, 0xf9, 0xab, 0x00, 0x26, 0xd0, 0x14, + 0x70, 0x40, 0x10, 0x62, 0xf5, 0xb3, 0x15, 0x22, + 0xe5, 0xb3, 0xc0, 0x44, 0x30, 0x54, 0xe5, 0xb3, + 0x34, 0xd4, 0xf5, 0xb3, 0xe1, 0xbf, 0x03, 0xb3, + 0xd8, 0x29, 0x00, 0x26, 0xd0, 0x40, 0x60, 0x01, + 0xe1, 0xdb, 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, + 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x80, 0x07, + 0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, + 0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c, 0xd3, 0x80, + 0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d, + 0x00, 0x50, 0xf9, 0xc9, 0x0c, 0x49, 0xd0, 0x61, + 0x00, 0x8d, 0x10, 0xa0, 0xe9, 0x90, 0x30, 0x42, + 0xf5, 0xd8, 0xd0, 0x61, 0x23, 0x81, 0xe1, 0xce, + 0x23, 0x82, 0x13, 0xa1, 0xf9, 0x90, 0xd0, 0x42, + 0x15, 0xa1, 0xf9, 0xdf, 0xb0, 0x7f, 0x00, 0x26, + 0xd0, 0x14, 0x70, 0x00, 0x30, 0x01, 0xf5, 0xe8, + 0x16, 0xe0, 0xe5, 0xe8, 0xb6, 0xc1, 0xbc, 0x20, + 0xc0, 0x44, 0x30, 0x5b, 0xfd, 0xb9, 0xc0, 0x44, + 0x30, 0x54, 0xe5, 0xb9, 0x15, 0x63, 0xf9, 0xf8, + 0x15, 0xa3, 0xf9, 0xf5, 0x03, 0x3b, 0xda, 0x1c, + 0xe0, 0x46, 0x03, 0x38, 0xdc, 0x17, 0xe0, 0x46, + 0x15, 0xa3, 0xf9, 0xfd, 0x03, 0x72, 0xd0, 0x19, + 0xe0, 0x46, 0x03, 0x3f, 0xd2, 0x17, 0xe0, 0x46, + 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x0f, 0xc5, + 0xdf, 0x00, 0x0c, 0x09, 0x05, 0x0d, 0x08, 0x20, + 0xdf, 0x00, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, + 0x00, 0xef, 0xd0, 0x14, 0x70, 0x40, 0x10, 0x60, + 0xe9, 0x45, 0xb0, 0x04, 0x70, 0x40, 0xb0, 0x41, + 0xed, 0x44, 0x00, 0xed, 0xd0, 0x24, 0xd0, 0x44, + 0x60, 0x40, 0x00, 0x64, 0xd0, 0x20, 0x70, 0x00, + 0x10, 0x30, 0xe9, 0x45, 0x00, 0x21, 0xd0, 0x28, + 0x60, 0x40, 0x00, 0x64, 0xd2, 0xc0, 0x70, 0x0b, + 0x00, 0x11, 0xe9, 0x6a, 0x08, 0x20, 0xd0, 0x4f, + 0x30, 0x40, 0xe9, 0x55, 0xb0, 0x4f, 0xf9, 0x6a, + 0x03, 0xef, 0xdf, 0xbf, 0xaf, 0xb8, 0xdf, 0x80, + 0x0f, 0x87, 0xd0, 0x18, 0x70, 0x00, 0x10, 0x20, + 0xed, 0x6c, 0xdf, 0x84, 0xd0, 0x40, 0x60, 0x7e, + 0x00, 0x27, 0xd0, 0x54, 0x70, 0x41, 0x10, 0x60, + 0x01, 0xa0, 0xd0, 0x40, 0xa0, 0x78, 0x80, 0x34, + 0x80, 0x3f, 0x01, 0x3c, 0xd2, 0x39, 0x00, 0x21, + 0xdf, 0x86, 0x0f, 0x87, 0xd0, 0x40, 0x60, 0x4b, + 0x03, 0xe5, 0xd0, 0x10, 0xe0, 0x36, 0x50, 0x00, + 0x00, 0x28, 0xd0, 0x24, 0x72, 0xc0, 0xd0, 0x40, + 0x60, 0x40, 0xd0, 0x0c, 0x52, 0xc0, 0xc0, 0x1c, + 0x30, 0x1d, 0xf5, 0x3c, 0x20, 0x1f, 0x30, 0x1e, + 0x90, 0x6d, 0x20, 0x01, 0x00, 0x22, 0xd0, 0x58, + 0x60, 0x01, 0x00, 0xe3, 0xd0, 0x48, 0x70, 0x41, + 0x30, 0x40, 0xf5, 0x47, 0xb2, 0xc8, 0x00, 0xe3, + 0xd0, 0x4c, 0x70, 0x41, 0x30, 0x40, 0xfd, 0x4d, + 0xb2, 0xc4, 0x00, 0x28, 0xd0, 0x20, 0x70, 0x00, + 0x42, 0xc0, 0xa2, 0xc5, 0x12, 0xe0, 0xe9, 0x55, + 0x80, 0x40, 0x80, 0x34, 0x80, 0x3f, 0xcf, 0x95, + 0x82, 0x34, 0x80, 0x3f, 0x03, 0xe7, 0xd0, 0x08, + 0x1f, 0xa3, 0xe9, 0x60, 0x03, 0xe9, 0xd0, 0x08, + 0x00, 0x27, 0xd0, 0x4c, 0x7f, 0x81, 0x00, 0x27, + 0xd0, 0x54, 0x70, 0x41, 0x10, 0x60, 0x03, 0xa0, + 0xd0, 0x40, 0xa0, 0x78, 0xe0, 0x3c, 0x50, 0x00, + 0xc0, 0x84, 0x10, 0x8c, 0x10, 0x92, 0xd0, 0x41, + 0x30, 0x4d, 0x40, 0x43, 0x10, 0x43, 0x20, 0x81, + 0xd1, 0x8f, 0x41, 0x82, 0x10, 0x9c, 0x20, 0x9b, + 0xc1, 0xc2, 0x10, 0x82, 0x20, 0x87, 0xc0, 0x42, + 0x10, 0x43, 0x20, 0x81, 0x10, 0x88, 0x22, 0x02, + 0x10, 0x97, 0x01, 0xd0, 0xe9, 0x48, 0xb0, 0x96, + 0x10, 0x88, 0x22, 0x82, 0xc0, 0x5c, 0x10, 0x48, + 0xc0, 0x84, 0x10, 0x91, 0x10, 0x86, 0x20, 0x42, + 0x41, 0x0d, 0x11, 0x02, 0x20, 0x44, 0x22, 0x01, + 0x22, 0x81, 0x02, 0xe4, 0xd2, 0x40, 0xc2, 0xca, + 0xb2, 0xe0, 0x01, 0xd0, 0xe9, 0x5e, 0xc2, 0xca, + 0x22, 0xc9, 0xb2, 0xa0, 0x22, 0x48, 0xd0, 0x78, + 0x03, 0x50, 0xf9, 0x69, 0xd0, 0x7c, 0x01, 0x9d, + 0xf9, 0x69, 0xc2, 0x48, 0xb2, 0x60, 0xc2, 0xca, + 0xb2, 0xf0, 0x11, 0x82, 0x41, 0x81, 0x22, 0x06, + 0x11, 0x9f, 0x41, 0x81, 0x22, 0x86, 0x0f, 0xc5, + 0xc0, 0x84, 0x10, 0x8c, 0x10, 0x92, 0xd1, 0x8f, + 0x41, 0x82, 0x10, 0x9c, 0xc1, 0xdb, 0x11, 0xc1, + 0x21, 0xc3, 0x20, 0x87, 0xc1, 0xc2, 0x10, 0x82, + 0x20, 0x87, 0xc0, 0x42, 0x10, 0x43, 0x20, 0x81, + 0x10, 0x88, 0x22, 0x02, 0x10, 0x97, 0x01, 0xd0, + 0xe9, 0x46, 0xb0, 0x96, 0x10, 0x88, 0x22, 0x82, + 0xc0, 0x5c, 0x10, 0x48, 0xc0, 0x84, 0x10, 0x91, + 0x10, 0x86, 0x20, 0x42, 0xd0, 0x81, 0x41, 0x02, + 0x11, 0x02, 0x20, 0x44, 0x22, 0x01, 0x22, 0x81, + 0x02, 0xe4, 0xd2, 0x40, 0xc2, 0xca, 0xb2, 0xe0, + 0x01, 0xd0, 0xe9, 0x5d, 0xc2, 0xca, 0x22, 0xc9, + 0xb2, 0xa0, 0x22, 0x48, 0x11, 0x9f, 0x11, 0x83, + 0x22, 0x06, 0x11, 0x9c, 0x11, 0x83, 0x22, 0x86, + 0x0f, 0xc5, 0xd0, 0x41, 0x40, 0x44, 0x20, 0x55, + 0x10, 0x62, 0xf9, 0x6f, 0x01, 0x74, 0xd6, 0x00, + 0xc2, 0x9f, 0xc2, 0x1f, 0x22, 0x80, 0xe1, 0x30, + 0x0f, 0x11, 0xf9, 0x51, 0x90, 0x38, 0x80, 0x3f, + 0x00, 0x1b, 0xf9, 0x51, 0x00, 0x27, 0xd0, 0x04, + 0x70, 0x40, 0x30, 0x71, 0xf9, 0x51, 0xb0, 0x3c, + 0x70, 0x40, 0x30, 0x5d, 0xf9, 0x51, 0xb0, 0x08, + 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x10, 0x63, + 0xe5, 0x5d, 0x02, 0x20, 0xd0, 0x01, 0xa0, 0x37, + 0x00, 0x26, 0xd0, 0x24, 0x70, 0x40, 0xb0, 0x7f, + 0x60, 0x40, 0xb0, 0x08, 0x70, 0x40, 0xb0, 0x41, + 0x60, 0x40, 0x00, 0x26, 0xd0, 0x30, 0x70, 0x40, + 0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x30, 0xd0, 0x40, + 0x60, 0x40, 0xb0, 0x3c, 0x6c, 0x40, 0xb0, 0x3c, + 0x67, 0x40, 0x00, 0x33, 0xdf, 0x78, 0xe0, 0x36, + 0x00, 0x26, 0xd0, 0x1c, 0x70, 0x40, 0xb0, 0x7f, + 0x60, 0x40, 0xb0, 0x3c, 0x70, 0x40, 0xb0, 0x41, + 0x60, 0x40, 0x08, 0x20, 0xdf, 0x00, 0x80, 0x35, + 0xc0, 0x3c, 0x10, 0x08, 0xa0, 0x0a, 0xa0, 0x27, + 0xa0, 0x1b, 0xdf, 0x5c, 0x01, 0xa0, 0xd0, 0x00, + 0xa0, 0x38, 0x80, 0x3f, 0x80, 0x34, 0x80, 0x3f, + 0x03, 0xba, 0xda, 0x1e, 0xcf, 0x95, 0x82, 0x34, + 0x80, 0x3f, 0x03, 0xe7, 0xd0, 0x08, 0x1f, 0xa3, + 0xe9, 0x55, 0x1f, 0xa0, 0xe9, 0x55, 0x03, 0xe9, + 0xd0, 0x08, 0x00, 0x21, 0xdf, 0x86, 0xe0, 0x3c, + 0x89, 0x78, 0x89, 0x37, 0x00, 0xee, 0xd0, 0x14, + 0x76, 0x00, 0xd0, 0x30, 0x76, 0x40, 0x26, 0x58, + 0xd6, 0xd9, 0x00, 0xee, 0xd0, 0x20, 0x75, 0x40, + 0xd0, 0x1c, 0x71, 0x40, 0xd0, 0x20, 0x71, 0x00, + 0xd0, 0x24, 0x70, 0x80, 0xc4, 0x02, 0xd0, 0x28, + 0x70, 0xc0, 0x00, 0x21, 0xd0, 0x10, 0x72, 0x00, + 0x93, 0x90, 0xd4, 0x81, 0x13, 0x96, 0x43, 0x92, + 0x34, 0x8e, 0x00, 0x22, 0xd1, 0xa4, 0x71, 0x86, + 0xde, 0x40, 0x7e, 0x79, 0xd0, 0x18, 0x70, 0x40, + 0xb0, 0x41, 0xf5, 0x58, 0xd3, 0x42, 0x50, 0x4d, + 0x60, 0x40, 0x10, 0x60, 0xe5, 0x62, 0xd0, 0x54, + 0x70, 0x01, 0xb0, 0x3c, 0x60, 0x01, 0x04, 0x2d, + 0xd0, 0x08, 0xe0, 0x36, 0x00, 0x22, 0xd0, 0x60, + 0x71, 0xc1, 0xd0, 0x4f, 0x41, 0xc1, 0x03, 0xef, + 0xd0, 0x30, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, + 0x04, 0x21, 0xd0, 0x20, 0xd3, 0x44, 0x72, 0x8d, + 0x12, 0xa0, 0xe8, 0x36, 0xc0, 0x47, 0x10, 0x5d, + 0x30, 0x4e, 0xf8, 0x36, 0xb2, 0x3e, 0x60, 0x4d, + 0x00, 0xed, 0xd0, 0x48, 0x70, 0x01, 0xde, 0x45, + 0x50, 0x39, 0x00, 0x1b, 0xf9, 0x44, 0xb0, 0x01, + 0x00, 0x1c, 0xf9, 0x47, 0xb0, 0x04, 0x60, 0x01, + 0xd0, 0x40, 0x62, 0x81, 0xce, 0x4a, 0xd0, 0x43, + 0x41, 0xc1, 0xd0, 0x58, 0x61, 0xc1, 0x90, 0x43, + 0x00, 0xe0, 0xd0, 0x28, 0x70, 0x00, 0x10, 0x1f, + 0x20, 0x40, 0xb1, 0xc1, 0xf5, 0x54, 0x00, 0x21, + 0xd0, 0x08, 0x60, 0x40, 0x00, 0xe6, 0xd0, 0x40, + 0x70, 0x41, 0xd2, 0x94, 0x60, 0x4a, 0x04, 0x2b, + 0xd0, 0x10, 0x01, 0x90, 0xf8, 0x36, 0x04, 0x2d, + 0xd0, 0x08, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, + 0xc0, 0x47, 0x10, 0x5d, 0x30, 0x4e, 0xf9, 0x41, + 0x90, 0x43, 0x00, 0xe0, 0xd0, 0x28, 0x70, 0x00, + 0x20, 0x40, 0x00, 0x21, 0xd0, 0x08, 0x60, 0x40, + 0x00, 0x26, 0xd0, 0x74, 0x70, 0x01, 0xb0, 0x3f, + 0x60, 0x01, 0x00, 0xed, 0xd0, 0x48, 0x70, 0x41, + 0x00, 0x5e, 0xf9, 0x4b, 0x00, 0x21, 0xd0, 0x00, + 0x73, 0x80, 0xd4, 0x81, 0x34, 0x8e, 0x00, 0x34, + 0xd3, 0x48, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, + 0xd1, 0x88, 0xd1, 0xc8, 0x01, 0x1b, 0xe9, 0x39, + 0x11, 0x9f, 0x11, 0xdf, 0xd4, 0x80, 0xd3, 0x81, + 0xe1, 0x43, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x00, + 0x00, 0x10, 0xf9, 0x37, 0x0c, 0x1f, 0xf9, 0x36, + 0x13, 0xa1, 0xe9, 0x43, 0xbe, 0x7c, 0x00, 0x65, + 0xd2, 0x46, 0x12, 0x48, 0xc0, 0x39, 0x30, 0x18, + 0xe5, 0x4b, 0xd2, 0x70, 0x72, 0x49, 0x22, 0x79, + 0x00, 0x21, 0xd0, 0x00, 0x63, 0x80, 0x04, 0x24, + 0xd0, 0x00, 0x02, 0x10, 0xe9, 0x56, 0xd0, 0x41, + 0x51, 0x41, 0xe0, 0x36, 0x15, 0x61, 0xe8, 0x36, + 0xd5, 0x80, 0xd3, 0x00, 0xd3, 0x40, 0x04, 0x27, + 0xd0, 0x20, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, + 0x00, 0x21, 0xd0, 0x18, 0x73, 0x00, 0xb0, 0x04, + 0x73, 0x80, 0xd2, 0x80, 0xb0, 0x38, 0x72, 0xc0, + 0x31, 0x0d, 0xc0, 0x0e, 0x10, 0x0b, 0x10, 0x20, + 0xe9, 0x42, 0xf5, 0x3f, 0x22, 0x8d, 0x10, 0x01, + 0x13, 0x5f, 0xe1, 0x3b, 0x33, 0x8b, 0x15, 0x61, + 0xf9, 0x49, 0x00, 0x21, 0xd0, 0x64, 0x70, 0x41, + 0x33, 0x81, 0x03, 0xd0, 0xe9, 0x4c, 0x20, 0x0b, + 0x13, 0xdf, 0x12, 0xc1, 0x13, 0xe0, 0xf9, 0x49, + 0x10, 0x03, 0xc0, 0x50, 0x10, 0x4b, 0x13, 0x0b, + 0x23, 0x00, 0x13, 0x20, 0xe9, 0x5c, 0xf5, 0x59, + 0x22, 0x81, 0x13, 0x01, 0x10, 0x5f, 0xe1, 0x55, + 0x12, 0x99, 0x12, 0x87, 0x21, 0x0a, 0x00, 0xa0, + 0xd2, 0x80, 0xc3, 0x0a, 0x03, 0x90, 0xe9, 0x66, + 0x22, 0x82, 0x23, 0x03, 0x10, 0x81, 0x10, 0xc1, + 0x13, 0x9f, 0x13, 0xa0, 0xed, 0x62, 0xc0, 0x8a, + 0xc0, 0xcc, 0x04, 0x26, 0xd0, 0x00, 0xe0, 0x36, + 0x15, 0x61, 0xf9, 0x3d, 0x07, 0x32, 0xd0, 0x00, + 0x30, 0x03, 0xed, 0x3d, 0xc0, 0x03, 0x10, 0x1d, + 0x30, 0xc0, 0xc0, 0x02, 0x10, 0x1d, 0x30, 0x80, + 0xe1, 0x32, 0x10, 0x94, 0x10, 0xd4, 0x00, 0x21, + 0xd0, 0x20, 0x73, 0x00, 0xc5, 0x8c, 0xd3, 0x4e, + 0x01, 0x1b, 0xe9, 0x48, 0x13, 0x1f, 0xd3, 0x4f, + 0x43, 0x4c, 0x13, 0x1c, 0xc0, 0x0c, 0x10, 0x03, + 0x20, 0x0c, 0xc0, 0x40, 0x10, 0x42, 0x20, 0x40, + 0x10, 0x46, 0x20, 0x4d, 0x10, 0x42, 0x2e, 0x41, + 0x10, 0x5c, 0x10, 0x43, 0x00, 0x59, 0xe9, 0x5b, + 0x01, 0x69, 0xd0, 0x20, 0x30, 0x40, 0x22, 0x41, + 0x04, 0x27, 0xd0, 0x20, 0xe0, 0x36, 0x50, 0x00, + 0x2c, 0x14, 0xd0, 0x34, 0x63, 0x00, 0xd0, 0x38, + 0x72, 0xc0, 0xc0, 0x51, 0x10, 0x5c, 0x30, 0x4b, + 0x10, 0x44, 0xd4, 0xc0, 0xd5, 0x00, 0xc0, 0x18, + 0x30, 0x39, 0xed, 0x5f, 0xd4, 0xd0, 0xc5, 0x01, + 0xd0, 0x18, 0x70, 0x00, 0x0c, 0x1f, 0xe9, 0x48, + 0x10, 0x20, 0xfd, 0x48, 0xd4, 0xc0, 0xd5, 0x00, + 0x10, 0x22, 0xe5, 0x4e, 0xd4, 0xc0, 0xbc, 0x30, + 0xd5, 0x00, 0xb5, 0x10, 0xb0, 0x3f, 0xf9, 0x52, + 0x3c, 0x01, 0x3c, 0x01, 0x02, 0x1f, 0xe9, 0x5f, + 0x00, 0xa8, 0xd3, 0xc0, 0xd3, 0x9e, 0x00, 0xa9, + 0xd0, 0x38, 0x70, 0x4f, 0xb3, 0xfc, 0x60, 0x40, + 0xb0, 0x3c, 0xb3, 0x81, 0xed, 0x59, 0x00, 0x21, + 0xd0, 0x28, 0x70, 0x00, 0x10, 0x20, 0xf9, 0x69, + 0x02, 0x1f, 0xf9, 0x6a, 0x90, 0x10, 0x00, 0x1e, + 0xe9, 0x6a, 0xb1, 0x7c, 0x04, 0x29, 0xd0, 0x20, + 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x01, 0x5e, 0xf9, 0x35, 0x01, 0x50, 0xe9, 0x35, + 0xb1, 0x78, 0xd2, 0x00, 0x01, 0x5c, 0xf9, 0x5f, + 0xc0, 0x18, 0x30, 0x39, 0xed, 0x5f, 0x11, 0x9f, + 0xce, 0x58, 0xc2, 0x59, 0x00, 0xa9, 0xd2, 0x38, + 0x14, 0x82, 0x22, 0x12, 0xc0, 0x0c, 0x10, 0x1f, + 0x10, 0x03, 0x22, 0x00, 0x70, 0x48, 0x03, 0x10, + 0xe9, 0x4c, 0xb2, 0x38, 0xbe, 0x60, 0xb2, 0x60, + 0x2e, 0x41, 0x10, 0x5f, 0x00, 0x59, 0xe9, 0x53, + 0x01, 0x69, 0xd0, 0x3c, 0x30, 0x40, 0x22, 0x41, + 0x13, 0x41, 0x2e, 0x4d, 0x13, 0x5d, 0x13, 0x43, + 0x22, 0x4d, 0x14, 0xe0, 0xe9, 0x5f, 0x33, 0x0b, + 0x13, 0x04, 0x2c, 0x0c, 0x35, 0x0c, 0xc3, 0x46, + 0xc3, 0x87, 0x04, 0x61, 0xd0, 0x28, 0x15, 0x62, + 0xfc, 0x36, 0x04, 0x2f, 0xd0, 0x28, 0xe0, 0x36, + 0x00, 0x22, 0xd0, 0x74, 0x74, 0x01, 0xb0, 0x7c, + 0x74, 0x41, 0xb0, 0x7c, 0x00, 0x27, 0xd0, 0x20, + 0x30, 0x11, 0xf5, 0x3b, 0x24, 0x40, 0x71, 0x41, + 0xd1, 0x08, 0xc0, 0x10, 0x10, 0x1c, 0xb0, 0x16, + 0xf9, 0x4a, 0x00, 0x23, 0xd0, 0x30, 0x30, 0x11, + 0xf9, 0x4a, 0xb1, 0x70, 0x01, 0x50, 0xf9, 0x4a, + 0xb1, 0x20, 0x14, 0x41, 0xc0, 0x90, 0x00, 0x2b, + 0xd0, 0xd0, 0x01, 0x50, 0xe9, 0x50, 0xc0, 0xd0, + 0x00, 0x34, 0xdc, 0x00, 0x20, 0x11, 0x10, 0x1f, + 0xa0, 0x1c, 0x00, 0x21, 0xd0, 0x2c, 0x70, 0x00, + 0x10, 0x05, 0x51, 0x40, 0xd0, 0x1c, 0x61, 0x40, + 0xd0, 0x20, 0x61, 0x00, 0xd0, 0x24, 0x60, 0x80, + 0xd0, 0x28, 0x60, 0xc0, 0x04, 0x2d, 0xd0, 0x08, + 0x00, 0x22, 0xd0, 0x64, 0xb1, 0x81, 0x61, 0x81, + 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, + 0x90, 0x50, 0xd0, 0x3c, 0x10, 0x41, 0x60, 0x40, + 0x15, 0x62, 0xfd, 0x3d, 0xc0, 0x10, 0x10, 0x1e, + 0x10, 0x07, 0x21, 0x00, 0x10, 0x16, 0x34, 0x00, + 0xc0, 0x90, 0xd3, 0x40, 0x00, 0x24, 0xd3, 0xc0, + 0x04, 0x22, 0xd0, 0x20, 0x01, 0x9f, 0xe8, 0x36, + 0xd0, 0x54, 0x70, 0x41, 0x73, 0x41, 0x04, 0x2e, + 0xd0, 0x00, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, + 0x00, 0xef, 0xd3, 0x30, 0x73, 0x0c, 0xd0, 0x0c, + 0x70, 0x00, 0xc0, 0x40, 0x13, 0x24, 0xf5, 0x42, + 0x13, 0x22, 0xe9, 0x41, 0xe5, 0x43, 0xd3, 0x00, + 0x10, 0x22, 0xf9, 0x41, 0xd0, 0x01, 0xd0, 0x43, + 0xd3, 0x01, 0x21, 0x00, 0xd3, 0x40, 0x03, 0x10, + 0xf9, 0x47, 0xd3, 0x40, 0xe1, 0x61, 0x00, 0x23, + 0xd0, 0x00, 0x10, 0x61, 0xe9, 0x50, 0xb0, 0x33, + 0x10, 0x63, 0xe9, 0x50, 0x00, 0x22, 0xd0, 0x1a, + 0xc3, 0xc0, 0xd2, 0xc0, 0x00, 0x10, 0xe9, 0x55, + 0x22, 0xd0, 0x10, 0x1f, 0x14, 0x01, 0x10, 0x20, + 0xed, 0x52, 0x14, 0x18, 0x12, 0xd8, 0xc0, 0x8b, + 0x32, 0xd0, 0x12, 0xc3, 0x33, 0x4b, 0x13, 0x47, + 0x21, 0x0d, 0x04, 0x22, 0xd0, 0x20, 0xe0, 0x36, + 0x00, 0x24, 0xd0, 0x30, 0xd0, 0x40, 0x60, 0x40, + 0xd3, 0xc7, 0x43, 0xc4, 0x31, 0x0f, 0xd5, 0xd4, + 0x25, 0xcf, 0x15, 0xc4, 0x10, 0xdf, 0xc2, 0xc6, + 0xc3, 0x07, 0x11, 0x81, 0xb1, 0x3b, 0x15, 0x64, + 0xe9, 0x47, 0x10, 0xdf, 0x12, 0xc1, 0x11, 0x81, + 0x11, 0xc1, 0xb1, 0x3f, 0xb5, 0xf8, 0x90, 0x10, + 0x00, 0x16, 0xf9, 0x5e, 0xb5, 0xfc, 0xd0, 0x20, + 0x40, 0x39, 0x2e, 0x4b, 0x22, 0x4c, 0x12, 0x20, + 0xe9, 0x59, 0x20, 0x39, 0x00, 0x1b, 0xe9, 0x59, + 0x2c, 0x13, 0x35, 0x13, 0x0e, 0x5a, 0xf9, 0x59, + 0xb2, 0x38, 0x02, 0xe3, 0xd0, 0x00, 0x0e, 0x5a, + 0xe9, 0x5e, 0x2e, 0x40, 0x01, 0xee, 0xd2, 0x80, + 0x42, 0x84, 0xc0, 0x03, 0x30, 0x02, 0xf5, 0x6b, + 0x31, 0x0a, 0x12, 0x98, 0x20, 0x03, 0xf5, 0x69, + 0x12, 0x9f, 0x12, 0x87, 0x51, 0x0a, 0x00, 0x34, + 0xd4, 0xc8, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, + 0xd3, 0xc7, 0x43, 0xc4, 0x15, 0x61, 0xf9, 0x48, + 0x10, 0xc1, 0xd5, 0xe0, 0xd1, 0x80, 0xd1, 0xc0, + 0x31, 0x0f, 0x13, 0xe1, 0xe9, 0x3c, 0xd3, 0xc0, + 0x00, 0x24, 0xd0, 0x30, 0x63, 0xc0, 0x25, 0xcf, + 0x15, 0xc2, 0xd0, 0x03, 0x40, 0x16, 0x25, 0xc0, + 0x15, 0xc2, 0x15, 0x81, 0x35, 0x91, 0xe1, 0x5c, + 0x00, 0x24, 0xd0, 0x30, 0x63, 0xc0, 0x01, 0x50, + 0xe9, 0x54, 0x15, 0xa0, 0xf9, 0x55, 0x00, 0x24, + 0xd0, 0x34, 0x70, 0x00, 0x10, 0x20, 0xe9, 0x55, + 0xd3, 0xc0, 0x31, 0x0f, 0xd5, 0xfc, 0x25, 0xcf, + 0x15, 0xc3, 0x14, 0xa0, 0xe9, 0x5c, 0xb5, 0xfc, + 0x00, 0x34, 0xd4, 0xc8, 0xe0, 0x36, 0x50, 0x00, + 0xc4, 0x91, 0x34, 0x96, 0xed, 0x34, 0xd4, 0x80, + 0x14, 0x84, 0xb3, 0xc1, 0xe5, 0x41, 0xc0, 0x52, + 0x10, 0x5e, 0x34, 0x81, 0xb3, 0xc1, 0xe5, 0x41, + 0xc0, 0x52, 0x10, 0x5c, 0x24, 0x81, 0xb3, 0xc1, + 0xe5, 0x37, 0x02, 0x68, 0xd0, 0x00, 0xb4, 0xb0, + 0x14, 0x9b, 0x00, 0x23, 0xd0, 0x70, 0x30, 0x52, + 0xed, 0x4a, 0x24, 0x81, 0x20, 0x12, 0xa0, 0x1c, + 0x10, 0x8a, 0x50, 0x83, 0xa0, 0x96, 0xa1, 0x50, + 0xa1, 0x11, 0xc0, 0x52, 0xd4, 0x84, 0x10, 0x6c, + 0xed, 0x56, 0xd4, 0x81, 0xd1, 0x00, 0xb1, 0x13, + 0x00, 0x23, 0xd1, 0x40, 0xc2, 0xb9, 0x22, 0x86, + 0x12, 0x20, 0xf9, 0x66, 0x02, 0xe3, 0xd0, 0x40, + 0x02, 0x9a, 0xe9, 0x63, 0x22, 0x81, 0x02, 0x5a, + 0xe9, 0x66, 0x22, 0x41, 0x75, 0xd7, 0xc3, 0xd7, + 0xd0, 0xd7, 0x00, 0x21, 0xd0, 0xb6, 0x8b, 0x38, + 0x00, 0x33, 0xdc, 0xd0, 0xe0, 0x36, 0x50, 0x00, + 0xd0, 0x7c, 0x60, 0x01, 0xae, 0x52, 0xd0, 0x60, + 0x40, 0x79, 0x00, 0x13, 0xe8, 0xc9, 0xa2, 0x94, + 0x22, 0x86, 0x13, 0xe0, 0xe4, 0xd0, 0x13, 0xc1, + 0x15, 0x62, 0xfc, 0xd1, 0x13, 0xc1, 0xe0, 0xd1, + 0xc3, 0xd7, 0x03, 0xd9, 0xe8, 0xd4, 0x22, 0x8d, + 0x15, 0x62, 0xfc, 0xda, 0x03, 0xda, 0xe8, 0xda, + 0x22, 0x8d, 0x22, 0x8d, 0xce, 0x4a, 0x22, 0x86, + 0x00, 0x14, 0xe8, 0xe0, 0xa2, 0x53, 0x22, 0x47, + 0x03, 0xd1, 0xe8, 0xe8, 0x22, 0x4e, 0x15, 0x62, + 0xfc, 0xe8, 0x03, 0xd2, 0xe8, 0xe8, 0x22, 0x4e, + 0x12, 0x20, 0xe9, 0x09, 0x20, 0x79, 0x00, 0x5b, + 0xe8, 0xf4, 0x15, 0x20, 0xfc, 0xf1, 0x2c, 0x13, + 0x35, 0x13, 0x0e, 0x5b, 0xe8, 0xf4, 0xb2, 0x38, + 0x02, 0x9a, 0xe8, 0xfb, 0x70, 0x08, 0xd0, 0x7c, + 0x42, 0x81, 0x22, 0x98, 0x22, 0x80, 0x02, 0x5a, + 0xe9, 0x11, 0x70, 0x08, 0xd0, 0x78, 0x42, 0x41, + 0x22, 0x59, 0x10, 0x1f, 0x22, 0x40, 0x00, 0x19, + 0xe9, 0x11, 0x01, 0x69, 0xd0, 0x7c, 0x32, 0x41, + 0xe1, 0x11, 0x02, 0xe3, 0xd0, 0x40, 0x02, 0x9a, + 0xe9, 0x0e, 0x22, 0x81, 0x02, 0x5a, 0xe9, 0x11, + 0x22, 0x41, 0x0e, 0x5a, 0xe9, 0x15, 0xce, 0x4a, + 0x3e, 0x46, 0x0f, 0x87, 0xdd, 0x48, 0xe1, 0x19, + 0xdd, 0x40, 0xdc, 0xc8, 0xdd, 0x3c, 0x7d, 0x34, + 0x1d, 0x19, 0x3d, 0x35, 0x4d, 0x33, 0x4c, 0xec, + 0x3d, 0x33, 0xf9, 0x17, 0x0f, 0xc5, 0x50, 0x00, + 0xd0, 0x39, 0xd0, 0x35, 0xd0, 0x1d, 0xd0, 0x2d, + 0xd0, 0x3f, 0xd0, 0x2e, 0xd0, 0x3c, 0xd0, 0x37, + 0xd0, 0x38, 0xd0, 0x19, 0xd0, 0x33, 0xd0, 0x2e, + 0xd0, 0x3d, 0xd0, 0x3e, 0xd0, 0x27, 0xd0, 0x3e, + 0xd0, 0x3a, 0xd0, 0x2f, 0xd0, 0x32, 0x00, 0x00, + 0x47, 0x78, 0x46, 0xc0, 0xe1, 0x01, 0x00, 0x90, + 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, + 0xe9, 0x2d, 0x40, 0x00, 0xe5, 0x9f, 0x20, 0x6c, + 0xe0, 0x21, 0x10, 0x01, 0xe1, 0x02, 0x00, 0x91, + 0xe3, 0x50, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x02, + 0xe3, 0xa0, 0x00, 0x00, 0xeb, 0x00, 0x38, 0x71, + 0xea, 0xff, 0xff, 0xf7, 0xe8, 0xbd, 0x40, 0x00, + 0xe1, 0x2f, 0xff, 0x1e, 0xb5, 0x00, 0x4a, 0x12, + 0x68, 0x10, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x00, + 0xf7, 0xf0, 0xfb, 0x8c, 0xe7, 0xf7, 0xbd, 0x00, + 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, + 0xe5, 0x9f, 0x20, 0x2c, 0xe3, 0xa0, 0x10, 0x01, + 0xe1, 0x02, 0x00, 0x91, 0xe3, 0x50, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x02, 0xe3, 0xa0, 0x00, 0x00, + 0xeb, 0x00, 0x38, 0x60, 0xea, 0xff, 0xff, 0xf7, + 0xe8, 0xbd, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x10, + 0x48, 0x02, 0x40, 0x49, 0x60, 0x01, 0x47, 0x70, + 0x70, 0x00, 0x00, 0x34, 0x2e, 0x08, 0x20, 0x28, + 0x47, 0x78, 0x46, 0xc0, 0xe1, 0xa0, 0x09, 0x00, + 0xe1, 0xb0, 0x10, 0x01, 0x03, 0xc0, 0x01, 0x02, + 0x13, 0x80, 0x01, 0x02, 0xe3, 0xa0, 0x13, 0x3f, + 0xe3, 0xa0, 0x30, 0x0e, 0xe1, 0xb0, 0x10, 0x81, + 0x3a, 0x00, 0x00, 0x04, 0xe1, 0xb0, 0x00, 0x80, + 0x32, 0x21, 0x13, 0x03, 0xe2, 0x53, 0x30, 0x01, + 0x1a, 0xff, 0xff, 0xf9, 0xea, 0x00, 0x00, 0x03, + 0xe1, 0xb0, 0x00, 0x80, 0x22, 0x21, 0x13, 0x03, + 0xe2, 0x53, 0x30, 0x01, 0x1a, 0xff, 0xff, 0xf4, + 0xe1, 0xa0, 0x0d, 0x21, 0xe1, 0x2f, 0xff, 0x1e, + 0xe9, 0x2d, 0x41, 0xf0, 0xe2, 0x4d, 0xd0, 0x14, + 0xe3, 0xa0, 0xc0, 0x44, 0xe2, 0x8c, 0xc4, 0x66, + 0xe5, 0x9c, 0xc0, 0x00, 0xe5, 0x9f, 0x01, 0x94, + 0xe5, 0x80, 0xc0, 0x00, 0xe1, 0xa0, 0xc1, 0x4c, + 0xe2, 0x0c, 0xc0, 0x03, 0xe5, 0x9f, 0x01, 0x88, + 0xe5, 0xc0, 0xc0, 0x00, 0xe5, 0x9f, 0x01, 0x84, + 0xe5, 0x90, 0x00, 0x00, 0xe0, 0x80, 0x64, 0x0c, + 0xe1, 0xa0, 0x70, 0x06, 0xe8, 0xb7, 0x00, 0x01, + 0xe2, 0x00, 0x40, 0x1f, 0xe2, 0x8f, 0x2f, 0x69, + 0xe7, 0x92, 0x21, 0x04, 0xe3, 0x52, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x51, 0xe5, 0x9f, 0x32, 0x1c, + 0xe2, 0x83, 0x50, 0xbc, 0xe5, 0x9f, 0x12, 0x1c, + 0xe1, 0x55, 0x00, 0x01, 0x03, 0xa0, 0x50, 0x00, + 0xe5, 0x9f, 0x12, 0x04, 0xe1, 0x51, 0x00, 0x05, + 0x0a, 0x00, 0x00, 0x45, 0xe5, 0x9f, 0x81, 0xf4, + 0xe0, 0x88, 0x80, 0x03, 0xe5, 0x9f, 0x11, 0x5c, + 0xe1, 0xa0, 0x36, 0x20, 0xe2, 0x03, 0x30, 0x0f, + 0xe1, 0x81, 0x10, 0x03, 0xe5, 0x9f, 0x21, 0x48, + 0xe7, 0x92, 0x31, 0x04, 0xe1, 0xa0, 0x39, 0x83, + 0xe1, 0xa0, 0x35, 0xa3, 0xe1, 0x81, 0x10, 0x03, + 0xe1, 0xa0, 0x33, 0xa0, 0xe2, 0x03, 0x30, 0x01, + 0xe1, 0xa0, 0x3b, 0x03, 0xe1, 0x81, 0x10, 0x03, + 0xe1, 0xa0, 0x35, 0x20, 0xe2, 0x03, 0x30, 0x03, + 0xe1, 0xa0, 0x32, 0x03, 0xe1, 0x81, 0x10, 0x03, + 0xe1, 0xa0, 0x3a, 0xa0, 0xe2, 0x03, 0x30, 0x01, + 0xe1, 0xa0, 0x3b, 0x83, 0xe1, 0x81, 0x10, 0x03, + 0xe1, 0xa0, 0x34, 0xa0, 0xe2, 0x03, 0x30, 0x01, + 0xe1, 0xa0, 0x3a, 0x83, 0xe1, 0x81, 0x10, 0x03, + 0xe2, 0x00, 0x30, 0x60, 0xe1, 0xa0, 0x31, 0x03, + 0xe1, 0x81, 0x10, 0x03, 0xe8, 0xa8, 0x00, 0x02, + 0xe5, 0x9f, 0x00, 0xf0, 0xe3, 0xa0, 0x10, 0x30, + 0xe5, 0x80, 0x10, 0x00, 0xe5, 0x9f, 0x00, 0x9c, + 0xe5, 0xd0, 0x40, 0x00, 0xe2, 0x84, 0x10, 0x01, + 0xe5, 0xc0, 0x10, 0x00, 0xe2, 0x04, 0x40, 0x00, + 0xe5, 0x9f, 0x00, 0x98, 0xe5, 0x90, 0x10, 0x00, + 0xe3, 0x11, 0x00, 0x10, 0x1a, 0x00, 0x00, 0x1a, + 0xe5, 0x80, 0x10, 0x00, 0xe5, 0x8f, 0x51, 0x4c, + 0xe1, 0xa0, 0x22, 0x04, 0xe1, 0x82, 0x10, 0x0c, + 0xe5, 0x9f, 0x00, 0xac, 0xe0, 0x80, 0x02, 0x01, + 0xe5, 0x80, 0x70, 0x00, 0xe5, 0x80, 0x80, 0x04, + 0xe5, 0x9f, 0x10, 0x5c, 0xe5, 0x80, 0x10, 0x08, + 0xe5, 0x9f, 0x10, 0x58, 0xe5, 0x80, 0x10, 0x0c, + 0xe5, 0x9f, 0x00, 0x58, 0xe5, 0x90, 0x10, 0x00, + 0xe0, 0x84, 0x00, 0x01, 0xe3, 0xa0, 0x20, 0x01, + 0xe1, 0xa0, 0x00, 0x12, 0xe3, 0xa0, 0x10, 0x40, + 0xe2, 0x81, 0x14, 0x66, 0xe5, 0x81, 0x00, 0x00, + 0xe3, 0xa0, 0x10, 0x01, 0xe1, 0xa0, 0x0c, 0x11, + 0xe3, 0xa0, 0x10, 0xb8, 0xe2, 0x81, 0x14, 0x66, + 0xe5, 0x81, 0x00, 0x00, 0xe2, 0x8d, 0xd0, 0x14, + 0xe8, 0xbd, 0x81, 0xf0, 0xe5, 0x9f, 0x10, 0xf0, + 0xe2, 0x81, 0x10, 0x01, 0xe5, 0x8f, 0x10, 0xe8, + 0xea, 0xff, 0xff, 0xf4, 0xe5, 0x9f, 0xf0, 0x08, + 0xa0, 0x00, 0x05, 0xc4, 0x80, 0x00, 0x00, 0xb8, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x06, 0xf4, + 0xa0, 0x00, 0x04, 0x28, 0xa0, 0x00, 0x00, 0x00, + 0xa0, 0x00, 0x05, 0x50, 0x2c, 0x00, 0x1f, 0xe8, + 0x2c, 0x00, 0x1f, 0xea, 0x2c, 0x00, 0x1f, 0xf4, + 0x00, 0x00, 0x05, 0xe0, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x12, 0x2c, 0x00, 0x02, 0x00, + 0x64, 0x00, 0x04, 0x00, 0x64, 0x00, 0x00, 0x80, + 0x47, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0xc0, + 0x66, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xea, 0x00, 0x00, 0x07, 0xe1, 0xb0, 0xf0, 0x0e, + 0xe5, 0x9f, 0xf1, 0x00, 0xe2, 0x5e, 0xf0, 0x04, + 0xe2, 0x5e, 0xf0, 0x08, 0xea, 0x00, 0x00, 0x02, + 0xe5, 0x9f, 0xf0, 0xec, 0xe2, 0x5e, 0xf0, 0x04, + 0x2c, 0x00, 0x00, 0xe8, 0xe1, 0x0f, 0x00, 0x00, + 0xe3, 0xc0, 0x00, 0x1f, 0xe3, 0x80, 0x00, 0x1b, + 0xe1, 0x29, 0xf0, 0x00, 0xe5, 0x9f, 0xd0, 0xd8, + 0xe5, 0x9f, 0x00, 0xd8, 0xe0, 0x8d, 0xd0, 0x00, + 0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x1f, + 0xe3, 0x80, 0x00, 0x13, 0xe1, 0x29, 0xf0, 0x00, + 0xe5, 0x9f, 0xd0, 0xc4, 0xe5, 0x9f, 0x00, 0xc4, + 0xe0, 0x8d, 0xd0, 0x00, 0xe1, 0x0f, 0x00, 0x00, + 0xe3, 0xc0, 0x00, 0x1f, 0xe3, 0x80, 0x00, 0x12, + 0xe1, 0x29, 0xf0, 0x00, 0xe5, 0x9f, 0xd0, 0xb0, + 0xe5, 0x9f, 0x00, 0xb0, 0xe0, 0x8d, 0xd0, 0x00, + 0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x9f, + 0xe3, 0x80, 0x00, 0x10, 0xe1, 0x29, 0xf0, 0x00, + 0xe5, 0x9f, 0xd0, 0x60, 0xeb, 0x00, 0x00, 0x08, + 0xe5, 0x9f, 0x00, 0x64, 0xe5, 0x9f, 0x10, 0x5c, + 0xeb, 0x00, 0x37, 0x7f, 0xe5, 0x9f, 0x00, 0x60, + 0xe5, 0x9f, 0x10, 0x58, 0xeb, 0x00, 0x37, 0x7f, + 0xe5, 0x9f, 0xe0, 0x58, 0xe3, 0x8e, 0xe0, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0xe5, 0x9f, 0x00, 0x8c, + 0xe5, 0x9f, 0x10, 0x8c, 0xe5, 0x9f, 0x30, 0x8c, + 0xe1, 0x50, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x03, + 0xe1, 0x51, 0x00, 0x03, 0x34, 0x90, 0x20, 0x04, + 0x34, 0x81, 0x20, 0x04, 0x3a, 0xff, 0xff, 0xfb, + 0xe5, 0x9f, 0x10, 0x74, 0xe3, 0xa0, 0x20, 0x00, + 0xe1, 0x53, 0x00, 0x01, 0x34, 0x83, 0x20, 0x04, + 0x3a, 0xff, 0xff, 0xfc, 0xe1, 0x2f, 0xff, 0x1e, + 0x2e, 0x1b, 0xff, 0xf0, 0x2e, 0x1b, 0x7f, 0xf0, + 0x2e, 0x1b, 0x7f, 0xef, 0x2e, 0x08, 0xd7, 0x6c, + 0xcc, 0x1f, 0xff, 0xef, 0xcc, 0x1f, 0x7f, 0xf0, + 0x2e, 0x00, 0x1a, 0xf9, 0x2e, 0x02, 0x38, 0xbc, + 0x2e, 0x02, 0x39, 0xb4, 0x2e, 0x08, 0x33, 0xa4, + 0x00, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x23, 0xa4, + 0x00, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x2b, 0xa4, + 0x00, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x97, 0x1c, + 0xe5, 0x9f, 0xf0, 0x04, 0xe5, 0x9f, 0xf0, 0x04, + 0xe5, 0x9f, 0xf0, 0x04, 0x2e, 0x08, 0x97, 0x1c, + 0x2e, 0x08, 0x97, 0x1d, 0x2e, 0x08, 0x97, 0x1e, + 0x2e, 0x03, 0xa9, 0xd0, 0x2e, 0x08, 0x00, 0x00, + 0x2e, 0x08, 0x3c, 0x20, 0x2e, 0x08, 0xd7, 0x68, + 0x1d, 0x77, 0x1e, 0x16, 0x03, 0x00, 0x03, 0x03, + 0x1d, 0x7f, 0x50, 0x50, 0x4f, 0x5d, 0x49, 0x5d, + 0x40, 0x4a, 0x44, 0x43, 0x01, 0x49, 0x4d, 0x56, + 0x48, 0x4b, 0x5d, 0x4f, 0x5d, 0x4d, 0x4f, 0x0a, + 0x78, 0x71, 0x73, 0x7f, 0x70, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x1b, 0x12, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x08, 0x0f, 0x0f, 0x0d, + 0x13, 0x0d, 0x11, 0x0e, 0x07, 0x08, 0x09, 0x0d, + 0x0d, 0x15, 0x10, 0x05, 0x08, 0x08, 0x09, 0x0e, + 0x07, 0x08, 0x07, 0x07, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x07, 0x07, + 0x0e, 0x0e, 0x0e, 0x0d, 0x18, 0x0f, 0x10, 0x11, + 0x11, 0x10, 0x0f, 0x13, 0x11, 0x06, 0x0c, 0x10, + 0x0d, 0x13, 0x11, 0x13, 0x10, 0x13, 0x11, 0x10, + 0x0e, 0x11, 0x0f, 0x17, 0x0f, 0x10, 0x0f, 0x07, + 0x07, 0x07, 0x0c, 0x0d, 0x08, 0x0d, 0x0e, 0x0c, + 0x0e, 0x0d, 0x07, 0x0e, 0x0e, 0x05, 0x06, 0x0c, + 0x06, 0x14, 0x0e, 0x0d, 0x0e, 0x0e, 0x08, 0x0c, + 0x07, 0x0e, 0x0b, 0x11, 0x0b, 0x0c, 0x0c, 0x08, + 0x06, 0x08, 0x0e, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x98, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x98, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xc0, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x19, 0x80, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x0c, 0xc0, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x0c, 0xc0, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x19, 0x80, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, + 0x0c, 0xc0, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x0c, 0xc0, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x60, 0x00, 0x00, 0x06, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x60, 0x00, 0x00, 0x0e, 0xe0, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x60, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xc0, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xc0, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xc0, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xf0, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x03, 0xe0, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x30, 0x78, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x30, 0x1c, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x3e, 0x60, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x0c, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x70, 0x60, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x0c, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, + 0x60, 0xe0, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, + 0x30, 0x70, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x37, 0x1c, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, + 0x71, 0xe0, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x33, 0xf8, 0x00, 0x00, 0xe0, 0x0e, 0x00, 0x00, + 0x7f, 0xe0, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0xf0, 0x00, 0x00, 0xc0, 0x06, 0x00, 0x00, + 0x1e, 0x30, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x06, 0x30, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, + 0x1e, 0x03, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x33, 0x07, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x7a, 0xf0, 0x00, 0x00, + 0x61, 0x86, 0x00, 0x00, 0x1c, 0xe0, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x0c, 0x60, 0x00, 0x00, 0x62, 0x30, 0x00, 0x00, + 0x61, 0x8e, 0x00, 0x00, 0x18, 0x60, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x0c, 0x60, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, + 0x61, 0x8c, 0x00, 0x00, 0x18, 0x60, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, + 0x61, 0x9c, 0x00, 0x00, 0x0c, 0xe0, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, + 0x61, 0xb8, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0xc0, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, + 0x33, 0x30, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0xc0, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, + 0x1e, 0x73, 0xc0, 0x00, 0x1f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0xc0, 0x00, 0x00, 0x02, 0xe0, 0x00, 0x00, + 0x00, 0x66, 0x60, 0x00, 0x39, 0xcc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x39, 0xc0, 0x00, 0x00, 0x02, 0x70, 0x00, 0x00, + 0x00, 0xec, 0x30, 0x00, 0x70, 0xdc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x02, 0x30, 0x00, 0x00, + 0x00, 0xcc, 0x30, 0x00, 0x60, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x62, 0x30, 0x00, 0x00, + 0x01, 0xcc, 0x30, 0x00, 0x60, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0x80, 0x00, 0x00, 0x72, 0x70, 0x00, 0x00, + 0x01, 0x8c, 0x30, 0x00, 0x70, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x3a, 0xf0, 0x00, 0x00, + 0x03, 0x8c, 0x30, 0x00, 0x38, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x03, 0x06, 0x60, 0x00, 0x3f, 0xee, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x63, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x07, 0x03, 0xc0, 0x00, 0x0f, 0xcc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xc0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x1d, 0x80, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x06, 0xc0, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x19, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x0e, 0xc0, 0x00, 0x00, + 0x3f, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x01, 0xc0, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x01, 0xc0, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00, + 0x7f, 0xe0, 0x00, 0x00, 0x67, 0x80, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x1c, 0xc0, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x38, 0xc0, 0x00, 0x00, + 0x60, 0x70, 0x00, 0x00, 0x78, 0xe0, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x30, 0xe0, 0x00, 0x00, + 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x70, 0xc0, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x60, 0x70, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x38, 0x60, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x30, 0x0f, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x38, 0x06, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x00, + 0x07, 0xc0, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x0f, 0xfc, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x0f, 0xfe, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x30, 0x1e, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3c, 0x07, 0x80, 0x00, 0x38, 0x06, 0x00, 0x00, + 0x0f, 0xfe, 0x00, 0x00, 0x07, 0xc1, 0xe0, 0x00, + 0x07, 0xc0, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x1e, 0x1e, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x30, 0x3c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3c, 0x07, 0x80, 0x00, 0x3c, 0x06, 0x00, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x0e, 0x00, 0x70, 0x00, + 0x06, 0xc0, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, + 0x38, 0x07, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0x03, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x30, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3c, 0x07, 0x80, 0x00, 0x3e, 0x06, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x1c, 0x79, 0xb8, 0x00, + 0x0e, 0xe0, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, + 0x30, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x03, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x30, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x36, 0x0d, 0x80, 0x00, 0x36, 0x06, 0x00, 0x00, + 0x30, 0x01, 0x80, 0x00, 0x39, 0xff, 0x9c, 0x00, + 0x0c, 0x60, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x31, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x36, 0x0d, 0x80, 0x00, 0x37, 0x06, 0x00, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x31, 0xcf, 0x9c, 0x00, + 0x0c, 0x60, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x37, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x36, 0x0d, 0x80, 0x00, 0x33, 0x06, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x33, 0x87, 0x0c, 0x00, + 0x1c, 0x70, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x3f, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x37, 0x1d, 0x80, 0x00, 0x31, 0x86, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x77, 0x03, 0x0c, 0x00, + 0x18, 0x30, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x60, 0x3f, 0x80, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x33, 0x19, 0x80, 0x00, 0x31, 0xc6, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x67, 0x03, 0x0c, 0x00, + 0x38, 0x38, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x3f, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x3d, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x33, 0x19, 0x80, 0x00, 0x30, 0xc6, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x66, 0x03, 0x0c, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x01, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x33, 0x19, 0x80, 0x00, 0x30, 0x66, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x66, 0x07, 0x1c, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x70, 0x03, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x01, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x30, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x31, 0xb1, 0x80, 0x00, 0x30, 0x76, 0x00, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x66, 0x06, 0x18, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x07, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x01, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x00, 0x00, + 0x30, 0x38, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x31, 0xb1, 0x80, 0x00, 0x30, 0x36, 0x00, 0x00, + 0x30, 0x01, 0x80, 0x00, 0x67, 0x0e, 0x38, 0x00, + 0x60, 0x0c, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x38, 0x06, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x00, 0x00, + 0x30, 0x3c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x31, 0xf1, 0x80, 0x00, 0x30, 0x3e, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x77, 0x1e, 0x70, 0x00, + 0x60, 0x0c, 0x00, 0x00, 0x30, 0x1e, 0x00, 0x00, + 0x1e, 0x1e, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1e, 0x0f, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, + 0x30, 0x1c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x31, 0xf1, 0x80, 0x00, 0x30, 0x1e, 0x00, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x73, 0xff, 0xe0, 0x00, + 0xe0, 0x0e, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x0f, 0xfc, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0f, 0xff, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, + 0x30, 0x0e, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x30, 0xe1, 0x80, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x0f, 0xfe, 0x00, 0x00, 0x39, 0xe7, 0xc0, 0x00, + 0xc0, 0x06, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x07, 0xf0, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x03, 0xfc, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x30, 0x07, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x30, 0xe1, 0x80, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x3c, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x07, 0xf0, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0xc0, 0x06, 0x00, 0x00, + 0xc0, 0x38, 0x06, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0xe0, 0x07, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x0f, 0xfe, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0xe0, 0x0e, 0x00, 0x00, + 0xe0, 0x7c, 0x0e, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x1e, 0x00, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x30, 0x1e, 0x00, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, + 0xe0, 0x7c, 0x0e, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x30, 0x1c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x0e, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x60, 0x6c, 0x0c, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x01, 0x80, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x60, 0xec, 0x0c, 0x00, 0x0e, 0xe0, 0x00, 0x00, + 0x1c, 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x70, 0xee, 0x1c, 0x00, 0x06, 0xc0, 0x00, 0x00, + 0x0e, 0x70, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x30, 0x1e, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x70, 0xc6, 0x1c, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x06, 0x60, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, + 0x30, 0xc6, 0x18, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x07, 0xf8, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x18, 0x30, 0x00, 0x00, + 0x31, 0xc7, 0x18, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x30, 0xe0, 0x00, 0x00, + 0x00, 0x7c, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x31, 0x83, 0x18, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x00, 0xc0, 0x00, 0x30, 0x70, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00, + 0x39, 0x83, 0x38, 0x00, 0x0e, 0xe0, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x30, 0x38, 0x00, 0x00, + 0x60, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x0e, 0xe0, 0x00, 0x00, + 0x1b, 0x83, 0xb0, 0x00, 0x0e, 0xe0, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x31, 0x80, 0x00, 0x30, 0x38, 0x00, 0x00, + 0x70, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x00, 0x00, 0x0e, 0xe0, 0x00, 0x00, + 0x1b, 0x01, 0xb0, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0x3f, 0x80, 0x00, 0x30, 0x1c, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x1f, 0x01, 0xf0, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1e, 0x1f, 0x00, 0x00, 0x30, 0x1e, 0x00, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x1c, 0x1c, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x1f, 0x01, 0xf0, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0f, 0xff, 0x80, 0x00, 0x30, 0x0e, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x0f, 0xf8, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x1e, 0x00, 0xe0, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x03, 0xff, 0xc0, 0x00, 0x30, 0x07, 0x00, 0x00, + 0x07, 0xf0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x07, 0xf0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x0e, 0x00, 0xe0, 0x00, 0xe0, 0x0e, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x33, 0xc0, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x0f, 0xb0, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x33, 0xc0, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x37, 0xcf, 0x80, 0x00, 0x33, 0xc0, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3f, 0xdf, 0x80, 0x00, 0x37, 0xe0, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x3c, 0x70, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x3c, 0x70, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x31, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3c, 0xf9, 0xc0, 0x00, 0x3c, 0x70, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x70, 0x60, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x38, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x33, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x70, 0xc0, 0x00, 0x38, 0x30, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xe0, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x7f, 0xf0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x60, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x33, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x60, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x33, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xe0, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x70, 0x60, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x70, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x31, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x71, 0xe0, 0x00, 0x00, 0x3c, 0x70, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xe0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x30, 0x00, 0x00, 0x33, 0xc0, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xc0, 0x00, 0x30, 0x30, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x37, 0xc0, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0xc0, 0x60, 0x00, 0x00, + 0xc0, 0x81, 0x80, 0x00, 0xe0, 0x60, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x3f, 0xf0, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0xc0, 0x60, 0x00, 0x00, + 0xc1, 0xc1, 0x80, 0x00, 0x60, 0xc0, 0x00, 0x00, + 0x60, 0xe0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x3c, 0x70, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, + 0xe1, 0xc1, 0x80, 0x00, 0x31, 0xc0, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x60, 0xc0, 0x00, 0x00, + 0x63, 0xe3, 0x00, 0x00, 0x3b, 0x80, 0x00, 0x00, + 0x30, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x3e, 0x08, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, + 0x63, 0x63, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x31, 0xc0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x7f, 0x98, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x7f, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, + 0x67, 0x63, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x39, 0xc0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x67, 0xf8, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1f, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, + 0x37, 0x76, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x19, 0x80, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x41, 0xf0, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x3b, 0x80, 0x00, 0x00, + 0x36, 0x36, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x19, 0x80, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, + 0x60, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0x3e, 0x3e, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x1d, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x60, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x30, 0x70, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x1e, 0x3c, 0x00, 0x00, 0x3b, 0x80, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x3c, 0x70, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0xf0, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x1c, 0x1c, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x37, 0xe0, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x1c, 0x1c, 0x00, 0x00, 0x60, 0xc0, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x02, 0x00, 0x00, 0x33, 0xc0, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x0f, 0x30, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x0c, 0x18, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x0a, 0x12, 0x13, 0x10, 0x17, 0x10, 0x15, 0x10, + 0x08, 0x09, 0x0a, 0x10, 0x10, 0x1a, 0x13, 0x06, + 0x0a, 0x0a, 0x0b, 0x11, 0x08, 0x0a, 0x08, 0x08, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x08, 0x08, 0x11, 0x11, 0x11, 0x10, + 0x1d, 0x13, 0x13, 0x15, 0x15, 0x13, 0x12, 0x17, + 0x15, 0x07, 0x0f, 0x13, 0x10, 0x17, 0x15, 0x17, + 0x13, 0x17, 0x15, 0x13, 0x13, 0x15, 0x13, 0x1e, + 0x13, 0x13, 0x12, 0x08, 0x08, 0x08, 0x0e, 0x10, + 0x0a, 0x10, 0x10, 0x0f, 0x10, 0x10, 0x08, 0x10, + 0x10, 0x07, 0x07, 0x0e, 0x07, 0x19, 0x10, 0x10, + 0x10, 0x10, 0x0a, 0x0f, 0x08, 0x10, 0x0d, 0x15, + 0x0d, 0x0d, 0x0e, 0x0a, 0x08, 0x0a, 0x11, 0x16, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x07, 0xff, 0x80, 0x00, 0x0e, 0x38, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1c, 0x00, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x0f, 0xff, 0xe0, 0x00, 0x0e, 0x38, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0c, 0x00, 0x00, + 0x03, 0xb8, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x1f, 0x83, 0xf0, 0x00, 0x0e, 0x38, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x07, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, + 0x78, 0x00, 0x3c, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x0f, 0x1e, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x78, 0x00, 0x3c, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, + 0x0e, 0x0e, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x70, 0x00, 0x1c, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, + 0x0e, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x70, 0x00, 0x1c, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x70, 0x00, 0x1c, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, + 0x1c, 0x07, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x70, 0x00, 0x1c, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0x38, 0x3e, 0x00, 0x00, + 0x1f, 0xff, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, + 0x70, 0x00, 0x1c, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0x38, 0x1f, 0x00, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x78, 0x00, 0x3c, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x3f, 0x9c, 0x00, 0x00, + 0x78, 0x00, 0x3c, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x3c, 0x00, 0x78, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x3c, 0x01, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x78, 0x03, 0xc0, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x1e, 0x00, 0xf8, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x3c, 0x01, 0xe0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x39, 0xc3, 0x80, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x70, 0x3c, 0x00, 0x00, + 0x1f, 0x83, 0xf0, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x1f, 0x07, 0xc0, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x39, 0xe7, 0x00, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x78, 0x7c, 0x00, 0x00, + 0x0f, 0xff, 0xe0, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x0f, 0xff, 0x80, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xff, 0x00, 0x00, + 0xe0, 0x01, 0xe0, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x03, 0xff, 0xc0, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x07, 0xff, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x7c, 0x00, 0x00, + 0xe0, 0x00, 0xe0, 0x00, 0x1f, 0x8e, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x03, 0xfe, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, + 0x0f, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x60, 0x00, + 0x03, 0xe0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x01, 0xc0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x1f, 0xc0, 0xe0, 0x00, + 0x07, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x0f, 0x3c, 0x00, 0x00, + 0x3d, 0xb8, 0x00, 0x00, 0x38, 0xe0, 0xc0, 0x00, + 0x0f, 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x76, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, + 0x79, 0xbc, 0x00, 0x00, 0x30, 0x61, 0xc0, 0x00, + 0x0e, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x7f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, + 0x71, 0x9c, 0x00, 0x00, 0x30, 0x61, 0x80, 0x00, + 0x0e, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0x71, 0x80, 0x00, 0x00, 0x30, 0x63, 0x80, 0x00, + 0x0e, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x80, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0x79, 0x80, 0x00, 0x00, 0x30, 0x63, 0x00, 0x00, + 0x0f, 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0x7d, 0x80, 0x00, 0x00, 0x30, 0x67, 0x00, 0x00, + 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x39, 0xc0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x00, 0x00, + 0x3f, 0x80, 0x00, 0x00, 0x38, 0xe6, 0x00, 0x00, + 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x19, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x1f, 0xce, 0x00, 0x00, + 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x0f, 0xf8, 0x00, 0x00, 0x0f, 0x8c, 0x7c, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x70, 0x00, 0x00, + 0x01, 0xfc, 0x00, 0x00, 0x00, 0x1c, 0xfe, 0x00, + 0x3e, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0xf0, 0x00, 0x00, + 0x01, 0xbe, 0x00, 0x00, 0x00, 0x19, 0xc7, 0x00, + 0x38, 0x73, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0x01, 0x9e, 0x00, 0x00, 0x00, 0x39, 0x83, 0x00, + 0x78, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0x01, 0x8e, 0x00, 0x00, 0x00, 0x31, 0x83, 0x00, + 0x70, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0x71, 0x8e, 0x00, 0x00, 0x00, 0x71, 0x83, 0x00, + 0x70, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x71, 0x8e, 0x00, 0x00, 0x00, 0x61, 0x83, 0x00, + 0x70, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x79, 0x9e, 0x00, 0x00, 0x00, 0xe1, 0x83, 0x00, + 0x78, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x79, 0xe0, 0x00, 0x00, + 0x3d, 0xbc, 0x00, 0x00, 0x00, 0xc1, 0xc7, 0x00, + 0x3c, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x01, 0xc0, 0xfe, 0x00, + 0x1f, 0xfb, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, + 0x0f, 0xf0, 0x00, 0x00, 0x01, 0x80, 0x7c, 0x00, + 0x0f, 0xe1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xc0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x0f, 0xe0, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x03, 0xf0, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x0f, 0xf8, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x3c, 0x3c, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, + 0x7c, 0x7c, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, + 0x00, 0xf8, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x3e, 0x3e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x3c, 0x3c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, + 0x78, 0x3c, 0x00, 0x00, 0x70, 0x3c, 0x00, 0x00, + 0x01, 0xf8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x78, 0x0e, 0x00, 0x00, + 0x78, 0x1e, 0x00, 0x00, 0x1e, 0xe0, 0x00, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x01, 0xf8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x1c, 0xe0, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x03, 0xb8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x3f, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x10, 0xe0, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, + 0x07, 0x38, 0x00, 0x00, 0x7b, 0xe0, 0x00, 0x00, + 0x73, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x1c, 0x38, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x07, 0xfc, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x3c, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x0f, 0x38, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, + 0x77, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x03, 0xfc, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, + 0x0e, 0x38, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, + 0x7f, 0xfc, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x0f, 0xe0, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x1c, 0x38, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, + 0x7c, 0x3e, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x3c, 0x3e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, + 0x38, 0x38, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x78, 0x1e, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x3c, 0x3c, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x01, 0xe0, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x78, 0x38, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x78, 0x1e, 0x00, 0x00, 0x1f, 0xee, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x03, 0xfc, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x0f, 0xce, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xfc, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x3f, 0x80, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x78, 0x1e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x7f, 0xfe, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x78, 0x0e, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x70, 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x38, 0x1e, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x78, 0x1e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x3c, 0x3c, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x7c, 0x3e, 0x00, 0x00, 0x78, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x7f, 0xfc, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x7f, 0xfc, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x0f, 0xf8, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x1f, 0xf8, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x7f, 0xfc, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x07, 0xe0, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0xf0, 0x00, 0x01, 0xf0, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x01, 0xe0, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x7c, 0x00, + 0x3c, 0x00, 0xe0, 0x00, 0x01, 0xff, 0x00, 0x00, + 0x00, 0x7f, 0xfe, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x07, 0xff, 0xc0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x7c, 0x00, + 0x3c, 0x00, 0xe0, 0x00, 0x07, 0xff, 0x80, 0x00, + 0x01, 0xff, 0xff, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x3f, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xe0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7e, 0x00, 0xfc, 0x00, + 0x3e, 0x00, 0xe0, 0x00, 0x0f, 0xff, 0xe0, 0x00, + 0x03, 0xf8, 0x3f, 0x80, 0x03, 0xb8, 0x00, 0x00, + 0x38, 0x0f, 0x80, 0x00, 0x1f, 0x83, 0xe0, 0x00, + 0x38, 0x07, 0xc0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1f, 0x83, 0xf0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7e, 0x00, 0xfc, 0x00, + 0x3f, 0x00, 0xe0, 0x00, 0x1f, 0x83, 0xf0, 0x00, + 0x07, 0xc0, 0x07, 0xc0, 0x07, 0xbc, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x3e, 0x01, 0xe0, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7f, 0x01, 0xfc, 0x00, + 0x3f, 0x00, 0xe0, 0x00, 0x3e, 0x00, 0xf8, 0x00, + 0x07, 0x80, 0x03, 0xe0, 0x07, 0x1c, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x3c, 0x00, 0xf0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x77, 0x01, 0xdc, 0x00, + 0x3b, 0x80, 0xe0, 0x00, 0x3c, 0x00, 0x78, 0x00, + 0x0f, 0x0f, 0x1d, 0xe0, 0x07, 0x1c, 0x00, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x78, 0x00, 0x70, 0x00, + 0x38, 0x00, 0xf0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x30, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x77, 0x01, 0xdc, 0x00, + 0x3b, 0xc0, 0xe0, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x1e, 0x3f, 0xbc, 0xf0, 0x0f, 0x1e, 0x00, 0x00, + 0x38, 0x0f, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x70, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x77, 0x83, 0xdc, 0x00, + 0x39, 0xc0, 0xe0, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x1e, 0x7f, 0xfc, 0xf0, 0x0e, 0x0e, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x70, 0x00, 0x3f, 0xff, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x3f, 0xff, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x73, 0x83, 0x9c, 0x00, + 0x38, 0xe0, 0xe0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x1c, 0xf9, 0xf8, 0x70, 0x0e, 0x0e, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x70, 0x00, 0x3f, 0xff, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x3f, 0xff, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3b, 0xe0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x73, 0x83, 0x9c, 0x00, + 0x38, 0xe0, 0xe0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x3c, 0xf0, 0xf8, 0x70, 0x1e, 0x0f, 0x00, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x70, 0x00, 0x3f, 0xff, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x0f, 0xf8, 0x00, + 0x3f, 0xff, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x73, 0xc7, 0x9c, 0x00, + 0x38, 0x70, 0xe0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x39, 0xe0, 0x78, 0x70, 0x1c, 0x07, 0x00, 0x00, + 0x38, 0x07, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x70, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x0f, 0xf8, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x71, 0xc7, 0x1c, 0x00, + 0x38, 0x38, 0xe0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x39, 0xe0, 0x78, 0x70, 0x1f, 0xff, 0x00, 0x00, + 0x38, 0x03, 0xc0, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x70, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x0f, 0xf8, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3e, 0x78, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x71, 0xc7, 0x1c, 0x00, + 0x38, 0x38, 0xe0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x39, 0xc0, 0x70, 0x70, 0x3f, 0xff, 0x80, 0x00, + 0x38, 0x01, 0xc0, 0x00, 0x78, 0x00, 0x60, 0x00, + 0x38, 0x00, 0xf0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x00, 0x38, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x71, 0xef, 0x1c, 0x00, + 0x38, 0x1c, 0xe0, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x39, 0xc0, 0xf0, 0xf0, 0x3f, 0xff, 0x80, 0x00, + 0x38, 0x01, 0xc0, 0x00, 0x78, 0x00, 0xf0, 0x00, + 0x38, 0x00, 0xf0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x00, 0x38, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x70, 0x38, 0x00, 0x00, 0x38, 0x3e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0xee, 0x1c, 0x00, + 0x38, 0x1e, 0xe0, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x39, 0xc0, 0xf0, 0xe0, 0x38, 0x03, 0x80, 0x00, + 0x38, 0x01, 0xc0, 0x00, 0x3c, 0x00, 0xf0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x70, 0x38, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0xee, 0x1c, 0x00, + 0x38, 0x0e, 0xe0, 0x00, 0x3c, 0x00, 0x78, 0x00, + 0x39, 0xe1, 0xe1, 0xc0, 0x78, 0x03, 0xc0, 0x00, + 0x38, 0x03, 0xc0, 0x00, 0x3e, 0x01, 0xe0, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x78, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x78, 0x78, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0xfe, 0x1c, 0x00, + 0x38, 0x07, 0xe0, 0x00, 0x1e, 0x00, 0xf8, 0x00, + 0x3d, 0xe3, 0xe3, 0xc0, 0x70, 0x01, 0xc0, 0x00, + 0x38, 0x07, 0xc0, 0x00, 0x1f, 0x87, 0xe0, 0x00, + 0x38, 0x07, 0xc0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1f, 0x81, 0xf8, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x7c, 0xf8, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x7c, 0x1c, 0x00, + 0x38, 0x07, 0xe0, 0x00, 0x1f, 0x83, 0xf0, 0x00, + 0x3c, 0xff, 0xe7, 0x80, 0x70, 0x01, 0xc0, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x3f, 0xf0, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x7c, 0x1c, 0x00, + 0x38, 0x03, 0xe0, 0x00, 0x0f, 0xff, 0xe0, 0x00, + 0x1e, 0xfe, 0xff, 0x00, 0xe0, 0x01, 0xe0, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x3f, 0xf0, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x7c, 0x1c, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x03, 0xff, 0xc0, 0x00, + 0x1e, 0x3c, 0x7c, 0x78, 0xe0, 0x00, 0xe0, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, + 0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x0f, 0xc0, 0x00, 0x00, 0x38, 0x01, 0xe0, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x38, 0x1c, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x00, 0xfe, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xc0, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xf8, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x7f, 0xff, 0xc0, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0xe0, 0x00, 0xe0, 0x00, 0xe0, 0x0f, 0x80, 0x38, + 0x78, 0x03, 0xc0, 0x00, 0xf0, 0x01, 0xe0, 0x00, + 0x7f, 0xff, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x07, 0xff, 0xc0, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x7f, 0xff, 0xc0, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0xf0, 0x01, 0xe0, 0x00, 0xf0, 0x0f, 0x80, 0x78, + 0x3c, 0x07, 0x80, 0x00, 0x70, 0x03, 0xc0, 0x00, + 0x7f, 0xff, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xe0, 0x00, + 0x3f, 0xff, 0xc0, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x7f, 0xff, 0xc0, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0xf0, 0x1f, 0xc0, 0x78, + 0x1c, 0x07, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x7f, 0xff, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x07, 0xc0, 0x00, 0x1f, 0x83, 0xf0, 0x00, + 0x38, 0x03, 0xe0, 0x00, 0x3e, 0x0f, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x70, 0x01, 0xc0, 0x00, 0x70, 0x1f, 0xc0, 0x70, + 0x1e, 0x0f, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x03, 0xc0, 0x00, 0x1e, 0x00, 0xf8, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x78, 0x03, 0xc0, 0x00, 0x70, 0x1d, 0xc0, 0x70, + 0x0f, 0x1e, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x01, 0xc0, 0x00, 0x3c, 0x00, 0x78, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x78, 0x1d, 0xc0, 0xf0, + 0x07, 0xbc, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, + 0x00, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x1c, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x01, 0xc0, 0x00, 0x38, 0x00, 0x3c, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x38, 0x07, 0x80, 0x00, 0x78, 0x3d, 0xe0, 0xf0, + 0x07, 0xbc, 0x00, 0x00, 0x0f, 0x1e, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x1c, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x01, 0xc0, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x3c, 0x07, 0x80, 0x00, 0x38, 0x38, 0xe0, 0xe0, + 0x03, 0xf8, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x03, 0xc0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x38, 0x03, 0xe0, 0x00, 0x1f, 0x80, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x1c, 0x07, 0x00, 0x00, 0x38, 0x38, 0xe0, 0xe0, + 0x01, 0xf0, 0x00, 0x00, 0x07, 0xbc, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x07, 0xc0, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x3f, 0xff, 0xc0, 0x00, 0x0f, 0xf8, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x3c, 0x38, 0xe1, 0xe0, + 0x00, 0xe0, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x01, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x78, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x3f, 0xff, 0x80, 0x00, 0x03, 0xfe, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x1e, 0x0f, 0x00, 0x00, 0x3c, 0x78, 0xf1, 0xe0, + 0x01, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x70, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x3f, 0xff, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x0e, 0x0e, 0x00, 0x00, 0x1c, 0x70, 0x71, 0xc0, + 0x01, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, + 0x38, 0x3c, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x0f, 0x1e, 0x00, 0x00, 0x1c, 0x70, 0x71, 0xc0, + 0x03, 0xb8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x38, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x1e, 0x70, 0x73, 0xc0, + 0x07, 0xbc, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x08, 0x38, 0x00, + 0x38, 0x0f, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, + 0x07, 0x1c, 0x00, 0x00, 0x1e, 0xf0, 0x7b, 0xc0, + 0x0f, 0x1e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x0e, 0x78, 0x00, + 0x38, 0x07, 0x80, 0x00, 0x78, 0x03, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x3c, 0x01, 0xe0, 0x00, + 0x07, 0xbc, 0x00, 0x00, 0x0e, 0xe0, 0x3b, 0x80, + 0x0f, 0x1e, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1e, 0x0f, 0xf0, 0x00, + 0x38, 0x03, 0x80, 0x00, 0x78, 0x07, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x3c, 0x01, 0xe0, 0x00, + 0x03, 0xb8, 0x00, 0x00, 0x0e, 0xe0, 0x3b, 0x80, + 0x1e, 0x0f, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1f, 0x83, 0xe0, 0x00, + 0x38, 0x03, 0xc0, 0x00, 0x3e, 0x0f, 0x80, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x1f, 0x07, 0xc0, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x0f, 0xe0, 0x3f, 0x80, + 0x3c, 0x07, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, + 0x38, 0x01, 0xe0, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00, + 0x03, 0xf8, 0x00, 0x00, 0x0f, 0xe0, 0x3f, 0x80, + 0x38, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0xff, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf8, 0x00, + 0x38, 0x00, 0xe0, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, + 0x01, 0xf0, 0x00, 0x00, 0x07, 0xc0, 0x1f, 0x00, + 0x78, 0x03, 0xc0, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0xff, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x01, 0xff, 0x3c, 0x00, + 0x38, 0x00, 0xf0, 0x00, 0x07, 0xf8, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, + 0x01, 0xf0, 0x00, 0x00, 0x07, 0xc0, 0x1f, 0x00, + 0xf0, 0x01, 0xe0, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0xff, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, + 0x39, 0xf0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x0f, 0x9c, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, + 0x39, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x39, 0xf0, 0xf8, 0x00, + 0x39, 0xf0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3f, 0xfb, 0xfc, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x3e, 0x3c, 0x00, 0x00, 0x3c, 0x78, 0x00, 0x00, + 0x3c, 0x7c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x3e, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x1e, 0x00, + 0x3e, 0x3c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x38, 0x3c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x1e, 0x0e, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x1e, 0x00, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x78, 0x3c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3b, 0xc0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0x9c, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3b, 0xc0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x70, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x3c, 0x1e, 0x00, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x78, 0x3c, 0x00, 0x00, 0x78, 0x0e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x3c, 0x00, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x38, 0x3c, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x7c, 0x00, 0x00, + 0x3e, 0x3c, 0x00, 0x00, 0x3c, 0x78, 0x00, 0x00, + 0x3c, 0x7c, 0x00, 0x00, 0x3e, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x8e, 0x00, 0x00, + 0x39, 0xf0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x0f, 0x9c, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x00, + 0x38, 0x1c, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7c, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x39, 0xf0, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, + 0x3b, 0xc0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0xe0, 0x38, 0x00, 0x01, 0xe0, 0x70, 0x3c, 0x00, + 0xe0, 0x38, 0x00, 0x00, 0xe0, 0x38, 0x00, 0x00, + 0x7f, 0xf8, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0xf0, 0x78, 0x00, 0x00, 0xe0, 0x70, 0x38, 0x00, + 0x70, 0x70, 0x00, 0x00, 0xf0, 0x78, 0x00, 0x00, + 0x7f, 0xf8, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3e, 0x3c, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x78, 0x78, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0xe0, 0xf8, 0x38, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x1f, 0x01, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x70, 0x38, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0xe0, 0xf8, 0x38, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x7f, 0xe3, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x38, 0x1e, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x70, 0xd8, 0x70, 0x00, + 0x1d, 0xc0, 0x00, 0x00, 0x78, 0xf0, 0x00, 0x00, + 0x01, 0xe0, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x7f, 0xff, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x71, 0xdc, 0x70, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x61, 0xff, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x71, 0x8c, 0x70, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x40, 0x7c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x31, 0x8c, 0x60, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x1d, 0xc0, 0x00, 0x00, 0x33, 0x8e, 0xe0, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x1d, 0xc0, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x38, 0x0e, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x1d, 0xc0, 0x00, 0x00, 0x3b, 0x06, 0xe0, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x1d, 0xc0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3c, 0x1e, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x0d, 0x80, 0x00, 0x00, 0x1b, 0x06, 0xe0, 0x00, + 0x1d, 0xc0, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3c, 0x1c, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x78, 0x1c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x1f, 0x07, 0xc0, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3e, 0x3c, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00, + 0x0f, 0x80, 0x00, 0x00, 0x1e, 0x07, 0xc0, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x1e, 0x03, 0xc0, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00, + 0x39, 0xe0, 0x00, 0x00, 0x07, 0x9c, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x0e, 0x03, 0x80, 0x00, + 0xe0, 0x38, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, + 0x00, 0x00, 0x00, 0x27, 0x1a, 0x1a, 0x1a, 0x1a, + 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, + 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, + 0x1a, 0x1a, 0x1a, 0x1a, 0x0b, 0x15, 0x17, 0x13, + 0x1a, 0x13, 0x19, 0x13, 0x09, 0x0b, 0x0c, 0x13, + 0x13, 0x1e, 0x17, 0x06, 0x0b, 0x0b, 0x0d, 0x14, + 0x09, 0x0b, 0x09, 0x09, 0x13, 0x13, 0x13, 0x13, + 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x09, 0x09, + 0x14, 0x14, 0x14, 0x13, 0x23, 0x17, 0x17, 0x19, + 0x19, 0x17, 0x15, 0x1a, 0x19, 0x09, 0x11, 0x17, + 0x13, 0x1d, 0x19, 0x1a, 0x17, 0x1a, 0x19, 0x17, + 0x15, 0x19, 0x17, 0x22, 0x17, 0x15, 0x15, 0x09, + 0x09, 0x09, 0x11, 0x13, 0x0b, 0x12, 0x12, 0x11, + 0x12, 0x12, 0x0a, 0x12, 0x13, 0x07, 0x07, 0x11, + 0x07, 0x1b, 0x13, 0x12, 0x12, 0x12, 0x0b, 0x11, + 0x09, 0x13, 0x11, 0x17, 0x10, 0x11, 0x10, 0x0b, + 0x09, 0x0b, 0x14, 0x1a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, + 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, + 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, + 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, + 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, + 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, + 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, + 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, + 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, + 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, + 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, + 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, + 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe3, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe3, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe3, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, + 0x03, 0xff, 0xf0, 0x00, 0x00, 0x07, 0x1c, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, + 0x1c, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, + 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, + 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, + 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, + 0x07, 0xe1, 0xf8, 0x00, 0x00, 0x07, 0x1c, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, + 0x1c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x07, 0x00, 0x00, 0x00, 0x00, 0xee, + 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, + 0x0f, 0x80, 0x7c, 0x00, 0x00, 0x07, 0x1c, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, + 0x1c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x01, 0xef, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x01, 0xc7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x07, 0x00, 0x00, 0x00, 0x03, 0xc7, + 0x80, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x03, 0xf0, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x0e, 0x00, 0x00, 0x00, 0x03, 0xc7, + 0x80, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xfc, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x0e, 0x00, 0x00, 0x00, 0x03, 0x83, + 0x80, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x1f, 0xfe, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x07, 0x83, + 0xc0, 0x00, 0x00, 0x78, 0x1f, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x3e, 0x1f, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x07, 0x01, + 0xc0, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x3c, 0x0f, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x0f, 0x01, + 0xe0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x78, 0x07, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x1f, 0x00, 0x00, 0x00, 0x0f, 0x01, + 0xe0, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x0f, 0x80, 0x00, 0x00, 0x0f, 0xff, + 0xe0, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, + 0x00, 0x1c, 0x07, 0xc0, 0x00, 0x00, 0x1f, 0xff, + 0xf0, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, + 0x00, 0x1c, 0x01, 0xe0, 0x00, 0x00, 0x1f, 0xff, + 0xf0, 0x00, 0x00, 0x3f, 0xf7, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x0f, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, 0x1c, 0x00, + 0x70, 0x00, 0x00, 0x7c, 0x07, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x3c, 0x00, + 0x78, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x20, 0x70, 0x00, 0x00, 0x38, 0x00, + 0x38, 0x00, 0x00, 0x70, 0x0f, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x78, 0x07, 0x80, + 0x00, 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x38, + 0x07, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0xf0, 0xf0, 0x00, 0x00, 0x78, 0x00, + 0x3c, 0x00, 0x00, 0x70, 0x1f, 0x00, 0x00, 0x00, + 0x0f, 0x80, 0x7c, 0x00, 0x00, 0x3c, 0x0f, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x78, 0x00, 0x00, 0x3c, + 0x07, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0xf9, 0xf0, 0x00, 0x00, 0x78, 0x00, + 0x3c, 0x00, 0x00, 0x7c, 0x3f, 0x00, 0x00, 0x00, + 0x07, 0xe1, 0xf8, 0x00, 0x00, 0x3e, 0x1f, 0x00, + 0x00, 0x00, 0x0f, 0xc1, 0xf8, 0x00, 0x00, 0x3e, + 0x1f, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x7f, 0xe0, 0x00, 0x00, 0x70, 0x00, + 0x1c, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, + 0x03, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xfe, 0x00, + 0x00, 0x00, 0x07, 0xff, 0xf0, 0x00, 0x00, 0x1f, + 0xff, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, + 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x3f, 0xc0, 0x00, 0x00, 0xf0, 0x00, + 0x1e, 0x00, 0x00, 0x3f, 0xf7, 0x80, 0x00, 0x00, + 0x01, 0xff, 0xe0, 0x00, 0x00, 0x0f, 0xfc, 0x00, + 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x1f, + 0xfb, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, + 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, + 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, + 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x1f, 0x80, 0x00, 0x00, 0xe0, 0x00, + 0x0e, 0x00, 0x00, 0x0f, 0xe3, 0x80, 0x00, 0x00, + 0x00, 0x7f, 0x80, 0x00, 0x00, 0x03, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x07, + 0xe3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x01, 0xc3, 0x80, 0x00, 0x00, + 0x07, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x0e, + 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x01, 0xc7, 0x80, 0x00, 0x00, + 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x1e, + 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, + 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x70, 0x1c, + 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x03, 0xc7, 0x00, 0x00, 0x00, + 0x3e, 0xde, 0x00, 0x00, 0x00, 0x3c, 0x78, 0x3c, + 0x00, 0x00, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x76, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x03, 0x87, 0x00, 0x00, 0x00, + 0x3c, 0xcf, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, + 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x03, 0x87, 0x00, 0x00, 0x00, + 0x38, 0xc7, 0x00, 0x00, 0x00, 0x38, 0x38, 0x78, + 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x03, 0x8f, 0x00, 0x00, 0x00, + 0x38, 0xc0, 0x00, 0x00, 0x00, 0x38, 0x38, 0x70, + 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, + 0x38, 0xc0, 0x00, 0x00, 0x00, 0x38, 0x38, 0xf0, + 0x00, 0x00, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x70, 0xc0, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, + 0x3c, 0xc0, 0x00, 0x00, 0x00, 0x38, 0x38, 0xe0, + 0x00, 0x00, 0x03, 0x9e, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x39, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, + 0x1e, 0xc0, 0x00, 0x00, 0x00, 0x3c, 0x79, 0xe0, + 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x19, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x00, 0x00, + 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x1c, 0x71, 0xc0, + 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x1e, 0x00, 0x00, 0x00, + 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x1f, 0xe3, 0xc0, + 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x1e, 0x00, 0x00, 0x00, + 0x03, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xc3, 0x8f, + 0x80, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x07, 0xbf, + 0xc0, 0x00, 0x0f, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, + 0xe0, 0x00, 0x1e, 0x3c, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0xc7, 0x80, 0x00, 0x00, 0x00, 0x0f, 0x78, + 0xf0, 0x00, 0x3c, 0x1e, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0xc3, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x70, + 0x70, 0x00, 0x38, 0x1e, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0xc3, 0x80, 0x00, 0x00, 0x00, 0x1e, 0x70, + 0x70, 0x00, 0x38, 0x0f, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x38, 0x00, 0x00, 0x00, + 0x70, 0xc3, 0x80, 0x00, 0x00, 0x00, 0x1c, 0x70, + 0x70, 0x00, 0x38, 0x07, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00, 0x00, + 0x78, 0xc7, 0x80, 0x00, 0x00, 0x00, 0x3c, 0x70, + 0x70, 0x00, 0x3c, 0x03, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00, 0x00, + 0x78, 0xc7, 0x80, 0x00, 0x00, 0x00, 0x38, 0x70, + 0x70, 0x00, 0x3c, 0x07, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x78, 0x00, 0x00, 0x00, + 0x3e, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x70, 0x78, + 0xf0, 0x00, 0x1f, 0x1f, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x78, 0x00, 0x00, 0x00, + 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x70, 0x38, + 0xe0, 0x00, 0x0f, 0xff, 0x7c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x70, 0x00, 0x00, 0x00, + 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, + 0xc0, 0x00, 0x07, 0xfe, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00, 0x00, + 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, + 0x80, 0x00, 0x03, 0xf8, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0xfc, + 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, + 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x7f, + 0xff, 0xc0, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xf8, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x0f, 0xfe, + 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, + 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, 0x7f, + 0xff, 0xc0, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, + 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, + 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00, 0x00, 0x7f, + 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xff, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, + 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x3e, 0x0f, + 0x80, 0x00, 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0x0f, 0x80, 0x00, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, + 0x00, 0x3e, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0x1f, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x78, 0x03, + 0xc0, 0x00, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x03, 0xc0, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x3c, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x07, 0x80, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x03, + 0xc0, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x01, 0xc0, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x78, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x03, 0x80, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x1f, 0x70, 0x00, 0x00, 0x00, 0x70, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x00, 0xfe, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x03, 0x80, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x1e, 0x70, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x01, 0xee, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x03, 0xce, 0x00, 0x00, 0x00, 0x3b, 0xf8, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xfe, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, + 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xc0, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x03, 0xce, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, + 0x00, 0x00, 0x71, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, + 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xf8, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, + 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, + 0x07, 0x8e, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x00, + 0x00, 0x00, 0x77, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x00, 0x78, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, + 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, + 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x7c, 0x0f, 0x80, + 0x00, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, + 0x00, 0x78, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x01, 0xff, 0x80, 0x00, 0x00, + 0x1e, 0x0e, 0x00, 0x00, 0x00, 0x78, 0x03, 0x80, + 0x00, 0x00, 0x7e, 0x0f, 0x80, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x00, 0x3e, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, + 0x7c, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x1e, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, + 0x00, 0x00, 0x7c, 0x03, 0xc0, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0x80, 0x00, + 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x3c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, + 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, 0x00, 0x01, + 0xe0, 0x00, 0x00, 0x00, 0x78, 0x03, 0x80, 0x00, + 0x00, 0x0f, 0xfd, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x78, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, + 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x07, 0xf1, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xf8, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, + 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x01, + 0xe0, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x01, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xc0, + 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xfe, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, + 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, + 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xc0, + 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x03, + 0xc0, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0x80, 0x00, 0x00, 0x3f, 0xff, 0xc0, + 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, + 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x70, 0x01, 0xc0, + 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, + 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x70, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x78, 0x07, 0x80, + 0x00, 0x00, 0x3c, 0x03, 0x80, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, + 0x00, 0x78, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x3e, 0x0f, 0x80, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0x00, + 0x00, 0x00, 0x1e, 0x0f, 0x80, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0x80, 0x00, + 0x00, 0x3c, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7f, 0xff, + 0xc0, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, + 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, + 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7f, 0xff, + 0xc0, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, + 0x00, 0x00, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, + 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7f, 0xff, + 0xc0, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, + 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, + 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00, + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x1f, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, + 0x1f, 0xff, 0x80, 0x00, 0x00, 0x1f, 0xff, 0xf0, + 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x7c, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x07, + 0xc0, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x1f, 0xff, + 0xc0, 0x00, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x00, + 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xf0, + 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x01, + 0xff, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0xf8, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x0f, + 0xc0, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x00, 0x01, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xe0, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, + 0xe0, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00, + 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xf0, + 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x03, + 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x0f, + 0xc0, 0x00, 0x1f, 0x00, 0x1c, 0x00, 0x00, 0x03, + 0xff, 0xf0, 0x00, 0x00, 0x00, 0xfe, 0x07, 0xf0, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x01, + 0xf0, 0x00, 0x00, 0x07, 0xc1, 0xf0, 0x00, 0x00, + 0x1c, 0x01, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, + 0xe0, 0xfc, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x03, 0xe0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x0f, + 0xc0, 0x00, 0x1f, 0x80, 0x1c, 0x00, 0x00, 0x07, + 0xe1, 0xf8, 0x00, 0x00, 0x01, 0xf0, 0x00, 0xf8, + 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x78, 0x00, 0x00, + 0x1c, 0x00, 0x78, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x80, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x07, 0xc0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x1f, + 0xc0, 0x00, 0x1f, 0x80, 0x1c, 0x00, 0x00, 0x0f, + 0x80, 0x7c, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x7c, + 0x00, 0x01, 0xef, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x70, 0x00, 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, + 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x0f, 0x80, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xc0, 0x1d, + 0xc0, 0x00, 0x1f, 0xc0, 0x1c, 0x00, 0x00, 0x1e, + 0x00, 0x1e, 0x00, 0x00, 0x07, 0x80, 0x00, 0x3c, + 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x70, 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, + 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x0f, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x1f, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xc0, 0x1d, + 0xc0, 0x00, 0x1d, 0xc0, 0x1c, 0x00, 0x00, 0x1e, + 0x00, 0x1e, 0x00, 0x00, 0x0f, 0x03, 0xe3, 0x9e, + 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x1c, 0x00, + 0x70, 0x00, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x00, + 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x06, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x3e, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xe0, 0x1d, + 0xc0, 0x00, 0x1c, 0xe0, 0x1c, 0x00, 0x00, 0x1c, + 0x00, 0x0e, 0x00, 0x00, 0x0f, 0x0f, 0xf7, 0x8e, + 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x1c, 0x00, + 0xf0, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x7c, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x39, + 0xc0, 0x00, 0x1c, 0xf0, 0x1c, 0x00, 0x00, 0x3c, + 0x00, 0x0f, 0x00, 0x00, 0x1e, 0x1f, 0xff, 0x8f, + 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x1c, 0x01, + 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0xf8, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x39, + 0xc0, 0x00, 0x1c, 0x70, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x3e, 0x3f, 0x0f, + 0x00, 0x07, 0x83, 0xc0, 0x00, 0x00, 0x1f, 0xff, + 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1d, 0xf0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xf0, 0x39, + 0xc0, 0x00, 0x1c, 0x78, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x3c, 0x1f, 0x07, + 0x00, 0x07, 0x01, 0xc0, 0x00, 0x00, 0x1f, 0xff, + 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, 0xe0, + 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xf0, 0x79, + 0xc0, 0x00, 0x1c, 0x3c, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x3c, 0x78, 0x0f, 0x07, + 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x1f, 0xff, + 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, 0xe0, + 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x38, + 0x03, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x70, 0x71, + 0xc0, 0x00, 0x1c, 0x1c, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x38, 0x70, 0x0f, 0x07, + 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x1c, 0x01, + 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, 0xe0, + 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x38, + 0x03, 0xff, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1f, 0x9c, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x70, 0x71, + 0xc0, 0x00, 0x1c, 0x1e, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x38, 0xf0, 0x0f, 0x07, + 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x1c, 0x00, + 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x03, 0xff, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1f, 0x1e, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x78, 0xf1, + 0xc0, 0x00, 0x1c, 0x0f, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x38, 0xe0, 0x0e, 0x07, + 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1c, 0x00, + 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x38, 0xe1, + 0xc0, 0x00, 0x1c, 0x07, 0x1c, 0x00, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0x38, 0xe0, 0x0e, 0x0f, + 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1c, 0x00, + 0x38, 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x00, 0x00, + 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x07, 0x80, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x38, 0xe1, + 0xc0, 0x00, 0x1c, 0x07, 0x9c, 0x00, 0x00, 0x3c, + 0x00, 0x0f, 0x00, 0x00, 0x38, 0xe0, 0x1e, 0x0e, + 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x1c, 0x00, + 0x38, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, + 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x03, 0x80, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x3d, 0xe1, + 0xc0, 0x00, 0x1c, 0x03, 0x9c, 0x00, 0x00, 0x1c, + 0x00, 0x0e, 0x00, 0x00, 0x38, 0xe0, 0x1e, 0x1e, + 0x00, 0x3c, 0x00, 0x78, 0x00, 0x00, 0x1c, 0x00, + 0x38, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00, + 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x03, 0xc0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1d, 0xc1, + 0xc0, 0x00, 0x1c, 0x01, 0xdc, 0x00, 0x00, 0x1e, + 0x00, 0x1e, 0x00, 0x00, 0x38, 0xe0, 0x3c, 0x1c, + 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, + 0x78, 0x00, 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, + 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1c, + 0x00, 0x00, 0x00, 0x1c, 0x01, 0xe0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1d, 0xc1, + 0xc0, 0x00, 0x1c, 0x01, 0xfc, 0x00, 0x00, 0x1e, + 0x00, 0x1e, 0x00, 0x00, 0x3c, 0xf0, 0x7c, 0x3c, + 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, + 0x78, 0x00, 0x00, 0x0f, 0x00, 0x7c, 0x00, 0x00, + 0x1c, 0x00, 0x78, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x80, 0x1f, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x3c, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1f, 0xc1, + 0xc0, 0x00, 0x1c, 0x00, 0xfc, 0x00, 0x00, 0x0f, + 0x80, 0x7c, 0x00, 0x00, 0x3c, 0x78, 0xfc, 0xf8, + 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x01, + 0xf0, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00, 0x00, + 0x1c, 0x01, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, + 0xe0, 0x7f, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x78, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1f, 0x81, + 0xc0, 0x00, 0x1c, 0x00, 0xfc, 0x00, 0x00, 0x07, + 0xe1, 0xf8, 0x00, 0x00, 0x1c, 0x7f, 0xff, 0xf0, + 0x00, 0x70, 0x00, 0x1c, 0x00, 0x00, 0x1f, 0xff, + 0xe0, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00, + 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xf8, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xff, 0xfc, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf8, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, + 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x1c, 0x0f, 0x81, + 0xc0, 0x00, 0x1c, 0x00, 0x7c, 0x00, 0x00, 0x03, + 0xff, 0xf0, 0x00, 0x00, 0x1e, 0x3f, 0xdf, 0xe0, + 0x00, 0xf0, 0x00, 0x1e, 0x00, 0x00, 0x1f, 0xff, + 0xc0, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, + 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xff, 0xf8, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf0, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, + 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x1c, 0x0f, 0x81, + 0xc0, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x01, + 0xff, 0xe0, 0x00, 0x00, 0x0f, 0x1f, 0x0f, 0x87, + 0x80, 0xe0, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, + 0x80, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, + 0x1f, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xf8, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, + 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x1c, 0x0f, 0x01, + 0xc0, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x7e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x01, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x1f, 0xff, + 0xc0, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, + 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0xe0, 0x00, 0x0e, 0x00, 0x00, 0xe0, + 0x03, 0xe0, 0x03, 0x80, 0x3c, 0x00, 0x78, 0x00, + 0x00, 0xf0, 0x00, 0x78, 0x00, 0x00, 0x1f, 0xff, + 0xe0, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, + 0x00, 0x01, 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xff, + 0xf0, 0x00, 0x00, 0x03, 0xff, 0x80, 0x00, 0x00, + 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0xf0, 0x00, 0x1e, 0x00, 0x00, 0xf0, + 0x03, 0xe0, 0x07, 0x80, 0x1e, 0x00, 0xf0, 0x00, + 0x00, 0x70, 0x00, 0x70, 0x00, 0x00, 0x1f, 0xff, + 0xe0, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, + 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, + 0xf8, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, 0x00, + 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0xf0, 0x00, 0x1e, 0x00, 0x00, 0xf0, + 0x07, 0xe0, 0x07, 0x80, 0x0e, 0x00, 0xe0, 0x00, + 0x00, 0x78, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0xff, + 0xe0, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, + 0x00, 0x07, 0xc1, 0xf0, 0x00, 0x00, 0x1c, 0x00, + 0xf8, 0x00, 0x00, 0x0f, 0x83, 0xe0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x70, + 0x07, 0xf0, 0x07, 0x00, 0x0f, 0x01, 0xe0, 0x00, + 0x00, 0x3c, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x01, + 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, + 0x00, 0x0f, 0x00, 0x78, 0x00, 0x00, 0x1c, 0x00, + 0x3c, 0x00, 0x00, 0x1e, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x70, + 0x07, 0x70, 0x07, 0x00, 0x07, 0x83, 0xc0, 0x00, + 0x00, 0x1c, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, + 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, + 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, + 0x1c, 0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x78, + 0x07, 0x70, 0x0f, 0x00, 0x03, 0x83, 0x80, 0x00, + 0x00, 0x1e, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, + 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, + 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x3c, 0x00, 0x78, 0x00, 0x00, 0x78, + 0x0f, 0x78, 0x0f, 0x00, 0x03, 0xc7, 0x80, 0x00, + 0x00, 0x0f, 0x07, 0x80, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, + 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, + 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x3c, 0x00, 0x78, 0x00, 0x00, 0x38, + 0x0e, 0x38, 0x0e, 0x00, 0x01, 0xef, 0x00, 0x00, + 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, + 0x00, 0x3c, 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, + 0x3c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x38, + 0x0e, 0x38, 0x0e, 0x00, 0x00, 0xfe, 0x00, 0x00, + 0x00, 0x07, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, + 0x3c, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x1e, 0x00, 0xf0, 0x00, 0x00, 0x3c, + 0x0e, 0x38, 0x1e, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x03, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x00, + 0xf8, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x1e, 0x00, 0xf0, 0x00, 0x00, 0x3c, + 0x1e, 0x3c, 0x1e, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x03, 0xde, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, + 0xf8, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x1c, + 0x1c, 0x1c, 0x1c, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, + 0xf0, 0x00, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x1c, + 0x1c, 0x1c, 0x1c, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0xff, + 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x07, 0x01, 0xc0, 0x00, 0x00, 0x1e, + 0x3c, 0x1c, 0x3c, 0x00, 0x00, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x01, 0xe0, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x07, 0x83, 0xc0, 0x00, 0x00, 0x1e, + 0x3c, 0x1e, 0x3c, 0x00, 0x01, 0xef, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0xc0, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x1c, 0x07, + 0x80, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x07, 0x83, 0xc0, 0x00, 0x00, 0x0e, + 0x38, 0x0e, 0x38, 0x00, 0x01, 0xc7, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0xc0, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x3c, 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x07, + 0xc0, 0x00, 0x00, 0x38, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x0e, + 0x38, 0x0e, 0x38, 0x00, 0x03, 0xc7, 0x80, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x03, + 0xe0, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, + 0x00, 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x0f, + 0x78, 0x0f, 0x78, 0x00, 0x07, 0x83, 0xc0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x07, 0x3c, 0x00, 0x00, 0x1c, 0x01, + 0xf0, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x3c, + 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x0f, + 0x70, 0x07, 0x78, 0x00, 0x0f, 0x01, 0xe0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x07, 0xb8, 0x00, 0x00, 0x1c, 0x00, + 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x3c, + 0x00, 0x00, 0x01, 0xef, 0x00, 0x00, 0x00, 0x07, + 0x70, 0x07, 0x70, 0x00, 0x0e, 0x00, 0xe0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x07, 0xf8, 0x00, 0x00, 0x1c, 0x00, + 0x78, 0x00, 0x00, 0x1e, 0x00, 0xf8, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x78, + 0x00, 0x00, 0x01, 0xef, 0x00, 0x00, 0x00, 0x07, + 0xf0, 0x07, 0xf0, 0x00, 0x1e, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x07, 0xc1, 0xf0, 0x00, 0x00, 0x1c, 0x00, + 0x78, 0x00, 0x00, 0x0f, 0xc1, 0xf0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x0f, 0xc1, 0xf8, + 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x07, + 0xf0, 0x07, 0xf0, 0x00, 0x3c, 0x00, 0x78, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00, + 0x3c, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf0, + 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x07, + 0xe0, 0x03, 0xf0, 0x00, 0x38, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7f, 0xff, + 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xff, 0xfe, 0x00, 0x00, 0x1c, 0x00, + 0x3e, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, + 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x03, + 0xe0, 0x03, 0xe0, 0x00, 0x78, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7f, 0xff, + 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0x9f, 0x00, 0x00, 0x1c, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, + 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x03, + 0xe0, 0x03, 0xe0, 0x00, 0xf0, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7f, 0xff, + 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x39, 0xf8, + 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, + 0x07, 0xe7, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, + 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x07, + 0xe7, 0x00, 0x00, 0x00, 0x38, 0xfc, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x0f, 0x80, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x39, 0xf0, 0x7e, + 0x00, 0x00, 0x39, 0xfc, 0x00, 0x00, 0x00, 0x03, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x3b, 0xfc, + 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, + 0x0f, 0xf7, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, + 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x0f, + 0xf7, 0x00, 0x00, 0x00, 0x3b, 0xfe, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x1f, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xfc, 0xff, + 0x00, 0x00, 0x3b, 0xff, 0x00, 0x00, 0x00, 0x0f, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x3f, 0xfe, + 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, + 0x1f, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, + 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x1f, + 0xff, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x3e, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfd, 0xff, + 0x80, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x1f, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x1f, 0x00, 0x00, 0x00, 0x3f, 0x1f, + 0x00, 0x00, 0x00, 0x3e, 0x1e, 0x00, 0x00, 0x00, + 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x3e, 0x1f, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x3e, + 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x0f, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x1f, 0x8f, + 0x80, 0x00, 0x3f, 0x0f, 0x80, 0x00, 0x00, 0x3e, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x3e, 0x07, + 0x00, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, + 0x38, 0x1f, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x1f, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x1f, 0x07, + 0x80, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x3c, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x07, + 0x80, 0x00, 0x00, 0x78, 0x07, 0x00, 0x00, 0x00, + 0x78, 0x0f, 0x00, 0x00, 0x00, 0x78, 0x07, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, + 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0f, 0x03, + 0x80, 0x00, 0x3c, 0x03, 0x80, 0x00, 0x00, 0x78, + 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x70, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3b, 0xc0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0xf7, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7c, 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0xf0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x80, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x07, + 0x80, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, + 0x78, 0x0f, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, + 0x0f, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x78, + 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x1f, 0x00, 0x00, 0x00, 0x3c, 0x0f, + 0x00, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00, 0x00, + 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x0f, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x3c, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7c, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x1f, + 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00, 0x00, + 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x3e, + 0x3f, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x3e, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x3f, 0xfe, + 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, + 0x1f, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0xff, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x1f, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0xf7, 0x80, 0x00, 0x00, 0x3b, 0xfc, + 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, + 0x0f, 0xf7, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xff, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x0f, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0xe3, 0x80, 0x00, 0x00, 0x39, 0xf8, + 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, + 0x07, 0xe7, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, + 0xe7, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x03, + 0x80, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x03, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x39, 0xf8, 0x00, 0x00, + 0x00, 0x07, 0xe7, 0x00, 0x00, 0x00, 0x39, 0xe0, + 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0xf0, 0x07, 0x80, 0x00, 0x01, 0xe0, + 0x38, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x7f, 0xfe, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3b, 0xfc, 0x00, 0x00, + 0x00, 0x0f, 0xf7, 0x00, 0x00, 0x00, 0x3b, 0xe0, + 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0xf0, 0x07, 0x80, 0x00, 0x00, 0xe0, + 0x3c, 0x0e, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, + 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 0x7f, 0xfe, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x3f, 0xe0, + 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0xf0, + 0x7c, 0x1e, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00, + 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x7f, 0xfe, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3f, 0x1f, 0x00, 0x00, + 0x00, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x00, 0x00, 0x78, 0x3e, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 0xf0, + 0x7c, 0x1e, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0x00, 0x40, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3e, 0x0f, 0x00, 0x00, + 0x00, 0x38, 0x1f, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x70, + 0x7c, 0x1c, 0x00, 0x00, 0x1e, 0x38, 0x00, 0x00, + 0x00, 0x3c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0xc0, 0xc0, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x70, + 0xec, 0x1c, 0x00, 0x00, 0x0e, 0x78, 0x00, 0x00, + 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0xf1, 0xc0, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3c, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x3c, 0x1e, 0x00, 0x00, 0x00, 0x78, + 0xee, 0x3c, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, + 0x00, 0x1e, 0x1c, 0x00, 0x00, 0x00, 0x01, 0xf0, + 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x00, 0x00, 0x71, 0xff, 0xc0, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x38, + 0xee, 0x38, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x00, 0x1e, 0x1c, 0x00, 0x00, 0x00, 0x01, 0xe0, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, + 0x00, 0x00, 0x60, 0x7f, 0x80, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x1e, 0x3c, 0x00, 0x00, 0x00, 0x38, + 0xe6, 0x38, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, + 0x00, 0x0e, 0x38, 0x00, 0x00, 0x00, 0x03, 0xc0, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, + 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, 0x00, 0x3d, + 0xc6, 0x78, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, + 0x00, 0x0f, 0x38, 0x00, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, 0x00, 0x1d, + 0xc7, 0x70, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, + 0x00, 0x0f, 0x38, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, + 0x00, 0x00, 0x0f, 0x78, 0x00, 0x00, 0x00, 0x1d, + 0xc7, 0x70, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, + 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, + 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0x80, + 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x1d, + 0xc3, 0x70, 0x00, 0x00, 0x0f, 0x70, 0x00, 0x00, + 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, + 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x78, 0x07, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, + 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x0f, + 0x83, 0xe0, 0x00, 0x00, 0x1e, 0x78, 0x00, 0x00, + 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x7c, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3f, 0x1f, 0x00, 0x00, + 0x00, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x1f, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x1f, 0x80, + 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x0f, + 0x83, 0xe0, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, + 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, + 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x0f, + 0x83, 0xe0, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00, + 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x3b, 0xfc, 0x00, 0x00, + 0x00, 0x0f, 0xf7, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfb, 0x80, + 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x0f, + 0x03, 0xc0, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, + 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x39, 0xf0, 0x00, 0x00, + 0x00, 0x03, 0xe7, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe3, 0x80, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x07, + 0x01, 0xc0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, + 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0xff, 0xfc, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0xf0, 0x24, 0x00, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x0c, 0x94, 0xea, 0xff, 0xfd, 0x70, + 0xea, 0x00, 0x00, 0x01, 0xe3, 0x5c, 0x00, 0xb7, + 0xa5, 0x9f, 0xf0, 0x04, 0xe0, 0x86, 0xc0, 0x0c, + 0xe5, 0x9f, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0x74, + 0x00, 0x00, 0x0c, 0x98, 0x00, 0x00, 0x00, 0x0f, + 0xf0, 0x24, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x0e, 0x4c, + 0xea, 0xff, 0xfd, 0x03, 0xea, 0x00, 0x00, 0x07, + 0xe5, 0x9f, 0xc0, 0x1c, 0xe5, 0x9c, 0x30, 0x00, + 0xe3, 0x83, 0x33, 0x33, 0xe1, 0x52, 0x00, 0x03, + 0x05, 0x9f, 0xc0, 0x10, 0x05, 0x9c, 0xc0, 0x00, + 0x03, 0x8c, 0x23, 0x33, 0xe5, 0x9f, 0xc0, 0x08, + 0xe5, 0x9f, 0xf0, 0x08, 0x66, 0x00, 0x00, 0x60, + 0x66, 0x00, 0x00, 0x5c, 0x66, 0x00, 0x00, 0x58, + 0x00, 0x00, 0x0e, 0x50, 0x00, 0x00, 0x00, 0x01, + 0xf0, 0x24, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x02, 0x6c, + 0xa0, 0x00, 0x0b, 0x38, 0x00, 0x00, 0x01, 0xc0, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x17, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, + 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1a, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x05, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x02, 0x02, 0x02, 0x02, 0x40, + 0xe5, 0x9f, 0xc0, 0x00, 0xe1, 0x2f, 0xff, 0x1c, + 0x2e, 0x01, 0xcf, 0x19, 0xe5, 0x9f, 0xc0, 0x00, + 0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x00, 0x5b, 0x17, + 0xe5, 0x9f, 0xc0, 0x00, 0xe1, 0x2f, 0xff, 0x1c, + 0x2e, 0x00, 0x5b, 0xa1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x02, 0x37, 0x7c, + 0x2e, 0x02, 0x38, 0x94, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x02, 0x37, 0x7c, 0xff, 0x7f, 0x3f, 0x1f, + 0x0f, 0x07, 0x03, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x01, 0x00, 0x43, 0x6f, 0x70, 0x79, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x46, 0x75, + 0x6a, 0x69, 0x74, 0x73, 0x75, 0x20, 0x53, 0x69, + 0x65, 0x6d, 0x65, 0x6e, 0x73, 0x20, 0x26, 0x20, + 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x67, 0x65, + 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x57, 0x5e, 0x61, 0xa3, + 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x0c, + 0x6c, 0x00, 0x00, 0x24, 0x64, 0x00, 0x00, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x07, 0xd0, + 0x00, 0x00, 0x13, 0x88, 0x02, 0x02, 0x01, 0x00, + 0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x07, 0xd0, + 0x00, 0x00, 0x13, 0x88, 0x02, 0x02, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xd0, + 0x2e, 0x08, 0x05, 0xd0, 0x2e, 0x08, 0x05, 0xd8, + 0x2e, 0x08, 0x05, 0xd8, 0x2e, 0x08, 0x05, 0xe0, + 0x2e, 0x08, 0x05, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, + 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, + 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, + 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, + 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, + 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, + 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, + 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, + 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, + 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, + 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, + 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, + 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, + 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, + 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, + 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, + 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e, + 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, + 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, + 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, + 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, + 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, + 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, + 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, + 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0xfe, + 0x6c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, + 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, + 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, + 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, + 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, + 0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, + 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, + 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, + 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, + 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xd6, 0xd6, + 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, + 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, + 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, + 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, + 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, + 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, + 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, + 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, + 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, + 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, + 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, + 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde, + 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, + 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, + 0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, + 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, + 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, + 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, + 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, + 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, + 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, + 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, + 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, + 0xd6, 0xfe, 0xee, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x7c, 0x38, 0x38, + 0x7c, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc6, 0x86, 0x0c, 0x18, 0x30, + 0x60, 0xc2, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, + 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, + 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, + 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, + 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x36, 0x32, 0x30, 0x78, 0x30, + 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, + 0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, + 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, + 0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, + 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6, + 0xd6, 0xd6, 0xd6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, + 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, + 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, + 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6, + 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38, + 0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, + 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, + 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, + 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, + 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc2, 0x66, 0x3c, 0x18, 0x70, 0x00, 0x00, + 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, + 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, + 0xc0, 0xc0, 0xc6, 0x7c, 0x18, 0x70, 0x00, 0x00, + 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, + 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe, + 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, + 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, + 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x6c, 0x38, 0x10, 0x38, 0x6c, 0xc6, 0xfe, + 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x18, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, + 0x68, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x36, 0x36, + 0x7e, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, + 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, + 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x18, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, + 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, + 0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, + 0x7e, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xcc, 0xcc, 0xf8, 0xc4, 0xcc, 0xde, + 0xcc, 0xcc, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, + 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, + 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, + 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, + 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, + 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0xe0, 0x62, 0x66, 0x6c, 0x18, 0x30, + 0x60, 0xdc, 0x86, 0x0c, 0x18, 0x3e, 0x00, 0x00, + 0x00, 0x60, 0xe0, 0x62, 0x66, 0x6c, 0x18, 0x30, + 0x66, 0xce, 0x9a, 0x3f, 0x06, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, + 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, + 0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36, + 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, + 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, + 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, + 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, + 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, + 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, + 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, + 0xc6, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c, + 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x18, + 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, + 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, + 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, + 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, + 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, + 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, + 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, + 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, + 0x18, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, + 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, + 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x7e, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, + 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, + 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6c, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3c, 0x66, 0x0c, 0x18, 0x32, 0x7e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x65, 0xd0, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, + 0x2e, 0x08, 0x07, 0xa4, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x17, + 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf7, + 0x11, 0x38, 0x06, 0x53, 0x2e, 0x08, 0x17, 0xe4, + 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x21, + 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x39, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x21, + 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xb9, + 0x0e, 0xa6, 0x06, 0x53, 0x2e, 0x08, 0x19, 0x14, + 0x2e, 0x08, 0x1a, 0x38, 0x2e, 0x08, 0x19, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x8b, 0x98, 0x00, 0x44, 0x45, 0x55, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x64, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x80, 0x10, 0x80, 0x00, 0x80, 0xda, 0x80, + 0x00, 0x5a, 0x51, 0xf0, 0x00, 0x36, 0x91, 0x22, + 0x00, 0xf0, 0x29, 0x6e, 0x00, 0x10, 0xd2, 0x92, + 0x00, 0xca, 0x6a, 0xde, 0x00, 0xa6, 0xaa, 0x10, + 0x00, 0x80, 0x3b, 0x80, 0x00, 0x80, 0xbc, 0x80, + 0x00, 0x80, 0x7e, 0x80, 0x00, 0xcf, 0x22, 0x73, + 0x00, 0x93, 0x48, 0x5d, 0x00, 0xa2, 0x73, 0x93, + 0x00, 0x25, 0xae, 0xad, 0x00, 0xa7, 0x9f, 0x60, + 0x00, 0x10, 0x10, 0x10, 0x00, 0x59, 0x10, 0x10, + 0x00, 0xa2, 0x10, 0x10, 0x00, 0xeb, 0x10, 0x10, + 0x00, 0x10, 0x10, 0x59, 0x00, 0x59, 0x10, 0x59, + 0x00, 0xa2, 0x10, 0x59, 0x00, 0xeb, 0x10, 0x59, + 0x00, 0x10, 0x10, 0xa2, 0x00, 0x59, 0x10, 0xa2, + 0x00, 0xa2, 0x10, 0xa2, 0x00, 0xeb, 0x10, 0xa2, + 0x00, 0x10, 0x10, 0xeb, 0x00, 0x59, 0x10, 0xeb, + 0x00, 0xa2, 0x10, 0xeb, 0x00, 0xeb, 0x10, 0xeb, + 0x00, 0x10, 0x2f, 0x10, 0x00, 0x59, 0x2f, 0x10, + 0x00, 0xa2, 0x2f, 0x10, 0x00, 0xeb, 0x2f, 0x10, + 0x00, 0x10, 0x2f, 0x59, 0x00, 0x59, 0x2f, 0x59, + 0x00, 0xa2, 0x2f, 0x59, 0x00, 0xeb, 0x2f, 0x59, + 0x00, 0x10, 0x2f, 0xa2, 0x00, 0x59, 0x2f, 0xa2, + 0x00, 0xa2, 0x2f, 0xa2, 0x00, 0xeb, 0x2f, 0xa2, + 0x00, 0x10, 0x2f, 0xeb, 0x00, 0x59, 0x2f, 0xeb, + 0x00, 0xa2, 0x2f, 0xeb, 0x00, 0xeb, 0x2f, 0xeb, + 0x00, 0x10, 0x4e, 0x10, 0x00, 0x59, 0x4e, 0x10, + 0x00, 0xa2, 0x4e, 0x10, 0x00, 0xeb, 0x4e, 0x10, + 0x00, 0x10, 0x4e, 0x59, 0x00, 0x59, 0x4e, 0x59, + 0x00, 0xa2, 0x4e, 0x59, 0x00, 0xeb, 0x4e, 0x59, + 0x00, 0x10, 0x4e, 0xa2, 0x00, 0x59, 0x4e, 0xa2, + 0x00, 0xa2, 0x4e, 0xa2, 0x00, 0xeb, 0x4e, 0xa2, + 0x00, 0x10, 0x4e, 0xeb, 0x00, 0x59, 0x4e, 0xeb, + 0x00, 0xa2, 0x4e, 0xeb, 0x00, 0xeb, 0x4e, 0xeb, + 0x00, 0x10, 0x6d, 0x10, 0x00, 0x59, 0x6d, 0x10, + 0x00, 0xa2, 0x6d, 0x10, 0x00, 0xeb, 0x6d, 0x10, + 0x00, 0x10, 0x6d, 0x59, 0x00, 0x59, 0x6d, 0x59, + 0x00, 0xa2, 0x6d, 0x59, 0x00, 0xeb, 0x6d, 0x59, + 0x00, 0x10, 0x6d, 0xa2, 0x00, 0x59, 0x6d, 0xa2, + 0x00, 0xa2, 0x6d, 0xa2, 0x00, 0xeb, 0x6d, 0xa2, + 0x00, 0x10, 0x6d, 0xeb, 0x00, 0x59, 0x6d, 0xeb, + 0x00, 0xa2, 0x6d, 0xeb, 0x00, 0xeb, 0x6d, 0xeb, + 0x00, 0x10, 0x8c, 0x10, 0x00, 0x59, 0x8c, 0x10, + 0x00, 0xa2, 0x8c, 0x10, 0x00, 0xeb, 0x8c, 0x10, + 0x00, 0x10, 0x8c, 0x59, 0x00, 0x59, 0x8c, 0x59, + 0x00, 0xa2, 0x8c, 0x59, 0x00, 0xeb, 0x8c, 0x59, + 0x00, 0x10, 0x8c, 0xa2, 0x00, 0x59, 0x8c, 0xa2, + 0x00, 0xa2, 0x8c, 0xa2, 0x00, 0xeb, 0x8c, 0xa2, + 0x00, 0x10, 0x8c, 0xeb, 0x00, 0x59, 0x8c, 0xeb, + 0x00, 0xa2, 0x8c, 0xeb, 0x00, 0xeb, 0x8c, 0xeb, + 0x00, 0x10, 0xab, 0x10, 0x00, 0x59, 0xab, 0x10, + 0x00, 0xa2, 0xab, 0x10, 0x00, 0xeb, 0xab, 0x10, + 0x00, 0x10, 0xab, 0x59, 0x00, 0x59, 0xab, 0x59, + 0x00, 0xa2, 0xab, 0x59, 0x00, 0xeb, 0xab, 0x59, + 0x00, 0x10, 0xab, 0xa2, 0x00, 0x59, 0xab, 0xa2, + 0x00, 0xa2, 0xab, 0xa2, 0x00, 0xeb, 0xab, 0xa2, + 0x00, 0x10, 0xab, 0xeb, 0x00, 0x59, 0xab, 0xeb, + 0x00, 0xa2, 0xab, 0xeb, 0x00, 0xeb, 0xab, 0xeb, + 0x00, 0x10, 0xca, 0x10, 0x00, 0x59, 0xca, 0x10, + 0x00, 0xa2, 0xca, 0x10, 0x00, 0xeb, 0xca, 0x10, + 0x00, 0x10, 0xca, 0x59, 0x00, 0x59, 0xca, 0x59, + 0x00, 0xa2, 0xca, 0x59, 0x00, 0xeb, 0xca, 0x59, + 0x00, 0x10, 0xca, 0xa2, 0x00, 0x59, 0xca, 0xa2, + 0x00, 0xa2, 0xca, 0xa2, 0x00, 0xeb, 0xca, 0xa2, + 0x00, 0x10, 0xca, 0xeb, 0x00, 0x59, 0xca, 0xeb, + 0x00, 0xa2, 0xca, 0xeb, 0x00, 0xeb, 0xca, 0xeb, + 0x00, 0x10, 0xe9, 0x10, 0x00, 0x59, 0xe9, 0x10, + 0x00, 0xa2, 0xe9, 0x10, 0x00, 0xeb, 0xe9, 0x10, + 0x00, 0x10, 0xe9, 0x59, 0x00, 0x59, 0xe9, 0x59, + 0x00, 0xa2, 0xe9, 0x59, 0x00, 0xeb, 0xe9, 0x59, + 0x00, 0x10, 0xe9, 0xa2, 0x00, 0x59, 0xe9, 0xa2, + 0x00, 0xa2, 0xe9, 0xa2, 0x00, 0xeb, 0xe9, 0xa2, + 0x00, 0x10, 0xe9, 0xeb, 0x00, 0x59, 0xe9, 0xeb, + 0x00, 0xa2, 0xe9, 0xeb, 0x00, 0xeb, 0xe9, 0xeb, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x24, 0xc0, + 0xc1, 0x11, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x6d, 0xbb, 0xeb, 0x8e, 0x01, 0xea, 0x25, + 0x04, 0xd0, 0x82, 0x49, 0xed, 0x4c, 0x8f, 0xc2, + 0x66, 0x0b, 0x65, 0xc5, 0x0c, 0xc2, 0x41, 0x19, + 0x07, 0xa8, 0x94, 0x13, 0x42, 0x09, 0x27, 0xb5, + 0x32, 0x3f, 0x09, 0x98, 0x2d, 0x97, 0x14, 0x33, + 0x09, 0x04, 0x64, 0x00, 0xff, 0xff, 0x24, 0xc0, + 0xe0, 0x11, 0x21, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x13, 0x8e, 0xf7, 0xe7, 0x6e, 0x9c, 0x0c, 0xc3, + 0xd2, 0xb4, 0x05, 0x16, 0x3c, 0x8e, 0x82, 0xd4, + 0x16, 0x5e, 0x9c, 0x0c, 0xc3, 0xd2, 0xb4, 0x05, + 0x16, 0x3c, 0x8e, 0x82, 0xd4, 0x16, 0x5e, 0x9c, + 0x0c, 0xc3, 0xd2, 0xb4, 0x05, 0x16, 0x3c, 0x8e, + 0x82, 0xd4, 0x16, 0x50, 0xff, 0xff, 0x24, 0xc0, + 0xd4, 0x11, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0d, 0x4d, 0xf8, 0xd5, 0x9e, 0x7f, 0x02, 0x22, + 0x08, 0xa3, 0xbd, 0x94, 0x53, 0x16, 0x79, 0xfc, + 0x08, 0x88, 0x22, 0x8e, 0xf6, 0x51, 0x4c, 0x59, + 0xe7, 0xf0, 0x22, 0x20, 0x8a, 0x3b, 0xd9, 0x45, + 0x31, 0x67, 0x9f, 0xc0, 0x88, 0x82, 0x28, 0xef, + 0x65, 0x14, 0xc4, 0x00, 0xff, 0xff, 0x24, 0xc0, + 0xe8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x6d, 0xfb, 0x1d, 0x77, 0xc1, 0x38, 0x81, + 0xfb, 0xb1, 0xd7, 0x7c, 0x13, 0x88, 0x1f, 0xbb, + 0x1d, 0x77, 0xc1, 0x38, 0x81, 0xfb, 0xb1, 0xd7, + 0x7c, 0x13, 0x88, 0x1f, 0xbb, 0x1d, 0x77, 0xc1, + 0x38, 0x81, 0xfb, 0xb1, 0xd7, 0x7c, 0x13, 0x88, + 0x1f, 0x80, 0x00, 0x00, 0xff, 0xff, 0x24, 0xc0, + 0x9b, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x3d, 0x75, 0xf7, 0x14, 0x0a, 0xc3, 0x29, + 0x9f, 0x51, 0xbc, 0xfb, 0xdc, 0x7b, 0x8a, 0x05, + 0x61, 0x94, 0xcf, 0xa8, 0xde, 0x7d, 0xee, 0x3d, + 0xc5, 0x02, 0xb0, 0xca, 0x67, 0xd4, 0x6f, 0x3e, + 0xf7, 0x1e, 0xe2, 0x81, 0x58, 0x65, 0x33, 0xea, + 0x37, 0x9f, 0x7b, 0x80, 0xff, 0xff, 0x24, 0xc0, + 0x12, 0xe0, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xeb, 0x50, 0xfb, 0xe7, 0x78, 0x1f, 0xde, 0xa1, + 0x62, 0x99, 0x11, 0x36, 0x02, 0x00, 0x97, 0xd6, + 0x69, 0x98, 0x1f, 0xde, 0xa1, 0x62, 0x99, 0x11, + 0x36, 0x02, 0x00, 0x97, 0xd6, 0x69, 0x98, 0x1f, + 0xde, 0xa1, 0x62, 0x99, 0x11, 0x36, 0x02, 0x00, + 0x97, 0xd6, 0x69, 0x90, 0xff, 0xff, 0x24, 0xc0, + 0x11, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdf, 0x95, 0x03, 0xa1, 0x49, 0xc5, 0x45, 0xe7, + 0x96, 0xe6, 0x1d, 0xdc, 0x0d, 0x50, 0xa4, 0xe2, + 0xa2, 0xf3, 0xcb, 0x73, 0x0e, 0xee, 0x06, 0xa8, + 0x52, 0x71, 0x51, 0x79, 0xe5, 0xb9, 0x87, 0x77, + 0x03, 0x54, 0x29, 0x38, 0xa8, 0xbc, 0xf2, 0xdc, + 0xc3, 0xbb, 0x81, 0xa0, 0xff, 0xff, 0x24, 0xc0, + 0x11, 0x21, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe7, 0xae, 0x35, 0x0d, 0x42, 0x14, 0xc2, 0xf9, + 0x4a, 0x13, 0x55, 0xa6, 0x6e, 0xf4, 0x88, 0x53, + 0x0b, 0xe5, 0x28, 0x4d, 0x56, 0x99, 0xbb, 0xd2, + 0x21, 0x4c, 0x2f, 0x94, 0xa1, 0x35, 0x5a, 0x66, + 0xef, 0x48, 0x85, 0x30, 0xbe, 0x52, 0x84, 0xd5, + 0x69, 0x9b, 0xbd, 0x20, 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x1f, 0xc8, 0x2e, 0x08, 0x1f, 0xcc, + 0x2e, 0x08, 0x1f, 0xd0, 0x2e, 0x08, 0x1f, 0xd8, + 0x2e, 0x08, 0x1f, 0xdc, 0x2e, 0x08, 0x1f, 0xe0, + 0x6e, 0x00, 0x01, 0x00, 0x6e, 0x00, 0x01, 0x00, + 0x6e, 0x00, 0x01, 0x08, 0x6e, 0x00, 0x01, 0x0c, + 0x6e, 0x00, 0x01, 0x04, 0x6e, 0x00, 0x01, 0x10, + 0x6e, 0x00, 0x01, 0x14, 0x2e, 0x08, 0x9d, 0xc4, + 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x25, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x68, 0x00, 0x0d, 0x00, 0x2e, 0x08, 0x20, 0x2c, + 0x2e, 0x08, 0x20, 0x30, 0x2e, 0x08, 0x20, 0x34, + 0x2e, 0x08, 0x20, 0x38, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x04, 0x70, 0x00, 0x00, 0x08, + 0x70, 0x00, 0x00, 0x0c, 0x70, 0x00, 0x00, 0x10, + 0x70, 0x00, 0x00, 0x30, 0x2e, 0x02, 0x3a, 0x7d, + 0x2e, 0x02, 0x3a, 0x0d, 0x2e, 0x02, 0x39, 0x85, + 0x2e, 0x02, 0x39, 0x7d, 0x2e, 0x02, 0x3a, 0xb5, + 0x2e, 0x02, 0x3a, 0x45, 0x2e, 0x02, 0x3a, 0xf9, + 0x2e, 0x02, 0x3a, 0xf1, 0x00, 0x00, 0x00, 0x00, + 0x9e, 0x00, 0x09, 0x80, 0x80, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, + 0xff, 0xf0, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, + 0xff, 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, + 0xff, 0xff, 0xc0, 0x00, 0xff, 0xff, 0xe0, 0x00, + 0xff, 0xff, 0xf0, 0x00, 0xff, 0xff, 0xf8, 0x00, + 0xff, 0xff, 0xfc, 0x00, 0xff, 0xff, 0xfe, 0x00, + 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xc0, 0xe0, 0xf0, + 0xf8, 0xfc, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x03, 0xa9, 0x18, + 0x2e, 0x03, 0xa9, 0x1a, 0x2e, 0x03, 0xa9, 0x1b, + 0x2e, 0x03, 0xa9, 0x1c, 0x2e, 0x03, 0xa9, 0x1d, + 0x2e, 0x03, 0xa9, 0x1e, 0x2e, 0x03, 0xa9, 0x1f, + 0x2e, 0x03, 0xa9, 0x20, 0x2e, 0x03, 0xa9, 0x21, + 0x2e, 0x03, 0xa9, 0x22, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, + 0x2e, 0x02, 0x39, 0x64, +}; + diff -Nru a/drivers/media/dvb/av7110/av7110_ir.c b/drivers/media/dvb/av7110/av7110_ir.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/av7110/av7110_ir.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,171 @@ +#include +#include +#include +#include +#include +#include + +#include "av7110.h" + + +#define UP_TIMEOUT (HZ/2) + +static int av7110_ir_debug = 0; + +#define dprintk(x...) do { if (av7110_ir_debug) printk (x); } while (0) + + +static struct input_dev input_dev; + + +static +u16 key_map [256] = { + KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, + KEY_8, KEY_9, KEY_LAST, 0, KEY_POWER, KEY_MUTE, 0, KEY_INFO, + KEY_VOLUMEUP, KEY_VOLUMEDOWN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + KEY_CHANNELUP, KEY_CHANNELDOWN, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, KEY_TEXT, 0, 0, KEY_TV, 0, 0, 0, 0, 0, KEY_SETUP, 0, 0, + 0, 0, 0, KEY_SUBTITLE, 0, 0, KEY_LANGUAGE, 0, + KEY_RADIO, 0, 0, 0, 0, KEY_EXIT, 0, 0, + KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_OK, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_RED, KEY_GREEN, KEY_YELLOW, + KEY_BLUE, 0, 0, 0, 0, 0, 0, 0, KEY_MENU, KEY_LIST, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, KEY_UP, KEY_UP, KEY_DOWN, KEY_DOWN, + 0, 0, 0, 0, KEY_EPG, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_MHP +}; + + +static +void av7110_emit_keyup (unsigned long data) +{ + if (!data || !test_bit (data, input_dev.key)) + return; + + input_event (&input_dev, EV_KEY, data, !!0); +} + + +static +struct timer_list keyup_timer = { function: av7110_emit_keyup }; + + +static +void av7110_emit_key (u32 ircom) +{ + int down = ircom & (0x80000000); + u16 keycode = key_map[ircom & 0xff]; + + dprintk ("#########%08x######### key %02x %s (keycode %i)\n", + ircom, ircom & 0xff, down ? "pressed" : "released", keycode); + + if (!keycode) { + printk ("%s: unknown key 0x%02x!!\n", + __FUNCTION__, ircom & 0xff); + return; + } + + if (timer_pending (&keyup_timer)) { + del_timer (&keyup_timer); + if (keyup_timer.data != keycode) + input_event (&input_dev, EV_KEY, keyup_timer.data, !!0); + } + + clear_bit (keycode, input_dev.key); + + input_event (&input_dev, EV_KEY, keycode, !0); + + keyup_timer.expires = jiffies + UP_TIMEOUT; + keyup_timer.data = keycode; + + add_timer (&keyup_timer); +} + +static +void input_register_keys (void) +{ + int i; + + memset (input_dev.keybit, 0, sizeof(input_dev.keybit)); + + for (i=0; i KEY_MAX) + key_map[i] = 0; + else if (key_map[i] > KEY_RESERVED) + set_bit (key_map[i], input_dev.keybit); + } +} + + +static +int av7110_ir_write_proc (struct file *file, const char *buffer, + unsigned long count, void *data) +{ + u32 ir_config; + + if (count < 4 + 256 * sizeof(u16)) + return -EINVAL; + + memcpy (&ir_config, buffer, 4); + memcpy (&key_map, buffer + 4, 256 * sizeof(u16)); + + av7110_setup_irc_config (NULL, ir_config); + + input_register_keys (); + + return count; +} + + +int __init av7110_ir_init (void) +{ + static struct proc_dir_entry *e; + + init_timer (&keyup_timer); + keyup_timer.data = 0; + + input_dev.name = "DVB on-card IR receiver"; + + /** + * enable keys + */ + set_bit (EV_KEY, input_dev.evbit); + + input_register_keys (); + + input_register_device(&input_dev); + + av7110_setup_irc_config (NULL, 0x0001); + av7110_register_irc_handler (av7110_emit_key); + + e = create_proc_entry ("av7110_ir", S_IFREG | S_IRUGO | S_IWUSR, NULL); + + if (e) { + e->write_proc = av7110_ir_write_proc; + e->size = 4 + 256 * sizeof(u16); + } + + return 0; +} + + +void __exit av7110_ir_exit (void) +{ + remove_proc_entry ("av7110_ir", NULL); + av7110_unregister_irc_handler (av7110_emit_key); + input_unregister_device(&input_dev); +} + +//MODULE_AUTHOR("Holger Waechtler "); +//MODULE_LICENSE("GPL"); + +MODULE_PARM(av7110_ir_debug,"i"); +MODULE_PARM_DESC(av7110_ir_debug, "enable AV7110 IR receiver debug messages"); + diff -Nru a/drivers/media/dvb/av7110/saa7146.c b/drivers/media/dvb/av7110/saa7146.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/av7110/saa7146.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,1662 @@ +/* + the api- and os-independet parts of the saa7146 device driver + + Copyright (C) 1998,1999 Michael Hunold + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "saa7146_defs.h" + +#define TRUNC(val,max) ((val) < (max) ? (val) : (max)) + +#ifdef __COMPILE_SAA7146__ + +struct saa7146_modes_constants + modes_constants[] = { + { V_OFFSET_PAL, V_FIELD_PAL, V_ACTIVE_LINES_PAL, + H_OFFSET_PAL, H_PIXELS_PAL, H_PIXELS_PAL+1, + V_ACTIVE_LINES_PAL, 1024 }, /* PAL values */ + { V_OFFSET_NTSC, V_FIELD_NTSC, V_ACTIVE_LINES_NTSC, + H_OFFSET_NTSC, H_PIXELS_NTSC, H_PIXELS_NTSC+1, + V_ACTIVE_LINES_NTSC, 1024 }, /* NTSC values */ + { 0,0,0,0,0,0,0,0 }, /* secam values */ + { 0,288,576, + 0,188*4,188*4+1, + 288,188*4 } /* TS values */ +}; + +/* ----------------------------------------------------------------------------------------- + helper functions for the calculation of the horizontal- and vertical scaling registers, + clip-format-register etc ... + these functions take pointers to the (most-likely read-out original-values) and manipulate + them according to the requested new scaling parameters. + ----------------------------------------------------------------------------------------- */ + +/* hps_coeff used for CXY and CXUV; scale 1/1 -> scale 1/64 */ +struct { + u16 hps_coeff; + u16 weight_sum; +} hps_h_coeff_tab [] = { + {0x00, 2}, {0x02, 4}, {0x00, 4}, {0x06, 8}, {0x02, 8}, + {0x08, 8}, {0x00, 8}, {0x1E, 16}, {0x0E, 8}, {0x26, 8}, + {0x06, 8}, {0x42, 8}, {0x02, 8}, {0x80, 8}, {0x00, 8}, + {0xFE, 16}, {0xFE, 8}, {0x7E, 8}, {0x7E, 8}, {0x3E, 8}, + {0x3E, 8}, {0x1E, 8}, {0x1E, 8}, {0x0E, 8}, {0x0E, 8}, + {0x06, 8}, {0x06, 8}, {0x02, 8}, {0x02, 8}, {0x00, 8}, + {0x00, 8}, {0xFE, 16}, {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, + {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, + {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, + {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, {0xFE, 8}, {0x7E, 8}, + {0x7E, 8}, {0x3E, 8}, {0x3E, 8}, {0x1E, 8}, {0x1E, 8}, + {0x0E, 8}, {0x0E, 8}, {0x06, 8}, {0x06, 8}, {0x02, 8}, + {0x02, 8}, {0x00, 8}, {0x00, 8}, {0xFE, 16} +}; + +/* table of attenuation values for horizontal scaling */ +u8 h_attenuation[] = { 1, 2, 4, 8, 2, 4, 8, 16, 0}; + +int calculate_h_scale_registers(struct saa7146* saa, u32 in_x, u32 out_x, int flip_lr, u32* hps_ctrl, u32* hps_v_gain, u32* hps_h_prescale, u32* hps_h_scale) +{ + /* horizontal prescaler */ + u32 dcgx = 0, xpsc = 0, xacm = 0, cxy = 0, cxuv = 0; + /* horizontal scaler */ + u32 xim = 0, xp = 0, xsci =0; + /* vertical scale & gain */ + u32 pfuv = 0; + /* helper variables */ + u32 h_atten = 0, i = 0; + + if ( 0 == out_x ) { + printk("saa7146: ==> calculate_h_scale_registers: invalid value (=0).\n"); + return -EINVAL; + } + + /* mask out vanity-bit */ + *hps_ctrl &= ~MASK_29; + + /* calculate prescale-(xspc)-value: [n .. 1/2) : 1 + [1/2 .. 1/3) : 2 + [1/3 .. 1/4) : 3 + ... */ + if (in_x > out_x) { + xpsc = in_x / out_x; + } else { + /* zooming */ + xpsc = 1; + } + + /* if flip_lr-bit is set, number of pixels after horizontal prescaling must be < 384 */ + if ( 0 != flip_lr ) { + /* set vanity bit */ + *hps_ctrl |= MASK_29; + + while (in_x / xpsc >= 384 ) + xpsc++; + } + /* if zooming is wanted, number of pixels after horizontal prescaling must be < 768 */ + else { + while ( in_x / xpsc >= 768 ) + xpsc++; + } + + /* maximum prescale is 64 (p.69) */ + if ( xpsc > 64 ) + xpsc = 64; + + /* keep xacm clear*/ + xacm = 0; + + /* set horizontal filter parameters (CXY = CXUV) */ + cxy = hps_h_coeff_tab[TRUNC(xpsc - 1, 63)].hps_coeff; + cxuv = cxy; + + /* calculate and set horizontal fine scale (xsci) */ + + /* bypass the horizontal scaler ? */ + if ( (in_x == out_x) && ( 1 == xpsc ) ) + xsci = 0x400; + else + xsci = ( (1024 * in_x) / (out_x * xpsc) ) + xpsc; + + /* set start phase for horizontal fine scale (xp) to 0 */ + xp = 0; + + /* set xim, if we bypass the horizontal scaler */ + if ( 0x400 == xsci ) + xim = 1; + else + xim = 0; + + /* if the prescaler is bypassed, enable horizontal accumulation mode (xacm) + and clear dcgx */ + if( 1 == xpsc ) { + xacm = 1; + dcgx = 0; + } else { + xacm = 0; + /* get best match in the table of attenuations for horizontal scaling */ + h_atten = hps_h_coeff_tab[TRUNC(xpsc - 1, 63)].weight_sum; + + for (i = 0; h_attenuation[i] != 0; i++) { + if (h_attenuation[i] >= h_atten) + break; + } + + dcgx = i; + } + + /* the horizontal scaling increment controls the UV filter to reduce the bandwith to + improve the display quality, so set it ... */ + if ( xsci == 0x400) + pfuv = 0x00; + else if ( xsci < 0x600) + pfuv = 0x01; + else if ( xsci < 0x680) + pfuv = 0x11; + else if ( xsci < 0x700) + pfuv = 0x22; + else + pfuv = 0x33; + + + *hps_v_gain &= MASK_W0|MASK_B2; + *hps_v_gain |= (pfuv << 24); + + *hps_h_scale &= ~(MASK_W1 | 0xf000); + *hps_h_scale |= (xim << 31) | (xp << 24) | (xsci << 12); + + *hps_h_prescale |= (dcgx << 27) | ((xpsc-1) << 18) | (xacm << 17) | (cxy << 8) | (cxuv << 0); + + return 0; +} + +struct { + u16 hps_coeff; + u16 weight_sum; +} hps_v_coeff_tab [] = { + {0x0100, 2}, {0x0102, 4}, {0x0300, 4}, {0x0106, 8}, + {0x0502, 8}, {0x0708, 8}, {0x0F00, 8}, {0x011E, 16}, + {0x110E, 16}, {0x1926, 16}, {0x3906, 16}, {0x3D42, 16}, + {0x7D02, 16}, {0x7F80, 16}, {0xFF00, 16}, {0x01FE, 32}, + {0x01FE, 32}, {0x817E, 32}, {0x817E, 32}, {0xC13E, 32}, + {0xC13E, 32}, {0xE11E, 32}, {0xE11E, 32}, {0xF10E, 32}, + {0xF10E, 32}, {0xF906, 32}, {0xF906, 32}, {0xFD02, 32}, + {0xFD02, 32}, {0xFF00, 32}, {0xFF00, 32}, {0x01FE, 64}, + {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, + {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, + {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, + {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, {0x01FE, 64}, + {0x01FE, 64}, {0x817E, 64}, {0x817E, 64}, {0xC13E, 64}, + {0xC13E, 64}, {0xE11E, 64}, {0xE11E, 64}, {0xF10E, 64}, + {0xF10E, 64}, {0xF906, 64}, {0xF906, 64}, {0xFD02, 64}, + {0xFD02, 64}, {0xFF00, 64}, {0xFF00, 64}, {0x01FE, 128} +}; + +/* table of attenuation values for vertical scaling */ +u16 v_attenuation[] = { 2, 4, 8, 16, 32, 64, 128, 256, 0}; + +int calculate_v_scale_registers(struct saa7146* saa, u32 in_y, u32 out_y, u32* hps_v_scale, u32* hps_v_gain) +{ + u32 yacm = 0, ysci = 0, yacl = 0, ypo = 0, ype = 0; /* vertical scaling */ + u32 dcgy = 0, cya_cyb = 0; /* vertical scale & gain */ + + u32 v_atten = 0, i = 0; /* helper variables */ + + /* error, if vertical zooming */ + if ( in_y < out_y ) { + printk("saa7146: ==> calculate_v_scale_registers: we cannot do vertical zooming.\n"); + return -EINVAL; + } + + /* linear phase interpolation may be used if scaling is between 1 and 1/2 + or scaling is between 1/2 and 1/4 (if interlace is set; see below) */ + if( ((2*out_y) >= in_y) || (((4*out_y) >= in_y) && saa->interlace != 0)) { + + /* convention: if scaling is between 1/2 and 1/4 we only use + the even lines, the odd lines get discarded (see function move_to) + if interlace is set */ + if( saa->interlace != 0 && (out_y*4) >= in_y && (out_y*2) <= in_y) + out_y *= 2; + + yacm = 0; + yacl = 0; + cya_cyb = 0x00ff; + + /* calculate scaling increment */ + if ( in_y > out_y ) + ysci = ((1024 * in_y) / (out_y + 1)) - 1024; + else + ysci = 0; + + dcgy = 0; + + /* calculate ype and ypo */ + if (saa->interlace !=0) { + + /* Special case for interlaced input */ + + /* See Philips SAA7146A Product Spec (page 75): */ + /* "For interlaced input, ype and ypo is defiend as */ + /* YPeven= 3/2 x YPodd (line 1 = odd)" */ + /* */ + /* It looks like the spec is wrong! */ + /* The ad hoc values below works fine for a target */ + /* window height of 480 (vertical scale = 1/1) NTSC. */ + /* PLI: December 27, 2000. */ + ypo=64; + ype=0; + } else { + ype = ysci / 16; + ypo = ype + (ysci / 64); + } + } + else { + yacm = 1; + + /* calculate scaling increment */ + ysci = (((10 * 1024 * (in_y - out_y - 1)) / in_y) + 9) / 10; + + /* calculate ype and ypo */ + ypo = ype = ((ysci + 15) / 16); + + /* the sequence length interval (yacl) has to be set according + to the prescale value, e.g. [n .. 1/2) : 0 + [1/2 .. 1/3) : 1 + [1/3 .. 1/4) : 2 + ... */ + if ( ysci < 512) { + yacl = 0; + } + else { + yacl = ( ysci / (1024 - ysci) ); + } + + /* get filter coefficients for cya, cyb from table hps_v_coeff_tab */ + cya_cyb = hps_v_coeff_tab[TRUNC(yacl, 63)].hps_coeff; + + /* get best match in the table of attenuations for vertical scaling */ + v_atten = hps_v_coeff_tab[TRUNC(yacl, 63)].weight_sum; + + for (i = 0; v_attenuation[i] != 0; i++) { + if (v_attenuation[i] >= v_atten) + break; + } + + dcgy = i; + } + + /* ypo and ype swapped in spec ? */ + *hps_v_scale |= (yacm << 31) | (ysci << 21) | (yacl << 15) | (ypo << 8 ) | (ype << 1); + + *hps_v_gain &= ~(MASK_W0|MASK_B2); + *hps_v_gain |= (dcgy << 16) | (cya_cyb << 0); + + return 0; +} + +void calculate_hxo_hyo_and_sources(struct saa7146* saa, int port_sel, int sync_sel, u32* hps_h_scale, u32* hps_ctrl) +{ + u32 hyo = 0, hxo = 0; + + hyo = modes_constants[saa->mode].v_offset; + hxo = modes_constants[saa->mode].h_offset; + + *hps_h_scale &= ~(MASK_B0 | 0xf00); + *hps_ctrl &= ~(MASK_W0 | MASK_B2 | MASK_30 | MASK_31 | MASK_28); + + *hps_h_scale |= (hxo << 0); + *hps_ctrl |= (hyo << 12); + + *hps_ctrl |= ( port_sel == 0 ? 0x0 : MASK_30); + *hps_ctrl |= ( sync_sel == 0 ? 0x0 : MASK_28); +} + +void calculate_output_format_register(struct saa7146* saa, u16 palette, u32* clip_format) +{ + /* clear out the necessary bits */ + *clip_format &= 0x0000ffff; + /* set these bits new */ + *clip_format |= (( ((palette&0xf00)>>8) << 30) | ((palette&0x00f) << 24) | (((palette&0x0f0)>>4) << 16)); +} + +void calculate_bcs_ctrl_register(struct saa7146 *saa, u32 brightness, u32 contrast, u32 colour, u32 *bcs_ctrl) +{ + *bcs_ctrl = ((brightness << 24) | (contrast << 16) | (colour << 0)); +} + + +int calculate_video_dma1_grab(struct saa7146* saa, int frame, struct saa7146_video_dma* vdma1) +{ + int depth = 0; + + switch(saa->grab_format[frame]) { + case YUV422_COMPOSED: + case RGB15_COMPOSED: + case RGB16_COMPOSED: + depth = 2; + break; + case RGB24_COMPOSED: + depth = 3; + break; + default: + depth = 4; + break; + } + + vdma1->pitch = saa->grab_width[frame]*depth*2; + vdma1->base_even = 0; + vdma1->base_odd = vdma1->base_even + (vdma1->pitch/2); + vdma1->prot_addr = (saa->grab_width[frame]*saa->grab_height[frame]*depth)-1; + vdma1->num_line_byte = ((modes_constants[saa->mode].v_field<<16) + modes_constants[saa->mode].h_pixels); + vdma1->base_page = virt_to_bus(saa->page_table[frame]) | ME1; + + /* convention: if scaling is between 1/2 and 1/4 we only use + the even lines, the odd lines get discarded (see vertical scaling) */ + if( saa->interlace != 0 && saa->grab_height[frame]*4 >= modes_constants[saa->mode].v_calc && saa->grab_height[frame]*2 <= modes_constants[saa->mode].v_calc) { + vdma1->base_odd = vdma1->prot_addr; + vdma1->pitch /= 2; + } + + return 0; +} + +/* ---------------------------------------------*/ +/* position of overlay-window */ +/* ---------------------------------------------*/ + +/* calculate the new memory offsets for a desired position */ +int move_to(struct saa7146* saa, int w_x, int w_y, int w_height, int b_width, int b_depth, int b_bpl, u32 base, int td_flip) +{ + struct saa7146_video_dma vdma1; + + if( w_y < 0 || w_height <= 0 || b_depth <= 0 || b_bpl <= 0 || base == 0 ) { + printk("saa7146: ==> calculate_video_dma1_overlay: illegal values: y: %d h: %d d: %d b: %d base: %d\n",w_y ,w_height,b_depth,b_bpl,base); + return -EINVAL; + } + + /* calculate memory offsets for picture, look if we shall top-down-flip */ + vdma1.pitch = 2*b_bpl; + if ( 0 == td_flip ) { + vdma1.prot_addr = (u32)base + ((w_height+w_y+1)*b_width*(b_depth/4)); + vdma1.base_even = (u32)base + (w_y * (vdma1.pitch/2)) + (w_x * (b_depth / 8)); + vdma1.base_odd = vdma1.base_even + (vdma1.pitch / 2); + } + else { + vdma1.prot_addr = (u32)base + (w_y * (vdma1.pitch/2)); + vdma1.base_even = (u32)base + ((w_y+w_height) * (vdma1.pitch/2)) + (w_x * (b_depth / 8)); + vdma1.base_odd = vdma1.base_even + (vdma1.pitch / 2); + vdma1.pitch *= -1; + } + + /* convention: if scaling is between 1/2 and 1/4 we only use + the even lines, the odd lines get discarded (see vertical scaling) */ + if( saa->interlace != 0 && w_height*4 >= modes_constants[saa->mode].v_calc && w_height*2 <= modes_constants[saa->mode].v_calc) { + vdma1.base_odd = vdma1.prot_addr; + vdma1.pitch /= 2; + } + + vdma1.base_page = 0; + vdma1.num_line_byte = (modes_constants[saa->mode].v_field<<16)+modes_constants[saa->mode].h_pixels; + + saa7146_write(saa->mem, BASE_EVEN1, vdma1.base_even); + saa7146_write(saa->mem, BASE_ODD1, vdma1.base_odd); + saa7146_write(saa->mem, PROT_ADDR1, vdma1.prot_addr); + saa7146_write(saa->mem, BASE_PAGE1, vdma1.base_page); + saa7146_write(saa->mem, PITCH1, vdma1.pitch); + saa7146_write(saa->mem, NUM_LINE_BYTE1, vdma1.num_line_byte); + + /* update the video dma 1 registers */ + saa7146_write(saa->mem, MC2, (MASK_02 | MASK_18)); + + return 0; + +} + +/* ---------------------------------------------*/ +/* size of window (overlay) */ +/* ---------------------------------------------*/ + +int set_window(struct saa7146* saa, int width, int height, int flip_lr, int port_sel, int sync_sel) +{ + u32 hps_v_scale = 0, hps_v_gain = 0, hps_ctrl = 0, hps_h_prescale = 0, hps_h_scale = 0; + + /* set vertical scale according to selected mode: 0 = PAL, 1 = NTSC */ + hps_v_scale = 0; /* all bits get set by the function-call */ + hps_v_gain = 0; /* fixme: saa7146_read(saa->mem, HPS_V_GAIN);*/ + calculate_v_scale_registers(saa, modes_constants[saa->mode].v_calc, height, &hps_v_scale, &hps_v_gain); + + /* set horizontal scale according to selected mode: 0 = PAL, 1 = NTSC */ + hps_ctrl = 0; + hps_h_prescale = 0; /* all bits get set in the function */ + hps_h_scale = 0; + calculate_h_scale_registers(saa, modes_constants[saa->mode].h_calc, width, 0, &hps_ctrl, &hps_v_gain, &hps_h_prescale, &hps_h_scale); + + /* set hyo and hxo */ + calculate_hxo_hyo_and_sources(saa, port_sel, sync_sel, &hps_h_scale, &hps_ctrl); + + /* write out new register contents */ + saa7146_write(saa->mem, HPS_V_SCALE, hps_v_scale); + saa7146_write(saa->mem, HPS_V_GAIN, hps_v_gain); + saa7146_write(saa->mem, HPS_CTRL, hps_ctrl); + saa7146_write(saa->mem, HPS_H_PRESCALE,hps_h_prescale); + saa7146_write(saa->mem, HPS_H_SCALE, hps_h_scale); + + /* upload shadow-ram registers */ + saa7146_write( saa->mem, MC2, (MASK_05 | MASK_06 | MASK_21 | MASK_22) ); + +/* + printk("w:%d,h:%d\n",width,height); +*/ + return 0; + +} + +void set_output_format(struct saa7146* saa, u16 palette) +{ + u32 clip_format = saa7146_read(saa->mem, CLIP_FORMAT_CTRL); + + dprintk("saa7146: ==> set_output_format: pal:0x%03x\n",palette); + + /* call helper function */ + calculate_output_format_register(saa,palette,&clip_format); + dprintk("saa7146: ==> set_output_format: 0x%08x\n",clip_format); + + /* update the hps registers */ + saa7146_write(saa->mem, CLIP_FORMAT_CTRL, clip_format); + saa7146_write(saa->mem, MC2, (MASK_05 | MASK_21)); +} + +void set_picture_prop(struct saa7146 *saa, u32 brightness, u32 contrast, u32 colour) +{ + u32 bcs_ctrl = 0; + + calculate_bcs_ctrl_register(saa, brightness, contrast, colour, &bcs_ctrl); + saa7146_write(saa->mem, BCS_CTRL, bcs_ctrl); + + /* update the bcs register */ + saa7146_write(saa->mem, MC2, (MASK_06 | MASK_22)); +} + +/* ---------------------------------------------*/ +/* overlay enable/disable */ +/* ---------------------------------------------*/ + +/* enable(1) / disable(0) video */ +void video_setmode(struct saa7146* saa, int v) +{ + hprintk("saa7146: ==> video_setmode; m:%d\n",v); + + /* disable ? */ + if(v==0) { + /* disable video dma1 */ + saa7146_write(saa->mem, MC1, MASK_22); + } else {/* or enable ? */ + /* fixme: enable video */ + saa7146_write(saa->mem, MC1, (MASK_06 | MASK_22)); + } +} + +/* ----------------------------------------------------- + common grabbing-functions. if you have some simple + saa7146-based frame-grabber you can most likely call + these. they do all the revision-dependend stuff and + do rps/irq-based grabbing for you. + -----------------------------------------------------*/ + +/* this function initializes the rps for the next grab for any "old" + saa7146s (= revision 0). it assumes that the rps is *not* running + when it gets called. */ +int init_rps0_rev0(struct saa7146* saa, int frame, int irq_call) +{ + struct saa7146_video_dma vdma1; + u32 hps_v_scale = 0, hps_v_gain = 0, hps_ctrl = 0, hps_h_prescale = 0, hps_h_scale = 0; + u32 clip_format = 0; /* this can be 0, since we don't do clipping */ + u32 bcs_ctrl = 0; + + int count = 0; + +/* these static values are used to remember the last "programming" of the rps. + if the height, width and format of the grab has not changed (which is very likely + when some streaming capture is done) the reprogramming overhead can be minimized */ +static int last_height = 0; +static int last_width = 0; +static int last_format = 0; +static int last_port = 0; +static int last_frame = -1; + + /* write the address of the rps-program */ + saa7146_write(saa->mem, RPS_ADDR0, virt_to_bus(&saa->rps0[ 0])); + + /* let's check if we can re-use something of the last grabbing process */ + if ( saa->grab_height[frame] != last_height + || saa->grab_width[frame] != last_width + || saa->grab_port[frame] != last_port + || saa->grab_format[frame] != last_format ) { + + /* nope, we have to start from the beginning */ + calculate_video_dma1_grab(saa, frame, &vdma1); + calculate_v_scale_registers(saa, modes_constants[saa->mode].v_calc, saa->grab_height[frame], &hps_v_scale, &hps_v_gain); + calculate_h_scale_registers(saa, modes_constants[saa->mode].h_calc, saa->grab_width[frame], 0, &hps_ctrl, &hps_v_gain, &hps_h_prescale, &hps_h_scale); + calculate_hxo_hyo_and_sources(saa, saa->grab_port[frame], saa->grab_port[frame], &hps_h_scale, &hps_ctrl); + calculate_output_format_register(saa,saa->grab_format[frame],&clip_format); + calculate_bcs_ctrl_register(saa, 0x80, 0x40, 0x40, &bcs_ctrl); + + count = 0; + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4)); /* turn off video-dma1 and dma2 (clipping)*/ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22 | MASK_05 | MASK_21); /* => mask */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_22 | MASK_21); /* => values */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[frame] == 0 ? MASK_12 : MASK_14)); /* wait for o_fid_a/b */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[frame] == 0 ? MASK_11 : MASK_13)); /* wait for e_fid_a/b */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (6 << 8) | HPS_CTRL/4); /* upload hps-registers for next grab */ + saa->rps0[ count++ ] = cpu_to_le32(hps_ctrl); + saa->rps0[ count++ ] = cpu_to_le32(hps_v_scale); + saa->rps0[ count++ ] = cpu_to_le32(hps_v_gain); + saa->rps0[ count++ ] = cpu_to_le32(hps_h_prescale); + saa->rps0[ count++ ] = cpu_to_le32(hps_h_scale); + saa->rps0[ count++ ] = cpu_to_le32(bcs_ctrl); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (1 << 8) | CLIP_FORMAT_CTRL/4);/* upload hps-registers for next grab */ + saa->rps0[ count++ ] = cpu_to_le32(clip_format); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_UPLOAD | MASK_05 | MASK_06); /* upload hps1/2 */ + + /* upload video-dma1 registers for next grab */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (6 << 8) | BASE_ODD1/4); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_odd); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_even); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.prot_addr); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.pitch); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_page); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.num_line_byte); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_UPLOAD | MASK_02); /* upload video-dma1 */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4)); /* turn on video-dma1 */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22); /* => mask */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22); /* => values */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (1 << 8) | (MC2/4)); /* Write MC2 */ + saa->rps0[ count++ ] = cpu_to_le32((1 << (27+frame)) | (1 << (11+frame))); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[frame] == 0 ? MASK_12 : MASK_14)); /* wait for o_fid_a/b */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[frame] == 0 ? MASK_11 : MASK_13)); /* wait for e_fid_a/b */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4)); /* turn off video-dma1 */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22); /* => mask */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_22); /* => values */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_INTERRUPT); /* generate interrupt */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_STOP); /* stop processing */ + } else { + + /* the height, width, ... have not changed. check if the user wants to grab to + another *buffer* */ + if( frame != last_frame ) { + + /* ok, we want to grab to another buffer, but with the same programming. + it is sufficient to adjust the video_dma1-registers and the rps-signal stuff. */ + saa->rps0[ 20 ] = cpu_to_le32(virt_to_bus(saa->page_table[frame]) | ME1); + saa->rps0[ 27 ] = cpu_to_le32((1 << (27+frame)) | (1 << (11+frame))); + + } + } + + /* if we are called from within the irq-handler, the hps is at the beginning of a + new frame. the rps does not need to wait the new frame, and so we tweak the + starting address a little bit and so we can directly start grabbing again. + note: for large video-sizes and slow computers this can cause jaggy pictures + because the whole process is not in sync. perhaps one should be able to + disable this. (please remember that this whole stuff only belongs to + "old" saa7146s (= revision 0), newer saa7146s don´t have any hardware-bugs + and capture works fine. (see below) */ + if( 1 == irq_call ) { + saa7146_write(saa->mem, RPS_ADDR0, virt_to_bus(&saa->rps0[15])); + } + + /* turn on rps */ + saa7146_write(saa->mem, MC1, (MASK_12 | MASK_28)); + + /* store the values for the last grab */ + last_height = saa->grab_height[frame]; + last_width = saa->grab_width[frame]; + last_format = saa->grab_format[frame]; + last_port = saa->grab_port[frame]; + last_frame = frame; + + return 0; +} + +int init_rps0_rev1(struct saa7146* saa, int frame) { + +static int old_width[SAA7146_MAX_BUF]; /* pixel width of grabs */ +static int old_height[SAA7146_MAX_BUF]; /* pixel height of grabs */ +static int old_format[SAA7146_MAX_BUF]; /* video format of grabs */ +static int old_port[SAA7146_MAX_BUF]; /* video port for grab */ + +static int buf_stat[SAA7146_MAX_BUF]; + + struct saa7146_video_dma vdma1; + u32 hps_v_scale = 0, hps_v_gain = 0, hps_ctrl = 0, hps_h_prescale = 0, hps_h_scale = 0; + u32 clip_format = 0; /* this can be 0, since we don't do clipping */ + u32 bcs_ctrl = 0; + + int i = 0, count = 0; + + /* check if something has changed since the last grab for this buffer */ + if ( saa->grab_height[frame] == old_height[frame] + && saa->grab_width[frame] == old_width[frame] + && saa->grab_port[frame] == old_port[frame] + && saa->grab_format[frame] == old_format[frame] ) { + + /* nope, nothing to be done here */ + return 0; + } + + /* re-program the rps0 completely */ + + /* indicate that the user has requested re-programming of the 'frame'-buffer */ + buf_stat[frame] = 1; + + /* turn off rps */ + saa7146_write(saa->mem, MC1, MASK_28); + + + /* write beginning of rps-program */ + count = 0; + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | MASK_12); /* wait for o_fid_a */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | MASK_11); /* wait for e_fid_a */ + for(i = 0; i < saa->buffers; i++) { + saa->rps0[ count++ ] = cpu_to_le32(CMD_JUMP | (1 << (21+i))); /* check signal x, jump if set */ + saa->rps0[ count++ ] = cpu_to_le32(virt_to_bus(&saa->rps0[40*(i+1)])); + } + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | MASK_12); /* wait for o_fid_a */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | MASK_11); /* wait for e_fid_a */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_JUMP); /* jump to the beginning */ + saa->rps0[ count++ ] = cpu_to_le32(virt_to_bus(&saa->rps0[2])); + + for(i = 0; i < saa->buffers; i++) { + + /* we only re-program the i-th buffer if the user had set some values for it earlier. + otherwise the calculation-functions may fail. */ + if( buf_stat[i] == 0) + continue; + + count = 40*(i+1); + + calculate_video_dma1_grab(saa, i, &vdma1); + calculate_v_scale_registers(saa, modes_constants[saa->mode].v_calc, saa->grab_height[i], &hps_v_scale, &hps_v_gain); + calculate_h_scale_registers(saa, modes_constants[saa->mode].h_calc, saa->grab_width[i], 0, &hps_ctrl, &hps_v_gain, &hps_h_prescale, &hps_h_scale); + calculate_hxo_hyo_and_sources(saa, saa->grab_port[i], saa->grab_port[i], &hps_h_scale, &hps_ctrl); + calculate_output_format_register(saa,saa->grab_format[i],&clip_format); + calculate_bcs_ctrl_register(saa, 0x80, 0x40, 0x40, &bcs_ctrl); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (6 << 8) | HPS_CTRL/4); /* upload hps-registers for next grab */ + saa->rps0[ count++ ] = cpu_to_le32(hps_ctrl); + saa->rps0[ count++ ] = cpu_to_le32(hps_v_scale); + saa->rps0[ count++ ] = cpu_to_le32(hps_v_gain); + saa->rps0[ count++ ] = cpu_to_le32(hps_h_prescale); + saa->rps0[ count++ ] = cpu_to_le32(hps_h_scale); + saa->rps0[ count++ ] = cpu_to_le32(bcs_ctrl); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (1 << 8) | CLIP_FORMAT_CTRL/4);/* upload hps-registers for next grab */ + saa->rps0[ count++ ] = cpu_to_le32(clip_format); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_UPLOAD | MASK_05 | MASK_06); /* upload hps1/2 */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (6 << 8) | BASE_ODD1/4); /* upload video-dma1 registers for next grab */ + saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_odd); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_even); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.prot_addr); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.pitch); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_page); + saa->rps0[ count++ ] = cpu_to_le32(vdma1.num_line_byte); + + saa->rps0[ count++ ] = cpu_to_le32(CMD_UPLOAD | MASK_02); /* upload video-dma1 */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4)); /* turn on video-dma1 */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22); /* => mask */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22); /* => values */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[i] == 0 ? MASK_12 : MASK_14)); /* wait for o_fid_a/b */ + saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[i] == 0 ? MASK_11 : MASK_13)); /* wait for e_fid_a/b */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4)); /* turn off video-dma1 and dma2 (clipping)*/ + saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22 | MASK_05 | MASK_21); /* => mask */ + saa->rps0[ count++ ] = cpu_to_le32(MASK_22 | MASK_21); /* => values */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (1 << 8) | (MC2/4)); /* Write MC2 */ + saa->rps0[ count++ ] = cpu_to_le32((1 << (27+i))); + saa->rps0[ count++ ] = cpu_to_le32(CMD_INTERRUPT); /* generate interrupt */ + + saa->rps0[ count++ ] = cpu_to_le32(CMD_JUMP); /* jump to the beginning */ + saa->rps0[ count++ ] = cpu_to_le32(virt_to_bus(&saa->rps0[2])); + + old_height[frame] = saa->grab_height[frame]; + old_width[frame] = saa->grab_width[frame]; + old_port[frame] = saa->grab_port[frame]; + old_format[frame] = saa->grab_format[frame]; + } + + /* write the address of the rps-program */ + saa7146_write(saa->mem, RPS_ADDR0, virt_to_bus(&saa->rps0[ 0])); + /* turn on rps again */ + saa7146_write(saa->mem, MC1, (MASK_12 | MASK_28)); + + return 0; +} + +/* this funtion is called whenever a new grab is requested. if possible (that + means: if the rps is not running) it re-programs the rps, otherwise it relys on + the irq-handler to do that */ +int set_up_grabbing(struct saa7146* saa, int frame) +{ + u32 mc1 = 0; + + if( 0 == saa->revision ) { + + /* check if the rps is currently in use */ + mc1 = saa7146_read(saa->mem, MC1); + + /* the rps is not running ... */ + if( 0 == ( mc1 & MASK_12) ) { + + /* we can completly re-program the rps now */ + dprintk("saa7146_v4l.o: ==> set_up_grabbing: start new rps.\n"); + init_rps0_rev0(saa,frame,0); + } else { + + /* the rps is running. in this case, the irq-handler is responsible for + re-programming the rps and nothing can be done right now */ + dprintk("saa7146_v4l.o: ==> set_up_grabbing: no new rps started.\n"); + } + } else { + /* check if something has changed, reprogram if necessary */ + init_rps0_rev1(saa,frame); + /* set rps-signal-bit to start grabbing */ + saa7146_write(saa->mem, MC2, (1 << (27+frame)) | (1 << (11+frame))); + } + + return 0; +} + + +void saa7146_std_grab_irq_callback_rps0(struct saa7146* saa, u32 isr, void* data) +{ + u32 mc2 = 0; + int i = 0; + + hprintk("saa7146_v4l.o: ==> saa7146_v4l_irq_callback_rps0\n"); + + /* check for revision: old revision */ + if( 0 == saa->revision ) { + + /* look what buffer has been grabbed, set the ´done´-flag and clear the signal */ + mc2 = saa7146_read(saa->mem, MC2); + for( i = 0; i < saa->buffers; i++ ) { + + if ((0 != (mc2 & (1 << (11+i)))) && (GBUFFER_GRABBING == saa->frame_stat[i])) { + saa->frame_stat[i] = GBUFFER_DONE; + saa7146_write(saa->mem, MC2, (1<<(27+i))); + } + } + + /* look if there is another buffer we can grab to */ + for( i = 0; i < saa->buffers; i++ ) { + if ( GBUFFER_GRABBING == saa->frame_stat[i] ) + break; + } + + /* yes, then set up the rps again */ + if( saa->buffers != i) { + init_rps0_rev0(saa,i,1); + } + } else { + /* new revisions */ + + /* look what buffer has been grabbed, set the ´done´-flag */ + mc2 = saa7146_read(saa->mem, MC2); + for( i = 0; i < saa->buffers; i++ ) { + + if ((0 == (mc2 & (1 << (11+i)))) && (GBUFFER_GRABBING == saa->frame_stat[i])) { + saa->frame_stat[i] = GBUFFER_DONE; + } + } + + } + /* notify any pending process */ + wake_up_interruptible(&saa->rps0_wq); + return; +} + +/* ---------------------------------------------*/ +/* mask-clipping */ +/* ---------------------------------------------*/ +int calculate_clipping_registers_mask(struct saa7146* saa, u32 width, u32 height, struct saa7146_video_dma* vdma2, u32* clip_format, u32* arbtr_ctrl) +{ + u32 clip_addr = 0, clip_pitch = 0; + + dprintk("saa7146: ==> calculate_clipping_registers_mask\n"); + + /* adjust arbitration control register */ + *arbtr_ctrl &= 0xffff00ff; + *arbtr_ctrl |= 0x00001000; + + clip_addr = virt_to_bus(saa->clipping); + clip_pitch = ((width+31)/32)*4; + + vdma2->base_even = clip_addr; + vdma2->base_page = 0x04; /* enable read - operation */ + vdma2->prot_addr = clip_addr + (clip_pitch*height); + + /* convention: if scaling is between 1/2 and 1/4 we only use + the even lines, the odd lines get discarded (see vertical scaling) */ + if( saa->interlace != 0 && height*4 >= modes_constants[saa->mode].v_calc && height*2 <= modes_constants[saa->mode].v_calc) { + vdma2->base_odd = vdma2->prot_addr; + vdma2->pitch = clip_pitch; + vdma2->num_line_byte = (((height)-1) << 16) | (clip_pitch-1); + } else { + vdma2->base_odd = clip_addr+clip_pitch; + vdma2->pitch = clip_pitch*2; + vdma2->num_line_byte = (((height/2)-1) << 16) | (clip_pitch-1); + } + + *clip_format &= 0xfffffff7; + + return 0; +} + +/* helper functions for emulate rect-clipping via mask-clipping. + note: these are extremely inefficient, but for clipping with less than 16 + windows rect-clipping should be done anyway... +*/ + +/* clear one pixel of the clipping memory at position (x,y) */ +void set_pixel(s32 x, s32 y, s32 window_width, u32* mem) { + + u32 mem_per_row = 0; + u32 adr = 0; + u32 shift = 0; + u32 bit = 0; + + mem_per_row = (window_width + 31 )/ 32 ; + adr = y * mem_per_row + (x / 32); + shift = 31 - (x % 32); + bit = (1 << shift); + + mem[adr] |= bit; +} + +/* clear a box out of the clipping memory, beginning at (x,y) with "width" and "height" */ +void set_box(s32 x, s32 y, s32 width, s32 height, s32 window_width, s32 window_height, u32* mem) +{ + s32 ty = 0; + s32 tx = 0; + + /* the video_clip-struct may contain negative values to indicate that a window + doesn't lay completly over the video window. Thus, we correct the values */ + + if( width < 0) { + x += width; width = -width; + } + if( height < 0) { + y += height; height = -height; + } + + if( x < 0) { + width += x; x = 0; + } + if( y < 0) { + height += y; y = 0; + } + + if( width <= 0 || height <= 0) { + printk("saa7146: ==> set_box: sanity error!\n"); + return; + } + + if(x + width > window_width) + width -= (x + width) - window_width; + if(y + height > window_height) + height -= (y + height) - window_height; + + /* Now, set a '1' in the memory, where no video picture should appear */ + for(ty = y; ty < y+height; ty++) { + for(tx = x; tx < x+width; tx++) { + set_pixel(tx, ty, window_width, mem); + } + } +} + +int emulate_rect_clipping(struct saa7146 *saa, u16 clipcount, int x[], int y[], int w[], int h[], u32 w_width, u32 w_height) +{ + int i = 0; + + /* clear out clipping mem */ + memset(saa->clipping, 0x0, CLIPPING_MEM_SIZE*sizeof(u32)); + + /* go through list of clipping-windows, clear out rectangular-regions in the clipping memory */ + for(i = 0; i < clipcount; i++) { + set_box(x[i], y[i], w[i], h[i], w_width, w_height, saa->clipping); + } + + return 0; +} + +/* ---------------------------------------------*/ +/* rectangle-clipping */ +/* ---------------------------------------------*/ + +#define MIN(x,y) ( ((x) < (y)) ? (x) : (y) ) +#define MAX(x,y) ( ((x) > (y)) ? (x) : (y) ) + +/* simple double-sort algorithm with duplicate elimination */ +int sort_and_eliminate(u32* values, int* count) +{ + int low = 0, high = 0, top = 0, temp = 0; + int cur = 0, next = 0; + + /* sanity checks */ + if( (0 > *count) || (NULL == values) ) { + printk("saa7146: ==> sort_and_eliminate: internal error #1\n"); + return -EINVAL; + } + + /* bubble sort the first ´count´ items of the array ´values´ */ + for( top = *count; top > 0; top--) { + for( low = 0, high = 1; high < top; low++, high++) { + if( values[low] > values[high] ) { + temp = values[low]; + values[low] = values[high]; + values[high] = temp; + } + } + } + + /* remove duplicate items */ + for( cur = 0, next = 1; next < *count; next++) { + if( values[cur] != values[next]) + values[++cur] = values[next]; + } + + *count = cur + 1; + + return 0; +} + +int calculate_clipping_registers_rect(struct saa7146 *saa, int clipcount, int x[], int y[], int w[], int h[], u32 width, u32 height, struct saa7146_video_dma* vdma2, u32* clip_format, u32* arbtr_ctrl) +{ + u32 line_list[32]; + u32 pixel_list[32]; + u32 numdwords = 0; + + int i = 0, j = 0; + int l = 0, r = 0, t = 0, b = 0; + int cnt_line = 0, cnt_pixel = 0; + + dprintk("saa7146: ==> calculate_clipping_registers_clip\n"); + + /* clear out memory */ + memset(&line_list[0], 0x00, sizeof(u32)*32); + memset(&pixel_list[0], 0x00, sizeof(u32)*32); + memset(saa->clipping, 0x00, sizeof(u32)*CLIPPING_MEM_SIZE); + + /* fill the line and pixel-lists */ + for(i = 0; i < clipcount; i++) { + + /* calculate values for l(eft), r(ight), t(op), b(ottom) */ + l = x[i]; + r = x[i]+w[i]; + t = y[i]; + b = y[i]+h[i]; + + /* insert left/right coordinates */ + pixel_list[ 2*i ] = MIN(l, width); + pixel_list[(2*i)+1] = MIN(r, width); + /* insert top/bottom coordinates */ + line_list[ 2*i ] = MIN(t, height); + line_list[(2*i)+1] = MIN(b, height); + } + + /* sort and eliminate lists */ + cnt_line = cnt_pixel = 2*clipcount; + sort_and_eliminate( &pixel_list[0], &cnt_pixel ); + sort_and_eliminate( &line_list[0], &cnt_line ); + + /* calculate the number of used u32s */ + numdwords = MAX( (cnt_line+1), (cnt_pixel+1))*2; + numdwords = MAX(4, numdwords); + numdwords = MIN(64, numdwords); + + /* fill up cliptable */ + for(i = 0; i < cnt_pixel; i++) { + saa->clipping[2*i] |= (pixel_list[i] << 16); + } + for(i = 0; i < cnt_line; i++) { + saa->clipping[(2*i)+1] |= (line_list[i] << 16); + } + + /* fill up cliptable with the display infos */ + for(j = 0; j < clipcount; j++) { + + for(i = 0; i < cnt_pixel; i++) { + + if( x[j] < 0) + x[j] = 0; + + if( pixel_list[i] < (x[j] + w[j])) { + + if ( pixel_list[i] >= x[j] ) { + saa->clipping[2*i] |= (1 << j); + } + } + } + for(i = 0; i < cnt_line; i++) { + + if( y[j] < 0) + y[j] = 0; + + if( line_list[i] < (y[j] + h[j]) ) { + + if( line_list[i] >= y[j] ) { + saa->clipping[(2*i)+1] |= (1 << j); + } + } + } + } + + /* adjust arbitration control register */ + *arbtr_ctrl &= 0xffff00ff; + *arbtr_ctrl |= 0x00001c00; + + vdma2->base_even = virt_to_bus(saa->clipping); + vdma2->base_odd = virt_to_bus(saa->clipping); + vdma2->prot_addr = virt_to_bus(saa->clipping)+((sizeof(u32))*(numdwords)); + vdma2->base_page = 0x04; + vdma2->pitch = 0x00; + vdma2->num_line_byte = (0 << 16 | (sizeof(u32))*(numdwords-1) ); + + /* set clipping-mode. please note again, that for sizes below 1/2, we only use the + even-field. because of this, we have to specify ´recinterl´ correctly (specs, p. 97)*/ + *clip_format &= 0xfffffff7; + + if( saa->interlace != 0 && height*4 >= modes_constants[saa->mode].v_calc && height*2 <= modes_constants[saa->mode].v_calc) { + *clip_format |= 0x00000000; + } else { + *clip_format |= 0x00000008; + } + return 0; +} + + +/* ---------------------------------------------*/ +/* main function for clipping */ +/* ---------------------------------------------*/ +/* arguments: + type = see ´saa7146.h´ + width = width of the video-window + height = height of the video-window + *mask = pointer to mask memory (only needed for mask-clipping) + *clips = pointer to clip-window-list (only needed for rect-clipping) + clipcount = # of clip-windows (only needed for rect-clipping) +*/ +int clip_windows(struct saa7146* saa, u32 type, u32 width, u32 height, u32* mask, u16 clipcount, int x[], int y[], int w[], int h[]) +{ + struct saa7146_video_dma vdma2; + + u32 clip_format = saa7146_read(saa->mem, CLIP_FORMAT_CTRL); + u32 arbtr_ctrl = saa7146_read(saa->mem, PCI_BT_V1); + + hprintk("saa7146: ==> clip_windows\n"); + + /* some sanity checks first */ + if ( width <= 0 || height <= 0 ) { + printk("saa7146: ==> clip_windows: sanity error #1!\n"); + return -EINVAL; + } + + /* check if anything to do here, disable clipping if == 0 */ + if( clipcount == 0 ) { + + /* mask out relevant bits (=lower word)*/ + clip_format &= MASK_W1; + + /* upload clipping-registers*/ + saa7146_write(saa->mem, CLIP_FORMAT_CTRL,clip_format); + saa7146_write(saa->mem, MC2, (MASK_05 | MASK_21)); + + /* disable video dma2 */ + saa7146_write(saa->mem, MC1, (MASK_21)); + + return 0; + } + + switch(type) { + + case SAA7146_CLIPPING_MASK_INVERTED: + case SAA7146_CLIPPING_MASK: + { + printk("mask\n"); + /* sanity check */ + if( NULL == mask ) { + printk("saa7146: ==> clip_windows: sanity error #1!\n"); + return -EINVAL; + } + + /* copy the clipping mask to structure */ + memmove(saa->clipping, mask, CLIPPING_MEM_SIZE*sizeof(u32)); + /* set clipping registers */ + calculate_clipping_registers_mask(saa,width,height,&vdma2,&clip_format,&arbtr_ctrl); + + break; + } + + case SAA7146_CLIPPING_RECT_INVERTED: + case SAA7146_CLIPPING_RECT: + { + /* see if we have anything to do */ + if ( 0 == clipcount ) { + return 0; + } + + /* sanity check */ + if( NULL == x || NULL == y || NULL == w || NULL == h ) { + printk("saa7146: ==> clip_windows: sanity error #2!\n"); + return -EINVAL; + } + + /* rectangle clipping can only handle 16 overlay windows; if we + have more, we have do emulate the whole thing with mask-clipping */ + if (1) { //clipcount > > 16 ) { + //printk("emulate\n"); + emulate_rect_clipping(saa, clipcount, x,y,w,h, width, height); + calculate_clipping_registers_mask(saa,width,height,&vdma2,&clip_format,&arbtr_ctrl); + if( SAA7146_CLIPPING_RECT == type ) + type = SAA7146_CLIPPING_MASK; + else + type = SAA7146_CLIPPING_MASK_INVERTED; + + } + else { + calculate_clipping_registers_rect(saa,clipcount,x,y,w,h,width,height,&vdma2,&clip_format,&arbtr_ctrl); + } + + break; + } + + default: + { + printk("saa7146: ==> clip_windows: internal error #1!\n"); + return -EINVAL; + } + + } + + /* set clipping format */ + clip_format &= 0xffff0008; + clip_format |= (type << 4); + + saa7146_write(saa->mem, BASE_EVEN2, vdma2.base_even); + saa7146_write(saa->mem, BASE_ODD2, vdma2.base_odd); + saa7146_write(saa->mem, PROT_ADDR2, vdma2.prot_addr); + saa7146_write(saa->mem, BASE_PAGE2, vdma2.base_page); + saa7146_write(saa->mem, PITCH2, vdma2.pitch); + saa7146_write(saa->mem, NUM_LINE_BYTE2, vdma2.num_line_byte); + + saa7146_write(saa->mem, CLIP_FORMAT_CTRL,clip_format); + saa7146_write(saa->mem, PCI_BT_V1, arbtr_ctrl); + + /* upload clip_control-register, clipping-registers, enable video dma2 */ + saa7146_write(saa->mem, MC2, (MASK_05 | MASK_21 | MASK_03 | MASK_19)); + saa7146_write(saa->mem, MC1, (MASK_05 | MASK_21)); +/* + printk("ARBTR_CTRL: 0x%08x\n",saa7146_read(saa->mem, PCI_BT_V1)); + printk("CLIP_FORMAT: 0x%08x\n",saa7146_read(saa->mem, CLIP_FORMAT_CTRL)); + printk("BASE_ODD1: 0x%08x\n",saa7146_read(saa->mem, BASE_ODD1)); + printk("BASE_EVEN1: 0x%08x\n",saa7146_read(saa->mem, BASE_EVEN1)); + printk("PROT_ADDR1: 0x%08x\n",saa7146_read(saa->mem, PROT_ADDR1)); + printk("PITCH1: 0x%08x\n",saa7146_read(saa->mem, PITCH1)); + printk("BASE_PAGE1: 0x%08x\n",saa7146_read(saa->mem, BASE_PAGE1)); + printk("NUM_LINE_BYTE1: 0x%08x\n",saa7146_read(saa->mem, NUM_LINE_BYTE1)); + printk("BASE_ODD2: 0x%08x\n",saa7146_read(saa->mem, BASE_ODD2)); + printk("BASE_EVEN2: 0x%08x\n",saa7146_read(saa->mem, BASE_EVEN2)); + printk("PROT_ADDR2: 0x%08x\n",saa7146_read(saa->mem, PROT_ADDR2)); + printk("PITCH2: 0x%08x\n",saa7146_read(saa->mem, PITCH2)); + printk("BASE_PAGE2: 0x%08x\n",saa7146_read(saa->mem, BASE_PAGE2)); + printk("NUM_LINE_BYTE2: 0x%08x\n",saa7146_read(saa->mem, NUM_LINE_BYTE2)); +*/ + return 0; + +} +#endif + +#ifdef __COMPILE_SAA7146_I2C__ + +/* ---------------------------------------------*/ +/* i2c-helper functions */ +/* ---------------------------------------------*/ + +/* this functions gets the status from the saa7146 at address 'addr' + and returns it */ +u32 i2c_status_check(struct saa7146* saa) +{ + u32 iicsta = 0; + + iicsta = saa7146_read(saa->mem, I2C_STATUS ); + hprintk("saa7146: ==> i2c_status_check:0x%08x\n",iicsta); + + return iicsta; +} + +/* this function should be called after an i2c-command has been written. + if we are debugging, it checks, if the busy flags rises and falls correctly + and reports a timeout (-1) or the error-bits set like in described in the specs, + p.123, table 110 */ +int i2c_busy_rise_and_fall(struct saa7146* saa, int timeout) +{ + int i = 0; + u32 status = 0; + + hprintk("saa7146: ==> i2c_busy_rise_and_fall\n"); + + /* wait until busy-flag rises */ + for (i = 5; i > 0; i--) { + + hprintk("saa7146: i2c_busy_rise_and_fall; rise wait %d\n",i); + + status = i2c_status_check(saa); + + /* check busy flag */ + if ( 0 != (status & SAA7146_I2C_BUSY)) + break; + + /* see if anything can be done while we're waiting */ + cond_resched (); + mdelay(1); + } + + /* we don't check the i-value, since it does not matter + if we missed the rise of the busy flag or the fall or + whatever. we just have to wait some undefined time + after an i2c-command has been written out */ + + /* wait until busy-flag is inactive or error is reported */ + for (i = timeout; i > 0; i--) { + + hprintk("saa7146: i2c_busy_rise_and_fall; fall wait %d\n",i); + + status = i2c_status_check(saa); + + /* check busy flag */ + if ( 0 == (status & SAA7146_I2C_BUSY)) + break; + + /* check error flag */ + if ( 0 != (status & SAA7146_I2C_ERR)) + break; + + /* see if anything can be done while we're waiting */ + cond_resched (); + + mdelay(1); + } + + /* did a timeout occur ? */ + if ( 0 == i ) { + hprintk("saa7146: i2c_busy_rise_and_fall: timeout #2\n"); + return -1; + } + + /* report every error pending */ + switch( status & 0xfc ) { + + case SAA7146_I2C_SPERR: + hprintk("saa7146: i2c_busy_rise_and_fall: error due to invalid start/stop condition\n"); + break; + + case SAA7146_I2C_APERR: + hprintk("saa7146: i2c_busy_rise_and_fall: error in address phase\n"); + break; + + case SAA7146_I2C_DTERR: + hprintk("saa7146: i2c_busy_rise_and_fall: error in data transmission\n"); + break; + + case SAA7146_I2C_DRERR: + hprintk("saa7146: i2c_busy_rise_and_fall: error when receiving data\n"); + break; + + case SAA7146_I2C_AL: + hprintk("saa7146: i2c_busy_rise_and_fall: error because arbitration lost\n"); + break; + } + + return status; + +} + +/* this functions resets the saa7146 at address 'addr' + and returns 0 if everything was fine, otherwise -1 */ +int i2c_reset(struct saa7146* saa) +{ + u32 status = 0; + + hprintk("saa7146: ==> i2c_reset\n"); + + status = i2c_status_check(saa); + + /* clear data-byte for sure */ + saa7146_write(saa->mem, I2C_TRANSFER, 0x00); + + /* check if any operation is still in progress */ + if ( 0 != ( status & SAA7146_I2C_BUSY) ) { + + /* Yes, kill ongoing operation */ + hprintk("saa7146: i2c_reset: busy_state detected\n"); + + /* set ABORT-OPERATION-bit */ + saa7146_write(saa->mem, I2C_STATUS, ( SAA7146_I2C_BBR | MASK_07)); + saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16)); + mdelay( SAA7146_I2C_DELAY ); + + /* clear all error-bits pending; this is needed because p.123, note 1 */ + saa7146_write(saa->mem, I2C_STATUS, SAA7146_I2C_BBR ); + saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16)); + mdelay( SAA7146_I2C_DELAY ); + } + + /* check if any other error is still present */ + if ( SAA7146_I2C_BBR != (status = i2c_status_check(saa)) ) { + + /* yes, try to kick it */ + hprintk("saa7146: i2c_reset: error_state detected, status:0x%08x\n",status); + + /* clear all error-bits pending */ + saa7146_write(saa->mem, I2C_STATUS, SAA7146_I2C_BBR ); + saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16)); + mdelay( SAA7146_I2C_DELAY ); + /* the data sheet says it might be necessary to clear the status + twice after an abort */ + saa7146_write(saa->mem, I2C_STATUS, SAA7146_I2C_BBR ); + saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16)); + } + + /* if any error is still present, a fatal error has occured ... */ + if ( SAA7146_I2C_BBR != (status = i2c_status_check(saa)) ) { + hprintk("saa7146: i2c_reset: fatal error, status:0x%08x\n",status); + return -1; + } + + return 0; +} + +/* this functions writes out the data-bytes at 'data' to the saa7146 + at address 'addr' regarding the 'timeout' and 'retries' values; + it returns 0 if ok, -1 if the transfer failed, -2 if the transfer + failed badly (e.g. address error) */ +int i2c_write_out(struct saa7146* saa, u32* data, int timeout) +{ + int status = 0; + + hprintk("saa7146: ==> writeout: 0x%08x (before) (to:%d)\n",*data,timeout); + + /* write out i2c-command */ + saa7146_write(saa->mem, I2C_TRANSFER, *data); + saa7146_write(saa->mem, I2C_STATUS, SAA7146_I2C_BBR); + saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16)); + + /* after writing out an i2c-command we have to wait for a while; + because we do not know, how long we have to wait, we simply look + what the busy-flag is doing, before doing something else */ + + /* reason: while fiddling around with the i2c-routines, I noticed + that after writing out an i2c-command, one may not read out the + status immediately after that. you *must* wait some time, before + even the busy-flag gets set */ + + status = i2c_busy_rise_and_fall(saa,timeout); + + if ( -1 == status ) { + hprintk("saa7146: i2c_write_out; timeout\n"); + return -ETIMEDOUT; + } + + /* we only handle address-errors here */ + if ( 0 != (status & SAA7146_I2C_APERR)) { + hprintk("saa7146: i2c_write_out; error in address phase\n"); + return -EREMOTEIO; + } + + /* check for some other mysterious error; we don't handle this here */ + if ( 0 != ( status & 0xff)) { + hprintk("saa7146: i2c_write_out: some error has occured\n"); + return -EIO; + } + + /* read back data, just in case we were reading ... */ + *data = saa7146_read(saa->mem, I2C_TRANSFER); + + hprintk("saa7146: writeout: 0x%08x (after)\n",*data); + + return 0; +} + +int clean_up(struct i2c_msg m[], int num, u32 *op) +{ + u16 i, j; + u16 op_count = 0; + + /* loop through all messages */ + for(i = 0; i < num; i++) { + op_count++; + /* loop throgh all bytes of message i */ + for(j = 0; j < m[i].len; j++) { + /* write back all bytes that could have been read */ + m[i].buf[j] = (op[op_count/3] >> ((3-(op_count%3))*8)); + op_count++; + } + } + + return 0; +} + +int prepare(struct i2c_msg m[], int num, u32 *op) +{ + u16 h1, h2; + u16 i, j, addr; + u16 mem = 0, op_count = 0; + +//for (i=0; i I2C_MEM_SIZE ) { + hprintk("saa7146: prepare: i2c-message to big\n"); + return -1; + } + + /* be careful: clear out the i2c-mem first */ + memset(op,0,sizeof(u32)*mem); + + for(i = 0; i < num; i++) { + /* insert the address of the i2c-slave. + * note: we get 7-bit-i2c-addresses, + * so we have to perform a translation + */ + addr = (m[i].addr << 1) | ((m[i].flags & I2C_M_RD) ? 1 : 0); + h1 = op_count/3; h2 = op_count%3; + op[h1] |= ((u8)addr << ((3-h2)*8)); + op[h1] |= (SAA7146_I2C_START << ((3-h2)*2)); + op_count++; + /* loop through all bytes of message i */ + for(j = 0; j < m[i].len; j++) { + /* insert the data bytes */ + h1 = op_count/3; h2 = op_count%3; + op[h1] |= ((u8)m[i].buf[j] << ((3-h2)*8)); + op[h1] |= (SAA7146_I2C_CONT << ((3-h2)*2)); + op_count++; + } + } + + /* have a look at the last byte inserted: + * if it was: ...CONT change it to ...STOP + */ + h1 = (op_count-1)/3; h2 = (op_count-1)%3; + if ( SAA7146_I2C_CONT == (0x3 & ((op[h1]) >> ((3-h2)*2))) ) { + op[h1] &= ~(0x2 << ((3-h2)*2)); + op[h1] |= (SAA7146_I2C_STOP << ((3-h2)*2)); + } + + return mem; +} +#endif + + +#ifdef __COMPILE_SAA7146_DEBI__ + +/* functions for accessing the debi-port. note: we currently don't support + * page-table-transfers. + */ + +#define MY_DEBI_TIMEOUT_MS 5 + +int debi_transfer(struct saa7146* saa, struct saa7146_debi_transfer* dt) +{ + u32 debi_config = 0, debi_command = 0, debi_page = 0, debi_ad = 0; + u32 timeout = MY_DEBI_TIMEOUT_MS; + + /* sanity checks */ + if(dt->direction > 1 || dt->timeout > 15 || dt->swap > 3 || dt->slave16 > 2 || dt->intel > 1 || dt->increment > 1 || dt->tien > 1 ) + return -EINVAL; + + debi_page = 0; + /* keep bits 31,30,28 clear */ + debi_config = (dt->timeout << 22) | (dt->swap << 20) | (dt->slave16 << 19) | (dt->increment << 18) | (dt->intel << 17) | (dt->tien << 16); + debi_command = (dt->num_bytes << 17) | (dt->direction << 16) | (dt->address << 0); + debi_ad = dt->mem; + + saa7146_write(saa->mem, DEBI_PAGE, debi_page); + saa7146_write(saa->mem, DEBI_CONFIG, debi_config); + saa7146_write(saa->mem, DEBI_COMMAND, debi_command); + saa7146_write(saa->mem, DEBI_AD, debi_ad); + + /* upload debi-registers */ + saa7146_write(saa->mem, MC2, (MASK_01|MASK_17)); + + /* wait for DEBI upload to complete */ + while (! (saa7146_read(saa->mem, MC2) & 0x2)); + + while( --timeout ) { + /* check, if DEBI still active */ + u32 psr = saa7146_read(saa->mem, PSR); + if (0 != (psr & SPCI_DEBI_S)) { + /* check, if error occured */ +/* if ( 0 != (saa7146_read(saa->mem, SSR) & (MASK_23|MASK_22))) { */ + if ( 0 != (saa7146_read(saa->mem, SSR) & (MASK_22))) { + /* clear error status and indicate error */ + saa7146_write(saa->mem, ISR, SPCI_DEBI_E); + return -1; + } + } + else { + /* Clear status bit */ + saa7146_write(saa->mem, ISR, SPCI_DEBI_S); + break; + } + /* I don´t know how we should actually wait for the debi to have finished. + we simply wait 1ms here and then check in a loop for max. MY_DEBI_TIMEOUT_MS */ + mdelay(1); + } + + /* check for timeout */ + if( 0 == timeout ) { + return -1; + } + + /* read back data if we did immediate read-transfer */ + if(dt->num_bytes <= 4 && dt->direction == 1) { + dt->mem = saa7146_read(saa->mem, DEBI_AD); + switch(dt->num_bytes) { + case 1: + dt->mem &= 0x000000ff; + break; + case 2: + dt->mem &= 0x0000ffff; + break; + case 3: + dt->mem &= 0x00ffffff; + break; + } + } + + return 0; +} +#endif + +#ifdef __COMPILE_SAA7146_STUFF__ +/* ---------------------------------------------*/ +/* helper-function: set gpio-pins */ +/* ---------------------------------------------*/ +void gpio_set(struct saa7146* saa, u8 pin, u8 data) +{ + u32 value = 0; + + /* sanity check */ + if(pin > 3) + return; + + /* read old register contents */ + value = saa7146_read(saa->mem, GPIO_CTRL ); + + value &= ~(0xff << (8*pin)); + value |= (data << (8*pin)); + + saa7146_write(saa->mem, GPIO_CTRL, value); +} + +void select_input(struct saa7146* saa, int p) +{ + u32 hps_ctrl = 0; + + /* sanity check */ + if( p < 0 || p > 1 ) + return; + + /* read old state */ + hps_ctrl = saa7146_read(saa->mem, HPS_CTRL); + + /* mask out relevant bits */ + hps_ctrl &= ~( MASK_31 | MASK_30 | MASK_28 ); + + /* set bits for input b */ + if( 1 == p ) { + hps_ctrl |= ( (1 << 30) | (1 << 28) ); + } + + /* write back & upload register */ + saa7146_write(saa->mem, HPS_CTRL, hps_ctrl); + saa7146_write(saa->mem, MC2, (MASK_05 | MASK_21)); +} + +#endif + diff -Nru a/drivers/media/dvb/av7110/saa7146_core.c b/drivers/media/dvb/av7110/saa7146_core.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/av7110/saa7146_core.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,968 @@ +/* + saa7146_core.c - core-functions + i2c driver for the saa7146 by + Philips Semiconductors. + + Copyright (C) 1998,1999 Michael Hunold + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#include /* for module-version */ +#include /* for delay-stuff */ +#include /* for kmalloc/kfree */ +#include /* for pci-config-stuff, vendor ids etc. */ +#include /* for mem_map_reserve */ +#include +#include /* for accessing the pci-device */ +#include /* for module-version */ + +#include "saa7146_defs.h" +#include "saa7146_core.h" +#include "saa7146_v4l.h" +#include "av7110.h" +#include "../dvb-core/compat.h" +#include "../dvb-core/dvb_i2c.h" + +/* insmod parameter: here you can specify the number of video-buffers + to be allocated. for simple capturing 2 buffers (double-buffering) + should suffice. but if you plan to do 25fps grabbing, you should + set this to 4(=maximum), in order to be able to catch up from + temporarily delays */ +static int buffers = 2; + +/* insmod parameter: some programs (e.g. ´vic´) do not allow to + specify the used video-mode, so you have to tell this to the + modules by hand, 0 = PAL, 1 = NTSC */ +static int mode = 0; + +/* debug levels: 0 -- no debugging outputs + 1 -- prints out entering (and exiting if useful) of functions + 2 -- prints out very, very detailed informations of what is going on + 3 -- both of the above */ +int saa7146_debug = 0; /* insmod parameter */ + +#define dprintk if (saa7146_debug & 1) printk +#define hprintk if (saa7146_debug & 2) printk + +/* ---------------------------------------------*/ +/* memory functions - taken from bttv.c */ +/* ---------------------------------------------*/ + +static inline unsigned long kvirt_to_pa(unsigned long adr) +{ + unsigned long kva; + + kva = (unsigned long) page_address(vmalloc_to_page((void *)adr)); + kva |= adr & (PAGE_SIZE-1); /* restore the offset */ + + return __pa(kva); +} + + +static LIST_HEAD(saa7146_list); + +static int saa7146_extension_count = 0; +static struct saa7146_extension* saa7146_ext[SAA7146_MAX_EXTENSIONS]; + +#define SAA7146_I2C_TIMEOUT 100 /* in ms */ +#define SAA7146_I2C_RETRIES 6 + +static u32 SAA7146_I2C_BBR = SAA7146_I2C_BUS_BIT_RATE_3200; + +#define __COMPILE_SAA7146_I2C__ +#define __COMPILE_SAA7146_DEBI__ +#include "saa7146.c" +#undef __COMPILE_SAA7146_I2C__ + +/* ---------------------------------------------*/ +/* memory functions designed for saa7146 */ +/* ---------------------------------------------*/ + +/* rvmalloc allocates the memory and builds up + the page-tables for ´quant´-number of buffers */ +static void* rvmalloc(int quant, u32* pt[]) +{ + void* mem; + + unsigned long adr = 0; + unsigned long count = 0; + + u32* ptp = 0; + int i = 0, j = 0; + + dprintk(KERN_ERR "saa7146: rvmalloc called, quant:%d\n",quant); + + if(!quant) + return NULL; + + /* get grabbing memory */ + mem = vmalloc_32(quant*GRABBING_MEM_SIZE); + + if(!mem) + return NULL; + + dprintk(KERN_ERR "saa7146: alloc page tables\n"); + + /* alloc one page for a page-table for ´quant´ buffers */ + for(i = 0; i < quant; i++) { + pt[i] = (u32*)kmalloc(PAGE_SIZE,GFP_KERNEL); + + /* error: memory could not be allocated */ + if(!pt[i]) { + dprintk(KERN_ERR "saa7146: failed, free tables\n"); + for(j = (i-1); j >= 0; j--) + kfree(pt[j]); + dprintk(KERN_ERR "saa7146: free buffer memory\n"); + vfree(mem); + dprintk(KERN_ERR "saa7146: return 0 address for buffer\n"); + return NULL; + } + memset(pt[i], 0x00, PAGE_SIZE); + } + + dprintk(KERN_ERR "saa7146: clear RAM\n"); + + /* clear the ram out, no junk to the user + note: 0x7f gives a nice grey field + in RGB and YUV as well */ + memset(mem, 0x7f, quant*GRABBING_MEM_SIZE); + + dprintk(KERN_ERR "saa7146: build page tables\n"); + adr = (unsigned long)mem; + /* walk through the grabbing-memory and build up the page-tables */ + for(i = 0; i < quant; i++) { + + for (count=0; count 0) { + page = kvirt_to_pa(adr); + mem_map_unreserve(virt_to_page(__va(page))); + adr += PAGE_SIZE; + size -= PAGE_SIZE; + } + + /* release the grabbing memory */ + vfree(mem); + } + /* free the page tables */ + for(i = 0; i < quant; i++) { + kfree(pt[i]); + } +} + + +/* ---------------------------------------------*/ +/* i2c-functions */ +/* ---------------------------------------------*/ + +static +int do_master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num) +{ + struct saa7146 *a = i2c->data; + int result, count; + int i = 0; + + dprintk(KERN_ERR "saa7146_core.o: master_xfer called, num:%d\n",num); + + /* prepare the message(s), get number of u32s to transfer */ + count = prepare(msgs, num, a->i2c); + if ( 0 > count ) { + hprintk(KERN_ERR "saa7146_core.o: master_xfer: could not prepare i2c-message\n"); + return -EIO; + } + + /* reset the i2c-device if necessary */ + result = i2c_reset( a ); + if ( 0 > result ) { + hprintk(KERN_ERR "saa7146_core.o: master_xfer: could not reset i2c-bus\n"); + return result; + } + + for(i = 0; i < count; i++) { + /* see how many u32 have to be transferred; + * if there is only 1, + * we do not start the whole rps1-engine... + */ + + result = i2c_write_out( a, &a->i2c[i], + SAA7146_I2C_TIMEOUT ); + + if ( 0 != result) { + /* if address-error occured, don't retry */ + if ( result == -EREMOTEIO ) + { + hprintk(KERN_ERR "saa7146_core.o: master_xfer: error in address phase\n"); + return result; + } + hprintk(KERN_ERR "saa7146_core.o: master_xfer: error transferring, trying again\n"); + break; + } + } + + /* see if an error occured & the last retry failed */ + if (0 != result) { + hprintk(KERN_ERR "saa7146_core.o: master_xfer: could not transfer i2c-message\n"); + return -EIO; + } + + /* if any things had to be read, get the results */ + result = clean_up(msgs, num, a->i2c); + if ( 0 > result ) { + hprintk(KERN_ERR "saa7146_core.o: master_xfer: could not cleanup\n"); + return -EIO; + } + + /* return the number of delivered messages */ + return num; +} + + + +static +int master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num) +{ + int retries = SAA7146_I2C_RETRIES; + int ret; + + do { + ret = do_master_xfer (i2c, msgs, num); + } while (ret != num && retries--); + + return ret; +} + + +/* registering functions to load algorithms at runtime */ +int i2c_saa7146_add_bus (struct saa7146 *saa) +{ + /* enable i2c-port pins */ + saa7146_write (saa->mem, MC1, (MASK_08 | MASK_24)); + + sprintf(saa->name, "saa7146(%d)", saa->dvb_adapter->num); + + saa->i2c_bus = dvb_register_i2c_bus (master_xfer, saa, + saa->dvb_adapter, 0); + if (!saa->i2c_bus) + return -ENOMEM; + + return 0; +} + + +void i2c_saa7146_del_bus (struct saa7146 *saa) +{ + dvb_unregister_i2c_bus (master_xfer, + saa->i2c_bus->adapter, saa->i2c_bus->id); + + dvb_unregister_adapter (saa->dvb_adapter); +} + +/* ---------------------------------------------*/ +/* debug-helper function: dump-registers */ +/* ---------------------------------------------*/ + +void dump_registers(unsigned char* mem) { + + u16 j = 0; + + for( j = 0x0; j < 0x1fe; j+=0x4 ) { + printk("0x%03x: 0x%08x\n",j,saa7146_read(mem,j)); + } + +} + +/* -----------------------------------------------------*/ +/* dispatcher-function for handling external commands */ +/* -----------------------------------------------------*/ + +static int saa7146_core_command (struct dvb_i2c_bus *i2c, unsigned int cmd, void *arg) +{ + int i = 0, result = -ENOIOCTLCMD; + struct saa7146* saa = i2c->data; + + dprintk("saa7146_core.o: ==> saa7146_core_command\n"); + + if( NULL == saa) + return -EINVAL; + + /* first let the extensions handle the command */ + for (i = 0; i < SAA7146_MAX_EXTENSIONS; i++) { + if (NULL != saa7146_ext[i]) { + if( -ENOIOCTLCMD != (result = saa7146_ext[i]->command(saa, saa->data[i], cmd, arg))) { + break; + } + } + } + + /* if command has not been handled by an extension, handle it now */ + if( result == -ENOIOCTLCMD ) { + + switch(cmd) { + case SAA7146_DUMP_REGISTERS: + { + dump_registers(saa->mem); + break; + } + case SAA7146_SET_DD1: + { + u32 *i = arg; + + dprintk(KERN_ERR "saa7146_core.o: SAA7146_SET_DD1 to 0x%08x\n",*i); + + /* set dd1 port register */ + saa7146_write(saa->mem, DD1_INIT, *i); + + /* write out init-values */ + saa7146_write(saa->mem,MC2, (MASK_09 | MASK_10 | MASK_26 | MASK_26)); + + break; + } + case SAA7146_DO_MMAP: + { + struct vm_area_struct *vma = arg; + unsigned long size = vma->vm_end - vma->vm_start; + unsigned long start = vma->vm_start; + unsigned long page,pos; + + dprintk(KERN_ERR "saa7146_core.o: SAA7146_DO_MMAP.\n"); + + if (size > saa->buffers * GRABBING_MEM_SIZE) + return -EINVAL; + + if ( NULL == saa->grabbing ) + return -EINVAL; + + pos=(unsigned long)saa->grabbing; + + while (size > 0) + { + page = kvirt_to_pa(pos); + if (remap_page_range(vma, start, page, + PAGE_SIZE, PAGE_SHARED)) + return -EAGAIN; + start += PAGE_SIZE; + pos += PAGE_SIZE; + size -= PAGE_SIZE; + } + + break; + } + case SAA7146_DEBI_TRANSFER: { + + struct saa7146_debi_transfer *dt = arg; + + printk("saa7146_core.o: SAA7146_DEBI_TRANSFER\n"); + printk("saa7146_core.o: timeout:%d, swap:%d, slave16:%d, increment:%d, intel:%d, tien:%d\n", dt->timeout, dt->swap, dt->slave16, dt->increment, dt->intel, dt->tien); + printk("saa7146_core.o: address:0x%04x, num_bytes:%d, direction:%d, mem:0x%08x\n",dt->address,dt->address,dt->direction,dt->mem); + + debi_transfer(saa, dt); + break; + } + + default: { + return -ENOIOCTLCMD; + } + } + } + + return 0; +} + +/* -----------------------------------------------------*/ +/* dispatcher-function for handling irq-events */ +/* -----------------------------------------------------*/ + +/* irq-handler function */ +static void saa7146_irq(int irq, void *dev_id, struct pt_regs * regs) +{ + struct saa7146 *saa = (struct saa7146 *)dev_id; + u32 isr = 0; + int i; + int count = 0; + + /* process all interrupts */ + while (1) { + + /* read out the primary status register */ + isr = saa7146_read(saa->mem, ISR); + /* clear all IRQs */ + saa7146_write(saa->mem, ISR, isr); + + /* is anything to do? */ + if ( 0 == isr ) + return; + + dprintk("%s: irq-call: isr:0x%08x\n",saa->name,isr); + + /* first let the extensions handle the interrupt */ + for (i = 0; i < SAA7146_MAX_EXTENSIONS; i++) + if (saa7146_ext[i] && + (isr&saa7146_ext[i]->handles_irqs)) { + saa7146_ext[i]->irq_handler(saa, isr, saa->data[i]); + //saa7146_write(saa->mem, ISR, saa7146_ext[i]->handles_irqs); + } + + //printk(KERN_ERR "%s: unhandled interrupt: 0x%08x\n", saa->name, isr); + + /* see if we are in a hard interrupt loop */ + ++count; + if (count > 10) + printk (KERN_WARNING "%s: irq loop %d\n", saa->name, count); + if (count > 20) { + saa7146_write(saa->mem, IER, 0x00000000); + printk(KERN_ERR "%s: IRQ lockup, cleared int mask\n", saa->name); + break; + } + } +} + +/* ----------------------------------------------------- + functions for finding any saa7146s in the system, + inserting/removing module for kernel, etc. + -----------------------------------------------------*/ + +int configure_saa7146 (struct saa7146 *saa) +{ + u32 rev = 0; + int result = 0; + + hprintk("saa7146_core.o: ==> configure_saa7146\n"); + + /* check module-parameters for sanity */ + + /* check if wanted number of video-buffers is valid, otherwise fix it */ + //if (buffers < 2) + // buffers = 2; + + if ( buffers > SAA7146_MAX_BUF ) + buffers = SAA7146_MAX_BUF; + + /* check if mode is supported */ + switch( mode ) { + /* 0 = pal, 1 = ntsc */ + case 0: + case 1: + { + break; + } + /* default to pal */ + default: + { + mode = 0; + break; + } + } + + /* get chip-revision; this is needed to enable bug-fixes */ + if( 0 > pci_read_config_dword(saa->device, 0x08, &rev)) { + printk (KERN_ERR + "saa7146_core.o: cannot read from pci-device!\n"); + return -1; + } + + saa->revision = (rev & 0xf); + + /* remap the memory from virtual to physical adress */ + saa->mem = ioremap ((saa->device->resource[0].start) + &PCI_BASE_ADDRESS_MEM_MASK, 0x1000); + + if ( !saa->mem ) { + printk(KERN_ERR "saa7146_core.o: cannot map pci-address!\n"); + return -EFAULT; + } + + /* get clipping memory */ + saa->clipping = (u32*) kmalloc (CLIPPING_MEM_SIZE*sizeof(u32),GFP_KERNEL); + + if ( !saa->clipping ) { + printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for clipping!\n"); + return -ENOMEM; + } + + memset(saa->clipping, 0x0, CLIPPING_MEM_SIZE*sizeof(u32)); + + /* get i2c memory */ + saa->i2c = (u32*) kmalloc (I2C_MEM_SIZE*sizeof(u32),GFP_KERNEL); /*64*/ + + if ( !saa->i2c ) { + printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for i2c!\n"); + kfree(saa->clipping); + return -ENOMEM; + } + + memset(saa->i2c, 0x0, I2C_MEM_SIZE*sizeof(u32)); + + /* get grabbing memory */ + saa->grabbing = (u32*) rvmalloc (buffers, &saa->page_table[0]); + + if ( !saa->grabbing ) { + printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for grabbing_mem!\n"); + kfree(saa->i2c); + kfree(saa->clipping); + return -ENOMEM; + } + + /* get rps0 memory */ + saa->rps0 = (u32*) kmalloc (RPS_MEM_SIZE*sizeof(u32),GFP_KERNEL); + + if ( !saa->rps0 ) { + printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for rps0_mem!\n"); + kfree(saa->i2c); + kfree(saa->clipping); + rvfree(saa->grabbing, buffers, &saa->page_table[0]); + return -ENOMEM; + } + + memset(saa->rps0, 0x0, RPS_MEM_SIZE*sizeof(u32)); + + /* get rps1 memory */ + saa->rps1 = (u32*) kmalloc (RPS_MEM_SIZE*sizeof(u32),GFP_KERNEL); + if ( !saa->rps1 ) { + printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for rps1_mem!\n"); + kfree(saa->rps0); + kfree(saa->i2c); + kfree(saa->clipping); + rvfree(saa->grabbing, buffers, &saa->page_table[0]); + return -1; + } + + memset(saa->rps1, 0x0, RPS_MEM_SIZE*sizeof(u32)); + + /* get debi memory (32kB) */ + saa->debi = (u32*) kmalloc (8192*sizeof(u32),GFP_KERNEL); + + if ( !saa->debi ) { + printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for debi_mem!\n"); + kfree(saa->rps1); + kfree(saa->rps0); + kfree(saa->i2c); + kfree(saa->clipping); + rvfree(saa->grabbing, buffers, &saa->page_table[0]); + return -1; + } + + memset(saa->debi, 0x0, 8192*sizeof(u32)); + + + /* clear out memory for grabbing information */ + memset(&saa->grab_width[0], 0x0, sizeof(int)*SAA7146_MAX_BUF); + memset(&saa->grab_height[0], 0x0, sizeof(int)*SAA7146_MAX_BUF); + memset(&saa->grab_format[0], 0x0, sizeof(int)*SAA7146_MAX_BUF); + memset(&saa->grab_port[0], 0x0, sizeof(int)*SAA7146_MAX_BUF); + + /* init the frame-status array */ + memset(&saa->frame_stat[0], GBUFFER_UNUSED, sizeof(int)*SAA7146_MAX_BUF); + + /* clear out all wait queues */ + init_waitqueue_head(&saa->rps0_wq); + init_waitqueue_head(&saa->rps1_wq); + + + /* request an interrupt for the saa7146 */ + result = request_irq (saa->device->irq, saa7146_irq, + SA_SHIRQ | SA_INTERRUPT, saa->name, (void *) saa); + + switch(result) { + case -EINVAL: + { + printk(KERN_ERR "saa7146_core.o: Bad irq number or handler\n"); + return -EINVAL; + } + case -EBUSY: + { + printk(KERN_ERR "saa7146_core.o: IRQ %d busy, change your PnP config in BIOS\n", saa->device->irq); + return -EBUSY; + } + case 0: + { + break; + } + default: + { + return result; + } + } + + /* print status message */ + printk(KERN_ERR "saa7146_core.o: %s: bus:%d, rev:%d, mem:0x%08x.\n", saa->name, saa->device->bus->number, saa->revision, (unsigned int) saa->mem); + + /* enable bus-mastering */ + pci_set_master( saa->device ); + + /* disable everything on the saa7146, perform a software-reset */ + saa7146_write(saa->mem, MC1, 0xbfff0000); + mdelay(2); +#if 0 + { + int j; + + /* clear all registers */ + for( j = 0x0; j < 0xfc; j+=0x4 ) { + saa7146_write(saa->mem,j, 0x0000000); + } + for( j = 0x104; j < 0x1fc; j+=0x4 ) { + saa7146_write(saa->mem,j, 0x0000000); + } + } +#endif + /* clear out any rps-signals pending */ + saa7146_write(saa->mem, MC2, 0xf8000000); + + /* enable video-port-pins*/ + saa7146_write(saa->mem,MC1, (MASK_10 | MASK_26)); + + /* disable all interrupt-conditions, only enable RPS interrupts */ + saa7146_write(saa->mem, ISR, 0xffffffff); + saa7146_write(saa->mem, IER, (MASK_27 | MASK_28)); +/* + printk("main: 0x114: 0x%08x\n",saa7146_read(saa->mem, 0x114)); + printk("main: 0x0e4: 0x%08x\n",saa7146_read(saa->mem, 0x0e4)); + printk("PSR: 0x%08x\n",saa7146_read(saa->mem, PSR)); + printk("SSR: 0x%08x\n",saa7146_read(saa->mem, SSR)); + printk("IER: 0x%08x\n",saa7146_read(saa->mem, IER)); + printk("ISR: 0x%08x\n",saa7146_read(saa->mem, ISR)); +*/ + + saa7146_write(saa->mem,PCI_BT_V1, 0x1c00101f); + saa7146_write(saa->mem,BCS_CTRL, 0x80400040); + + /* set dd1 stream a & b */ + saa7146_write(saa->mem, DD1_STREAM_B, 0x00000000); + saa7146_write(saa->mem, DD1_INIT, 0x02000000); + saa7146_write(saa->mem, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); + + saa7146_write(saa->mem, MC2, 0x077c077c); + + /* the Siemens DVB needs this if you want to have the i2c chips + get recognized before the main driver is loaded + */ + saa7146_write(saa->mem, GPIO_CTRL, 0x500000); + + saa->command = &saa7146_core_command; + saa->buffers = buffers; + saa->mode = mode; + saa->interlace = 1; + + i2c_saa7146_add_bus (saa); + + saa7146_write(saa->mem, GPIO_CTRL, 0x000000); + return 0; +} + + +void saa7146_foreach (void (*callback) (struct saa7146* saa, void *data), + void *data) +{ + struct list_head *entry; + + list_for_each (entry, &saa7146_list) { + struct saa7146* saa; + + saa = list_entry (entry, struct saa7146, list_head); + callback (saa, data); + } +} + + +static +void saa7146_attach_extension (struct saa7146* saa, void *data) +{ + int ext_id = (int) data; + saa7146_ext[ext_id]->attach (saa, &saa->data[ext_id]); +} + + +static +void saa7146_detach_extension (struct saa7146* saa, void *data) +{ + int ext_id = (int) data; + saa7146_ext[ext_id]->detach (saa, &saa->data[ext_id]); +} + + +int saa7146_add_extension(struct saa7146_extension* ext) +{ + int ext_id = 0; + + for (ext_id = 0; ext_id < SAA7146_MAX_EXTENSIONS; ext_id++) { + if (NULL == saa7146_ext[ext_id]) + break; + if (SAA7146_MAX_EXTENSIONS == ext_id) { + printk(KERN_WARNING "saa7146.o: attach_extension(%s) - " + "enlarge SAA7146_MAX_EXTENSIONS.\n",ext->name); + return -ENOMEM; + } + } + + saa7146_ext[ext_id] = ext; + saa7146_extension_count++; + + if (ext->attach) + saa7146_foreach (saa7146_attach_extension, (void*) ext_id); + + return 0; +} + + +int saa7146_del_extension(struct saa7146_extension* ext) +{ + int ext_id = 0; + + for (ext_id = 0; ext_id < SAA7146_MAX_EXTENSIONS; ext_id++) + if (ext == saa7146_ext[ext_id]) + break; + + if (SAA7146_MAX_EXTENSIONS == ext_id) { + printk("%s: detach_extension extension [%s] not found.\n", + __FUNCTION__, ext->name); + return -ENODEV; + } + + if (ext->detach) + saa7146_foreach (saa7146_detach_extension, (void*) ext_id); + + saa7146_ext[ext_id] = NULL; + saa7146_extension_count--; + + return 0; +} + + +static +void remove_saa7146(struct saa7146 *saa) +{ + i2c_saa7146_del_bus (saa); + + /* shut down all dma transfers */ + saa7146_write(saa->mem, MC1, 0xbfff0000); + + dprintk("free irqs\n"); + /* disable alle irqs, release irq-routine */ + saa7146_write(saa->mem, IER, 0x00); + saa7146_write(saa->mem, ISR, 0xffffffff); + free_irq(saa->device->irq, (void *)saa); + dprintk("unmap memory\n"); + /* unmap the memory, if necessary */ + if (saa->mem) + iounmap((unsigned char *)((unsigned int)saa->mem)); + + dprintk("release grabbing memory\n"); + /* release grabbing memory */ + if(saa->grabbing) + rvfree(saa->grabbing, buffers, &saa->page_table[0]); + + dprintk("release other memory\n"); + /* release clipping, i2c, rps0 memory */ + kfree(saa->clipping); + kfree(saa->i2c); + kfree(saa->rps0); + kfree(saa->rps1); + kfree(saa->debi); +} + + +static int saa7146_suspend(struct pci_dev *pdev, u32 state) +{ + printk("saa7146_suspend()\n"); + saa7146_core_command(((struct saa7146 *) pdev->driver_data)->i2c_bus, + SAA7146_SUSPEND, 0); + return 0; +} + +static int +saa7146_resume(struct pci_dev *pdev) +{ + printk("saa7146_resume()\n"); + saa7146_core_command(((struct saa7146 *) pdev->driver_data)->i2c_bus, + SAA7146_RESUME, 0); + return 0; +} + + +struct card_info { + int type; + char *name; +}; + + +static +int __devinit saa7146_init_one (struct pci_dev *pdev, + const struct pci_device_id *ent) +{ + struct dvb_adapter_s *adap; + struct saa7146 *saa; + int card_type; + struct card_info *cinfo= (struct card_info *) ent->driver_data; + + dprintk("saa7146_init_one()\n"); + + card_type = cinfo->type; + dvb_register_adapter(&adap, cinfo->name); + + if (!(saa = kmalloc (sizeof (struct saa7146), GFP_KERNEL))) { + printk ("%s: out of memory!\n", __FUNCTION__); + return -ENOMEM; + } + + memset (saa, 0, sizeof (struct saa7146)); + + saa->device = pdev; + saa->device->driver_data = saa; + saa->card_type = card_type; + saa->dvb_adapter = adap; + + pci_enable_device (saa->device); + + configure_saa7146 (saa); + + list_add_tail (&saa->list_head, &saa7146_list); + + return 0; +} + +static +void __devexit saa7146_remove_one (struct pci_dev *pdev) +{ + struct saa7146 *saa = pdev->driver_data; + + dprintk("saa7146_remove_one()\n"); + + list_del (&saa->list_head); + pci_disable_device(pdev); + remove_saa7146 (saa); +} + + +static struct card_info fs_1_5 = { DVB_CARD_TT_SIEMENS, "Siemens cable card PCI rev1.5" }; +static struct card_info fs_1_3 = { DVB_CARD_TT_SIEMENS, "Siemens/Technotrend/Hauppauge PCI rev1.3" }; +static struct card_info ttbs = { DVB_CARD_TT_BUDGET, "TT-Budget/WinTV-NOVA-S PCI" }; +static struct card_info ttbc = { DVB_CARD_TT_BUDGET, "TT-Budget/WinTV-NOVA-C PCI" }; +static struct card_info ttbt = { DVB_CARD_TT_BUDGET, "TT-Budget/WinTV-NOVA-T PCI" }; +static struct card_info ttbci = { DVB_CARD_TT_BUDGET_CI, "TT-Budget/WinTV-NOVA-CI PCI" }; +static struct card_info satel = { DVB_CARD_TT_BUDGET, "SATELCO Multimedia PCI"}; +static struct card_info unkwn = { DVB_CARD_TT_SIEMENS, "Technotrend/Hauppauge PCI rev?(unknown0)?"}; +static struct card_info tt_1_6 = { DVB_CARD_TT_SIEMENS, "Technotrend/Hauppauge PCI rev1.3 or 1.6" }; +static struct card_info tt_2_1 = { DVB_CARD_TT_SIEMENS, "Technotrend/Hauppauge PCI rev2.1" }; +static struct card_info tt_t = { DVB_CARD_TT_SIEMENS, "Technotrend/Hauppauge PCI DVB-T" }; +static struct card_info knc1 = { DVB_CARD_KNC1, "KNC1 DVB-S" }; + +#define PHILIPS_SAA7146 PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA7146 +#define CARD_INFO driver_data: (unsigned long) & + +static struct pci_device_id saa7146_pci_tbl[] __devinitdata = { + { PHILIPS_SAA7146, 0x110a, 0xffff, CARD_INFO fs_1_5 }, + { PHILIPS_SAA7146, 0x110a, 0x0000, CARD_INFO fs_1_5 }, + { PHILIPS_SAA7146, 0x13c2, 0x1003, CARD_INFO ttbs }, + { PHILIPS_SAA7146, 0x13c2, 0x1004, CARD_INFO ttbc }, + { PHILIPS_SAA7146, 0x13c2, 0x1005, CARD_INFO ttbt }, + { PHILIPS_SAA7146, 0x13c2, 0x100c, CARD_INFO ttbci }, + { PHILIPS_SAA7146, 0x13c2, 0x1013, CARD_INFO satel }, + { PHILIPS_SAA7146, 0x13c2, 0x0000, CARD_INFO fs_1_3 }, + { PHILIPS_SAA7146, 0x13c2, 0x1002, CARD_INFO unkwn }, + { PHILIPS_SAA7146, 0x13c2, 0x0001, CARD_INFO tt_1_6 }, + { PHILIPS_SAA7146, 0x13c2, 0x0002, CARD_INFO tt_2_1 }, + { PHILIPS_SAA7146, 0x13c2, 0x0003, CARD_INFO tt_2_1 }, + { PHILIPS_SAA7146, 0x13c2, 0x0004, CARD_INFO tt_2_1 }, + { PHILIPS_SAA7146, 0x13c2, 0x0006, CARD_INFO tt_1_6 }, + { PHILIPS_SAA7146, 0x13c2, 0x0008, CARD_INFO tt_t }, + { PHILIPS_SAA7146, 0xffc2, 0x0000, CARD_INFO unkwn }, + { PHILIPS_SAA7146, 0x1131, 0x4f56, CARD_INFO knc1 }, + { 0,}, +}; + +MODULE_DEVICE_TABLE(pci, saa7146_pci_tbl); + +static struct pci_driver saa7146_driver = { + name: "saa7146", + id_table: saa7146_pci_tbl, + probe: saa7146_init_one, + remove: saa7146_remove_one, + suspend: saa7146_suspend, + resume: saa7146_resume, +}; + + +static +int __init saa7146_init_module(void) +{ + int err; + + dprintk("saa7146_init_module\n"); + + if ((err = pci_module_init(&saa7146_driver))) + return err; + + if ((err = saa7146_v4l_init ())) + return err; + + if ((err = av7110_init ())) + return err; + + if ((err = av7110_ir_init ())) + return err; + + return 0; +} + +static +void __exit saa7146_cleanup_module(void) +{ + av7110_ir_exit (); + av7110_exit (); + saa7146_v4l_exit (); + pci_unregister_driver(&saa7146_driver); +} + +module_init(saa7146_init_module); +module_exit(saa7146_cleanup_module); + +MODULE_AUTHOR("Michael Hunold , " + "Christian Theiss , " + "Ralph Metzler , " + "Marcus Metzler , " + "Holger Waechtler and others"); + +MODULE_DESCRIPTION("driver for saa7146/av7110 based DVB PCI cards"); +MODULE_LICENSE("GPL"); +MODULE_PARM(mode,"i"); +MODULE_PARM(saa7146_debug,"i"); +MODULE_PARM(buffers,"i"); + diff -Nru a/drivers/media/dvb/av7110/saa7146_core.h b/drivers/media/dvb/av7110/saa7146_core.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/av7110/saa7146_core.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,116 @@ +#ifndef __SAA7146_CORE__ +#define __SAA7146_CORE__ + +#include /* definitions of u32 etc. */ +#include "../dvb-core/dvbdev.h" + +#if LINUX_VERSION_CODE < 0x020300 +#define DECLARE_MUTEX(foo) struct semaphore foo = MUTEX +#define DECLARE_MUTEX_LOCKED(foo) struct semaphore foo = MUTEX_LOCKED +#define WAIT_QUEUE struct wait_queue* +#define init_waitqueue_head(wq) *(wq) = NULL; +#else +#define WAIT_QUEUE wait_queue_head_t +#endif + +/* maximum number of capture frames we support */ +#define SAA7146_MAX_BUF 5 +/* maximum number of extensions we support */ +#define SAA7146_MAX_EXTENSIONS 4 + +/* stuff for writing to saa7146 */ +#define saa7146_write(mem,adr,dat) writel((dat),(mem+(adr))) +#define saa7146_read(mem,adr) readl(mem+(adr)) + + +#define DVB_CARD_TT_SIEMENS 0 +#define DVB_CARD_TT_BUDGET 1 +#define DVB_CARD_TT_BUDGET_CI 2 +#define DVB_CARD_KNC1 3 + + +/* this struct contains some constants needed for horizontal and vertical scaling. + currently we only support PAL (mode=0)and NTSC (mode=1). */ + +struct saa7146 { + + char name[32]; /* give it a nice name */ + + struct list_head list_head; + + dvb_adapter_t *dvb_adapter; + struct dvb_i2c_bus *i2c_bus; + struct pci_dev *device; + int card_type; + + void* data[SAA7146_MAX_EXTENSIONS]; /* data hooks for extensions */ + + int (*command) (struct dvb_i2c_bus *i, unsigned int cmd, void *arg); + + unsigned char* mem; /* pointer to mapped IO memory */ + int revision; /* chip revision; needed for bug-workarounds*/ + + int interlace; + int mode; + + u32* i2c; /* i2c memory */ + u32* grabbing; /* grabbing memory */ + u32* clipping; /* clipping memory for mask or rectangle clipping*/ + u32* rps0; /* memory for rps0-program */ + u32* rps1; /* memory for rps1-program */ + u32* debi; /* memory for debi-transfers */ + + int buffers; /* number of grabbing-buffers */ + + u32* page_table[SAA7146_MAX_BUF]; /* page_tables for buffers*/ + int frame_stat[SAA7146_MAX_BUF]; /* status of grabbing buffers */ + + int grab_width[SAA7146_MAX_BUF]; /* pixel width of grabs */ + int grab_height[SAA7146_MAX_BUF]; /* pixel height of grabs */ + int grab_format[SAA7146_MAX_BUF]; /* video format of grabs */ + int grab_port[SAA7146_MAX_BUF]; /* video port for grab */ + + WAIT_QUEUE rps0_wq; /* rps0 interrupt queue (=> capture) */ + WAIT_QUEUE rps1_wq; /* rps1 interrupt queue (=> i2c, ...) */ +}; + +#define SAA7146_IRQ_RPS0 +#define SAA7146_IRQ_RPS1 + +struct saa7146_extension { + char name[32]; + u32 handles_irqs; + + void (*irq_handler)(struct saa7146*, u32, void*); + + int (*command)(struct saa7146*, void*, unsigned int cmd, void *arg); + + int (*attach)(struct saa7146*, void**); + int (*detach)(struct saa7146*, void**); + + void (*inc_use)(struct saa7146*); + void (*dec_use)(struct saa7146*); +}; + +extern int saa7146_add_extension(struct saa7146_extension* ext); +extern int saa7146_del_extension(struct saa7146_extension* ext); + + +/* external grabbing states */ +#define GBUFFER_UNUSED 0x000 +#define GBUFFER_GRABBING 0x001 +#define GBUFFER_DONE 0x002 + +#define SAA7146_CORE_BASE 200 + +#define SAA7146_DO_MMAP _IOW('d', (SAA7146_CORE_BASE+11), struct vm_area_struct *) +#define SAA7146_SET_DD1 _IOW('d', (SAA7146_CORE_BASE+12), u32) +#define SAA7146_DUMP_REGISTERS _IOW('d', (SAA7146_CORE_BASE+13), u32) +#define SAA7146_DEBI_TRANSFER _IOW('d', (SAA7146_CORE_BASE+14), struct saa7146_debi_transfer) + + +#define SAA7146_SUSPEND _IOW('d', (SAA7146_CORE_BASE+32), u32) +#define SAA7146_RESUME _IOW('d', (SAA7146_CORE_BASE+33), u32) + +#endif + diff -Nru a/drivers/media/dvb/av7110/saa7146_defs.h b/drivers/media/dvb/av7110/saa7146_defs.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/av7110/saa7146_defs.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,382 @@ +#ifndef __INCLUDED_SAA7146__ +#define __INCLUDED_SAA7146__ + +struct saa7146_video_dma { + u32 base_odd; + u32 base_even; + u32 prot_addr; + u32 pitch; + u32 base_page; + u32 num_line_byte; +}; + +struct saa7146_debi_transfer { + + u8 timeout; /* have a look at the specs for reasonable values, p.110 ff */ + u8 swap; + u8 slave16; + u8 increment; /* only for block transfers */ + u8 intel; + u8 tien; + + u16 address; + u16 num_bytes; + u8 direction; + u32 mem; /* either a "pointer" (actually the physical address) of the debi-memory (block-transfer, use virt_to_bus to supply it) or 4 bytes (as one u32-value) for immediate transfer */ +}; + +struct saa7146_modes_constants { + u8 v_offset; + u16 v_field; + u16 v_calc; + + u8 h_offset; + u16 h_pixels; + u16 h_calc; + + u16 v_max_out; + u16 h_max_out; +}; + +struct saa7146_mmap_struct +{ + const char *adr; + unsigned long size; +}; + +#define SAA7146_PAL 0 +#define SAA7146_NTSC 1 +#define SAA7146_SECAM 2 + +#define SAA7146_HPS_SOURCE_PORT_A 0x00 +#define SAA7146_HPS_SOURCE_PORT_B 0x01 +#define SAA7146_HPS_SOURCE_YPB_CPA 0x02 +#define SAA7146_HPS_SOURCE_YPA_CPB 0x03 + +#define SAA7146_HPS_SYNC_PORT_A 0x00 +#define SAA7146_HPS_SYNC_PORT_B 0x01 + + +/* Number of vertical active lines */ +#define V_ACTIVE_LINES_PAL 576 +#define V_ACTIVE_LINES_NTSC 480 +#define V_ACTIVE_LINES_SECAM 576 + +/* Number of lines in a field for HPS to process */ +#define V_FIELD_PAL 288 +#define V_FIELD_NTSC 240 +#define V_FIELD_SECAM 288 + +/* Number of lines of vertical offset before processing */ +#define V_OFFSET_NTSC 0x10 /* PLI */ +#define V_OFFSET_PAL 0x15 +#define V_OFFSET_SECAM 0x14 + +/* Number of horizontal pixels to process */ +#define H_PIXELS_NTSC 708 +#define H_PIXELS_PAL 720 +#define H_PIXELS_SECAM 720 + +/* Horizontal offset of processing window */ +#define H_OFFSET_NTSC 0x40 /* PLI Try 0x3f and find all red colors turning into blue !!?? */ +#define H_OFFSET_PAL 0x3a +#define H_OFFSET_SECAM 0x14 + +/* some memory-sizes */ +#define GRABBING_MEM_SIZE 0x240000 /* 1024 * 576 * 4*/ +#define CLIPPING_MEM_SIZE 20000 /* 1024 * 625 / 32 */ +#define I2C_MEM_SIZE 0x000800 /* 2048 */ +#define RPS_MEM_SIZE 0x000800 /* 2048 */ + +/************************************************************************/ +/* UNSORTED */ +/************************************************************************/ + +#define ME1 0x0000000800 +#define PV1 0x0000000008 + +/************************************************************************/ +/* CLIPPING */ +/************************************************************************/ + +/* some defines for the various clipping-modes */ +#define SAA7146_CLIPPING_RECT 0x4 +#define SAA7146_CLIPPING_RECT_INVERTED 0x5 +#define SAA7146_CLIPPING_MASK 0x6 +#define SAA7146_CLIPPING_MASK_INVERTED 0x7 + +/************************************************************************/ +/* RPS */ +/************************************************************************/ + +#define CMD_NOP 0x00000000 /* No operation */ +#define CMD_CLR_EVENT 0x00000000 /* Clear event */ +#define CMD_SET_EVENT 0x10000000 /* Set signal event */ +#define CMD_PAUSE 0x20000000 /* Pause */ +#define CMD_CHECK_LATE 0x30000000 /* Check late */ +#define CMD_UPLOAD 0x40000000 /* Upload */ +#define CMD_STOP 0x50000000 /* Stop */ +#define CMD_INTERRUPT 0x60000000 /* Interrupt */ +#define CMD_JUMP 0x80000000 /* Jump */ +#define CMD_WR_REG 0x90000000 /* Write (load) register */ +#define CMD_RD_REG 0xa0000000 /* Read (store) register */ +#define CMD_WR_REG_MASK 0xc0000000 /* Write register with mask */ + +/************************************************************************/ +/* OUTPUT FORMATS */ +/************************************************************************/ + +/* output formats; each entry holds three types of information */ +/* composed is used in the sense of "not-planar" */ + +#define RGB15_COMPOSED 0x213 +/* this means: yuv2rgb-conversation-mode=2, dither=yes(=1), format-mode = 3 */ +#define RGB16_COMPOSED 0x210 +#define RGB24_COMPOSED 0x201 +#define RGB32_COMPOSED 0x202 + +#define YUV411_COMPOSED 0x003 +/* this means: yuv2rgb-conversation-mode=0, dither=no(=0), format-mode = 3 */ +#define YUV422_COMPOSED 0x000 +#define YUV411_DECOMPOSED 0x00b +#define YUV422_DECOMPOSED 0x009 +#define YUV420_DECOMPOSED 0x00a + +/************************************************************************/ +/* MISC */ +/************************************************************************/ + +/* Bit mask constants */ +#define MASK_00 0x00000001 /* Mask value for bit 0 */ +#define MASK_01 0x00000002 /* Mask value for bit 1 */ +#define MASK_02 0x00000004 /* Mask value for bit 2 */ +#define MASK_03 0x00000008 /* Mask value for bit 3 */ +#define MASK_04 0x00000010 /* Mask value for bit 4 */ +#define MASK_05 0x00000020 /* Mask value for bit 5 */ +#define MASK_06 0x00000040 /* Mask value for bit 6 */ +#define MASK_07 0x00000080 /* Mask value for bit 7 */ +#define MASK_08 0x00000100 /* Mask value for bit 8 */ +#define MASK_09 0x00000200 /* Mask value for bit 9 */ +#define MASK_10 0x00000400 /* Mask value for bit 10 */ +#define MASK_11 0x00000800 /* Mask value for bit 11 */ +#define MASK_12 0x00001000 /* Mask value for bit 12 */ +#define MASK_13 0x00002000 /* Mask value for bit 13 */ +#define MASK_14 0x00004000 /* Mask value for bit 14 */ +#define MASK_15 0x00008000 /* Mask value for bit 15 */ +#define MASK_16 0x00010000 /* Mask value for bit 16 */ +#define MASK_17 0x00020000 /* Mask value for bit 17 */ +#define MASK_18 0x00040000 /* Mask value for bit 18 */ +#define MASK_19 0x00080000 /* Mask value for bit 19 */ +#define MASK_20 0x00100000 /* Mask value for bit 20 */ +#define MASK_21 0x00200000 /* Mask value for bit 21 */ +#define MASK_22 0x00400000 /* Mask value for bit 22 */ +#define MASK_23 0x00800000 /* Mask value for bit 23 */ +#define MASK_24 0x01000000 /* Mask value for bit 24 */ +#define MASK_25 0x02000000 /* Mask value for bit 25 */ +#define MASK_26 0x04000000 /* Mask value for bit 26 */ +#define MASK_27 0x08000000 /* Mask value for bit 27 */ +#define MASK_28 0x10000000 /* Mask value for bit 28 */ +#define MASK_29 0x20000000 /* Mask value for bit 29 */ +#define MASK_30 0x40000000 /* Mask value for bit 30 */ +#define MASK_31 0x80000000 /* Mask value for bit 31 */ + +#define MASK_B0 0x000000ff /* Mask value for byte 0 */ +#define MASK_B1 0x0000ff00 /* Mask value for byte 1 */ +#define MASK_B2 0x00ff0000 /* Mask value for byte 2 */ +#define MASK_B3 0xff000000 /* Mask value for byte 3 */ + +#define MASK_W0 0x0000ffff /* Mask value for word 0 */ +#define MASK_W1 0xffff0000 /* Mask value for word 1 */ + +#define MASK_PA 0xfffffffc /* Mask value for physical address */ +#define MASK_PR 0xfffffffe /* Mask value for protection register */ +#define MASK_ER 0xffffffff /* Mask value for the entire register */ + +#define MASK_NONE 0x00000000 /* No mask */ + +/************************************************************************/ +/* REGISTERS */ +/************************************************************************/ + +#define BASE_ODD1 0x00 /* Video DMA 1 registers */ +#define BASE_EVEN1 0x04 +#define PROT_ADDR1 0x08 +#define PITCH1 0x0C +#define BASE_PAGE1 0x10 /* Video DMA 1 base page */ +#define NUM_LINE_BYTE1 0x14 + +#define BASE_ODD2 0x18 /* Video DMA 2 registers */ +#define BASE_EVEN2 0x1C +#define PROT_ADDR2 0x20 +#define PITCH2 0x24 +#define BASE_PAGE2 0x28 /* Video DMA 2 base page */ +#define NUM_LINE_BYTE2 0x2C + +#define BASE_ODD3 0x30 /* Video DMA 3 registers */ +#define BASE_EVEN3 0x34 +#define PROT_ADDR3 0x38 +#define PITCH3 0x3C +#define BASE_PAGE3 0x40 /* Video DMA 3 base page */ +#define NUM_LINE_BYTE3 0x44 + +#define PCI_BT_V1 0x48 /* Video/FIFO 1 */ +#define PCI_BT_V2 0x49 /* Video/FIFO 2 */ +#define PCI_BT_V3 0x4A /* Video/FIFO 3 */ +#define PCI_BT_DEBI 0x4B /* DEBI */ +#define PCI_BT_A 0x4C /* Audio */ + +#define DD1_INIT 0x50 /* Init setting of DD1 interface */ + +#define DD1_STREAM_B 0x54 /* DD1 B video data stream handling */ +#define DD1_STREAM_A 0x56 /* DD1 A video data stream handling */ + +#define BRS_CTRL 0x58 /* BRS control register */ +#define HPS_CTRL 0x5C /* HPS control register */ +#define HPS_V_SCALE 0x60 /* HPS vertical scale */ +#define HPS_V_GAIN 0x64 /* HPS vertical ACL and gain */ +#define HPS_H_PRESCALE 0x68 /* HPS horizontal prescale */ +#define HPS_H_SCALE 0x6C /* HPS horizontal scale */ +#define BCS_CTRL 0x70 /* BCS control */ +#define CHROMA_KEY_RANGE 0x74 +#define CLIP_FORMAT_CTRL 0x78 /* HPS outputs formats & clipping */ + +#define DEBI_CONFIG 0x7C +#define DEBI_COMMAND 0x80 +#define DEBI_PAGE 0x84 +#define DEBI_AD 0x88 + +#define I2C_TRANSFER 0x8C +#define I2C_STATUS 0x90 + +#define BASE_A1_IN 0x94 /* Audio 1 input DMA */ +#define PROT_A1_IN 0x98 +#define PAGE_A1_IN 0x9C + +#define BASE_A1_OUT 0xA0 /* Audio 1 output DMA */ +#define PROT_A1_OUT 0xA4 +#define PAGE_A1_OUT 0xA8 + +#define BASE_A2_IN 0xAC /* Audio 2 input DMA */ +#define PROT_A2_IN 0xB0 +#define PAGE_A2_IN 0xB4 + +#define BASE_A2_OUT 0xB8 /* Audio 2 output DMA */ +#define PROT_A2_OUT 0xBC +#define PAGE_A2_OUT 0xC0 + +#define RPS_PAGE0 0xC4 /* RPS task 0 page register */ +#define RPS_PAGE1 0xC8 /* RPS task 1 page register */ + +#define RPS_THRESH0 0xCC /* HBI threshold for task 0 */ +#define RPS_THRESH1 0xD0 /* HBI threshold for task 1 */ + +#define RPS_TOV0 0xD4 /* RPS timeout for task 0 */ +#define RPS_TOV1 0xD8 /* RPS timeout for task 1 */ + +#define IER 0xDC /* Interrupt enable register */ + +#define GPIO_CTRL 0xE0 /* GPIO 0-3 register */ + +#define EC1SSR 0xE4 /* Event cnt set 1 source select */ +#define EC2SSR 0xE8 /* Event cnt set 2 source select */ +#define ECT1R 0xEC /* Event cnt set 1 thresholds */ +#define ECT2R 0xF0 /* Event cnt set 2 thresholds */ + +#define ACON1 0xF4 +#define ACON2 0xF8 + +#define MC1 0xFC /* Main control register 1 */ +#define MC2 0x100 /* Main control register 2 */ + +#define RPS_ADDR0 0x104 /* RPS task 0 address register */ +#define RPS_ADDR1 0x108 /* RPS task 1 address register */ + +#define ISR 0x10C /* Interrupt status register */ +#define PSR 0x110 /* Primary status register */ +#define SSR 0x114 /* Secondary status register */ + +#define EC1R 0x118 /* Event counter set 1 register */ +#define EC2R 0x11C /* Event counter set 2 register */ + +#define PCI_VDP1 0x120 /* Video DMA pointer of FIFO 1 */ +#define PCI_VDP2 0x124 /* Video DMA pointer of FIFO 2 */ +#define PCI_VDP3 0x128 /* Video DMA pointer of FIFO 3 */ +#define PCI_ADP1 0x12C /* Audio DMA pointer of audio out 1 */ +#define PCI_ADP2 0x130 /* Audio DMA pointer of audio in 1 */ +#define PCI_ADP3 0x134 /* Audio DMA pointer of audio out 2 */ +#define PCI_ADP4 0x138 /* Audio DMA pointer of audio in 2 */ +#define PCI_DMA_DDP 0x13C /* DEBI DMA pointer */ + +#define LEVEL_REP 0x140, +#define A_TIME_SLOT1 0x180, /* from 180 - 1BC */ +#define A_TIME_SLOT2 0x1C0, /* from 1C0 - 1FC */ + +/************************************************************************/ +/* ISR-MASKS */ +/************************************************************************/ + +#define SPCI_PPEF 0x80000000 /* PCI parity error */ +#define SPCI_PABO 0x40000000 /* PCI access error (target or master abort) */ +#define SPCI_PPED 0x20000000 /* PCI parity error on 'real time data' */ +#define SPCI_RPS_I1 0x10000000 /* Interrupt issued by RPS1 */ +#define SPCI_RPS_I0 0x08000000 /* Interrupt issued by RPS0 */ +#define SPCI_RPS_LATE1 0x04000000 /* RPS task 1 is late */ +#define SPCI_RPS_LATE0 0x02000000 /* RPS task 0 is late */ +#define SPCI_RPS_E1 0x01000000 /* RPS error from task 1 */ +#define SPCI_RPS_E0 0x00800000 /* RPS error from task 0 */ +#define SPCI_RPS_TO1 0x00400000 /* RPS timeout task 1 */ +#define SPCI_RPS_TO0 0x00200000 /* RPS timeout task 0 */ +#define SPCI_UPLD 0x00100000 /* RPS in upload */ +#define SPCI_DEBI_S 0x00080000 /* DEBI status */ +#define SPCI_DEBI_E 0x00040000 /* DEBI error */ +#define SPCI_IIC_S 0x00020000 /* I2C status */ +#define SPCI_IIC_E 0x00010000 /* I2C error */ +#define SPCI_A2_IN 0x00008000 /* Audio 2 input DMA protection / limit */ +#define SPCI_A2_OUT 0x00004000 /* Audio 2 output DMA protection / limit */ +#define SPCI_A1_IN 0x00002000 /* Audio 1 input DMA protection / limit */ +#define SPCI_A1_OUT 0x00001000 /* Audio 1 output DMA protection / limit */ +#define SPCI_AFOU 0x00000800 /* Audio FIFO over- / underflow */ +#define SPCI_V_PE 0x00000400 /* Video protection address */ +#define SPCI_VFOU 0x00000200 /* Video FIFO over- / underflow */ +#define SPCI_FIDA 0x00000100 /* Field ID video port A */ +#define SPCI_FIDB 0x00000080 /* Field ID video port B */ +#define SPCI_PIN3 0x00000040 /* GPIO pin 3 */ +#define SPCI_PIN2 0x00000020 /* GPIO pin 2 */ +#define SPCI_PIN1 0x00000010 /* GPIO pin 1 */ +#define SPCI_PIN0 0x00000008 /* GPIO pin 0 */ +#define SPCI_ECS 0x00000004 /* Event counter 1, 2, 4, 5 */ +#define SPCI_EC3S 0x00000002 /* Event counter 3 */ +#define SPCI_EC0S 0x00000001 /* Event counter 0 */ + +/************************************************************************/ +/* I2C */ +/************************************************************************/ + +/* time we wait after certain i2c-operations */ +#define SAA7146_I2C_DELAY 10 + +#define SAA7146_I2C_ABORT (1<<7) +#define SAA7146_I2C_SPERR (1<<6) +#define SAA7146_I2C_APERR (1<<5) +#define SAA7146_I2C_DTERR (1<<4) +#define SAA7146_I2C_DRERR (1<<3) +#define SAA7146_I2C_AL (1<<2) +#define SAA7146_I2C_ERR (1<<1) +#define SAA7146_I2C_BUSY (1<<0) + +#define SAA7146_I2C_START (0x3) +#define SAA7146_I2C_CONT (0x2) +#define SAA7146_I2C_STOP (0x1) +#define SAA7146_I2C_NOP (0x0) + +#define SAA7146_I2C_BUS_BIT_RATE_6400 (0x500) +#define SAA7146_I2C_BUS_BIT_RATE_3200 (0x100) +#define SAA7146_I2C_BUS_BIT_RATE_480 (0x400) +#define SAA7146_I2C_BUS_BIT_RATE_320 (0x600) +#define SAA7146_I2C_BUS_BIT_RATE_240 (0x700) +#define SAA7146_I2C_BUS_BIT_RATE_120 (0x000) +#define SAA7146_I2C_BUS_BIT_RATE_80 (0x200) +#define SAA7146_I2C_BUS_BIT_RATE_60 (0x300) + + +#endif diff -Nru a/drivers/media/dvb/av7110/saa7146_v4l.c b/drivers/media/dvb/av7110/saa7146_v4l.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/av7110/saa7146_v4l.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,502 @@ +/* + video4linux-parts of the saa7146 device driver + + Copyright (C) 1998,1999 Michael Hunold + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include /* for module-version */ +#include +#include /* for kmalloc/kfree */ +#include /* for delay-stuff */ +#include /* for copy_to/from_user */ +#include /* for mem_map_reserve */ +#include +#include + +#include "saa7146_defs.h" +#include "saa7146_core.h" +#include "saa7146_v4l.h" + + +static int saa7146_v4l_debug = 0; + +#define dprintk if (saa7146_v4l_debug) printk +#define hprintk if (saa7146_v4l_debug >= 2) printk +#define gprintk if (saa7146_v4l_debug >= 3) printk + +#define __COMPILE_SAA7146__ +#include "saa7146.c" + +/* transform video4linux-cliplist to plain arrays -- we assume that the arrays + are big enough -- if not: your fault! */ +int saa7146_v4lclip2plain(struct video_clip *clips, u16 clipcount, int x[], int y[], int width[], int height[]) +{ + int i = 0; + struct video_clip* vc = NULL; + + dprintk("saa7146_v4l.o: ==> saa7146_v4lclip2plain, cc:%d\n",clipcount); + + /* anything to do here? */ + if( 0 == clipcount ) + return 0; + + /* copy to kernel-space */ + vc = vmalloc(sizeof(struct video_clip)*(clipcount)); + if( NULL == vc ) { + printk("saa7146_v4l.o: ==> v4lclip2saa7146_v4l.o: no memory #2!\n"); + return -ENOMEM; + } + if(copy_from_user(vc,clips,sizeof(struct video_clip)*clipcount)) { + printk("saa7146_v4l.o: ==> v4lclip2saa7146_v4l.o: could not copy from user-space!\n"); + return -EFAULT; + } + + /* copy the clip-list to the arrays + note: the video_clip-struct may contain negative values to indicate that a window + doesn't lay completly over the video window. Thus, we correct the values right here */ + for(i = 0; i < clipcount; i++) { + + if( vc[i].width < 0) { + vc[i].x += vc[i].width; vc[i].width = -vc[i].width; + } + if( vc[i].height < 0) { + vc[i].y += vc[i].height; vc[i].height = -vc[i].height; + } + + if( vc[i].x < 0) { + vc[i].width += vc[i].x; vc[i].x = 0; + } + if( vc[i].y < 0) { + vc[i].height += vc[i].y; vc[i].y = 0; + } + + if(vc[i].width <= 0 || vc[i].height <= 0) { + vfree(vc); + return -EINVAL; + } + + x[i] = vc[i].x; + y[i] = vc[i].y; + width[i] = vc[i].width; + height[i] = vc[i].height; + } + + /* free memory used for temporary clips */ + vfree(vc); + + return 0; +} + +struct saa7146_v4l_struct { + struct video_buffer buffer; + struct video_mbuf mbuf; + struct video_window window; + struct video_picture picture; +}; + +static int saa7146_v4l_command(struct saa7146* saa, void *p, unsigned int cmd, void *arg) +{ + struct saa7146_v4l_struct* data = (struct saa7146_v4l_struct*)p; + + hprintk("saa7146_v4l.o: ==> saa7146_v4l_command\n"); + + if( NULL == saa) + return -EINVAL; + + switch(cmd) { + case SAA7146_V4L_GPICT: + { + struct video_picture *p = arg; + + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_GPICT\n"); + + memcpy(p, &data->picture, sizeof(struct video_picture)); + + } + break; + + case SAA7146_V4L_SPICT: + { + struct video_picture *p = arg; + + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_SPICT\n"); + + memcpy(&data->picture, p, sizeof(struct video_picture)); + set_picture_prop(saa, (u32)(data->picture.brightness>>8),(u32)(data->picture.contrast>>9),(u32)(data->picture.colour>>9)); + + } + break; + + case SAA7146_V4L_SWIN: + { + struct video_window *vw = arg; + int *x = NULL, *y = NULL, *w = NULL, *h = NULL; + + u32 palette = 0; + + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_SWIN\n"); + + video_setmode(saa, 0); + saa7146_write(saa->mem, MC1, (MASK_21)); + + set_window(saa, vw->width, vw->height,0,0,0); + //saa->port, saa->sync); + if (move_to(saa, vw->x, vw->y, vw->height, data->buffer.width, + data->buffer.depth, data->buffer.bytesperline, + (u32)data->buffer.base, 0)<0) + return -1; + + switch( data->picture.palette ) { + + case VIDEO_PALETTE_RGB555: + palette = RGB15_COMPOSED; + break; + + case VIDEO_PALETTE_RGB24: + palette = RGB24_COMPOSED; + break; + + case VIDEO_PALETTE_RGB32: + palette = RGB32_COMPOSED; + break; + + case VIDEO_PALETTE_UYVY: + palette = YUV422_COMPOSED; + break; + + case VIDEO_PALETTE_YUV422P: + palette = YUV422_DECOMPOSED; + break; + + case VIDEO_PALETTE_YUV420P: + palette = YUV420_DECOMPOSED; + break; + + case VIDEO_PALETTE_YUV411P: + palette = YUV411_DECOMPOSED; + break; + + default: + /*case VIDEO_PALETTE_RGB565:*/ + palette = RGB16_COMPOSED; + break; + } + + set_output_format(saa, palette); + + if (vw->flags==VIDEO_CLIP_BITMAP) { + clip_windows(saa, SAA7146_CLIPPING_MASK, vw->width, vw->height, + (u32 *) vw->clips, 1, 0, 0, 0, 0); + } else { + + + /* this is tricky, but helps us saving kmalloc/kfree-calls + and boring if/else-constructs ... */ + x = (int*)kmalloc(sizeof(int)*vw->clipcount*4,GFP_KERNEL); + if( NULL == x ) { + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_SWIN: out of kernel-memory.\n"); + return -ENOMEM; + } + y = x+(1*vw->clipcount); + w = x+(2*vw->clipcount); + h = x+(3*vw->clipcount); + + /* transform clipping-windows */ + if (0 != saa7146_v4lclip2plain(vw->clips, vw->clipcount,x,y,w,h)) + break; + clip_windows(saa, SAA7146_CLIPPING_RECT, vw->width, vw->height, + NULL, vw->clipcount, x, y, w, h); + kfree(x); + + memcpy(&data->window, arg, sizeof(struct video_window)); + } + video_setmode(saa, 1); + break; + } + + case SAA7146_V4L_CCAPTURE: + { + int* i = arg; + + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_CCAPTURE\n"); + + if ( 0 == *i ) { + video_setmode(saa, 0); + } + else { + video_setmode(saa, 1); + } + + break; + } + + case SAA7146_V4L_GFBUF: + { + struct video_buffer *b = arg; + + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_GFBUF\n"); + + memcpy(b, &data->buffer, sizeof(struct video_buffer)); + + break; + } + + case SAA7146_V4L_SFBUF: + { + struct video_buffer *b = arg; + + memcpy(&data->buffer, b, sizeof(struct video_buffer)); + hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_SFBUF: b:0x%08x, h:%d, w:%d, d:%d\n", (u32)data->buffer.base, data->buffer.height, data->buffer.width, data->buffer.depth); + + break; + } + + + case SAA7146_V4L_CSYNC: + { + int i = *((int*)arg); + + int count = 0, k = 0; + unsigned char* grabbfr; + unsigned char y, uv; + + /* sanity checks */ + if ( i >= saa->buffers || i < 0) { + gprintk("saa7146_v4l.o: SAA7146_V4L_CSYNC, invalid buffer %d\n",i); + return -EINVAL; + } + + /* get the state */ + switch ( saa->frame_stat[i] ) { + case GBUFFER_UNUSED: + { + /* there was no grab to this buffer */ + gprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_CSYNC, invalid frame (fr:%d)\n",i); + return -EINVAL; + } + case GBUFFER_GRABBING: + { + /* wait to be woken up by the irq-handler */ + interruptible_sleep_on(&saa->rps0_wq); + break; + } + case GBUFFER_DONE: + { + gprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_CSYNC, frame done! (fr:%d)\n",i); + break; + } + } + + /* all saa7146´s below chip-revision 3 are not capable of + doing byte-swaps with video-dma1. for rgb-grabbing this + does not matter, but yuv422-grabbing has the wrong + byte-order, so we have to swap in software */ + if ( ( saa->revision<3) && + (saa->grab_format[i] == YUV422_COMPOSED)) { + /* swap UYVY to YUYV */ + count = saa->grab_height[i]*saa->grab_width[i]*2; + grabbfr = ((unsigned char*)(saa->grabbing))+i*GRABBING_MEM_SIZE; + for (k=0; kframe_stat[i] = GBUFFER_UNUSED; +printk ("saa7146_v4l.o: SAA7146_V4L_CSYNC, frame %i done.\n", i); + + break; + } + case SAA7146_V4L_CMCAPTURE: + { + struct video_mmap *vm = arg; + + gprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_CMCAPTURE, trying buffer:%d\n", vm->frame); + + /* check status for wanted frame */ + if ( GBUFFER_GRABBING == saa->frame_stat[vm->frame] ) { + gprintk("saa7146_v4l.o: frame #%d still grabbing!\n",vm->frame); + return -EBUSY; + } + + /* do necessary transformations from the videodev-structure to our own format. */ + + /* sanity checks */ + if ( vm->width <= 0 || vm->height <= 0 ) { + gprintk("saa7146_v4l.o: set_up_grabbing, invalid dimension for wanted buffer %d\n",vm->frame); + return -EINVAL; + } + + /* set corresponding buffer to ´grabbing´ */ + saa->frame_stat[vm->frame] = GBUFFER_GRABBING; + + /* copy grabbing informtaion for the buffer */ + saa->grab_height[vm->frame] = vm->height; + saa->grab_width[vm->frame] = vm->width; + /* fixme: setting of grabbing port ?!*/ + saa->grab_port[vm->frame] = 0; + + switch( vm->format ) { + + case VIDEO_PALETTE_RGB555: + saa->grab_format[vm->frame] = RGB15_COMPOSED; + break; + + case VIDEO_PALETTE_RGB24: + saa->grab_format[vm->frame] = RGB24_COMPOSED; + break; + + case VIDEO_PALETTE_RGB32: + saa->grab_format[vm->frame] = RGB32_COMPOSED; + break; + + case VIDEO_PALETTE_YUV420P: + return -EINVAL; + + case VIDEO_PALETTE_YUV422: + saa->grab_format[vm->frame] = YUV422_COMPOSED; + break; + + case VIDEO_PALETTE_YUV422P: + saa->grab_format[vm->frame] = YUV422_DECOMPOSED; + break; + + case VIDEO_PALETTE_YUV411P: + saa->grab_format[vm->frame] = YUV411_DECOMPOSED; + break; + + default: + /*case VIDEO_PALETTE_RGB565:*/ + saa->grab_format[vm->frame] = RGB16_COMPOSED; + break; + } + + set_up_grabbing(saa,vm->frame); + break; + } + case SAA7146_V4L_GMBUF: + { + struct video_mbuf *m = arg; + int i = 0; + + m->size = saa->buffers * GRABBING_MEM_SIZE; + m->frames = saa->buffers; + + for(i = 0; i < saa->buffers; i++) + m->offsets[i]=(i*GRABBING_MEM_SIZE); + + gprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_GMBUF, providing %d buffers.\n", saa->buffers); + + break; + } + + default: + return -ENOIOCTLCMD; + } + + return 0; +} + +int saa7146_v4l_attach(struct saa7146* adap, void** p) +{ + struct saa7146_v4l_struct* data; + + hprintk("saa7146_v4l.o: ==> saa7146_v4l_inc_use_attach\n"); + + if (!(data = kmalloc(sizeof(struct saa7146_v4l_struct), GFP_KERNEL))) { + printk (KERN_ERR "%s: out of memory!\n", __FUNCTION__); + return -ENOMEM; + } + *(struct saa7146_v4l_struct**)p = data; + + memset(&data->buffer, 0x0, sizeof(struct video_buffer)); + memset(&data->mbuf, 0x0, sizeof(struct video_mbuf)); + memset(&data->window, 0x0, sizeof(struct video_window)); + memset(&data->picture,0x0, sizeof(struct video_picture)); + + data->picture.brightness = 32768; + data->picture.contrast = 32768; + data->picture.colour = 32768; /* saturation */ + data->picture.depth = 16; + data->picture.palette = VIDEO_PALETTE_RGB565; + + return 0; +} + + +void saa7146_v4l_inc_use(struct saa7146* adap) +{ + MOD_INC_USE_COUNT; +} + + +int saa7146_v4l_detach(struct saa7146* adap, void** p) +{ + struct saa7146_v4l_struct** data = (struct saa7146_v4l_struct**)p; + + kfree(*data); + *data = NULL; + + return 0; +} + + +void saa7146_v4l_dec_use(struct saa7146* adap) +{ + MOD_DEC_USE_COUNT; +} + + +static struct saa7146_extension saa7146_v4l_extension = { + "v4l extension\0", + MASK_27, /* handles rps0 irqs */ + saa7146_std_grab_irq_callback_rps0, + saa7146_v4l_command, + saa7146_v4l_attach, + saa7146_v4l_detach, + saa7146_v4l_inc_use, + saa7146_v4l_dec_use +}; + + +int saa7146_v4l_init (void) +{ + int res = 0; + + if((res = saa7146_add_extension(&saa7146_v4l_extension))) { + printk("saa7146_v4l.o: extension registration failed, module not inserted.\n"); + return res; + } + + return 0; +} + + +void saa7146_v4l_exit (void) +{ + int res = 0; + if ((res = saa7146_del_extension(&saa7146_v4l_extension))) { + printk("saa7146_v4l.o: extension deregistration failed, module not removed.\n"); + } +} + +MODULE_PARM(saa7146_v4l_debug, "i"); +MODULE_PARM_DESC(saa7146_v4l_debug, "set saa7146_v4l.c in debug mode"); + diff -Nru a/drivers/media/dvb/av7110/saa7146_v4l.h b/drivers/media/dvb/av7110/saa7146_v4l.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/av7110/saa7146_v4l.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,32 @@ +#ifndef __INCLUDED_SAA7146_V4L_V4L__ +#define __INCLUDED_SAA7146_V4L_V4L__ + +/************************************************************************/ +/* ADDRESSING */ +/************************************************************************/ + +#define SAA7146_V4L_BASE 100 + +#define SAA7146_V4L_GPICT _IOW('d', (SAA7146_V4L_BASE+ 1), struct video_picture) +#define SAA7146_V4L_SPICT _IOW('d', (SAA7146_V4L_BASE+ 2), struct video_picture) + +#define SAA7146_V4L_GFBUF _IOW('d', (SAA7146_V4L_BASE+ 3), struct video_buffer) +#define SAA7146_V4L_SFBUF _IOW('d', (SAA7146_V4L_BASE+ 4), struct video_buffer) + +#define SAA7146_V4L_GMBUF _IOW('d', (SAA7146_V4L_BASE+ 5), struct video_mbuf) + +#define SAA7146_V4L_SWIN _IOW('d', (SAA7146_V4L_BASE+ 6), struct video_window) + +#define SAA7146_V4L_CCAPTURE _IOW('d', (SAA7146_V4L_BASE+ 7), int) + +#define SAA7146_V4L_CMCAPTURE _IOW('d', (SAA7146_V4L_BASE+ 8), struct video_mmap) +#define SAA7146_V4L_CSYNC _IOW('d', (SAA7146_V4L_BASE+ 9), int) +#define SAA7146_V4L_CGSTATUS _IOW('d', (SAA7146_V4L_BASE+10), int) + +#define SAA7146_V4L_TSCAPTURE _IOW('d', (SAA7146_V4L_BASE+11), int) + +extern int saa7146_v4l_init (void); +extern void saa7146_v4l_exit (void); + +#endif + diff -Nru a/drivers/media/dvb/dvb-core/Config.help b/drivers/media/dvb/dvb-core/Config.help --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/Config.help Mon Oct 28 16:32:38 2002 @@ -0,0 +1,13 @@ +CONFIG_DVB_CORE + DVB core utility functions for device handling, software fallbacks etc. + + Say Y when you have a DVB card and want to use it. If unsure say N. + + +CONFIG_DVB_DEVFS_ONLY + Drop support for old major/minor device scheme and support only devfs + systems. This saves some code. + + If unsure say N. + + diff -Nru a/drivers/media/dvb/dvb-core/Config.in b/drivers/media/dvb/dvb-core/Config.in --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/Config.in Mon Oct 28 16:32:38 2002 @@ -0,0 +1,7 @@ + +dep_tristate ' DVB Core Support' CONFIG_DVB_CORE $CONFIG_DVB + +if [ "$CONFIG_DVB_CORE" != "n" ]; then + dep_bool ' devfs only' CONFIG_DVB_DEVFS_ONLY $CONFIG_DVB_CORE $CONFIG_DEVFS_FS +fi + diff -Nru a/drivers/media/dvb/dvb-core/Makefile b/drivers/media/dvb/dvb-core/Makefile --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/Makefile Mon Oct 28 16:32:38 2002 @@ -0,0 +1,13 @@ +# +# Makefile for the kernel DVB device drivers. +# + +export-objs := dvb_ksyms.o + +dvb-core-objs = dvbdev.o dmxdev.o dvb_demux.o dvb_filter.o \ + dvb_frontend.o dvb_i2c.o dvb_net.o dvb_ksyms.o + +obj-$(CONFIG_DVB_CORE) += dvb-core.o + +include $(TOPDIR)/Rules.make + diff -Nru a/drivers/media/dvb/dvb-core/compat.h b/drivers/media/dvb/dvb-core/compat.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/compat.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,24 @@ +#ifndef __CRAP_H +#define __CRAP_H + +/** + * compatibility crap for old kernels. No guarantee for a working driver + * even when everything compiles. + */ + + +#include +#include + +#ifndef MODULE_LICENSE +#define MODULE_LICENSE(x) +#endif + +#ifndef 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 + +#endif + diff -Nru a/drivers/media/dvb/dvb-core/demux.h b/drivers/media/dvb/dvb-core/demux.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/demux.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,301 @@ +/* demux.h + * + * Copyright (c) 2002 Convergence GmbH + * + * based on code: + * Copyright (c) 2000 Nokia Research Center + * Tampere, FINLAND + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __DEMUX_H +#define __DEMUX_H + +#ifndef __KERNEL__ +#define __KERNEL__ +#endif + +#include +#include +#include +#include + +/*--------------------------------------------------------------------------*/ +/* Common definitions */ +/*--------------------------------------------------------------------------*/ + +/* + * DMX_MAX_FILTER_SIZE: Maximum length (in bytes) of a section/PES filter. + */ + +#ifndef DMX_MAX_FILTER_SIZE +#define DMX_MAX_FILTER_SIZE 18 +#endif + +/* + * dmx_success_t: Success codes for the Demux Callback API. + */ + +typedef enum { + DMX_OK = 0, /* Received Ok */ + DMX_LENGTH_ERROR, /* Incorrect length */ + DMX_OVERRUN_ERROR, /* Receiver ring buffer overrun */ + DMX_CRC_ERROR, /* Incorrect CRC */ + DMX_FRAME_ERROR, /* Frame alignment error */ + DMX_FIFO_ERROR, /* Receiver FIFO overrun */ + DMX_MISSED_ERROR /* Receiver missed packet */ +} dmx_success_t; + +/*--------------------------------------------------------------------------*/ +/* TS packet reception */ +/*--------------------------------------------------------------------------*/ + +/* TS filter type for set() */ + +#define TS_PACKET 1 /* send TS packets (188 bytes) to callback (default) */ +#define TS_PAYLOAD_ONLY 2 /* in case TS_PACKET is set, only send the TS + payload (<=184 bytes per packet) to callback */ +#define TS_DECODER 4 /* send stream to built-in decoder (if present) */ + +/* PES type for filters which write to built-in decoder */ +/* these should be kept identical to the types in dmx.h */ + +typedef enum +{ /* also send packets to decoder (if it exists) */ + DMX_TS_PES_AUDIO0, + DMX_TS_PES_VIDEO0, + DMX_TS_PES_TELETEXT0, + DMX_TS_PES_SUBTITLE0, + DMX_TS_PES_PCR0, + + DMX_TS_PES_AUDIO1, + DMX_TS_PES_VIDEO1, + DMX_TS_PES_TELETEXT1, + DMX_TS_PES_SUBTITLE1, + DMX_TS_PES_PCR1, + + DMX_TS_PES_AUDIO2, + DMX_TS_PES_VIDEO2, + DMX_TS_PES_TELETEXT2, + DMX_TS_PES_SUBTITLE2, + DMX_TS_PES_PCR2, + + DMX_TS_PES_AUDIO3, + DMX_TS_PES_VIDEO3, + DMX_TS_PES_TELETEXT3, + DMX_TS_PES_SUBTITLE3, + DMX_TS_PES_PCR3, + + DMX_TS_PES_OTHER +} dmx_ts_pes_t; + +#define DMX_TS_PES_AUDIO DMX_TS_PES_AUDIO0 +#define DMX_TS_PES_VIDEO DMX_TS_PES_VIDEO0 +#define DMX_TS_PES_TELETEXT DMX_TS_PES_TELETEXT0 +#define DMX_TS_PES_SUBTITLE DMX_TS_PES_SUBTITLE0 +#define DMX_TS_PES_PCR DMX_TS_PES_PCR0 + + +struct dmx_ts_feed_s { + int is_filtering; /* Set to non-zero when filtering in progress */ + struct dmx_demux_s *parent; /* Back-pointer */ + void *priv; /* Pointer to private data of the API client */ + int (*set) (struct dmx_ts_feed_s *feed, + uint16_t pid, + int type, + dmx_ts_pes_t pes_type, + size_t callback_length, + size_t circular_buffer_size, + int descramble, + struct timespec timeout); + int (*start_filtering) (struct dmx_ts_feed_s* feed); + int (*stop_filtering) (struct dmx_ts_feed_s* feed); +}; + +typedef struct dmx_ts_feed_s dmx_ts_feed_t; + +/*--------------------------------------------------------------------------*/ +/* Section reception */ +/*--------------------------------------------------------------------------*/ + +typedef struct { + __u8 filter_value [DMX_MAX_FILTER_SIZE]; + __u8 filter_mask [DMX_MAX_FILTER_SIZE]; + __u8 filter_mode [DMX_MAX_FILTER_SIZE]; + struct dmx_section_feed_s* parent; /* Back-pointer */ + void* priv; /* Pointer to private data of the API client */ +} dmx_section_filter_t; + +struct dmx_section_feed_s { + int is_filtering; /* Set to non-zero when filtering in progress */ + struct dmx_demux_s* parent; /* Back-pointer */ + void* priv; /* Pointer to private data of the API client */ + int (*set) (struct dmx_section_feed_s* feed, + __u16 pid, + size_t circular_buffer_size, + int descramble, + int check_crc); + int (*allocate_filter) (struct dmx_section_feed_s* feed, + dmx_section_filter_t** filter); + int (*release_filter) (struct dmx_section_feed_s* feed, + dmx_section_filter_t* filter); + int (*start_filtering) (struct dmx_section_feed_s* feed); + int (*stop_filtering) (struct dmx_section_feed_s* feed); +}; +typedef struct dmx_section_feed_s dmx_section_feed_t; + +/*--------------------------------------------------------------------------*/ +/* Callback functions */ +/*--------------------------------------------------------------------------*/ + +typedef int (*dmx_ts_cb) ( __u8 * buffer1, + size_t buffer1_length, + __u8 * buffer2, + size_t buffer2_length, + dmx_ts_feed_t* source, + dmx_success_t success); + +typedef int (*dmx_section_cb) ( __u8 * buffer1, + size_t buffer1_len, + __u8 * buffer2, + size_t buffer2_len, + dmx_section_filter_t * source, + dmx_success_t success); + +/*--------------------------------------------------------------------------*/ +/* DVB Front-End */ +/*--------------------------------------------------------------------------*/ + +typedef enum { + DMX_MEMORY_FE, + DMX_FRONTEND_0, + DMX_FRONTEND_1, + DMX_FRONTEND_2, + DMX_FRONTEND_3, + DMX_STREAM_0, /* external stream input, e.g. LVDS */ + DMX_STREAM_1, + DMX_STREAM_2, + DMX_STREAM_3 +} dmx_frontend_source_t; + +typedef struct { + /* The following char* fields point to NULL terminated strings */ + char* id; /* Unique front-end identifier */ + char* vendor; /* Name of the front-end vendor */ + char* model; /* Name of the front-end model */ + struct list_head connectivity_list; /* List of front-ends that can + be connected to a particular + demux */ + void* priv; /* Pointer to private data of the API client */ + dmx_frontend_source_t source; +} dmx_frontend_t; + +/*--------------------------------------------------------------------------*/ +/* MPEG-2 TS Demux */ +/*--------------------------------------------------------------------------*/ + +/* + * Flags OR'ed in the capabilites field of struct dmx_demux_s. + */ + +#define DMX_TS_FILTERING 1 +#define DMX_PES_FILTERING 2 +#define DMX_SECTION_FILTERING 4 +#define DMX_MEMORY_BASED_FILTERING 8 /* write() available */ +#define DMX_CRC_CHECKING 16 +#define DMX_TS_DESCRAMBLING 32 +#define DMX_SECTION_PAYLOAD_DESCRAMBLING 64 +#define DMX_MAC_ADDRESS_DESCRAMBLING 128 + +/* + * Demux resource type identifier. +*/ + +/* + * DMX_FE_ENTRY(): Casts elements in the list of registered + * front-ends from the generic type struct list_head + * to the type * dmx_frontend_t + *. +*/ + +#define DMX_FE_ENTRY(list) list_entry(list, dmx_frontend_t, connectivity_list) + +struct dmx_demux_s { + /* The following char* fields point to NULL terminated strings */ + char* id; /* Unique demux identifier */ + char* vendor; /* Name of the demux vendor */ + char* model; /* Name of the demux model */ + __u32 capabilities; /* Bitfield of capability flags */ + dmx_frontend_t* frontend; /* Front-end connected to the demux */ + struct list_head reg_list; /* List of registered demuxes */ + void* priv; /* Pointer to private data of the API client */ + int users; /* Number of users */ + int (*open) (struct dmx_demux_s* demux); + int (*close) (struct dmx_demux_s* demux); + int (*write) (struct dmx_demux_s* demux, const char* buf, size_t count); + int (*allocate_ts_feed) (struct dmx_demux_s* demux, + dmx_ts_feed_t** feed, + dmx_ts_cb callback); + int (*release_ts_feed) (struct dmx_demux_s* demux, + dmx_ts_feed_t* feed); + int (*allocate_section_feed) (struct dmx_demux_s* demux, + dmx_section_feed_t** feed, + dmx_section_cb callback); + int (*release_section_feed) (struct dmx_demux_s* demux, + dmx_section_feed_t* feed); + int (*descramble_mac_address) (struct dmx_demux_s* demux, + __u8* buffer1, + size_t buffer1_length, + __u8* buffer2, + size_t buffer2_length, + __u16 pid); + int (*descramble_section_payload) (struct dmx_demux_s* demux, + __u8* buffer1, + size_t buffer1_length, + __u8* buffer2, size_t buffer2_length, + __u16 pid); + int (*add_frontend) (struct dmx_demux_s* demux, + dmx_frontend_t* frontend); + int (*remove_frontend) (struct dmx_demux_s* demux, + dmx_frontend_t* frontend); + struct list_head* (*get_frontends) (struct dmx_demux_s* demux); + int (*connect_frontend) (struct dmx_demux_s* demux, + dmx_frontend_t* frontend); + int (*disconnect_frontend) (struct dmx_demux_s* demux); + + int (*get_pes_pids) (struct dmx_demux_s* demux, __u16 *pids); +}; +typedef struct dmx_demux_s dmx_demux_t; + +/*--------------------------------------------------------------------------*/ +/* Demux directory */ +/*--------------------------------------------------------------------------*/ + +/* + * DMX_DIR_ENTRY(): Casts elements in the list of registered + * demuxes from the generic type struct list_head* to the type dmx_demux_t + *. + */ + +#define DMX_DIR_ENTRY(list) list_entry(list, dmx_demux_t, reg_list) + +int dmx_register_demux (dmx_demux_t* demux); +int dmx_unregister_demux (dmx_demux_t* demux); +struct list_head* dmx_get_demuxes (void); + +#endif /* #ifndef __DEMUX_H */ + diff -Nru a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dmxdev.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,1113 @@ +/* + * dmxdev.c - DVB demultiplexer device + * + * Copyright (C) 2000 Ralph Metzler + * & Marcus Metzler + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include +#include +#include +#include + +#include "dmxdev.h" + + +//MODULE_DESCRIPTION(""); +//MODULE_AUTHOR("Ralph Metzler, Marcus Metzler"); +//#ifdef MODULE_LICENSE +//MODULE_LICENSE("GPL"); +//#endif +MODULE_PARM(debug,"i"); +static int debug = 0; + +#define dprintk if (debug) printk + +inline dmxdev_filter_t * +DmxDevFile2Filter(struct file *file) +{ + return (dmxdev_filter_t *) file->private_data; +} + +inline dmxdev_dvr_t * +DmxDevFile2DVR(dmxdev_t *dmxdev, struct file *file) +{ + return (dmxdev_dvr_t *) file->private_data; +} + +static inline void +DmxDevBufferInit(dmxdev_buffer_t *buffer) +{ + buffer->data=0; + buffer->size=8192; + buffer->pread=0; + buffer->pwrite=0; + buffer->error=0; + init_waitqueue_head(&buffer->queue); +} + +static inline int +DmxDevBufferWrite(dmxdev_buffer_t *buf, uint8_t *src, int len) +{ + int split; + int free; + int todo; + + if (!len) + return 0; + if (!buf->data) + return 0; + + free=buf->pread-buf->pwrite; + split=0; + if (free<=0) { + free+=buf->size; + split=buf->size-buf->pwrite; + } + if (len>=free) { + dprintk("dmxdev: buffer overflow\n"); + return -1; + } + if (split>=len) + split=0; + todo=len; + if (split) { + memcpy(buf->data + buf->pwrite, src, split); + todo-=split; + buf->pwrite=0; + } + memcpy(buf->data + buf->pwrite, src+split, todo); + buf->pwrite=(buf->pwrite+todo)%buf->size; + return len; +} + +static ssize_t +DmxDevBufferRead(dmxdev_buffer_t *src, int non_blocking, + char *buf, size_t count, loff_t *ppos) +{ + unsigned long todo=count; + int split, avail, error; + + if (!src->data) + return 0; + + if ((error=src->error)) { + src->error=0; + return error; + } + + if (non_blocking && (src->pwrite==src->pread)) + return -EWOULDBLOCK; + + while (todo>0) { + if (non_blocking && (src->pwrite==src->pread)) + return (count-todo) ? (count-todo) : -EWOULDBLOCK; + + if (wait_event_interruptible(src->queue, + (src->pread!=src->pwrite) || + (src->error))<0) + return count-todo; + + if ((error=src->error)) { + src->error=0; + return error; + } + + split=src->size; + avail=src->pwrite - src->pread; + if (avail<0) { + avail+=src->size; + split=src->size - src->pread; + } + if (avail>todo) + avail=todo; + if (splitdata+src->pread, split)) + return -EFAULT; + buf+=split; + src->pread=0; + todo-=split; + avail-=split; + } + if (avail) { + if (copy_to_user(buf, src->data+src->pread, avail)) + return -EFAULT; + src->pread = (src->pread + avail) % src->size; + todo-=avail; + buf+=avail; + } + } + return count; +} + +static dmx_frontend_t * +get_fe(dmx_demux_t *demux, int type) +{ + struct list_head *head, *pos; + + head=demux->get_frontends(demux); + if (!head) + return 0; + list_for_each(pos, head) + if (DMX_FE_ENTRY(pos)->source==type) + return DMX_FE_ENTRY(pos); + + return 0; +} + +static inline void +DmxDevDVRStateSet(dmxdev_dvr_t *dmxdevdvr, int state) +{ + spin_lock_irq(&dmxdevdvr->dev->lock); + dmxdevdvr->state=state; + spin_unlock_irq(&dmxdevdvr->dev->lock); +} + +static int dvb_dvr_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + dmx_frontend_t *front; + + dprintk ("function : %s\n", __FUNCTION__); + + if (down_interruptible (&dmxdev->mutex)) + return -ERESTARTSYS; + + if ((file->f_flags&O_ACCMODE)==O_RDWR) { + if (!(dmxdev->capabilities&DMXDEV_CAP_DUPLEX)) { + up(&dmxdev->mutex); + return -EOPNOTSUPP; + } + } + + if ((file->f_flags&O_ACCMODE)==O_RDONLY) { + DmxDevBufferInit(&dmxdev->dvr_buffer); + dmxdev->dvr_buffer.size=DVR_BUFFER_SIZE; + dmxdev->dvr_buffer.data=vmalloc(DVR_BUFFER_SIZE); + if (!dmxdev->dvr_buffer.data) { + up(&dmxdev->mutex); + return -ENOMEM; + } + } + + if ((file->f_flags&O_ACCMODE)==O_WRONLY) { + dmxdev->dvr_orig_fe=dmxdev->demux->frontend; + + if (!dmxdev->demux->write) { + up(&dmxdev->mutex); + return -EOPNOTSUPP; + } + + front=get_fe(dmxdev->demux, DMX_MEMORY_FE); + + if (!front) { + up(&dmxdev->mutex); + return -EINVAL; + } + dmxdev->demux->disconnect_frontend(dmxdev->demux); + dmxdev->demux->connect_frontend(dmxdev->demux, front); + } + up(&dmxdev->mutex); + return 0; +} + +static int dvb_dvr_release(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + + if (down_interruptible (&dmxdev->mutex)) + return -ERESTARTSYS; + + if ((file->f_flags&O_ACCMODE)==O_WRONLY) { + dmxdev->demux->disconnect_frontend(dmxdev->demux); + dmxdev->demux->connect_frontend(dmxdev->demux, + dmxdev->dvr_orig_fe); + } + if ((file->f_flags&O_ACCMODE)==O_RDONLY) { + if (dmxdev->dvr_buffer.data) { + void *mem=dmxdev->dvr_buffer.data; + mb(); + spin_lock_irq(&dmxdev->lock); + dmxdev->dvr_buffer.data=0; + spin_unlock_irq(&dmxdev->lock); + vfree(mem); + } + } + up(&dmxdev->mutex); + return 0; +} + +static ssize_t +dvb_dvr_write(struct file *file, const char *buf, size_t count, loff_t *ppos) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + int ret; + + if (!dmxdev->demux->write) + return -EOPNOTSUPP; + if ((file->f_flags&O_ACCMODE)!=O_WRONLY) + return -EINVAL; + if (down_interruptible (&dmxdev->mutex)) + return -ERESTARTSYS; + ret=dmxdev->demux->write(dmxdev->demux, buf, count); + up(&dmxdev->mutex); + return ret; +} + +static ssize_t +dvb_dvr_read(struct file *file, char *buf, size_t count, loff_t *ppos) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + int ret; + + //down(&dmxdev->mutex); + ret= DmxDevBufferRead(&dmxdev->dvr_buffer, + file->f_flags&O_NONBLOCK, + buf, count, ppos); + //up(&dmxdev->mutex); + return ret; +} + +static inline void +DmxDevFilterStateSet(dmxdev_filter_t *dmxdevfilter, int state) +{ + spin_lock_irq(&dmxdevfilter->dev->lock); + dmxdevfilter->state=state; + spin_unlock_irq(&dmxdevfilter->dev->lock); +} + +static int +DmxDevSetBufferSize(dmxdev_filter_t *dmxdevfilter, unsigned long size) +{ + dmxdev_buffer_t *buf=&dmxdevfilter->buffer; + void *mem; + + if (buf->size==size) + return 0; + if (dmxdevfilter->state>=DMXDEV_STATE_GO) + return -EBUSY; + spin_lock_irq(&dmxdevfilter->dev->lock); + mem=buf->data; + buf->data=0; + buf->size=size; + buf->pwrite=buf->pread=0; + spin_unlock_irq(&dmxdevfilter->dev->lock); + if (mem) + vfree(mem); + + if (buf->size) { + mem=vmalloc(dmxdevfilter->buffer.size); + if (!mem) + return -ENOMEM; + spin_lock_irq(&dmxdevfilter->dev->lock); + buf->data=mem; + spin_unlock_irq(&dmxdevfilter->dev->lock); + } + return 0; +} + +static void +DmxDevFilterTimeout(unsigned long data) +{ + dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *)data; + + dmxdevfilter->buffer.error=-ETIMEDOUT; + spin_lock_irq(&dmxdevfilter->dev->lock); + dmxdevfilter->state=DMXDEV_STATE_TIMEDOUT; + spin_unlock_irq(&dmxdevfilter->dev->lock); + wake_up(&dmxdevfilter->buffer.queue); +} + +static void +DmxDevFilterTimer(dmxdev_filter_t *dmxdevfilter) +{ + struct dmx_sct_filter_params *para=&dmxdevfilter->params.sec; + + del_timer(&dmxdevfilter->timer); + if (para->timeout) { + dmxdevfilter->timer.function=DmxDevFilterTimeout; + dmxdevfilter->timer.data=(unsigned long) dmxdevfilter; + dmxdevfilter->timer.expires=jiffies+1+(HZ/2+HZ*para->timeout)/1000; + add_timer(&dmxdevfilter->timer); + } +} + +static int +DmxDevSectionCallback(u8 *buffer1, size_t buffer1_len, + u8 *buffer2, size_t buffer2_len, + dmx_section_filter_t *filter, + dmx_success_t success) +{ + dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *) filter->priv; + int ret; + + if (dmxdevfilter->buffer.error) { + wake_up(&dmxdevfilter->buffer.queue); + return 0; + } + spin_lock(&dmxdevfilter->dev->lock); + if (dmxdevfilter->state!=DMXDEV_STATE_GO) { + spin_unlock(&dmxdevfilter->dev->lock); + return 0; + } + del_timer(&dmxdevfilter->timer); + dprintk("dmxdev: section callback %02x %02x %02x %02x %02x %02x\n", + buffer1[0], buffer1[1], + buffer1[2], buffer1[3], + buffer1[4], buffer1[5]); + ret=DmxDevBufferWrite(&dmxdevfilter->buffer, buffer1, buffer1_len); + if (ret==buffer1_len) { + ret=DmxDevBufferWrite(&dmxdevfilter->buffer, buffer2, buffer2_len); + } + if (ret<0) { + dmxdevfilter->buffer.pwrite=dmxdevfilter->buffer.pread; + dmxdevfilter->buffer.error=-EOVERFLOW; + } + if (dmxdevfilter->params.sec.flags&DMX_ONESHOT) + dmxdevfilter->state=DMXDEV_STATE_DONE; + spin_unlock(&dmxdevfilter->dev->lock); + wake_up(&dmxdevfilter->buffer.queue); + return 0; +} + +static int +DmxDevTSCallback(u8 *buffer1, size_t buffer1_len, + u8 *buffer2, size_t buffer2_len, + dmx_ts_feed_t *feed, + dmx_success_t success) +{ + dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *) feed->priv; + dmxdev_buffer_t *buffer; + int ret; + + spin_lock(&dmxdevfilter->dev->lock); + if (dmxdevfilter->params.pes.output==DMX_OUT_DECODER) { + spin_unlock(&dmxdevfilter->dev->lock); + return 0; + } + + if (dmxdevfilter->params.pes.output==DMX_OUT_TAP) + buffer=&dmxdevfilter->buffer; + else + buffer=&dmxdevfilter->dev->dvr_buffer; + if (buffer->error) { + spin_unlock(&dmxdevfilter->dev->lock); + wake_up(&buffer->queue); + return 0; + } + ret=DmxDevBufferWrite(buffer, buffer1, buffer1_len); + if (ret==buffer1_len) + ret=DmxDevBufferWrite(buffer, buffer2, buffer2_len); + if (ret<0) { + buffer->pwrite=buffer->pread; + buffer->error=-EOVERFLOW; + } + spin_unlock(&dmxdevfilter->dev->lock); + wake_up(&buffer->queue); + return 0; +} + + +/* stop feed but only mark the specified filter as stopped (state set) */ + +static int +DmxDevFeedStop(dmxdev_filter_t *dmxdevfilter) +{ + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_SET); + + switch (dmxdevfilter->type) { + case DMXDEV_TYPE_SEC: + del_timer(&dmxdevfilter->timer); + dmxdevfilter->feed.sec->stop_filtering(dmxdevfilter->feed.sec); + break; + case DMXDEV_TYPE_PES: + dmxdevfilter->feed.ts->stop_filtering(dmxdevfilter->feed.ts); + break; + default: + return -EINVAL; + } + return 0; +} + + +/* start feed associated with the specified filter */ + +static int +DmxDevFeedStart(dmxdev_filter_t *dmxdevfilter) +{ + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_GO); + + switch (dmxdevfilter->type) { + case DMXDEV_TYPE_SEC: + dmxdevfilter->feed.sec->start_filtering(dmxdevfilter->feed.sec); + break; + case DMXDEV_TYPE_PES: + dmxdevfilter->feed.ts->start_filtering(dmxdevfilter->feed.ts); + break; + default: + return -EINVAL; + } + return 0; +} + + +/* restart section feed if it has filters left associated with it, + otherwise release the feed */ + +static int +DmxDevFeedRestart(dmxdev_filter_t *dmxdevfilter) +{ + int i; + dmxdev_t *dmxdev=dmxdevfilter->dev; + uint16_t pid=dmxdevfilter->params.sec.pid; + + for (i=0; ifilternum; i++) + if (dmxdev->filter[i].state>=DMXDEV_STATE_GO && + dmxdev->filter[i].type==DMXDEV_TYPE_SEC && + dmxdev->filter[i].pid==pid) { + DmxDevFeedStart(&dmxdev->filter[i]); + return 0; + } + + dmxdevfilter->dev->demux-> + release_section_feed(dmxdev->demux, + dmxdevfilter->feed.sec); + + return 0; +} + +static int +DmxDevFilterStop(dmxdev_filter_t *dmxdevfilter) +{ + if (dmxdevfilter->statetype) { + case DMXDEV_TYPE_SEC: + if (!dmxdevfilter->feed.sec) + break; + DmxDevFeedStop(dmxdevfilter); + if (dmxdevfilter->filter.sec) + dmxdevfilter->feed.sec-> + release_filter(dmxdevfilter->feed.sec, + dmxdevfilter->filter.sec); + DmxDevFeedRestart(dmxdevfilter); + dmxdevfilter->feed.sec=0; + break; + case DMXDEV_TYPE_PES: + if (!dmxdevfilter->feed.ts) + break; + DmxDevFeedStop(dmxdevfilter); + dmxdevfilter->dev->demux-> + release_ts_feed(dmxdevfilter->dev->demux, + dmxdevfilter->feed.ts); + dmxdevfilter->feed.ts=0; + break; + default: + if (dmxdevfilter->state==DMXDEV_STATE_ALLOCATED) + return 0; + return -EINVAL; + } + dmxdevfilter->buffer.pwrite=dmxdevfilter->buffer.pread=0; + return 0; +} + +static inline int +DmxDevFilterReset(dmxdev_filter_t *dmxdevfilter) +{ + if (dmxdevfilter->statetype=DMXDEV_TYPE_NONE; + dmxdevfilter->pid=0xffff; + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_ALLOCATED); + return 0; +} + +static int +DmxDevFilterStart(dmxdev_filter_t *dmxdevfilter) +{ + dmxdev_t *dmxdev=dmxdevfilter->dev; + void *mem; + int ret, i; + + if (dmxdevfilter->statestate>=DMXDEV_STATE_GO) + DmxDevFilterStop(dmxdevfilter); + + mem=dmxdevfilter->buffer.data; + if (!mem) { + mem=vmalloc(dmxdevfilter->buffer.size); + spin_lock_irq(&dmxdevfilter->dev->lock); + dmxdevfilter->buffer.data=mem; + spin_unlock_irq(&dmxdevfilter->dev->lock); + if (!dmxdevfilter->buffer.data) + return -ENOMEM; + } + + switch (dmxdevfilter->type) { + case DMXDEV_TYPE_SEC: + { + struct dmx_sct_filter_params *para=&dmxdevfilter->params.sec; + dmx_section_filter_t **secfilter=&dmxdevfilter->filter.sec; + dmx_section_feed_t **secfeed=&dmxdevfilter->feed.sec; + + *secfilter=0; + *secfeed=0; + + /* find active filter/feed with same PID */ + for (i=0; ifilternum; i++) + if (dmxdev->filter[i].state>=DMXDEV_STATE_GO && + dmxdev->filter[i].pid==para->pid) { + if (dmxdev->filter[i].type!=DMXDEV_TYPE_SEC) + return -EBUSY; + *secfeed=dmxdev->filter[i].feed.sec; + break; + } + + /* if no feed found, try to allocate new one */ + if (!*secfeed) { + ret=dmxdev->demux-> + allocate_section_feed(dmxdev->demux, + secfeed, + DmxDevSectionCallback); + if (ret<0) { + printk ("DVB (%s): could not alloc feed\n", + __FUNCTION__); + return ret; + } + + ret=(*secfeed)->set(*secfeed, para->pid, 32768, 0, + (para->flags & DMX_CHECK_CRC) ? 1 : 0); + + if (ret<0) { + printk ("DVB (%s): could not set feed\n", + __FUNCTION__); + DmxDevFeedRestart(dmxdevfilter); + return ret; + } + } + else + DmxDevFeedStop(dmxdevfilter); + + ret=(*secfeed)->allocate_filter(*secfeed, secfilter); + if (ret<0) { + DmxDevFeedRestart(dmxdevfilter); + dmxdevfilter->feed.sec-> + start_filtering(*secfeed); + dprintk ("could not get filter\n"); + return ret; + } + + (*secfilter)->priv=(void *) dmxdevfilter; + + memcpy(&((*secfilter)->filter_value[3]), + &(para->filter.filter[1]), DMX_FILTER_SIZE-1); + memcpy(&(*secfilter)->filter_mask[3], + ¶->filter.mask[1], DMX_FILTER_SIZE-1); + memcpy(&(*secfilter)->filter_mode[3], + ¶->filter.mode[1], DMX_FILTER_SIZE-1); + + (*secfilter)->filter_value[0]=para->filter.filter[0]; + (*secfilter)->filter_mask[0]=para->filter.mask[0]; + (*secfilter)->filter_mode[0]=para->filter.mode[0]; + (*secfilter)->filter_mask[1]=0; + (*secfilter)->filter_mask[2]=0; + + dmxdevfilter->todo=0; + dmxdevfilter->feed.sec-> + start_filtering(dmxdevfilter->feed.sec); + DmxDevFilterTimer(dmxdevfilter); + break; + } + + case DMXDEV_TYPE_PES: + { + struct timespec timeout = {0 }; + struct dmx_pes_filter_params *para=&dmxdevfilter->params.pes; + dmx_output_t otype; + int ret; + int ts_type; + dmx_ts_pes_t ts_pes; + dmx_ts_feed_t **tsfeed=&dmxdevfilter->feed.ts; + + dmxdevfilter->feed.ts=0; + otype=para->output; + + ts_pes=(dmx_ts_pes_t) para->pes_type; + + if (ts_pesdemux->allocate_ts_feed(dmxdev->demux, + tsfeed, + DmxDevTSCallback); + if (ret<0) + return ret; + + (*tsfeed)->priv=(void *) dmxdevfilter; + ret=(*tsfeed)->set(*tsfeed, para->pid, ts_type, ts_pes, 188, 32768, 0, timeout); + if (ret<0) { + dmxdev->demux-> + release_ts_feed(dmxdev->demux, *tsfeed); + return ret; + } + dmxdevfilter->feed.ts-> + start_filtering(dmxdevfilter->feed.ts); + break; + } + default: + return -EINVAL; + } + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_GO); + return 0; +} + +static int dvb_demux_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + int i; + dmxdev_filter_t *dmxdevfilter; + + if (!dmxdev->filter) + return -EINVAL; + if (down_interruptible(&dmxdev->mutex)) + return -ERESTARTSYS; + for (i=0; ifilternum; i++) + if (dmxdev->filter[i].state==DMXDEV_STATE_FREE) + break; + if (i==dmxdev->filternum) { + up(&dmxdev->mutex); + return -EMFILE; + } + dmxdevfilter=&dmxdev->filter[i]; + dmxdevfilter->dvbdev=dmxdev->dvbdev; + file->private_data=dmxdevfilter; + + DmxDevBufferInit(&dmxdevfilter->buffer); + dmxdevfilter->type=DMXDEV_TYPE_NONE; + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_ALLOCATED); + dmxdevfilter->feed.ts=0; + init_timer(&dmxdevfilter->timer); + + up(&dmxdev->mutex); + return 0; +} + +int +DmxDevFilterFree(dmxdev_t *dmxdev, dmxdev_filter_t *dmxdevfilter) +{ + if (down_interruptible(&dmxdev->mutex)) + return -ERESTARTSYS; + + DmxDevFilterStop(dmxdevfilter); + DmxDevFilterReset(dmxdevfilter); + + if (dmxdevfilter->buffer.data) { + void *mem=dmxdevfilter->buffer.data; + + spin_lock_irq(&dmxdev->lock); + dmxdevfilter->buffer.data=0; + spin_unlock_irq(&dmxdev->lock); + vfree(mem); + } + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_FREE); + wake_up(&dmxdevfilter->buffer.queue); + up(&dmxdev->mutex); + return 0; +} + +static inline void +invert_mode(dmx_filter_t *filter) +{ + int i; + + for (i=0; imode[i]^=0xff; +} + + +static int +DmxDevFilterSet(dmxdev_t *dmxdev, + dmxdev_filter_t *dmxdevfilter, + struct dmx_sct_filter_params *params) +{ + dprintk ("function : %s\n", __FUNCTION__); + + DmxDevFilterStop(dmxdevfilter); + + dmxdevfilter->type=DMXDEV_TYPE_SEC; + dmxdevfilter->pid=params->pid; + memcpy(&dmxdevfilter->params.sec, + params, sizeof(struct dmx_sct_filter_params)); + invert_mode(&dmxdevfilter->params.sec.filter); + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_SET); + + if (params->flags&DMX_IMMEDIATE_START) + return DmxDevFilterStart(dmxdevfilter); + + return 0; +} + +static int +DmxDevPesFilterSet(dmxdev_t *dmxdev, + dmxdev_filter_t *dmxdevfilter, + struct dmx_pes_filter_params *params) +{ + DmxDevFilterStop(dmxdevfilter); + + if (params->pes_type>DMX_PES_OTHER || params->pes_type<0) + return -EINVAL; + + dmxdevfilter->type=DMXDEV_TYPE_PES; + dmxdevfilter->pid=params->pid; + memcpy(&dmxdevfilter->params, params, sizeof(struct dmx_pes_filter_params)); + + DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_SET); + + if (params->flags&DMX_IMMEDIATE_START) + return DmxDevFilterStart(dmxdevfilter); + + return 0; +} + +static ssize_t +DmxDevReadSec(dmxdev_filter_t *dfil, struct file *file, + char *buf, size_t count, loff_t *ppos) +{ + int result, hcount; + int done=0; + + if (dfil->todo<=0) { + hcount=3+dfil->todo; + if (hcount>count) + hcount=count; + result=DmxDevBufferRead(&dfil->buffer, file->f_flags&O_NONBLOCK, + buf, hcount, ppos); + if (result<0) { + dfil->todo=0; + return result; + } + if (copy_from_user(dfil->secheader-dfil->todo, buf, result)) + return -EFAULT; + buf+=result; + done=result; + count-=result; + dfil->todo-=result; + if (dfil->todo>-3) + return done; + dfil->todo=((dfil->secheader[1]<<8)|dfil->secheader[2])&0xfff; + if (!count) + return done; + } + if (count>dfil->todo) + count=dfil->todo; + result=DmxDevBufferRead(&dfil->buffer, file->f_flags&O_NONBLOCK, + buf, count, ppos); + if (result<0) + return result; + dfil->todo-=result; + return (result+done); +} + + +ssize_t +dvb_demux_read(struct file *file, char *buf, size_t count, loff_t *ppos) +{ + dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(file); + //dmxdev_t *dmxdev=dmxdevfilter->dev; + int ret=0; + + // semaphore should not be necessary (I hope ...) + //down(&dmxdev->mutex); + if (dmxdevfilter->type==DMXDEV_TYPE_SEC) + ret=DmxDevReadSec(dmxdevfilter, file, buf, count, ppos); + else + ret=DmxDevBufferRead(&dmxdevfilter->buffer, + file->f_flags&O_NONBLOCK, + buf, count, ppos); + //up(&dmxdev->mutex); + return ret; +} + + +static int dvb_demux_do_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(file); + dmxdev_t *dmxdev=dmxdevfilter->dev; + unsigned long arg=(unsigned long) parg; + int ret=0; + + if (down_interruptible (&dmxdev->mutex)) + return -ERESTARTSYS; + + switch (cmd) { + case DMX_START: + if (dmxdevfilter->statedemux->get_pes_pids) { + ret=-EINVAL; + break; + } + dmxdev->demux->get_pes_pids(dmxdev->demux, (uint16_t *)parg); + break; + + default: + ret=-EINVAL; + } + up(&dmxdev->mutex); + return ret; +} + +static int dvb_demux_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + return generic_usercopy(inode, file, cmd, arg, dvb_demux_do_ioctl); +} + + +static unsigned int dvb_demux_poll(struct file *file, poll_table *wait) +{ + dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(file); + + if (!dmxdevfilter) + return -EINVAL; + + if (dmxdevfilter->state==DMXDEV_STATE_FREE) + return 0; + + if (dmxdevfilter->buffer.error) + return (POLLIN | POLLRDNORM | POLLPRI | POLLERR); + + if (dmxdevfilter->buffer.pread!=dmxdevfilter->buffer.pwrite) + return (POLLIN | POLLRDNORM | POLLPRI); + + if (dmxdevfilter->state!=DMXDEV_STATE_GO) + return 0; + + poll_wait(file, &dmxdevfilter->buffer.queue, wait); + + if (dmxdevfilter->state==DMXDEV_STATE_FREE) + return 0; + + if (dmxdevfilter->buffer.error) + return (POLLIN | POLLRDNORM | POLLPRI | POLLERR); + + if (dmxdevfilter->buffer.pread!=dmxdevfilter->buffer.pwrite) + return (POLLIN | POLLRDNORM | POLLPRI); + + return 0; +} + +static int dvb_demux_release(struct inode *inode, struct file *file) +{ + dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(file); + dmxdev_t *dmxdev=dmxdevfilter->dev; + + return DmxDevFilterFree(dmxdev, dmxdevfilter); +} + +static struct file_operations dvb_demux_fops = { + owner: THIS_MODULE, + read: dvb_demux_read, + write: 0, + ioctl: dvb_demux_ioctl, + open: dvb_demux_open, + release: dvb_demux_release, + poll: dvb_demux_poll, +}; + +static dvb_device_t dvbdev_demux = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_demux_fops +}; + +static int dvb_dvr_do_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + + int ret=0; + + if (down_interruptible (&dmxdev->mutex)) + return -ERESTARTSYS; + + switch (cmd) { + case DMX_SET_BUFFER_SIZE: + // FIXME: implement + ret=0; + break; + + default: + ret=-EINVAL; + } + up(&dmxdev->mutex); + return ret; +} + +static int dvb_dvr_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + return generic_usercopy(inode, file, cmd, arg, dvb_dvr_do_ioctl); +} + + +static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv; + + dprintk ("function : %s\n", __FUNCTION__); + + if ((file->f_flags&O_ACCMODE)==O_RDONLY) { + if (dmxdev->dvr_buffer.error) + return (POLLIN | POLLRDNORM | POLLPRI | POLLERR); + + if (dmxdev->dvr_buffer.pread!=dmxdev->dvr_buffer.pwrite) + return (POLLIN | POLLRDNORM | POLLPRI); + + poll_wait(file, &dmxdev->dvr_buffer.queue, wait); + + if (dmxdev->dvr_buffer.error) + return (POLLIN | POLLRDNORM | POLLPRI | POLLERR); + + if (dmxdev->dvr_buffer.pread!=dmxdev->dvr_buffer.pwrite) + return (POLLIN | POLLRDNORM | POLLPRI); + + return 0; + } else + return (POLLOUT | POLLWRNORM | POLLPRI); +} + +static struct file_operations dvb_dvr_fops = { + owner: THIS_MODULE, + read: dvb_dvr_read, + write: dvb_dvr_write, + ioctl: dvb_dvr_ioctl, + open: dvb_dvr_open, + release: dvb_dvr_release, + poll: dvb_dvr_poll, +}; + +static dvb_device_t dvbdev_dvr = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_dvr_fops +}; + +int +DmxDevInit(dmxdev_t *dmxdev, dvb_adapter_t *dvb_adapter) +{ + int i; + + if (dmxdev->demux->open(dmxdev->demux)<0) + return -EUSERS; + + dmxdev->filter=vmalloc(dmxdev->filternum*sizeof(dmxdev_filter_t)); + if (!dmxdev->filter) + return -ENOMEM; + + dmxdev->dvr=vmalloc(dmxdev->filternum*sizeof(dmxdev_dvr_t)); + if (!dmxdev->dvr) { + vfree(dmxdev->filter); + dmxdev->filter=0; + return -ENOMEM; + } + sema_init(&dmxdev->mutex, 1); + spin_lock_init(&dmxdev->lock); + for (i=0; ifilternum; i++) { + dmxdev->filter[i].dev=dmxdev; + dmxdev->filter[i].buffer.data=0; + DmxDevFilterStateSet(&dmxdev->filter[i], DMXDEV_STATE_FREE); + dmxdev->dvr[i].dev=dmxdev; + dmxdev->dvr[i].buffer.data=0; + DmxDevFilterStateSet(&dmxdev->filter[i], DMXDEV_STATE_FREE); + DmxDevDVRStateSet(&dmxdev->dvr[i], DMXDEV_STATE_FREE); + } + dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, DVB_DEVICE_DEMUX); + dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, dmxdev, DVB_DEVICE_DVR); + + DmxDevBufferInit(&dmxdev->dvr_buffer); + MOD_INC_USE_COUNT; + return 0; +} + +void +DmxDevRelease(dmxdev_t *dmxdev) +{ + dvb_unregister_device(dmxdev->dvbdev); + dvb_unregister_device(dmxdev->dvr_dvbdev); + if (dmxdev->filter) { + vfree(dmxdev->filter); + dmxdev->filter=0; + } + if (dmxdev->dvr) { + vfree(dmxdev->dvr); + dmxdev->dvr=0; + } + dmxdev->demux->close(dmxdev->demux); + MOD_DEC_USE_COUNT; +} + + diff -Nru a/drivers/media/dvb/dvb-core/dmxdev.h b/drivers/media/dvb/dvb-core/dmxdev.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dmxdev.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,128 @@ +/* + * dmxdev.h + * + * Copyright (C) 2000 Ralph Metzler + * & Marcus Metzler + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DMXDEV_H_ +#define _DMXDEV_H_ + +#ifndef __KERNEL__ +#define __KERNEL__ +#endif + +#include + +#include +#include +#include +#include + +#include "dvbdev.h" +#include "demux.h" + +typedef enum { + DMXDEV_TYPE_NONE, + DMXDEV_TYPE_SEC, + DMXDEV_TYPE_PES, +} dmxdev_type_t; + +typedef enum { + DMXDEV_STATE_FREE, + DMXDEV_STATE_ALLOCATED, + DMXDEV_STATE_SET, + DMXDEV_STATE_GO, + DMXDEV_STATE_DONE, + DMXDEV_STATE_TIMEDOUT +} dmxdev_state_t; + +typedef struct dmxdev_buffer_s { + uint8_t *data; + uint32_t size; + int32_t pread; + int32_t pwrite; + wait_queue_head_t queue; + int error; +} dmxdev_buffer_t; + + +typedef struct dmxdev_filter_s { + dvb_device_t *dvbdev; + + union { + dmx_section_filter_t *sec; + } filter; + + union { + dmx_ts_feed_t *ts; + dmx_section_feed_t *sec; + } feed; + + union { + struct dmx_sct_filter_params sec; + struct dmx_pes_filter_params pes; + } params; + + int type; + dmxdev_state_t state; + struct dmxdev_s *dev; + dmxdev_buffer_t buffer; + + // only for sections + struct timer_list timer; + int todo; + uint8_t secheader[3]; + + u16 pid; +} dmxdev_filter_t; + + +typedef struct dmxdev_dvr_s { + int state; + struct dmxdev_s *dev; + dmxdev_buffer_t buffer; +} dmxdev_dvr_t; + + +typedef struct dmxdev_s { + dvb_device_t *dvbdev; + dvb_device_t *dvr_dvbdev; + + dmxdev_filter_t *filter; + dmxdev_dvr_t *dvr; + dmx_demux_t *demux; + + int filternum; + int capabilities; +#define DMXDEV_CAP_DUPLEX 1 + dmx_frontend_t *dvr_orig_fe; + + dmxdev_buffer_t dvr_buffer; +#define DVR_BUFFER_SIZE (10*188*1024) + + struct semaphore mutex; + spinlock_t lock; +} dmxdev_t; + + +int DmxDevInit(dmxdev_t *dmxdev, dvb_adapter_t *); +void DmxDevRelease(dmxdev_t *dmxdev); + +#endif /* _DMXDEV_H_ */ diff -Nru a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dvb_demux.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,1179 @@ +/* + * dvb_demux.c - DVB kernel demux API + * + * Copyright (C) 2000-2001 Ralph Metzler + * & Marcus Metzler + * for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include +#include +#include +#include +#include + +#include "compat.h" +#include "dvb_demux.h" + +#define NOBUFS + +LIST_HEAD(dmx_muxs); + +int dmx_register_demux(dmx_demux_t *demux) +{ + struct list_head *pos, *head=&dmx_muxs; + + if (!(demux->id && demux->vendor && demux->model)) + return -EINVAL; + list_for_each(pos, head) + { + if (!strcmp(DMX_DIR_ENTRY(pos)->id, demux->id)) + return -EEXIST; + } + demux->users=0; + list_add(&(demux->reg_list), head); + MOD_INC_USE_COUNT; + return 0; +} + +int dmx_unregister_demux(dmx_demux_t* demux) +{ + struct list_head *pos, *n, *head=&dmx_muxs; + + list_for_each_safe (pos, n, head) + { + if (DMX_DIR_ENTRY(pos)==demux) + { + if (demux->users>0) + return -EINVAL; + list_del(pos); + MOD_DEC_USE_COUNT; + return 0; + } + } + return -ENODEV; +} + + +struct list_head *dmx_get_demuxes(void) +{ + if (list_empty(&dmx_muxs)) + return NULL; + + return &dmx_muxs; +} + +/****************************************************************************** + * static inlined helper functions + ******************************************************************************/ + +static inline u16 +section_length(const u8 *buf) +{ + return 3+((buf[1]&0x0f)<<8)+buf[2]; +} + +static inline u16 +ts_pid(const u8 *buf) +{ + return ((buf[1]&0x1f)<<8)+buf[2]; +} + +static inline int +payload(const u8 *tsp) +{ + if (!(tsp[3]&0x10)) // no payload? + return 0; + if (tsp[3]&0x20) { // adaptation field? + if (tsp[4]>183) // corrupted data? + return 0; + else + return 184-1-tsp[4]; + } + return 184; +} + + +static u32 +dvb_crc_table[256] = { + 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, + 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, + 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, + 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, + 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, + 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, + 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, + 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, + 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, + 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, + 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, + 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, + 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, + 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, + 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, + 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, + 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, + 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, + 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, + 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, + 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, + 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, + 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, + 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, + 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, + 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, + 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, + 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, + 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, + 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, + 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, + 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, + 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, + 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, + 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, + 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, + 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, + 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, + 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, + 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, + 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, + 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, + 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4}; + +u32 dvb_crc32(u8 *data, int len) +{ + int i; + u32 crc = 0xffffffff; + + for (i=0; i> 24) ^ *data++) & 0xff]; + return crc; +} + +void dvb_set_crc32(u8 *data, int length) +{ + u32 crc; + + crc=dvb_crc32(data,length); + data[length] = (crc>>24)&0xff; + data[length+1] = (crc>>16)&0xff; + data[length+2] = (crc>>8)&0xff; + data[length+3] = (crc)&0xff; +} + + +/****************************************************************************** + * Software filter functions + ******************************************************************************/ + +static inline int +DvbDmxSWFilterPayload(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) +{ + int p, count; + //int ccok; + //u8 cc; + + if (!(count=payload(buf))) + return -1; + p=188-count; + /* + cc=buf[3]&0x0f; + ccok=((dvbdmxfeed->cc+1)&0x0f)==cc ? 1 : 0; + dvbdmxfeed->cc=cc; + if (!ccok) + printk("missed packet!\n"); + */ + if (buf[1]&0x40) // PUSI ? + dvbdmxfeed->peslen=0xfffa; + dvbdmxfeed->peslen+=count; + + return dvbdmxfeed->cb.ts((u8 *)&buf[p], count, 0, 0, + &dvbdmxfeed->feed.ts, DMX_OK); +} + + +static int +DvbDmxSWFilterSectionFilter(dvb_demux_feed_t *dvbdmxfeed, + dvb_demux_filter_t *f) +{ + dmx_section_filter_t *filter=&f->filter; + int i; + u8 xor, neq=0; + + for (i=0; ifilter_value[i]^dvbdmxfeed->secbuf[i]; + if (f->maskandmode[i]&xor) + return 0; + neq|=f->maskandnotmode[i]&xor; + } + if (f->doneq & !neq) + return 0; + + return dvbdmxfeed->cb.sec(dvbdmxfeed->secbuf, dvbdmxfeed->seclen, + 0, 0, filter, DMX_OK); +} + +static inline int +DvbDmxSWFilterSectionFeed(dvb_demux_feed_t *dvbdmxfeed) +{ + u8 *buf=dvbdmxfeed->secbuf; + dvb_demux_filter_t *f; + + if (dvbdmxfeed->secbufp!=dvbdmxfeed->seclen) + return -1; + if (!dvbdmxfeed->feed.sec.is_filtering) + return 0; + if (!(f=dvbdmxfeed->filter)) + return 0; + do + if (DvbDmxSWFilterSectionFilter(dvbdmxfeed, f)<0) + return -1; + while ((f=f->next) && dvbdmxfeed->feed.sec.is_filtering); + + dvbdmxfeed->secbufp=dvbdmxfeed->seclen=0; + memset(buf, 0, DVB_DEMUX_MASK_MAX); + return 0; +} + +static inline int +DvbDmxSWFilterSectionPacket(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) +{ + int p, count; + int ccok, rest; + u8 cc; + + if (!(count=payload(buf))) + return -1; + p=188-count; + + cc=buf[3]&0x0f; + ccok=((dvbdmxfeed->cc+1)&0x0f)==cc ? 1 : 0; + dvbdmxfeed->cc=cc; + + if (buf[1]&0x40) { // PUSI set + // offset to start of first section is in buf[p] + if (p+buf[p]>187) // trash if it points beyond packet + return -1; + if (buf[p] && ccok) { // rest of previous section? + // did we have enough data in last packet to calc length? + int tmp=3-dvbdmxfeed->secbufp; + if (tmp>0 && tmp!=3) { + if (p+tmp>=187) + return -1; + memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, + buf+p+1, tmp); + dvbdmxfeed->seclen=section_length(dvbdmxfeed->secbuf); + if (dvbdmxfeed->seclen>4096) + return -1; + } + rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp; + if (rest==buf[p] && dvbdmxfeed->seclen) { + memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, + buf+p+1, buf[p]); + dvbdmxfeed->secbufp+=buf[p]; + DvbDmxSWFilterSectionFeed(dvbdmxfeed); + } + } + p+=buf[p]+1; // skip rest of last section + count=188-p; + while (count>0) { + if ((count>2) && // enough data to determine sec length? + ((dvbdmxfeed->seclen=section_length(buf+p))<=count)) { + if (dvbdmxfeed->seclen>4096) + return -1; + memcpy(dvbdmxfeed->secbuf, buf+p, + dvbdmxfeed->seclen); + dvbdmxfeed->secbufp=dvbdmxfeed->seclen; + p+=dvbdmxfeed->seclen; + count=188-p; + DvbDmxSWFilterSectionFeed(dvbdmxfeed); + + // filling bytes until packet end? + if (count && buf[p]==0xff) + count=0; + } else { // section continues to following TS packet + memcpy(dvbdmxfeed->secbuf, buf+p, count); + dvbdmxfeed->secbufp+=count; + count=0; + } + } + return 0; + } + + // section continued below + if (!ccok) + return -1; + if (!dvbdmxfeed->secbufp) // any data in last ts packet? + return -1; + // did we have enough data in last packet to calc section length? + if (dvbdmxfeed->secbufp<3) { + int tmp=3-dvbdmxfeed->secbufp; + + if (tmp>count) + return -1; + memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, tmp); + dvbdmxfeed->seclen=section_length(dvbdmxfeed->secbuf); + if (dvbdmxfeed->seclen>4096) + return -1; + } + rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp; + if (rest<0) + return -1; + if (rest<=count) { // section completed in this TS packet + memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, rest); + dvbdmxfeed->secbufp+=rest; + DvbDmxSWFilterSectionFeed(dvbdmxfeed); + } else { // section continues in following ts packet + memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, count); + dvbdmxfeed->secbufp+=count; + } + return 0; +} + +static inline void +DvbDmxSWFilterPacketType(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) +{ + switch(dvbdmxfeed->type) { + case DMX_TYPE_TS: + if (!dvbdmxfeed->feed.ts.is_filtering) + break; + if (dvbdmxfeed->ts_type & TS_PACKET) { + if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY) + DvbDmxSWFilterPayload(dvbdmxfeed, buf); + else + dvbdmxfeed->cb.ts((u8 *)buf, 188, 0, 0, + &dvbdmxfeed->feed.ts, DMX_OK); + } + if (dvbdmxfeed->ts_type & TS_DECODER) + if (dvbdmxfeed->demux->write_to_decoder) + dvbdmxfeed->demux-> + write_to_decoder(dvbdmxfeed, (u8 *)buf, 188); + break; + + case DMX_TYPE_SEC: + if (!dvbdmxfeed->feed.sec.is_filtering) + break; + if (DvbDmxSWFilterSectionPacket(dvbdmxfeed, buf)<0) + dvbdmxfeed->seclen=dvbdmxfeed->secbufp=0; + break; + + default: + break; + } +} + +void inline +DvbDmxSWFilterPacket(dvb_demux_t *dvbdmx, const u8 *buf) +{ + dvb_demux_feed_t *dvbdmxfeed; + + if (!(dvbdmxfeed=dvbdmx->pid2feed[ts_pid(buf)])) + return; + DvbDmxSWFilterPacketType(dvbdmxfeed, buf); +} + +void +DvbDmxSWFilterPackets(dvb_demux_t *dvbdmx, const u8 *buf, int count) +{ + dvb_demux_feed_t *dvbdmxfeed; + + spin_lock(&dvbdmx->lock); + if ((dvbdmxfeed=dvbdmx->pid2feed[0x2000])) + dvbdmxfeed->cb.ts((u8 *)buf, count*188, 0, 0, + &dvbdmxfeed->feed.ts, DMX_OK); + while (count) { + DvbDmxSWFilterPacket(dvbdmx, buf); + count--; + buf+=188; + } + spin_unlock(&dvbdmx->lock); +} + +static inline void +DvbDmxSWFilter(dvb_demux_t *dvbdmx, const u8 *buf, size_t count) +{ + int p=0,i, j; + + if ((i=dvbdmx->tsbufp)) { + if (count<(j=188-i)) { + memcpy(&dvbdmx->tsbuf[i], buf, count); + dvbdmx->tsbufp+=count; + return; + } + memcpy(&dvbdmx->tsbuf[i], buf, j); + DvbDmxSWFilterPacket(dvbdmx, dvbdmx->tsbuf); + dvbdmx->tsbufp=0; + p+=j; + } + + while (p=188) { + DvbDmxSWFilterPacket(dvbdmx, buf+p); + p+=188; + } else { + i=count-p; + memcpy(dvbdmx->tsbuf, buf+p, i); + dvbdmx->tsbufp=i; + return; + } + } else + p++; + } +} + + +/****************************************************************************** + ****************************************************************************** + * DVB DEMUX API LEVEL FUNCTIONS + ****************************************************************************** + ******************************************************************************/ + +static dvb_demux_filter_t * +DvbDmxFilterAlloc(dvb_demux_t *dvbdmx) +{ + int i; + + for (i=0; ifilternum; i++) + if (dvbdmx->filter[i].state==DMX_STATE_FREE) + break; + if (i==dvbdmx->filternum) + return 0; + dvbdmx->filter[i].state=DMX_STATE_ALLOCATED; + return &dvbdmx->filter[i]; +} + +static dvb_demux_feed_t * +DvbDmxFeedAlloc(dvb_demux_t *dvbdmx) +{ + int i; + + for (i=0; ifeednum; i++) + if (dvbdmx->feed[i].state==DMX_STATE_FREE) + break; + if (i==dvbdmx->feednum) + return 0; + dvbdmx->feed[i].state=DMX_STATE_ALLOCATED; + return &dvbdmx->feed[i]; +} + + +/****************************************************************************** + * dmx_ts_feed API calls + ******************************************************************************/ + +static int +dmx_pid_set(u16 pid, dvb_demux_feed_t *dvbdmxfeed) +{ + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + dvb_demux_feed_t **pid2feed=dvbdmx->pid2feed; + + if (pid>DMX_MAX_PID) + return -EINVAL; + if (dvbdmxfeed->pid!=0xffff) { + if (dvbdmxfeed->pid<=DMX_MAX_PID) + pid2feed[dvbdmxfeed->pid]=0; + dvbdmxfeed->pid=0xffff; + } + if (pid2feed[pid]) { + return -EBUSY; + } + pid2feed[pid]=dvbdmxfeed; + dvbdmxfeed->pid=pid; + return 0; +} + + +static int +dmx_ts_feed_set(struct dmx_ts_feed_s* feed, + u16 pid, + int ts_type, + dmx_ts_pes_t pes_type, + size_t callback_length, + size_t circular_buffer_size, + int descramble, + struct timespec timeout + ) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + int ret; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (ts_type & TS_DECODER) { + if (pes_type >= DMX_TS_PES_OTHER) { + up(&dvbdmx->mutex); + return -EINVAL; + } + if (dvbdmx->pesfilter[pes_type] && + (dvbdmx->pesfilter[pes_type]!=dvbdmxfeed)) { + up(&dvbdmx->mutex); + return -EINVAL; + } + if ((pes_type != DMX_TS_PES_PCR0) && + (pes_type != DMX_TS_PES_PCR1) && + (pes_type != DMX_TS_PES_PCR2) && + (pes_type != DMX_TS_PES_PCR3)) { + if ((ret=dmx_pid_set(pid, dvbdmxfeed))<0) { + up(&dvbdmx->mutex); + return ret; + } else + dvbdmxfeed->pid=pid; + } + dvbdmx->pesfilter[pes_type]=dvbdmxfeed; + dvbdmx->pids[pes_type]=dvbdmxfeed->pid; + } else + if ((ret=dmx_pid_set(pid, dvbdmxfeed))<0) { + up(&dvbdmx->mutex); + return ret; + } + + dvbdmxfeed->buffer_size=circular_buffer_size; + dvbdmxfeed->descramble=descramble; + dvbdmxfeed->timeout=timeout; + dvbdmxfeed->cb_length=callback_length; + dvbdmxfeed->ts_type=ts_type; + dvbdmxfeed->pes_type=pes_type; + + if (dvbdmxfeed->descramble) { + up(&dvbdmx->mutex); + return -ENOSYS; + } + + if (dvbdmxfeed->buffer_size) { +#ifdef NOBUFS + dvbdmxfeed->buffer=0; +#else + dvbdmxfeed->buffer=vmalloc(dvbdmxfeed->buffer_size); + if (!dvbdmxfeed->buffer) { + up(&dvbdmx->mutex); + return -ENOMEM; + } +#endif + } + dvbdmxfeed->state=DMX_STATE_READY; + up(&dvbdmx->mutex); + return 0; +} + +static int +dmx_ts_feed_start_filtering(struct dmx_ts_feed_s* feed) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + int ret; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (dvbdmxfeed->state!=DMX_STATE_READY || + dvbdmxfeed->type!=DMX_TYPE_TS) { + up(&dvbdmx->mutex); + return -EINVAL; + } + if (!dvbdmx->start_feed) { + up(&dvbdmx->mutex); + return -1; + } + ret=dvbdmx->start_feed(dvbdmxfeed); + if (ret<0) { + up(&dvbdmx->mutex); + return ret; + } + spin_lock_irq(&dvbdmx->lock); + feed->is_filtering=1; + dvbdmxfeed->state=DMX_STATE_GO; + spin_unlock_irq(&dvbdmx->lock); + up(&dvbdmx->mutex); + return 0; +} + +static int +dmx_ts_feed_stop_filtering(struct dmx_ts_feed_s* feed) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + int ret; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (dvbdmxfeed->statemutex); + return -EINVAL; + } + if (!dvbdmx->stop_feed) { + up(&dvbdmx->mutex); + return -1; + } + ret=dvbdmx->stop_feed(dvbdmxfeed); + spin_lock_irq(&dvbdmx->lock); + feed->is_filtering=0; + dvbdmxfeed->state=DMX_STATE_ALLOCATED; + + spin_unlock_irq(&dvbdmx->lock); + up(&dvbdmx->mutex); + return ret; +} + +static int dvbdmx_allocate_ts_feed(dmx_demux_t *demux, + dmx_ts_feed_t **feed, + dmx_ts_cb callback) +{ + dvb_demux_t *dvbdmx=(dvb_demux_t *) demux; + dvb_demux_feed_t *dvbdmxfeed; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (!(dvbdmxfeed=DvbDmxFeedAlloc(dvbdmx))) { + up(&dvbdmx->mutex); + return -EBUSY; + } + dvbdmxfeed->type=DMX_TYPE_TS; + dvbdmxfeed->cb.ts=callback; + dvbdmxfeed->demux=dvbdmx; + dvbdmxfeed->pid=0xffff; + dvbdmxfeed->peslen=0xfffa; + dvbdmxfeed->buffer=0; + + (*feed)=&dvbdmxfeed->feed.ts; + (*feed)->is_filtering=0; + (*feed)->parent=demux; + (*feed)->priv=0; + (*feed)->set=dmx_ts_feed_set; + (*feed)->start_filtering=dmx_ts_feed_start_filtering; + (*feed)->stop_filtering=dmx_ts_feed_stop_filtering; + + + if (!(dvbdmxfeed->filter=DvbDmxFilterAlloc(dvbdmx))) { + dvbdmxfeed->state=DMX_STATE_FREE; + up(&dvbdmx->mutex); + return -EBUSY; + } + + dvbdmxfeed->filter->type=DMX_TYPE_TS; + dvbdmxfeed->filter->feed=dvbdmxfeed; + dvbdmxfeed->filter->state=DMX_STATE_READY; + + up(&dvbdmx->mutex); + return 0; +} + +static int dvbdmx_release_ts_feed(dmx_demux_t *demux, dmx_ts_feed_t *feed) +{ + dvb_demux_t *dvbdmx=(dvb_demux_t *) demux; + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (dvbdmxfeed->state==DMX_STATE_FREE) { + up(&dvbdmx->mutex); + return -EINVAL; + } +#ifndef NOBUFS + if (dvbdmxfeed->buffer) { + vfree(dvbdmxfeed->buffer); + dvbdmxfeed->buffer=0; + } +#endif + dvbdmxfeed->state=DMX_STATE_FREE; + dvbdmxfeed->filter->state=DMX_STATE_FREE; + if (dvbdmxfeed->pid<=DMX_MAX_PID) { + dvbdmxfeed->demux->pid2feed[dvbdmxfeed->pid]=0; + dvbdmxfeed->pid=0xffff; + } + + up(&dvbdmx->mutex); + return 0; +} + + +/****************************************************************************** + * dmx_section_feed API calls + ******************************************************************************/ + +static int +dmx_section_feed_allocate_filter(struct dmx_section_feed_s* feed, + dmx_section_filter_t** filter) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdemux=dvbdmxfeed->demux; + dvb_demux_filter_t *dvbdmxfilter; + + if (down_interruptible (&dvbdemux->mutex)) + return -ERESTARTSYS; + + dvbdmxfilter=DvbDmxFilterAlloc(dvbdemux); + if (!dvbdmxfilter) { + up(&dvbdemux->mutex); + return -ENOSPC; + } + spin_lock_irq(&dvbdemux->lock); + *filter=&dvbdmxfilter->filter; + (*filter)->parent=feed; + (*filter)->priv=0; + dvbdmxfilter->feed=dvbdmxfeed; + dvbdmxfilter->type=DMX_TYPE_SEC; + dvbdmxfilter->state=DMX_STATE_READY; + + dvbdmxfilter->next=dvbdmxfeed->filter; + dvbdmxfeed->filter=dvbdmxfilter; + spin_unlock_irq(&dvbdemux->lock); + up(&dvbdemux->mutex); + return 0; +} + +static int +dmx_section_feed_set(struct dmx_section_feed_s* feed, + u16 pid, size_t circular_buffer_size, + int descramble, int check_crc) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + + if (pid>0x1fff) + return -EINVAL; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (dvbdmxfeed->pid!=0xffff) { + dvbdmx->pid2feed[dvbdmxfeed->pid]=0; + dvbdmxfeed->pid=0xffff; + } + if (dvbdmx->pid2feed[pid]) { + up(&dvbdmx->mutex); + return -EBUSY; + } + dvbdmx->pid2feed[pid]=dvbdmxfeed; + dvbdmxfeed->pid=pid; + + dvbdmxfeed->buffer_size=circular_buffer_size; + dvbdmxfeed->descramble=descramble; + if (dvbdmxfeed->descramble) { + up(&dvbdmx->mutex); + return -ENOSYS; + } + + dvbdmxfeed->check_crc=check_crc; +#ifdef NOBUFS + dvbdmxfeed->buffer=0; +#else + dvbdmxfeed->buffer=vmalloc(dvbdmxfeed->buffer_size); + if (!dvbdmxfeed->buffer) { + up(&dvbdmx->mutex); + return -ENOMEM; + } +#endif + dvbdmxfeed->state=DMX_STATE_READY; + up(&dvbdmx->mutex); + return 0; +} + +static void prepare_secfilters(dvb_demux_feed_t *dvbdmxfeed) +{ + int i; + dmx_section_filter_t *sf; + dvb_demux_filter_t *f; + u8 mask, mode, doneq; + + if (!(f=dvbdmxfeed->filter)) + return; + do { + sf=&f->filter; + doneq=0; + for (i=0; ifilter_mode[i]; + mask=sf->filter_mask[i]; + f->maskandmode[i]=mask&mode; + doneq|=f->maskandnotmode[i]=mask&~mode; + } + f->doneq=doneq ? 1 : 0; + } while ((f=f->next)); +} + + +static int +dmx_section_feed_start_filtering(dmx_section_feed_t *feed) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + int ret; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (feed->is_filtering) { + up(&dvbdmx->mutex); + return -EBUSY; + } + if (!dvbdmxfeed->filter) { + up(&dvbdmx->mutex); + return -EINVAL; + } + dvbdmxfeed->secbufp=0; + dvbdmxfeed->seclen=0; + + if (!dvbdmx->start_feed) { + up(&dvbdmx->mutex); + return -1; + } + prepare_secfilters(dvbdmxfeed); + ret=dvbdmx->start_feed(dvbdmxfeed); + if (ret<0) { + up(&dvbdmx->mutex); + return ret; + } + spin_lock_irq(&dvbdmx->lock); + feed->is_filtering=1; + dvbdmxfeed->state=DMX_STATE_GO; + spin_unlock_irq(&dvbdmx->lock); + up(&dvbdmx->mutex); + return 0; +} + +static int +dmx_section_feed_stop_filtering(struct dmx_section_feed_s* feed) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + int ret; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (!dvbdmx->stop_feed) { + up(&dvbdmx->mutex); + return -1; + } + ret=dvbdmx->stop_feed(dvbdmxfeed); + spin_lock_irq(&dvbdmx->lock); + dvbdmxfeed->state=DMX_STATE_READY; + feed->is_filtering=0; + spin_unlock_irq(&dvbdmx->lock); + up(&dvbdmx->mutex); + return ret; +} + +static int +dmx_section_feed_release_filter(dmx_section_feed_t *feed, + dmx_section_filter_t* filter) +{ + dvb_demux_filter_t *dvbdmxfilter=(dvb_demux_filter_t *) filter, *f; + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=dvbdmxfeed->demux; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (dvbdmxfilter->feed!=dvbdmxfeed) { + up(&dvbdmx->mutex); + return -EINVAL; + } + if (feed->is_filtering) + feed->stop_filtering(feed); + + spin_lock_irq(&dvbdmx->lock); + f=dvbdmxfeed->filter; + if (f==dvbdmxfilter) + dvbdmxfeed->filter=dvbdmxfilter->next; + else { + while(f->next!=dvbdmxfilter) + f=f->next; + f->next=f->next->next; + } + dvbdmxfilter->state=DMX_STATE_FREE; + spin_unlock_irq(&dvbdmx->lock); + up(&dvbdmx->mutex); + return 0; +} + +static int dvbdmx_allocate_section_feed(dmx_demux_t *demux, + dmx_section_feed_t **feed, + dmx_section_cb callback) +{ + dvb_demux_t *dvbdmx=(dvb_demux_t *) demux; + dvb_demux_feed_t *dvbdmxfeed; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (!(dvbdmxfeed=DvbDmxFeedAlloc(dvbdmx))) { + up(&dvbdmx->mutex); + return -EBUSY; + } + dvbdmxfeed->type=DMX_TYPE_SEC; + dvbdmxfeed->cb.sec=callback; + dvbdmxfeed->demux=dvbdmx; + dvbdmxfeed->pid=0xffff; + dvbdmxfeed->secbufp=0; + dvbdmxfeed->filter=0; + dvbdmxfeed->buffer=0; + + (*feed)=&dvbdmxfeed->feed.sec; + (*feed)->is_filtering=0; + (*feed)->parent=demux; + (*feed)->priv=0; + (*feed)->set=dmx_section_feed_set; + (*feed)->allocate_filter=dmx_section_feed_allocate_filter; + (*feed)->release_filter=dmx_section_feed_release_filter; + (*feed)->start_filtering=dmx_section_feed_start_filtering; + (*feed)->stop_filtering=dmx_section_feed_stop_filtering; + + up(&dvbdmx->mutex); + return 0; +} + +static int dvbdmx_release_section_feed(dmx_demux_t *demux, + dmx_section_feed_t *feed) +{ + dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; + dvb_demux_t *dvbdmx=(dvb_demux_t *) demux; + + if (down_interruptible (&dvbdmx->mutex)) + return -ERESTARTSYS; + + if (dvbdmxfeed->state==DMX_STATE_FREE) { + up(&dvbdmx->mutex); + return -EINVAL; + } +#ifndef NOBUFS + if (dvbdmxfeed->buffer) { + vfree(dvbdmxfeed->buffer); + dvbdmxfeed->buffer=0; + } +#endif + dvbdmxfeed->state=DMX_STATE_FREE; + dvbdmxfeed->demux->pid2feed[dvbdmxfeed->pid]=0; + if (dvbdmxfeed->pid!=0xffff) + dvbdmxfeed->demux->pid2feed[dvbdmxfeed->pid]=0; + up(&dvbdmx->mutex); + return 0; +} + + +/****************************************************************************** + * dvb_demux kernel data API calls + ******************************************************************************/ + +static int dvbdmx_open(dmx_demux_t *demux) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + if (dvbdemux->users>=MAX_DVB_DEMUX_USERS) + return -EUSERS; + dvbdemux->users++; + return 0; +} + +static int dvbdmx_close(struct dmx_demux_s *demux) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + if (dvbdemux->users==0) + return -ENODEV; + dvbdemux->users--; + //FIXME: release any unneeded resources if users==0 + return 0; +} + +static int dvbdmx_write(dmx_demux_t *demux, const char *buf, size_t count) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + if ((!demux->frontend) || + (demux->frontend->source!=DMX_MEMORY_FE)) + return -EINVAL; + + if (down_interruptible (&dvbdemux->mutex)) + return -ERESTARTSYS; + + DvbDmxSWFilter(dvbdemux, buf, count); + up(&dvbdemux->mutex); + return count; +} + + +static int dvbdmx_add_frontend(dmx_demux_t *demux, + dmx_frontend_t *frontend) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + struct list_head *pos, *head=&dvbdemux->frontend_list; + + if (!(frontend->id && frontend->vendor && frontend->model)) + return -EINVAL; + list_for_each(pos, head) + { + if (!strcmp(DMX_FE_ENTRY(pos)->id, frontend->id)) + return -EEXIST; + } + + list_add(&(frontend->connectivity_list), head); + return 0; +} + +static int +dvbdmx_remove_frontend(dmx_demux_t *demux, + dmx_frontend_t *frontend) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + struct list_head *pos, *n, *head=&dvbdemux->frontend_list; + + list_for_each_safe (pos, n, head) + { + if (DMX_FE_ENTRY(pos)==frontend) + { + list_del(pos); + return 0; + } + } + return -ENODEV; +} + +static struct list_head * +dvbdmx_get_frontends(dmx_demux_t *demux) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + if (list_empty(&dvbdemux->frontend_list)) + return NULL; + return &dvbdemux->frontend_list; +} + +static int dvbdmx_connect_frontend(dmx_demux_t *demux, + dmx_frontend_t *frontend) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + if (demux->frontend) + return -EINVAL; + + if (down_interruptible (&dvbdemux->mutex)) + return -ERESTARTSYS; + + demux->frontend=frontend; + up(&dvbdemux->mutex); + return 0; +} + +static int dvbdmx_disconnect_frontend(dmx_demux_t *demux) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + if (down_interruptible (&dvbdemux->mutex)) + return -ERESTARTSYS; + + demux->frontend=NULL; + up(&dvbdemux->mutex); + return 0; +} + +static int dvbdmx_get_pes_pids(dmx_demux_t *demux, u16 *pids) +{ + dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; + + memcpy(pids, dvbdemux->pids, 5*sizeof(u16)); + return 0; +} + +int +DvbDmxInit(dvb_demux_t *dvbdemux) +{ + int i; + dmx_demux_t *dmx=&dvbdemux->dmx; + + dvbdemux->users=0; + dvbdemux->filter=vmalloc(dvbdemux->filternum*sizeof(dvb_demux_filter_t)); + if (!dvbdemux->filter) + return -ENOMEM; + + dvbdemux->feed=vmalloc(dvbdemux->feednum*sizeof(dvb_demux_feed_t)); + if (!dvbdemux->feed) { + vfree(dvbdemux->filter); + return -ENOMEM; + } + for (i=0; ifilternum; i++) { + dvbdemux->filter[i].state=DMX_STATE_FREE; + dvbdemux->filter[i].index=i; + } + for (i=0; ifeednum; i++) + dvbdemux->feed[i].state=DMX_STATE_FREE; + dvbdemux->frontend_list.next= + dvbdemux->frontend_list.prev= + &dvbdemux->frontend_list; + for (i=0; ipesfilter[i]=NULL; + dvbdemux->pids[i]=0xffff; + } + dvbdemux->playing=dvbdemux->recording=0; + memset(dvbdemux->pid2feed, 0, (DMX_MAX_PID+1)*sizeof(dvb_demux_feed_t *)); + dvbdemux->tsbufp=0; + + dmx->frontend=0; + dmx->reg_list.next=dmx->reg_list.prev=&dmx->reg_list; + dmx->priv=(void *) dvbdemux; + //dmx->users=0; // reset in dmx_register_demux() + dmx->open=dvbdmx_open; + dmx->close=dvbdmx_close; + dmx->write=dvbdmx_write; + dmx->allocate_ts_feed=dvbdmx_allocate_ts_feed; + dmx->release_ts_feed=dvbdmx_release_ts_feed; + dmx->allocate_section_feed=dvbdmx_allocate_section_feed; + dmx->release_section_feed=dvbdmx_release_section_feed; + + dmx->descramble_mac_address=NULL; + dmx->descramble_section_payload=NULL; + + dmx->add_frontend=dvbdmx_add_frontend; + dmx->remove_frontend=dvbdmx_remove_frontend; + dmx->get_frontends=dvbdmx_get_frontends; + dmx->connect_frontend=dvbdmx_connect_frontend; + dmx->disconnect_frontend=dvbdmx_disconnect_frontend; + dmx->get_pes_pids=dvbdmx_get_pes_pids; + sema_init(&dvbdemux->mutex, 1); + spin_lock_init(&dvbdemux->lock); + + if (dmx_register_demux(dmx)<0) + return -1; + + return 0; +} + +int +DvbDmxRelease(dvb_demux_t *dvbdemux) +{ + dmx_demux_t *dmx=&dvbdemux->dmx; + + dmx_unregister_demux(dmx); + if (dvbdemux->filter) + vfree(dvbdemux->filter); + if (dvbdemux->feed) + vfree(dvbdemux->feed); + return 0; +} + +#if 0 +MODULE_DESCRIPTION("Software MPEG Demultiplexer"); +MODULE_AUTHOR("Ralph Metzler, Markus Metzler"); +MODULE_LICENSE("GPL"); +#endif + diff -Nru a/drivers/media/dvb/dvb-core/dvb_demux.h b/drivers/media/dvb/dvb-core/dvb_demux.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dvb_demux.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,134 @@ +/* + * dvb_demux.h - DVB kernel demux API + * + * Copyright (C) 2000-2001 Marcus Metzler + * & Ralph Metzler + * for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + + +#ifndef _DVB_DEMUX_H_ +#define _DVB_DEMUX_H_ + +#include "demux.h" + +#define DMX_TYPE_TS 0 +#define DMX_TYPE_SEC 1 +#define DMX_TYPE_PES 2 + +#define DMX_STATE_FREE 0 +#define DMX_STATE_ALLOCATED 1 +#define DMX_STATE_SET 2 +#define DMX_STATE_READY 3 +#define DMX_STATE_GO 4 + +#define DVB_DEMUX_MASK_MAX 18 + +typedef struct dvb_demux_filter_s { + dmx_section_filter_t filter; + u8 maskandmode [DMX_MAX_FILTER_SIZE]; + u8 maskandnotmode [DMX_MAX_FILTER_SIZE]; + int doneq; + + struct dvb_demux_filter_s *next; + struct dvb_demux_feed_s *feed; + int index; + int state; + int type; + int pesto; + + u16 handle; + u16 hw_handle; + struct timer_list timer; + int ts_state; + + //u16 pid; //to be removed +} dvb_demux_filter_t; + +typedef struct dvb_demux_feed_s { + union { + dmx_ts_feed_t ts; + dmx_section_feed_t sec; + } feed; + + union { + dmx_ts_cb ts; + dmx_section_cb sec; + } cb; + + struct dvb_demux_s *demux; + int type; + int state; + u16 pid; + u8 *buffer; + int buffer_size; + int descramble; + int check_crc; + + struct timespec timeout; + dvb_demux_filter_t *filter; + int cb_length; + + int ts_type; + dmx_ts_pes_t pes_type; + + u8 secbuf[4096]; + int secbufp; + int seclen; + int cc; + + u16 peslen; +} dvb_demux_feed_t; + +typedef struct dvb_demux_s { + dmx_demux_t dmx; + void *priv; + int filternum; + int feednum; + int (*start_feed)(dvb_demux_feed_t *); + int (*stop_feed)(dvb_demux_feed_t *); + int (*write_to_decoder)(dvb_demux_feed_t *, u8 *, size_t); + + + int users; +#define MAX_DVB_DEMUX_USERS 10 + dvb_demux_filter_t *filter; + dvb_demux_feed_t *feed; + + struct list_head frontend_list; + + dvb_demux_feed_t *pesfilter[DMX_TS_PES_OTHER]; + u16 pids[DMX_TS_PES_OTHER]; + int playing; + int recording; + +#define DMX_MAX_PID 0x2000 + dvb_demux_feed_t *pid2feed[DMX_MAX_PID+1]; + u8 tsbuf[188]; + int tsbufp; + + struct semaphore mutex; + spinlock_t lock; +} dvb_demux_t; + + +int DvbDmxInit(dvb_demux_t *dvbdemux); +int DvbDmxRelease(dvb_demux_t *dvbdemux); +void DvbDmxSWFilterPackets(dvb_demux_t *dvbdmx, const u8 *buf, int count); + +#endif /* _DVB_DEMUX_H_ */ diff -Nru a/drivers/media/dvb/dvb-core/dvb_filter.c b/drivers/media/dvb/dvb-core/dvb_filter.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dvb_filter.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,962 @@ +#include +#include +#include "dvb_filter.h" + +unsigned int bitrates[3][16] = +{{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0}, + {0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,0}, + {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}}; + +uint32_t freq[4] = {441, 480, 320, 0}; + +unsigned int ac3_bitrates[32] = + {32,40,48,56,64,80,96,112,128,160,192,224,256,320,384,448,512,576,640, + 0,0,0,0,0,0,0,0,0,0,0,0,0}; + +uint32_t ac3_freq[4] = {480, 441, 320, 0}; +uint32_t ac3_frames[3][32] = + {{64,80,96,112,128,160,192,224,256,320,384,448,512,640,768,896,1024, + 1152,1280,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {69,87,104,121,139,174,208,243,278,348,417,487,557,696,835,975,1114, + 1253,1393,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {96,120,144,168,192,240,288,336,384,480,576,672,768,960,1152,1344, + 1536,1728,1920,0,0,0,0,0,0,0,0,0,0,0,0,0}}; + + + +void pes2ts_init(pes2ts_t *p2ts, unsigned short pid, + pes2ts_cb_t *cb, void *priv) +{ + unsigned char *buf=p2ts->buf; + + buf[0]=0x47; + buf[1]=(pid>>8); + buf[2]=pid&0xff; + p2ts->cc=0; + p2ts->cb=cb; + p2ts->priv=priv; +} + +int pes2ts(pes2ts_t *p2ts, unsigned char *pes, int len) +{ + unsigned char *buf=p2ts->buf; + int ret=0, rest; + + //len=6+((pes[4]<<8)|pes[5]); + + buf[1]|=0x40; + while (len>=184) { + buf[3]=0x10|((p2ts->cc++)&0x0f); + memcpy(buf+4, pes, 184); + if ((ret=p2ts->cb(p2ts->priv, buf))) + return ret; + len-=184; pes+=184; + buf[1]&=~0x40; + } + if (!len) + return 0; + buf[3]=0x30|((p2ts->cc++)&0x0f); + rest=183-len; + if (rest) { + buf[5]=0x00; + if (rest-1) + memset(buf+6, 0xff, rest-1); + } + buf[4]=rest; + memcpy(buf+5+rest, pes, len); + return p2ts->cb(p2ts->priv, buf); +} + +void reset_ipack(ipack *p) +{ + p->found = 0; + p->cid = 0; + p->plength = 0; + p->flag1 = 0; + p->flag2 = 0; + p->hlength = 0; + p->mpeg = 0; + p->check = 0; + p->which = 0; + p->done = 0; + p->count = 0; +} + +void init_ipack(ipack *p, int size, + void (*func)(u8 *buf, int size, void *priv)) +{ + if ( !(p->buf = vmalloc(size*sizeof(u8))) ){ + printk ("Couldn't allocate memory for ipack\n"); + } + p->size = size; + p->func = func; + p->repack_subids = 0; + reset_ipack(p); +} + +void free_ipack(ipack * p) +{ + if (p->buf) vfree(p->buf); +} + +void send_ipack(ipack *p) +{ + int off; + AudioInfo ai; + int ac3_off = 0; + int streamid=0; + int nframes= 0; + int f=0; + + switch ( p->mpeg ){ + case 2: + if (p->count < 10) return; + p->buf[3] = p->cid; + + p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8); + p->buf[5] = (u8)((p->count-6) & 0x00FF); + if (p->repack_subids && p->cid == PRIVATE_STREAM1){ + + off = 9+p->buf[8]; + streamid = p->buf[off]; + if ((streamid & 0xF8) == 0x80){ + ai.off = 0; + ac3_off = ((p->buf[off+2] << 8)| + p->buf[off+3]); + if (ac3_off < p->count) + f=get_ac3info(p->buf+off+3+ac3_off, + p->count-ac3_off, &ai,0); + if ( !f ){ + nframes = (p->count-off-3-ac3_off)/ + ai.framesize + 1; + p->buf[off+2] = (ac3_off >> 8)& 0xFF; + p->buf[off+3] = (ac3_off)& 0xFF; + p->buf[off+1] = nframes; + + ac3_off += nframes * ai.framesize - + p->count; + } + } + } + p->func(p->buf, p->count, p->data); + + p->buf[6] = 0x80; + p->buf[7] = 0x00; + p->buf[8] = 0x00; + p->count = 9; + if (p->repack_subids && p->cid == PRIVATE_STREAM1 + && (streamid & 0xF8)==0x80 ){ + p->count += 4; + p->buf[9] = streamid; + p->buf[10] = (ac3_off >> 8)& 0xFF; + p->buf[11] = (ac3_off)& 0xFF; + p->buf[12] = 0; + } + + break; + case 1: + if (p->count < 8) return; + p->buf[3] = p->cid; + + p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8); + p->buf[5] = (u8)((p->count-6) & 0x00FF); + p->func(p->buf, p->count, p->data); + + p->buf[6] = 0x0F; + p->count = 7; + break; + } +} + +void send_ipack_rest(ipack *p) +{ + if (p->plength != MMAX_PLENGTH-6 || p->found<=6) + return; + p->plength = p->found-6; + p->found = 0; + send_ipack(p); + reset_ipack(p); +} + +static void write_ipack(ipack *p, u8 *data, int count) +{ + u8 headr[3] = { 0x00, 0x00, 0x01} ; + + if (p->count < 6){ + memcpy(p->buf, headr, 3); + p->count = 6; + } + + if (p->count + count < p->size){ + memcpy(p->buf+p->count, data, count); + p->count += count; + } else { + int rest = p->size - p->count; + memcpy(p->buf+p->count, data, rest); + p->count += rest; + send_ipack(p); + if (count - rest > 0) + write_ipack(p, data+rest, count-rest); + } +} + +int instant_repack(u8 *buf, int count, ipack *p) +{ + int l; + int c=0; + + while (c < count && (p->mpeg == 0 || + (p->mpeg == 1 && p->found < 7) || + (p->mpeg == 2 && p->found < 9)) + && (p->found < 5 || !p->done)){ + switch ( p->found ){ + case 0: + case 1: + if (buf[c] == 0x00) p->found++; + else p->found = 0; + c++; + break; + case 2: + if (buf[c] == 0x01) p->found++; + else if (buf[c] == 0) { + p->found = 2; + } else p->found = 0; + c++; + break; + case 3: + p->cid = 0; + switch (buf[c]){ + case PROG_STREAM_MAP: + case PRIVATE_STREAM2: + case PROG_STREAM_DIR: + case ECM_STREAM : + case EMM_STREAM : + case PADDING_STREAM : + case DSM_CC_STREAM : + case ISO13522_STREAM: + p->done = 1; + case PRIVATE_STREAM1: + case VIDEO_STREAM_S ... VIDEO_STREAM_E: + case AUDIO_STREAM_S ... AUDIO_STREAM_E: + p->found++; + p->cid = buf[c]; + c++; + break; + default: + p->found = 0; + break; + } + break; + + case 4: + if (count-c > 1){ + p->plen[0] = buf[c]; + c++; + p->plen[1] = buf[c]; + c++; + p->found+=2; + p->plength=(p->plen[0]<<8)|p->plen[1]; + } else { + p->plen[0] = buf[c]; + p->found++; + return count; + } + break; + case 5: + p->plen[1] = buf[c]; + c++; + p->found++; + p->plength=(p->plen[0]<<8)|p->plen[1]; + break; + case 6: + if (!p->done){ + p->flag1 = buf[c]; + c++; + p->found++; + if ( (p->flag1 & 0xC0) == 0x80 ) p->mpeg = 2; + else { + p->hlength = 0; + p->which = 0; + p->mpeg = 1; + p->flag2 = 0; + } + } + break; + + case 7: + if ( !p->done && p->mpeg == 2) { + p->flag2 = buf[c]; + c++; + p->found++; + } + break; + + case 8: + if ( !p->done && p->mpeg == 2) { + p->hlength = buf[c]; + c++; + p->found++; + } + break; + + default: + + break; + } + } + + if (c == count) return count; + + if (!p->plength) p->plength = MMAX_PLENGTH-6; + + if ( p->done || ((p->mpeg == 2 && p->found >= 9) || + (p->mpeg == 1 && p->found >= 7)) ){ + switch (p->cid){ + + case AUDIO_STREAM_S ... AUDIO_STREAM_E: + case VIDEO_STREAM_S ... VIDEO_STREAM_E: + case PRIVATE_STREAM1: + + if (p->mpeg == 2 && p->found == 9) { + write_ipack(p, &p->flag1, 1); + write_ipack(p, &p->flag2, 1); + write_ipack(p, &p->hlength, 1); + } + + if (p->mpeg == 1 && p->found == 7) + write_ipack(p, &p->flag1, 1); + + if (p->mpeg == 2 && (p->flag2 & PTS_ONLY) && + p->found < 14) { + while (c < count && p->found < 14) { + p->pts[p->found-9] = buf[c]; + write_ipack(p, buf+c, 1); + c++; + p->found++; + } + if (c == count) return count; + } + + if (p->mpeg == 1 && p->which < 2000) { + + if (p->found == 7) { + p->check = p->flag1; + p->hlength = 1; + } + + while (!p->which && c < count && + p->check == 0xFF){ + p->check = buf[c]; + write_ipack(p, buf+c, 1); + c++; + p->found++; + p->hlength++; + } + + if ( c == count) return count; + + if ( (p->check & 0xC0) == 0x40 && !p->which){ + p->check = buf[c]; + write_ipack(p, buf+c, 1); + c++; + p->found++; + p->hlength++; + + p->which = 1; + if ( c == count) return count; + p->check = buf[c]; + write_ipack(p, buf+c, 1); + c++; + p->found++; + p->hlength++; + p->which = 2; + if ( c == count) return count; + } + + if (p->which == 1){ + p->check = buf[c]; + write_ipack(p, buf+c, 1); + c++; + p->found++; + p->hlength++; + p->which = 2; + if ( c == count) return count; + } + + if ( (p->check & 0x30) && p->check != 0xFF){ + p->flag2 = (p->check & 0xF0) << 2; + p->pts[0] = p->check; + p->which = 3; + } + + if ( c == count) return count; + if (p->which > 2){ + if ((p->flag2 & PTS_DTS_FLAGS) + == PTS_ONLY){ + while (c < count && + p->which < 7){ + p->pts[p->which-2] = + buf[c]; + write_ipack(p,buf+c,1); + c++; + p->found++; + p->which++; + p->hlength++; + } + if ( c == count) return count; + } else if ((p->flag2 & PTS_DTS_FLAGS) + == PTS_DTS){ + while (c < count && + p->which< 12){ + if (p->which< 7) + p->pts[p->which + -2] = + buf[c]; + write_ipack(p,buf+c,1); + c++; + p->found++; + p->which++; + p->hlength++; + } + if ( c == count) return count; + } + p->which = 2000; + } + + } + + while (c < count && p->found < p->plength+6){ + l = count -c; + if (l+p->found > p->plength+6) + l = p->plength+6-p->found; + write_ipack(p, buf+c, l); + p->found += l; + c += l; + } + + break; + } + + + if ( p->done ){ + if( p->found + count - c < p->plength+6){ + p->found += count-c; + c = count; + } else { + c += p->plength+6 - p->found; + p->found = p->plength+6; + } + } + + if (p->plength && p->found == p->plength+6) { + send_ipack(p); + reset_ipack(p); + if (c < count) + instant_repack(buf+c, count-c, p); + } + } + return count; +} + + + +void setup_ts2pes(ipack *pa, ipack *pv, u16 *pida, u16 *pidv, + void (*pes_write)(u8 *buf, int count, void *data), + void *priv) +{ + init_ipack(pa, IPACKS, pes_write); + init_ipack(pv, IPACKS, pes_write); + pa->pid = pida; + pv->pid = pidv; + pa->data = priv; + pv->data = priv; +} + +void ts_to_pes(ipack *p, u8 *buf) // don't need count (=188) +{ + u8 off = 0; + + if (!buf || !p ){ + printk("NULL POINTER IDIOT\n"); + return; + } + if (buf[1]&PAY_START) { + if (p->plength == MMAX_PLENGTH-6 && p->found>6){ + p->plength = p->found-6; + p->found = 0; + send_ipack(p); + reset_ipack(p); + } + } + if (buf[3] & ADAPT_FIELD) { // adaptation field? + off = buf[4] + 1; + if (off+4 > 187) return; + } + instant_repack(buf+4+off, TS_SIZE-4-off, p); +} + +/* needs 5 byte input, returns picture coding type*/ +int read_picture_header(uint8_t *headr, mpg_picture *pic, int field, int pr) +{ + uint8_t pct; + + if (pr) printk( "Pic header: "); + pic->temporal_reference[field] = (( headr[0] << 2 ) | + (headr[1] & 0x03) )& 0x03ff; + if (pr) printk( " temp ref: 0x%04x", pic->temporal_reference[field]); + + pct = ( headr[1] >> 2 ) & 0x07; + pic->picture_coding_type[field] = pct; + if (pr) { + switch(pct){ + case I_FRAME: + printk( " I-FRAME"); + break; + case B_FRAME: + printk( " B-FRAME"); + break; + case P_FRAME: + printk( " P-FRAME"); + break; + } + } + + + pic->vinfo.vbv_delay = (( headr[1] >> 5 ) | ( headr[2] << 3) | + ( (headr[3] & 0x1F) << 11) ) & 0xffff; + + if (pr) printk( " vbv delay: 0x%04x", pic->vinfo.vbv_delay); + + pic->picture_header_parameter = ( headr[3] & 0xe0 ) | + ((headr[4] & 0x80) >> 3); + + if ( pct == B_FRAME ){ + pic->picture_header_parameter |= ( headr[4] >> 3 ) & 0x0f; + } + if (pr) printk( " pic head param: 0x%x", + pic->picture_header_parameter); + + return pct; +} + + +/* needs 4 byte input */ +int read_gop_header(uint8_t *headr, mpg_picture *pic, int pr) +{ + if (pr) printk("GOP header: "); + + pic->time_code = (( headr[0] << 17 ) | ( headr[1] << 9) | + ( headr[2] << 1 ) | (headr[3] &0x01)) & 0x1ffffff; + + if (pr) printk(" time: %d:%d.%d ", (headr[0]>>2)& 0x1F, + ((headr[0]<<4)& 0x30)| ((headr[1]>>4)& 0x0F), + ((headr[1]<<3)& 0x38)| ((headr[2]>>5)& 0x0F)); + + if ( ( headr[3] & 0x40 ) != 0 ){ + pic->closed_gop = 1; + } else { + pic->closed_gop = 0; + } + if (pr) printk("closed: %d", pic->closed_gop); + + if ( ( headr[3] & 0x20 ) != 0 ){ + pic->broken_link = 1; + } else { + pic->broken_link = 0; + } + if (pr) printk(" broken: %d\n", pic->broken_link); + + return 0; +} + +/* needs 8 byte input */ +int read_sequence_header(uint8_t *headr, VideoInfo *vi, int pr) +{ + int sw; + int form = -1; + + if (pr) printk("Reading sequence header\n"); + + vi->horizontal_size = ((headr[1] &0xF0) >> 4) | (headr[0] << 4); + vi->vertical_size = ((headr[1] &0x0F) << 8) | (headr[2]); + + sw = (int)((headr[3]&0xF0) >> 4) ; + + switch( sw ){ + case 1: + if (pr) + printk("Videostream: ASPECT: 1:1"); + vi->aspect_ratio = 100; + break; + case 2: + if (pr) + printk("Videostream: ASPECT: 4:3"); + vi->aspect_ratio = 133; + break; + case 3: + if (pr) + printk("Videostream: ASPECT: 16:9"); + vi->aspect_ratio = 177; + break; + case 4: + if (pr) + printk("Videostream: ASPECT: 2.21:1"); + vi->aspect_ratio = 221; + break; + + case 5 ... 15: + if (pr) + printk("Videostream: ASPECT: reserved"); + vi->aspect_ratio = 0; + break; + + default: + vi->aspect_ratio = 0; + return -1; + } + + if (pr) + printk(" Size = %dx%d",vi->horizontal_size,vi->vertical_size); + + sw = (int)(headr[3]&0x0F); + + switch ( sw ) { + case 1: + if (pr) + printk(" FRate: 23.976 fps"); + vi->framerate = 23976; + form = -1; + break; + case 2: + if (pr) + printk(" FRate: 24 fps"); + vi->framerate = 24000; + form = -1; + break; + case 3: + if (pr) + printk(" FRate: 25 fps"); + vi->framerate = 25000; + form = VIDEO_MODE_PAL; + break; + case 4: + if (pr) + printk(" FRate: 29.97 fps"); + vi->framerate = 29970; + form = VIDEO_MODE_NTSC; + break; + case 5: + if (pr) + printk(" FRate: 30 fps"); + vi->framerate = 30000; + form = VIDEO_MODE_NTSC; + break; + case 6: + if (pr) + printk(" FRate: 50 fps"); + vi->framerate = 50000; + form = VIDEO_MODE_PAL; + break; + case 7: + if (pr) + printk(" FRate: 60 fps"); + vi->framerate = 60000; + form = VIDEO_MODE_NTSC; + break; + } + + vi->bit_rate = (headr[4] << 10) | (headr[5] << 2) | (headr[6] & 0x03); + + vi->vbv_buffer_size + = (( headr[6] & 0xF8) >> 3 ) | (( headr[7] & 0x1F )<< 5); + + if (pr){ + printk(" BRate: %d Mbit/s",4*(vi->bit_rate)/10000); + printk(" vbvbuffer %d",16*1024*(vi->vbv_buffer_size)); + printk("\n"); + } + + vi->video_format = form; + + return 0; +} + +int get_vinfo(uint8_t *mbuf, int count, VideoInfo *vi, int pr) +{ + uint8_t *headr; + int found = 0; + int c = 0; + + while (found < 4 && c+4 < count){ + uint8_t *b; + + b = mbuf+c; + if ( b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01 + && b[3] == 0xb3) found = 4; + else { + c++; + } + } + + if (! found) return -1; + c += 4; + if (c+12 >= count) return -1; + headr = mbuf+c; + if (read_sequence_header(headr, vi, pr) < 0) return -1; + vi->off = c-4; + return 0; +} + +int get_ainfo(uint8_t *mbuf, int count, AudioInfo *ai, int pr) +{ + uint8_t *headr; + int found = 0; + int c = 0; + int fr = 0; + + while (found < 2 && c < count){ + uint8_t b[2]; + memcpy( b, mbuf+c, 2); + + if ( b[0] == 0xff && (b[1] & 0xf8) == 0xf8) + found = 2; + else { + c++; + } + } + + if (!found) return -1; + + if (c+3 >= count) return -1; + headr = mbuf+c; + + ai->layer = (headr[1] & 0x06) >> 1; + + if (pr) + printk("Audiostream: Layer: %d", 4-ai->layer); + + + ai->bit_rate = bitrates[(3-ai->layer)][(headr[2] >> 4 )]*1000; + + if (pr){ + if (ai->bit_rate == 0) + printk(" Bit rate: free"); + else if (ai->bit_rate == 0xf) + printk(" BRate: reserved"); + else + printk(" BRate: %d kb/s", ai->bit_rate/1000); + } + + fr = (headr[2] & 0x0c ) >> 2; + ai->frequency = freq[fr]*100; + if (pr){ + if (ai->frequency == 3) + printk(" Freq: reserved\n"); + else + printk(" Freq: %d kHz\n",ai->frequency); + + } + ai->off = c; + return 0; +} + +int get_ac3info(uint8_t *mbuf, int count, AudioInfo *ai, int pr) +{ + uint8_t *headr; + int found = 0; + int c = 0; + uint8_t frame = 0; + int fr = 0; + + while ( !found && c < count){ + uint8_t *b = mbuf+c; + + if ( b[0] == 0x0b && b[1] == 0x77 ) + found = 1; + else { + c++; + } + } + + if (!found) return -1; + if (pr) + printk("Audiostream: AC3"); + + ai->off = c; + if (c+5 >= count) return -1; + + ai->layer = 0; // 0 for AC3 + headr = mbuf+c+2; + + frame = (headr[2]&0x3f); + ai->bit_rate = ac3_bitrates[frame >> 1]*1000; + + if (pr) + printk(" BRate: %d kb/s", ai->bit_rate/1000); + + ai->frequency = (headr[2] & 0xc0 ) >> 6; + fr = (headr[2] & 0xc0 ) >> 6; + ai->frequency = freq[fr]*100; + if (pr) printk (" Freq: %d Hz\n", ai->frequency); + + + ai->framesize = ac3_frames[fr][frame >> 1]; + if ((frame & 1) && (fr == 1)) ai->framesize++; + ai->framesize = ai->framesize << 1; + if (pr) printk (" Framesize %d\n", ai->framesize); + + + return 0; +} + +uint8_t *skip_pes_header(uint8_t **bufp) +{ + uint8_t *inbuf = *bufp; + uint8_t *buf = inbuf; + uint8_t *pts = NULL; + int skip = 0; + +int mpeg1_skip_table[16] = { + 1, 0xffff, 5, 10, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff +}; + + + if ((inbuf[6] & 0xc0) == 0x80){ /* mpeg2 */ + if (buf[7] & PTS_ONLY) + pts = buf+9; + else pts = NULL; + buf = inbuf + 9 + inbuf[8]; + } else { /* mpeg1 */ + for (buf = inbuf + 6; *buf == 0xff; buf++) + if (buf == inbuf + 6 + 16) { + break; + } + if ((*buf & 0xc0) == 0x40) + buf += 2; + skip = mpeg1_skip_table [*buf >> 4]; + if (skip == 5 || skip == 10) pts = buf; + else pts = NULL; + + buf += mpeg1_skip_table [*buf >> 4]; + } + + *bufp = buf; + return pts; +} + + +void initialize_quant_matrix( uint32_t *matrix ) +{ + int i; + + matrix[0] = 0x08101013; + matrix[1] = 0x10131616; + matrix[2] = 0x16161616; + matrix[3] = 0x1a181a1b; + matrix[4] = 0x1b1b1a1a; + matrix[5] = 0x1a1a1b1b; + matrix[6] = 0x1b1d1d1d; + matrix[7] = 0x2222221d; + matrix[8] = 0x1d1d1b1b; + matrix[9] = 0x1d1d2020; + matrix[10] = 0x22222526; + matrix[11] = 0x25232322; + matrix[12] = 0x23262628; + matrix[13] = 0x28283030; + matrix[14] = 0x2e2e3838; + matrix[15] = 0x3a454553; + + for ( i = 16 ; i < 32 ; i++ ) + matrix[i] = 0x10101010; +} + +void initialize_mpg_picture(mpg_picture *pic) +{ + int i; + + /* set MPEG1 */ + pic->mpeg1_flag = 1; + pic->profile_and_level = 0x4A ; /* MP@LL */ + pic->progressive_sequence = 1; + pic->low_delay = 0; + + pic->sequence_display_extension_flag = 0; + for ( i = 0 ; i < 4 ; i++ ){ + pic->frame_centre_horizontal_offset[i] = 0; + pic->frame_centre_vertical_offset[i] = 0; + } + pic->last_frame_centre_horizontal_offset = 0; + pic->last_frame_centre_vertical_offset = 0; + + pic->picture_display_extension_flag[0] = 0; + pic->picture_display_extension_flag[1] = 0; + pic->sequence_header_flag = 0; + pic->gop_flag = 0; + pic->sequence_end_flag = 0; +} + + +void mpg_set_picture_parameter( int32_t field_type, mpg_picture *pic ) +{ + int16_t last_h_offset; + int16_t last_v_offset; + + int16_t *p_h_offset; + int16_t *p_v_offset; + + if ( pic->mpeg1_flag ){ + pic->picture_structure[field_type] = VIDEO_FRAME_PICTURE; + pic->top_field_first = 0; + pic->repeat_first_field = 0; + pic->progressive_frame = 1; + pic->picture_coding_parameter = 0x000010; + } + + /* Reset flag */ + pic->picture_display_extension_flag[field_type] = 0; + + last_h_offset = pic->last_frame_centre_horizontal_offset; + last_v_offset = pic->last_frame_centre_vertical_offset; + if ( field_type == FIRST_FIELD ){ + p_h_offset = pic->frame_centre_horizontal_offset; + p_v_offset = pic->frame_centre_vertical_offset; + *p_h_offset = last_h_offset; + *(p_h_offset + 1) = last_h_offset; + *(p_h_offset + 2) = last_h_offset; + *p_v_offset = last_v_offset; + *(p_v_offset + 1) = last_v_offset; + *(p_v_offset + 2) = last_v_offset; + } else { + pic->frame_centre_horizontal_offset[3] = last_h_offset; + pic->frame_centre_vertical_offset[3] = last_v_offset; + } +} + +void init_mpg_picture( mpg_picture *pic, int chan, int32_t field_type) +{ + pic->picture_header = 0; + pic->sequence_header_data + = ( INIT_HORIZONTAL_SIZE << 20 ) + | ( INIT_VERTICAL_SIZE << 8 ) + | ( INIT_ASPECT_RATIO << 4 ) + | ( INIT_FRAME_RATE ); + pic->mpeg1_flag = 0; + pic->vinfo.horizontal_size + = INIT_DISP_HORIZONTAL_SIZE; + pic->vinfo.vertical_size + = INIT_DISP_VERTICAL_SIZE; + pic->picture_display_extension_flag[field_type] + = 0; + pic->pts_flag[field_type] = 0; + + pic->sequence_gop_header = 0; + pic->picture_header = 0; + pic->sequence_header_flag = 0; + pic->gop_flag = 0; + pic->sequence_end_flag = 0; + pic->sequence_display_extension_flag = 0; + pic->last_frame_centre_horizontal_offset = 0; + pic->last_frame_centre_vertical_offset = 0; + pic->channel = chan; +} diff -Nru a/drivers/media/dvb/dvb-core/dvb_filter.h b/drivers/media/dvb/dvb-core/dvb_filter.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dvb_filter.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,249 @@ +#ifndef _DVB_FILTER_H_ +#define _DVB_FILTER_H_ + +#include +#include + +#include "demux.h" + +typedef int (pes2ts_cb_t) (void *, unsigned char *); + +typedef struct pes2ts_s { + unsigned char buf[188]; + unsigned char cc; + pes2ts_cb_t *cb; + void *priv; +} pes2ts_t; + +void pes2ts_init(pes2ts_t *p2ts, unsigned short pid, + pes2ts_cb_t *cb, void *priv); +int pes2ts(pes2ts_t *p2ts, unsigned char *pes, int len); + + +#define PROG_STREAM_MAP 0xBC +#define PRIVATE_STREAM1 0xBD +#define PADDING_STREAM 0xBE +#define PRIVATE_STREAM2 0xBF +#define AUDIO_STREAM_S 0xC0 +#define AUDIO_STREAM_E 0xDF +#define VIDEO_STREAM_S 0xE0 +#define VIDEO_STREAM_E 0xEF +#define ECM_STREAM 0xF0 +#define EMM_STREAM 0xF1 +#define DSM_CC_STREAM 0xF2 +#define ISO13522_STREAM 0xF3 +#define PROG_STREAM_DIR 0xFF + +#define PICTURE_START 0x00 +#define USER_START 0xb2 +#define SEQUENCE_HEADER 0xb3 +#define SEQUENCE_ERROR 0xb4 +#define EXTENSION_START 0xb5 +#define SEQUENCE_END 0xb7 +#define GOP_START 0xb8 +#define EXCEPT_SLICE 0xb0 + +#define SEQUENCE_EXTENSION 0x01 +#define SEQUENCE_DISPLAY_EXTENSION 0x02 +#define PICTURE_CODING_EXTENSION 0x08 +#define QUANT_MATRIX_EXTENSION 0x03 +#define PICTURE_DISPLAY_EXTENSION 0x07 + +#define I_FRAME 0x01 +#define B_FRAME 0x02 +#define P_FRAME 0x03 + +/* Initialize sequence_data */ +#define INIT_HORIZONTAL_SIZE 720 +#define INIT_VERTICAL_SIZE 576 +#define INIT_ASPECT_RATIO 0x02 +#define INIT_FRAME_RATE 0x03 +#define INIT_DISP_HORIZONTAL_SIZE 540 +#define INIT_DISP_VERTICAL_SIZE 576 + + +//flags2 +#define PTS_DTS_FLAGS 0xC0 +#define ESCR_FLAG 0x20 +#define ES_RATE_FLAG 0x10 +#define DSM_TRICK_FLAG 0x08 +#define ADD_CPY_FLAG 0x04 +#define PES_CRC_FLAG 0x02 +#define PES_EXT_FLAG 0x01 + +//pts_dts flags +#define PTS_ONLY 0x80 +#define PTS_DTS 0xC0 + +#define TS_SIZE 188 +#define TRANS_ERROR 0x80 +#define PAY_START 0x40 +#define TRANS_PRIO 0x20 +#define PID_MASK_HI 0x1F +//flags +#define TRANS_SCRMBL1 0x80 +#define TRANS_SCRMBL2 0x40 +#define ADAPT_FIELD 0x20 +#define PAYLOAD 0x10 +#define COUNT_MASK 0x0F + +// adaptation flags +#define DISCON_IND 0x80 +#define RAND_ACC_IND 0x40 +#define ES_PRI_IND 0x20 +#define PCR_FLAG 0x10 +#define OPCR_FLAG 0x08 +#define SPLICE_FLAG 0x04 +#define TRANS_PRIV 0x02 +#define ADAP_EXT_FLAG 0x01 + +// adaptation extension flags +#define LTW_FLAG 0x80 +#define PIECE_RATE 0x40 +#define SEAM_SPLICE 0x20 + + +#define MAX_PLENGTH 0xFFFF +#define MMAX_PLENGTH (256*MAX_PLENGTH) + +#ifndef IPACKS +#define IPACKS 2048 +#endif + +typedef struct ipack_s { + int size; + int found; + u8 *buf; + u8 cid; + uint32_t plength; + u8 plen[2]; + u8 flag1; + u8 flag2; + u8 hlength; + u8 pts[5]; + u16 *pid; + int mpeg; + u8 check; + int which; + int done; + void *data; + void (*func)(u8 *buf, int size, void *priv); + int count; + int repack_subids; +} ipack; + +typedef struct video_i{ + uint32_t horizontal_size; + uint32_t vertical_size; + uint32_t aspect_ratio; + uint32_t framerate; + uint32_t video_format; + uint32_t bit_rate; + uint32_t comp_bit_rate; + uint32_t vbv_buffer_size; + int16_t vbv_delay; + uint32_t CSPF; + uint32_t off; +} VideoInfo; + + +#define OFF_SIZE 4 +#define FIRST_FIELD 0 +#define SECOND_FIELD 1 +#define VIDEO_FRAME_PICTURE 0x03 + +typedef struct mpg_picture_s{ + int channel; + VideoInfo vinfo; + uint32_t *sequence_gop_header; + uint32_t *picture_header; + int32_t time_code; + int low_delay; + int closed_gop; + int broken_link; + int sequence_header_flag; + int gop_flag; + int sequence_end_flag; + + uint8_t profile_and_level; + int32_t picture_coding_parameter; + uint32_t matrix[32]; + int8_t matrix_change_flag; + + uint8_t picture_header_parameter; + /* bit 0 - 2: bwd f code + bit 3 : fpb vector + bit 4 - 6: fwd f code + bit 7 : fpf vector */ + + int mpeg1_flag; + int progressive_sequence; + int sequence_display_extension_flag; + uint32_t sequence_header_data; + int16_t last_frame_centre_horizontal_offset; + int16_t last_frame_centre_vertical_offset; + + uint32_t pts[2]; /* [0] 1st field, [1] 2nd field */ + int top_field_first; + int repeat_first_field; + int progressive_frame; + int bank; + int forward_bank; + int backward_bank; + int compress; + int16_t frame_centre_horizontal_offset[OFF_SIZE]; + /* [0-2] 1st field, [3] 2nd field */ + int16_t frame_centre_vertical_offset[OFF_SIZE]; + /* [0-2] 1st field, [3] 2nd field */ + int16_t temporal_reference[2]; + /* [0] 1st field, [1] 2nd field */ + + int8_t picture_coding_type[2]; + /* [0] 1st field, [1] 2nd field */ + int8_t picture_structure[2]; + /* [0] 1st field, [1] 2nd field */ + int8_t picture_display_extension_flag[2]; + /* [0] 1st field, [1] 2nd field */ + /* picture_display_extenion() 0:no 1:exit*/ + int8_t pts_flag[2]; + /* [0] 1st field, [1] 2nd field */ +} mpg_picture; + + + + +typedef struct audio_i{ + int layer ; + uint32_t bit_rate ; + uint32_t frequency ; + uint32_t mode ; + uint32_t mode_extension ; + uint32_t emphasis ; + uint32_t framesize; + uint32_t off; +} AudioInfo; + + +void reset_ipack(ipack *p); +int instant_repack(u8 *buf, int count, ipack *p); +void init_ipack(ipack *p, int size, + void (*func)(u8 *buf, int size, void *priv)); +void free_ipack(ipack * p); +void setup_ts2pes(ipack *pa, ipack *pv, u16 *pida, u16 *pidv, + void (*pes_write)(u8 *buf, int count, void *data), + void *priv); +void ts_to_pes(ipack *p, u8 *buf); +void send_ipack(ipack *p); +void send_ipack_rest(ipack *p); +int get_ainfo(uint8_t *mbuf, int count, AudioInfo *ai, int pr); +int get_ac3info(uint8_t *mbuf, int count, AudioInfo *ai, int pr); +int get_vinfo(uint8_t *mbuf, int count, VideoInfo *vi, int pr); +uint8_t *skip_pes_header(uint8_t **bufp); +void initialize_quant_matrix( uint32_t *matrix ); +void initialize_mpg_picture(mpg_picture *pic); +void init_mpg_picture( mpg_picture *pic, int chan, int32_t field_type); +void mpg_set_picture_parameter( int32_t field_type, mpg_picture *pic ); +int read_sequence_header(uint8_t *headr, VideoInfo *vi, int pr); +int read_gop_header(uint8_t *headr, mpg_picture *pic, int pr); +int read_picture_header(uint8_t *headr, mpg_picture *pic, int field, int pr); +#endif diff -Nru a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,938 @@ +/* + * dvb-core.c: DVB core driver + * + * Copyright (C) 1999-2001 Ralph Metzler + * Marcus Metzler + * Holger Waechtler + * for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Or, point your browser to http://www.gnu.org/copyleft/gpl.html + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "compat.h" +#include "dvb_frontend.h" +#include "dvbdev.h" + + +static int dvb_frontend_debug = 0; +static int dvb_shutdown_timeout = 0; + +#define dprintk if (dvb_frontend_debug) printk + +#define MAX_EVENT 8 + +struct dvb_fe_events { + struct dvb_frontend_event events[MAX_EVENT]; + int eventw; + int eventr; + int overflow; + wait_queue_head_t wait_queue; + struct semaphore sem; +}; + + +struct dvb_fe_notifier_callbacks { + struct list_head list_head; + void (*callback) (fe_status_t s, void *data); + void *data; +}; + + +struct dvb_frontend_data { + struct dvb_frontend_info *info; + struct dvb_frontend frontend; + struct dvb_device *dvbdev; + struct list_head notifier_callbacks; + struct dvb_frontend_parameters parameters; + struct dvb_fe_events events; + struct semaphore sem; + struct list_head list_head; + wait_queue_head_t wait_queue; + struct task_struct *thread; + unsigned long release_jiffies; + unsigned long lost_sync_jiffies; + int bending; + int lnb_drift; + int timeout_count; + int lost_sync_count; + int exit; + fe_status_t status; +}; + + +struct dvb_frontend_ioctl_data { + struct list_head list_head; + struct dvb_adapter_s *adapter; + int (*before_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg); + int (*after_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg); + void *before_after_data; +}; + + +static LIST_HEAD(frontend_list); +static LIST_HEAD(frontend_ioctl_list); + +static DECLARE_MUTEX(frontend_mutex); + + +static +inline void ddelay (int ms) +{ + current->state=TASK_INTERRUPTIBLE; + schedule_timeout((HZ*ms)/1000); +} + + +static +int dvb_frontend_internal_ioctl (struct dvb_frontend *frontend, + unsigned int cmd, void *arg) +{ + int err = -EOPNOTSUPP; + + dprintk ("%s\n", __FUNCTION__); + + if (frontend->before_ioctl) + err = frontend->before_ioctl (frontend, cmd, arg); + + if (err) { + err = frontend->ioctl (frontend, cmd, arg); + + if (err && frontend->after_ioctl) + err = frontend->after_ioctl (frontend, cmd, arg); + } + + return err; +} + + +/** + * if 2 tuners are located side by side you can get interferences when + * they try to tune to the same frequency, so both lose sync. + * We will slightly mistune in this case. The AFC of the demodulator + * should make it still possible to receive the requested transponder + * on both tuners... + */ +static +void dvb_bend_frequency (struct dvb_frontend_data *this_fe, int recursive) +{ + struct list_head *entry; + int stepsize = this_fe->info->frequency_stepsize; + int frequency; + + if (!stepsize || recursive > 10) { + printk ("%s: too deep recursion, check frequency_stepsize " + "in your frontend code!\n", __FUNCTION__); + return; + } + + dprintk ("%s\n", __FUNCTION__); + + if (!recursive) { + if (down_interruptible (&frontend_mutex)) + return; + this_fe->bending = 0; + } + + list_for_each (entry, &frontend_list) { + struct dvb_frontend_data *fe; + int f; + + fe = list_entry (entry, struct dvb_frontend_data, list_head); + + f = fe->parameters.frequency; + f += fe->lnb_drift; + f += fe->bending; + + frequency = this_fe->parameters.frequency; + frequency += this_fe->lnb_drift; + frequency += this_fe->bending; + + if (this_fe != fe && + frequency > f - stepsize && frequency < f + stepsize) + { + if (recursive % 2) + this_fe->bending += stepsize; + else + this_fe->bending = -this_fe->bending; + + dvb_bend_frequency (this_fe, recursive + 1); + goto done; + } + } +done: + if (!recursive) + up (&frontend_mutex); +} + + +static +void dvb_call_frontend_notifiers (struct dvb_frontend_data *fe, + fe_status_t s) +{ + struct list_head *e; + struct dvb_fe_notifier_callbacks *c; + + dprintk ("%s\n", __FUNCTION__); + + if ((fe->status & FE_HAS_LOCK) && !(s & FE_HAS_LOCK)) + fe->lost_sync_jiffies = jiffies; + + if (((s ^ fe->status) & FE_HAS_LOCK) && (s & FE_HAS_LOCK)) + ddelay (fe->info->notifier_delay); + + fe->status = s; + + if (!(s & FE_HAS_LOCK) && (fe->info->caps & FE_CAN_MUTE_TS)) + return; + + /** + * now tell the Demux about the TS status changes... + */ + list_for_each (e, &fe->notifier_callbacks) { + c = list_entry (e, struct dvb_fe_notifier_callbacks, list_head); + c->callback (fe->status, c->data); + } +} + + +static +void dvb_frontend_add_event (struct dvb_frontend_data *fe, fe_status_t status) +{ + struct dvb_fe_events *events = &fe->events; + struct dvb_frontend_event *e; + int wp; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&events->sem)) + return; + + wp = (events->eventw + 1) % MAX_EVENT; + + if (wp == events->eventr) { + events->overflow = 1; + events->eventr = (events->eventr + 1) % MAX_EVENT; + } + + e = &events->events[events->eventw]; + + memcpy (&e->parameters, &fe->parameters, + sizeof (struct dvb_frontend_parameters)); + + if (status & FE_HAS_LOCK) + dvb_frontend_internal_ioctl (&fe->frontend, + FE_GET_FRONTEND, + &e->parameters); + events->eventw = wp; + + up (&events->sem); + + e->status = status; + dvb_call_frontend_notifiers (fe, status); + + wake_up_interruptible (&events->wait_queue); +} + + +static +int dvb_frontend_get_event (struct dvb_frontend_data *fe, + struct dvb_frontend_event *event, int flags) +{ + struct dvb_fe_events *events = &fe->events; + + dprintk ("%s\n", __FUNCTION__); + + if (events->overflow) { + events->overflow = 0; + return -EOVERFLOW; + } + + if (events->eventw == events->eventr) { + int ret; + + if (flags & O_NONBLOCK) + return -EWOULDBLOCK; + + ret = wait_event_interruptible (events->wait_queue, + events->eventw != events->eventr); + if (ret < 0) + return ret; + } + + if (down_interruptible (&events->sem)) + return -ERESTARTSYS; + + memcpy (event, &events->events[events->eventr], + sizeof(struct dvb_frontend_event)); + + events->eventr = (events->eventr + 1) % MAX_EVENT; + + up (&events->sem); + + return 0; +} + + +static +struct dvb_frontend_parameters default_param [] = { + { /* NTV on Astra */ + frequency: 12669500-10600000, + inversion: INVERSION_OFF, + { qpsk: { symbol_rate: 22000000, fec_inner: FEC_AUTO } } + }, + { /* Cable */ + frequency: 394000000, + inversion: INVERSION_OFF, + { qam: { symbol_rate: 6900000, + fec_inner: FEC_AUTO, + modulation: QAM_64 + } + } + }, + { /* DVB-T */ + frequency: 730000000, + inversion: INVERSION_OFF, + { ofdm: { bandwidth: BANDWIDTH_8_MHZ, + code_rate_HP: FEC_2_3, + code_rate_LP: FEC_1_2, + constellation: QAM_16, + transmission_mode: TRANSMISSION_MODE_2K, + guard_interval: GUARD_INTERVAL_1_8, + hierarchy_information: HIERARCHY_NONE + } + } + } +}; + + +static +int dvb_frontend_set_parameters (struct dvb_frontend_data *fe, + struct dvb_frontend_parameters *param, + int first_trial) +{ + struct dvb_frontend *frontend = &fe->frontend; + int err; + + dprintk ("%s: f == %i, drift == %i\n", + __FUNCTION__, param->frequency, fe->lnb_drift); + + dvb_bend_frequency (fe, 0); + + if (first_trial) { + fe->timeout_count = 0; + fe->lost_sync_count = 0; + fe->lost_sync_jiffies = jiffies; + fe->lnb_drift = 0; + if (fe->status & ~FE_TIMEDOUT) + dvb_frontend_add_event (fe, 0); + memcpy (&fe->parameters, param, + sizeof (struct dvb_frontend_parameters)); + } + + param->frequency += fe->lnb_drift + fe->bending; + err = dvb_frontend_internal_ioctl (frontend, FE_SET_FRONTEND, param); + param->frequency -= fe->lnb_drift + fe->bending; + + wake_up_interruptible (&fe->wait_queue); + + return err; +} + +static +void dvb_frontend_init (struct dvb_frontend_data *fe) +{ + struct dvb_frontend *frontend = &fe->frontend; + struct dvb_frontend_parameters *init_param; + + printk ("%s: initialising frontend %i:%i (%s)...\n", __FUNCTION__, + frontend->i2c->adapter->num, frontend->i2c->id, + fe->info->name); + + dvb_frontend_internal_ioctl (frontend, FE_INIT, NULL); + + if (fe->info->type == FE_QPSK) { + dvb_frontend_internal_ioctl (frontend, FE_SET_VOLTAGE, + (void*) SEC_VOLTAGE_13); + dvb_frontend_internal_ioctl (frontend, FE_SET_TONE, + (void*) SEC_TONE_ON); + } + + init_param = &default_param[fe->info->type-FE_QPSK]; + + dvb_frontend_set_parameters (fe, init_param, 1); +} + + +static +void update_delay (int *quality, int *delay, int locked) +{ + int q2; + + dprintk ("%s\n", __FUNCTION__); + + if (locked) + (*quality) = (*quality * 220 + 36*256) / 256; + else + (*quality) = (*quality * 220 + 0) / 256; + + q2 = *quality - 128; + q2 *= q2; + + *delay = HZ/20 + q2 * HZ / (128*128); +} + + +#define LNB_DRIFT 1024 /* max. tolerated LNB drift, XXX FIXME: adjust! */ +#define TIMEOUT 2*HZ + +/** + * here we only come when we have lost the lock bit, + * let's try to do something useful... + */ +static +void dvb_frontend_recover (struct dvb_frontend_data *fe) +{ + dprintk ("%s\n", __FUNCTION__); + +#if 0 + if (fe->timeout_count > 3) { + printk ("%s: frontend seems dead, reinitializing...\n", + __FUNCTION__); + dvb_call_frontend_notifiers (fe, 0); + dvb_frontend_internal_ioctl (&fe->frontend, FE_INIT, NULL); + dvb_frontend_set_parameters (fe, &fe->parameters, 1); + dvb_frontend_add_event (fe, FE_REINIT); + fe->lost_sync_jiffies = jiffies; + fe->timeout_count = 0; + return; + } +#endif + + /** + * let's start a zigzag scan to compensate LNB drift... + */ + { + int j = fe->lost_sync_count; + int stepsize = fe->info->frequency_stepsize; + + if (j % 32 == 0) + fe->lnb_drift = 0; + + if (j % 2) + fe->lnb_drift += stepsize * ((j+1)/2); + else + fe->lnb_drift = -fe->lnb_drift; + + dvb_frontend_set_parameters (fe, &fe->parameters, 0); + } + + dvb_frontend_internal_ioctl (&fe->frontend, FE_RESET, NULL); +} + + + +static +int dvb_frontend_is_exiting (struct dvb_frontend_data *fe) +{ + if (fe->exit) + return 1; + + if (fe->dvbdev->users == 0 && dvb_shutdown_timeout) + if (jiffies - fe->release_jiffies > dvb_shutdown_timeout * HZ) + return 1; + + return 0; +} + + +static +int dvb_frontend_thread (void *data) +{ + struct dvb_frontend_data *fe = (struct dvb_frontend_data *) data; + int quality = 0, delay = 3*HZ; + fe_status_t s; + + dprintk ("%s\n", __FUNCTION__); + + lock_kernel (); + daemonize (); + sigfillset (¤t->blocked); + strncpy (current->comm, "kdvb-fe", sizeof (current->comm)); + fe->thread = current; + unlock_kernel (); + + dvb_call_frontend_notifiers (fe, 0); + dvb_frontend_init (fe); + + while (!dvb_frontend_is_exiting (fe)) { + up (&fe->sem); /* is locked when we enter the thread... */ + + interruptible_sleep_on_timeout (&fe->wait_queue, delay); + + if (down_interruptible (&fe->sem)) { + fe->thread = NULL; + return -ERESTARTSYS; + } + + if (dvb_frontend_is_exiting (fe)) + break; + + dvb_frontend_internal_ioctl (&fe->frontend, FE_READ_STATUS, &s); + + update_delay (&quality, &delay, s & FE_HAS_LOCK); + + s &= ~FE_TIMEDOUT; + + if (s & FE_HAS_LOCK) { + fe->timeout_count = 0; + fe->lost_sync_count = 0; + } else { + fe->lost_sync_count++; + + dvb_frontend_recover (fe); + delay = HZ/5; + if (jiffies - fe->lost_sync_jiffies > TIMEOUT) { + s |= FE_TIMEDOUT; + if ((fe->status & FE_TIMEDOUT) == 0) + fe->timeout_count++; + } + } + + if (s != fe->status) + dvb_frontend_add_event (fe, s); + }; + + dvb_frontend_internal_ioctl (&fe->frontend, FE_SLEEP, NULL); + up (&fe->sem); + fe->thread = NULL; + return 0; +} + + +static +void dvb_frontend_start (struct dvb_frontend_data *fe) +{ + dprintk ("%s\n", __FUNCTION__); + + if (!fe->exit && !fe->thread) { + if (down_interruptible (&fe->sem)) + return; + kernel_thread (dvb_frontend_thread, fe, 0); + } +} + + +static +void dvb_frontend_stop (struct dvb_frontend_data *fe) +{ + dprintk ("%s\n", __FUNCTION__); + + fe->exit = 1; + wake_up_interruptible (&fe->wait_queue); + + while (fe->thread) { + current->state = TASK_INTERRUPTIBLE; + schedule_timeout (5); + }; +} + + +static +int dvb_frontend_ioctl (struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + struct dvb_device *dvbdev = file->private_data; + struct dvb_frontend_data *fe = dvbdev->priv; + int err = 0; + + dprintk ("%s\n", __FUNCTION__); + + if (!fe || !fe->frontend.ioctl || fe->exit) + return -ENODEV; + + if (down_interruptible (&fe->sem)) + return -ERESTARTSYS; + + switch (cmd) { + case FE_DISEQC_SEND_MASTER_CMD: + case FE_DISEQC_SEND_BURST: + case FE_SET_TONE: + if (fe->status) + dvb_call_frontend_notifiers (fe, 0); + dvb_frontend_internal_ioctl (&fe->frontend, cmd, parg); + break; + case FE_SET_FRONTEND: + err = dvb_frontend_set_parameters (fe, parg, 1); + break; + case FE_GET_EVENT: + err = dvb_frontend_get_event (fe, parg, file->f_flags); + break; + case FE_GET_FRONTEND: + memcpy (parg, &fe->parameters, + sizeof (struct dvb_frontend_parameters)); + /* fall-through... */ + default: + dvb_frontend_internal_ioctl (&fe->frontend, cmd, parg); + }; + + up (&fe->sem); + + return err; +} + + +static +unsigned int dvb_frontend_poll (struct file *file, struct poll_table_struct *wait) +{ + struct dvb_device *dvbdev = file->private_data; + struct dvb_frontend_data *fe = dvbdev->priv; + + dprintk ("%s\n", __FUNCTION__); + + if (fe->events.eventw != fe->events.eventr) + return (POLLIN | POLLRDNORM | POLLPRI); + + poll_wait (file, &fe->events.wait_queue, wait); + + if (fe->events.eventw != fe->events.eventr) + return (POLLIN | POLLRDNORM | POLLPRI); + + return 0; +} + + +static +int dvb_frontend_open (struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev = file->private_data; + struct dvb_frontend_data *fe = dvbdev->priv; + int ret; + + dprintk ("%s\n", __FUNCTION__); + + if ((ret = dvb_generic_open (inode, file)) < 0) + return ret; + + dvb_frontend_start (fe); + + /* empty event queue */ + fe->events.eventr = fe->events.eventw; + + return ret; +} + + +static +int dvb_frontend_release (struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev = file->private_data; + struct dvb_frontend_data *fe = dvbdev->priv; + + dprintk ("%s\n", __FUNCTION__); + + fe->release_jiffies = jiffies; + + return dvb_generic_release (inode, file); +} + + + +int +dvb_add_frontend_ioctls (struct dvb_adapter_s *adapter, + int (*before_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + int (*after_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + void *before_after_data) +{ + struct dvb_frontend_ioctl_data *ioctl; + struct list_head *entry; + int frontend_count = 0; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&frontend_mutex)) + return -ERESTARTSYS; + + ioctl = kmalloc (sizeof(struct dvb_frontend_ioctl_data), GFP_KERNEL); + + if (!ioctl) { + up (&frontend_mutex); + return -ENOMEM; + } + + ioctl->adapter = adapter; + ioctl->before_ioctl = before_ioctl; + ioctl->after_ioctl = after_ioctl; + ioctl->before_after_data = before_after_data; + + list_add_tail (&ioctl->list_head, &frontend_ioctl_list); + + list_for_each (entry, &frontend_list) { + struct dvb_frontend_data *fe; + + fe = list_entry (entry, struct dvb_frontend_data, list_head); + + if (fe->frontend.i2c->adapter == adapter && + fe->frontend.before_ioctl == NULL && + fe->frontend.after_ioctl == NULL) + { + fe->frontend.before_ioctl = before_ioctl; + fe->frontend.after_ioctl = after_ioctl; + fe->frontend.before_after_data = before_after_data; + dvb_frontend_start (fe); + frontend_count++; + } + } + + up (&frontend_mutex); + + return frontend_count; +} + + +void +dvb_remove_frontend_ioctls (struct dvb_adapter_s *adapter, + int (*before_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + int (*after_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg)) +{ + struct list_head *entry; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&frontend_mutex)) + return; + + list_for_each (entry, &frontend_list) { + struct dvb_frontend_data *fe; + + fe = list_entry (entry, struct dvb_frontend_data, list_head); + + if (fe->frontend.i2c->adapter == adapter && + fe->frontend.before_ioctl == before_ioctl && + fe->frontend.after_ioctl == after_ioctl) + { + fe->frontend.before_ioctl = NULL; + fe->frontend.after_ioctl = NULL; + + } + } + + up (&frontend_mutex); +} + + +int +dvb_add_frontend_notifier (struct dvb_adapter_s *adapter, + void (*callback) (fe_status_t s, void *data), + void *data) +{ + struct list_head *entry; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&frontend_mutex)) + return -ERESTARTSYS; + + list_for_each (entry, &frontend_list) { + struct dvb_frontend_data *fe; + + fe = list_entry (entry, struct dvb_frontend_data, list_head); + + if (fe->frontend.i2c->adapter == adapter) { + struct dvb_fe_notifier_callbacks *e; + + e = kmalloc (sizeof(struct dvb_fe_notifier_callbacks), + GFP_KERNEL); + + if (!e) { + up (&frontend_mutex); + return -ENOMEM; + } + + e->callback = callback; + e->data = data; + list_add_tail (&e->list_head, &fe->notifier_callbacks); + + up (&frontend_mutex); + return 0; + } + } + + up (&frontend_mutex); + + return -ENODEV; +} + + +void +dvb_remove_frontend_notifier (struct dvb_adapter_s *adapter, + void (*callback) (fe_status_t s, void *data)) +{ + struct list_head *entry; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&frontend_mutex)) + return; + + list_for_each (entry, &frontend_list) { + struct dvb_frontend_data *fe; + + fe = list_entry (entry, struct dvb_frontend_data, list_head); + + if (fe->frontend.i2c->adapter == adapter) { + struct list_head *e0, *n0; + + list_for_each_safe (e0, n0, &fe->notifier_callbacks) { + struct dvb_fe_notifier_callbacks *e; + + e = list_entry (e0, + struct dvb_fe_notifier_callbacks, + list_head); + list_del (&e->list_head); + kfree (e); + } + } + } + + up (&frontend_mutex); +} + + +static +struct file_operations dvb_frontend_fops = { + owner: THIS_MODULE, + ioctl: dvb_generic_ioctl, + poll: dvb_frontend_poll, + open: dvb_frontend_open, + release: dvb_frontend_release +}; + + + +int +dvb_register_frontend (int (*ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + struct dvb_i2c_bus *i2c, + void *data, + struct dvb_frontend_info *info) +{ + struct list_head *entry; + struct dvb_frontend_data *fe; + dvb_device_t dvbdev_template = { users: 1, writers: 1, + fops: &dvb_frontend_fops, + kernel_ioctl: dvb_frontend_ioctl + }; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&frontend_mutex)) + return -ERESTARTSYS; + + if (!(fe = kmalloc (sizeof (struct dvb_frontend_data), GFP_KERNEL))) { + up (&frontend_mutex); + return -ENOMEM; + } + + memset (fe, 0, sizeof (struct dvb_frontend_data)); + + init_MUTEX (&fe->sem); + init_waitqueue_head (&fe->wait_queue); + init_waitqueue_head (&fe->events.wait_queue); + init_MUTEX (&fe->events.sem); + fe->events.eventw = fe->events.eventr = 0; + fe->events.overflow = 0; + INIT_LIST_HEAD (&fe->notifier_callbacks); + + fe->frontend.ioctl = ioctl; + fe->frontend.i2c = i2c; + fe->frontend.data = data; + fe->info = info; + + list_for_each (entry, &frontend_ioctl_list) { + struct dvb_frontend_ioctl_data *ioctl; + + ioctl = list_entry (entry, struct dvb_frontend_ioctl_data, list_head); + + if (ioctl->adapter == i2c->adapter) { + fe->frontend.before_ioctl = ioctl->before_ioctl; + fe->frontend.after_ioctl = ioctl->after_ioctl; + fe->frontend.before_after_data = ioctl->before_after_data; + dvb_frontend_start (fe); + break; + } + } + + list_add_tail (&fe->list_head, &frontend_list); + + dvb_register_device (i2c->adapter, &fe->dvbdev, &dvbdev_template, + fe, DVB_DEVICE_FRONTEND); + + up (&frontend_mutex); + + return 0; +} + + +int dvb_unregister_frontend (int (*ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + struct dvb_i2c_bus *i2c) +{ + struct list_head *entry, *n; + + dprintk ("%s\n", __FUNCTION__); + + if (down_interruptible (&frontend_mutex)) + return -ERESTARTSYS; + + list_for_each_safe (entry, n, &frontend_list) { + struct dvb_frontend_data *fe; + + fe = list_entry (entry, struct dvb_frontend_data, list_head); + + if (fe->frontend.ioctl == ioctl && fe->frontend.i2c == i2c) { + dvb_unregister_device (fe->dvbdev); + + list_del (entry); + up (&frontend_mutex); + + dvb_frontend_stop (fe); + kfree (fe); + return 0; + } + } + + up (&frontend_mutex); + return -EINVAL; +} + +MODULE_PARM(dvb_frontend_debug,"i"); +MODULE_PARM(dvb_shutdown_timeout,"i"); +MODULE_PARM_DESC(dvb_frontend_debug, "enable verbose debug messages"); +MODULE_PARM_DESC(dvb_shutdown_timeout, "wait seconds after close() before suspending hardware"); diff -Nru a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dvb_frontend.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,117 @@ +/* + * dvb-core.h + * + * Copyright (C) 2001 Ralph Metzler + * overhauled by Holger Waechtler + * for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVB_FRONTEND_H_ +#define _DVB_FRONTEND_H_ + +#include +#include +#include +#include +#include + +#ifndef MODULE_LICENSE +#define MODULE_LICENSE(x) +#endif + +#include + +#include "dvb_i2c.h" +#include "dvbdev.h" + + + + +/** + * when before_ioctl is registered and returns value 0, ioctl and after_ioctl + * are not executed. + */ + +struct dvb_frontend { + int (*before_ioctl) (struct dvb_frontend *frontend, unsigned int cmd, void *arg); + int (*ioctl) (struct dvb_frontend *frontend, unsigned int cmd, void *arg); + int (*after_ioctl) (struct dvb_frontend *frontend, unsigned int cmd, void *arg); + struct dvb_i2c_bus *i2c; + void *before_after_data; /* can be used by hardware module... */ + void *data; /* can be used by hardware module... */ +}; + + +/** + * private frontend command ioctl's. + * keep them in sync with the public ones defined in linux/dvb/frontend.h + */ +#define FE_SLEEP _IO('v', 80) +#define FE_INIT _IO('v', 81) +#define FE_RESET _IO('v', 82) + + +extern int +dvb_register_frontend (int (*ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + struct dvb_i2c_bus *i2c, + void *data, + struct dvb_frontend_info *info); + +extern int +dvb_unregister_frontend (int (*ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + struct dvb_i2c_bus *i2c); + + +/** + * Add special ioctl code performed before and after the main ioctl + * to all frontend devices on the specified DVB adapter. + * This is necessairy because the 22kHz/13V-18V/DiSEqC stuff depends + * heavily on the hardware around the frontend, the same tuner can create + * these signals on about a million different ways... + * + * Return value: number of frontends where the ioctl's were applied. + */ +extern int +dvb_add_frontend_ioctls (struct dvb_adapter_s *adapter, + int (*before_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + int (*after_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + void *before_after_data); + + +extern void +dvb_remove_frontend_ioctls (struct dvb_adapter_s *adapter, + int (*before_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg), + int (*after_ioctl) (struct dvb_frontend *frontend, + unsigned int cmd, void *arg)); + +extern int +dvb_add_frontend_notifier (struct dvb_adapter_s *adapter, + void (*callback) (fe_status_t s, void *data), + void *data); +extern void +dvb_remove_frontend_notifier (struct dvb_adapter_s *adapter, + void (*callback) (fe_status_t s, void *data)); + +#endif + diff -Nru a/drivers/media/dvb/dvb-core/dvb_i2c.c b/drivers/media/dvb/dvb-core/dvb_i2c.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dvb_i2c.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,301 @@ +/* + * dvb_i2c.h: simplified i2c interface for DVB adapters to get rid of i2c-core.c + * + * Copyright (C) 2002 Holger Waechtler for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Or, point your browser to http://www.gnu.org/copyleft/gpl.html + */ + +#include +#include +#include + +#include "compat.h" +#include "dvb_i2c.h" + + +struct dvb_i2c_device { + struct list_head list_head; + struct module *owner; + int (*attach) (struct dvb_i2c_bus *i2c); + void (*detach) (struct dvb_i2c_bus *i2c); +}; + + +LIST_HEAD(dvb_i2c_buslist); +LIST_HEAD(dvb_i2c_devicelist); + +DECLARE_MUTEX(dvb_i2c_mutex); + + +static +int register_i2c_client (struct dvb_i2c_bus *i2c, struct dvb_i2c_device *dev) +{ + struct dvb_i2c_device *client; + + if (!(client = kmalloc (sizeof (struct dvb_i2c_device), GFP_KERNEL))) + return -ENOMEM; + + client->detach = dev->detach; + client->owner = dev->owner; + + INIT_LIST_HEAD(&client->list_head); + + list_add_tail (&client->list_head, &i2c->client_list); + + return 0; +} + + +static +void try_attach_device (struct dvb_i2c_bus *i2c, struct dvb_i2c_device *dev) +{ + if (dev->owner) { + if (!MOD_CAN_QUERY(dev->owner)) + return; + + __MOD_INC_USE_COUNT(dev->owner); + } + + if (dev->attach (i2c) == 0) { + register_i2c_client (i2c, dev); + } else { + if (dev->owner) + __MOD_DEC_USE_COUNT(dev->owner); + } +} + + +static +void detach_device (struct dvb_i2c_bus *i2c, struct dvb_i2c_device *dev) +{ + dev->detach (i2c); + + if (dev->owner) + __MOD_DEC_USE_COUNT(dev->owner); +} + + +static +void unregister_i2c_client_from_bus (struct dvb_i2c_device *dev, + struct dvb_i2c_bus *i2c) +{ + struct list_head *entry; + + list_for_each (entry, &i2c->client_list) { + struct dvb_i2c_device *client; + + client = list_entry (entry, struct dvb_i2c_device, list_head); + + if (client->detach == dev->detach) + detach_device (i2c, dev); + } +} + + +static +void unregister_i2c_client_from_all_busses (struct dvb_i2c_device *dev) +{ + struct list_head *entry; + + list_for_each (entry, &dvb_i2c_buslist) { + struct dvb_i2c_bus *i2c; + + i2c = list_entry (entry, struct dvb_i2c_bus, list_head); + + unregister_i2c_client_from_bus (dev, i2c); + } +} + + +static +void unregister_all_clients_from_bus (struct dvb_i2c_bus *i2c) +{ + struct list_head *entry, *n; + + list_for_each_safe (entry, n, &(i2c->client_list)) { + struct dvb_i2c_device *client; + + client = list_entry (entry, struct dvb_i2c_device, list_head); + + detach_device (i2c, client); + + list_del (entry); + } +} + + + +static +void probe_device_on_all_busses (struct dvb_i2c_device *dev) +{ + struct list_head *entry; + + list_for_each (entry, &dvb_i2c_buslist) { + struct dvb_i2c_bus *i2c; + + i2c = list_entry (entry, struct dvb_i2c_bus, list_head); + + try_attach_device (i2c, dev); + } +} + + +static +void probe_devices_on_bus (struct dvb_i2c_bus *i2c) +{ + struct list_head *entry; + + list_for_each (entry, &dvb_i2c_devicelist) { + struct dvb_i2c_device *dev; + + dev = list_entry (entry, struct dvb_i2c_device, list_head); + + try_attach_device (i2c, dev); + } +} + + +struct dvb_i2c_bus* +dvb_register_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, + struct i2c_msg msgs[], int num), + void *data, + struct dvb_adapter_s *adapter, + int id) +{ + struct dvb_i2c_bus *i2c; + + if (!(i2c = kmalloc (sizeof (struct dvb_i2c_bus), GFP_KERNEL))) + return NULL; + + INIT_LIST_HEAD(&i2c->list_head); + INIT_LIST_HEAD(&i2c->client_list); + + i2c->xfer = xfer; + i2c->data = data; + i2c->adapter = adapter; + i2c->id = id; + + probe_devices_on_bus (i2c); + + list_add_tail (&i2c->list_head, &dvb_i2c_buslist); + + return i2c; +} + + +struct dvb_i2c_bus* +dvb_find_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, + struct i2c_msg msgs[], int num), + struct dvb_adapter_s *adapter, + int id) +{ + struct list_head *entry; + + if (down_interruptible (&dvb_i2c_mutex)) + return NULL; + + list_for_each (entry, &dvb_i2c_buslist) { + struct dvb_i2c_bus *i2c; + + i2c = list_entry (entry, struct dvb_i2c_bus, list_head); + + if (i2c->xfer == xfer && + i2c->adapter == adapter && + i2c->id == id) + { + up (&dvb_i2c_mutex); + return i2c; + } + } + + up (&dvb_i2c_mutex); + + return NULL; +} + + + +void dvb_unregister_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, + struct i2c_msg msgs[], int num), + struct dvb_adapter_s *adapter, + int id) +{ + struct dvb_i2c_bus *i2c = dvb_find_i2c_bus (xfer, adapter, id); + + if (i2c) { + unregister_all_clients_from_bus (i2c); + list_del (&i2c->list_head); + kfree (i2c); + } +} + + +int dvb_register_i2c_device (struct module *owner, + int (*attach) (struct dvb_i2c_bus *i2c), + void (*detach) (struct dvb_i2c_bus *i2c)) +{ + struct dvb_i2c_device *entry; + + if (down_interruptible (&dvb_i2c_mutex)) + return -ERESTARTSYS; + + if (!(entry = kmalloc (sizeof (struct dvb_i2c_device), GFP_KERNEL))) + return -ENOMEM; + + entry->owner = owner; + entry->attach = attach; + entry->detach = detach; + + INIT_LIST_HEAD(&entry->list_head); + + probe_device_on_all_busses (entry); + + list_add_tail (&entry->list_head, &dvb_i2c_devicelist); + + up (&dvb_i2c_mutex); + + return 0; +} + + +int dvb_unregister_i2c_device (int (*attach) (struct dvb_i2c_bus *i2c)) +{ + struct list_head *entry, *n; + + if (down_interruptible (&dvb_i2c_mutex)) + return -ERESTARTSYS; + + list_for_each_safe (entry, n, &dvb_i2c_devicelist) { + struct dvb_i2c_device *dev; + + dev = list_entry (entry, struct dvb_i2c_device, list_head); + + if (dev->attach == attach) { + list_del (entry); + unregister_i2c_client_from_all_busses (dev); + kfree (entry); + up (&dvb_i2c_mutex); + return 0; + } + } + + up (&dvb_i2c_mutex); + + return -EINVAL; +} + + diff -Nru a/drivers/media/dvb/dvb-core/dvb_i2c.h b/drivers/media/dvb/dvb-core/dvb_i2c.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dvb_i2c.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,63 @@ +/* + * dvb_i2c.h: i2c interface to get rid of i2c-core.c + * + * Copyright (C) 2002 Holger Waechtler for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Or, point your browser to http://www.gnu.org/copyleft/gpl.html + */ + +#ifndef _DVB_I2C_H_ +#define _DVB_I2C_H_ + +#include +#include + +#include "dvbdev.h" + + +struct dvb_i2c_bus { + struct list_head list_head; + int (*xfer) (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num); + void *data; + struct dvb_adapter_s *adapter; + int id; + struct list_head client_list; +}; + + +extern +struct dvb_i2c_bus* dvb_register_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, + struct i2c_msg msgs[], + int num), + void *data, + struct dvb_adapter_s *adapter, + int id); + +extern +void dvb_unregister_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c, + struct i2c_msg msgs[], int num), + struct dvb_adapter_s *adapter, + int id); + + +extern int dvb_register_i2c_device (struct module *owner, + int (*attach) (struct dvb_i2c_bus *i2c), + void (*detach) (struct dvb_i2c_bus *i2c)); + +extern int dvb_unregister_i2c_device (int (*attach) (struct dvb_i2c_bus *i2c)); + +#endif + diff -Nru a/drivers/media/dvb/dvb-core/dvb_ksyms.c b/drivers/media/dvb/dvb-core/dvb_ksyms.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dvb_ksyms.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,49 @@ +#include + +#include "dmxdev.h" +#include "dvb_filter.h" +#include "dvb_frontend.h" +#include "dvb_i2c.h" +#include "dvbdev.h" +#include "dvb_demux.h" +#include "dvb_net.h" + + +EXPORT_SYMBOL(DmxDevInit); +EXPORT_SYMBOL(DmxDevRelease); +EXPORT_SYMBOL(DvbDmxInit); +EXPORT_SYMBOL(DvbDmxRelease); +EXPORT_SYMBOL(DvbDmxSWFilterPackets); + +EXPORT_SYMBOL(dvb_register_frontend); +EXPORT_SYMBOL(dvb_unregister_frontend); +EXPORT_SYMBOL(dvb_add_frontend_ioctls); +EXPORT_SYMBOL(dvb_remove_frontend_ioctls); +EXPORT_SYMBOL(dvb_add_frontend_notifier); +EXPORT_SYMBOL(dvb_remove_frontend_notifier); + +EXPORT_SYMBOL(dvb_register_i2c_bus); +EXPORT_SYMBOL(dvb_unregister_i2c_bus); +EXPORT_SYMBOL(dvb_register_i2c_device); +EXPORT_SYMBOL(dvb_unregister_i2c_device); + +EXPORT_SYMBOL(dvb_net_init); +EXPORT_SYMBOL(dvb_net_release); + +EXPORT_SYMBOL(dvb_register_adapter); +EXPORT_SYMBOL(dvb_unregister_adapter); +EXPORT_SYMBOL(dvb_register_device); +EXPORT_SYMBOL(dvb_unregister_device); +EXPORT_SYMBOL(dvb_generic_ioctl); +EXPORT_SYMBOL(dvb_generic_open); +EXPORT_SYMBOL(dvb_generic_release); +EXPORT_SYMBOL(generic_usercopy); + +EXPORT_SYMBOL(init_ipack); +EXPORT_SYMBOL(reset_ipack); +EXPORT_SYMBOL(free_ipack); +EXPORT_SYMBOL(send_ipack_rest); +EXPORT_SYMBOL(instant_repack); +EXPORT_SYMBOL(pes2ts_init); +EXPORT_SYMBOL(pes2ts); + diff -Nru a/drivers/media/dvb/dvb-core/dvb_net.c b/drivers/media/dvb/dvb-core/dvb_net.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dvb_net.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,507 @@ +/* + * dvb_net.c + * + * Copyright (C) 2001 Convergence integrated media GmbH + * Ralph Metzler + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include + +#include +#include "demux.h" +#include "dvb_net.h" + +/* + * Determine the packet's protocol ID. The rule here is that we + * assume 802.3 if the type field is short enough to be a length. + * This is normal practice and works for any 'now in use' protocol. + * + * stolen from eth.c out of the linux kernel, hacked for dvb-device + * by Michael Holzt + */ + +unsigned short my_eth_type_trans(struct sk_buff *skb, struct net_device *dev) +{ + struct ethhdr *eth; + unsigned char *rawp; + + skb->mac.raw=skb->data; + skb_pull(skb,dev->hard_header_len); + eth= skb->mac.ethernet; + + if(*eth->h_dest&1) + { + if(memcmp(eth->h_dest,dev->broadcast, ETH_ALEN)==0) + skb->pkt_type=PACKET_BROADCAST; + else + skb->pkt_type=PACKET_MULTICAST; + } + + if (ntohs(eth->h_proto) >= 1536) + return eth->h_proto; + + rawp = skb->data; + + /* + * This is a magic hack to spot IPX packets. Older Novell breaks + * the protocol design and runs IPX over 802.3 without an 802.2 LLC + * layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This + * won't work for fault tolerant netware but does for the rest. + */ + if (*(unsigned short *)rawp == 0xFFFF) + return htons(ETH_P_802_3); + + /* + * Real 802.2 LLC + */ + return htons(ETH_P_802_2); +} + +static void +dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len) +{ + u8 *eth; + struct sk_buff *skb; + + if (pkt_len<13) { + printk("%s: IP/MPE packet length = %d too small.\n", dev->name, pkt_len); + return; + } + skb = dev_alloc_skb(pkt_len+2); + if (skb == NULL) { + printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", + dev->name); + ((dvb_net_priv_t *)dev->priv)->stats.rx_dropped++; + return; + } + eth=(u8 *) skb_put(skb, pkt_len+2); + memcpy(eth+14, (void*)pkt+12, pkt_len-12); + + eth[0]=pkt[0x0b]; + eth[1]=pkt[0x0a]; + eth[2]=pkt[0x09]; + eth[3]=pkt[0x08]; + eth[4]=pkt[0x04]; + eth[5]=pkt[0x03]; + eth[6]=eth[7]=eth[8]=eth[9]=eth[10]=eth[11]=0; + eth[12]=0x08; eth[13]=0x00; + + skb->protocol=my_eth_type_trans(skb,dev); + skb->dev=dev; + + ((dvb_net_priv_t *)dev->priv)->stats.rx_packets++; + ((dvb_net_priv_t *)dev->priv)->stats.rx_bytes+=skb->len; + //sti(); + netif_rx(skb); +} + +static int +dvb_net_callback(u8 *buffer1, size_t buffer1_len, + u8 *buffer2, size_t buffer2_len, + dmx_section_filter_t *filter, + dmx_success_t success) +{ + struct net_device *dev=(struct net_device *) filter->priv; + + /* FIXME: this only works if exactly one complete section is + delivered in buffer1 only */ + dvb_net_sec(dev, buffer1, buffer1_len); + return 0; +} + +static int +dvb_net_tx(struct sk_buff *skb, struct net_device *dev) +{ + return 0; +} + +#define MASK 0x00; + +static int +dvb_net_filter_set(struct net_device *dev, + dmx_section_filter_t **secfilter, + unsigned char *mac) +{ + dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv; + int ret; + + *secfilter=0; + ret=priv->secfeed->allocate_filter(priv->secfeed, secfilter); + if (ret<0) { + printk("%s: could not get filter\n", dev->name); + return ret; + } + + (*secfilter)->priv=(void *) dev; + + memset((*secfilter)->filter_value, 0, DMX_MAX_FILTER_SIZE); + memset((*secfilter)->filter_mask , 0, DMX_MAX_FILTER_SIZE); + + (*secfilter)->filter_value[0]=0x3e; + (*secfilter)->filter_mask[0]=MASK; + + (*secfilter)->filter_value[3]=mac[5]; + (*secfilter)->filter_mask[3]=MASK; + (*secfilter)->filter_value[4]=mac[4]; + (*secfilter)->filter_mask[4]=MASK; + (*secfilter)->filter_value[8]=mac[3]; + (*secfilter)->filter_mask[8]=MASK; + (*secfilter)->filter_value[9]=mac[2]; + (*secfilter)->filter_mask[9]=MASK; + + (*secfilter)->filter_value[10]=mac[1]; + (*secfilter)->filter_mask[10]=MASK; + (*secfilter)->filter_value[11]=mac[0]; + (*secfilter)->filter_mask[11]=MASK; + + printk("%s: filter mac=%02x %02x %02x %02x %02x %02x\n", + dev->name, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + return 0; +} + +static int +dvb_net_feed_start(struct net_device *dev) +{ + int ret, i; + dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv; + dmx_demux_t *demux=priv->demux; + unsigned char *mac=(unsigned char *) dev->dev_addr; + + priv->secfeed=0; + priv->secfilter=0; + + ret=demux->allocate_section_feed(demux, &priv->secfeed, + dvb_net_callback); + if (ret<0) { + printk("%s: could not get section feed\n", dev->name); + return ret; + } + + ret=priv->secfeed->set(priv->secfeed, priv->pid, 32768, 0, 0); + if (ret<0) { + printk("%s: could not set section feed\n", dev->name); + priv->demux-> + release_section_feed(priv->demux, priv->secfeed); + priv->secfeed=0; + return ret; + } + MOD_INC_USE_COUNT; + + dvb_net_filter_set(dev, &priv->secfilter, mac); + for (i=0; imulti_num; i++) + dvb_net_filter_set(dev, &priv->secfilter, + priv->multi_macs[i]); + + priv->secfeed->start_filtering(priv->secfeed); + printk("%s: feed_started\n", dev->name); + return 0; +} + +static void +dvb_net_feed_stop(struct net_device *dev) +{ + dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv; + int i; + + if (priv->secfeed) { + if (priv->secfeed->is_filtering) + priv->secfeed->stop_filtering(priv->secfeed); + printk("%s: feed_stopped\n", dev->name); + if (priv->secfilter) + priv->secfeed-> + release_filter(priv->secfeed, + priv->secfilter); + priv->secfilter=0; + + for (i=0; imulti_num; i++) { + if (priv->multi_secfilter[i]) + priv->secfeed-> + release_filter(priv->secfeed, + priv->multi_secfilter[i]); + priv->multi_secfilter[i]=0; + } + priv->demux-> + release_section_feed(priv->demux, priv->secfeed); + priv->secfeed=0; + MOD_DEC_USE_COUNT; + } else + printk("%s: no feed to stop\n", dev->name); +} + +static int +dvb_set_mc_filter(struct net_device *dev, struct dev_mc_list *mc) +{ + dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv; + + if (priv->multi_num==DVB_NET_MULTICAST_MAX) + return -ENOMEM; + + printk("%s: set_mc_filter %d: %02x %02x %02x %02x %02x %02x\n", + dev->name, + priv->multi_num, + mc->dmi_addr[0], + mc->dmi_addr[1], + mc->dmi_addr[2], + mc->dmi_addr[3], + mc->dmi_addr[4], + mc->dmi_addr[5]); + memcpy(priv->multi_macs[priv->multi_num], mc->dmi_addr, 6); + + priv->multi_num++; + return 0; +} + +static void +dvb_net_set_multi(struct net_device *dev) +{ + dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv; + + printk("%s: set_multi()\n", dev->name); + dvb_net_feed_stop(dev); + + if (dev->flags&IFF_PROMISC) { + /* Enable promiscuous mode */ + printk("%s: promiscuous mode\n", dev->name); + } else if((dev->flags&IFF_ALLMULTI)) { + /* Disable promiscuous mode, use normal mode. */ + printk("%s: normal mode\n", dev->name); + } else if(dev->mc_count) { + int mci; + struct dev_mc_list *mc; + + printk("%s: set_mc_list, %d entries\n", + dev->name, dev->mc_count); + priv->multi_num=0; + for (mci=0, mc=dev->mc_list; + mcimc_count; + mc=mc->next, mci++) { + dvb_set_mc_filter(dev, mc); + } + } + dvb_net_feed_start(dev); +} + +static int +dvb_net_set_config(struct net_device *dev, struct ifmap *map) +{ + if (netif_running(dev)) + return -EBUSY; + return 0; +} + +static int +dvb_net_set_mac(struct net_device *dev, void *p) +{ + struct sockaddr *addr=p; + + memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); + if (netif_running(dev)) { + dvb_net_feed_stop(dev); + dvb_net_feed_start(dev); + } + return 0; +} + + +static int +dvb_net_open(struct net_device *dev) +{ + dvb_net_feed_start(dev); + return 0; +} + +static int +dvb_net_stop(struct net_device *dev) +{ + dvb_net_feed_stop(dev); + return 0; +} + +static struct net_device_stats * +dvb_net_get_stats(struct net_device *dev) +{ + return &((dvb_net_priv_t *)dev->priv)->stats; +} + + +static int +dvb_net_init_dev(struct net_device *dev) +{ + printk("dvb_net: dvb_net_init_dev()\n"); + + ether_setup(dev); + + dev->open = dvb_net_open; + dev->stop = dvb_net_stop; + dev->hard_start_xmit = dvb_net_tx; + dev->get_stats = dvb_net_get_stats; + dev->set_multicast_list = dvb_net_set_multi; + dev->set_config = dvb_net_set_config; + dev->set_mac_address = dvb_net_set_mac; + dev->mtu = 4096; + + dev->flags |= IFF_NOARP; + dev->hard_header_cache = NULL; + + //SET_MODULE_OWNER(dev); + + return 0; +} + +static int +get_if(dvb_net_t *dvbnet) +{ + int i; + + for (i=0; idev_num; i++) + if (!dvbnet->state[i]) + break; + if (i==dvbnet->dev_num) + return -1; + dvbnet->state[i]=1; + return i; +} + + +int +dvb_net_add_if(dvb_net_t *dvbnet, u16 pid) +{ + struct net_device *net; + dmx_demux_t *demux; + int result; + int if_num; + + if_num=get_if(dvbnet); + if (if_num<0) + return -EINVAL; + + net=&dvbnet->device[if_num]; + demux=dvbnet->demux; + + net->base_addr = 0; + net->irq = 0; + net->dma = 0; + net->mem_start = 0; + memcpy(net->name, "dvb0_0", 7); + net->name[3]=dvbnet->card_num+0x30; + net->name[5]=if_num+0x30; + net->next = NULL; + net->init = dvb_net_init_dev; + net->priv = kmalloc(sizeof(dvb_net_priv_t), GFP_KERNEL); + if (net->priv == NULL) + return -ENOMEM; + memset(net->priv, 0, sizeof(dvb_net_priv_t)); + + ((dvb_net_priv_t *)net->priv)->demux=demux; + ((dvb_net_priv_t *)net->priv)->pid=pid; + + net->base_addr=pid; + + if ((result = register_netdev(net)) < 0) { + return result; + } + MOD_INC_USE_COUNT; + return if_num; +} + +int +dvb_net_remove_if(dvb_net_t *dvbnet, int num) +{ + if (!dvbnet->state[num]) + return -EINVAL; + dvb_net_stop(&dvbnet->device[num]); + kfree(dvbnet->device[num].priv); + unregister_netdev(&dvbnet->device[num]); + dvbnet->state[num]=0; + MOD_DEC_USE_COUNT; + return 0; +} + +int dvb_net_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, void *parg) +{ + dvb_device_t *dvbdev=(dvb_device_t *) file->private_data; + dvb_net_t *dvbnet=(dvb_net_t *) dvbdev->priv; + + if (((file->f_flags&O_ACCMODE)==O_RDONLY)) + return -EPERM; + + switch (cmd) { + case NET_ADD_IF: + { + struct dvb_net_if *dvbnetif=(struct dvb_net_if *)parg; + int result; + + result=dvb_net_add_if(dvbnet, dvbnetif->pid); + if (result<0) + return result; + dvbnetif->if_num=result; + break; + } + case NET_REMOVE_IF: + return dvb_net_remove_if(dvbnet, (int) parg); + default: + return -EINVAL; + } + return 0; +} + +static struct file_operations dvb_net_fops = { + owner: THIS_MODULE, + read: 0, + write: 0, + ioctl: dvb_generic_ioctl, + open: dvb_generic_open, + release: dvb_generic_release, + poll: 0, +}; + +static dvb_device_t dvbdev_net = { + priv: 0, + users: 1, + writers: 1, + fops: &dvb_net_fops, + kernel_ioctl: dvb_net_ioctl, +}; + +void +dvb_net_release(dvb_net_t *dvbnet) +{ + int i; + + dvb_unregister_device(dvbnet->dvbdev); + for (i=0; idev_num; i++) { + if (!dvbnet->state[i]) + continue; + dvb_net_remove_if(dvbnet, i); + } +} + +int +dvb_net_init(dvb_adapter_t *adap, dvb_net_t *dvbnet, dmx_demux_t *demux) +{ + int i; + + dvbnet->demux=demux; + dvbnet->dev_num=DVB_NET_DEVICES_MAX; + for (i=0; idev_num; i++) + dvbnet->state[i]=0; + dvb_register_device(adap, &dvbnet->dvbdev, &dvbdev_net, dvbnet, DVB_DEVICE_NET); + return 0; +} + diff -Nru a/drivers/media/dvb/dvb-core/dvb_net.h b/drivers/media/dvb/dvb-core/dvb_net.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dvb_net.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,63 @@ +/* + * dvb_net.h + * + * Copyright (C) 2001 Convergence integrated media GmbH + * Ralph Metzler + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVB_NET_H_ +#define _DVB_NET_H_ + +#include +#include +#include +#include +#include + +#include "dvbdev.h" + +#define DVB_NET_DEVICES_MAX 10 +#define DVB_NET_MULTICAST_MAX 10 + +typedef struct dvb_net_priv_s { + struct net_device_stats stats; + char name[6]; + u16 pid; + dmx_demux_t *demux; + dmx_section_feed_t *secfeed; + dmx_section_filter_t *secfilter; + int multi_num; + dmx_section_filter_t *multi_secfilter[DVB_NET_MULTICAST_MAX]; + unsigned char multi_macs[DVB_NET_MULTICAST_MAX][6]; +} dvb_net_priv_t; + +typedef struct dvb_net_s { + dvb_device_t *dvbdev; + + int card_num; + int dev_num; + struct net_device device[DVB_NET_DEVICES_MAX]; + int state[DVB_NET_DEVICES_MAX]; + dmx_demux_t *demux; +} dvb_net_t; + + +void dvb_net_release(dvb_net_t *); +int dvb_net_init(dvb_adapter_t *, dvb_net_t *, dmx_demux_t *); + +#endif diff -Nru a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dvbdev.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,434 @@ +/* + * dvbdev.c + * + * Copyright (C) 2000 Ralph Metzler + * & Marcus Metzler + * for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +/*#define CONFIG_DVB_DEVFS_ONLY 1*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "compat.h" +#include "dvbdev.h" + +static int dvbdev_debug = 0; +#define dprintk if (dvbdev_debug) printk + +static devfs_handle_t dvb_devfs_handle; +static LIST_HEAD(dvb_adapter_list); +static DECLARE_MUTEX(dvbdev_register_lock); + + +static char *dnames[] = { + "video", "audio", "sec", "frontend", "demux", "dvr", "ca", + "net", "osd" +}; + + +#ifdef CONFIG_DVB_DEVFS_ONLY + + #define DVB_MAX_IDS ~0 + #define nums2minor(num,type,id) 0 + #define DVB_DEVFS_FLAGS (DEVFS_FL_DEFAULT|DEVFS_FL_AUTO_DEVNUM) + +#else + + #define DVB_MAX_IDS 4 + #define nums2minor(num,type,id) ((num << 6) | (id << 4) | type) + #define DVB_DEVFS_FLAGS (DEVFS_FL_DEFAULT) + + +static +dvb_device_t* dvbdev_find_device (int minor) +{ + struct list_head *entry; + + list_for_each (entry, &dvb_adapter_list) { + struct list_head *entry0; + dvb_adapter_t *adap; + adap = list_entry (entry, dvb_adapter_t, list_head); + list_for_each (entry0, &adap->device_list) { + dvb_device_t *dev; + dev = list_entry (entry0, dvb_device_t, list_head); + if (nums2minor(adap->num, dev->type, dev->id) == minor) + return dev; + } + } + + return NULL; +} + + +static +int dvb_device_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev; + + dvbdev = dvbdev_find_device (minor(inode->i_rdev)); + + if (dvbdev && dvbdev->fops) { + int err = 0; + struct file_operations *old_fops; + + file->private_data = dvbdev; + old_fops = file->f_op; + file->f_op = fops_get(dvbdev->fops); + if(file->f_op->open) + err = file->f_op->open(inode,file); + if (err) { + fops_put(file->f_op); + file->f_op = fops_get(old_fops); + } + fops_put(old_fops); + return err; + } + return -ENODEV; +} + + +static struct file_operations dvb_device_fops = +{ + owner: THIS_MODULE, + read: NULL, + write: NULL, + ioctl: NULL, + open: dvb_device_open, + release: NULL, + poll: NULL, +}; +#endif /* CONFIG_DVB_DEVFS_ONLY */ + + + +int dvb_generic_open(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev = file->private_data; + + if (!dvbdev) + return -ENODEV; + + if (!dvbdev->users) + return -EBUSY; + + if ((file->f_flags & O_ACCMODE) != O_RDONLY) { + if (!dvbdev->writers) + return -EBUSY; + dvbdev->writers--; + } + + dvbdev->users--; + return 0; +} + + +int dvb_generic_release(struct inode *inode, struct file *file) +{ + dvb_device_t *dvbdev = file->private_data; + + if (!dvbdev) + return -ENODEV; + + if ((file->f_flags & O_ACCMODE) != O_RDONLY) + dvbdev->writers++; + + dvbdev->users++; + return 0; +} + + +/* + * helper function -- handles userspace copying for ioctl arguments + */ +int +generic_usercopy(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg, + int (*func)(struct inode *inode, struct file *file, + unsigned int cmd, void *arg)) +{ + char sbuf[128]; + void *mbuf = NULL; + void *parg = NULL; + int err = -EINVAL; + + /* Copy arguments into temp kernel buffer */ + switch (_IOC_DIR(cmd)) { + case _IOC_NONE: + parg = (void *)arg; + break; + case _IOC_READ: /* some v4l ioctls are marked wrong ... */ + case _IOC_WRITE: + case (_IOC_WRITE | _IOC_READ): + if (_IOC_SIZE(cmd) <= sizeof(sbuf)) { + parg = sbuf; + } else { + /* too big to allocate from stack */ + mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL); + if (NULL == mbuf) + return -ENOMEM; + parg = mbuf; + } + + err = -EFAULT; + if (copy_from_user(parg, (void *)arg, _IOC_SIZE(cmd))) + goto out; + break; + } + + /* call driver */ + if ((err = func(inode, file, cmd, parg)) == -ENOIOCTLCMD) + err = -EINVAL; + + if (err < 0) + goto out; + + /* Copy results into user buffer */ + switch (_IOC_DIR(cmd)) + { + case _IOC_READ: + case (_IOC_WRITE | _IOC_READ): + if (copy_to_user((void *)arg, parg, _IOC_SIZE(cmd))) + err = -EFAULT; + break; + } + +out: + if (mbuf) + kfree(mbuf); + + return err; +} + + +int dvb_generic_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + dvb_device_t *dvbdev = file->private_data; + + if (!dvbdev) + return -ENODEV; + + if (!dvbdev->kernel_ioctl) + return -EINVAL; + + return generic_usercopy (inode, file, cmd, arg, dvbdev->kernel_ioctl); +} + + +static +int dvbdev_get_free_id (struct dvb_adapter_s *adap, int type) +{ + u32 id = 0; + + while (id < DVB_MAX_IDS) { + struct list_head *entry; + list_for_each (entry, &adap->device_list) { + dvb_device_t *dev; + dev = list_entry (entry, dvb_device_t, list_head); + if (dev->type == type && dev->id == id) + goto skip; + } + return id; +skip: + id++; + } + return -ENFILE; +} + + +int dvb_register_device(dvb_adapter_t *adap, dvb_device_t **pdvbdev, + dvb_device_t *template, void *priv, int type) +{ + u32 id; + char name [20]; + dvb_device_t *dvbdev; + + if (down_interruptible (&dvbdev_register_lock)) + return -ERESTARTSYS; + + if ((id = dvbdev_get_free_id (adap, type)) < 0) { + up (&dvbdev_register_lock); + *pdvbdev = 0; + printk ("%s: could get find free device id...\n", __FUNCTION__); + return -ENFILE; + } + + *pdvbdev = dvbdev = kmalloc(sizeof(dvb_device_t), GFP_KERNEL); + + if (!dvbdev) { + up(&dvbdev_register_lock); + return -ENOMEM; + } + + up (&dvbdev_register_lock); + + memcpy(dvbdev, template, sizeof(dvb_device_t)); + dvbdev->type = type; + dvbdev->id = id; + dvbdev->adapter = adap; + dvbdev->priv = priv; + + list_add_tail (&dvbdev->list_head, &adap->device_list); + + sprintf(name, "%s%d", dnames[type], id); + dvbdev->devfs_handle = devfs_register(adap->devfs_handle, name, + DVB_DEVFS_FLAGS, + DVB_MAJOR, + nums2minor(adap->num, type, id), + S_IFCHR | S_IRUSR | S_IWUSR, + dvbdev->fops, dvbdev); + + dprintk("%s: register adapter%d/%s @ minor: %i (0x%02x) - dvbdev: %p\n", + __FUNCTION__, adap->num, name, nums2minor(adap->num, type, id), + nums2minor(adap->num, type, id), dvbdev); + + return 0; +} + + +void dvb_unregister_device(dvb_device_t *dvbdev) +{ + if (!dvbdev) + return; + + devfs_unregister(dvbdev->devfs_handle); + list_del (&dvbdev->list_head); + kfree (dvbdev); +} + + +static +int dvbdev_get_free_adapter_num (void) +{ + int num = 0; + + while (1) { + struct list_head *entry; + list_for_each (entry, &dvb_adapter_list) { + dvb_adapter_t *adap; + adap = list_entry (entry, dvb_adapter_t, list_head); + if (adap->num == num) + goto skip; + } + return num; +skip: + num++; + } + + return -ENFILE; +} + + +int dvb_register_adapter(dvb_adapter_t **padap, char *name) +{ + char dirname[10]; + dvb_adapter_t *adap; + int num; + + if (down_interruptible (&dvbdev_register_lock)) + return -ERESTARTSYS; + + if ((num = dvbdev_get_free_adapter_num ()) < 0) { + up (&dvbdev_register_lock); + return -ENFILE; + } + + if (!(*padap = adap = kmalloc(sizeof(dvb_adapter_t), GFP_KERNEL))) { + up(&dvbdev_register_lock); + return -ENOMEM; + } + + memset (adap, 0, sizeof(dvb_adapter_t)); + INIT_LIST_HEAD (&adap->device_list); + + MOD_INC_USE_COUNT; + + printk ("%s: registering new adapter (%s).\n", __FUNCTION__, name); + + sprintf(dirname, "adapter%d", num); + adap->devfs_handle = devfs_mk_dir(dvb_devfs_handle, dirname, NULL); + adap->num = num; + + list_add_tail (&adap->list_head, &dvb_adapter_list); + + up (&dvbdev_register_lock); + + return num; +} + + +int dvb_unregister_adapter(dvb_adapter_t *adap) +{ + devfs_unregister (adap->devfs_handle); + if (down_interruptible (&dvbdev_register_lock)) + return -ERESTARTSYS; + list_del (&adap->list_head); + up (&dvbdev_register_lock); + kfree (adap); + MOD_DEC_USE_COUNT; + return 0; +} + + +static +int __init init_dvbdev(void) +{ + dvb_devfs_handle = devfs_mk_dir (NULL, "dvb", NULL); +#ifndef CONFIG_DVB_DEVFS_ONLY + if(register_chrdev(DVB_MAJOR,"DVB", &dvb_device_fops)) { + printk("video_dev: unable to get major %d\n", DVB_MAJOR); + return -EIO; + } +#endif + return 0; +} + + +static +void __exit exit_dvbdev(void) +{ +#ifndef CONFIG_DVB_DEVFS_ONLY + unregister_chrdev(DVB_MAJOR, "DVB"); +#endif + devfs_unregister(dvb_devfs_handle); +} + +module_init(init_dvbdev); +module_exit(exit_dvbdev); + +MODULE_DESCRIPTION("DVB Core Driver"); +MODULE_AUTHOR("Marcus Metzler, Ralph Metzler, Holger Waechtler"); +MODULE_LICENSE("GPL"); + +MODULE_PARM(dvbdev_debug,"i"); +MODULE_PARM_DESC(dvbdev_debug, "enable verbose debug messages"); + diff -Nru a/drivers/media/dvb/dvb-core/dvbdev.h b/drivers/media/dvb/dvb-core/dvbdev.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/dvbdev.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,91 @@ +/* + * dvbdev.h + * + * Copyright (C) 2000 Ralph Metzler + * & Marcus Metzler + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Lesser Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVBDEV_H_ +#define _DVBDEV_H_ + +#include +#include +#include +#include +#include + +#define DVB_MAJOR 250 + +#define DVB_DEVICE_VIDEO 0 +#define DVB_DEVICE_AUDIO 1 +#define DVB_DEVICE_SEC 2 +#define DVB_DEVICE_FRONTEND 3 +#define DVB_DEVICE_DEMUX 4 +#define DVB_DEVICE_DVR 5 +#define DVB_DEVICE_CA 6 +#define DVB_DEVICE_NET 7 +#define DVB_DEVICE_OSD 8 + + +typedef struct dvb_adapter_s +{ + int num; + devfs_handle_t devfs_handle; + struct list_head list_head; + struct list_head device_list; +} dvb_adapter_t; + + +typedef struct dvb_device +{ + struct list_head list_head; + struct file_operations *fops; + devfs_handle_t devfs_handle; + dvb_adapter_t *adapter; + int type; + u32 id; + + int users; + int writers; + + /* don't really need those !? */ + int (*kernel_ioctl)(struct inode *inode, struct file *file, + unsigned int cmd, void *arg); // FIXME: use generic_usercopy() + + void *priv; +} dvb_device_t; + + +int dvb_register_device(dvb_adapter_t *adap, dvb_device_t **pdvbdev, + dvb_device_t *template, void *priv, int type); +void dvb_unregister_device(struct dvb_device *dvbdev); + +int dvb_register_adapter(dvb_adapter_t **padap, char *name); +int dvb_unregister_adapter(dvb_adapter_t *adap); + +int dvb_generic_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg); +int dvb_generic_open(struct inode *inode, struct file *file); +int dvb_generic_release(struct inode *inode, struct file *file); +int generic_usercopy(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg, + int (*func)(struct inode *inode, struct file *file, + unsigned int cmd, void *arg)); + +#endif /* #ifndef __DVBDEV_H */ diff -Nru a/drivers/media/dvb/frontends/Config.help b/drivers/media/dvb/frontends/Config.help --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/frontends/Config.help Mon Oct 28 16:32:38 2002 @@ -0,0 +1,39 @@ +CONFIG_DVB_ALPS_BSRU6 + A DVB-S tuner module. + + Say Y when you want to support this frontend. + + If you don't know what tuner module is soldered on your + DVB adapter simply enable all supported frontends, the + right one will get autodetected. + +CONFIG_DVB_ALPS_BSRV2 + A DVB-S tuner module. Say Y when you want to support this frontend. + + If you don't know what tuner module is soldered on your + DVB adapter simply enable all supported frontends, the + right one will get autodetected. + +CONFIG_DVB_GRUNDIG_29504_491 + A DVB-S tuner module. Say Y when you want to support this frontend. + + If you don't know what tuner module is soldered on your + DVB adapter simply enable all supported frontends, the + right one will get autodetected. + +CONFIG_DVB_GRUNDIG_29504_401 + A DVB-T tuner module. Say Y when you want to support this frontend. + + If you don't know what tuner module is soldered on your + DVB adapter simply enable all supported frontends, the + right one will get autodetected. + +CONFIG_DVB_VES1820 + The VES1820 Demodulator is used on many DVB-C PCI cards and in some + DVB-C SetTopBoxes. Say Y when you see this demodulator chip near your + tuner module. + + If you don't know what tuner module is soldered on your + DVB adapter simply enable all supported frontends, the + right one will get autodetected. + diff -Nru a/drivers/media/dvb/frontends/Config.in b/drivers/media/dvb/frontends/Config.in --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/frontends/Config.in Mon Oct 28 16:32:38 2002 @@ -0,0 +1,9 @@ + +comment 'Supported Frontend Modules' + +dep_tristate ' Alps BSRU6 (QPSK)' CONFIG_DVB_ALPS_BSRU6 $CONFIG_DVB_CORE +dep_tristate ' Alps BSRV2 (QPSK)' CONFIG_DVB_ALPS_BSRV2 $CONFIG_DVB_CORE +dep_tristate ' Grundig 29504-491 (QPSK)' CONFIG_DVB_GRUNDIG_29504_491 $CONFIG_DVB_CORE +dep_tristate ' Grundig 29504-401 (OFDM)' CONFIG_DVB_GRUNDIG_29504_401 $CONFIG_DVB_CORE +dep_tristate ' Frontends with external VES1820 demodulator (QAM)' CONFIG_DVB_VES1820 $CONFIG_DVB_CORE + diff -Nru a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/frontends/Makefile Mon Oct 28 16:32:38 2002 @@ -0,0 +1,14 @@ +# +# Makefile for the kernel DVB frontend device drivers. +# + +EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ + +obj-$(CONFIG_DVB_ALPS_BSRU6) += alps_bsru6.o +obj-$(CONFIG_DVB_ALPS_BSRV2) += alps_bsrv2.o +obj-$(CONFIG_DVB_GRUNDIG_29504_491) += grundig_29504-491.o +obj-$(CONFIG_DVB_GRUNDIG_29504_401) += grundig_29504-401.o +obj-$(CONFIG_DVB_VES1820) += ves1820.o + +include $(TOPDIR)/Rules.make + diff -Nru a/drivers/media/dvb/frontends/alps_bsru6.c b/drivers/media/dvb/frontends/alps_bsru6.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/frontends/alps_bsru6.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,700 @@ +/* + Alps BSRU6 DVB QPSK frontend driver + + Copyright (C) 2001-2002 Convergence Integrated Media GmbH + , + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include + +#include "compat.h" +#include "dvb_frontend.h" + + +static int debug = 0; +#define dprintk if (debug) printk + + +#define M_CLK (88000000UL) + +/* M=21, K=0, P=0, f_VCO = 4MHz*4*(M+1)/(K+1) = 352 MHz */ + +static +struct dvb_frontend_info bsru6_info = { + name: "Alps BSRU6", + type: FE_QPSK, + frequency_min: 950000, + frequency_max: 2150000, + frequency_stepsize: 125, /* kHz for QPSK frontends */ + frequency_tolerance: M_CLK/2000, + symbol_rate_min: 1000000, + symbol_rate_max: 45000000, + symbol_rate_tolerance: 500, /* ppm */ + notifier_delay: 0, + caps: FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | + FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | + FE_CAN_QPSK +}; + + +static +u8 init_tab [] = { + 0x01, 0x15, // M: 0x15 DIRCLK: 0 K:0 + 0x02, 0x30, // P: 0 SERCLK: 0 VCO:ON STDBY:0 + + 0x03, 0x00, + 0x04, 0x7d, // F22FR, F22=22kHz + 0x05, 0x35, // SDAT:0 SCLT:0 I2CT:1 + 0x06, 0x00, // DAC mode and MSB + 0x07, 0x00, // DAC LSB + 0x08, 0x43, // DiSEqC + 0x09, 0x00, + 0x0a, 0x42, + 0x0c, 0x51, // QPSK reverse:1 Nyquist:0 OP0 val:1 OP0 con:1 OP1 val:1 OP1 con:1 + 0x0d, 0x82, + 0x0e, 0x23, + 0x0f, 0x52, + + 0x10, 0x3d, // AGC2 + 0x11, 0x84, + 0x12, 0xb5, // Lock detect: -64 Carrier freq detect:on + 0x13, 0xb6, // alpha_car b:4 a:0 noise est:256ks derot:on + 0x14, 0x93, // beat carc:0 d:0 e:0xf phase detect algo: 1 + 0x15, 0xc9, // lock detector threshold + + 0x16, 0x1d, + 0x17, 0x0, + 0x18, 0x14, + 0x19, 0xf2, + + 0x1a, 0x11, + + 0x1b, 0x9c, + 0x1c, 0x0, + 0x1d, 0x0, + 0x1e, 0xb, + + 0x22, 0x00, + 0x23, 0x00, + 0x24, 0xff, + 0x25, 0xff, + 0x26, 0xff, + + 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0 + 0x29, 0x1e, // 1/2 threshold + 0x2a, 0x14, // 2/3 threshold + 0x2b, 0x0f, // 3/4 threshold + 0x2c, 0x09, // 5/6 threshold + 0x2d, 0x05, // 7/8 threshold + 0x2e, 0x01, + + 0x31, 0x1f, // test all FECs + + 0x32, 0x19, // viterbi and synchro search + 0x33, 0xfc, // rs control + 0x34, 0x93, // error control + + + 0x0b, 0x00, + 0x27, 0x00, 0x2f, 0x00, 0x30, 0x00, + 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, + 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, + 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, + 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, + 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, + 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, + 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00 +}; + + +static +int stv0299_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data) +{ + int ret; + u8 buf [] = { reg, data }; + struct i2c_msg msg = { addr: 0x68, flags: 0, buf: buf, len: 2 }; + + dprintk ("%s\n", __FUNCTION__); + + ret = i2c->xfer (i2c, &msg, 1); + + if (ret != 1) + dprintk("%s: writereg error (reg == 0x%02x, val == 0x%02x, ret == %i)\n", + __FUNCTION__, reg, data, ret); + + return (ret != 1) ? -1 : 0; +} + + +static +u8 stv0299_readreg (struct dvb_i2c_bus *i2c, u8 reg) +{ + int ret; + u8 b0 [] = { reg }; + u8 b1 [] = { 0 }; + struct i2c_msg msg [] = { { addr: 0x68, flags: 0, buf: b0, len: 1 }, + { addr: 0x68, flags: I2C_M_RD, buf: b1, len: 1 } }; + + dprintk ("%s\n", __FUNCTION__); + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); + + return b1[0]; +} + + +static +int stv0299_readregs (struct dvb_i2c_bus *i2c, u8 reg1, u8 *b, u8 len) +{ + int ret; + struct i2c_msg msg [] = { { addr: 0x68, flags: 0, buf: ®1, len: 1 }, + { addr: 0x68, flags: I2C_M_RD, buf: b, len: len } }; + + dprintk ("%s\n", __FUNCTION__); + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); + + return ret == 2 ? 0 : -1; +} + + + +static +int tsa5059_write (struct dvb_i2c_bus *i2c, u8 data [4]) +{ + int ret; + u8 rpt1 [] = { 0x05, 0xb5 }; /* enable i2c repeater on stv0299 */ + struct i2c_msg msg [] = {{ addr: 0x68, flags: 0, buf: rpt1, len: 2 }, + { addr: 0x61, flags: 0, buf: data, len: 4 }}; + + dprintk ("%s\n", __FUNCTION__); + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret); + + return (ret != 2) ? -1 : 0; +} + + +/** + * set up the downconverter frequency divisor for a + * reference clock comparision frequency of 125 kHz. + */ +static +int tsa5059_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, u8 pwr) +{ + u32 div = freq / 125; + u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, 0x84, (pwr << 5) | 0x20 }; + + dprintk ("%s\n", __FUNCTION__); + + return tsa5059_write (i2c, buf); +} + + +static +int stv0299_init (struct dvb_i2c_bus *i2c) +{ + int i; + + dprintk("stv0299: init chip\n"); + + for (i=0; i 4) + return FEC_AUTO; + + return fec_tab [index]; +} + + +static +int stv0299_wait_diseqc_fifo (struct dvb_i2c_bus *i2c, int timeout) +{ + unsigned long start = jiffies; + + dprintk ("%s\n", __FUNCTION__); + + while (stv0299_readreg(i2c, 0x0a) & 1) { + if (jiffies - start > timeout) { + dprintk ("%s: timeout!!\n", __FUNCTION__); + return -ETIMEDOUT; + } + current->state = TASK_INTERRUPTIBLE; + schedule_timeout (1); + }; + + return 0; +} + + +static +int stv0299_wait_diseqc_idle (struct dvb_i2c_bus *i2c, int timeout) +{ + unsigned long start = jiffies; + + dprintk ("%s\n", __FUNCTION__); + + while ((stv0299_readreg(i2c, 0x0a) & 3) != 2 ) { + if (jiffies - start > timeout) { + dprintk ("%s: timeout!!\n", __FUNCTION__); + return -ETIMEDOUT; + } + current->state = TASK_INTERRUPTIBLE; + schedule_timeout (1); + }; + + return 0; +} + + +static +int stv0299_send_diseqc_msg (struct dvb_i2c_bus *i2c, + struct dvb_diseqc_master_cmd *m) +{ + u8 val; + int i; + + dprintk ("%s\n", __FUNCTION__); + + val = stv0299_readreg (i2c, 0x08); + + if (stv0299_writereg (i2c, 0x08, (val & ~0x7) | 0x6)) /* DiSEqC mode */ + return -EREMOTEIO; + + for (i=0; imsg_len; i++) { + if (stv0299_wait_diseqc_fifo (i2c, 100) < 0) + return -ETIMEDOUT; + + if (stv0299_writereg (i2c, 0x09, m->msg[i])) + return -EREMOTEIO; + } + + /* Shouldn't we wait for idle state (FE=1, FF=0) here to + make certain all bytes have been sent ? + Hmm, actually we should do that before all mode changes too ... + if (stv0299_wait_diseqc_idle (i2c, 100) < 0) */ + + if (stv0299_wait_diseqc_fifo (i2c, 100) < 0) + return -ETIMEDOUT; + + return 0; +} + + +static +int stv0299_send_diseqc_burst (struct dvb_i2c_bus *i2c, fe_sec_mini_cmd_t burst) +{ + u8 val; + + dprintk ("%s\n", __FUNCTION__); + + val = stv0299_readreg (i2c, 0x08); + + if (stv0299_wait_diseqc_fifo (i2c, 100) < 0) + return -ETIMEDOUT; + + if (stv0299_writereg (i2c, 0x08, (val & ~0x7) | 0x2)) /* burst mode */ + return -EREMOTEIO; + + if (stv0299_writereg (i2c, 0x09, burst == SEC_MINI_A ? 0x00 : 0xff)) + return -EREMOTEIO; + + if (stv0299_wait_diseqc_fifo (i2c, 100) < 0) + return -ETIMEDOUT; + + if (stv0299_writereg (i2c, 0x08, val)) + return -EREMOTEIO; + + return 0; +} + + +static +int stv0299_set_tone (struct dvb_i2c_bus *i2c, fe_sec_tone_mode_t tone) +{ + u8 val; + + dprintk ("%s\n", __FUNCTION__); + + val = stv0299_readreg (i2c, 0x08); + + switch (tone) { + case SEC_TONE_ON: + return stv0299_writereg (i2c, 0x08, val | 0x3); + case SEC_TONE_OFF: + return stv0299_writereg (i2c, 0x08, (val & ~0x3) | 0x02); + default: + return -EINVAL; + }; +} + + +static +int stv0299_set_voltage (struct dvb_i2c_bus *i2c, fe_sec_voltage_t voltage) +{ + u8 val; + + dprintk ("%s\n", __FUNCTION__); + + val = stv0299_readreg (i2c, 0x0c); + val &= 0x0f; + val |= 0x40; + + switch (voltage) { + case SEC_VOLTAGE_13: + return stv0299_writereg (i2c, 0x0c, val); + case SEC_VOLTAGE_18: + return stv0299_writereg (i2c, 0x0c, val | 0x10); + default: + return -EINVAL; + }; +} + + +static +int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate) +{ + u32 ratio; + u32 tmp; + u8 aclk = 0xb4, bclk = 0x51; + + dprintk ("%s\n", __FUNCTION__); + + if (srate > M_CLK) + srate = M_CLK; + if (srate < 500000) + srate = 500000; + + if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; } + if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; } + if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; } + if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; } + if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; } + +#define FIN (M_CLK >> 4) + + tmp = srate << 4; + ratio = tmp / FIN; + + tmp = (tmp % FIN) << 8; + ratio = (ratio << 8) + tmp / FIN; + + tmp = (tmp % FIN) << 8; + ratio = (ratio << 8) + tmp / FIN; + + stv0299_writereg (i2c, 0x13, aclk); + stv0299_writereg (i2c, 0x14, bclk); + stv0299_writereg (i2c, 0x1f, (ratio >> 16) & 0xff); + stv0299_writereg (i2c, 0x20, (ratio >> 8) & 0xff); + stv0299_writereg (i2c, 0x21, (ratio ) & 0xf0); + + return 0; +} + + + +static +int stv0299_get_symbolrate (struct dvb_i2c_bus *i2c) +{ + u32 Mclk = M_CLK / 4096L; + u32 srate; + s32 offset; + u8 sfr[3]; + s8 rtf; + + dprintk ("%s\n", __FUNCTION__); + + stv0299_readregs (i2c, 0x1f, sfr, 3); + stv0299_readregs (i2c, 0x1a, &rtf, 1); + + srate = (sfr[0] << 8) | sfr[1]; + srate *= Mclk; + srate /= 16; + srate += (sfr[2] >> 4) * Mclk / 256; + + offset = (s32) rtf * (srate / 4096L); + offset /= 128; + + srate += offset; + + srate += 1000; + srate /= 2000; + srate *= 2000; + + return srate; +} + + +static +int bsru6_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg) +{ + struct dvb_i2c_bus *i2c = fe->i2c; + + dprintk ("%s\n", __FUNCTION__); + + switch (cmd) { + case FE_GET_INFO: + memcpy (arg, &bsru6_info, sizeof(struct dvb_frontend_info)); + break; + + case FE_READ_STATUS: + { + fe_status_t *status = (fe_status_t *) arg; + u8 signal = 0xff - stv0299_readreg (i2c, 0x18); + u8 sync = stv0299_readreg (i2c, 0x1b); + + *status = 0; + + if (signal > 10) + *status |= FE_HAS_SIGNAL; + + if (sync & 0x80) + *status |= FE_HAS_CARRIER; + + if (sync & 0x10) + *status |= FE_HAS_VITERBI; + + if (sync & 0x08) + *status |= FE_HAS_SYNC; + + if ((sync & 0x98) == 0x98) + *status |= FE_HAS_LOCK; + + break; + } + + case FE_READ_BER: + *((u32*) arg) = (stv0299_readreg (i2c, 0x1d) << 8) + | stv0299_readreg (i2c, 0x1e); + break; + + case FE_READ_SIGNAL_STRENGTH: + { + s32 signal = 0xffff - ((stv0299_readreg (i2c, 0x18) << 8) + | stv0299_readreg (i2c, 0x19)); + signal = signal * 5 / 4; + *((u16*) arg) = (signal > 0xffff) ? 0xffff : + (signal < 0) ? 0 : signal; + break; + } + case FE_READ_SNR: + { + s32 snr = 0xffff - ((stv0299_readreg (i2c, 0x24) << 8) + | stv0299_readreg (i2c, 0x25)); + snr = 3 * (snr - 0xa100); + *((u16*) arg) = (snr > 0xffff) ? 0xffff : + (snr < 0) ? 0 : snr; + break; + } + case FE_READ_UNCORRECTED_BLOCKS: + *((u32*) arg) = 0; /* the stv0299 can't measure BER and */ + return -EOPNOTSUPP; /* errors at the same time.... */ + + case FE_SET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + + tsa5059_set_tv_freq (i2c, p->frequency, 3); + stv0299_set_inversion (i2c, p->inversion); + stv0299_set_FEC (i2c, p->u.qpsk.fec_inner); + stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate); + tsa5059_set_tv_freq (i2c, p->frequency, 0); + stv0299_writereg (i2c, 0x22, 0x00); + stv0299_writereg (i2c, 0x23, 0x00); + stv0299_readreg (i2c, 0x23); + stv0299_writereg (i2c, 0x12, 0xb9); + break; + } + + case FE_GET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + s32 derot_freq; + + derot_freq = (s32)(s16) ((stv0299_readreg (i2c, 0x22) << 8) + | stv0299_readreg (i2c, 0x23)); + + derot_freq *= (M_CLK >> 16); + derot_freq += 500; + derot_freq /= 1000; + + p->frequency += derot_freq; + p->inversion = (stv0299_readreg (i2c, 0x0c) & 1) ? + INVERSION_OFF : INVERSION_ON; + p->u.qpsk.fec_inner = stv0299_get_FEC (i2c); + p->u.qpsk.symbol_rate = stv0299_get_symbolrate (i2c); + break; + } + + case FE_SLEEP: + stv0299_writereg (i2c, 0x0c, 0x00); /* LNB power off! */ + stv0299_writereg (i2c, 0x02, 0x80); + break; + + case FE_INIT: + return stv0299_init (i2c); + + case FE_RESET: + stv0299_writereg (i2c, 0x22, 0x00); + stv0299_writereg (i2c, 0x23, 0x00); + stv0299_readreg (i2c, 0x23); + stv0299_writereg (i2c, 0x12, 0xb9); + break; + + case FE_DISEQC_SEND_MASTER_CMD: + return stv0299_send_diseqc_msg (i2c, arg); + + case FE_DISEQC_SEND_BURST: + return stv0299_send_diseqc_burst (i2c, (fe_sec_mini_cmd_t) arg); + + case FE_SET_TONE: + return stv0299_set_tone (i2c, (fe_sec_tone_mode_t) arg); + + case FE_SET_VOLTAGE: + return stv0299_set_voltage (i2c, (fe_sec_voltage_t) arg); + + default: + return -EOPNOTSUPP; + }; + + return 0; +} + + + +static +int bsru6_attach (struct dvb_i2c_bus *i2c) +{ + dprintk ("%s\n", __FUNCTION__); + + if ((stv0299_readreg (i2c, 0x00)) != 0xa1) + return -ENODEV; + + dvb_register_frontend (bsru6_ioctl, i2c, NULL, &bsru6_info); + + return 0; +} + + +static +void bsru6_detach (struct dvb_i2c_bus *i2c) +{ + dprintk ("%s\n", __FUNCTION__); + + dvb_unregister_frontend (bsru6_ioctl, i2c); +} + + +static +int __init init_bsru6 (void) +{ + dprintk ("%s\n", __FUNCTION__); + + return dvb_register_i2c_device (THIS_MODULE, bsru6_attach, bsru6_detach); +} + + +static +void __exit exit_bsru6 (void) +{ + dprintk ("%s\n", __FUNCTION__); + + dvb_unregister_i2c_device (bsru6_attach); +} + +module_init (init_bsru6); +module_exit (exit_bsru6); + +MODULE_PARM(debug,"i"); +MODULE_PARM_DESC(debug, "enable verbose debug messages"); +MODULE_DESCRIPTION("BSRU6 DVB Frontend driver"); +MODULE_AUTHOR("Ralph Metzler, Holger Waechtler"); +MODULE_LICENSE("GPL"); + diff -Nru a/drivers/media/dvb/frontends/alps_bsrv2.c b/drivers/media/dvb/frontends/alps_bsrv2.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/frontends/alps_bsrv2.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,470 @@ +/* + Driver for Alps BSRV2 QPSK Frontend + + Copyright (C) 1999 Convergence Integrated Media GmbH + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include + +#include "compat.h" +#include "dvb_frontend.h" + +static int debug = 0; +#define dprintk if (debug) printk + + +static +struct dvb_frontend_info bsrv2_info = { + name: "Alps BSRV2", + type: FE_QPSK, + frequency_min: 950000, + frequency_max: 2150000, + frequency_stepsize: 250, /* kHz for QPSK frontends */ + frequency_tolerance: 29500, + symbol_rate_min: 1000000, + symbol_rate_max: 45000000, +/* symbol_rate_tolerance: ???,*/ + notifier_delay: 50, /* 1/20 s */ + caps: FE_CAN_INVERSION_AUTO | + FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | + FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | + FE_CAN_QPSK +}; + + + +static +u8 init_1893_tab [] = { + 0x01, 0xA4, 0x35, 0x81, 0x2A, 0x0d, 0x55, 0xC4, + 0x09, 0x69, 0x00, 0x86, 0x4c, 0x28, 0x7F, 0x00, + 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x31, 0xb0, 0x14, 0x00, 0xDC, 0x20, + 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x55, 0x00, 0x00, 0x7f, 0x00 +}; + + +static +u8 init_1893_wtab[] = +{ + 1,1,1,1,1,1,1,1, 1,1,0,0,1,1,0,0, + 0,1,0,0,0,0,0,0, 1,0,1,1,0,0,0,1, + 1,1,1,0,0,0,0,0, 0,0,1,1,0,0,0,0, + 1,1,1,0,1,1 +}; + + +static +int ves1893_writereg (struct dvb_i2c_bus *i2c, int reg, int data) +{ + u8 buf [] = { 0x00, reg, data }; + struct i2c_msg msg = { addr: 0x08, flags: 0, buf: buf, len: 3 }; + int err; + + if ((err = i2c->xfer (i2c, &msg, 1)) != 1) { + dprintk ("%s: writereg error (err == %i, reg == 0x%02x, data == 0x%02x)\n", __FUNCTION__, err, reg, data); + return -EREMOTEIO; + } + + return 0; +} + + +static +u8 ves1893_readreg (struct dvb_i2c_bus *i2c, u8 reg) +{ + int ret; + u8 b0 [] = { 0x00, reg }; + u8 b1 [] = { 0 }; + struct i2c_msg msg [] = { { addr: 0x08, flags: 0, buf: b0, len: 2 }, + { addr: 0x08, flags: I2C_M_RD, buf: b1, len: 1 } }; + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); + + return b1[0]; +} + + +static +int sp5659_write (struct dvb_i2c_bus *i2c, u8 data [4]) +{ + int ret; + struct i2c_msg msg = { addr: 0x61, flags: 0, buf: data, len: 4 }; + + ret = i2c->xfer (i2c, &msg, 1); + + if (ret != 1) + printk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret); + + return (ret != 1) ? -1 : 0; +} + + + +/** + * set up the downconverter frequency divisor for a + * reference clock comparision frequency of 125 kHz. + */ +static +int sp5659_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, u8 pwr) +{ + u32 div = (freq + 479500) / 125; + u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, 0x95, (pwr << 5) | 0x30 }; + + return sp5659_write (i2c, buf); +} + + +static +int ves1893_init (struct dvb_i2c_bus *i2c) +{ + int i; + + dprintk("%s: init chip\n", __FUNCTION__); + + for (i=0; i<54; i++) + if (init_1893_wtab[i]) + ves1893_writereg (i2c, i, init_1893_tab[i]); + + return 0; +} + + +static +int ves1893_clr_bit (struct dvb_i2c_bus *i2c) +{ + ves1893_writereg (i2c, 0, init_1893_tab[0] & 0xfe); + ves1893_writereg (i2c, 0, init_1893_tab[0]); + ves1893_writereg (i2c, 3, 0x00); + return ves1893_writereg (i2c, 3, init_1893_tab[3]); +} + + +static +int ves1893_set_inversion (struct dvb_i2c_bus *i2c, fe_spectral_inversion_t inversion) +{ + u8 val; + + switch (inversion) { + case INVERSION_OFF: + val = 0xc0; + break; + case INVERSION_ON: + val = 0x80; + break; + case INVERSION_AUTO: + val = 0x40; + break; + default: + return -EINVAL; + } + + return ves1893_writereg (i2c, 0x0c, (init_1893_tab[0x0c] & 0x3f) | val); +} + + +static +int ves1893_set_fec (struct dvb_i2c_bus *i2c, fe_code_rate_t fec) +{ + if (fec == FEC_AUTO) + return ves1893_writereg (i2c, 0x0d, 0x08); + else if (fec < FEC_1_2 || fec > FEC_8_9) + return -EINVAL; + else + return ves1893_writereg (i2c, 0x0d, fec - FEC_1_2); +} + + +static +fe_code_rate_t ves1893_get_fec (struct dvb_i2c_bus *i2c) +{ + return FEC_1_2 + ((ves1893_readreg (i2c, 0x0d) >> 4) & 0x7); +} + + +static +int ves1893_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate) +{ + u32 BDR; + u32 ratio; + u8 ADCONF, FCONF, FNR; + u32 BDRI; + u32 tmp; + + dprintk("%s: srate == %d\n", __FUNCTION__, srate); + + if (srate > 90100000UL/2) + srate = 90100000UL/2; + + if (srate < 500000) + srate = 500000; + +#define MUL (1UL<<26) +#define FIN (90106000UL>>4) + + tmp = srate << 6; + ratio = tmp / FIN; + + tmp = (tmp % FIN) << 8; + ratio = (ratio << 8) + tmp / FIN; + + tmp = (tmp % FIN) << 8; + ratio = (ratio << 8) + tmp / FIN; + + FNR = 0xff; + + if (ratio < MUL/3) FNR = 0; + if (ratio < (MUL*11)/50) FNR = 1; + if (ratio < MUL/6) FNR = 2; + if (ratio < MUL/9) FNR = 3; + if (ratio < MUL/12) FNR = 4; + if (ratio < (MUL*11)/200) FNR = 5; + if (ratio < MUL/24) FNR = 6; + if (ratio < (MUL*27)/1000) FNR = 7; + if (ratio < MUL/48) FNR = 8; + if (ratio < (MUL*137)/10000) FNR = 9; + + if (FNR == 0xff) { + ADCONF = 0x89; + FCONF = 0x80; + FNR = 0; + } else { + ADCONF = 0x81; + FCONF = 0x88 | (FNR >> 1) | ((FNR & 0x01) << 5); + } + + BDR = (( (ratio << (FNR >> 1)) >> 4) + 1) >> 1; + BDRI = ( ((FIN << 8) / ((srate << (FNR >> 1)) >> 2)) + 1) >> 1; + + dprintk("FNR= %d\n", FNR); + dprintk("ratio= %08x\n", ratio); + dprintk("BDR= %08x\n", BDR); + dprintk("BDRI= %02x\n", BDRI); + + if (BDRI > 0xff) + BDRI = 0xff; + + ves1893_writereg (i2c, 0x06, 0xff & BDR); + ves1893_writereg (i2c, 0x07, 0xff & (BDR >> 8)); + ves1893_writereg (i2c, 0x08, 0x0f & (BDR >> 16)); + + ves1893_writereg (i2c, 0x09, BDRI); + ves1893_writereg (i2c, 0x20, ADCONF); + ves1893_writereg (i2c, 0x21, FCONF); + + if (srate < 6000000) + ves1893_writereg (i2c, 0x05, init_1893_tab[0x05] | 0x80); + else + ves1893_writereg (i2c, 0x05, init_1893_tab[0x05] & 0x7f); + + ves1893_writereg (i2c, 0x00, 0x00); + ves1893_writereg (i2c, 0x00, 0x01); + + ves1893_clr_bit (i2c); + + return 0; +} + + +static +int ves1893_set_voltage (struct dvb_i2c_bus *i2c, fe_sec_voltage_t voltage) +{ + switch (voltage) { + case SEC_VOLTAGE_13: + return ves1893_writereg (i2c, 0x1f, 0x20); + case SEC_VOLTAGE_18: + return ves1893_writereg (i2c, 0x1f, 0x30); + default: + return -EINVAL; + }; +} + + +static +int bsrv2_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg) +{ + struct dvb_i2c_bus *i2c = fe->i2c; + + switch (cmd) { + case FE_GET_INFO: + memcpy (arg, &bsrv2_info, sizeof(struct dvb_frontend_info)); + break; + + case FE_READ_STATUS: + { + fe_status_t *status = arg; + int sync = ves1893_readreg (i2c, 0x0e); + + *status = 0; + + if (sync & 1) + *status |= FE_HAS_SIGNAL; + + if (sync & 2) + *status |= FE_HAS_CARRIER; + + if (sync & 4) + *status |= FE_HAS_VITERBI; + + if (sync & 8) + *status |= FE_HAS_SYNC; + + if ((sync & 0x1f) == 0x1f) + *status |= FE_HAS_LOCK; + + break; + } + + case FE_READ_BER: + { + u32 *ber = (u32 *) arg; + + *ber = ves1893_readreg (i2c, 0x15); + *ber |= (ves1893_readreg (i2c, 0x16) << 8); + *ber |= (ves1893_readreg (i2c, 0x17) << 16); + *ber *= 10; + break; + } + + case FE_READ_SIGNAL_STRENGTH: + { + u8 signal = ~ves1893_readreg (i2c, 0x0b); + *((u16*) arg) = (signal << 8) | signal; + break; + } + + case FE_READ_SNR: + { + u8 snr = ~ves1893_readreg (i2c, 0x1c); + *(u16*) arg = (snr << 8) | snr; + break; + } + + case FE_READ_UNCORRECTED_BLOCKS: + { + *(u32*) arg = ves1893_readreg (i2c, 0x18) & 0x7f; + + if (*(u32*) arg == 0x7f) + *(u32*) arg = 0xffffffff; /* counter overflow... */ + + ves1893_writereg (i2c, 0x18, 0x00); /* reset the counter */ + ves1893_writereg (i2c, 0x18, 0x80); /* dto. */ + break; + } + + case FE_SET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + + sp5659_set_tv_freq (i2c, p->frequency, 0); + ves1893_set_inversion (i2c, p->inversion); + ves1893_set_fec (i2c, p->u.qpsk.fec_inner); +// sp5659_set_tv_freq (i2c, p->frequency, 0); + ves1893_set_symbolrate (i2c, p->u.qpsk.symbol_rate); + break; + } + + case FE_GET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + s32 afc; + + afc = ((int)((char)(ves1893_readreg (i2c, 0x0a) << 1)))/2; + afc = (afc * (int)(p->u.qpsk.symbol_rate/8))/16; + + p->frequency += afc; + p->inversion = (ves1893_readreg (i2c, 0x0f) & 2) ? + INVERSION_ON : INVERSION_OFF; + p->u.qpsk.fec_inner = ves1893_get_fec (i2c); + /* XXX FIXME: timing offset !! */ + break; + } + + case FE_SLEEP: + ves1893_writereg (i2c, 0x1f, 0x00); /* LNB power off */ + return ves1893_writereg (i2c, 0x00, 0x08); + + case FE_INIT: + return ves1893_init (i2c); + + case FE_RESET: + return ves1893_clr_bit (i2c); + + case FE_SET_TONE: + return -EOPNOTSUPP; /* the ves1893 can generate the 22k */ + /* let's implement this when we have */ + /* a box that uses the 22K_0 pin... */ + case FE_SET_VOLTAGE: + return ves1893_set_voltage (i2c, (fe_sec_voltage_t) arg); + + default: + return -EOPNOTSUPP; + }; + + return 0; +} + + +static +int bsrv2_attach (struct dvb_i2c_bus *i2c) +{ + if ((ves1893_readreg (i2c, 0x1e) & 0xf0) != 0xd0) + return -ENODEV; + + dvb_register_frontend (bsrv2_ioctl, i2c, NULL, &bsrv2_info); + + return 0; +} + + +static +void bsrv2_detach (struct dvb_i2c_bus *i2c) +{ + dvb_unregister_frontend (bsrv2_ioctl, i2c); +} + + +static +int __init init_bsrv2 (void) +{ + return dvb_register_i2c_device (THIS_MODULE, bsrv2_attach, bsrv2_detach); +} + + +static +void __exit exit_bsrv2 (void) +{ + dvb_unregister_i2c_device (bsrv2_attach); +} + + +module_init(init_bsrv2); +module_exit(exit_bsrv2); + + +MODULE_DESCRIPTION("BSRV2 DVB-S Frontend"); +MODULE_AUTHOR("Ralph Metzler"); +MODULE_LICENSE("GPL"); +MODULE_PARM(debug,"i"); + diff -Nru a/drivers/media/dvb/frontends/grundig_29504-401.c b/drivers/media/dvb/frontends/grundig_29504-401.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/frontends/grundig_29504-401.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,484 @@ +/* + driver for Grundig 29504-401 DVB-T Frontends based on + LSI L64781 COFDM demodulator as used in Technotrend DVB-T cards + + Copyright (C) 2001 Holger Waechtler + for Convergence Integrated Media GmbH + Marko Kohtala + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include + +#include "compat.h" +#include "dvb_frontend.h" + +static int debug = 0; + +#define dprintk if (debug) printk + + +struct dvb_frontend_info grundig_29504_401_info = { + name: "Grundig 29504-401", + type: FE_OFDM, +/* frequency_min: ???,*/ +/* frequency_max: ???,*/ + frequency_stepsize: 166666, +/* frequency_tolerance: ???,*/ +/* symbol_rate_tolerance: ???,*/ + notifier_delay: 0, + caps: FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | + FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | + FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | + FE_CAN_MUTE_TS +}; + + +static +int l64781_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data) +{ + int ret; + u8 buf [] = { reg, data }; + struct i2c_msg msg = { addr: 0x55, flags: 0, buf: buf, len: 2 }; + + if ((ret = i2c->xfer (i2c, &msg, 1)) != 1) + dprintk ("%s: write_reg error (reg == %02x) = %02x!\n", + __FUNCTION__, reg, ret); + + return (ret != 1) ? -1 : 0; +} + + +static +u8 l64781_readreg (struct dvb_i2c_bus *i2c, u8 reg) +{ + int ret; + u8 b0 [] = { reg }; + u8 b1 [] = { 0 }; + struct i2c_msg msg [] = { { addr: 0x55, flags: 0, buf: b0, len: 1 }, + { addr: 0x55, flags: I2C_M_RD, buf: b1, len: 1 } }; + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); + + return b1[0]; +} + + +static +int tsa5060_write (struct dvb_i2c_bus *i2c, u8 data [4]) +{ + int ret; + struct i2c_msg msg = { addr: 0x61, flags: 0, buf: data, len: 4 }; + + if ((ret = i2c->xfer (i2c, &msg, 1)) != 1) + dprintk ("%s: write_reg error == %02x!\n", __FUNCTION__, ret); + + return (ret != 1) ? -1 : 0; +} + + +/** + * set up the downconverter frequency divisor for a + * reference clock comparision frequency of 166666 Hz. + * frequency offset is 36000000 Hz. + */ +static +int tsa5060_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, u8 pwr) +{ + u32 div; + u8 buf [4]; + u8 cfg; + + if (freq < 700000000) { + div = (36000000 + freq) / 31250; + cfg = 0x86; + } else { + div = (36000000 + freq) / 166666; + cfg = 0x88; + } + + buf [0] = (div >> 8) & 0x7f; + buf [1] = div & 0xff; + buf [2] = ((div >> 10) & 0x60) | cfg; + buf [3] = pwr << 6; + + return tsa5060_write (i2c, buf); +} + + +static +void apply_tps (struct dvb_i2c_bus *i2c) +{ + l64781_writereg (i2c, 0x2a, 0x00); + l64781_writereg (i2c, 0x2a, 0x01); + + /* This here is a little bit questionable because it enables + the automatic update of TPS registers. I think we'd need to + handle the IRQ from FE to update some other registers as + well, or at least implement some magic to tuning to correct + to the TPS received from transmission. */ + l64781_writereg (i2c, 0x2a, 0x02); +} + + +static +void reset_afc (struct dvb_i2c_bus *i2c) +{ + /* Set AFC stall for the AFC_INIT_FRQ setting, TIM_STALL for + timing offset */ + l64781_writereg (i2c, 0x07, 0x9e); /* stall AFC */ + l64781_writereg (i2c, 0x08, 0); /* AFC INIT FREQ */ + l64781_writereg (i2c, 0x09, 0); + l64781_writereg (i2c, 0x0a, 0); + l64781_writereg (i2c, 0x07, 0x8e); + l64781_writereg (i2c, 0x0e, 0); /* AGC gain to zero in beginning */ + l64781_writereg (i2c, 0x11, 0x80); /* stall TIM */ + l64781_writereg (i2c, 0x10, 0); /* TIM_OFFSET_LSB */ + l64781_writereg (i2c, 0x12, 0); + l64781_writereg (i2c, 0x13, 0); + l64781_writereg (i2c, 0x11, 0x00); +} + + +static +int apply_frontend_param (struct dvb_i2c_bus *i2c, + struct dvb_frontend_parameters *param) +{ + /* The coderates for FEC_NONE, FEC_4_5 and FEC_FEC_6_7 are arbitrary */ + static const u8 fec_tab[] = { 7, 0, 1, 2, 9, 3, 10, 4 }; + /* QPSK, QAM_16, QAM_64 */ + static const u8 qam_tab [] = { 2, 4, 0, 6 }; + static const u8 bw_tab [] = { 8, 7, 6 }; /* 8Mhz, 7MHz, 6MHz */ + static const u8 guard_tab [] = { 1, 2, 4, 8 }; + /* The Grundig 29504-401.04 Tuner comes with 18.432MHz crystal. */ + static const u32 ppm = 8000; + struct dvb_ofdm_parameters *p = ¶m->u.ofdm; + u32 ddfs_offset_fixed; +/* u32 ddfs_offset_variable = 0x6000-((1000000UL+ppm)/ */ +/* bw_tab[p->bandWidth]<<10)/15625; */ + u32 init_freq; + u32 spi_bias; + u8 val0x04; + u8 val0x05; + u8 val0x06; + + if (param->inversion != INVERSION_ON && + param->inversion != INVERSION_OFF) + return -EINVAL; + + if (p->bandwidth < BANDWIDTH_8_MHZ || p->bandwidth > BANDWIDTH_6_MHZ) + return -EINVAL; + + if (p->code_rate_HP != FEC_1_2 && p->code_rate_HP != FEC_2_3 && + p->code_rate_HP != FEC_3_4 && p->code_rate_HP != FEC_5_6 && + p->code_rate_HP != FEC_7_8) + return -EINVAL; + + if (p->hierarchy_information != HIERARCHY_NONE && + (p->code_rate_LP != FEC_1_2 && p->code_rate_LP != FEC_2_3 && + p->code_rate_LP != FEC_3_4 && p->code_rate_LP != FEC_5_6 && + p->code_rate_LP != FEC_7_8)) + return -EINVAL; + + if (p->constellation != QPSK && p->constellation != QAM_16 && + p->constellation != QAM_64) + return -EINVAL; + + if (p->transmission_mode != TRANSMISSION_MODE_2K && + p->transmission_mode != TRANSMISSION_MODE_8K) + return -EINVAL; + + if (p->guard_interval < GUARD_INTERVAL_1_32 || + p->guard_interval > GUARD_INTERVAL_1_4) + return -EINVAL; + + if (p->hierarchy_information < HIERARCHY_NONE || + p->hierarchy_information > HIERARCHY_4) + return -EINVAL; + + ddfs_offset_fixed = 0x4000-(ppm<<16)/bw_tab[p->bandwidth]/1000000; + + /* This works up to 20000 ppm, it overflows if too large ppm! */ + init_freq = (((8UL<<25) + (8UL<<19) / 25*ppm / (15625/25)) / + bw_tab[p->bandwidth] & 0xFFFFFF); + + /* SPI bias calculation is slightly modified to fit in 32bit */ + /* will work for high ppm only... */ + spi_bias = 378 * (1 << 10); + spi_bias *= 16; + spi_bias *= bw_tab[p->bandwidth]; + spi_bias *= qam_tab[p->constellation]; + spi_bias /= p->code_rate_HP + 1; + spi_bias /= (guard_tab[p->guard_interval] + 32); + spi_bias *= 1000ULL; + spi_bias /= 1000ULL + ppm/1000; + spi_bias *= p->code_rate_HP; + + val0x04 = (p->transmission_mode << 2) | p->guard_interval; + val0x05 = fec_tab[p->code_rate_HP]; + if (p->hierarchy_information != HIERARCHY_NONE) + val0x05 |= (p->code_rate_LP - FEC_1_2) << 3; + + val0x06 = (p->hierarchy_information << 2) | p->constellation; + + l64781_writereg (i2c, 0x04, val0x04); + l64781_writereg (i2c, 0x05, val0x05); + l64781_writereg (i2c, 0x06, val0x06); + + reset_afc (i2c); + + /* Technical manual section 2.6.1, TIM_IIR_GAIN optimal values */ + l64781_writereg (i2c, 0x15, + p->transmission_mode == TRANSMISSION_MODE_2K ? 1 : 3); + l64781_writereg (i2c, 0x16, init_freq & 0xff); + l64781_writereg (i2c, 0x17, (init_freq >> 8) & 0xff); + l64781_writereg (i2c, 0x18, (init_freq >> 16) & 0xff); + + l64781_writereg (i2c, 0x1b, spi_bias & 0xff); + l64781_writereg (i2c, 0x1c, (spi_bias >> 8) & 0xff); + l64781_writereg (i2c, 0x1d, ((spi_bias >> 16) & 0x7f) | + (param->inversion == INVERSION_ON ? 0x80 : 0x00)); + + l64781_writereg (i2c, 0x22, ddfs_offset_fixed & 0xff); + l64781_writereg (i2c, 0x23, (ddfs_offset_fixed >> 8) & 0x3f); + + l64781_readreg (i2c, 0x00); /* clear interrupt registers... */ + l64781_readreg (i2c, 0x01); /* dto. */ + + apply_tps (i2c); + + return 0; +} + + +static +void reset_and_configure (struct dvb_i2c_bus *i2c) +{ + u8 buf [] = { 0x06 }; + struct i2c_msg msg = { addr: 0x00, flags: 0, buf: buf, len: 1 }; + + i2c->xfer (i2c, &msg, 1); +} + + + +static +int init (struct dvb_i2c_bus *i2c) +{ + reset_and_configure (i2c); + + /* Power up */ + l64781_writereg (i2c, 0x3e, 0xa5); + + /* Reset hard */ + l64781_writereg (i2c, 0x2a, 0x04); + l64781_writereg (i2c, 0x2a, 0x00); + + /* Set tuner specific things */ + /* AFC_POL, set also in reset_afc */ + l64781_writereg (i2c, 0x07, 0x8e); + + /* Use internal ADC */ + l64781_writereg (i2c, 0x0b, 0x81); + + /* AGC loop gain, and polarity is positive */ + l64781_writereg (i2c, 0x0c, 0x84); + + /* Internal ADC outputs two's complement */ + l64781_writereg (i2c, 0x0d, 0x8c); + + /* With ppm=8000, it seems the DTR_SENSITIVITY will result in + value of 2 with all possible bandwidths and guard + intervals, which is the initial value anyway. */ + /*l64781_writereg (i2c, 0x19, 0x92);*/ + + /* Everything is two's complement, soft bit and CSI_OUT too */ + l64781_writereg (i2c, 0x1e, 0x49); + + return 0; +} + + +static +int grundig_29504_401_ioctl (struct dvb_frontend *fe, + unsigned int cmd, void *arg) +{ + struct dvb_i2c_bus *i2c = fe->i2c; + switch (cmd) { + case FE_GET_INFO: + memcpy (arg, &grundig_29504_401_info, + sizeof(struct dvb_frontend_info)); + break; + + case FE_READ_STATUS: + { + fe_status_t *status = (fe_status_t *) arg; + int sync = l64781_readreg (i2c, 0x32); + int gain = l64781_readreg (i2c, 0x0e); + + l64781_readreg (i2c, 0x00); /* clear interrupt registers... */ + l64781_readreg (i2c, 0x01); /* dto. */ + + *status = 0; + + if (gain > 5) + *status |= FE_HAS_SIGNAL; + + if (sync & 0x02) /* VCXO locked, this criteria should be ok */ + *status |= FE_HAS_CARRIER; + + if (sync & 0x20) + *status |= FE_HAS_VITERBI; + + if (sync & 0x40) + *status |= FE_HAS_SYNC; + + if (sync == 0x7f) + *status |= FE_HAS_LOCK; + + break; + } + + case FE_READ_BER: + { + /* XXX FIXME: set up counting period (reg 0x26...0x28) + */ + u32 *ber = (u32 *) arg; + *ber = l64781_readreg (i2c, 0x39) + | (l64781_readreg (i2c, 0x3a) << 8); + break; + } + + case FE_READ_SIGNAL_STRENGTH: + { + u8 gain = l64781_readreg (i2c, 0x0e); + *(u16 *) arg = (gain << 8) | gain; + break; + } + + case FE_READ_SNR: + { + u16 *snr = (u16 *) arg; + u8 avg_quality = 0xff - l64781_readreg (i2c, 0x33); + *snr = (avg_quality << 8) | avg_quality; /* not exact, but...*/ + break; + } + + case FE_READ_UNCORRECTED_BLOCKS: + { + u32 *ub = (u32 *) arg; + *ub = l64781_readreg (i2c, 0x37) + | (l64781_readreg (i2c, 0x38) << 8); + break; + } + + case FE_SET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + + tsa5060_set_tv_freq (i2c, p->frequency, 3); + apply_frontend_param (i2c, p); +// tsa5060_set_tv_freq (i2c, p->frequency, 0); + } + case FE_GET_FRONTEND: + /* we could correct the frequency here, but... + * (...do you want to implement this?;) + */ + return 0; + + case FE_SLEEP: + /* Power down */ + return l64781_writereg (i2c, 0x3e, 0x5a); + + case FE_INIT: + return init (i2c); + + case FE_RESET: + //reset_afc (i2c); + apply_tps (i2c); + l64781_readreg (i2c, 0x00); /* clear interrupt registers... */ + l64781_readreg (i2c, 0x01); /* dto. */ + break; + + default: + dprintk ("%s: unknown command !!!\n", __FUNCTION__); + return -EINVAL; + }; + + return 0; +} + + +static +int l64781_attach (struct dvb_i2c_bus *i2c) +{ + u8 b0 [] = { 0x1a }; + u8 b1 [] = { 0x00 }; + struct i2c_msg msg [] = { { addr: 0x55, flags: 0, buf: b0, len: 1 }, + { addr: 0x55, flags: I2C_M_RD, buf: b1, len: 1 } }; + + if (i2c->xfer (i2c, msg, 2) == 2) /* probably an EEPROM... */ + return -ENODEV; + + reset_and_configure (i2c); + + if (i2c->xfer (i2c, msg, 2) != 2) /* nothing... */ + return -ENODEV; + + if (b1[0] != 0xa1) + return -ENODEV; + + dvb_register_frontend (grundig_29504_401_ioctl, i2c, NULL, + &grundig_29504_401_info); + return 0; +} + + +static +void l64781_detach (struct dvb_i2c_bus *i2c) +{ + dvb_unregister_frontend (grundig_29504_401_ioctl, i2c); +} + + +static +int __init init_grundig_29504_401 (void) +{ + return dvb_register_i2c_device (THIS_MODULE, + l64781_attach, l64781_detach); +} + + +static +void __exit exit_grundig_29504_401 (void) +{ + dvb_unregister_i2c_device (l64781_attach); +} + +module_init(init_grundig_29504_401); +module_exit(exit_grundig_29504_401); + +MODULE_PARM(debug,"i"); +MODULE_PARM_DESC(debug, "enable verbose debug messages"); +MODULE_DESCRIPTION("Grundig 29504-401 DVB-T Frontend"); +MODULE_AUTHOR("Holger Waechtler, Marko Kohtala"); +MODULE_LICENSE("GPL"); + diff -Nru a/drivers/media/dvb/frontends/grundig_29504-491.c b/drivers/media/dvb/frontends/grundig_29504-491.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/frontends/grundig_29504-491.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,496 @@ +/* + Driver for Grundig 29504-491, a Philips TDA8083 based QPSK Frontend + + Copyright (C) 2001 Convergence Integrated Media GmbH + + written by Ralph Metzler + + adoption to the new DVB frontend API and diagnostic ioctl's + by Holger Waechtler + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include + +#include "compat.h" +#include "dvb_frontend.h" + +static int debug = 0; +#define dprintk if (debug) printk + + +static +struct dvb_frontend_info grundig_29504_491_info = { + name: "Grundig 29504-491, (TDA8083 based)", + type: FE_QPSK, + frequency_min: 950000, /* FIXME: guessed! */ + frequency_max: 1400000, /* FIXME: guessed! */ + frequency_stepsize: 125, /* kHz for QPSK frontends */ +/* frequency_tolerance: ???,*/ + symbol_rate_min: 1000000, /* FIXME: guessed! */ + symbol_rate_max: 45000000, /* FIXME: guessed! */ +/* symbol_rate_tolerance: ???,*/ + notifier_delay: 0, + caps: FE_CAN_INVERSION_AUTO | + FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | + FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 | + FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO | + FE_CAN_QPSK | + FE_CAN_MUTE_TS +}; + + + +static +u8 tda8083_init_tab [] = { + 0x04, 0x00, 0x4a, 0x79, 0x04, 0x00, 0xff, 0xea, + 0x48, 0x42, 0x79, 0x60, 0x70, 0x52, 0x9a, 0x10, + 0x0e, 0x10, 0xf2, 0xa7, 0x93, 0x0b, 0x05, 0xc8, + 0x9d, 0x00, 0x42, 0x80, 0x00, 0x60, 0x40, 0x00, + 0x00, 0x75, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + + + +static +int tda8083_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data) +{ + int ret; + u8 buf [] = { reg, data }; + struct i2c_msg msg = { addr: 0x68, flags: 0, buf: buf, len: 2 }; + + ret = i2c->xfer (i2c, &msg, 1); + + if (ret != 1) + dprintk ("%s: writereg error (reg %02x, ret == %i)\n", + __FUNCTION__, reg, ret); + + return (ret != 1) ? -1 : 0; +} + + +static +int tda8083_readregs (struct dvb_i2c_bus *i2c, u8 reg1, u8 *b, u8 len) +{ + int ret; + struct i2c_msg msg [] = { { addr: 0x68, flags: 0, buf: ®1, len: 1 }, + { addr: 0x68, flags: I2C_M_RD, buf: b, len: len } }; + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk ("%s: readreg error (reg %02x, ret == %i)\n", + __FUNCTION__, reg1, ret); + + return ret == 2 ? 0 : -1; +} + + +static inline +u8 tda8083_readreg (struct dvb_i2c_bus *i2c, u8 reg) +{ + u8 val; + + tda8083_readregs (i2c, reg, &val, 1); + + return val; +} + + +static +int tsa5522_write (struct dvb_i2c_bus *i2c, u8 data [4]) +{ + int ret; + struct i2c_msg msg = { addr: 0x61, flags: 0, buf: data, len: 4 }; + + ret = i2c->xfer (i2c, &msg, 1); + + if (ret != 1) + dprintk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret); + + return (ret != 1) ? -1 : 0; +} + + +/** + * set up the downconverter frequency divisor for a + * reference clock comparision frequency of 125 kHz. + */ +static +int tsa5522_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq) +{ + u32 div = freq / 125; + u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, 0x8e, 0x00 }; + + return tsa5522_write (i2c, buf); +} + + +static int +tda8083_init (struct dvb_i2c_bus *i2c) +{ + int i; + + dprintk("%s: init TDA8083\n", __FILE__); + + for (i=0; i<44; i++) + tda8083_writereg (i2c, i, tda8083_init_tab[i]); + + return 0; +} + + +static int +tda8083_set_inversion (struct dvb_i2c_bus *i2c, fe_spectral_inversion_t inversion) +{ + /* XXX FIXME: implement other modes than FEC_AUTO */ + if (inversion == INVERSION_AUTO) + return 0; + + return -EINVAL; +} + + +static int +tda8083_set_fec (struct dvb_i2c_bus *i2c, fe_code_rate_t fec) +{ + if (fec == FEC_AUTO) + return tda8083_writereg (i2c, 0x07, 0xff); + + if (fec >= FEC_1_2 && fec <= FEC_8_9) + return tda8083_writereg (i2c, 0x07, 1 << (FEC_8_9 - fec)); + + return -EINVAL; +} + + +static +fe_code_rate_t tda8083_get_fec (struct dvb_i2c_bus *i2c) +{ + u8 index; + static fe_code_rate_t fec_tab [] = { FEC_8_9, FEC_1_2, FEC_2_3, FEC_3_4, + FEC_4_5, FEC_5_6, FEC_6_7, FEC_7_8 }; + + index = tda8083_readreg (i2c, 0x0e) & 0x3; + + if (index > 7) + return FEC_NONE; + + return fec_tab [index]; +} + + +static +int tda8083_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate) +{ + u32 ratio; + u32 tmp; + u8 filter; + + if (srate > 32000000) + srate = 32000000; + if (srate < 500000) + srate = 500000; + + filter = 0; + if (srate < 24000000) + filter = 2; + if (srate < 16000000) + filter = 3; + + tmp = 31250 << 16; + ratio = tmp / srate; + + tmp = (tmp % srate) << 8; + ratio = (ratio << 8) + tmp / srate; + + tmp = (tmp % srate) << 8; + ratio = (ratio << 8) + tmp / srate; + + dprintk("tda8083: ratio == %08x\n", ratio); + + tda8083_writereg (i2c, 0x05, filter); + tda8083_writereg (i2c, 0x02, (ratio >> 16) & 0xff); + tda8083_writereg (i2c, 0x03, (ratio >> 8) & 0xff); + tda8083_writereg (i2c, 0x04, (ratio ) & 0xff); + + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + + return 1; +} + + +static +void tda8083_wait_diseqc_fifo (struct dvb_i2c_bus *i2c, int timeout) +{ + unsigned long start = jiffies; + + while (jiffies - start < timeout && + !(tda8083_readreg(i2c, 0x02) & 0x80)) + { + current->state = TASK_INTERRUPTIBLE; + schedule_timeout (5); + }; +} + + +static +int tda8083_send_diseqc_msg (struct dvb_i2c_bus *i2c, + struct dvb_diseqc_master_cmd *m) +{ + int i; + + tda8083_writereg (i2c, 0x29, (m->msg_len - 3) | (1 << 2)); /* enable */ + + for (i=0; imsg_len; i++) + tda8083_writereg (i2c, 0x23 + i, m->msg[i]); + + tda8083_writereg (i2c, 0x29, (m->msg_len - 3) | (3 << 2)); /* send!! */ + + tda8083_wait_diseqc_fifo (i2c, 100); + + return 0; +} + + +static +int tda8083_send_diseqc_burst (struct dvb_i2c_bus *i2c, fe_sec_mini_cmd_t burst) +{ + switch (burst) { + case SEC_MINI_A: + tda8083_writereg (i2c, 0x29, (5 << 2)); /* send burst A */ + break; + case SEC_MINI_B: + tda8083_writereg (i2c, 0x29, (7 << 2)); /* send B */ + break; + default: + return -EINVAL; + }; + + tda8083_wait_diseqc_fifo (i2c, 100); + + return 0; +} + + +static +int tda8083_set_tone (struct dvb_i2c_bus *i2c, fe_sec_tone_mode_t tone) +{ + tda8083_writereg (i2c, 0x26, 0xf1); + + switch (tone) { + case SEC_TONE_OFF: + return tda8083_writereg (i2c, 0x29, 0x00); + case SEC_TONE_ON: + return tda8083_writereg (i2c, 0x29, 0x80); + default: + return -EINVAL; + }; +} + + +static +int tda8083_set_voltage (struct dvb_i2c_bus *i2c, fe_sec_voltage_t voltage) +{ + switch (voltage) { + case SEC_VOLTAGE_13: + return tda8083_writereg (i2c, 0x20, 0x00); + case SEC_VOLTAGE_18: + return tda8083_writereg (i2c, 0x20, 0x11); + default: + return -EINVAL; + }; +} + + +static +int grundig_29504_491_ioctl (struct dvb_frontend *fe, unsigned int cmd, + void *arg) +{ + struct dvb_i2c_bus *i2c = fe->i2c; + + switch (cmd) { + case FE_GET_INFO: + memcpy (arg, &grundig_29504_491_info, + sizeof(struct dvb_frontend_info)); + break; + + case FE_READ_STATUS: + { + fe_status_t *status=(fe_status_t *) arg; + u8 signal = ~tda8083_readreg (i2c, 0x01); + u8 sync = tda8083_readreg (i2c, 0x02); + + *status = 0; + + if (signal > 10) + *status |= FE_HAS_SIGNAL; + + if (sync & 0x01) + *status |= FE_HAS_CARRIER; + + if (sync & 0x02) + *status |= FE_HAS_VITERBI; + + if (sync & 0x10) + *status |= FE_HAS_SYNC; + + if ((sync & 0x1f) == 0x1f) + *status |= FE_HAS_LOCK; + + break; + } + + case FE_READ_BER: + *((u32*) arg) = 0; /* XXX FIXME: implement me!!! */ + return -EOPNOTSUPP; + + case FE_READ_SIGNAL_STRENGTH: + { + u8 signal = ~tda8083_readreg (i2c, 0x01); + *((u16*) arg) = (signal << 8) | signal; + break; + } + case FE_READ_SNR: + { + u8 snr = tda8083_readreg (i2c, 0x08); + *((u16*) arg) = (snr << 8) | snr; + break; + } + case FE_READ_UNCORRECTED_BLOCKS: + *((u32*) arg) = 0; /* XXX FIXME: implement me!!! */ + return -EOPNOTSUPP; + + + case FE_SET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + + tsa5522_set_tv_freq (i2c, p->frequency); + tda8083_set_inversion (i2c, p->inversion); + tda8083_set_fec (i2c, p->u.qpsk.fec_inner); + tda8083_set_symbolrate (i2c, p->u.qpsk.symbol_rate); + + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + + break; + } + + case FE_GET_FRONTEND: + { + struct dvb_frontend_parameters *p = arg; + + /* FIXME: get symbolrate & frequency offset...*/ + /*p->frequency = ???;*/ + p->inversion = (tda8083_readreg (i2c, 0x0e) & 0x80) ? + INVERSION_ON : INVERSION_OFF; + p->u.qpsk.fec_inner = tda8083_get_fec (i2c); + /*p->u.qpsk.symbol_rate = tda8083_get_symbolrate (i2c);*/ + break; + } + + case FE_SLEEP: + tda8083_writereg (i2c, 0x00, 0x02); + break; + + case FE_INIT: + tda8083_init (i2c); + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + break; + + case FE_RESET: + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + break; + + case FE_DISEQC_SEND_MASTER_CMD: + return tda8083_send_diseqc_msg (i2c, arg); + + case FE_DISEQC_SEND_BURST: + tda8083_send_diseqc_burst (i2c, (fe_sec_mini_cmd_t) arg); + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + + break; + + case FE_SET_TONE: + tda8083_set_tone (i2c, (fe_sec_tone_mode_t) arg); + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + break; + + case FE_SET_VOLTAGE: + tda8083_set_voltage (i2c, (fe_sec_voltage_t) arg); + tda8083_writereg (i2c, 0x00, 0x3c); + tda8083_writereg (i2c, 0x00, 0x04); + break; + + default: + return -EOPNOTSUPP; + }; + + return 0; +} + + +static +int tda8083_attach (struct dvb_i2c_bus *i2c) +{ + if ((tda8083_readreg (i2c, 0x00)) != 0x05) + return -ENODEV; + + dvb_register_frontend (grundig_29504_491_ioctl, i2c, NULL, + &grundig_29504_491_info); + + return 0; +} + + +static +void tda8083_detach (struct dvb_i2c_bus *i2c) +{ + dvb_unregister_frontend (grundig_29504_491_ioctl, i2c); +} + + +static +int __init init_tda8083 (void) +{ + return dvb_register_i2c_device (THIS_MODULE, + tda8083_attach, tda8083_detach); +} + + +static +void __exit exit_tda8083 (void) +{ + dvb_unregister_i2c_device (tda8083_attach); +} + +module_init(init_tda8083); +module_exit(exit_tda8083); + +MODULE_PARM(debug,"i"); +MODULE_DESCRIPTION("Grundig 29504-491 DVB frontend driver"); +MODULE_AUTHOR("Ralph Metzler, Holger Waechtler"); +MODULE_LICENSE("GPL"); + diff -Nru a/drivers/media/dvb/frontends/ves1820.c b/drivers/media/dvb/frontends/ves1820.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/frontends/ves1820.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,537 @@ +/* + VES1820 - Single Chip Cable Channel Receiver driver module + used on the the Siemens DVB-C cards + + Copyright (C) 1999 Convergence Integrated Media GmbH + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include +#include + +#include "compat.h" +#include "dvb_frontend.h" + + +static int debug = 0; +#define dprintk if (debug) printk + + +/** + * since we need only a few bits to store internal state we don't allocate + * extra memory but use frontend->data as bitfield + */ + +#define SET_PWM(frontend,pwm) do { \ + (int) frontend->data &= ~0xff; \ + (int) frontend->data |= pwm; \ +} while (0) + +#define SET_REG0(frontend,reg0) do { \ + (int) frontend->data &= ~(0xff << 8); \ + (int) frontend->data |= reg0 << 8; \ +} while (0) + +#define SET_TUNER(frontend,type) do { \ + (int) frontend->data &= ~(0xff << 16); \ + (int) frontend->data |= type << 16; \ +} while (0) + +#define GET_PWM(frontend) ((u8) ((int) frontend->data & 0xff)) +#define GET_REG0(frontend) ((u8) (((int) frontend->data >> 8) & 0xff)) +#define GET_TUNER(frontend) ((u8) (((int) frontend->data >> 16) & 0xff)) + + + +static +struct dvb_frontend_info ves1820_info = { + name: "VES1820/Grundig tuner as used on the Siemens DVB-C card", + type: FE_QAM, + frequency_stepsize: 62500, + frequency_min: 51000000, + frequency_max: 858000000, +#if 0 + frequency_tolerance: ???, + symbol_rate_min: ???, + symbol_rate_max: ???, + symbol_rate_tolerance: ???, /* ppm */ /* == 8% (spec p. 5) */ + notifier_delay: ?, +#endif + caps: FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 | + FE_CAN_QAM_128 | FE_CAN_QAM_256 +}; + + + +static +u8 ves1820_inittab [] = +{ + 0x69, 0x6A, 0x9B, 0x0A, 0x52, 0x46, 0x26, 0x1A, + 0x43, 0x6A, 0xAA, 0xAA, 0x1E, 0x85, 0x43, 0x28, + 0xE0, 0x00, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40 +}; + + +static +int ves1820_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data) +{ + int ret; + u8 buf[] = { 0x00, reg, data }; + struct i2c_msg msg = { addr: 0x09, flags: 0, buf: buf, len: 3 }; + + ret = i2c->xfer (i2c, &msg, 1); + + if (ret != 1) + dprintk("%s: writereg error " + "(reg == 0x%02x, val == 0x%02x, ret == %i)\n", + __FUNCTION__, reg, data, ret); + + mdelay(10); + return (ret != 1) ? -EREMOTEIO : 0; +} + + +static +u8 ves1820_readreg (struct dvb_i2c_bus *i2c, u8 reg) +{ + int ret; + u8 b0 [] = { 0x00, reg }; + u8 b1 [] = { 0 }; + struct i2c_msg msg [] = { { addr: 0x09, flags: 0, buf: b0, len: 2 }, + { addr: 0x09, flags: I2C_M_RD, buf: b1, len: 1 } }; + + + ret = i2c->xfer (i2c, msg, 2); + + if (ret != 2) + dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); + + return b1[0]; +} + + +static +int tuner_write (struct dvb_i2c_bus *i2c, u8 addr, u8 data [4]) +{ + int ret; + struct i2c_msg msg = { addr: addr, flags: 0, buf: data, len: 4 }; + + ret = i2c->xfer (i2c, &msg, 1); + + if (ret != 1) + printk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret); + + return (ret != 1) ? -EREMOTEIO : 0; +} + + +/** + * set up the downconverter frequency divisor for a + * reference clock comparision frequency of 62.5 kHz. + */ +static +int tuner_set_tv_freq (struct dvb_frontend *frontend, u32 freq) +{ + u32 div; + static u8 addr [] = { 0x61, 0x62 }; + static u8 byte3 [] = { 0x8e, 0x85 }; + int tuner_type = GET_TUNER(frontend); + u8 buf [4]; + + div = (freq + 36250000 + 31250) / 62500; + buf[0] = (div >> 8) & 0x7f; + buf[1] = div & 0xff; + buf[2] = byte3[tuner_type]; + + if (tuner_type == 1) { + buf[2] |= (div >> 10) & 0x60; + buf[3] = (freq < 174000000 ? 0x88 : + freq < 470000000 ? 0x84 : 0x81); + } else { + buf[3] = (freq < 174000000 ? 0xa1 : + freq < 454000000 ? 0x92 : 0x34); + } + + return tuner_write (frontend->i2c, addr[tuner_type], buf); +} + + +static +int probe_tuner (struct dvb_frontend *frontend) +{ + struct dvb_i2c_bus *i2c = frontend->i2c; + struct i2c_msg msg = { addr: 0x61, flags: 0, buf: NULL, len: 0 }; + + if (i2c->xfer(i2c, &msg, 1) == 1) { + SET_TUNER(frontend,0); + printk ("%s: setup for tuner spXXXX\n", __FILE__); + } else { + SET_TUNER(frontend,1); + printk ("%s: setup for tuner sp5659c\n", __FILE__); + } + + return 0; +} + + +static +int ves1820_init (struct dvb_frontend *frontend) +{ + struct dvb_i2c_bus *i2c = frontend->i2c; + u8 b0 [] = { 0xff }; + u8 pwm; + int i; + struct i2c_msg msg [] = { { addr: 0x28, flags: 0, buf: b0, len: 1 }, + { addr: 0x28, flags: I2C_M_RD, buf: &pwm, len: 1 } }; + + dprintk("VES1820: init chip\n"); + + i2c->xfer (i2c, msg, 2); + + dprintk("VES1820: pwm=%02x\n", pwm); + + if (pwm == 0xff) + pwm=0x48; + + ves1820_writereg (i2c, 0, 0); + + for (i=0; i<53; i++) + ves1820_writereg (i2c, i, ves1820_inittab[i]); + + ves1820_writereg (i2c, 0x34, pwm); + + (int) frontend->data = 0; + SET_PWM(frontend,pwm); + + probe_tuner (frontend); + + return 0; +} + + +static +int ves1820_setup_reg0 (struct dvb_frontend *frontend, + u8 real_qam, fe_spectral_inversion_t inversion) +{ + struct dvb_i2c_bus *i2c = frontend->i2c; + u8 reg0 = (ves1820_inittab[0] & 0xe3) | (real_qam << 2); + + switch (inversion) { + case INVERSION_OFF: /* XXX FIXME: reversed?? p. 25 */ + reg0 |= 0x20; + break; + + case INVERSION_ON: + reg0 &= 0xdf; + break; + + default: + return -EINVAL; + } + + SET_REG0(frontend, reg0); + + ves1820_writereg (i2c, 0x00, reg0 & 0xfe); + ves1820_writereg (i2c, 0x00, reg0); + + return 0; +} + + +static +int ves1820_reset (struct dvb_frontend *frontend) +{ + struct dvb_i2c_bus *i2c = frontend->i2c; + u8 reg0 = GET_REG0(frontend); + + ves1820_writereg (i2c, 0x00, reg0 & 0xfe); + ves1820_writereg (i2c, 0x00, reg0); + + return 0; +} + + +static +void ves1820_reset_uncorrected_block_counter (struct dvb_i2c_bus *i2c) +{ + ves1820_writereg (i2c, 0x10, ves1820_inittab[0x10] & 0xdf); + ves1820_writereg (i2c, 0x10, ves1820_inittab[0x10]); +} + + +static +int ves1820_set_symbolrate (struct dvb_i2c_bus *i2c, u32 symbolrate) +{ + s32 BDR; + s32 BDRI; + s16 SFIL=0; + u16 NDEC = 0; + u32 tmp, ratio; + +#define XIN 57840000UL +#define FIN (57840000UL>>4) + + if (symbolrate > XIN/2) + symbolrate = XIN/2; + + if (symbolrate < 500000) + symbolrate = 500000; + + if (symbolrate < XIN/16) NDEC = 1; + if (symbolrate < XIN/32) NDEC = 2; + if (symbolrate < XIN/64) NDEC = 3; + + if (symbolrate < (u32)(XIN/12.3)) SFIL = 1; + if (symbolrate < (u32)(XIN/16)) SFIL = 0; + if (symbolrate < (u32)(XIN/24.6)) SFIL = 1; + if (symbolrate < (u32)(XIN/32)) SFIL = 0; + if (symbolrate < (u32)(XIN/49.2)) SFIL = 1; + if (symbolrate < (u32)(XIN/64)) SFIL = 0; + if (symbolrate < (u32)(XIN/98.4)) SFIL = 1; + + symbolrate <<= NDEC; + ratio = (symbolrate << 4) / FIN; + tmp = ((symbolrate << 4) % FIN) << 8; + ratio = (ratio << 8) + tmp / FIN; + tmp = (tmp % FIN) << 8; + ratio = (ratio << 8) + (tmp + FIN/2) / FIN; + + BDR = ratio; + BDRI = (((XIN << 5) / symbolrate) + 1) / 2; + + if (BDRI > 0xFF) + BDRI = 0xFF; + + SFIL = (SFIL << 4) | ves1820_inittab[0x0E]; + + NDEC = (NDEC << 6) | ves1820_inittab[0x03]; + + ves1820_writereg (i2c, 0x03, NDEC); + ves1820_writereg (i2c, 0x0a, BDR&0xff); + ves1820_writereg (i2c, 0x0b, (BDR>> 8)&0xff); + ves1820_writereg (i2c, 0x0c, (BDR>>16)&0x3f); + + ves1820_writereg (i2c, 0x0d, BDRI); + ves1820_writereg (i2c, 0x0e, SFIL); + + return 0; +} + + +static +void ves1820_reset_pwm (struct dvb_frontend *frontend) +{ + u8 pwm = GET_PWM(frontend); + + ves1820_writereg (frontend->i2c, 0x34, pwm); +} + + +typedef struct { + fe_modulation_t QAM_Mode; + int NoOfSym; + u8 Reg1; + u8 Reg5; + u8 Reg8; + u8 Reg9; +} QAM_SETTING; + + +QAM_SETTING QAM_Values[] = { + { QAM_16, 16, 140, 164, 162, 145 }, + { QAM_32, 32, 140, 120, 116, 150 }, + { QAM_64, 64, 106, 70, 67, 106 }, + { QAM_128, 128, 120, 54, 52, 126 }, + { QAM_256, 256, 92, 38, 35, 107 } +}; + + +static +int ves1820_set_parameters (struct dvb_frontend *frontend, + struct dvb_frontend_parameters *p) +{ + struct dvb_i2c_bus* i2c = frontend->i2c; + int real_qam; + + switch (p->u.qam.modulation) { + case QAM_16 : real_qam = 0; break; + case QAM_32 : real_qam = 1; break; + case QAM_64 : real_qam = 2; break; + case QAM_128: real_qam = 3; break; + case QAM_256: real_qam = 4; break; + default: + return -EINVAL; + } + + tuner_set_tv_freq (frontend, p->frequency); + ves1820_set_symbolrate (i2c, p->u.qam.symbol_rate); + ves1820_reset_pwm (frontend); + + ves1820_writereg (i2c, 0x01, QAM_Values[real_qam].Reg1); + ves1820_writereg (i2c, 0x05, QAM_Values[real_qam].Reg5); + ves1820_writereg (i2c, 0x08, QAM_Values[real_qam].Reg8); + ves1820_writereg (i2c, 0x09, QAM_Values[real_qam].Reg9); + + ves1820_setup_reg0 (frontend, real_qam, p->inversion); + + return 0; +} + + + +static +int ves1820_ioctl (struct dvb_frontend *frontend, unsigned int cmd, void *arg) +{ + switch (cmd) { + case FE_GET_INFO: + memcpy (arg, &ves1820_info, sizeof(struct dvb_frontend_info)); + break; + + case FE_READ_STATUS: + { + fe_status_t *status = (fe_status_t *) arg; + int sync; + + *status = 0; + + sync = ves1820_readreg (frontend->i2c, 0x11); + + if (sync & 2) + *status |= FE_HAS_SIGNAL; + + if (sync & 2) + *status |= FE_HAS_CARRIER; + + if (sync & 2) /* XXX FIXME! */ + *status |= FE_HAS_VITERBI; + + if (sync & 4) + *status |= FE_HAS_SYNC; + + if (sync & 8) + *status |= FE_HAS_LOCK; + + break; + } + + case FE_READ_BER: + *((u32*) arg) = ves1820_readreg(frontend->i2c, 0x14) | + (ves1820_readreg(frontend->i2c, 0x15) << 8) | + (ves1820_readreg(frontend->i2c, 0x16) << 16); + /* XXX FIXME: scale!!*/ + break; + + case FE_READ_SIGNAL_STRENGTH: + { + u8 gain = ves1820_readreg(frontend->i2c, 0x17); + *((u16*) arg) = (gain << 8) | gain; + break; + } + + case FE_READ_SNR: + { + u8 quality = ~ves1820_readreg(frontend->i2c, 0x18); + *((u16*) arg) = (quality << 8) | quality; + break; + } + + case FE_READ_UNCORRECTED_BLOCKS: + *((u32*) arg) = ves1820_readreg (frontend->i2c, 0x13) & 0x7f; + if (*((u32*) arg) == 0x7f) + *((u32*) arg) = 0xffffffff; + ves1820_reset_uncorrected_block_counter (frontend->i2c); + break; + + case FE_SET_FRONTEND: + return ves1820_set_parameters (frontend, arg); + + case FE_GET_FRONTEND: + /* XXX FIXME: implement! */ +/* + struct frontend *front = (struct frontend *)arg; + + front->afc=(int)((char)(readreg(client,0x19))); + front->afc=(front->afc*(int)(front->param.u.qam.SymbolRate/8))/128; +*/ + break; + + case FE_SLEEP: + ves1820_writereg (frontend->i2c, 0x1b, 0x02); /* pdown ADC */ + ves1820_writereg (frontend->i2c, 0x00, 0x80); /* standby */ + break; + + case FE_INIT: + return ves1820_init (frontend); + + case FE_RESET: + ves1820_reset (frontend); + break; + + default: + return -EINVAL; + } + + return 0; +} + + +static +int ves1820_attach (struct dvb_i2c_bus *i2c) +{ + if ((ves1820_readreg (i2c, 0x1a) & 0xf0) != 0x70) + return -ENODEV; + + dvb_register_frontend (ves1820_ioctl, i2c, NULL, &ves1820_info); + + return 0; +} + + +static +void ves1820_detach (struct dvb_i2c_bus *i2c) +{ + dvb_unregister_frontend (ves1820_ioctl, i2c); +} + + +static +int __init init_ves1820 (void) +{ + return dvb_register_i2c_device (THIS_MODULE, + ves1820_attach, ves1820_detach); +} + + +static +void __exit exit_ves1820 (void) +{ + dvb_unregister_i2c_device (ves1820_attach); +} + + +module_init(init_ves1820); +module_exit(exit_ves1820); + +MODULE_DESCRIPTION(""); +MODULE_AUTHOR("Ralph Metzler"); +MODULE_LICENSE("GPL"); +MODULE_PARM(debug,"i"); + diff -Nru a/drivers/media/video/adv7175.c b/drivers/media/video/adv7175.c --- a/drivers/media/video/adv7175.c Mon Oct 28 16:32:37 2002 +++ b/drivers/media/video/adv7175.c Mon Oct 28 16:32:37 2002 @@ -45,7 +45,7 @@ #include #include -#include +#include #include @@ -55,28 +55,15 @@ #define DEBUG(x...) #endif -/* ----------------------------------------------------------------------- */ - -struct adv7175 { - struct i2c_bus *bus; - int addr; - unsigned char reg[128]; - - int norm; - int input; - int enable; - int bright; - int contrast; - int hue; - int sat; -}; +#define I2C_ADV7175 0xd4 +#define I2C_ADV7176 0x54 -#define I2C_ADV7175 0xd4 -#define I2C_ADV7176 0x54 +#define IF_NAME "adv7175" static char adv7175_name[] = "adv7175"; static char adv7176_name[] = "adv7176"; static char unknown_name[] = "UNKNOWN"; +char *dname; #if (DEBUGLEVEL > 0) static char *inputs[] = { "pass_through", "play_back", "color_bar" }; @@ -85,64 +72,34 @@ #define I2C_DELAY 10 -/* ----------------------------------------------------------------------- */ - -static int adv7175_write(struct adv7175 *dev, unsigned char subaddr, unsigned char data) -{ - int ack; - - LOCK_I2C_BUS(dev->bus); - - i2c_start(dev->bus); - i2c_sendbyte(dev->bus, dev->addr, I2C_DELAY); - i2c_sendbyte(dev->bus, subaddr, I2C_DELAY); - ack = i2c_sendbyte(dev->bus, data, I2C_DELAY); - dev->reg[subaddr] = data; - i2c_stop(dev->bus); - UNLOCK_I2C_BUS(dev->bus); - return ack; -} - -static unsigned char adv7175_read(struct adv7175 *dev, unsigned char subaddr) -{ - unsigned char data; +static unsigned short normal_i2c[] = {I2C_ADV7175, I2C_CLIENT_END}; +static unsigned short normal_i2c_range[] = {I2C_CLIENT_END}; +static unsigned short probe[2] = {I2C_CLIENT_END, I2C_CLIENT_END}; +static unsigned short probe_range[2] = {I2C_CLIENT_END, I2C_CLIENT_END}; +static unsigned short ignore[2] = {I2C_CLIENT_END, I2C_CLIENT_END}; +static unsigned short ignore_range[2] = {I2C_CLIENT_END, I2C_CLIENT_END}; +static unsigned short force[2] = {I2C_CLIENT_END, I2C_CLIENT_END}; + +static struct i2c_client_address_data addr_data = { + normal_i2c, normal_i2c_range, + probe, probe_range, + ignore, ignore_range, + force}; +static struct i2c_client client_template; - LOCK_I2C_BUS(dev->bus); - - i2c_start(dev->bus); - i2c_sendbyte(dev->bus, dev->addr, I2C_DELAY); - i2c_sendbyte(dev->bus, subaddr, I2C_DELAY); - i2c_sendbyte(dev->bus, dev->addr + 1, I2C_DELAY); - data = i2c_readbyte(dev->bus, 1); - dev->reg[subaddr] = data; - i2c_stop(dev->bus); - UNLOCK_I2C_BUS(dev->bus); - return data; -} - -static int adv7175_write_block(struct adv7175 *dev, - unsigned const char *data, unsigned int len) -{ - int ack = 0; - unsigned subaddr; - - while (len > 1) { - LOCK_I2C_BUS(dev->bus); - i2c_start(dev->bus); - i2c_sendbyte(dev->bus, dev->addr, I2C_DELAY); - ack = i2c_sendbyte(dev->bus, (subaddr = *data++), I2C_DELAY); - ack = i2c_sendbyte(dev->bus, (dev->reg[subaddr] = *data++), I2C_DELAY); - len -= 2; - while (len > 1 && *data == ++subaddr) { - data++; - ack = i2c_sendbyte(dev->bus, (dev->reg[subaddr] = *data++), I2C_DELAY); - len -= 2; - } - i2c_stop(dev->bus); - UNLOCK_I2C_BUS(dev->bus); - } - return ack; -} +struct adv7175 { + struct i2c_client *client; + int addr; + unsigned char reg[128]; + struct semaphore lock; + int norm; + int input; + int enable; + int bright; + int contrast; + int hue; + int sat; +}; /* ----------------------------------------------------------------------- */ // Output filter: S-Video Composite @@ -203,65 +160,87 @@ 0x06, 0x1a, /* subc. phase */ }; -static int adv7175_attach(struct i2c_device *device) +static int adv717x_attach(struct i2c_adapter *adap, int addr, unsigned short flags, int kind) { - int i; struct adv7175 *encoder; - char *dname; + struct i2c_client *client; + int rv, i, x_common=39; /* x is number entries init_common - 1 */ - MOD_INC_USE_COUNT; + printk(KERN_INFO "adv717x: video chip found.\n"); + client=kmalloc(sizeof(*client), GFP_KERNEL); + if(client == NULL) + return -ENOMEM; + + client_template.adapter = adap; + client_template.addr = addr; + memcpy(client, &client_template, sizeof(*client)); - device->data = encoder = kmalloc(sizeof(struct adv7175), GFP_KERNEL); + encoder = kmalloc(sizeof(*encoder), GFP_KERNEL); if (encoder == NULL) { - MOD_DEC_USE_COUNT; + kfree(client); return -ENOMEM; } - - memset(encoder, 0, sizeof(struct adv7175)); - if ((device->addr == I2C_ADV7175) || (device->addr == (I2C_ADV7175 + 2))) { + memset(encoder, 0, sizeof(*encoder)); + if ((encoder->addr == I2C_ADV7175) || (encoder->addr == (I2C_ADV7175 + 2))) { dname = adv7175_name; - } else if ((device->addr == I2C_ADV7176) || (device->addr == (I2C_ADV7176 + 2))) { + } else if ((encoder->addr == I2C_ADV7176) || (encoder->addr == (I2C_ADV7176 + 2))) { dname = adv7176_name; } else { // We should never get here!!! dname = unknown_name; } - strcpy(device->name, dname); - encoder->bus = device->bus; - encoder->addr = device->addr; + strcpy(client->name, dname); + init_MUTEX(&encoder->lock); + encoder->client = client; + encoder->addr = addr; encoder->norm = VIDEO_MODE_PAL; encoder->input = 0; encoder->enable = 1; - i = adv7175_write_block(encoder, init_common, sizeof(init_common)); - if (i >= 0) { - i = adv7175_write(encoder, 0x07, TR0MODE | TR0RST); - i = adv7175_write(encoder, 0x07, TR0MODE); - i = adv7175_read(encoder, 0x12); - printk(KERN_INFO "%s_attach: %s rev. %d at 0x%02x\n", - device->name, dname, i & 1, device->addr); + for (i=1; iname, rv); + break; + } } - if (i < 0) { - printk(KERN_ERR "%s_attach: init error %d\n", device->name, - i); + + if (rv >= 0) { + i2c_smbus_write_byte_data(client,0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client,0x07, TR0MODE); + i2c_smbus_read_byte_data(client,0x12); + printk(KERN_INFO "%s_attach: %s rev. %d at 0x%02x\n", + client->name, dname, rv & 1, client->addr); } + i2c_attach_client(client); + return 0; } +static +int adv717x_probe(struct i2c_adapter *adap) +{ + return i2c_probe(adap, &addr_data, adv717x_attach); +} + -static int adv7175_detach(struct i2c_device *device) +static int adv717x_detach(struct i2c_client *client) { - kfree(device->data); - MOD_DEC_USE_COUNT; + i2c_detach_client(client); + kfree(client->data); + kfree(client); return 0; } -static int adv7175_command(struct i2c_device *device, unsigned int cmd, +static int adv717x_command(struct i2c_client *client, unsigned int cmd, void *arg) { - struct adv7175 *encoder = device->data; + struct adv7175 *encoder = client->data; + int i, x_ntsc=13, x_pal=13; + /* x_ntsc is number of entries in init_ntsc -1 */ + /* x_pal is number of entries in init_pal -1 */ switch (cmd) { @@ -286,29 +265,21 @@ switch (iarg) { case VIDEO_MODE_NTSC: - adv7175_write_block(encoder, - init_ntsc, - sizeof - (init_ntsc)); + for (i=1; i< x_ntsc; i++) + i2c_smbus_write_byte(client, init_ntsc[i]); if (encoder->input == 0) - adv7175_write(encoder, 0x0d, 0x4f); // Enable genlock - adv7175_write(encoder, 0x07, - TR0MODE | TR0RST); - adv7175_write(encoder, 0x07, - TR0MODE); + i2c_smbus_write_byte_data(client,0x0d, 0x4f); // Enable genlock + i2c_smbus_write_byte_data(client,0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client,0x07, TR0MODE); break; case VIDEO_MODE_PAL: - adv7175_write_block(encoder, - init_pal, - sizeof - (init_pal)); + for (i=1; i< x_pal; i++) + i2c_smbus_write_byte(client, init_pal[i]); if (encoder->input == 0) - adv7175_write(encoder, 0x0d, 0x4f); // Enable genlock - adv7175_write(encoder, 0x07, - TR0MODE | TR0RST); - adv7175_write(encoder, 0x07, - TR0MODE); + i2c_smbus_write_byte_data(client,0x0d, 0x4f); // Enable genlock + i2c_smbus_write_byte_data(client,0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client,0x07, TR0MODE); break; case VIDEO_MODE_SECAM: // WARNING! ADV7176 does not support SECAM. @@ -316,27 +287,23 @@ // it does not work due to genlock: when decoder // is in SECAM and encoder in in PAL the subcarrier // can not be syncronized with horizontal frequency) - adv7175_write_block(encoder, - init_pal, - sizeof - (init_pal)); + for (i=1; i< x_pal; i++) + i2c_smbus_write_byte(client, init_pal[i]); if (encoder->input == 0) - adv7175_write(encoder, 0x0d, 0x49); // Disable genlock - adv7175_write(encoder, 0x07, - TR0MODE | TR0RST); - adv7175_write(encoder, 0x07, - TR0MODE); + i2c_smbus_write_byte_data(client,0x0d, 0x49); // Disable genlock + i2c_smbus_write_byte_data(client,0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client,0x07, TR0MODE); break; default: printk(KERN_ERR "%s: illegal norm: %d\n", - device->name, iarg); + client->name, iarg); return -EINVAL; } DEBUG(printk (KERN_INFO "%s: switched to %s\n", - device->name, norms[iarg])); + client->name, norms[iarg])); encoder->norm = iarg; } } @@ -354,51 +321,45 @@ switch (iarg) { case 0: - adv7175_write(encoder, 0x01, 0x00); - adv7175_write(encoder, 0x0c, TR1CAPT); /* TR1 */ + i2c_smbus_write_byte_data(client, 0x01, 0x00); + i2c_smbus_write_byte_data(client, 0x0c, TR1CAPT); /* TR1 */ if (encoder->norm == VIDEO_MODE_SECAM) - adv7175_write(encoder, 0x0d, 0x49); // Disable genlock + i2c_smbus_write_byte_data(client, 0x0d, 0x49); // Disable genlock else - adv7175_write(encoder, 0x0d, 0x4f); // Enable genlock - adv7175_write(encoder, 0x07, - TR0MODE | TR0RST); - adv7175_write(encoder, 0x07, - TR0MODE); + i2c_smbus_write_byte_data(client, 0x0d, 0x4f); // Enable genlock + i2c_smbus_write_byte_data(client, 0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client, 0x07, TR0MODE); //udelay(10); break; case 1: - adv7175_write(encoder, 0x01, 0x00); - adv7175_write(encoder, 0x0c, TR1PLAY); /* TR1 */ - adv7175_write(encoder, 0x0d, 0x49); - adv7175_write(encoder, 0x07, - TR0MODE | TR0RST); - adv7175_write(encoder, 0x07, - TR0MODE); + i2c_smbus_write_byte_data(client, 0x01, 0x00); + i2c_smbus_write_byte_data(client, 0x0c, TR1PLAY); /* TR1 */ + i2c_smbus_write_byte_data(client, 0x0d, 0x49); + i2c_smbus_write_byte_data(client, 0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client, 0x07, TR0MODE); //udelay(10); break; case 2: - adv7175_write(encoder, 0x01, 0x80); - adv7175_write(encoder, 0x0d, 0x49); - adv7175_write(encoder, 0x07, - TR0MODE | TR0RST); - adv7175_write(encoder, 0x07, - TR0MODE); + i2c_smbus_write_byte_data(client, 0x01, 0x80); + i2c_smbus_write_byte_data(client, 0x0d, 0x49); + i2c_smbus_write_byte_data(client, 0x07, TR0MODE | TR0RST); + i2c_smbus_write_byte_data(client, 0x07, TR0MODE); //udelay(10); break; default: printk(KERN_ERR "%s: illegal input: %d\n", - device->name, iarg); + client->name, iarg); return -EINVAL; } DEBUG(printk (KERN_INFO "%s: switched to %s\n", - device->name, inputs[iarg])); + client->name, inputs[iarg])); encoder->input = iarg; } } @@ -420,7 +381,7 @@ int *iarg = arg; encoder->enable = !!*iarg; - adv7175_write(encoder, 0x61, + i2c_smbus_write_byte_data(client, 0x61, (encoder-> reg[0x61] & 0xbf) | (encoder-> enable ? 0x00 : @@ -435,42 +396,60 @@ return 0; } +static void adv717x_inc_use(struct i2c_client *client) +{ + MOD_INC_USE_COUNT; +} + +static void adv717x_dec_use(struct i2c_client *client) +{ + MOD_DEC_USE_COUNT; +} + + /* ----------------------------------------------------------------------- */ static struct i2c_driver i2c_driver_adv7175 = { - "adv7175", /* name */ - I2C_DRIVERID_VIDEOENCODER, /* ID */ - I2C_ADV7175, I2C_ADV7175 + 3, - - adv7175_attach, - adv7175_detach, - adv7175_command + name: "adv7175", /* name */ + id: I2C_DRIVERID_ADV717x, /* ID */ + flags: I2C_DF_NOTIFY, //I2C_ADV7175, I2C_ADV7175 + 3, + attach_adapter: adv717x_probe, + detach_client: adv717x_detach, + command: adv717x_command, + inc_use: &adv717x_inc_use, + dec_use: &adv717x_dec_use }; static struct i2c_driver i2c_driver_adv7176 = { - "adv7175", /* name */ - I2C_DRIVERID_VIDEOENCODER, /* ID */ - I2C_ADV7176, I2C_ADV7176 + 3, - - adv7175_attach, - adv7175_detach, - adv7175_command + name: "adv7176", /* name */ + id: I2C_DRIVERID_ADV717x, /* ID */ + flags: I2C_DF_NOTIFY, //I2C_ADV7176, I2C_ADV7176 + 3, + attach_adapter: adv717x_probe, + detach_client: adv717x_detach, + command: adv717x_command, + inc_use: &adv717x_inc_use, + dec_use: &adv717x_dec_use +}; + +static struct i2c_client client_template = { + name: "adv7175_client", + driver: &i2c_driver_adv7175 }; -static int adv7175_init(void) +static int adv717x_init(void) { int res_adv7175 = 0, res_adv7176 = 0; - res_adv7175 = i2c_register_driver(&i2c_driver_adv7175); - res_adv7176 = i2c_register_driver(&i2c_driver_adv7176); + res_adv7175 = i2c_add_driver(&i2c_driver_adv7175); + res_adv7176 = i2c_add_driver(&i2c_driver_adv7176); return (res_adv7175 | res_adv7176); // Any idea how to make it better? } -static void adv7175_exit(void) +static void adv717x_exit(void) { - i2c_unregister_driver(&i2c_driver_adv7176); - i2c_unregister_driver(&i2c_driver_adv7175); + i2c_del_driver(&i2c_driver_adv7176); + i2c_del_driver(&i2c_driver_adv7175); } -module_init(adv7175_init); -module_exit(adv7175_exit); +module_init(adv717x_init); +module_exit(adv717x_exit); MODULE_LICENSE("GPL"); diff -Nru a/drivers/media/video/cpia.c b/drivers/media/video/cpia.c --- a/drivers/media/video/cpia.c Mon Oct 28 16:32:37 2002 +++ b/drivers/media/video/cpia.c Mon Oct 28 16:32:37 2002 @@ -6,6 +6,7 @@ * (C) Copyright 1999-2000 Peter Pregler * (C) Copyright 1999-2000 Scott J. Bertin * (C) Copyright 1999-2000 Johannes Erdfelt + * (C) Copyright 2000 STMicroelectronics * * 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 @@ -30,7 +31,6 @@ #include #include #include -#include #include #include #include @@ -101,6 +101,7 @@ #define CPIA_COMMAND_I2CRead (INPUT | CPIA_MODULE_SYSTEM | 13) #define CPIA_COMMAND_GetVPVersion (INPUT | CPIA_MODULE_VP_CTRL | 1) +#define CPIA_COMMAND_ResetFrameCounter (INPUT | CPIA_MODULE_VP_CTRL | 2) #define CPIA_COMMAND_SetColourParams (OUTPUT | CPIA_MODULE_VP_CTRL | 3) #define CPIA_COMMAND_SetExposure (OUTPUT | CPIA_MODULE_VP_CTRL | 4) #define CPIA_COMMAND_SetColourBalance (OUTPUT | CPIA_MODULE_VP_CTRL | 6) @@ -131,6 +132,7 @@ #define CPIA_COMMAND_SetYUVThresh (OUTPUT | CPIA_MODULE_CAPTURE | 12) #define CPIA_COMMAND_SetCompressionParams (OUTPUT | CPIA_MODULE_CAPTURE | 13) #define CPIA_COMMAND_DiscardFrame (OUTPUT | CPIA_MODULE_CAPTURE | 14) +#define CPIA_COMMAND_GrabReset (OUTPUT | CPIA_MODULE_CAPTURE | 15) #define CPIA_COMMAND_OutputRS232 (OUTPUT | CPIA_MODULE_DEBUG | 1) #define CPIA_COMMAND_AbortProcess (OUTPUT | CPIA_MODULE_DEBUG | 4) @@ -139,6 +141,7 @@ #define CPIA_COMMAND_StartDummyDtream (OUTPUT | CPIA_MODULE_DEBUG | 8) #define CPIA_COMMAND_AbortStream (OUTPUT | CPIA_MODULE_DEBUG | 9) #define CPIA_COMMAND_DownloadDRAM (OUTPUT | CPIA_MODULE_DEBUG | 10) +#define CPIA_COMMAND_Null (OUTPUT | CPIA_MODULE_DEBUG | 11) enum { FRAME_READY, /* Ready to grab into */ @@ -164,6 +167,25 @@ #define COMMAND_SETFLICKERCTRL 0x2000 #define COMMAND_SETVLOFFSET 0x4000 #define COMMAND_SETLIGHTS 0x8000 + +#define ROUND_UP_EXP_FOR_FLICKER 15 + +/* Constants for automatic frame rate adjustment */ +#define MAX_EXP 302 +#define MAX_EXP_102 255 +#define LOW_EXP 140 +#define VERY_LOW_EXP 70 +#define TC 94 +#define EXP_ACC_DARK 50 +#define EXP_ACC_LIGHT 90 +#define HIGH_COMP_102 160 +#define MAX_COMP 239 +#define DARK_TIME 3 +#define LIGHT_TIME 3 + +/* Maximum number of 10ms loops to wait for the stream to become ready */ +#define READY_TIMEOUT 100 + /* Developer's Guide Table 5 p 3-34 * indexed by [mains][sensorFps.baserate][sensorFps.divisor]*/ static u8 flicker_jumps[2][2][4] = @@ -173,6 +195,10 @@ /* forward declaration of local function */ static void reset_camera_struct(struct cam_data *cam); +static int find_over_exposure(int brightness); +static void set_flicker(struct cam_params *params, volatile u32 *command_flags, + int on); + /********************************************************************** * @@ -291,12 +317,6 @@ out += sprintf(out, "video_size: %s\n", cam->params.format.videoSize == VIDEOSIZE_CIF ? "CIF " : "QCIF"); - out += sprintf(out, "sub_sample: %s\n", - cam->params.format.subSample == SUBSAMPLE_420 ? - "420" : "422"); - out += sprintf(out, "yuv_order: %s\n", - cam->params.format.yuvOrder == YUVORDER_YUYV ? - "YUYV" : "UYVY"); out += sprintf(out, "roi: (%3d, %3d) to (%3d, %3d)\n", cam->params.roi.colStart*8, cam->params.roi.rowStart*4, @@ -331,11 +351,17 @@ 2*cam->params.streamStartLine, 0, cam->params.format.videoSize == VIDEOSIZE_CIF ? 288:144, cam->params.format.videoSize == VIDEOSIZE_CIF ? 240:120); + out += sprintf(out, "sub_sample: %8s %8s %8s %8s\n", + cam->params.format.subSample == SUBSAMPLE_420 ? + "420" : "422", "420", "422", "422"); + out += sprintf(out, "yuv_order: %8s %8s %8s %8s\n", + cam->params.format.yuvOrder == YUVORDER_YUYV ? + "YUYV" : "UYVY", "YUYV" , "UYVY", "YUYV"); out += sprintf(out, "ecp_timing: %8s %8s %8s %8s\n", cam->params.ecpTiming ? "slow" : "normal", "slow", "normal", "normal"); - if (cam->params.colourBalance.balanceModeIsAuto) { + if (cam->params.colourBalance.balanceMode == 2) { sprintf(tmpstr, "auto"); } else { sprintf(tmpstr, "manual"); @@ -385,31 +411,33 @@ 1<params.exposure.gain, 1, 1); if (cam->params.version.firmwareVersion == 1 && cam->params.version.firmwareRevision == 2) - /* 1-02 firmware limits fineExp to 127 */ - tmp = 255; + /* 1-02 firmware limits fineExp/2 to 127 */ + tmp = 254; else - tmp = 511; + tmp = 510; out += sprintf(out, "fine_exp: %8d %8d %8d %8d\n", cam->params.exposure.fineExp*2, 0, tmp, 0); if (cam->params.version.firmwareVersion == 1 && cam->params.version.firmwareRevision == 2) /* 1-02 firmware limits coarseExpHi to 0 */ - tmp = 255; + tmp = MAX_EXP_102; else - tmp = 65535; + tmp = MAX_EXP; out += sprintf(out, "coarse_exp: %8d %8d %8d" " %8d\n", cam->params.exposure.coarseExpLo+ 256*cam->params.exposure.coarseExpHi, 0, tmp, 185); out += sprintf(out, "red_comp: %8d %8d %8d %8d\n", - cam->params.exposure.redComp, 220, 255, 220); + cam->params.exposure.redComp, COMP_RED, 255, COMP_RED); out += sprintf(out, "green1_comp: %8d %8d %8d %8d\n", - cam->params.exposure.green1Comp, 214, 255, 214); + cam->params.exposure.green1Comp, COMP_GREEN1, 255, + COMP_GREEN1); out += sprintf(out, "green2_comp: %8d %8d %8d %8d\n", - cam->params.exposure.green2Comp, 214, 255, 214); + cam->params.exposure.green2Comp, COMP_GREEN2, 255, + COMP_GREEN2); out += sprintf(out, "blue_comp: %8d %8d %8d %8d\n", - cam->params.exposure.blueComp, 230, 255, 230); + cam->params.exposure.blueComp, COMP_BLUE, 255, COMP_BLUE); out += sprintf(out, "apcor_gain1: %#8x %#8x %#8x %#8x\n", cam->params.apcor.gain1, 0, 0xff, 0x1c); @@ -433,9 +461,14 @@ out += sprintf(out, "mains_frequency: %8d %8d %8d %8d" " only 50/60\n", cam->mainsFreq ? 60 : 50, 50, 60, 50); - out += sprintf(out, "allowable_overexposure: %8d %8d %8d %8d\n", - cam->params.flickerControl.allowableOverExposure, 0, - 255, 0); + if(cam->params.flickerControl.allowableOverExposure < 0) + out += sprintf(out, "allowable_overexposure: %4dauto auto %8d auto\n", + -cam->params.flickerControl.allowableOverExposure, + 255); + else + out += sprintf(out, "allowable_overexposure: %8d auto %8d auto\n", + cam->params.flickerControl.allowableOverExposure, + 255); out += sprintf(out, "compression_mode: "); switch(cam->params.compression.mode) { case CPIA_COMPRESSION_NONE: @@ -453,8 +486,8 @@ } out += sprintf(out, " none,auto,manual auto\n"); out += sprintf(out, "decimation_enable: %8s %8s %8s %8s\n", - cam->params.compression.decimation == - DECIMATION_ENAB ? "on":"off", "off", "off", + cam->params.compression.decimation == + DECIMATION_ENAB ? "on":"off", "off", "on", "off"); out += sprintf(out, "compression_target: %9s %9s %9s %9s\n", cam->params.compressionTarget.frTargeting == @@ -462,13 +495,13 @@ "framerate":"quality", "framerate", "quality", "quality"); out += sprintf(out, "target_framerate: %8d %8d %8d %8d\n", - cam->params.compressionTarget.targetFR, 0, 30, 7); + cam->params.compressionTarget.targetFR, 1, 30, 15); out += sprintf(out, "target_quality: %8d %8d %8d %8d\n", - cam->params.compressionTarget.targetQ, 0, 255, 10); + cam->params.compressionTarget.targetQ, 1, 64, 5); out += sprintf(out, "y_threshold: %8d %8d %8d %8d\n", - cam->params.yuvThreshold.yThreshold, 0, 31, 15); + cam->params.yuvThreshold.yThreshold, 0, 31, 6); out += sprintf(out, "uv_threshold: %8d %8d %8d %8d\n", - cam->params.yuvThreshold.uvThreshold, 0, 31, 15); + cam->params.yuvThreshold.uvThreshold, 0, 31, 6); out += sprintf(out, "hysteresis: %8d %8d %8d %8d\n", cam->params.compressionParams.hysteresis, 0, 255, 3); out += sprintf(out, "threshold_max: %8d %8d %8d %8d\n", @@ -511,6 +544,47 @@ return len; } + +static int match(char *checkstr, char **buffer, unsigned long *count, + int *find_colon, int *err) +{ + int ret, colon_found = 1; + int len = strlen(checkstr); + ret = (len <= *count && strncmp(*buffer, checkstr, len) == 0); + if (ret) { + *buffer += len; + *count -= len; + if (*find_colon) { + colon_found = 0; + while (*count && (**buffer == ' ' || **buffer == '\t' || + (!colon_found && **buffer == ':'))) { + if (**buffer == ':') + colon_found = 1; + --*count; + ++*buffer; + } + if (!*count || !colon_found) + *err = -EINVAL; + *find_colon = 0; + } + } + return ret; +} + +static unsigned long int value(char **buffer, unsigned long *count, int *err) +{ + char *p; + unsigned long int ret; + ret = simple_strtoul(*buffer, &p, 0); + if (p == *buffer) + *err = -EINVAL; + else { + *count -= p - *buffer; + *buffer = p; + } + return ret; +} + static int cpia_write_proc(struct file *file, const char *buf, unsigned long count, void *data) { @@ -565,45 +639,11 @@ memcpy(&new_params, &cam->params, sizeof(struct cam_params)); new_mains = cam->mainsFreq; -#define MATCH(x) \ - ({ \ - int _len = strlen(x), _ret, _colon_found; \ - _ret = (_len <= count && strncmp(buffer, x, _len) == 0); \ - if (_ret) { \ - buffer += _len; \ - count -= _len; \ - if (find_colon) { \ - _colon_found = 0; \ - while (count && (*buffer == ' ' || *buffer == '\t' || \ - (!_colon_found && *buffer == ':'))) { \ - if (*buffer == ':') \ - _colon_found = 1; \ - --count; \ - ++buffer; \ - } \ - if (!count || !_colon_found) \ - retval = -EINVAL; \ - find_colon = 0; \ - } \ - } \ - _ret; \ - }) +#define MATCH(x) (match(x, &buffer, &count, &find_colon, &retval)) +#define VALUE (value(&buffer,&count, &retval)) #define FIRMWARE_VERSION(x,y) (new_params.version.firmwareVersion == (x) && \ new_params.version.firmwareRevision == (y)) -#define VALUE \ - ({ \ - char *_p; \ - unsigned long int _ret; \ - _ret = simple_strtoul(buffer, &_p, 0); \ - if (_p == buffer) \ - retval = -EINVAL; \ - else { \ - count -= _p - buffer; \ - buffer = _p; \ - } \ - _ret; \ - }) - + retval = 0; while (count && !retval) { find_colon = 1; @@ -618,6 +658,12 @@ retval = -EINVAL; } command_flags |= COMMAND_SETCOLOURPARAMS; + if(new_params.flickerControl.allowableOverExposure < 0) + new_params.flickerControl.allowableOverExposure = + -find_over_exposure(new_params.colourParams.brightness); + if(new_params.flickerControl.flickerMode != 0) + command_flags |= COMMAND_SETFLICKERCTRL; + } else if (MATCH("contrast")) { if (!retval) val = VALUE; @@ -686,6 +732,7 @@ command_flags |= COMMAND_SETFLICKERCTRL; } command_flags |= COMMAND_SETSENSORFPS; + cam->exposure_status = EXPOSURE_NORMAL; } else if (MATCH("stream_start_line")) { if (!retval) val = VALUE; @@ -700,6 +747,24 @@ else retval = -EINVAL; } + } else if (MATCH("sub_sample")) { + if (!retval && MATCH("420")) + new_params.format.subSample = SUBSAMPLE_420; + else if (!retval && MATCH("422")) + new_params.format.subSample = SUBSAMPLE_422; + else + retval = -EINVAL; + + command_flags |= COMMAND_SETFORMAT; + } else if (MATCH("yuv_order")) { + if (!retval && MATCH("YUYV")) + new_params.format.yuvOrder = YUVORDER_YUYV; + else if (!retval && MATCH("UYVY")) + new_params.format.yuvOrder = YUVORDER_UYVY; + else + retval = -EINVAL; + + command_flags |= COMMAND_SETFORMAT; } else if (MATCH("ecp_timing")) { if (!retval && MATCH("normal")) new_params.ecpTiming = 0; @@ -711,9 +776,9 @@ command_flags |= COMMAND_SETECPTIMING; } else if (MATCH("color_balance_mode")) { if (!retval && MATCH("manual")) - new_params.colourBalance.balanceModeIsAuto = 0; + new_params.colourBalance.balanceMode = 3; else if (!retval && MATCH("auto")) - new_params.colourBalance.balanceModeIsAuto = 1; + new_params.colourBalance.balanceMode = 2; else retval = -EINVAL; @@ -723,9 +788,10 @@ val = VALUE; if (!retval) { - if (val <= 212) + if (val <= 212) { new_params.colourBalance.redGain = val; - else + new_params.colourBalance.balanceMode = 1; + } else retval = -EINVAL; } command_flags |= COMMAND_SETCOLOURBALANCE; @@ -734,9 +800,10 @@ val = VALUE; if (!retval) { - if (val <= 212) + if (val <= 212) { new_params.colourBalance.greenGain = val; - else + new_params.colourBalance.balanceMode = 1; + } else retval = -EINVAL; } command_flags |= COMMAND_SETCOLOURBALANCE; @@ -745,9 +812,10 @@ val = VALUE; if (!retval) { - if (val <= 212) + if (val <= 212) { new_params.colourBalance.blueGain = val; - else + new_params.colourBalance.balanceMode = 1; + } else retval = -EINVAL; } command_flags |= COMMAND_SETCOLOURBALANCE; @@ -784,8 +852,9 @@ else if (!retval && MATCH("manual")) { if (new_params.exposure.expMode == 2) new_params.exposure.expMode = 3; + if(new_params.flickerControl.flickerMode != 0) + command_flags |= COMMAND_SETFLICKERCTRL; new_params.flickerControl.flickerMode = 0; - command_flags |= COMMAND_SETFLICKERCTRL; } else retval = -EINVAL; @@ -807,32 +876,24 @@ switch(val) { case 1: new_params.exposure.gain = 0; - new_params.exposure.expMode = 1; - new_params.flickerControl.flickerMode = 0; - command_flags |= COMMAND_SETFLICKERCTRL; break; case 2: new_params.exposure.gain = 1; - new_params.exposure.expMode = 1; - new_params.flickerControl.flickerMode = 0; - command_flags |= COMMAND_SETFLICKERCTRL; break; case 4: new_params.exposure.gain = 2; - new_params.exposure.expMode = 1; - new_params.flickerControl.flickerMode = 0; - command_flags |= COMMAND_SETFLICKERCTRL; break; case 8: new_params.exposure.gain = 3; - new_params.exposure.expMode = 1; - new_params.flickerControl.flickerMode = 0; - command_flags |= COMMAND_SETFLICKERCTRL; break; default: retval = -EINVAL; break; } + new_params.exposure.expMode = 1; + if(new_params.flickerControl.flickerMode != 0) + command_flags |= COMMAND_SETFLICKERCTRL; + new_params.flickerControl.flickerMode = 0; command_flags |= COMMAND_SETEXPOSURE; if (new_params.exposure.gain > new_params.exposure.gainMode-1) @@ -840,16 +901,18 @@ } } else if (MATCH("fine_exp")) { if (!retval) - val = VALUE; + val = VALUE/2; if (!retval) { if (val < 256) { - /* 1-02 firmware limits fineExp to 127*/ + /* 1-02 firmware limits fineExp/2 to 127*/ if (FIRMWARE_VERSION(1,2) && val > 127) val = 127; new_params.exposure.fineExp = val; new_params.exposure.expMode = 1; command_flags |= COMMAND_SETEXPOSURE; + if(new_params.flickerControl.flickerMode != 0) + command_flags |= COMMAND_SETFLICKERCTRL; new_params.flickerControl.flickerMode = 0; command_flags |= COMMAND_SETFLICKERCTRL; } else @@ -860,17 +923,18 @@ val = VALUE; if (!retval) { - if (val < 65536) { - /* 1-02 firmware limits - * coarseExp to 255 */ - if (FIRMWARE_VERSION(1,2) && val > 255) - val = 255; + if (val <= MAX_EXP) { + if (FIRMWARE_VERSION(1,2) && + val > MAX_EXP_102) + val = MAX_EXP_102; new_params.exposure.coarseExpLo = val & 0xff; new_params.exposure.coarseExpHi = val >> 8; new_params.exposure.expMode = 1; command_flags |= COMMAND_SETEXPOSURE; + if(new_params.flickerControl.flickerMode != 0) + command_flags |= COMMAND_SETFLICKERCTRL; new_params.flickerControl.flickerMode = 0; command_flags |= COMMAND_SETFLICKERCTRL; } else @@ -881,8 +945,9 @@ val = VALUE; if (!retval) { - if (val >= 220 && val <= 255) { + if (val >= COMP_RED && val <= 255) { new_params.exposure.redComp = val; + new_params.exposure.compMode = 1; command_flags |= COMMAND_SETEXPOSURE; } else retval = -EINVAL; @@ -892,8 +957,9 @@ val = VALUE; if (!retval) { - if (val >= 214 && val <= 255) { + if (val >= COMP_GREEN1 && val <= 255) { new_params.exposure.green1Comp = val; + new_params.exposure.compMode = 1; command_flags |= COMMAND_SETEXPOSURE; } else retval = -EINVAL; @@ -903,8 +969,9 @@ val = VALUE; if (!retval) { - if (val >= 214 && val <= 255) { + if (val >= COMP_GREEN2 && val <= 255) { new_params.exposure.green2Comp = val; + new_params.exposure.compMode = 1; command_flags |= COMMAND_SETEXPOSURE; } else retval = -EINVAL; @@ -914,8 +981,9 @@ val = VALUE; if (!retval) { - if (val >= 230 && val <= 255) { + if (val >= COMP_BLUE && val <= 255) { new_params.exposure.blueComp = val; + new_params.exposure.compMode = 1; command_flags |= COMMAND_SETEXPOSURE; } else retval = -EINVAL; @@ -1010,12 +1078,10 @@ command_flags |= COMMAND_SETVLOFFSET; } else if (MATCH("flicker_control")) { if (!retval && MATCH("on")) { - new_params.flickerControl.flickerMode = 1; - new_params.exposure.expMode = 2; - command_flags |= COMMAND_SETEXPOSURE; - } else if (!retval && MATCH("off")) - new_params.flickerControl.flickerMode = 0; - else + set_flicker(&new_params, &command_flags, 1); + } else if (!retval && MATCH("off")) { + set_flicker(&new_params, &command_flags, 0); + } else retval = -EINVAL; command_flags |= COMMAND_SETFLICKERCTRL; @@ -1039,16 +1105,24 @@ } else retval = -EINVAL; } else if (MATCH("allowable_overexposure")) { - if (!retval) - val = VALUE; - - if (!retval) { - if (val <= 0xff) { - new_params.flickerControl. - allowableOverExposure = val; + if (!retval && MATCH("auto")) { + new_params.flickerControl.allowableOverExposure = + -find_over_exposure(new_params.colourParams.brightness); + if(new_params.flickerControl.flickerMode != 0) command_flags |= COMMAND_SETFLICKERCTRL; - } else - retval = -EINVAL; + } else { + if (!retval) + val = VALUE; + + if (!retval) { + if (val <= 0xff) { + new_params.flickerControl. + allowableOverExposure = val; + if(new_params.flickerControl.flickerMode != 0) + command_flags |= COMMAND_SETFLICKERCTRL; + } else + retval = -EINVAL; + } } } else if (MATCH("compression_mode")) { if (!retval && MATCH("none")) @@ -1067,6 +1141,8 @@ } else if (MATCH("decimation_enable")) { if (!retval && MATCH("off")) new_params.compression.decimation = 0; + else if (!retval && MATCH("on")) + new_params.compression.decimation = 1; else retval = -EINVAL; @@ -1086,16 +1162,23 @@ if (!retval) val = VALUE; - if (!retval) - new_params.compressionTarget.targetFR = val; + if (!retval) { + if(val > 0 && val <= 30) + new_params.compressionTarget.targetFR = val; + else + retval = -EINVAL; + } command_flags |= COMMAND_SETCOMPRESSIONTARGET; } else if (MATCH("target_quality")) { if (!retval) val = VALUE; - if (!retval) - new_params.compressionTarget.targetQ = val; - + if (!retval) { + if(val > 0 && val <= 64) + new_params.compressionTarget.targetQ = val; + else + retval = -EINVAL; + } command_flags |= COMMAND_SETCOMPRESSIONTARGET; } else if (MATCH("y_threshold")) { if (!retval) @@ -1247,10 +1330,8 @@ } } #undef MATCH -#undef FIRMWARE_VERSION #undef VALUE -#undef FIND_VALUE -#undef FIND_END +#undef FIRMWARE_VERSION if (!retval) { if (command_flags & COMMAND_SETCOLOURPARAMS) { /* Adjust cam->vp to reflect these changes */ @@ -1261,7 +1342,10 @@ cam->vp.colour = new_params.colourParams.saturation*65535/100; } - + if((command_flags & COMMAND_SETEXPOSURE) && + new_params.exposure.expMode == 2) + cam->exposure_status = EXPOSURE_NORMAL; + memcpy(&cam->params, &new_params, sizeof(struct cam_params)); cam->mainsFreq = new_mains; cam->cmd_queue |= command_flags; @@ -1294,11 +1378,11 @@ ent->read_proc = cpia_read_proc; ent->write_proc = cpia_write_proc; /* - size of the proc entry is 3672 bytes for the standard webcam; - the extra features of the QX3 microscope add 188 bytes. + size of the proc entry is 3736 bytes for the standard webcam; + the extra features of the QX3 microscope add 189 bytes. (we have not yet probed the camera to see which type it is). */ - ent->size = 3672 + 188; + ent->size = 3736 + 189; cam->proc_entry = ent; } @@ -1324,10 +1408,12 @@ LOG("Unable to initialise /proc/cpia\n"); } +#ifdef MODULE static void proc_cpia_destroy(void) { remove_proc_entry("cpia", 0); } +#endif /*MODULE*/ #endif /* CONFIG_PROC_FS */ /* ----------------------- debug functions ---------------------- */ @@ -1410,9 +1496,7 @@ cam->vw.height = 288; cam->params.format.videoSize=VIDEOSIZE_CIF; cam->params.roi.colStart=0; - cam->params.roi.colEnd=44; cam->params.roi.rowStart=0; - cam->params.roi.rowEnd=72; cam->params.streamStartLine = 120; break; case VIDEOSIZE_SIF: @@ -1420,9 +1504,7 @@ cam->vw.height = 240; cam->params.format.videoSize=VIDEOSIZE_CIF; cam->params.roi.colStart=2; - cam->params.roi.colEnd=42; cam->params.roi.rowStart=6; - cam->params.roi.rowEnd=66; cam->params.streamStartLine = 120; break; case VIDEOSIZE_288_216: @@ -1430,9 +1512,7 @@ cam->vw.height = 216; cam->params.format.videoSize=VIDEOSIZE_CIF; cam->params.roi.colStart=4; - cam->params.roi.colEnd=40; cam->params.roi.rowStart=9; - cam->params.roi.rowEnd=63; cam->params.streamStartLine = 120; break; case VIDEOSIZE_256_192: @@ -1440,9 +1520,7 @@ cam->vw.height = 192; cam->params.format.videoSize=VIDEOSIZE_CIF; cam->params.roi.colStart=6; - cam->params.roi.colEnd=38; cam->params.roi.rowStart=12; - cam->params.roi.rowEnd=60; cam->params.streamStartLine = 120; break; case VIDEOSIZE_224_168: @@ -1450,9 +1528,7 @@ cam->vw.height = 168; cam->params.format.videoSize=VIDEOSIZE_CIF; cam->params.roi.colStart=8; - cam->params.roi.colEnd=36; cam->params.roi.rowStart=15; - cam->params.roi.rowEnd=57; cam->params.streamStartLine = 120; break; case VIDEOSIZE_192_144: @@ -1460,9 +1536,7 @@ cam->vw.height = 144; cam->params.format.videoSize=VIDEOSIZE_CIF; cam->params.roi.colStart=10; - cam->params.roi.colEnd=34; cam->params.roi.rowStart=18; - cam->params.roi.rowEnd=54; cam->params.streamStartLine = 120; break; case VIDEOSIZE_QCIF: @@ -1470,9 +1544,7 @@ cam->vw.height = 144; cam->params.format.videoSize=VIDEOSIZE_QCIF; cam->params.roi.colStart=0; - cam->params.roi.colEnd=22; cam->params.roi.rowStart=0; - cam->params.roi.rowEnd=36; cam->params.streamStartLine = 60; break; case VIDEOSIZE_QSIF: @@ -1480,9 +1552,7 @@ cam->vw.height = 120; cam->params.format.videoSize=VIDEOSIZE_QCIF; cam->params.roi.colStart=1; - cam->params.roi.colEnd=21; cam->params.roi.rowStart=3; - cam->params.roi.rowEnd=33; cam->params.streamStartLine = 60; break; case VIDEOSIZE_128_96: @@ -1490,9 +1560,7 @@ cam->vw.height = 96; cam->params.format.videoSize=VIDEOSIZE_QCIF; cam->params.roi.colStart=3; - cam->params.roi.colEnd=19; cam->params.roi.rowStart=6; - cam->params.roi.rowEnd=30; cam->params.streamStartLine = 60; break; case VIDEOSIZE_88_72: @@ -1500,9 +1568,7 @@ cam->vw.height = 72; cam->params.format.videoSize=VIDEOSIZE_QCIF; cam->params.roi.colStart=5; - cam->params.roi.colEnd=16; cam->params.roi.rowStart=9; - cam->params.roi.rowEnd=27; cam->params.streamStartLine = 60; break; case VIDEOSIZE_64_48: @@ -1510,9 +1576,7 @@ cam->vw.height = 48; cam->params.format.videoSize=VIDEOSIZE_QCIF; cam->params.roi.colStart=7; - cam->params.roi.colEnd=15; cam->params.roi.rowStart=12; - cam->params.roi.rowEnd=24; cam->params.streamStartLine = 60; break; case VIDEOSIZE_48_48: @@ -1520,15 +1584,26 @@ cam->vw.height = 48; cam->params.format.videoSize=VIDEOSIZE_QCIF; cam->params.roi.colStart=8; - cam->params.roi.colEnd=14; cam->params.roi.rowStart=6; - cam->params.roi.rowEnd=30; cam->params.streamStartLine = 60; break; default: LOG("bad videosize value: %d\n", cam->video_size); + return; } + if(cam->vc.width == 0) + cam->vc.width = cam->vw.width; + if(cam->vc.height == 0) + cam->vc.height = cam->vw.height; + + cam->params.roi.colStart += cam->vc.x >> 3; + cam->params.roi.colEnd = cam->params.roi.colStart + + (cam->vc.width >> 3); + cam->params.roi.rowStart += cam->vc.y >> 2; + cam->params.roi.rowEnd = cam->params.roi.rowStart + + (cam->vc.height >> 2); + return; } @@ -1668,29 +1743,6 @@ cam->params.exposure.green1Comp = data[5]; cam->params.exposure.green2Comp = data[6]; cam->params.exposure.blueComp = data[7]; - /* If the *Comp parameters are wacko, generate - * a warning, and reset them back to default - * values. - rich@annexia.org - */ - if (cam->params.exposure.redComp < 220 || - cam->params.exposure.redComp > 255 || - cam->params.exposure.green1Comp < 214 || - cam->params.exposure.green1Comp > 255 || - cam->params.exposure.green2Comp < 214 || - cam->params.exposure.green2Comp > 255 || - cam->params.exposure.blueComp < 230 || - cam->params.exposure.blueComp > 255) - { - printk (KERN_WARNING "*_comp parameters have gone AWOL (%d/%d/%d/%d) - reseting them\n", - cam->params.exposure.redComp, - cam->params.exposure.green1Comp, - cam->params.exposure.green2Comp, - cam->params.exposure.blueComp); - cam->params.exposure.redComp = 220; - cam->params.exposure.green1Comp = 214; - cam->params.exposure.green2Comp = 214; - cam->params.exposure.blueComp = 230; - } up(&cam->param_lock); break; @@ -1756,6 +1808,122 @@ **********************************************************************/ #define LIMIT(x) ((((x)>0xffffff)?0xff0000:(((x)<=0xffff)?0:(x)&0xff0000))>>16) +static int convert420(unsigned char *yuv, unsigned char *rgb, int out_fmt, + int linesize, int mmap_kludge) +{ + int y, u, v, r, g, b, y1; + + /* Odd lines use the same u and v as the previous line. + * Because of compression, it is necessary to get this + * information from the decoded image. */ + switch(out_fmt) { + case VIDEO_PALETTE_RGB555: + y = (*yuv++ - 16) * 76310; + y1 = (*yuv - 16) * 76310; + r = ((*(rgb+1-linesize)) & 0x7c) << 1; + g = ((*(rgb-linesize)) & 0xe0) >> 4 | + ((*(rgb+1-linesize)) & 0x03) << 6; + b = ((*(rgb-linesize)) & 0x1f) << 3; + u = (-53294 * r - 104635 * g + 157929 * b) / 5756495; + v = (157968 * r - 132278 * g - 25690 * b) / 5366159; + r = 104635 * v; + g = -25690 * u - 53294 * v; + b = 132278 * u; + *rgb++ = ((LIMIT(g+y) & 0xf8) << 2) | (LIMIT(b+y) >> 3); + *rgb++ = ((LIMIT(r+y) & 0xf8) >> 1) | (LIMIT(g+y) >> 6); + *rgb++ = ((LIMIT(g+y1) & 0xf8) << 2) | (LIMIT(b+y1) >> 3); + *rgb = ((LIMIT(r+y1) & 0xf8) >> 1) | (LIMIT(g+y1) >> 6); + return 4; + case VIDEO_PALETTE_RGB565: + y = (*yuv++ - 16) * 76310; + y1 = (*yuv - 16) * 76310; + r = (*(rgb+1-linesize)) & 0xf8; + g = ((*(rgb-linesize)) & 0xe0) >> 3 | + ((*(rgb+1-linesize)) & 0x07) << 5; + b = ((*(rgb-linesize)) & 0x1f) << 3; + u = (-53294 * r - 104635 * g + 157929 * b) / 5756495; + v = (157968 * r - 132278 * g - 25690 * b) / 5366159; + r = 104635 * v; + g = -25690 * u - 53294 * v; + b = 132278 * u; + *rgb++ = ((LIMIT(g+y) & 0xfc) << 3) | (LIMIT(b+y) >> 3); + *rgb++ = (LIMIT(r+y) & 0xf8) | (LIMIT(g+y) >> 5); + *rgb++ = ((LIMIT(g+y1) & 0xfc) << 3) | (LIMIT(b+y1) >> 3); + *rgb = (LIMIT(r+y1) & 0xf8) | (LIMIT(g+y1) >> 5); + return 4; + break; + case VIDEO_PALETTE_RGB24: + case VIDEO_PALETTE_RGB32: + y = (*yuv++ - 16) * 76310; + y1 = (*yuv - 16) * 76310; + if (mmap_kludge) { + r = *(rgb+2-linesize); + g = *(rgb+1-linesize); + b = *(rgb-linesize); + } else { + r = *(rgb-linesize); + g = *(rgb+1-linesize); + b = *(rgb+2-linesize); + } + u = (-53294 * r - 104635 * g + 157929 * b) / 5756495; + v = (157968 * r - 132278 * g - 25690 * b) / 5366159; + r = 104635 * v; + g = -25690 * u + -53294 * v; + b = 132278 * u; + if (mmap_kludge) { + *rgb++ = LIMIT(b+y); + *rgb++ = LIMIT(g+y); + *rgb++ = LIMIT(r+y); + if(out_fmt == VIDEO_PALETTE_RGB32) + rgb++; + *rgb++ = LIMIT(b+y1); + *rgb++ = LIMIT(g+y1); + *rgb = LIMIT(r+y1); + } else { + *rgb++ = LIMIT(r+y); + *rgb++ = LIMIT(g+y); + *rgb++ = LIMIT(b+y); + if(out_fmt == VIDEO_PALETTE_RGB32) + rgb++; + *rgb++ = LIMIT(r+y1); + *rgb++ = LIMIT(g+y1); + *rgb = LIMIT(b+y1); + } + if(out_fmt == VIDEO_PALETTE_RGB32) + return 8; + return 6; + case VIDEO_PALETTE_YUV422: + case VIDEO_PALETTE_YUYV: + y = *yuv++; + u = *(rgb+1-linesize); + y1 = *yuv; + v = *(rgb+3-linesize); + *rgb++ = y; + *rgb++ = u; + *rgb++ = y1; + *rgb = v; + return 4; + case VIDEO_PALETTE_UYVY: + u = *(rgb-linesize); + y = *yuv++; + v = *(rgb+2-linesize); + y1 = *yuv; + *rgb++ = u; + *rgb++ = y; + *rgb++ = v; + *rgb = y1; + return 4; + case VIDEO_PALETTE_GREY: + *rgb++ = *yuv++; + *rgb = *yuv; + return 2; + default: + DBG("Empty: %d\n", out_fmt); + return 0; + } +} + + static int yuvconvert(unsigned char *yuv, unsigned char *rgb, int out_fmt, int in_uyvy, int mmap_kludge) { @@ -1887,7 +2055,8 @@ static int parse_picture(struct cam_data *cam, int size) { u8 *obuf, *ibuf, *end_obuf; - int ll, in_uyvy, compressed, origsize, out_fmt; + int ll, in_uyvy, compressed, decimation, even_line, origsize, out_fmt; + int rows, cols, linesize, subsample_422; /* make sure params don't change while we are decoding */ down(&cam->param_lock); @@ -1910,11 +2079,12 @@ return -1; } - if (ibuf[17] != SUBSAMPLE_422) { + if (ibuf[17] != SUBSAMPLE_420 && ibuf[17] != SUBSAMPLE_422) { LOG("illegal subtype %d\n",ibuf[17]); up(&cam->param_lock); return -1; } + subsample_422 = ibuf[17] == SUBSAMPLE_422; if (ibuf[18] != YUVORDER_YUYV && ibuf[18] != YUVORDER_UYVY) { LOG("illegal yuvorder %d\n",ibuf[18]); @@ -1923,8 +2093,6 @@ } in_uyvy = ibuf[18] == YUVORDER_UYVY; -#if 0 - /* FIXME: ROI mismatch occurs when switching capture sizes */ if ((ibuf[24] != cam->params.roi.colStart) || (ibuf[25] != cam->params.roi.colEnd) || (ibuf[26] != cam->params.roi.rowStart) || @@ -1933,7 +2101,9 @@ up(&cam->param_lock); return -1; } -#endif + cols = 8*(ibuf[25] - ibuf[24]); + rows = 4*(ibuf[27] - ibuf[26]); + if ((ibuf[28] != NOT_COMPRESSED) && (ibuf[28] != COMPRESSED)) { LOG("illegal compression %d\n",ibuf[28]); @@ -1942,12 +2112,13 @@ } compressed = (ibuf[28] == COMPRESSED); - if (ibuf[29] != NO_DECIMATION) { - LOG("decimation not supported\n"); + if (ibuf[29] != NO_DECIMATION && ibuf[29] != DECIMATION_ENAB) { + LOG("illegal decimation %d\n",ibuf[29]); up(&cam->param_lock); return -1; } - + decimation = (ibuf[29] == DECIMATION_ENAB); + cam->params.yuvThreshold.yThreshold = ibuf[30]; cam->params.yuvThreshold.uvThreshold = ibuf[31]; cam->params.status.systemState = ibuf[32]; @@ -1961,10 +2132,12 @@ cam->fps = ibuf[41]; up(&cam->param_lock); + linesize = skipcount(cols, out_fmt); ibuf += FRAME_HEADER_SIZE; size -= FRAME_HEADER_SIZE; ll = ibuf[0] | (ibuf[1] << 8); ibuf += 2; + even_line = 1; while (size > 0) { size -= (ll+2); @@ -1975,16 +2148,24 @@ while (ll > 1) { if (!compressed || (compressed && !(*ibuf & 1))) { + if(subsample_422 || even_line) { obuf += yuvconvert(ibuf, obuf, out_fmt, in_uyvy, cam->mmap_kludge); ibuf += 4; ll -= 4; } else { + /* SUBSAMPLE_420 on an odd line */ + obuf += convert420(ibuf, obuf, + out_fmt, linesize, + cam->mmap_kludge); + ibuf += 2; + ll -= 2; + } + } else { /*skip compressed interval from previous frame*/ - int skipsize = skipcount(*ibuf >> 1, out_fmt); - obuf += skipsize; + obuf += skipcount(*ibuf >> 1, out_fmt); if (obuf > end_obuf) { - LOG("Insufficient data in buffer\n"); + LOG("Insufficient buffer size\n"); return -1; } ++ibuf; @@ -1998,7 +2179,7 @@ return -1; } - ibuf++; /* skip over EOL */ + ++ibuf; /* skip over EOL */ if ((size > 3) && (ibuf[0] == EOI) && (ibuf[1] == EOI) && (ibuf[2] == EOI) && (ibuf[3] == EOI)) { @@ -2006,10 +2187,17 @@ break; } + if(decimation) { + /* skip the odd lines for now */ + obuf += linesize; + } + if (size > 1) { ll = ibuf[0] | (ibuf[1] << 8); ibuf += 2; /* skip over line length */ } + if(!decimation) + even_line = !even_line; } else { LOG("line length was not 1 but %d after %d/%d bytes\n", ll, origsize-size, origsize); @@ -2017,6 +2205,25 @@ } } + if(decimation) { + /* interpolate odd rows */ + int i, j; + u8 *prev, *next; + prev = cam->decompressed_frame.data; + obuf = prev+linesize; + next = obuf+linesize; + for(i=1; idecompressed_frame.count = obuf-cam->decompressed_frame.data; return cam->decompressed_frame.count; @@ -2029,6 +2236,38 @@ 0, cam->params.streamStartLine, 0, 0); } + +/* find_over_exposure + * Finds a suitable value of OverExposure for use with SetFlickerCtrl + * Some calculation is required because this value changes with the brightness + * set with SetColourParameters + * + * Parameters: Brightness - last brightness value set with SetColourParameters + * + * Returns: OverExposure value to use with SetFlickerCtrl + */ +#define FLICKER_MAX_EXPOSURE 250 +#define FLICKER_ALLOWABLE_OVER_EXPOSURE 146 +#define FLICKER_BRIGHTNESS_CONSTANT 59 +static int find_over_exposure(int brightness) +{ + int MaxAllowableOverExposure, OverExposure; + + MaxAllowableOverExposure = FLICKER_MAX_EXPOSURE - brightness - + FLICKER_BRIGHTNESS_CONSTANT; + + if (MaxAllowableOverExposure < FLICKER_ALLOWABLE_OVER_EXPOSURE) { + OverExposure = MaxAllowableOverExposure; + } else { + OverExposure = FLICKER_ALLOWABLE_OVER_EXPOSURE; + } + + return OverExposure; +} +#undef FLICKER_MAX_EXPOSURE +#undef FLICKER_ALLOWABLE_OVER_EXPOSURE +#undef FLICKER_BRIGHTNESS_CONSTANT + /* update various camera modes and settings */ static void dispatch_commands(struct cam_data *cam) { @@ -2039,17 +2278,6 @@ } DEB_BYTE(cam->cmd_queue); DEB_BYTE(cam->cmd_queue>>8); - if (cam->cmd_queue & COMMAND_SETCOLOURPARAMS) - do_command(cam, CPIA_COMMAND_SetColourParams, - cam->params.colourParams.brightness, - cam->params.colourParams.contrast, - cam->params.colourParams.saturation, 0); - - if (cam->cmd_queue & COMMAND_SETCOMPRESSION) - do_command(cam, CPIA_COMMAND_SetCompression, - cam->params.compression.mode, - cam->params.compression.decimation, 0, 0); - if (cam->cmd_queue & COMMAND_SETFORMAT) { do_command(cam, CPIA_COMMAND_SetFormat, cam->params.format.videoSize, @@ -2061,37 +2289,30 @@ cam->first_frame = 1; } - if (cam->cmd_queue & COMMAND_SETCOMPRESSIONTARGET) - do_command(cam, CPIA_COMMAND_SetCompressionTarget, - cam->params.compressionTarget.frTargeting, - cam->params.compressionTarget.targetFR, - cam->params.compressionTarget.targetQ, 0); - - if (cam->cmd_queue & COMMAND_SETYUVTHRESH) - do_command(cam, CPIA_COMMAND_SetYUVThresh, - cam->params.yuvThreshold.yThreshold, - cam->params.yuvThreshold.uvThreshold, 0, 0); + if (cam->cmd_queue & COMMAND_SETCOLOURPARAMS) + do_command(cam, CPIA_COMMAND_SetColourParams, + cam->params.colourParams.brightness, + cam->params.colourParams.contrast, + cam->params.colourParams.saturation, 0); - if (cam->cmd_queue & COMMAND_SETECPTIMING) - do_command(cam, CPIA_COMMAND_SetECPTiming, - cam->params.ecpTiming, 0, 0, 0); + if (cam->cmd_queue & COMMAND_SETAPCOR) + do_command(cam, CPIA_COMMAND_SetApcor, + cam->params.apcor.gain1, + cam->params.apcor.gain2, + cam->params.apcor.gain4, + cam->params.apcor.gain8); - if (cam->cmd_queue & COMMAND_SETCOMPRESSIONPARAMS) - do_command_extended(cam, CPIA_COMMAND_SetCompressionParams, - 0, 0, 0, 0, - cam->params.compressionParams.hysteresis, - cam->params.compressionParams.threshMax, - cam->params.compressionParams.smallStep, - cam->params.compressionParams.largeStep, - cam->params.compressionParams.decimationHysteresis, - cam->params.compressionParams.frDiffStepThresh, - cam->params.compressionParams.qDiffStepThresh, - cam->params.compressionParams.decimationThreshMod); + if (cam->cmd_queue & COMMAND_SETVLOFFSET) + do_command(cam, CPIA_COMMAND_SetVLOffset, + cam->params.vlOffset.gain1, + cam->params.vlOffset.gain2, + cam->params.vlOffset.gain4, + cam->params.vlOffset.gain8); - if (cam->cmd_queue & COMMAND_SETEXPOSURE) + if (cam->cmd_queue & COMMAND_SETEXPOSURE) { do_command_extended(cam, CPIA_COMMAND_SetExposure, cam->params.exposure.gainMode, - cam->params.exposure.expMode, + 1, cam->params.exposure.compMode, cam->params.exposure.centreWeight, cam->params.exposure.gain, @@ -2102,12 +2323,21 @@ cam->params.exposure.green1Comp, cam->params.exposure.green2Comp, cam->params.exposure.blueComp); - + if(cam->params.exposure.expMode != 1) { + do_command_extended(cam, CPIA_COMMAND_SetExposure, + 0, + cam->params.exposure.expMode, + 0, 0, + cam->params.exposure.gain, + cam->params.exposure.fineExp, + cam->params.exposure.coarseExpLo, + cam->params.exposure.coarseExpHi, + 0, 0, 0, 0); + } + } + if (cam->cmd_queue & COMMAND_SETCOLOURBALANCE) { - if (cam->params.colourBalance.balanceModeIsAuto) { - do_command(cam, CPIA_COMMAND_SetColourBalance, - 2, 0, 0, 0); - } else { + if (cam->params.colourBalance.balanceMode == 1) { do_command(cam, CPIA_COMMAND_SetColourBalance, 1, cam->params.colourBalance.redGain, @@ -2116,32 +2346,59 @@ do_command(cam, CPIA_COMMAND_SetColourBalance, 3, 0, 0, 0); } + if (cam->params.colourBalance.balanceMode == 2) { + do_command(cam, CPIA_COMMAND_SetColourBalance, + 2, 0, 0, 0); + } + if (cam->params.colourBalance.balanceMode == 3) { + do_command(cam, CPIA_COMMAND_SetColourBalance, + 3, 0, 0, 0); + } } + if (cam->cmd_queue & COMMAND_SETCOMPRESSIONTARGET) + do_command(cam, CPIA_COMMAND_SetCompressionTarget, + cam->params.compressionTarget.frTargeting, + cam->params.compressionTarget.targetFR, + cam->params.compressionTarget.targetQ, 0); + + if (cam->cmd_queue & COMMAND_SETYUVTHRESH) + do_command(cam, CPIA_COMMAND_SetYUVThresh, + cam->params.yuvThreshold.yThreshold, + cam->params.yuvThreshold.uvThreshold, 0, 0); + + if (cam->cmd_queue & COMMAND_SETCOMPRESSIONPARAMS) + do_command_extended(cam, CPIA_COMMAND_SetCompressionParams, + 0, 0, 0, 0, + cam->params.compressionParams.hysteresis, + cam->params.compressionParams.threshMax, + cam->params.compressionParams.smallStep, + cam->params.compressionParams.largeStep, + cam->params.compressionParams.decimationHysteresis, + cam->params.compressionParams.frDiffStepThresh, + cam->params.compressionParams.qDiffStepThresh, + cam->params.compressionParams.decimationThreshMod); + + if (cam->cmd_queue & COMMAND_SETCOMPRESSION) + do_command(cam, CPIA_COMMAND_SetCompression, + cam->params.compression.mode, + cam->params.compression.decimation, 0, 0); + if (cam->cmd_queue & COMMAND_SETSENSORFPS) do_command(cam, CPIA_COMMAND_SetSensorFPS, cam->params.sensorFps.divisor, cam->params.sensorFps.baserate, 0, 0); - if (cam->cmd_queue & COMMAND_SETAPCOR) - do_command(cam, CPIA_COMMAND_SetApcor, - cam->params.apcor.gain1, - cam->params.apcor.gain2, - cam->params.apcor.gain4, - cam->params.apcor.gain8); - if (cam->cmd_queue & COMMAND_SETFLICKERCTRL) do_command(cam, CPIA_COMMAND_SetFlickerCtrl, cam->params.flickerControl.flickerMode, cam->params.flickerControl.coarseJump, - cam->params.flickerControl.allowableOverExposure, 0); + abs(cam->params.flickerControl.allowableOverExposure), + 0); - if (cam->cmd_queue & COMMAND_SETVLOFFSET) - do_command(cam, CPIA_COMMAND_SetVLOffset, - cam->params.vlOffset.gain1, - cam->params.vlOffset.gain2, - cam->params.vlOffset.gain4, - cam->params.vlOffset.gain8); + if (cam->cmd_queue & COMMAND_SETECPTIMING) + do_command(cam, CPIA_COMMAND_SetECPTiming, + cam->params.ecpTiming, 0, 0, 0); if (cam->cmd_queue & COMMAND_PAUSE) do_command(cam, CPIA_COMMAND_EndStreamCap, 0, 0, 0, 0); @@ -2149,20 +2406,416 @@ if (cam->cmd_queue & COMMAND_RESUME) init_stream_cap(cam); - if (cam->cmd_queue & COMMAND_SETLIGHTS && cam->params.qx3.qx3_detected) { - int p1 = (cam->params.qx3.bottomlight == 0) << 1; - int p2 = (cam->params.qx3.toplight == 0) << 3; - do_command(cam, CPIA_COMMAND_WriteVCReg, 0x90, 0x8F, 0x50, 0); - do_command(cam, CPIA_COMMAND_WriteMCPort, 2, 0, (p1|p2|0xE0), 0); - } + if (cam->cmd_queue & COMMAND_SETLIGHTS && cam->params.qx3.qx3_detected) + { + int p1 = (cam->params.qx3.bottomlight == 0) << 1; + int p2 = (cam->params.qx3.toplight == 0) << 3; + do_command(cam, CPIA_COMMAND_WriteVCReg, 0x90, 0x8F, 0x50, 0); + do_command(cam, CPIA_COMMAND_WriteMCPort, 2, 0, (p1|p2|0xE0), 0); + } - up(&cam->param_lock); cam->cmd_queue = COMMAND_NONE; + up(&cam->param_lock); return; } + + +static void set_flicker(struct cam_params *params, volatile u32 *command_flags, + int on) +{ + /* Everything in here is from the Windows driver */ +#define FIRMWARE_VERSION(x,y) (params->version.firmwareVersion == (x) && \ + params->version.firmwareRevision == (y)) +/* define for compgain calculation */ +#define COMPGAIN(base, curexp, newexp) \ + (u8) ((((float) base - 128.0) * ((float) curexp / (float) newexp)) + 128.5) +#define EXP_FROM_COMP(basecomp, curcomp, curexp) \ + (u16)((float)curexp * (float)(u8)(curcomp + 128) / (float)(u8)(basecomp - 128)) + int currentexp = params->exposure.coarseExpLo + + params->exposure.coarseExpHi*256; + int startexp; + if (on) { + int cj = params->flickerControl.coarseJump; + params->flickerControl.flickerMode = 1; + params->flickerControl.disabled = 0; + if(params->exposure.expMode != 2) + *command_flags |= COMMAND_SETEXPOSURE; + params->exposure.expMode = 2; + currentexp = currentexp << params->exposure.gain; + params->exposure.gain = 0; + /* round down current exposure to nearest value */ + startexp = (currentexp + ROUND_UP_EXP_FOR_FLICKER) / cj; + if(startexp < 1) + startexp = 1; + startexp = (startexp * cj) - 1; + if(FIRMWARE_VERSION(1,2)) + while(startexp > MAX_EXP_102) + startexp -= cj; + else + while(startexp > MAX_EXP) + startexp -= cj; + params->exposure.coarseExpLo = startexp & 0xff; + params->exposure.coarseExpHi = startexp >> 8; + if (currentexp > startexp) { + if (currentexp > (2 * startexp)) + currentexp = 2 * startexp; + params->exposure.redComp = COMPGAIN (COMP_RED, currentexp, startexp); + params->exposure.green1Comp = COMPGAIN (COMP_GREEN1, currentexp, startexp); + params->exposure.green2Comp = COMPGAIN (COMP_GREEN2, currentexp, startexp); + params->exposure.blueComp = COMPGAIN (COMP_BLUE, currentexp, startexp); + } else { + params->exposure.redComp = COMP_RED; + params->exposure.green1Comp = COMP_GREEN1; + params->exposure.green2Comp = COMP_GREEN2; + params->exposure.blueComp = COMP_BLUE; + } + if(FIRMWARE_VERSION(1,2)) + params->exposure.compMode = 0; + else + params->exposure.compMode = 1; + + params->apcor.gain1 = 0x18; + params->apcor.gain2 = 0x18; + params->apcor.gain4 = 0x16; + params->apcor.gain8 = 0x14; + *command_flags |= COMMAND_SETAPCOR; + } else { + params->flickerControl.flickerMode = 0; + params->flickerControl.disabled = 1; + /* Coarse = average of equivalent coarse for each comp channel */ + startexp = EXP_FROM_COMP(COMP_RED, params->exposure.redComp, currentexp); + startexp += EXP_FROM_COMP(COMP_GREEN1, params->exposure.green1Comp, currentexp); + startexp += EXP_FROM_COMP(COMP_GREEN2, params->exposure.green2Comp, currentexp); + startexp += EXP_FROM_COMP(COMP_BLUE, params->exposure.blueComp, currentexp); + startexp = startexp >> 2; + while(startexp > MAX_EXP && + params->exposure.gain < params->exposure.gainMode-1) { + startexp = startexp >> 1; + ++params->exposure.gain; + } + if(FIRMWARE_VERSION(1,2) && startexp > MAX_EXP_102) + startexp = MAX_EXP_102; + if(startexp > MAX_EXP) + startexp = MAX_EXP; + params->exposure.coarseExpLo = startexp&0xff; + params->exposure.coarseExpHi = startexp >> 8; + params->exposure.redComp = COMP_RED; + params->exposure.green1Comp = COMP_GREEN1; + params->exposure.green2Comp = COMP_GREEN2; + params->exposure.blueComp = COMP_BLUE; + params->exposure.compMode = 1; + *command_flags |= COMMAND_SETEXPOSURE; + params->apcor.gain1 = 0x18; + params->apcor.gain2 = 0x16; + params->apcor.gain4 = 0x24; + params->apcor.gain8 = 0x34; + *command_flags |= COMMAND_SETAPCOR; + } + params->vlOffset.gain1 = 20; + params->vlOffset.gain2 = 24; + params->vlOffset.gain4 = 26; + params->vlOffset.gain8 = 26; + *command_flags |= COMMAND_SETVLOFFSET; +#undef FIRMWARE_VERSION +#undef EXP_FROM_COMP +#undef COMPGAIN +} + +#define FIRMWARE_VERSION(x,y) (cam->params.version.firmwareVersion == (x) && \ + cam->params.version.firmwareRevision == (y)) +/* monitor the exposure and adjust the sensor frame rate if needed */ +static void monitor_exposure(struct cam_data *cam) +{ + u8 exp_acc, bcomp, gain, coarseL, cmd[8], data[8]; + int retval, light_exp, dark_exp, very_dark_exp; + int old_exposure, new_exposure, framerate; + + /* get necessary stats and register settings from camera */ + /* do_command can't handle this, so do it ourselves */ + cmd[0] = CPIA_COMMAND_ReadVPRegs>>8; + cmd[1] = CPIA_COMMAND_ReadVPRegs&0xff; + cmd[2] = 30; + cmd[3] = 4; + cmd[4] = 9; + cmd[5] = 8; + cmd[6] = 8; + cmd[7] = 0; + retval = cam->ops->transferCmd(cam->lowlevel_data, cmd, data); + if (retval) { + LOG("ReadVPRegs(30,4,9,8) - failed, retval=%d\n", + retval); + return; + } + exp_acc = data[0]; + bcomp = data[1]; + gain = data[2]; + coarseL = data[3]; + + down(&cam->param_lock); + light_exp = cam->params.colourParams.brightness + + TC - 50 + EXP_ACC_LIGHT; + if(light_exp > 255) + light_exp = 255; + dark_exp = cam->params.colourParams.brightness + + TC - 50 - EXP_ACC_DARK; + if(dark_exp < 0) + dark_exp = 0; + very_dark_exp = dark_exp/2; + + old_exposure = cam->params.exposure.coarseExpHi * 256 + + cam->params.exposure.coarseExpLo; + + if(!cam->params.flickerControl.disabled) { + /* Flicker control on */ + int max_comp = FIRMWARE_VERSION(1,2) ? MAX_COMP : HIGH_COMP_102; + bcomp += 128; /* decode */ + if(bcomp >= max_comp && exp_acc < dark_exp) { + /* dark */ + if(exp_acc < very_dark_exp) { + /* very dark */ + if(cam->exposure_status == EXPOSURE_VERY_DARK) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_VERY_DARK; + cam->exposure_count = 1; + } + } else { + /* just dark */ + if(cam->exposure_status == EXPOSURE_DARK) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_DARK; + cam->exposure_count = 1; + } + } + } else if(old_exposure <= LOW_EXP || exp_acc > light_exp) { + /* light */ + if(old_exposure <= VERY_LOW_EXP) { + /* very light */ + if(cam->exposure_status == EXPOSURE_VERY_LIGHT) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_VERY_LIGHT; + cam->exposure_count = 1; + } + } else { + /* just light */ + if(cam->exposure_status == EXPOSURE_LIGHT) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_LIGHT; + cam->exposure_count = 1; + } + } + } else { + /* not dark or light */ + cam->exposure_status = EXPOSURE_NORMAL; + } + } else { + /* Flicker control off */ + if(old_exposure >= MAX_EXP && exp_acc < dark_exp) { + /* dark */ + if(exp_acc < very_dark_exp) { + /* very dark */ + if(cam->exposure_status == EXPOSURE_VERY_DARK) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_VERY_DARK; + cam->exposure_count = 1; + } + } else { + /* just dark */ + if(cam->exposure_status == EXPOSURE_DARK) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_DARK; + cam->exposure_count = 1; + } + } + } else if(old_exposure <= LOW_EXP || exp_acc > light_exp) { + /* light */ + if(old_exposure <= VERY_LOW_EXP) { + /* very light */ + if(cam->exposure_status == EXPOSURE_VERY_LIGHT) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_VERY_LIGHT; + cam->exposure_count = 1; + } + } else { + /* just light */ + if(cam->exposure_status == EXPOSURE_LIGHT) + ++cam->exposure_count; + else { + cam->exposure_status = EXPOSURE_LIGHT; + cam->exposure_count = 1; + } + } + } else { + /* not dark or light */ + cam->exposure_status = EXPOSURE_NORMAL; + } + } + + framerate = cam->fps; + if(framerate > 30 || framerate < 1) + framerate = 1; + + if(!cam->params.flickerControl.disabled) { + /* Flicker control on */ + if((cam->exposure_status == EXPOSURE_VERY_DARK || + cam->exposure_status == EXPOSURE_DARK) && + cam->exposure_count >= DARK_TIME*framerate && + cam->params.sensorFps.divisor < 3) { + + /* dark for too long */ + ++cam->params.sensorFps.divisor; + cam->cmd_queue |= COMMAND_SETSENSORFPS; + + cam->params.flickerControl.coarseJump = + flicker_jumps[cam->mainsFreq] + [cam->params.sensorFps.baserate] + [cam->params.sensorFps.divisor]; + cam->cmd_queue |= COMMAND_SETFLICKERCTRL; + + new_exposure = cam->params.flickerControl.coarseJump-1; + while(new_exposure < old_exposure/2) + new_exposure += cam->params.flickerControl.coarseJump; + cam->params.exposure.coarseExpLo = new_exposure & 0xff; + cam->params.exposure.coarseExpHi = new_exposure >> 8; + cam->cmd_queue |= COMMAND_SETEXPOSURE; + cam->exposure_status = EXPOSURE_NORMAL; + LOG("Automatically decreasing sensor_fps\n"); + + } else if((cam->exposure_status == EXPOSURE_VERY_LIGHT || + cam->exposure_status == EXPOSURE_LIGHT) && + cam->exposure_count >= LIGHT_TIME*framerate && + cam->params.sensorFps.divisor > 0) { + + /* light for too long */ + int max_exp = FIRMWARE_VERSION(1,2) ? MAX_EXP_102 : MAX_EXP ; + + --cam->params.sensorFps.divisor; + cam->cmd_queue |= COMMAND_SETSENSORFPS; + + cam->params.flickerControl.coarseJump = + flicker_jumps[cam->mainsFreq] + [cam->params.sensorFps.baserate] + [cam->params.sensorFps.divisor]; + cam->cmd_queue |= COMMAND_SETFLICKERCTRL; + + new_exposure = cam->params.flickerControl.coarseJump-1; + while(new_exposure < 2*old_exposure && + new_exposure+ + cam->params.flickerControl.coarseJump < max_exp) + new_exposure += cam->params.flickerControl.coarseJump; + cam->params.exposure.coarseExpLo = new_exposure & 0xff; + cam->params.exposure.coarseExpHi = new_exposure >> 8; + cam->cmd_queue |= COMMAND_SETEXPOSURE; + cam->exposure_status = EXPOSURE_NORMAL; + LOG("Automatically increasing sensor_fps\n"); + } + } else { + /* Flicker control off */ + if((cam->exposure_status == EXPOSURE_VERY_DARK || + cam->exposure_status == EXPOSURE_DARK) && + cam->exposure_count >= DARK_TIME*framerate && + cam->params.sensorFps.divisor < 3) { + + /* dark for too long */ + ++cam->params.sensorFps.divisor; + cam->cmd_queue |= COMMAND_SETSENSORFPS; + + if(cam->params.exposure.gain > 0) { + --cam->params.exposure.gain; + cam->cmd_queue |= COMMAND_SETEXPOSURE; + } + cam->exposure_status = EXPOSURE_NORMAL; + LOG("Automatically decreasing sensor_fps\n"); + + } else if((cam->exposure_status == EXPOSURE_VERY_LIGHT || + cam->exposure_status == EXPOSURE_LIGHT) && + cam->exposure_count >= LIGHT_TIME*framerate && + cam->params.sensorFps.divisor > 0) { + + /* light for too long */ + --cam->params.sensorFps.divisor; + cam->cmd_queue |= COMMAND_SETSENSORFPS; + + if(cam->params.exposure.gain < + cam->params.exposure.gainMode-1) { + ++cam->params.exposure.gain; + cam->cmd_queue |= COMMAND_SETEXPOSURE; + } + cam->exposure_status = EXPOSURE_NORMAL; + LOG("Automatically increasing sensor_fps\n"); + } + } + up(&cam->param_lock); +} + +/*-----------------------------------------------------------------*/ +/* if flicker is switched off, this function switches it back on.It checks, + however, that conditions are suitable before restarting it. + This should only be called for firmware version 1.2. + + It also adjust the colour balance when an exposure step is detected - as + long as flicker is running +*/ +static void restart_flicker(struct cam_data *cam) +{ + int cam_exposure, old_exp; + if(!FIRMWARE_VERSION(1,2)) + return; + down(&cam->param_lock); + if(cam->params.flickerControl.flickerMode == 0 || + cam->raw_image[39] == 0) { + up(&cam->param_lock); + return; + } + cam_exposure = cam->raw_image[39]*2; + old_exp = cam->params.exposure.coarseExpLo + + cam->params.exposure.coarseExpHi*256; + /* + see how far away camera exposure is from a valid + flicker exposure value + */ + cam_exposure %= cam->params.flickerControl.coarseJump; + if(!cam->params.flickerControl.disabled && + cam_exposure <= cam->params.flickerControl.coarseJump - 3) { + /* Flicker control auto-disabled */ + cam->params.flickerControl.disabled = 1; + } + + if(cam->params.flickerControl.disabled && + cam->params.flickerControl.flickerMode && + old_exp > cam->params.flickerControl.coarseJump + + ROUND_UP_EXP_FOR_FLICKER) { + /* exposure is now high enough to switch + flicker control back on */ + set_flicker(&cam->params, &cam->cmd_queue, 1); + if((cam->cmd_queue & COMMAND_SETEXPOSURE) && + cam->params.exposure.expMode == 2) + cam->exposure_status = EXPOSURE_NORMAL; + + } + up(&cam->param_lock); +} +#undef FIRMWARE_VERSION + +static int clear_stall(struct cam_data *cam) +{ + /* FIXME: Does this actually work? */ + LOG("Clearing stall\n"); + + cam->ops->streamRead(cam->lowlevel_data, cam->raw_image, 0); + do_command(cam, CPIA_COMMAND_GetCameraStatus,0,0,0,0); + return cam->params.status.streamState != STREAM_PAUSED; +} + /* kernel thread function to read image from camera */ -static void fetch_frame(void *data) +static int fetch_frame(void *data) { int image_size, retry; struct cam_data *cam = (struct cam_data *)data; @@ -2179,41 +2832,54 @@ /* load first frame always uncompressed */ if (cam->first_frame && - cam->params.compression.mode != CPIA_COMPRESSION_NONE) + cam->params.compression.mode != CPIA_COMPRESSION_NONE) { do_command(cam, CPIA_COMMAND_SetCompression, CPIA_COMPRESSION_NONE, NO_DECIMATION, 0, 0); + /* Trial & error - Discarding a frame prevents the + first frame from having an error in the data. */ + do_command(cam, CPIA_COMMAND_DiscardFrame, 0, 0, 0, 0); + } /* init camera upload */ - if (do_command(cam, CPIA_COMMAND_SetGrabMode, - CPIA_GRAB_CONTINUOUS, 0, 0, 0)) - continue; - if (do_command(cam, CPIA_COMMAND_GrabFrame, 0, cam->params.streamStartLine, 0, 0)) continue; if (cam->ops->wait_for_stream_ready) { /* loop until image ready */ + int count = 0; do_command(cam, CPIA_COMMAND_GetCameraStatus,0,0,0,0); while (cam->params.status.streamState != STREAM_READY) { + if(++count > READY_TIMEOUT) + break; + if(cam->params.status.streamState == + STREAM_PAUSED) { + /* Bad news */ + if(!clear_stall(cam)) + return -EIO; + } + cond_resched(); + /* sleep for 10 ms, hopefully ;) */ current->state = TASK_INTERRUPTIBLE; - /* sleep for 10 ms, hopefully ;) */ schedule_timeout(10*HZ/1000); if (signal_pending(current)) - return; + return -EINTR; do_command(cam, CPIA_COMMAND_GetCameraStatus, 0, 0, 0, 0); } + if(cam->params.status.streamState != STREAM_READY) { + continue; + } } - /* grab image from camera */ cond_resched(); + /* grab image from camera */ oldjif = jiffies; image_size = cam->ops->streamRead(cam->lowlevel_data, cam->raw_image, 0); @@ -2227,6 +2893,14 @@ cam->transfer_rate = diff==0 ? rate : rate/diff; /* diff==0 ? unlikely but possible */ + /* Switch flicker control back on if it got turned off */ + restart_flicker(cam); + + /* If AEC is enabled, monitor the exposure and + adjust the sensor frame rate if needed */ + if(cam->params.exposure.expMode == 2) + monitor_exposure(cam); + /* camera idle now so dispatch queued commands */ dispatch_commands(cam); @@ -2238,12 +2912,28 @@ /* decompress and convert image to by copying it from * raw_image to decompressed_frame */ + cond_resched(); cam->image_size = parse_picture(cam, image_size); - if (cam->image_size <= 0) + if (cam->image_size <= 0) { DBG("parse_picture failed %d\n", cam->image_size); - else + if(cam->params.compression.mode != + CPIA_COMPRESSION_NONE) { + /* Compression may not work right if we + had a bad frame, get the next one + uncompressed. */ + cam->first_frame = 1; + do_command(cam, CPIA_COMMAND_SetGrabMode, + CPIA_GRAB_SINGLE, 0, 0, 0); + /* FIXME: Trial & error - need up to 70ms for + the grab mode change to complete ? */ + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(70*HZ / 1000); + if (signal_pending(current)) + return -EINTR; + } + } else break; } @@ -2257,66 +2947,51 @@ } else cam->decompressed_frame.state = FRAME_DONE; -#if 0 - if (cam->first_frame && - cam->params.compression.mode != CPIA_COMPRESSION_NONE) { - cam->first_frame = 0; - cam->cmd_queue |= COMMAND_SETCOMPRESSION; - } -#else if (cam->first_frame) { cam->first_frame = 0; - cam->cmd_queue |= COMMAND_SETCOMPRESSION; - cam->cmd_queue |= COMMAND_SETEXPOSURE; + do_command(cam, CPIA_COMMAND_SetCompression, + cam->params.compression.mode, + cam->params.compression.decimation, 0, 0); + + /* Switch from single-grab to continuous grab */ + do_command(cam, CPIA_COMMAND_SetGrabMode, + CPIA_GRAB_CONTINUOUS, 0, 0, 0); } -#endif + return 0; } + return -EIO; } static int capture_frame(struct cam_data *cam, struct video_mmap *vm) { - int retval = 0; - if (!cam->frame_buf) { /* we do lazy allocation */ - if ((retval = allocate_frame_buf(cam))) - return retval; + int err; + if ((err = allocate_frame_buf(cam))) + return err; } - /* FIXME: the first frame seems to be captured by the camera - without regards to any initial settings, so we throw away - that one, the next one is generated with our settings - (exposure, color balance, ...) - */ - if (cam->first_frame) { - cam->curframe = vm->frame; - cam->frame[cam->curframe].state = FRAME_READY; - fetch_frame(cam); - if (cam->frame[cam->curframe].state != FRAME_DONE) - retval = -EIO; - } cam->curframe = vm->frame; cam->frame[cam->curframe].state = FRAME_READY; - fetch_frame(cam); - if (cam->frame[cam->curframe].state != FRAME_DONE) - retval=-EIO; - - return retval; + return fetch_frame(cam); } static int goto_high_power(struct cam_data *cam) { if (do_command(cam, CPIA_COMMAND_GotoHiPower, 0, 0, 0, 0)) - return -1; - mdelay(100); /* windows driver does it too */ + return -EIO; + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(40*HZ/1000); /* windows driver does it too */ + if(signal_pending(current)) + return -EINTR; if (do_command(cam, CPIA_COMMAND_GetCameraStatus, 0, 0, 0, 0)) - return -1; + return -EIO; if (cam->params.status.systemState == HI_POWER_STATE) { DBG("camera now in HIGH power state\n"); return 0; } printstatus(cam); - return -1; + return -EIO; } static int goto_low_power(struct cam_data *cam) @@ -2335,8 +3010,10 @@ static void save_camera_state(struct cam_data *cam) { - do_command(cam, CPIA_COMMAND_GetColourBalance, 0, 0, 0, 0); - do_command(cam, CPIA_COMMAND_GetExposure, 0, 0, 0, 0); + if(!(cam->cmd_queue & COMMAND_SETCOLOURBALANCE)) + do_command(cam, CPIA_COMMAND_GetColourBalance, 0, 0, 0, 0); + if(!(cam->cmd_queue & COMMAND_SETEXPOSURE)) + do_command(cam, CPIA_COMMAND_GetExposure, 0, 0, 0, 0); DBG("%d/%d/%d/%d/%d/%d/%d/%d\n", cam->params.exposure.gain, @@ -2353,44 +3030,8 @@ cam->params.colourBalance.blueGain); } -static void set_camera_state(struct cam_data *cam) +static int set_camera_state(struct cam_data *cam) { - if(cam->params.colourBalance.balanceModeIsAuto) { - do_command(cam, CPIA_COMMAND_SetColourBalance, - 2, 0, 0, 0); - } else { - do_command(cam, CPIA_COMMAND_SetColourBalance, - 1, - cam->params.colourBalance.redGain, - cam->params.colourBalance.greenGain, - cam->params.colourBalance.blueGain); - do_command(cam, CPIA_COMMAND_SetColourBalance, - 3, 0, 0, 0); - } - - - do_command_extended(cam, CPIA_COMMAND_SetExposure, - cam->params.exposure.gainMode, 1, 1, - cam->params.exposure.centreWeight, - cam->params.exposure.gain, - cam->params.exposure.fineExp, - cam->params.exposure.coarseExpLo, - cam->params.exposure.coarseExpHi, - cam->params.exposure.redComp, - cam->params.exposure.green1Comp, - cam->params.exposure.green2Comp, - cam->params.exposure.blueComp); - do_command_extended(cam, CPIA_COMMAND_SetExposure, - 0, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0); - - if (!cam->params.exposure.gainMode) - cam->params.exposure.gainMode = 2; - if (!cam->params.exposure.expMode) - cam->params.exposure.expMode = 2; - if (!cam->params.exposure.centreWeight) - cam->params.exposure.centreWeight = 1; - cam->cmd_queue = COMMAND_SETCOMPRESSION | COMMAND_SETCOMPRESSIONTARGET | COMMAND_SETCOLOURPARAMS | @@ -2398,18 +3039,29 @@ COMMAND_SETYUVTHRESH | COMMAND_SETECPTIMING | COMMAND_SETCOMPRESSIONPARAMS | -#if 0 COMMAND_SETEXPOSURE | -#endif COMMAND_SETCOLOURBALANCE | COMMAND_SETSENSORFPS | COMMAND_SETAPCOR | COMMAND_SETFLICKERCTRL | COMMAND_SETVLOFFSET; + + do_command(cam, CPIA_COMMAND_SetGrabMode, CPIA_GRAB_SINGLE,0,0,0); dispatch_commands(cam); + + /* Wait 6 frames for the sensor to get all settings and + AEC/ACB to settle */ + current->state = TASK_INTERRUPTIBLE; + schedule_timeout((6*(cam->params.sensorFps.baserate ? 33 : 40) * + (1 << cam->params.sensorFps.divisor) + 10) * + HZ / 1000); + + if(signal_pending(current)) + return -EINTR; + save_camera_state(cam); - return; + return 0; } static void get_version_information(struct cam_data *cam) @@ -2424,14 +3076,16 @@ /* initialize camera */ static int reset_camera(struct cam_data *cam) { + int err; /* Start the camera in low power mode */ if (goto_low_power(cam)) { if (cam->params.status.systemState != WARM_BOOT_STATE) return -ENODEV; /* FIXME: this is just dirty trial and error */ - reset_camera_struct(cam); - goto_high_power(cam); + err = goto_high_power(cam); + if(err) + return err; do_command(cam, CPIA_COMMAND_DiscardFrame, 0, 0, 0, 0); if (goto_low_power(cam)) return -ENODEV; @@ -2439,12 +3093,18 @@ /* procedure described in developer's guide p3-28 */ - /* Check the firmware version FIXME: should we check PNPID? */ + /* Check the firmware version. */ cam->params.version.firmwareVersion = 0; get_version_information(cam); if (cam->params.version.firmwareVersion != 1) return -ENODEV; + /* A bug in firmware 1-02 limits gainMode to 2 */ + if(cam->params.version.firmwareRevision <= 2 && + cam->params.exposure.gainMode > 2) { + cam->params.exposure.gainMode = 2; + } + /* set QX3 detected flag */ cam->params.qx3.qx3_detected = (cam->params.pnpID.vendor == 0x0813 && cam->params.pnpID.product == 0x0001); @@ -2458,8 +3118,9 @@ STREAM_NOT_READY, 0); /* GotoHiPower */ - if (goto_high_power(cam)) - return -ENODEV; + err = goto_high_power(cam); + if (err) + return err; /* Check the camera status */ if (do_command(cam, CPIA_COMMAND_GetCameraStatus, 0, 0, 0, 0)) @@ -2492,9 +3153,13 @@ do_command(cam, CPIA_COMMAND_GetVPVersion, 0, 0, 0, 0); /* set camera to a known state */ - set_camera_state(cam); - - return 0; + return set_camera_state(cam); +} + +static void put_cam(struct cpia_camera_ops* ops) +{ + if (ops->owner) + __MOD_DEC_USE_COUNT(ops->owner); } /* ------------------------- V4L interface --------------------- */ @@ -2508,7 +3173,10 @@ DBG("Internal error, cam_data not found!\n"); return -ENODEV; } - + + if (!try_inc_mod_count(cam->ops->owner)) + return -ENODEV; + down(&cam->busy_lock); err = -EBUSY; if (cam->open_count > 0) { @@ -2522,7 +3190,7 @@ if (!cam->raw_image) goto oops; } - + if (!cam->decompressed_frame.data) { cam->decompressed_frame.data = rvmalloc(CPIA_MAX_FRAME_SIZE); if (!cam->decompressed_frame.data) @@ -2539,6 +3207,9 @@ cam->ops->close(cam->lowlevel_data); goto oops; } + + if(signal_pending(current)) + return -EINTR; /* Set ownership of /proc/cpia/videoX to current user */ if(cam->proc_entry) @@ -2552,6 +3223,7 @@ ++cam->open_count; file->private_data = dev; + up(&cam->busy_lock); return 0; oops: @@ -2564,6 +3236,7 @@ cam->raw_image = NULL; } up(&cam->busy_lock); + put_cam(cam->ops); return err; } @@ -2591,6 +3264,8 @@ /* close cpia */ cam->ops->close(cam->lowlevel_data); + + put_cam(cam->ops); } if (--cam->open_count == 0) { @@ -2621,6 +3296,7 @@ { struct video_device *dev = file->private_data; struct cam_data *cam = dev->priv; + int err; /* make this _really_ smp and multithread-safe */ if (down_interruptible(&cam->busy_lock)) @@ -2647,19 +3323,17 @@ /* upload frame */ cam->decompressed_frame.state = FRAME_READY; cam->mmap_kludge=0; - fetch_frame(cam); - if (cam->decompressed_frame.state != FRAME_DONE) { - DBG("upload failed %d/%d\n", cam->decompressed_frame.count, - cam->decompressed_frame.state); + if((err = fetch_frame(cam)) != 0) { + DBG("ERROR from fetch_frame: %d\n", err); up(&cam->busy_lock); - return -EIO; + return err; } cam->decompressed_frame.state = FRAME_UNUSED; /* copy data to user space */ if (cam->decompressed_frame.count > count) { DBG("count wrong: %d, %lu\n", cam->decompressed_frame.count, - count); + (unsigned long) count); up(&cam->busy_lock); return -EFAULT; } @@ -2698,7 +3372,7 @@ DBG("VIDIOCGCAP\n"); strcpy(b->name, "CPiA Camera"); - b->type = VID_TYPE_CAPTURE; + b->type = VID_TYPE_CAPTURE | VID_TYPE_SUBCAPTURE; b->channels = 1; b->audios = 0; b->maxwidth = 352; /* VIDEOSIZE_CIF */ @@ -2754,8 +3428,8 @@ DBG("VIDIOCSPICT\n"); /* check validity */ - DBG("palette: %d\n", vp.palette); - DBG("depth: %d\n", vp.depth); + DBG("palette: %d\n", vp->palette); + DBG("depth: %d\n", vp->depth); if (!valid_mode(vp->palette, vp->depth)) { retval = -EINVAL; break; @@ -2825,6 +3499,10 @@ break; } cam->video_size = video_size; + + /* video size is changing, reset the subcapture area */ + memset(&cam->vc, 0, sizeof(cam->vc)); + set_vw_size(cam); DBG("%d / %d\n", cam->vw.width, cam->vw.height); cam->cmd_queue |= COMMAND_SETFORMAT; @@ -2904,6 +3582,10 @@ } if (video_size != cam->video_size) { cam->video_size = video_size; + + /* video size is changing, reset the subcapture area */ + memset(&cam->vc, 0, sizeof(cam->vc)); + set_vw_size(cam); cam->cmd_queue |= COMMAND_SETFORMAT; dispatch_commands(cam); @@ -2946,6 +3628,77 @@ break; } + case VIDIOCGCAPTURE: + DBG("VIDIOCGCAPTURE\n"); + if (copy_to_user(arg, &cam->vc, sizeof(struct video_capture))) + retval = -EFAULT; + break; + + case VIDIOCSCAPTURE: + { + struct video_capture vc; + + DBG("VIDIOCSCAPTURE\n"); + if (copy_from_user(&vc, arg, sizeof(vc))) { + retval = -EFAULT; + break; + } + + if (vc.decimation != 0) { /* How should this be used? */ + retval = -EINVAL; + break; + } + if (vc.flags != 0) { /* Even/odd grab not supported */ + retval = -EINVAL; + break; + } + + /* Clip to the resolution we can set for the ROI + (every 8 columns and 4 rows) */ + vc.x = vc.x & ~(__u32)7; + vc.y = vc.y & ~(__u32)3; + vc.width = vc.width & ~(__u32)7; + vc.height = vc.height & ~(__u32)3; + + if(vc.width == 0 || vc.height == 0 || + vc.x + vc.width > cam->vw.width || + vc.y + vc.height > cam->vw.height) { + retval = -EINVAL; + break; + } + + DBG("%d,%d/%dx%d\n", vc.x,vc.y,vc.width, vc.height); + + down(&cam->param_lock); + + cam->vc.x = vc.x; + cam->vc.y = vc.y; + cam->vc.width = vc.width; + cam->vc.height = vc.height; + + set_vw_size(cam); + cam->cmd_queue |= COMMAND_SETFORMAT; + + up(&cam->param_lock); + + /* setformat ignored by camera during streaming, + * so stop/dispatch/start */ + dispatch_commands(cam); + break; + } + + case VIDIOCGUNIT: + { + struct video_unit vu; + vu.video = cam->vdev.minor; + vu.vbi = VIDEO_NO_UNIT; + vu.radio = VIDEO_NO_UNIT; + vu.audio = VIDEO_NO_UNIT; + vu.teletext = VIDEO_NO_UNIT; + break; + } + + /* pointless to implement overlay with this camera */ case VIDIOCCAPTURE: case VIDIOCGFBUF: @@ -2966,7 +3719,6 @@ break; } - up(&cam->param_lock); up(&cam->busy_lock); return retval; } @@ -3057,7 +3809,7 @@ cam->params.colourParams.brightness = 50; cam->params.colourParams.contrast = 48; cam->params.colourParams.saturation = 50; - cam->params.exposure.gainMode = 2; + cam->params.exposure.gainMode = 4; cam->params.exposure.expMode = 2; /* AEC */ cam->params.exposure.compMode = 1; cam->params.exposure.centreWeight = 1; @@ -3065,27 +3817,31 @@ cam->params.exposure.fineExp = 0; cam->params.exposure.coarseExpLo = 185; cam->params.exposure.coarseExpHi = 0; - cam->params.exposure.redComp = 220; - cam->params.exposure.green1Comp = 214; - cam->params.exposure.green2Comp = 214; - cam->params.exposure.blueComp = 230; - cam->params.colourBalance.balanceModeIsAuto = 1; + cam->params.exposure.redComp = COMP_RED; + cam->params.exposure.green1Comp = COMP_GREEN1; + cam->params.exposure.green2Comp = COMP_GREEN2; + cam->params.exposure.blueComp = COMP_BLUE; + cam->params.colourBalance.balanceMode = 2; /* ACB */ cam->params.colourBalance.redGain = 32; cam->params.colourBalance.greenGain = 6; cam->params.colourBalance.blueGain = 92; - cam->params.apcor.gain1 = 0x1c; - cam->params.apcor.gain2 = 0x1a; - cam->params.apcor.gain4 = 0x2d; - cam->params.apcor.gain8 = 0x2a; + cam->params.apcor.gain1 = 0x18; + cam->params.apcor.gain2 = 0x16; + cam->params.apcor.gain4 = 0x24; + cam->params.apcor.gain8 = 0x34; cam->params.flickerControl.flickerMode = 0; + cam->params.flickerControl.disabled = 1; + cam->params.flickerControl.coarseJump = flicker_jumps[cam->mainsFreq] [cam->params.sensorFps.baserate] [cam->params.sensorFps.divisor]; - cam->params.vlOffset.gain1 = 24; - cam->params.vlOffset.gain2 = 28; - cam->params.vlOffset.gain4 = 30; - cam->params.vlOffset.gain8 = 30; + cam->params.flickerControl.allowableOverExposure = + -find_over_exposure(cam->params.colourParams.brightness); + cam->params.vlOffset.gain1 = 20; + cam->params.vlOffset.gain2 = 24; + cam->params.vlOffset.gain4 = 26; + cam->params.vlOffset.gain8 = 26; cam->params.compressionParams.hysteresis = 3; cam->params.compressionParams.threshMax = 11; cam->params.compressionParams.smallStep = 1; @@ -3097,6 +3853,7 @@ /* End of default values from Software Developer's Guide */ cam->transfer_rate = 0; + cam->exposure_status = EXPOSURE_NORMAL; /* Set Sensor FPS to 15fps. This seems better than 30fps * for indoor lighting. */ @@ -3131,17 +3888,21 @@ cam->vp.depth = 24; /* to be set by user */ cam->vp.palette = VIDEO_PALETTE_RGB24; /* to be set by user */ + cam->vc.x = 0; + cam->vc.y = 0; + cam->vc.width = 0; + cam->vc.height = 0; + cam->vw.x = 0; cam->vw.y = 0; set_vw_size(cam); cam->vw.chromakey = 0; - /* PP NOTE: my extension to use vw.flags for this, bear it! */ cam->vw.flags = 0; cam->vw.clipcount = 0; cam->vw.clips = NULL; cam->cmd_queue = COMMAND_NONE; - cam->first_frame = 0; + cam->first_frame = 1; return; } diff -Nru a/drivers/media/video/cpia.h b/drivers/media/video/cpia.h --- a/drivers/media/video/cpia.h Mon Oct 28 16:32:37 2002 +++ b/drivers/media/video/cpia.h Mon Oct 28 16:32:37 2002 @@ -26,13 +26,13 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#define CPIA_MAJ_VER 0 -#define CPIA_MIN_VER 8 -#define CPIA_PATCH_VER 1 - -#define CPIA_PP_MAJ_VER 0 -#define CPIA_PP_MIN_VER 8 -#define CPIA_PP_PATCH_VER 1 +#define CPIA_MAJ_VER 1 +#define CPIA_MIN_VER 2 +#define CPIA_PATCH_VER 2 + +#define CPIA_PP_MAJ_VER 1 +#define CPIA_PP_MIN_VER 2 +#define CPIA_PP_PATCH_VER 2 #define CPIA_MAX_FRAME_SIZE_UNALIGNED (352 * 288 * 4) /* CIF at RGB32 */ #define CPIA_MAX_FRAME_SIZE ((CPIA_MAX_FRAME_SIZE_UNALIGNED + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)) /* align above to PAGE_SIZE */ @@ -93,6 +93,11 @@ * is STREAM_READY before calling streamRead. */ int wait_for_stream_ready; + + /* + * Used to maintain lowlevel module usage counts + */ + struct module *owner; }; struct cpia_frame { @@ -150,7 +155,7 @@ u8 blueComp; } exposure; struct { - u8 balanceModeIsAuto; + u8 balanceMode; u8 redGain; u8 greenGain; u8 blueGain; @@ -166,9 +171,10 @@ u8 gain8; } apcor; struct { + u8 disabled; u8 flickerMode; u8 coarseJump; - u8 allowableOverExposure; + int allowableOverExposure; } flickerControl; struct { u8 gain1; @@ -261,6 +267,7 @@ struct video_device vdev; /* v4l videodev */ struct video_picture vp; /* v4l camera settings */ struct video_window vw; /* v4l capture area */ + struct video_capture vc; /* v4l subcapture area */ /* mmap interface */ int curframe; /* the current frame to grab into */ @@ -271,6 +278,8 @@ int first_frame; int mmap_kludge; /* 'wrong' byte order for mmap */ volatile u32 cmd_queue; /* queued commands */ + int exposure_status; /* EXPOSURE_* */ + int exposure_count; /* number of frames at this status */ }; /* cpia_register_camera is called by low level driver for each camera. @@ -382,15 +391,27 @@ #define VP_STATE_ACB_RMAX 0x40 #define VP_STATE_ACB_GMAX 0x80 +/* default (minimum) compensation values */ +#define COMP_RED 220 +#define COMP_GREEN1 214 +#define COMP_GREEN2 COMP_GREEN1 +#define COMP_BLUE 230 + +/* exposure status */ +#define EXPOSURE_VERY_LIGHT 0 +#define EXPOSURE_LIGHT 1 +#define EXPOSURE_NORMAL 2 +#define EXPOSURE_DARK 3 +#define EXPOSURE_VERY_DARK 4 + /* ErrorCode */ #define ERROR_FLICKER_BELOW_MIN_EXP 0x01 /*flicker exposure got below minimum exposure */ - #define ALOG(fmt,args...) printk(fmt, ##args) #define LOG(fmt,args...) ALOG(KERN_INFO __FILE__ ":%s(%d):" fmt, __FUNCTION__ , __LINE__ , ##args) #ifdef _CPIA_DEBUG_ -#define ADBG(lineno,fmt,args...) printk(fmt, jiffies, lineno, ##args) -#define DBG(fmt,args...) ADBG((__LINE__), KERN_DEBUG __FILE__" (%ld):" __FUNCTION__ "(%d):" fmt, ##args) +#define ADBG(fmt,args...) printk(fmt, jiffies, ##args) +#define DBG(fmt,args...) ADBG(KERN_DEBUG __FILE__" (%ld):%s(%d):" fmt, __FUNCTION__, __LINE__ , ##args) #else #define DBG(fmn,args...) do {} while(0) #endif @@ -400,15 +421,19 @@ (p)&0x80?1:0, (p)&0x40?1:0, (p)&0x20?1:0, (p)&0x10?1:0,\ (p)&0x08?1:0, (p)&0x04?1:0, (p)&0x02?1:0, (p)&0x01?1:0); -static inline void cpia_add_to_list(struct cam_data* l, struct cam_data* drv) +static inline void cpia_add_to_list(struct cam_data** l, struct cam_data** drv_p) { - drv->next = l; - drv->previous = &l; - l = drv; + struct cam_data* drv; + drv = *drv_p; + drv->next = *l; + drv->previous = l; + *l = drv; } -static inline void cpia_remove_from_list(struct cam_data* drv) +static inline void cpia_remove_from_list(struct cam_data** drv_p) { + struct cam_data* drv; + drv = *drv_p; if (drv->previous != NULL) { if (drv->next != NULL) drv->next->previous = drv->previous; diff -Nru a/drivers/media/video/cpia_pp.c b/drivers/media/video/cpia_pp.c --- a/drivers/media/video/cpia_pp.c Mon Oct 28 16:32:35 2002 +++ b/drivers/media/video/cpia_pp.c Mon Oct 28 16:32:35 2002 @@ -157,7 +157,8 @@ cpia_pp_streamStop, cpia_pp_streamRead, cpia_pp_close, - 1 + 1, + THIS_MODULE }; static struct cam_data *cam_list; @@ -565,7 +566,7 @@ return -ENXIO; } spin_lock( &cam_list_lock_pp ); - cpia_add_to_list(cam_list, cpia); + cpia_add_to_list(&cam_list, &cpia); spin_unlock( &cam_list_lock_pp ); return 0; @@ -575,11 +576,11 @@ { struct cam_data *cpia; - spin_lock( &cam_list_lock_pp ); for(cpia = cam_list; cpia != NULL; cpia = cpia->next) { struct pp_cam_entry *cam = cpia->lowlevel_data; if (cam && cam->port->number == port->number) { - cpia_remove_from_list(cpia); + spin_lock( &cam_list_lock_pp ); + cpia_remove_from_list(&cpia); spin_unlock( &cam_list_lock_pp ); cpia_unregister_camera(cpia); diff -Nru a/drivers/media/video/cpia_usb.c b/drivers/media/video/cpia_usb.c --- a/drivers/media/video/cpia_usb.c Mon Oct 28 16:32:35 2002 +++ b/drivers/media/video/cpia_usb.c Mon Oct 28 16:32:35 2002 @@ -100,7 +100,8 @@ cpia_usb_streamStop, cpia_usb_streamRead, cpia_usb_close, - 0 + 0, + THIS_MODULE }; static struct cam_data *cam_list; @@ -548,7 +549,7 @@ } spin_lock( &cam_list_lock_usb ); - cpia_add_to_list(cam_list, cam); + cpia_add_to_list(&cam_list, &cam); spin_unlock( &cam_list_lock_usb ); dev_set_drvdata(&intf->dev, cam); @@ -602,7 +603,7 @@ ucpia = (struct usb_cpia *) cam->lowlevel_data; spin_lock( &cam_list_lock_usb ); - cpia_remove_from_list(cam); + cpia_remove_from_list(&cam); spin_unlock( &cam_list_lock_usb ); /* Don't even try to reset the altsetting if we're disconnected */ diff -Nru a/drivers/media/video/planb.c b/drivers/media/video/planb.c --- a/drivers/media/video/planb.c Mon Oct 28 16:32:37 2002 +++ b/drivers/media/video/planb.c Mon Oct 28 16:32:37 2002 @@ -41,7 +41,6 @@ #include #include #include -#include #include #include #include diff -Nru a/drivers/media/video/w9966.c b/drivers/media/video/w9966.c --- a/drivers/media/video/w9966.c Mon Oct 28 16:32:36 2002 +++ b/drivers/media/video/w9966.c Mon Oct 28 16:32:36 2002 @@ -130,7 +130,7 @@ MODULE_PARM(pardev, "1-" __MODULE_STRING(W9966_MAXCAMS) "s"); MODULE_PARM_DESC(pardev, "pardev: where to search for\n\ \teach camera. 'aggressive' means brute-force search.\n\ -\tEg: >pardev=parport3,aggressive,parport2,parport1< would assign +\tEg: >pardev=parport3,aggressive,parport2,parport1< would assign\n\ \tcam 1 to parport3 and search every parport for cam 2 etc..."); static int parmode = 0; diff -Nru a/drivers/message/fusion/mptlan.h b/drivers/message/fusion/mptlan.h --- a/drivers/message/fusion/mptlan.h Mon Oct 28 16:32:36 2002 +++ b/drivers/message/fusion/mptlan.h Mon Oct 28 16:32:36 2002 @@ -8,6 +8,7 @@ #include #endif +#include #include #include // #include diff -Nru a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c --- a/drivers/message/fusion/mptscsih.c Mon Oct 28 16:32:36 2002 +++ b/drivers/message/fusion/mptscsih.c Mon Oct 28 16:32:36 2002 @@ -1295,10 +1295,6 @@ #endif sh->this_id = this->pfacts[portnum].PortSCSIID; - /* OS entry to allow host drivers to force - * a queue depth on a per device basis. - */ - sh->select_queue_depths = mptscsih_select_queue_depths; /* Required entry. */ sh->unique_id = this->id; @@ -3668,23 +3664,15 @@ * Called once per device the bus scan. Use it to force the queue_depth * member to 1 if a device does not support Q tags. */ -void -mptscsih_select_queue_depths(struct Scsi_Host *sh, Scsi_Device *sdList) +int +mptscsih_slave_attach(Scsi_Device *device) { - struct scsi_device *device; + struct Scsi_Host *host = device->host; VirtDevice *pTarget; MPT_SCSI_HOST *hd; int ii, max; - for (device = sdList; device != NULL; device = device->next) { - - if (device->host != sh) - continue; - - hd = (MPT_SCSI_HOST *) sh->hostdata; - if (hd == NULL) - continue; - + hd = (MPT_SCSI_HOST *)host->hostdata; if (hd->Targets != NULL) { if (hd->is_spi) max = MPT_MAX_SCSI_DEVICES; @@ -3694,11 +3682,11 @@ for (ii=0; ii < max; ii++) { pTarget = hd->Targets[ii]; if (pTarget && !(pTarget->tflags & MPT_TARGET_FLAGS_Q_YES)) { - device->queue_depth = 1; - } + scsi_adjust_queue_depth(device, 0, 1); } } } + return 0; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ diff -Nru a/drivers/message/fusion/mptscsih.h b/drivers/message/fusion/mptscsih.h --- a/drivers/message/fusion/mptscsih.h Mon Oct 28 16:32:38 2002 +++ b/drivers/message/fusion/mptscsih.h Mon Oct 28 16:32:38 2002 @@ -206,11 +206,11 @@ #define x_scsi_dev_reset mptscsih_dev_reset #define x_scsi_host_reset mptscsih_host_reset #define x_scsi_bios_param mptscsih_bios_param -#define x_scsi_select_queue_depths mptscsih_select_queue_depths #define x_scsi_taskmgmt_bh mptscsih_taskmgmt_bh #define x_scsi_old_abort mptscsih_old_abort #define x_scsi_old_reset mptscsih_old_reset +#define x_scsi_slave_attach mptscsih_slave_attach /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /* @@ -234,8 +234,8 @@ #else extern int x_scsi_bios_param(Disk *, kdev_t, int *); #endif -extern void x_scsi_select_queue_depths(struct Scsi_Host *, Scsi_Device *); extern void x_scsi_taskmgmt_bh(void *); +extern int x_scsi_slave_attach(Scsi_Device *); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) #define PROC_SCSI_DECL @@ -248,53 +248,45 @@ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,1) #define MPT_SCSIHOST { \ - next: NULL, \ PROC_SCSI_DECL \ - name: "MPT SCSI Host", \ - detect: x_scsi_detect, \ - release: x_scsi_release, \ - info: x_scsi_info, \ - command: NULL, \ - queuecommand: x_scsi_queuecommand, \ - eh_strategy_handler: NULL, \ - eh_abort_handler: x_scsi_abort, \ - eh_device_reset_handler: x_scsi_dev_reset, \ - eh_bus_reset_handler: x_scsi_bus_reset, \ - eh_host_reset_handler: x_scsi_host_reset, \ - bios_param: x_scsi_bios_param, \ - can_queue: MPT_SCSI_CAN_QUEUE, \ - this_id: -1, \ - sg_tablesize: MPT_SCSI_SG_DEPTH, \ - max_sectors: MPT_SCSI_MAX_SECTORS, \ - cmd_per_lun: MPT_SCSI_CMD_PER_LUN, \ - unchecked_isa_dma: 0, \ - use_clustering: ENABLE_CLUSTERING, \ + .name = "MPT SCSI Host", \ + .detect = x_scsi_detect, \ + .release = x_scsi_release, \ + .info = x_scsi_info, \ + .queuecommand = x_scsi_queuecommand, \ + .slave_attach = x_scsi_slave_attach, \ + .eh_abort_handler = x_scsi_abort, \ + .eh_device_reset_handler = x_scsi_dev_reset, \ + .eh_bus_reset_handler = x_scsi_bus_reset, \ + .eh_host_reset_handler = x_scsi_host_reset, \ + .bios_param = x_scsi_bios_param, \ + .can_queue = MPT_SCSI_CAN_QUEUE, \ + .this_id = -1, \ + .sg_tablesize = MPT_SCSI_SG_DEPTH, \ + .max_sectors = MPT_SCSI_MAX_SECTORS, \ + .cmd_per_lun = MPT_SCSI_CMD_PER_LUN, \ + .use_clustering = ENABLE_CLUSTERING, \ } #else /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,1) */ #define MPT_SCSIHOST { \ - next: NULL, \ PROC_SCSI_DECL \ - name: "MPT SCSI Host", \ - detect: x_scsi_detect, \ - release: x_scsi_release, \ - info: x_scsi_info, \ - command: NULL, \ - queuecommand: x_scsi_queuecommand, \ - eh_strategy_handler: NULL, \ - eh_abort_handler: x_scsi_abort, \ - eh_device_reset_handler: x_scsi_dev_reset, \ - eh_bus_reset_handler: x_scsi_bus_reset, \ - eh_host_reset_handler: NULL, \ - bios_param: x_scsi_bios_param, \ - can_queue: MPT_SCSI_CAN_QUEUE, \ - this_id: -1, \ - sg_tablesize: MPT_SCSI_SG_DEPTH, \ - cmd_per_lun: MPT_SCSI_CMD_PER_LUN, \ - unchecked_isa_dma: 0, \ - use_clustering: ENABLE_CLUSTERING, \ - use_new_eh_code: 1 \ + .name = "MPT SCSI Host", \ + .detect = x_scsi_detect, \ + .release = x_scsi_release, \ + .info = x_scsi_info, \ + .queuecommand = x_scsi_queuecommand, \ + .eh_abort_handler = x_scsi_abort, \ + .eh_device_reset_handler = x_scsi_dev_reset, \ + .eh_bus_reset_handler = x_scsi_bus_reset, \ + .bios_param = x_scsi_bios_param, \ + .can_queue = MPT_SCSI_CAN_QUEUE, \ + .this_id = -1, \ + .sg_tablesize = MPT_SCSI_SG_DEPTH, \ + .cmd_per_lun = MPT_SCSI_CMD_PER_LUN, \ + .use_clustering = ENABLE_CLUSTERING, \ + .use_new_eh_code = 1 \ } #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,1) */ @@ -302,23 +294,20 @@ #else /* MPT_SCSI_USE_NEW_EH */ #define MPT_SCSIHOST { \ - next: NULL, \ PROC_SCSI_DECL \ - name: "MPT SCSI Host", \ - detect: x_scsi_detect, \ - release: x_scsi_release, \ - info: x_scsi_info, \ - command: NULL, \ - queuecommand: x_scsi_queuecommand, \ - abort: x_scsi_old_abort, \ - reset: x_scsi_old_reset, \ - bios_param: x_scsi_bios_param, \ - can_queue: MPT_SCSI_CAN_QUEUE, \ - this_id: -1, \ - sg_tablesize: MPT_SCSI_SG_DEPTH, \ - cmd_per_lun: MPT_SCSI_CMD_PER_LUN, \ - unchecked_isa_dma: 0, \ - use_clustering: ENABLE_CLUSTERING \ + .name = "MPT SCSI Host", \ + .detect = x_scsi_detect, \ + .release = x_scsi_release, \ + .info = x_scsi_info, \ + .queuecommand = x_scsi_queuecommand, \ + .abort = x_scsi_old_abort, \ + .reset = x_scsi_old_reset, \ + .bios_param = x_scsi_bios_param, \ + .can_queue = MPT_SCSI_CAN_QUEUE, \ + .this_id = -1, \ + .sg_tablesize = MPT_SCSI_SG_DEPTH, \ + .cmd_per_lun = MPT_SCSI_CMD_PER_LUN, \ + .use_clustering = ENABLE_CLUSTERING \ } #endif /* MPT_SCSI_USE_NEW_EH */ diff -Nru a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c --- a/drivers/message/i2o/i2o_block.c Mon Oct 28 16:32:37 2002 +++ b/drivers/message/i2o/i2o_block.c Mon Oct 28 16:32:37 2002 @@ -55,8 +55,6 @@ * Serial number scanning to find duplicates for FC multipathing */ -#error Please convert me to Documentation/DMA-mapping.txt - #include #include @@ -132,15 +130,12 @@ #define I2O_BSA_DSC_VOLUME_CHANGED 0x000D #define I2O_BSA_DSC_TIMEOUT 0x000E -#define I2O_UNIT(dev) (i2ob_dev[minor((dev)) & 0xf0]) #define I2O_LOCK(unit) (i2ob_dev[(unit)].req_queue->queue_lock) /* * Some of these can be made smaller later */ -static int i2ob_blksizes[MAX_I2OB<<4]; -static int i2ob_sizes[MAX_I2OB<<4]; static int i2ob_media_change_flag[MAX_I2OB]; static u32 i2ob_max_sectors[MAX_I2OB<<4]; @@ -166,6 +161,7 @@ int rcache; int wcache; int power; + int index; }; /* @@ -179,6 +175,9 @@ struct i2ob_request *next; struct request *req; int num; + int sg_dma_direction; + int sg_nents; + struct scatterlist sg_table[16]; }; /* @@ -259,6 +258,30 @@ struct i2o_controller *c=dev->controller; return I2O_POST_READ32(c); } + +static int i2ob_build_sglist(struct i2ob_device *dev, struct i2ob_request *ireq) +{ + struct scatterlist *sg = ireq->sg_table; + int nents; + + nents = blk_rq_map_sg(dev->req_queue, ireq->req, ireq->sg_table); + + if (rq_data_dir(ireq->req) == READ) + ireq->sg_dma_direction = PCI_DMA_FROMDEVICE; + else + ireq->sg_dma_direction = PCI_DMA_TODEVICE; + + ireq->sg_nents = pci_map_sg(dev->controller->pdev, sg, nents, ireq->sg_dma_direction); + return ireq->sg_nents; +} + +void i2ob_free_sglist(struct i2ob_device *dev, struct i2ob_request *ireq) +{ + struct pci_dev *pdev = dev->controller->pdev; + struct scatterlist *sg = ireq->sg_table; + int nents = ireq->sg_nents; + pci_unmap_sg(pdev, sg, nents, ireq->sg_dma_direction); +} /** * i2ob_send - Turn a request into a message and send it @@ -273,8 +296,6 @@ * * No cleanup is done by this interface. It is done on the interrupt side when the * reply arrives - * - * To Fix: Generate PCI maps of the buffers */ static int i2ob_send(u32 m, struct i2ob_device *dev, struct i2ob_request *ireq, int unit) @@ -285,15 +306,21 @@ unsigned long mptr; u64 offset; struct request *req = ireq->req; - struct bio *bio = req->bio; int count = req->nr_sectors<<9; - unsigned long last = 0; - unsigned short size = 0; + struct scatterlist *sg; + int sgnum; + int i; // printk(KERN_INFO "i2ob_send called\n"); /* Map the message to a virtual address */ msg = c->mem_offset + m; + sgnum = i2ob_build_sglist(dev, ireq); + + /* FIXME: if we have no resources how should we get out of this */ + if(sgnum == 0) + BUG(); + /* * Build the message based on the request. */ @@ -313,34 +340,21 @@ i2o_raw_writel(offset>>32, msg+28); mptr=msg+32; - if(req->cmd == READ) + sg = ireq->sg_table; + if(rq_data_dir(req) == READ) { DEBUG("READ\n"); i2o_raw_writel(I2O_CMD_BLOCK_READ<<24|HOST_TID<<12|tid, msg+4); - while(bio!=NULL) + for(i = sgnum; i > 0; i--) { - if(bio_to_phys(bio) == last) { - size += bio->bi_size; - last += bio->bi_size; - if(bio->bi_next) - i2o_raw_writel(0x10000000|(size), mptr-8); - else - __raw_writel(0xD0000000|(size), mptr-8); - } + if(i != 1) + i2o_raw_writel(0x10000000|sg_dma_len(sg), mptr); else - { - if(bio->bi_next) - i2o_raw_writel(0x10000000|bio->bi_size, mptr); - else - i2o_raw_writel(0xD0000000|bio->bi_size, mptr); - i2o_raw_writel(bio_to_phys(bio), mptr+4); - mptr += 8; - size = bio->bi_size; - last = bio_to_phys(bio) + size; - } - - count -= bio->bi_size; - bio = bio->bi_next; + i2o_raw_writel(0xD0000000|sg_dma_len(sg), mptr); + i2o_raw_writel(sg_dma_address(sg), mptr+4); + mptr += 8; + count -= sg_dma_len(sg); + sg++; } switch(dev->rcache) { @@ -359,34 +373,20 @@ // printk("Reading %d entries %d bytes.\n", // mptr-msg-8, req->nr_sectors<<9); } - else if(req->cmd == WRITE) + else if(rq_data_dir(req) == WRITE) { DEBUG("WRITE\n"); i2o_raw_writel(I2O_CMD_BLOCK_WRITE<<24|HOST_TID<<12|tid, msg+4); - while(bio!=NULL) + for(i = sgnum; i > 0; i--) { - if(bio_to_phys(bio) == last) { - size += bio->bi_size; - last += bio->bi_size; - if(bio->bi_next) - i2o_raw_writel(0x14000000|(size), mptr-8); - else - i2o_raw_writel(0xD4000000|(size), mptr-8); - } + if(i != 1) + i2o_raw_writel(0x14000000|sg_dma_len(sg), mptr); else - { - if(bio->bi_next) - i2o_raw_writel(0x14000000|(bio->bi_size), mptr); - else - i2o_raw_writel(0xD4000000|(bio->bi_size), mptr); - i2o_raw_writel(bio_to_phys(bio), mptr+4); - mptr += 8; - size = bio->bi_size; - last = bio_to_phys(bio) + bio->bi_size; - } - - count -= bio->bi_size; - bio = bio->bi_next; + i2o_raw_writel(0xD4000000|sg_dma_len(sg), mptr); + i2o_raw_writel(sg_dma_address(sg), mptr+4); + mptr += 8; + count -= sg_dma_len(sg); + sg++; } switch(dev->wcache) @@ -502,7 +502,7 @@ /* Now flush the message by making it a NOP */ m[0]&=0x00FFFFFF; m[0]|=(I2O_CMD_UTIL_NOP)<<24; - i2o_post_message(c,virt_to_bus(m)); + i2o_post_message(c, ((unsigned long)m) - c->mem_offset); return; } @@ -594,6 +594,7 @@ * may be running polled controllers from a BH... */ + i2ob_free_sglist(dev, ireq); spin_lock_irqsave(I2O_LOCK(c->unit), flags); i2ob_unhook_request(ireq, c->unit); i2ob_end_request(ireq->req); @@ -715,7 +716,6 @@ i2ob_query_device(&i2ob_dev[unit], 0x0000, 4, &size, 8); spin_lock_irqsave(I2O_LOCK(unit), flags); - i2ob_sizes[unit] = (int)(size>>10); set_capacity(i2ob_disk[unit>>4], size>>9); spin_unlock_irqrestore(I2O_LOCK(unit), flags); break; @@ -782,7 +782,6 @@ { struct request *req; struct i2ob_request *ireq; - int unit; struct i2ob_device *dev; u32 m; @@ -796,9 +795,8 @@ if(req->rq_status == RQ_INACTIVE) return; - - unit = minor(req->rq_dev); - dev = &i2ob_dev[(unit&0xF0)]; + + dev = req->rq_disk->private_data; /* * Queue depths probably belong with some kind of @@ -828,7 +826,7 @@ i2ob_queues[dev->unit]->i2ob_qhead = ireq->next; ireq->req = req; - i2ob_send(m, dev, ireq, (unit&0xF0)); + i2ob_send(m, dev, ireq, (dev->unit&0xF0)); } } @@ -896,27 +894,19 @@ static int i2ob_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - struct i2ob_device *dev; - int minor; + struct gendisk *disk = inode->i_bdev->bd_disk; + struct i2ob_device *dev = disk->private_data; /* Anyone capable of this syscall can do *real bad* things */ if (!capable(CAP_SYS_ADMIN)) return -EPERM; - if (!inode) - return -EINVAL; - minor = minor(inode->i_rdev); - if (minor >= (MAX_I2OB<<4)) - return -ENODEV; - - dev = &i2ob_dev[minor]; switch (cmd) { case HDIO_GETGEO: { struct hd_geometry g; - int u=minor >> 4; - i2o_block_biosparam(get_capacity(i2ob_disk[u]), - &g.cylinders, &g.heads, &g.sectors); + i2o_block_biosparam(get_capacity(disk), + &g.cylinders, &g.heads, &g.sectors); g.start = get_start_sect(inode->i_bdev); return copy_to_user((void *)arg,&g, sizeof(g))?-EFAULT:0; } @@ -945,13 +935,8 @@ static int i2ob_release(struct inode *inode, struct file *file) { - struct i2ob_device *dev; - int minor; - - minor = minor(inode->i_rdev); - if (minor >= (MAX_I2OB<<4)) - return -ENODEV; - dev = &i2ob_dev[(minor&0xF0)]; + struct gendisk *disk = inode->i_bdev->bd_disk; + struct i2ob_device *dev = disk->private_data; /* * This is to deail with the case of an application @@ -1022,15 +1007,8 @@ static int i2ob_open(struct inode *inode, struct file *file) { - int minor; - struct i2ob_device *dev; - - if (!inode) - return -EINVAL; - minor = minor(inode->i_rdev); - if (minor >= MAX_I2OB<<4) - return -ENODEV; - dev=&i2ob_dev[(minor&0xF0)]; + struct gendisk *disk = inode->i_bdev->bd_disk; + struct i2ob_device *dev = disk->private_data; if(!dev->i2odev) return -ENODEV; @@ -1133,7 +1111,6 @@ power = 0; i2ob_query_device(dev, 0x0000, 5, &flags, 4); i2ob_query_device(dev, 0x0000, 6, &status, 4); - i2ob_sizes[unit] = (int)(size>>10); set_capacity(i2ob_disk[unit>>4], size>>9); /* @@ -1146,14 +1123,18 @@ for(i=unit;i<=unit+15;i++) { request_queue_t *q = i2ob_dev[unit].req_queue; - + int segments = (d->controller->status_block->inbound_frame_size - 7) / 2; + + if(segments > 16) + segments = 16; + i2ob_dev[i].power = power; /* Save power state */ i2ob_dev[unit].flags = flags; /* Keep the type info */ blk_queue_max_sectors(q, 96); /* 256 might be nicer but many controllers explode on 65536 or higher */ - blk_queue_max_phys_segments(q, (d->controller->status_block->inbound_frame_size - 7) / 2); - blk_queue_max_hw_segments(q, (d->controller->status_block->inbound_frame_size - 7) / 2); + blk_queue_max_phys_segments(q, segments); + blk_queue_max_hw_segments(q, segments); i2ob_dev[i].rcache = CACHE_SMARTFETCH; i2ob_dev[i].wcache = CACHE_WRITETHROUGH; @@ -1372,7 +1353,7 @@ printk(KERN_WARNING "Could not install I2O block device\n"); else { - add_disk(i2o_disk[scan_unit>>4]); + add_disk(i2ob_disk[scan_unit>>4]); scan_unit+=16; i2ob_dev_count++; @@ -1459,7 +1440,7 @@ printk(KERN_ERR "i2o_block: Could not install new device\n"); else { - add_disk(i2o_disk[unit>>4]); + add_disk(i2ob_disk[unit>>4]); i2ob_dev_count++; i2o_device_notify_on(d, &i2o_block_handler); } @@ -1544,7 +1525,8 @@ */ static int i2ob_media_change(struct gendisk *disk) { - int i = (int)disk->private_data; + struct i2ob_device *p = disk->private_data; + int i = p->index; if(i2ob_media_change_flag[i]) { i2ob_media_change_flag[i]=0; @@ -1555,9 +1537,8 @@ static int i2ob_revalidate(struct gendisk *disk) { - int i = (int)disk->private_data; - return i2ob_install_device(i2ob_dev[i<<4].controller, - i2ob_dev[i<<4].i2odev, i<<4); + struct i2ob_device *p = disk->private_data; + return i2ob_install_device(p->controller, p->i2odev, p->index<<4); } /* @@ -1640,10 +1621,9 @@ struct gendisk *disk = alloc_disk(16); if (!disk) goto oom; - /* to be cleaned up */ - disk->private_data = (void*)i; + i2ob_dev[i<<4].index = i; disk->queue = i2ob_dev[i<<4].req_queue; - i2o_disk[i] = disk; + i2ob_disk[i] = disk; } #ifdef MODULE printk(KERN_INFO "i2o_block: registered device at major %d\n", MAJOR_NR); @@ -1662,12 +1642,11 @@ i2ob_dev[i].head = NULL; i2ob_dev[i].tail = NULL; i2ob_dev[i].depth = MAX_I2OB_DEPTH; - i2ob_blksizes[i] = 1024; i2ob_max_sectors[i] = 2; } for (i = 0; i < MAX_I2OB; i++) { - struct gendisk *disk = i2ob_disk + i; + struct gendisk *disk = i2ob_disk[i]; disk->major = MAJOR_NR; disk->first_minor = i<<4; disk->fops = &i2ob_fops; @@ -1715,7 +1694,7 @@ oom: while (i--) - put_disk(i2o_disk[i]); + put_disk(i2ob_disk[i]); unregister_blkdev(MAJOR_NR, "i2o_block"); return -ENOMEM; } @@ -1769,7 +1748,7 @@ i2o_remove_handler(&i2o_block_handler); for (i = 0; i < MAX_I2OB; i++) - put_disk(i2o_disk[i]); + put_disk(i2ob_disk[i]); /* * Return the block device diff -Nru a/drivers/message/i2o/i2o_scsi.c b/drivers/message/i2o/i2o_scsi.c --- a/drivers/message/i2o/i2o_scsi.c Mon Oct 28 16:32:36 2002 +++ b/drivers/message/i2o/i2o_scsi.c Mon Oct 28 16:32:36 2002 @@ -37,7 +37,6 @@ * Fix the resource management problems. */ -#error Please convert me to Documentation/DMA-mapping.txt #include #include @@ -55,18 +54,22 @@ #include #include #include -#include #include #include "../../scsi/scsi.h" #include "../../scsi/hosts.h" #include "../../scsi/sd.h" -#include "i2o_scsi.h" -#define VERSION_STRING "Version 0.1.1" +#if BITS_PER_LONG == 64 +#error FIXME: driver does not support 64-bit platforms +#endif + + +#define VERSION_STRING "Version 0.1.2" #define dprintk(x) -#define MAXHOSTS 32 +#define I2O_SCSI_CAN_QUEUE 4 +#define MAXHOSTS 32 struct i2o_scsi_host { @@ -320,6 +323,12 @@ * It worked maybe ? */ current_command->result = DID_OK << 16 | ds; + + if (current_command->use_sg) + pci_unmap_sg(c->pdev, (struct scatterlist *)current_command->buffer, current_command->use_sg, scsi_to_pci_dma_dir(current_command->sc_data_direction)); + else if (current_command->request_bufflen) + pci_unmap_single(c->pdev, (dma_addr_t)((long)current_command->SCp.ptr), current_command->request_bufflen, scsi_to_pci_dma_dir(current_command->sc_data_direction)); + lock = current_command->host->host_lock; spin_lock_irqsave(lock, flags); current_command->scsi_done(current_command); @@ -453,7 +462,6 @@ static int i2o_scsi_detect(Scsi_Host_Template * tpnt) { - unsigned long flags; struct Scsi_Host *shpnt = NULL; int i; int count; @@ -680,6 +688,7 @@ spin_unlock_irqrestore(host->host_lock, flags); return 0; } + i2o_raw_writel(I2O_CMD_SCSI_EXEC<<24|HOST_TID<<12|tid, &msg[1]); i2o_raw_writel(scsi_context, &msg[2]); /* So the I2O layer passes to us */ @@ -752,10 +761,18 @@ if(SCpnt->use_sg) { struct scatterlist *sg = (struct scatterlist *)SCpnt->request_buffer; + int sg_count; int chain = 0; len = 0; + sg_count = pci_map_sg(c->pdev, sg, SCpnt->use_sg, + scsi_to_pci_dma_dir(SCpnt->sc_data_direction)); + + /* FIXME: handle fail */ + if(!sg_count) + BUG(); + if((sg_max_frags > 11) && (SCpnt->use_sg > 11)) { chain = 1; @@ -775,27 +792,27 @@ sg_chain_tag = 0; for(i = 0 ; i < SCpnt->use_sg; i++) { - *mptr++=direction|0x10000000|sg->length; - len+=sg->length; - *mptr++=virt_to_bus(page_address(sg->page)+sg->offset); + *mptr++=cpu_to_le32(direction|0x10000000|sg_dma_len(sg)); + len+=sg_dma_len(sg); + *mptr++=cpu_to_le32(sg_dma_address(sg)); sg++; } - mptr[-2]=direction|0xD0000000|(sg-1)->length; + mptr[-2]=cpu_to_le32(direction|0xD0000000|sg_dma_len(sg-1)); } else { for(i = 0 ; i < SCpnt->use_sg; i++) { - i2o_raw_writel(direction|0x10000000|sg->length, mptr++); + i2o_raw_writel(direction|0x10000000|sg_dma_len(sg), mptr++); len+=sg->length; - i2o_raw_writel(virt_to_bus(page_address(sg->page) + sg->offset), mptr++); + i2o_raw_writel(sg_dma_address(sg), mptr++); sg++; } /* Make this an end of list. Again evade the 920 bug and unwanted PCI read traffic */ - i2o_raw_writel(direction|0xD0000000|(sg-1)->length, &mptr[-2]); + i2o_raw_writel(direction|0xD0000000|sg_dma_len(sg-1), &mptr[-2]); } if(!chain) @@ -818,8 +835,16 @@ } else { + dma_addr_t dma_addr; + dma_addr = pci_map_single(c->pdev, + SCpnt->request_buffer, + SCpnt->request_bufflen, + scsi_to_pci_dma_dir(SCpnt->sc_data_direction)); + if(dma_addr == 0) + BUG(); /* How to handle ?? */ + SCpnt->SCp.ptr = (char *)(unsigned long) dma_addr; i2o_raw_writel(0xD0000000|direction|SCpnt->request_bufflen, mptr++); - i2o_raw_writel(virt_to_bus(SCpnt->request_buffer), mptr++); + i2o_raw_writel(dma_addr, mptr++); } } @@ -1046,6 +1071,24 @@ MODULE_LICENSE("GPL"); -static Scsi_Host_Template driver_template = I2OSCSI; +static Scsi_Host_Template driver_template = { + .proc_name = "i2o_scsi", + .name = "I2O SCSI Layer", + .detect = i2o_scsi_detect, + .release = i2o_scsi_release, + .info = i2o_scsi_info, + .command = i2o_scsi_command, + .queuecommand = i2o_scsi_queuecommand, + .eh_abort_handler = i2o_scsi_abort, + .eh_bus_reset_handler = i2o_scsi_bus_reset, + .eh_device_reset_handler= i2o_scsi_device_reset, + .eh_host_reset_handler = i2o_scsi_host_reset, + .bios_param = i2o_scsi_bios_param, + .can_queue = I2O_SCSI_CAN_QUEUE, + .this_id = 15, + .sg_tablesize = 8, + .cmd_per_lun = 6, + .use_clustering = ENABLE_CLUSTERING, +}; #include "../../scsi/scsi_module.c" diff -Nru a/drivers/message/i2o/i2o_scsi.h b/drivers/message/i2o/i2o_scsi.h --- a/drivers/message/i2o/i2o_scsi.h Mon Oct 28 16:32:36 2002 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,44 +0,0 @@ -#ifndef _I2O_SCSI_H -#define _I2O_SCSI_H - -#include -#include - -#define I2O_SCSI_ID 15 -#define I2O_SCSI_CAN_QUEUE 4 -#define I2O_SCSI_CMD_PER_LUN 6 - -static int i2o_scsi_detect(Scsi_Host_Template *); -static const char *i2o_scsi_info(struct Scsi_Host *); -static int i2o_scsi_command(Scsi_Cmnd *); -static int i2o_scsi_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -static int i2o_scsi_abort(Scsi_Cmnd *); -static int i2o_scsi_bus_reset(Scsi_Cmnd *); -static int i2o_scsi_host_reset(Scsi_Cmnd *); -static int i2o_scsi_device_reset(Scsi_Cmnd *); -static int i2o_scsi_bios_param(Disk *, struct block_device *, int *); -static int i2o_scsi_release(struct Scsi_Host *host); - -#define I2OSCSI { \ - next: NULL, \ - proc_name: "i2o_scsi", \ - name: "I2O SCSI Layer", \ - detect: i2o_scsi_detect, \ - release: i2o_scsi_release, \ - info: i2o_scsi_info, \ - command: i2o_scsi_command, \ - queuecommand: i2o_scsi_queuecommand, \ - eh_abort_handler: i2o_scsi_abort, \ - eh_bus_reset_handler: i2o_scsi_bus_reset, \ - eh_device_reset_handler: i2o_scsi_device_reset, \ - eh_host_reset_handler: i2o_scsi_host_reset, \ - bios_param: i2o_scsi_bios_param, \ - can_queue: I2O_SCSI_CAN_QUEUE, \ - this_id: I2O_SCSI_ID, \ - sg_tablesize: 8, \ - cmd_per_lun: I2O_SCSI_CMD_PER_LUN, \ - unchecked_isa_dma: 0, \ - use_clustering: ENABLE_CLUSTERING \ - } - -#endif diff -Nru a/drivers/net/3c515.c b/drivers/net/3c515.c --- a/drivers/net/3c515.c Mon Oct 28 16:32:35 2002 +++ b/drivers/net/3c515.c Mon Oct 28 16:32:35 2002 @@ -1,4 +1,4 @@ -/* 3c515.c: A 3Com ISA EtherLink XL "Corkscrew" ethernet driver for linux. */ + /* Written 1997-1998 by Donald Becker. @@ -13,17 +13,19 @@ Annapolis MD 21403 - 2/2/00- Added support for kernel-level ISAPnP + 2000/2/2- Added support for kernel-level ISAPnP by Stephen Frost and Alessandro Zummo Cleaned up for 2.3.x/softnet by Jeff Garzik and Alan Cox. - 11/17/2001 - Added ethtool support (jgarzik) + 2001/11/17 - Added ethtool support (jgarzik) + + 2002/10/28 - Locking updates for 2.5 (alan@redhat.com) */ #define DRV_NAME "3c515" -#define DRV_VERSION "0.99t" -#define DRV_RELDATE "17-Nov-2001" +#define DRV_VERSION "0.99t-ac" +#define DRV_RELDATE "28-Oct-2002" static char *version = DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " becker@scyld.com and others\n"; @@ -84,12 +86,6 @@ #define NEW_MULTICAST #include -/* Kernel version compatibility functions. */ -#define RUN_AT(x) (jiffies + (x)) - -#define REQUEST_IRQ(i,h,f,n, instance) request_irq(i,h,f,n, instance) -#define IRQ(irq, dev_id, pt_regs) (irq, dev_id, pt_regs) - MODULE_AUTHOR("Donald Becker "); MODULE_DESCRIPTION("3Com 3c515 Corkscrew driver"); MODULE_LICENSE("GPL"); @@ -202,16 +198,13 @@ enum corkscrew_cmd { TotalReset = 0 << 11, SelectWindow = 1 << 11, StartCoax = 2 << 11, RxDisable = 3 << 11, RxEnable = 4 << 11, RxReset = 5 << 11, - UpStall = 6 << 11, UpUnstall = (6 << 11) + 1, - DownStall = (6 << 11) + 2, DownUnstall = (6 << 11) + 3, - RxDiscard = 8 << 11, TxEnable = 9 << 11, TxDisable = - 10 << 11, TxReset = 11 << 11, - FakeIntr = 12 << 11, AckIntr = 13 << 11, SetIntrEnb = 14 << 11, - SetStatusEnb = 15 << 11, SetRxFilter = 16 << 11, SetRxThreshold = - 17 << 11, - SetTxThreshold = 18 << 11, SetTxStart = 19 << 11, - StartDMAUp = 20 << 11, StartDMADown = (20 << 11) + 1, StatsEnable = - 21 << 11, + UpStall = 6 << 11, UpUnstall = (6 << 11) + 1, DownStall = (6 << 11) + 2, + DownUnstall = (6 << 11) + 3, RxDiscard = 8 << 11, TxEnable = 9 << 11, + TxDisable = 10 << 11, TxReset = 11 << 11, FakeIntr = 12 << 11, + AckIntr = 13 << 11, SetIntrEnb = 14 << 11, SetStatusEnb = 15 << 11, + SetRxFilter = 16 << 11, SetRxThreshold = 17 << 11, + SetTxThreshold = 18 << 11, SetTxStart = 19 << 11, StartDMAUp = 20 << 11, + StartDMADown = (20 << 11) + 1, StatsEnable = 21 << 11, StatsDisable = 22 << 11, StopCoax = 23 << 11, }; @@ -265,11 +258,9 @@ union wn3_config { int i; struct w3_config_fields { - unsigned int ram_size:3, ram_width:1, ram_speed:2, - rom_size:2; + unsigned int ram_size:3, ram_width:1, ram_speed:2, rom_size:2; int pad8:8; - unsigned int ram_split:2, pad18:2, xcvr:3, pad21:1, - autoselect:1; + unsigned int ram_split:2, pad18:2, xcvr:3, pad21:1, autoselect:1; int pad24:7; } u; }; @@ -340,14 +331,14 @@ full_duplex:1, autoselect:1, bus_master:1, /* Vortex can only do a fragment bus-m. */ full_bus_master_tx:1, full_bus_master_rx:1, /* Boomerang */ tx_full:1; + spinlock_t lock; }; /* The action to take with a media selection timer tick. Note that we deviate from the 3Com order by checking 10base2 before AUI. */ enum xcvr_types { - XCVR_10baseT = - 0, XCVR_AUI, XCVR_10baseTOnly, XCVR_10base2, XCVR_100baseTx, + XCVR_10baseT = 0, XCVR_AUI, XCVR_10baseTOnly, XCVR_10base2, XCVR_100baseTx, XCVR_100baseFx, XCVR_MII = 6, XCVR_Default = 8, }; @@ -577,27 +568,23 @@ #ifdef MODULE /* Allocate and fill new device structure. */ - int dev_size = sizeof(struct net_device) + - sizeof(struct corkscrew_private) + 15; /* Pad for alignment */ + int dev_size = sizeof(struct net_device) + sizeof(struct corkscrew_private) + 15; /* Pad for alignment */ dev = (struct net_device *) kmalloc(dev_size, GFP_KERNEL); if (!dev) return NULL; memset(dev, 0, dev_size); /* Align the Rx and Tx ring entries. */ - dev->priv = - (void *) (((long) dev + sizeof(struct net_device) + 15) & ~15); + dev->priv = (void *) (((long) dev + sizeof(struct net_device) + 15) & ~15); vp = (struct corkscrew_private *) dev->priv; dev->base_addr = ioaddr; dev->irq = irq; - dev->dma = - (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0); + dev->dma = (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0); dev->init = corkscrew_probe1; vp->product_name = "3c515"; vp->options = options; if (options >= 0) { - vp->media_override = - ((options & 7) == 2) ? 0 : options & 7; + vp->media_override = ((options & 7) == 2) ? 0 : options & 7; vp->full_duplex = (options & 8) ? 1 : 0; vp->bus_master = (options & 16) ? 1 : 0; } else { @@ -615,22 +602,19 @@ } #else /* not a MODULE */ /* Caution: quad-word alignment required for rings! */ - dev->priv = - kmalloc(sizeof(struct corkscrew_private), GFP_KERNEL); + dev->priv = kmalloc(sizeof(struct corkscrew_private), GFP_KERNEL); if (!dev->priv) return NULL; memset(dev->priv, 0, sizeof(struct corkscrew_private)); dev = init_etherdev(dev, sizeof(struct corkscrew_private)); dev->base_addr = ioaddr; dev->irq = irq; - dev->dma = - (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0); + dev->dma = (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0); vp = (struct corkscrew_private *) dev->priv; vp->product_name = "3c515"; vp->options = options; if (options >= 0) { - vp->media_override = - ((options & 7) == 2) ? 0 : options & 7; + vp->media_override = ((options & 7) == 2) ? 0 : options & 7; vp->full_duplex = (options & 8) ? 1 : 0; vp->bus_master = (options & 16) ? 1 : 0; } else { @@ -647,14 +631,14 @@ static int corkscrew_probe1(struct net_device *dev) { int ioaddr = dev->base_addr; - struct corkscrew_private *vp = - (struct corkscrew_private *) dev->priv; + struct corkscrew_private *vp = (struct corkscrew_private *) dev->priv; unsigned int eeprom[0x40], checksum = 0; /* EEPROM contents */ int i; - printk(KERN_INFO "%s: 3Com %s at %#3x,", dev->name, - vp->product_name, ioaddr); + printk(KERN_INFO "%s: 3Com %s at %#3x,", dev->name, vp->product_name, ioaddr); + spin_lock_init(&vp->lock); + /* Read the station address from the EEPROM. */ EL3WINDOW(0); for (i = 0; i < 0x18; i++) { @@ -769,7 +753,7 @@ dev->name, media_tbl[dev->if_port].name); init_timer(&vp->timer); - vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait); + vp->timer.expires = jiffies + media_tbl[dev->if_port].wait; vp->timer.data = (unsigned long) dev; vp->timer.function = &corkscrew_timer; /* timer handler */ add_timer(&vp->timer); @@ -907,8 +891,7 @@ { #ifdef AUTOMEDIA struct net_device *dev = (struct net_device *) data; - struct corkscrew_private *vp = - (struct corkscrew_private *) dev->priv; + struct corkscrew_private *vp = (struct corkscrew_private *) dev->priv; int ioaddr = dev->base_addr; unsigned long flags; int ok = 0; @@ -917,8 +900,9 @@ printk("%s: Media selection timer tick happened, %s.\n", dev->name, media_tbl[dev->if_port].name); - save_flags(flags); - cli(); { + spin_lock_irqsave(&vp->lock, flags); + + { int old_window = inw(ioaddr + EL3_CMD) >> 13; int media_status; EL3WINDOW(4); @@ -969,7 +953,7 @@ printk("%s: Media selection failed, now trying %s port.\n", dev->name, media_tbl[dev->if_port].name); - vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait); + vp->timer.expires = jiffies + media_tbl[dev->if_port].wait; add_timer(&vp->timer); } outw((media_status & ~(Media_10TP | Media_SQE)) | @@ -986,7 +970,8 @@ } EL3WINDOW(old_window); } - restore_flags(flags); + + spin_unlock_irqrestore(&vp->lock, flags); if (corkscrew_debug > 1) printk("%s: Media selection timer finished, %s.\n", dev->name, media_tbl[dev->if_port].name); @@ -1055,8 +1040,7 @@ if (vp->tx_full) /* No room to transmit with */ return 1; if (vp->cur_tx != 0) - prev_entry = - &vp->tx_ring[(vp->cur_tx - 1) % TX_RING_SIZE]; + prev_entry = &vp->tx_ring[(vp->cur_tx - 1) % TX_RING_SIZE]; else prev_entry = NULL; if (corkscrew_debug > 3) @@ -1069,23 +1053,21 @@ vp->tx_ring[entry].length = skb->len | 0x80000000; vp->tx_ring[entry].status = skb->len | 0x80000000; - save_flags(flags); - cli(); + spin_lock_irqsave(&vp->lock, flags); outw(DownStall, ioaddr + EL3_CMD); /* Wait for the stall to complete. */ for (i = 20; i >= 0; i--) - if ((inw(ioaddr + EL3_STATUS) & CmdInProgress) == - 0) break; + if ((inw(ioaddr + EL3_STATUS) & CmdInProgress) == 0) + break; if (prev_entry) - prev_entry->next = - isa_virt_to_bus(&vp->tx_ring[entry]); + prev_entry->next = isa_virt_to_bus(&vp->tx_ring[entry]); if (inl(ioaddr + DownListPtr) == 0) { outl(isa_virt_to_bus(&vp->tx_ring[entry]), ioaddr + DownListPtr); queued_packet++; } outw(DownUnstall, ioaddr + EL3_CMD); - restore_flags(flags); + spin_unlock_irqrestore(&vp->lock, flags); vp->cur_tx++; if (vp->cur_tx - vp->dirty_tx > TX_RING_SIZE - 1) @@ -1179,6 +1161,8 @@ latency = inb(ioaddr + Timer); lp = (struct corkscrew_private *) dev->priv; + spin_lock(&lp->lock); + status = inw(ioaddr + EL3_STATUS); if (corkscrew_debug > 4) @@ -1193,6 +1177,7 @@ printk(KERN_ERR "%s: Bogus interrupt, bailing. Status %4.4x, start=%d.\n", dev->name, status, netif_running(dev)); free_irq(dev->irq, dev); + dev->irq = -1; } } @@ -1205,8 +1190,7 @@ if (status & TxAvailable) { if (corkscrew_debug > 5) - printk - (" TX room bit was handled.\n"); + printk(" TX room bit was handled.\n"); /* There's room in the FIFO for a full-sized packet. */ outw(AckIntr | TxAvailable, ioaddr + EL3_CMD); netif_wake_queue(dev); @@ -1216,21 +1200,17 @@ while (lp->cur_tx - dirty_tx > 0) { int entry = dirty_tx % TX_RING_SIZE; - if (inl(ioaddr + DownListPtr) == - isa_virt_to_bus(&lp->tx_ring[entry])) + if (inl(ioaddr + DownListPtr) == isa_virt_to_bus(&lp->tx_ring[entry])) break; /* It still hasn't been processed. */ if (lp->tx_skbuff[entry]) { - dev_kfree_skb_irq(lp-> - tx_skbuff - [entry]); + dev_kfree_skb_irq(lp->tx_skbuff[entry]); lp->tx_skbuff[entry] = 0; } dirty_tx++; } lp->dirty_tx = dirty_tx; outw(AckIntr | DownComplete, ioaddr + EL3_CMD); - if (lp->tx_full - && (lp->cur_tx - dirty_tx <= TX_RING_SIZE - 1)) { + if (lp->tx_full && (lp->cur_tx - dirty_tx <= TX_RING_SIZE - 1)) { lp->tx_full = 0; netif_wake_queue(dev); } @@ -1255,23 +1235,19 @@ if (status & StatsFull) { /* Empty statistics. */ static int DoneDidThat; if (corkscrew_debug > 4) - printk("%s: Updating stats.\n", - dev->name); + printk("%s: Updating stats.\n", dev->name); update_stats(ioaddr, dev); /* DEBUG HACK: Disable statistics as an interrupt source. */ /* This occurs when we have the wrong media type! */ - if (DoneDidThat == 0 && - inw(ioaddr + EL3_STATUS) & StatsFull) { + if (DoneDidThat == 0 && inw(ioaddr + EL3_STATUS) & StatsFull) { int win, reg; printk("%s: Updating stats failed, disabling stats as an" - " interrupt source.\n", - dev->name); + " interrupt source.\n", dev->name); for (win = 0; win < 8; win++) { EL3WINDOW(win); printk("\n Vortex window %d:", win); for (reg = 0; reg < 16; reg++) - printk(" %2.2x", - inb(ioaddr + reg)); + printk(" %2.2x", inb(ioaddr + reg)); } EL3WINDOW(7); outw(SetIntrEnb | TxAvailable | @@ -1297,20 +1273,19 @@ "Disabling functions (%4.4x).\n", dev->name, status, SetStatusEnb | ((~status) & 0x7FE)); /* Disable all pending interrupts. */ - outw(SetStatusEnb | ((~status) & 0x7FE), - ioaddr + EL3_CMD); + outw(SetStatusEnb | ((~status) & 0x7FE), ioaddr + EL3_CMD); outw(AckIntr | 0x7FF, ioaddr + EL3_CMD); break; } /* Acknowledge the IRQ. */ outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD); - } while ((status = inw(ioaddr + EL3_STATUS)) & - (IntLatch | RxComplete)); + } while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete)); + + spin_unlock(&lp->lock); if (corkscrew_debug > 4) - printk("%s: exiting interrupt, status %4.4x.\n", dev->name, - status); + printk("%s: exiting interrupt, status %4.4x.\n", dev->name, status); } static int corkscrew_rx(struct net_device *dev) @@ -1529,15 +1504,13 @@ static struct net_device_stats *corkscrew_get_stats(struct net_device *dev) { - struct corkscrew_private *vp = - (struct corkscrew_private *) dev->priv; + struct corkscrew_private *vp = (struct corkscrew_private *) dev->priv; unsigned long flags; if (netif_running(dev)) { - save_flags(flags); - cli(); + spin_lock_irqsave(&vp->lock, flags); update_stats(dev->base_addr, dev); - restore_flags(flags); + spin_unlock_irqrestore(&vp->lock, flags); } return &vp->stats; } diff -Nru a/drivers/net/Config.in b/drivers/net/Config.in --- a/drivers/net/Config.in Mon Oct 28 16:32:37 2002 +++ b/drivers/net/Config.in Mon Oct 28 16:32:37 2002 @@ -134,6 +134,7 @@ tristate ' LP486E on board Ethernet' CONFIG_LP486E tristate ' ICL EtherTeam 16i/32 support' CONFIG_ETH16I tristate ' NE2000/NE1000 support' CONFIG_NE2000 + dep_tristate ' Zenith Z-Note support (EXPERIMENTAL)' CONFIG_ZNET $CONFIG_EXPERIMENTAL if [ "$CONFIG_OBSOLETE" = "y" ]; then dep_tristate ' SEEQ8005 support (EXPERIMENTAL)' CONFIG_SEEQ8005 $CONFIG_EXPERIMENTAL fi @@ -186,9 +187,6 @@ fi dep_tristate ' VIA Rhine support' CONFIG_VIA_RHINE $CONFIG_PCI dep_mbool ' Use MMIO instead of PIO (EXPERIMENTAL)' CONFIG_VIA_RHINE_MMIO $CONFIG_VIA_RHINE $CONFIG_EXPERIMENTAL - if [ "$CONFIG_OBSOLETE" = "y" ]; then - dep_bool ' Zenith Z-Note support (OBSOLETE)' CONFIG_ZNET $CONFIG_ISA - fi if [ "$CONFIG_EXPERIMENTAL" = "y" -a "$CONFIG_MIPS" = "y" ]; then bool ' Philips SAA9730 Ethernet support (EXPERIMENTAL)' CONFIG_LAN_SAA9730 fi diff -Nru a/drivers/net/Space.c b/drivers/net/Space.c --- a/drivers/net/Space.c Mon Oct 28 16:32:35 2002 +++ b/drivers/net/Space.c Mon Oct 28 16:32:35 2002 @@ -54,7 +54,6 @@ extern int ne_probe(struct net_device *dev); extern int hp_probe(struct net_device *dev); extern int hp_plus_probe(struct net_device *dev); -extern int znet_probe(struct net_device *); extern int express_probe(struct net_device *); extern int eepro_probe(struct net_device *); extern int el3_probe(struct net_device *); @@ -269,9 +268,6 @@ #endif #ifdef CONFIG_ETH16I {eth16i_probe, 0}, /* ICL EtherTeam 16i/32 */ -#endif -#ifdef CONFIG_ZNET /* Zenith Z-Note and some IBM Thinkpads. */ - {znet_probe, 0}, #endif #ifdef CONFIG_EEXPRESS /* Intel EtherExpress */ {express_probe, 0}, diff -Nru a/drivers/net/appletalk/cops.c b/drivers/net/appletalk/cops.c --- a/drivers/net/appletalk/cops.c Mon Oct 28 16:32:37 2002 +++ b/drivers/net/appletalk/cops.c Mon Oct 28 16:32:37 2002 @@ -182,6 +182,7 @@ int nodeid; /* Set to 1 once have nodeid. */ unsigned char node_acquire; /* Node ID when acquired. */ struct atalk_addr node_addr; /* Full node address */ + spinlock_t lock; /* RX/TX lock */ }; /* Index to functions, as function prototypes. */ @@ -322,6 +323,7 @@ lp = (struct cops_local *)dev->priv; memset(lp, 0, sizeof(struct cops_local)); + spinlock_init(&lp->lock); /* Copy local board variable to lp struct. */ lp->board = board; @@ -759,9 +761,8 @@ unsigned long flags; - save_flags(flags); - cli(); /* Disable interrupts. */ - + spin_lock_irqsave(&lp->lock, flags); + if(lp->board==DAYNA) { outb(0, ioaddr); /* Send out Zero length. */ @@ -779,7 +780,7 @@ if(boguscount==1000000) { printk(KERN_WARNING "%s: DMA timed out.\n",dev->name); - restore_flags(flags); + spin_unlock_irqrestore(&lp->lock, flags); return; } } @@ -814,7 +815,7 @@ if(lp->board==DAYNA) outb(1, ioaddr+DAYNA_INT_CARD); /* Interrupt the card */ - restore_flags(flags); /* Restore interrupts. */ + spin_unlock_irqrestore(&lp->lock, flags); /* Restore interrupts. */ /* Check for bad response length */ if(pkt_len < 0 || pkt_len > MAX_LLAP_SIZE) @@ -890,12 +891,13 @@ netif_stop_queue(dev); - save_flags(flags); - cli(); /* Disable interrupts. */ + spin_lock_irqsave(&lp->lock, flags); if(lp->board == DAYNA) /* Wait for adapter transmit buffer. */ - while((inb(ioaddr+DAYNA_CARD_STATUS)&DAYNA_TX_READY)==0); + while((inb(ioaddr+DAYNA_CARD_STATUS)&DAYNA_TX_READY)==0) + cpu_relax(); if(lp->board == TANGENT) /* Wait for adapter transmit buffer. */ - while((inb(ioaddr+TANG_CARD_STATUS)&TANG_TX_READY)==0); + while((inb(ioaddr+TANG_CARD_STATUS)&TANG_TX_READY)==0) + cpu_relax(); /* Output IO length. */ outb(skb->len, ioaddr); @@ -915,7 +917,7 @@ if(lp->board==DAYNA) /* Dayna requires you kick the card */ outb(1, ioaddr+DAYNA_INT_CARD); - restore_flags(flags); /* Restore interrupts. */ + spin_unlock_irqrestore(&lp->lock, flags); /* Restore interrupts. */ /* Done sending packet, update counters and cleanup. */ lp->stats.tx_packets++; diff -Nru a/drivers/net/de620.c b/drivers/net/de620.c --- a/drivers/net/de620.c Mon Oct 28 16:32:37 2002 +++ b/drivers/net/de620.c Mon Oct 28 16:32:37 2002 @@ -190,6 +190,8 @@ static unsigned int de620_debug = DE620_DEBUG; +static spinlock_t de620_lock; + MODULE_PARM(bnc, "i"); MODULE_PARM(utp, "i"); MODULE_PARM(io, "i"); @@ -519,10 +521,7 @@ static void de620_timeout(struct net_device *dev) { - printk("%s: transmit timed out, %s?\n", - dev->name, - "network cable problem" - ); + printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name, "network cable problem"); /* Restart the adapter. */ if (!adapter_init(dev)) /* maybe close it */ netif_wake_queue(dev); @@ -551,9 +550,8 @@ ++len; /* Start real output */ - save_flags(flags); - cli(); + spin_lock_irqsave(&de620_lock, flags) PRINTK(("de620_start_xmit: len=%d, bufs 0x%02x\n", (int)skb->len, using_txbuf)); @@ -572,7 +570,7 @@ case (TXBF0 | TXBF1): /* NONE!!! */ printk(KERN_WARNING "%s: No tx-buffer available!\n", dev->name); - restore_flags(flags); + spin_unlock_irqrestore(&de620_lock, flags); return 1; } de620_write_block(dev, buffer, len); @@ -582,7 +580,7 @@ netif_wake_queue(dev); ((struct net_device_stats *)(dev->priv))->tx_packets++; - restore_flags(flags); /* interrupts maybe back on */ + spin_unlock_irqrestore(&de620_lock, flags); dev_kfree_skb (skb); return 0; } @@ -599,12 +597,8 @@ int bogus_count = 0; int again = 0; - /* This might be deleted now, no crummy drivers present :-) Or..? */ - if ((dev == NULL) || (irq != irq_in)) { - printk("%s: bogus interrupt %d\n", dev?dev->name:"de620", irq_in); - return; - } - + spin_lock(&de620_lock); + /* Read the status register (_not_ the status port) */ irq_status = de620_get_register(dev, R_STS); @@ -620,6 +614,8 @@ if(de620_tx_buffs(dev) != (TXBF0 | TXBF1)) netif_wake_queue(dev); + + spin_unlock(&de620_lock); } /************************************** @@ -694,8 +690,7 @@ else { /* Good packet? */ skb = dev_alloc_skb(size+2); if (skb == NULL) { /* Yeah, but no place to put it... */ - printk(KERN_WARNING "%s: Couldn't allocate a sk_buff of size %d.\n", - dev->name, size); + printk(KERN_WARNING "%s: Couldn't allocate a sk_buff of size %d.\n", dev->name, size); ((struct net_device_stats *)(dev->priv))->rx_dropped++; } else { /* Yep! Go get it! */ @@ -824,6 +819,8 @@ SET_MODULE_OWNER(dev); + spin_lock_init(&de620_lock); + /* * This is where the base_addr and irq gets set. * Tunable at compile-time and insmod-time diff -Nru a/drivers/net/depca.c b/drivers/net/depca.c --- a/drivers/net/depca.c Mon Oct 28 16:32:37 2002 +++ b/drivers/net/depca.c Mon Oct 28 16:32:37 2002 @@ -938,7 +938,7 @@ spin_unlock(&lp->lock); } - +/* Called with lp->lock held */ static int depca_rx(struct net_device *dev) { struct depca_private *lp = (struct depca_private *) dev->priv; @@ -1036,6 +1036,7 @@ /* ** Buffer sent - check for buffer errors. +** Called with lp->lock held */ static int depca_tx(struct net_device *dev) { @@ -2003,7 +2004,7 @@ spin_lock_irqsave(&lp->lock, flags); memcpy(buf, &lp->pktStats, ioc->len); spin_unlock_irqrestore(&lp->lock, flags); - if (copy_to_user(ioc->data, &lp->pktStats, ioc->len)) + if (copy_to_user(ioc->data, buf, ioc->len)) status = -EFAULT; kfree(buf); break; diff -Nru a/drivers/net/dl2k.c b/drivers/net/dl2k.c --- a/drivers/net/dl2k.c Mon Oct 28 16:32:36 2002 +++ b/drivers/net/dl2k.c Mon Oct 28 16:32:36 2002 @@ -535,7 +535,7 @@ { long ioaddr = dev->base_addr; - printk (KERN_INFO "%s: Tx timed out (%4.4x), is buffer full?\n", + printk (KERN_INFO "%s: Tx timed out (%4.4lx), is buffer full?\n", dev->name, readl (ioaddr + TxStatus)); rio_free_tx(dev, 0); dev->if_port = 0; diff -Nru a/drivers/net/eepro100.c b/drivers/net/eepro100.c --- a/drivers/net/eepro100.c Mon Oct 28 16:32:37 2002 +++ b/drivers/net/eepro100.c Mon Oct 28 16:32:37 2002 @@ -122,8 +122,7 @@ static int debug = -1; #define DEBUG_DEFAULT (NETIF_MSG_DRV | \ - NETIF_MSG_IFDOWN | \ - NETIF_MSG_IFUP | \ + NETIF_MSG_HW | \ NETIF_MSG_RX_ERR | \ NETIF_MSG_TX_ERR) #define DEBUG ((debug >= 0) ? (1<= 0); -#ifndef final_version if (wait < 0) printk(KERN_ALERT "%s: wait_for_cmd_done timeout!\n", dev->name); -#endif return r; } @@ -852,7 +849,9 @@ sp->phy[0] = eeprom[6]; sp->phy[1] = eeprom[7]; - sp->mii_if.phy_id = eeprom[6]; + sp->mii_if.phy_id = eeprom[6] & 0x1f; + sp->mii_if.phy_id_mask = 0x1f; + sp->mii_if.reg_num_mask = 0x1f; sp->mii_if.dev = dev; sp->mii_if.mdio_read = mdio_read; sp->mii_if.mdio_write = mdio_write; @@ -1207,7 +1206,7 @@ /* We haven't received a packet in a Long Time. We might have been bitten by the receiver hang bug. This can be cleared by sending a set multicast list command. */ - if (netif_msg_rx_err(sp)) + if (netif_msg_timer(sp)) printk(KERN_DEBUG "%s: Sending a multicast list set command" " from a timer routine," " m=%d, j=%ld, l=%ld.\n", @@ -1224,25 +1223,26 @@ struct speedo_private *sp = (struct speedo_private *)dev->priv; int i; - /* Print a few items for debugging. */ - printk(KERN_DEBUG "%s: Tx ring dump, Tx queue %u / %u:\n", dev->name, - sp->cur_tx, sp->dirty_tx); - for (i = 0; i < TX_RING_SIZE; i++) - printk(KERN_DEBUG "%s: %c%c%2d %8.8x.\n", dev->name, - i == sp->dirty_tx % TX_RING_SIZE ? '*' : ' ', - i == sp->cur_tx % TX_RING_SIZE ? '=' : ' ', - i, sp->tx_ring[i].status); - - printk(KERN_DEBUG "%s: Printing Rx ring" - " (next to receive into %u, dirty index %u).\n", - dev->name, sp->cur_rx, sp->dirty_rx); - for (i = 0; i < RX_RING_SIZE; i++) - printk(KERN_DEBUG "%s: %c%c%c%2d %8.8x.\n", dev->name, - sp->rx_ringp[i] == sp->last_rxf ? 'l' : ' ', - i == sp->dirty_rx % RX_RING_SIZE ? '*' : ' ', - i == sp->cur_rx % RX_RING_SIZE ? '=' : ' ', - i, (sp->rx_ringp[i] != NULL) ? - (unsigned)sp->rx_ringp[i]->status : 0); + if (netif_msg_pktdata(sp)) { + printk(KERN_DEBUG "%s: Tx ring dump, Tx queue %u / %u:\n", + dev->name, sp->cur_tx, sp->dirty_tx); + for (i = 0; i < TX_RING_SIZE; i++) + printk(KERN_DEBUG "%s: %c%c%2d %8.8x.\n", dev->name, + i == sp->dirty_tx % TX_RING_SIZE ? '*' : ' ', + i == sp->cur_tx % TX_RING_SIZE ? '=' : ' ', + i, sp->tx_ring[i].status); + + printk(KERN_DEBUG "%s: Printing Rx ring" + " (next to receive into %u, dirty index %u).\n", + dev->name, sp->cur_rx, sp->dirty_rx); + for (i = 0; i < RX_RING_SIZE; i++) + printk(KERN_DEBUG "%s: %c%c%c%2d %8.8x.\n", dev->name, + sp->rx_ringp[i] == sp->last_rxf ? 'l' : ' ', + i == sp->dirty_rx % RX_RING_SIZE ? '*' : ' ', + i == sp->cur_rx % RX_RING_SIZE ? '=' : ' ', + i, (sp->rx_ringp[i] != NULL) ? + (unsigned)sp->rx_ringp[i]->status : 0); + } #if 0 { @@ -1378,8 +1378,8 @@ sp->dirty_tx, sp->cur_tx, sp->tx_ring[sp->dirty_tx % TX_RING_SIZE].status); - speedo_show_state(dev); } + speedo_show_state(dev); #if 0 if ((status & 0x00C0) != 0x0080 && (status & 0x003C) == 0x0010) { @@ -1564,13 +1564,6 @@ long ioaddr, boguscnt = max_interrupt_work; unsigned short status; -#ifndef final_version - if (dev == NULL) { - printk(KERN_ERR "speedo_interrupt(): irq %d for unknown device.\n", irq); - return; - } -#endif - ioaddr = dev->base_addr; sp = (struct speedo_private *)dev->priv; @@ -1717,9 +1710,9 @@ if (netif_msg_rx_err(sp) || !(sp->rx_ring_state & RrOOMReported)) { printk(KERN_WARNING "%s: can't fill rx buffer (force %d)!\n", dev->name, force); - speedo_show_state(dev); sp->rx_ring_state |= RrOOMReported; } + speedo_show_state(dev); if (!force) return -1; /* Better luck next time! */ /* Borrow an skb from one of next entries. */ @@ -1792,7 +1785,7 @@ break; } - if (netif_msg_intr(sp)) + if (netif_msg_rx_status(sp)) printk(KERN_DEBUG " speedo_rx() status %8.8x len %d.\n", status, pkt_len); if ((status & (RxErrTooBig|RxOK|0x0f90)) != RxOK) { @@ -1894,10 +1887,7 @@ udelay(10); free_irq(dev->irq, dev); - - /* Print a few items for debugging. */ - if (netif_msg_ifdown(sp)) - speedo_show_state(dev); + speedo_show_state(dev); /* Free all the skbuffs in the Rx and Tx queues. */ for (i = 0; i < RX_RING_SIZE; i++) { diff -Nru a/drivers/net/ewrk3.c b/drivers/net/ewrk3.c --- a/drivers/net/ewrk3.c Mon Oct 28 16:32:36 2002 +++ b/drivers/net/ewrk3.c Mon Oct 28 16:32:36 2002 @@ -135,8 +135,10 @@ 0.43 16-Aug-96 Update alloc_device() to conform to de4x5.c 0.44 08-Nov-01 use library crc32 functions 0.45 19-Jul-02 fix unaligned access on alpha - 0.46 10-Oct-02 cli/sti removal - Multiple NIC support when module + 0.46 10-Oct-02 Multiple NIC support when module + 0.47 18-Oct-02 ethtool support + 0.48 18-Oct-02 cli/sti removal for 2.5 + ioctl locking, signature search cleanup ========================================================================= */ @@ -161,6 +163,7 @@ #include #include #include +#include #include #include @@ -169,8 +172,11 @@ #include "ewrk3.h" +#define DRV_NAME "ewrk3" +#define DRV_VERSION "0.48" + static char version[] __initdata = -"ewrk3.c:v0.46 2002/10/09 davies@maniac.ultranet.com\n"; +DRV_NAME ":v" DRV_VERSION " 2002/10/18 davies@maniac.ultranet.com\n"; #ifdef EWRK3_DEBUG static int ewrk3_debug = EWRK3_DEBUG; @@ -258,26 +264,29 @@ #define EWRK3_PKT_BIN_SZ 128 /* Should be >=100 unless you increase EWRK3_PKT_STAT_SZ */ +struct ewrk3_stats { + u32 bins[EWRK3_PKT_STAT_SZ]; + u32 unicast; + u32 multicast; + u32 broadcast; + u32 excessive_collisions; + u32 tx_underruns; + u32 excessive_underruns; +}; + struct ewrk3_private { char adapter_name[80]; /* Name exported to /proc/ioports */ u_long shmem_base; /* Shared memory start address */ u_long shmem_length; /* Shared memory window length */ struct net_device_stats stats; /* Public stats */ - struct { - u32 bins[EWRK3_PKT_STAT_SZ]; /* Private stats counters */ - u32 unicast; - u32 multicast; - u32 broadcast; - u32 excessive_collisions; - u32 tx_underruns; - u32 excessive_underruns; - } pktStats; + struct ewrk3_stats pktStats; /* Private stats counters */ u_char irq_mask; /* Adapter IRQ mask bits */ u_char mPage; /* Maximum 2kB Page number */ u_char lemac; /* Chip rev. level */ u_char hard_strapped; /* Don't allow a full open */ u_char txc; /* Transmit cut through */ u_char *mctbl; /* Pointer to the multicast table */ + u_char led_mask; /* Used to reserve LED access for ethtool */ spinlock_t hw_lock; }; @@ -533,6 +542,7 @@ lp->shmem_length = shmem_length; lp->lemac = lemac; lp->hard_strapped = hard_strapped; + lp->led_mask = CR_LED; spin_lock_init(&lp->hw_lock); lp->mPage = 64; @@ -903,7 +913,7 @@ DISABLE_IRQs; cr = inb(EWRK3_CR); - cr |= CR_LED; + cr |= lp->led_mask; outb(cr, EWRK3_CR); if (csr & CSR_RNE) /* Rx interrupt (packet[s] arrived) */ @@ -928,12 +938,13 @@ } /* Unmask the EWRK3 board interrupts and turn off the LED */ - cr &= ~CR_LED; + cr &= ~(lp->led_mask); outb(cr, EWRK3_CR); ENABLE_IRQs; spin_unlock(&lp->hw_lock); } +/* Called with lp->hw_lock held */ static int ewrk3_rx(struct net_device *dev) { struct ewrk3_private *lp = (struct ewrk3_private *) dev->priv; @@ -1059,8 +1070,9 @@ } /* - ** Buffer sent - check for TX buffer errors. - */ +** Buffer sent - check for TX buffer errors. +** Called with lp->hw_lock held +*/ static int ewrk3_tx(struct net_device *dev) { struct ewrk3_private *lp = (struct ewrk3_private *) dev->priv; @@ -1468,27 +1480,20 @@ */ static void __init EthwrkSignature(char *name, char *eeprom_image) { - u_long i, j, k; + int i; char *signatures[] = EWRK3_SIGNATURE; - strcpy(name, ""); - for (i = 0; *signatures[i] != '\0' && *name == '\0'; i++) { - for (j = EEPROM_PNAME7, k = 0; j <= EEPROM_PNAME0 && k < strlen(signatures[i]); j++) { - if (signatures[i][k] == eeprom_image[j]) { /* track signature */ - k++; - } else { /* lost signature; begin search again */ - k = 0; - } - } - if (k == strlen(signatures[i])) { - for (k = 0; k < EWRK3_STRLEN; k++) { - name[k] = eeprom_image[EEPROM_PNAME7 + k]; - name[EWRK3_STRLEN] = '\0'; - } - } - } + for (i=0; *signatures[i] != '\0'; i++) + if( !strncmp(eeprom_image+EEPROM_PNAME7, signatures[i], strlen(signatures[i])) ) + break; + + if (*signatures[i] != '\0') { + memcpy(name, eeprom_image+EEPROM_PNAME7, EWRK3_STRLEN); + name[EWRK3_STRLEN] = '\0'; + } else + name[0] = '\0'; - return; /* return the device name string */ + return; } /* @@ -1624,6 +1629,197 @@ return status; /* return the device name string */ } +static int ewrk3_ethtool_ioctl(struct net_device *dev, void *useraddr) +{ + struct ewrk3_private *lp = (struct ewrk3_private *) dev->priv; + u_long iobase = dev->base_addr; + u32 ethcmd; + + if (get_user(ethcmd, (u32 *)useraddr)) + return -EFAULT; + + switch (ethcmd) { + + /* Get driver info */ + case ETHTOOL_GDRVINFO: { + struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; + int fwrev = Read_EEPROM(dev->base_addr, EEPROM_REVLVL); + + strcpy(info.driver, DRV_NAME); + strcpy(info.version, DRV_VERSION); + sprintf(info.fw_version, "%d", fwrev); + strcpy(info.bus_info, "N/A"); + info.eedump_len = EEPROM_MAX; + if (copy_to_user(useraddr, &info, sizeof(info))) + return -EFAULT; + return 0; + } + + /* Get settings */ + case ETHTOOL_GSET: { + struct ethtool_cmd ecmd = { ETHTOOL_GSET }; + u_char cr = inb(EWRK3_CR); + + switch (lp->adapter_name[4]) { + case '3': /* DE203 */ + ecmd.supported = SUPPORTED_BNC; + ecmd.port = PORT_BNC; + break; + + case '4': /* DE204 */ + ecmd.supported = SUPPORTED_TP; + ecmd.port = PORT_TP; + break; + + case '5': /* DE205 */ + ecmd.supported = SUPPORTED_TP | SUPPORTED_BNC | SUPPORTED_AUI; + ecmd.autoneg = !(cr & CR_APD); + /* + ** Port is only valid if autoneg is disabled + ** and even then we don't know if AUI is jumpered. + */ + if (!ecmd.autoneg) + ecmd.port = (cr & CR_PSEL) ? PORT_BNC : PORT_TP; + break; + } + + ecmd.supported |= SUPPORTED_10baseT_Half; + ecmd.speed = SPEED_10; + ecmd.duplex = DUPLEX_HALF; + + if (copy_to_user(useraddr, &ecmd, sizeof(ecmd))) + return -EFAULT; + return 0; + } + + /* Set settings */ + case ETHTOOL_SSET: { + struct ethtool_cmd ecmd; + u_char cr; + u_long flags; + + /* DE205 is the only card with anything to set */ + if (lp->adapter_name[4] != '5') + return -EOPNOTSUPP; + + if (copy_from_user(&ecmd, useraddr, sizeof(ecmd))) + return -EFAULT; + + /* Sanity-check parameters */ + if (ecmd.speed != SPEED_10) + return -EINVAL; + if (ecmd.port != PORT_TP && ecmd.port != PORT_BNC) + return -EINVAL; /* AUI is not software-selectable */ + if (ecmd.transceiver != XCVR_INTERNAL) + return -EINVAL; + if (ecmd.duplex != DUPLEX_HALF) + return -EINVAL; + if (ecmd.phy_address != 0) + return -EINVAL; + + spin_lock_irqsave(&lp->hw_lock, flags); + cr = inb(EWRK3_CR); + + /* If Autoneg is set, change to Auto Port mode */ + /* Otherwise, disable Auto Port and set port explicitly */ + if (ecmd.autoneg) { + cr &= ~CR_APD; + } else { + cr |= CR_APD; + if (ecmd.port == PORT_TP) + cr &= ~CR_PSEL; /* Force TP */ + else + cr |= CR_PSEL; /* Force BNC */ + } + + /* Commit the changes */ + outb(cr, EWRK3_CR); + + spin_unlock_irqrestore(&lp->hw_lock, flags); + if (copy_to_user(useraddr, &ecmd, sizeof(ecmd))) + return -EFAULT; + return 0; + } + + /* Get link status */ + case ETHTOOL_GLINK: { + struct ethtool_value edata = { ETHTOOL_GLINK }; + u_char cmr = inb(EWRK3_CMR); + + /* DE203 has BNC only and link status does not apply */ + if (lp->adapter_name[4] == '3') + return -EOPNOTSUPP; + + /* On DE204 this is always valid since TP is the only port. */ + /* On DE205 this reflects TP status even if BNC or AUI is selected. */ + edata.data = !(cmr & CMR_LINK); + + if (copy_to_user(useraddr, &edata, sizeof(edata))) + return -EFAULT; + return 0; + } + +#ifdef BROKEN + /* Blink LED for identification */ + case ETHTOOL_PHYS_ID: { + struct ethtool_value edata; + u_long flags; + long delay, ret; + u_char cr; + int count; + wait_queue_head_t wait; + + init_waitqueue_head(&wait); + + if (copy_from_user(&edata, useraddr, sizeof(edata))) + return -EFAULT; + + /* Toggle LED 4x per second */ + delay = HZ >> 2; + count = edata.data << 2; + + spin_lock_irqsave(&lp->hw_lock, flags); + + /* Bail if a PHYS_ID is already in progress */ + if (lp->led_mask == 0) { + spin_unlock_irqrestore(&lp->hw_lock, flags); + return -EBUSY; + } + + /* Prevent ISR from twiddling the LED */ + lp->led_mask = 0; + + while (count--) { + /* Toggle the LED */ + cr = inb(EWRK3_CR); + outb(cr ^ CR_LED, EWRK3_CR); + + /* Wait a little while */ + spin_unlock_irqrestore(&lp->hw_lock, flags); + ret = delay; + __wait_event_interruptible_timeout(wait, 0, ret); + spin_lock_irqsave(&lp->hw_lock, flags); + + /* Exit if we got a signal */ + if (ret == -ERESTARTSYS) + goto out; + } + + ret = 0; +out: + lp->led_mask = CR_LED; + cr = inb(EWRK3_CR); + outb(cr & ~CR_LED, EWRK3_CR); + spin_unlock_irqrestore(&lp->hw_lock, flags); + return ret; + } +#endif /* BROKEN */ + + } + + return -EOPNOTSUPP; +} + /* ** Perform IOCTL call functions here. Some are privileged operations and the ** effective uid is checked in those cases. @@ -1635,6 +1831,7 @@ u_long iobase = dev->base_addr; int i, j, status = 0; u_char csr; + unsigned long flags; union ewrk3_addr { u_char addr[HASH_TABLE_LEN * ETH_ALEN]; u_short val[(HASH_TABLE_LEN * ETH_ALEN) >> 1]; @@ -1642,6 +1839,14 @@ union ewrk3_addr *tmp; + /* ethtool IOCTLs are handled elsewhere */ + if (cmd == SIOCETHTOOL) + return ewrk3_ethtool_ioctl(dev, (void *)rq->ifr_data); + + /* Other than ethtool, all we handle are private IOCTLs */ + if (cmd != EWRK3IOCTL) + return -EOPNOTSUPP; + tmp = kmalloc(sizeof(union ewrk3_addr), GFP_KERNEL); if(tmp==NULL) return -ENOMEM; @@ -1658,21 +1863,26 @@ case EWRK3_SET_HWADDR: /* Set the hardware address */ if (capable(CAP_NET_ADMIN)) { + spin_lock_irqsave(&lp->hw_lock, flags); csr = inb(EWRK3_CSR); csr |= (CSR_TXD | CSR_RXD); outb(csr, EWRK3_CSR); /* Disable the TX and RX */ + spin_unlock_irqrestore(&lp->hw_lock, flags); if (copy_from_user(tmp->addr, ioc->data, ETH_ALEN)) { status = -EFAULT; break; } + spin_lock_irqsave(&lp->hw_lock, flags); for (i = 0; i < ETH_ALEN; i++) { dev->dev_addr[i] = tmp->addr[i]; outb(tmp->addr[i], EWRK3_PAR0 + i); } + csr = inb(EWRK3_CSR); csr &= ~(CSR_TXD | CSR_RXD); /* Enable the TX and RX */ outb(csr, EWRK3_CSR); + spin_unlock_irqrestore(&lp->hw_lock, flags); } else { status = -EPERM; } @@ -1680,10 +1890,12 @@ break; case EWRK3_SET_PROM: /* Set Promiscuous Mode */ if (capable(CAP_NET_ADMIN)) { + spin_lock_irqsave(&lp->hw_lock, flags); csr = inb(EWRK3_CSR); csr |= CSR_PME; csr &= ~CSR_MCE; outb(csr, EWRK3_CSR); + spin_unlock_irqrestore(&lp->hw_lock, flags); } else { status = -EPERM; } @@ -1691,16 +1903,18 @@ break; case EWRK3_CLR_PROM: /* Clear Promiscuous Mode */ if (capable(CAP_NET_ADMIN)) { + spin_lock_irqsave(&lp->hw_lock, flags); csr = inb(EWRK3_CSR); csr &= ~CSR_PME; outb(csr, EWRK3_CSR); + spin_unlock_irqrestore(&lp->hw_lock, flags); } else { status = -EPERM; } break; case EWRK3_GET_MCA: /* Get the multicast address table */ - spin_lock_irq(&lp->hw_lock); + spin_lock_irqsave(&lp->hw_lock, flags); if (lp->shmem_length == IO_ONLY) { outb(0, EWRK3_IOPR); outw(PAGE0_HTE, EWRK3_PIR1); @@ -1711,7 +1925,7 @@ outb(0, EWRK3_MPR); isa_memcpy_fromio(tmp->addr, lp->shmem_base + PAGE0_HTE, (HASH_TABLE_LEN >> 3)); } - spin_unlock_irq(&lp->hw_lock); + spin_unlock_irqrestore(&lp->hw_lock, flags); ioc->len = (HASH_TABLE_LEN >> 3); if (copy_to_user(ioc->data, tmp->addr, ioc->len)) @@ -1745,28 +1959,37 @@ break; case EWRK3_MCA_EN: /* Enable multicast addressing */ if (capable(CAP_NET_ADMIN)) { + spin_lock_irqsave(&lp->hw_lock, flags); csr = inb(EWRK3_CSR); csr |= CSR_MCE; csr &= ~CSR_PME; outb(csr, EWRK3_CSR); + spin_unlock_irqrestore(&lp->hw_lock, flags); } else { status = -EPERM; } break; - case EWRK3_GET_STATS: /* Get the driver statistics */ - cli(); - ioc->len = sizeof(lp->pktStats); - if (copy_to_user(ioc->data, &lp->pktStats, ioc->len)) - status = -EFAULT; - sti(); + case EWRK3_GET_STATS: { /* Get the driver statistics */ + struct ewrk3_stats *tmp_stats = + kmalloc(sizeof(lp->pktStats), GFP_KERNEL); + if (!tmp_stats) return -ENOMEM; + + spin_lock_irqsave(&lp->hw_lock, flags); + memcpy(tmp_stats, &lp->pktStats, sizeof(lp->pktStats)); + spin_unlock_irqrestore(&lp->hw_lock, flags); + ioc->len = sizeof(lp->pktStats); + if (copy_to_user(ioc->data, tmp_stats, sizeof(lp->pktStats))) + status = -EFAULT; + kfree(tmp_stats); break; + } case EWRK3_CLR_STATS: /* Zero out the driver statistics */ if (capable(CAP_NET_ADMIN)) { - cli(); + spin_lock_irqsave(&lp->hw_lock, flags); memset(&lp->pktStats, 0, sizeof(lp->pktStats)); - sti(); + spin_unlock_irqrestore(&lp->hw_lock,flags); } else { status = -EPERM; } @@ -1854,7 +2077,7 @@ #ifdef MODULE static struct net_device *ewrk3_devs[MAX_NUM_EWRK3S]; static int ndevs; -static int io[MAX_NUM_EWRK3S+1] = { 0x300, 0, }; /* <--- EDIT THESE LINES FOR YOUR CONFIGURATION */ +static int io[MAX_NUM_EWRK3S+1] = { 0x300, 0, }; /* <--- EDIT THESE LINES FOR YOUR CONFIGURATION */ static int irq[MAX_NUM_EWRK3S+1] = { 5, 0, }; /* or use the insmod io= irq= options */ /* '21' below should really be 'MAX_NUM_EWRK3S' */ @@ -1895,8 +2118,7 @@ { int i; - for( i=0; ipriv) { kfree(ewrk3_devs[i]->priv); diff -Nru a/drivers/net/hamradio/baycom_epp.c b/drivers/net/hamradio/baycom_epp.c --- a/drivers/net/hamradio/baycom_epp.c Mon Oct 28 16:32:38 2002 +++ b/drivers/net/hamradio/baycom_epp.c Mon Oct 28 16:32:38 2002 @@ -481,7 +481,7 @@ ({ \ if (!(notbitstream & (0x1f0 << j))) \ goto stuff##j; \ - encodeend##j: \ + encodeend##j: ; \ }) #define ENCODEITERB(j) \ @@ -716,7 +716,7 @@ goto flgabrt##j; \ if ((bitstream & (0x1f8 << j)) == (0xf8 << j)) /* stuffed bit */ \ goto stuff##j; \ - enditer##j: \ + enditer##j: ; \ }) #define DECODEITERB(j) \ diff -Nru a/drivers/net/hamradio/soundmodem/Makefile b/drivers/net/hamradio/soundmodem/Makefile --- a/drivers/net/hamradio/soundmodem/Makefile Mon Oct 28 16:32:35 2002 +++ b/drivers/net/hamradio/soundmodem/Makefile Mon Oct 28 16:32:35 2002 @@ -38,5 +38,5 @@ $(obj)/sm_fsk9600.o: $(obj)/sm_tbl_fsk9600.h $(obj)/sm_tbl_%: $(obj)/gentbl - $(obj)/gentbl + cd $(obj) && ./gentbl diff -Nru a/drivers/net/ibmlana.c b/drivers/net/ibmlana.c --- a/drivers/net/ibmlana.c Mon Oct 28 16:32:36 2002 +++ b/drivers/net/ibmlana.c Mon Oct 28 16:32:36 2002 @@ -69,6 +69,8 @@ chars! June 1st, 2000 corrected version codes, added support for the latest 2.3 changes + Oct 28th, 2002 + cleaned up for the 2.5 tree *************************************************************************/ @@ -103,8 +105,9 @@ * have to pack all state info into the device struct! * ------------------------------------------------------------------------ */ -static char *MediaNames[Media_Count] = - { "10BaseT", "10Base5", "Unknown", "10Base2" }; +static char *MediaNames[Media_Count] = { + "10BaseT", "10Base5", "Unknown", "10Base2" +}; /* ------------------------------------------------------------------------ * private subfunctions @@ -113,7 +116,7 @@ #ifdef DEBUG /* dump all registers */ -static void dumpregs(struct IBMLANA_NETDEV *dev) +static void dumpregs(struct net_device *dev) { int z; @@ -128,7 +131,7 @@ /* dump parts of shared memory - only needed during debugging */ -static void dumpmem(struct IBMLANA_NETDEV *dev, u32 start, u32 len) +static void dumpmem(struct net_device *dev, u32 start, u32 len) { int z; @@ -136,7 +139,7 @@ for (z = 0; z < len; z++) { if ((z & 15) == 0) printk("%04x:", z); - printk(" %02x", IBMLANA_READB(dev->mem_start + start + z)); + printk(" %02x", isa_readb(dev->mem_start + start + z)); if ((z & 15) == 15) printk("\n"); } @@ -187,12 +190,12 @@ /* wait on register value with mask and timeout */ -static int wait_timeout(struct IBMLANA_NETDEV *dev, int regoffs, u16 mask, +static int wait_timeout(struct net_device *dev, int regoffs, u16 mask, u16 value, int timeout) { unsigned long fin = jiffies + timeout; - while (jiffies != fin) + while (time_before(jiffies,fin)) if ((inw(dev->base_addr + regoffs) & mask) == value) return 1; @@ -202,7 +205,7 @@ /* reset the whole board */ -static void ResetBoard(struct IBMLANA_NETDEV *dev) +static void ResetBoard(struct net_device *dev) { unsigned char bcmval; @@ -226,7 +229,7 @@ /* calculate RAM layout & set up descriptors in RAM */ -static void InitDscrs(struct IBMLANA_NETDEV *dev) +static void InitDscrs(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; u32 addr, baddr, raddr; @@ -237,7 +240,7 @@ /* initialize RAM */ - IBMLANA_SETIO(dev->mem_start, 0xaa, + isa_memset_io(dev->mem_start, 0xaa, dev->mem_start - dev->mem_start); /* setup n TX descriptors - independent of RAM size */ @@ -257,29 +260,27 @@ else tda.link = addr + sizeof(tda_t); tda.link |= 1; - IBMLANA_TOIO(dev->mem_start + addr, &tda, sizeof(tda_t)); + isa_memcpy_to_io(dev->mem_start + addr, &tda, sizeof(tda_t)); addr += sizeof(tda_t); baddr += PKTSIZE; } /* calculate how many receive buffers fit into remaining memory */ - priv->rxbufcnt = (dev->mem_end - dev->mem_start - baddr) / - (sizeof(rra_t) + sizeof(rda_t) + PKTSIZE); + priv->rxbufcnt = (dev->mem_end - dev->mem_start - baddr) / (sizeof(rra_t) + sizeof(rda_t) + PKTSIZE); /* calculate receive addresses */ priv->rrastart = raddr = priv->txbufstart + (TXBUFCNT * PKTSIZE); - priv->rdastart = addr = - priv->rrastart + (priv->rxbufcnt * sizeof(rra_t)); - priv->rxbufstart = baddr = - priv->rdastart + (priv->rxbufcnt * sizeof(rda_t)); + priv->rdastart = addr = priv->rrastart + (priv->rxbufcnt * sizeof(rra_t)); + priv->rxbufstart = baddr = priv->rdastart + (priv->rxbufcnt * sizeof(rda_t)); + for (z = 0; z < priv->rxbufcnt; z++) { rra.startlo = baddr; rra.starthi = 0; rra.cntlo = PKTSIZE >> 1; rra.cnthi = 0; - IBMLANA_TOIO(dev->mem_start + raddr, &rra, sizeof(rra_t)); + isa_memcpy_to_io(dev->mem_start + raddr, &rra, sizeof(rra_t)); rda.status = 0; rda.length = 0; @@ -291,7 +292,7 @@ else rda.link = 1; rda.inuse = 1; - IBMLANA_TOIO(dev->mem_start + addr, &rda, sizeof(rda_t)); + isa_memcpy_to_io(dev->mem_start + addr, &rda, sizeof(rda_t)); baddr += PKTSIZE; raddr += sizeof(rra_t); @@ -310,7 +311,7 @@ /* set up Rx + Tx descriptors in SONIC */ -static int InitSONIC(struct IBMLANA_NETDEV *dev) +static int InitSONIC(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; @@ -318,8 +319,7 @@ outw(0, SONIC_URRA); outw(priv->rrastart, dev->base_addr + SONIC_RSA); - outw(priv->rrastart + (priv->rxbufcnt * sizeof(rra_t)), - dev->base_addr + SONIC_REA); + outw(priv->rrastart + (priv->rxbufcnt * sizeof(rra_t)), dev->base_addr + SONIC_REA); outw(priv->rrastart, dev->base_addr + SONIC_RRP); outw(priv->rrastart, dev->base_addr + SONIC_RWP); @@ -331,9 +331,7 @@ outw(CMDREG_RRRA, dev->base_addr + SONIC_CMDREG); if (!wait_timeout(dev, SONIC_CMDREG, CMDREG_RRRA, 0, 2)) { - printk - ("%s: SONIC did not respond on RRRA command - giving up.", - dev->name); + printk(KERN_ERR "%s: SONIC did not respond on RRRA command - giving up.", dev->name); return 0; } @@ -351,12 +349,11 @@ /* stop SONIC so we can reinitialize it */ -static void StopSONIC(struct IBMLANA_NETDEV *dev) +static void StopSONIC(struct net_device *dev) { /* disable interrupts */ - outb(inb(dev->base_addr + BCMREG) & (~BCMREG_IEN), - dev->base_addr + BCMREG); + outb(inb(dev->base_addr + BCMREG) & (~BCMREG_IEN), dev->base_addr + BCMREG); outb(0, dev->base_addr + SONIC_IMREG); /* reset the SONIC */ @@ -380,7 +377,7 @@ (*camcnt)++; } -static void InitBoard(struct IBMLANA_NETDEV *dev) +static void InitBoard(struct net_device *dev) { int camcnt; camentry_t cams[16]; @@ -395,14 +392,12 @@ /* clear all spurious interrupts */ - outw(inw(dev->base_addr + SONIC_ISREG), - dev->base_addr + SONIC_ISREG); + outw(inw(dev->base_addr + SONIC_ISREG), dev->base_addr + SONIC_ISREG); /* set up the SONIC's bus interface - constant for this adapter - must be done while the SONIC is in reset */ - outw(DCREG_USR1 | DCREG_USR0 | DCREG_WC1 | DCREG_DW32, - dev->base_addr + SONIC_DCREG); + outw(DCREG_USR1 | DCREG_USR0 | DCREG_WC1 | DCREG_DW32, dev->base_addr + SONIC_DCREG); outw(0, dev->base_addr + SONIC_DCREG2); /* remove reset form the SONIC */ @@ -434,9 +429,8 @@ /* feed CDA into SONIC, initialize RCR value (always get broadcasts) */ - IBMLANA_TOIO(dev->mem_start, cams, sizeof(camentry_t) * camcnt); - IBMLANA_TOIO(dev->mem_start + (sizeof(camentry_t) * camcnt), - &cammask, sizeof(cammask)); + isa_memcpy_to_io(dev->mem_start, cams, sizeof(camentry_t) * camcnt); + isa_memcpy_to_io(dev->mem_start + (sizeof(camentry_t) * camcnt), &cammask, sizeof(cammask)); #ifdef DEBUG printk("CAM setup:\n"); @@ -447,9 +441,7 @@ outw(camcnt, dev->base_addr + SONIC_CAMCNT); outw(CMDREG_LCAM, dev->base_addr + SONIC_CMDREG); if (!wait_timeout(dev, SONIC_CMDREG, CMDREG_LCAM, 0, 2)) { - printk - ("%s:SONIC did not respond on LCAM command - giving up.", - dev->name); + printk(KERN_ERR "%s:SONIC did not respond on LCAM command - giving up.", dev->name); return; } else { /* clear interrupt condition */ @@ -470,12 +462,9 @@ for (z = 0; z < camcnt; z++) { outw(z, dev->base_addr + SONIC_CAMEPTR); printk("Entry %d: %04x %04x %04x\n", z, - inw(dev->base_addr + - SONIC_CAMADDR0), - inw(dev->base_addr + - SONIC_CAMADDR1), - inw(dev->base_addr + - SONIC_CAMADDR2)); + inw(dev->base_addr + SONIC_CAMADDR0), + inw(dev->base_addr + SONIC_CAMADDR1), + inw(dev->base_addr + SONIC_CAMADDR2)); } outw(0, dev->base_addr + SONIC_CMDREG); } @@ -515,13 +504,11 @@ /* enable transmitter + receiver interrupts */ outw(CMDREG_RXEN, dev->base_addr + SONIC_CMDREG); - outw(IMREG_PRXEN | IMREG_RBEEN | IMREG_PTXEN | IMREG_TXEREN, - dev->base_addr + SONIC_IMREG); + outw(IMREG_PRXEN | IMREG_RBEEN | IMREG_PTXEN | IMREG_TXEREN, dev->base_addr + SONIC_IMREG); /* turn on card interrupts */ - outb(inb(dev->base_addr + BCMREG) | BCMREG_IEN, - dev->base_addr + BCMREG); + outb(inb(dev->base_addr + BCMREG) | BCMREG_IEN, dev->base_addr + BCMREG); #ifdef DEBUG printk("Register dump after initialization:\n"); @@ -531,7 +518,7 @@ /* start transmission of a descriptor */ -static void StartTx(struct IBMLANA_NETDEV *dev, int descr) +static void StartTx(struct net_device *dev, int descr) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; int addr; @@ -554,7 +541,7 @@ /* receive buffer area exhausted */ -static void irqrbe_handler(struct IBMLANA_NETDEV *dev) +static void irqrbe_handler(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; @@ -566,7 +553,7 @@ /* receive interrupt */ -static void irqrx_handler(struct IBMLANA_NETDEV *dev) +static void irqrx_handler(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; rda_t rda; @@ -577,12 +564,9 @@ while (1) { /* read descriptor that was next to be filled by SONIC */ - rdaaddr = - priv->rdastart + (priv->nextrxdescr * sizeof(rda_t)); - lrdaaddr = - priv->rdastart + (priv->lastrxdescr * sizeof(rda_t)); - IBMLANA_FROMIO(&rda, dev->mem_start + rdaaddr, - sizeof(rda_t)); + rdaaddr = priv->rdastart + (priv->nextrxdescr * sizeof(rda_t)); + lrdaaddr = priv->rdastart + (priv->lastrxdescr * sizeof(rda_t)); + isa_memcpy_fromio(&rda, dev->mem_start + rdaaddr, sizeof(rda_t)); /* iron out upper word halves of fields we use - SONIC will duplicate bits 0..15 to 16..31 */ @@ -609,7 +593,7 @@ else { /* copy out data */ - IBMLANA_FROMIO(skb_put(skb, rda.length), + isa_memcpy_fromio(skb_put(skb, rda.length), dev->mem_start + rda.startlo, rda.length); @@ -620,15 +604,11 @@ skb->ip_summed = CHECKSUM_NONE; /* bookkeeping */ - dev->last_rx = jiffies; priv->stat.rx_packets++; -#if (LINUX_VERSION_CODE >= 0x20119) /* byte counters for kernel >= 2.1.25 */ priv->stat.rx_bytes += rda.length; -#endif /* pass to the upper layers */ - netif_rx(skb); } } @@ -637,10 +617,8 @@ else { priv->stat.rx_errors++; - if (rda.status & RCREG_FAER) priv->stat.rx_frame_errors++; - if (rda.status & RCREG_CRCR) priv->stat.rx_crc_errors++; } @@ -649,14 +627,14 @@ rda.link = 1; rda.inuse = 1; - IBMLANA_TOIO(dev->mem_start + rdaaddr, &rda, + isa_memcpy_to_io(dev->mem_start + rdaaddr, &rda, sizeof(rda_t)); /* set up link and EOL = 0 in currently last descriptor. Only write the link field since the SONIC may currently already access the other fields. */ - IBMLANA_TOIO(dev->mem_start + lrdaaddr + 20, &rdaaddr, 4); + isa_memcpy_to_io(dev->mem_start + lrdaaddr + 20, &rdaaddr, 4); /* advance indices */ @@ -668,57 +646,39 @@ /* transmit interrupt */ -static void irqtx_handler(struct IBMLANA_NETDEV *dev) +static void irqtx_handler(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; tda_t tda; /* fetch descriptor (we forgot the size ;-) */ - - IBMLANA_FROMIO(&tda, - dev->mem_start + priv->tdastart + - (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t)); + isa_memcpy_fromio(&tda, dev->mem_start + priv->tdastart + (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t)); /* update statistics */ - priv->stat.tx_packets++; -#if (LINUX_VERSION_CODE >= 0x020119) priv->stat.tx_bytes += tda.length; -#endif /* update our pointers */ - priv->txused[priv->currtxdescr] = 0; priv->txusedcnt--; /* if there are more descriptors present in RAM, start them */ - if (priv->txusedcnt > 0) StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT); /* tell the upper layer we can go on transmitting */ - -#if LINUX_VERSION_CODE >= 0x02032a netif_wake_queue(dev); -#else - dev->tbusy = 0; - mark_bh(NET_BH); -#endif } -static void irqtxerr_handler(struct IBMLANA_NETDEV *dev) +static void irqtxerr_handler(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; tda_t tda; /* fetch descriptor to check status */ - - IBMLANA_FROMIO(&tda, - dev->mem_start + priv->tdastart + - (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t)); + isa_memcpy_fromio(&tda, dev->mem_start + priv->tdastart + (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t)); /* update statistics */ - priv->stat.tx_errors++; if (tda.status & (TCREG_NCRS | TCREG_CRSL)) priv->stat.tx_carrier_errors++; @@ -730,47 +690,29 @@ priv->stat.tx_fifo_errors++; /* update our pointers */ - priv->txused[priv->currtxdescr] = 0; priv->txusedcnt--; /* if there are more descriptors present in RAM, start them */ - if (priv->txusedcnt > 0) StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT); /* tell the upper layer we can go on transmitting */ - -#if LINUX_VERSION_CODE >= 0x02032a netif_wake_queue(dev); -#else - dev->tbusy = 0; - mark_bh(NET_BH); -#endif } /* general interrupt entry */ static void irq_handler(int irq, void *device, struct pt_regs *regs) { - struct IBMLANA_NETDEV *dev = (struct IBMLANA_NETDEV *) device; + struct net_device *dev = (struct net_device *) device; u16 ival; /* in case we're not meant... */ - if (!(inb(dev->base_addr + BCMREG) & BCMREG_IPEND)) return; -#if (LINUX_VERSION_CODE >= 0x02032a) -#if 0 - set_bit(LINK_STATE_RXSEM, &dev->state); -#endif -#else - dev->interrupt = 1; -#endif - /* loop through the interrupt bits until everything is clear */ - while (1) { ival = inw(dev->base_addr + SONIC_ISREG); @@ -778,32 +720,20 @@ irqrbe_handler(dev); outw(ISREG_RBE, dev->base_addr + SONIC_ISREG); } - if (ival & ISREG_PKTRX) { irqrx_handler(dev); outw(ISREG_PKTRX, dev->base_addr + SONIC_ISREG); } - if (ival & ISREG_TXDN) { irqtx_handler(dev); outw(ISREG_TXDN, dev->base_addr + SONIC_ISREG); } - if (ival & ISREG_TXER) { irqtxerr_handler(dev); outw(ISREG_TXER, dev->base_addr + SONIC_ISREG); } - break; } - -#if (LINUX_VERSION_CODE >= 0x02032a) -#if 0 - clear_bit(LINK_STATE_RXSEM, &dev->state); -#endif -#else - dev->interrupt = 0; -#endif } /* ------------------------------------------------------------------------ @@ -815,7 +745,7 @@ static int ibmlana_getinfo(char *buf, int slot, void *d) { int len = 0, i; - struct IBMLANA_NETDEV *dev = (struct IBMLANA_NETDEV *) d; + struct net_device *dev = (struct net_device *) d; ibmlana_priv *priv; /* can't say anything about an uninitialized device... */ @@ -830,11 +760,8 @@ len += sprintf(buf + len, "IRQ: %d\n", priv->realirq); len += sprintf(buf + len, "I/O: %#lx\n", dev->base_addr); - len += sprintf(buf + len, "Memory: %#lx-%#lx\n", dev->mem_start, - dev->mem_end - 1); - len += - sprintf(buf + len, "Transceiver: %s\n", - MediaNames[priv->medium]); + len += sprintf(buf + len, "Memory: %#lx-%#lx\n", dev->mem_start, dev->mem_end - 1); + len += sprintf(buf + len, "Transceiver: %s\n", MediaNames[priv->medium]); len += sprintf(buf + len, "Device: %s\n", dev->name); len += sprintf(buf + len, "MAC address:"); for (i = 0; i < 6; i++) @@ -847,44 +774,31 @@ /* open driver. Means also initialization and start of LANCE */ -static int ibmlana_open(struct IBMLANA_NETDEV *dev) +static int ibmlana_open(struct net_device *dev) { int result; ibmlana_priv *priv = (ibmlana_priv *) dev->priv; /* register resources - only necessary for IRQ */ - result = - request_irq(priv->realirq, irq_handler, - SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); + result = request_irq(priv->realirq, irq_handler, SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); if (result != 0) { - printk("%s: failed to register irq %d\n", dev->name, - dev->irq); + printk(KERN_ERR "%s: failed to register irq %d\n", dev->name, dev->irq); return result; } dev->irq = priv->realirq; /* set up the card and SONIC */ - InitBoard(dev); /* initialize operational flags */ - -#if (LINUX_VERSION_CODE >= 0x02032a) netif_start_queue(dev); -#else - dev->interrupt = 0; - dev->tbusy = 0; - dev->start = 1; - MOD_INC_USE_COUNT; -#endif - return 0; } /* close driver. Shut down board and free allocated resources */ -static int ibmlana_close(struct IBMLANA_NETDEV *dev) +static int ibmlana_close(struct net_device *dev) { /* turn off board */ @@ -892,17 +806,12 @@ if (dev->irq != 0) free_irq(dev->irq, dev); dev->irq = 0; - -#if (LINUX_VERSION_CODE < 0x02032a) - MOD_DEC_USE_COUNT; -#endif - return 0; } /* transmit a block. */ -static int ibmlana_tx(struct sk_buff *skb, struct IBMLANA_NETDEV *dev) +static int ibmlana_tx(struct sk_buff *skb, struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; int retval = 0, tmplen, addr; @@ -910,16 +819,6 @@ tda_t tda; int baddr; - /* if we get called with a NULL descriptor, the Ethernet layer thinks - our card is stuck an we should reset it. We'll do this completely: */ - - if (skb == NULL) { - printk("%s: Resetting SONIC\n", dev->name); - StopSONIC(dev); - InitBoard(dev); - return 0; /* don't try to free the block here ;-) */ - } - /* find out if there are free slots for a frame to transmit. If not, the upper layer is in deep desperation and we simply ignore the frame. */ @@ -930,12 +829,11 @@ } /* copy the frame data into the next free transmit buffer - fillup missing */ - tmplen = skb->len; if (tmplen < 60) tmplen = 60; baddr = priv->txbufstart + (priv->nexttxdescr * PKTSIZE); - IBMLANA_TOIO(dev->mem_start + baddr, skb->data, skb->len); + isa_memcpy_to_io(dev->mem_start + baddr, skb->data, skb->len); /* copy filler into RAM - in case we're filling up... we're filling a bit more than necessary, but that doesn't harm @@ -947,81 +845,60 @@ unsigned int destoffs = skb->len, l = strlen(fill); while (destoffs < tmplen) { - IBMLANA_TOIO(dev->mem_start + baddr + destoffs, - fill, l); + isa_memcpy_to_io(dev->mem_start + baddr + destoffs, fill, l); destoffs += l; } } /* set up the new frame descriptor */ - addr = priv->tdastart + (priv->nexttxdescr * sizeof(tda_t)); - IBMLANA_FROMIO(&tda, dev->mem_start + addr, sizeof(tda_t)); + isa_memcpy_fromio(&tda, dev->mem_start + addr, sizeof(tda_t)); tda.length = tda.fraglength = tmplen; - IBMLANA_TOIO(dev->mem_start + addr, &tda, sizeof(tda_t)); + isa_memcpy_to_io(dev->mem_start + addr, &tda, sizeof(tda_t)); /* if there were no active descriptors, trigger the SONIC */ - - save_flags(flags); - cli(); + spin_lock_irqsave(&priv->lock, flags); priv->txusedcnt++; priv->txused[priv->nexttxdescr] = 1; /* are all transmission slots used up ? */ - if (priv->txusedcnt >= TXBUFCNT) -#if (LINUX_VERSION_CODE >= 0x02032a) netif_stop_queue(dev); -#else - dev->tbusy = 1; -#endif if (priv->txusedcnt == 1) StartTx(dev, priv->nexttxdescr); priv->nexttxdescr = (priv->nexttxdescr + 1) % TXBUFCNT; - restore_flags(flags); - - tx_done: - - /* When did that change exactly ? */ - -#if (LINUX_VERSION_CODE >= 0x20200) + spin_unlock_irqrestore(&priv->lock, flags); +tx_done: dev_kfree_skb(skb); -#else - dev_kfree_skb(skb, FREE_WRITE); -#endif return retval; } /* return pointer to Ethernet statistics */ -static struct net_device_stats *ibmlana_stats(struct IBMLANA_NETDEV *dev) +static struct net_device_stats *ibmlana_stats(struct net_device *dev) { ibmlana_priv *priv = (ibmlana_priv *) dev->priv; - - return &(priv->stat); + return &priv->stat; } /* we don't support runtime reconfiguration, since am MCA card can be unambigously identified by its POS registers. */ -static int ibmlana_config(struct IBMLANA_NETDEV *dev, struct ifmap *map) +static int ibmlana_config(struct net_device *dev, struct ifmap *map) { return 0; } /* switch receiver mode. */ -static void ibmlana_set_multicast_list(struct IBMLANA_NETDEV *dev) +static void ibmlana_set_multicast_list(struct net_device *dev) { /* first stop the SONIC... */ - StopSONIC(dev); - /* ...then reinit it with the new flags */ - InitBoard(dev); } @@ -1031,7 +908,7 @@ static int startslot; /* counts through slots when probing multiple devices */ -int ibmlana_probe(struct IBMLANA_NETDEV *dev) +int ibmlana_probe(struct net_device *dev) { int force_detect = 0; int slot, z; @@ -1039,22 +916,17 @@ ibmlana_priv *priv; ibmlana_medium medium; -#if (LINUX_VERSION_CODE >= 0x02032a) SET_MODULE_OWNER(dev); -#endif /* can't work without an MCA bus ;-) */ - if (MCA_bus == 0) return -ENODEV; /* start address of 1 --> forced detection */ - if (dev->mem_start == 1) force_detect = 1; /* search through slots */ - if (dev != NULL) { base = dev->mem_start; irq = dev->irq; @@ -1063,70 +935,51 @@ while (slot != -1) { /* deduce card addresses */ - getaddrs(slot, &base, &memlen, &iobase, &irq, &medium); -#if (LINUX_VERSION_CODE >= 0x20300) /* slot already in use ? */ - if (mca_is_adapter_used(slot)) { slot = mca_find_adapter(IBM_LANA_ID, slot + 1); continue; } -#endif - /* were we looking for something different ? */ - - if ((dev->irq != 0) || (dev->mem_start != 0)) { - if ((dev->irq != 0) && (dev->irq != irq)) { - slot = - mca_find_adapter(IBM_LANA_ID, - slot + 1); + if (dev->irq != 0 || dev->mem_start != 0) { + if (dev->irq != 0 && dev->irq != irq) { + slot = mca_find_adapter(IBM_LANA_ID, slot + 1); continue; } - if ((dev->mem_start != 0) - && (dev->mem_start != base)) { - slot = - mca_find_adapter(IBM_LANA_ID, - slot + 1); + if (dev->mem_start != 0 && dev->mem_start != base) + { + slot = mca_find_adapter(IBM_LANA_ID, slot + 1); continue; } } - /* found something that matches */ - break; } /* nothing found ? */ - if (slot == -1) - return ((base != 0) || (irq != 0)) ? -ENXIO : -ENODEV; + return (base != 0 || irq != 0) ? -ENXIO : -ENODEV; /* announce success */ - printk("%s: IBM LAN Adapter/A found in slot %d\n", dev->name, - slot + 1); + printk(KERN_INFO "%s: IBM LAN Adapter/A found in slot %d\n", dev->name, slot + 1); /* try to obtain I/O range */ if (!request_region(iobase, IBM_LANA_IORANGE, dev->name)) { - printk("%s: cannot allocate I/O range at %#x!\n", dev->name, iobase); + printk(KERN_ERR "%s: cannot allocate I/O range at %#x!\n", dev->name, iobase); startslot = slot + 1; return -EBUSY; } /* make procfs entries */ - mca_set_adapter_name(slot, "IBM LAN Adapter/A"); mca_set_adapter_procfn(slot, (MCA_ProcFn) ibmlana_getinfo, dev); -#if (LINUX_VERSION_CODE >= 0x20200) mca_mark_as_used(slot); -#endif /* allocate structure */ - - priv = dev->priv = - (ibmlana_priv *) kmalloc(sizeof(ibmlana_priv), GFP_KERNEL); + priv = dev->priv = (ibmlana_priv *) kmalloc(sizeof(ibmlana_priv), GFP_KERNEL); if (!priv) { release_region(iobase, IBM_LANA_IORANGE); return -ENOMEM; @@ -1134,7 +987,8 @@ priv->slot = slot; priv->realirq = irq; priv->medium = medium; - memset(&(priv->stat), 0, sizeof(struct net_device_stats)); + spin_lock_init(&priv->lock); + memset(&priv->stat, 0, sizeof(struct net_device_stats)); /* set base + irq for this device (irq not allocated so far) */ @@ -1165,13 +1019,13 @@ /* print config */ - printk("%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, " + printk(KERN_INFO "%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, " "MAC address %02x:%02x:%02x:%02x:%02x:%02x.\n", dev->name, priv->realirq, dev->base_addr, dev->mem_start, dev->mem_end - 1, dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); - printk("%s: %s medium\n", dev->name, MediaNames[priv->medium]); + printk(KERN_INFO "%s: %s medium\n", dev->name, MediaNames[priv->medium]); /* reset board */ @@ -1192,9 +1046,10 @@ #define DEVMAX 5 -static struct IBMLANA_NETDEV moddevs[DEVMAX]; +static struct net_device moddevs[DEVMAX]; static int irq; static int io; + MODULE_PARM(irq, "i"); MODULE_PARM(io, "i"); MODULE_PARM_DESC(irq, "IBM LAN/A IRQ number"); @@ -1214,21 +1069,15 @@ if (res != 0) return (z > 0) ? 0 : -EIO; } - return 0; } void cleanup_module(void) { - struct IBMLANA_NETDEV *dev; + struct net_device *dev; ibmlana_priv *priv; int z; - if (MOD_IN_USE) { - printk("cannot unload, module in use\n"); - return; - } - for (z = 0; z < DEVMAX; z++) { dev = moddevs + z; if (dev->priv != NULL) { @@ -1239,9 +1088,7 @@ dev->irq = 0; release_region(dev->base_addr, IBM_LANA_IORANGE); unregister_netdev(dev); -#if (LINUX_VERSION_CODE >= 0x20200) mca_mark_as_unused(priv->slot); -#endif mca_set_adapter_name(priv->slot, ""); mca_set_adapter_procfn(priv->slot, NULL, NULL); kfree(dev->priv); diff -Nru a/drivers/net/ibmlana.h b/drivers/net/ibmlana.h --- a/drivers/net/ibmlana.h Mon Oct 28 16:32:37 2002 +++ b/drivers/net/ibmlana.h Mon Oct 28 16:32:37 2002 @@ -3,22 +3,6 @@ #ifdef _IBM_LANA_DRIVER_ -/* version-dependent functions/structures */ - -#if LINUX_VERSION_CODE >= 0x020318 -#define IBMLANA_READB(addr) isa_readb(addr) -#define IBMLANA_TOIO(dest, src, len) isa_memcpy_toio(dest, src, len) -#define IBMLANA_FROMIO(dest, src, len) isa_memcpy_fromio(dest, src, len) -#define IBMLANA_SETIO(dest, val, len) isa_memset_io(dest, val, len) -#define IBMLANA_NETDEV net_device -#else -#define IBMLANA_READB(addr) readb(addr) -#define IBMLANA_TOIO(dest, src, len) memcpy_toio(dest, src, len) -#define IBMLANA_FROMIO(dest, src, len) memcpy_fromio(dest, src, len) -#define IBMLANA_SETIO(dest, val, len) memset_io(dest, val, len) -#define IBMLANA_NETDEV device -#endif - /* maximum packet size */ #define PKTSIZE 1524 @@ -33,25 +17,27 @@ /* media enumeration - defined in a way that it fits onto the LAN/A's POS registers... */ -typedef enum { Media_10BaseT, Media_10Base5, +typedef enum { + Media_10BaseT, Media_10Base5, Media_Unknown, Media_10Base2, Media_Count } ibmlana_medium; /* private structure */ typedef struct { - unsigned int slot; /* MCA-Slot-# */ + unsigned int slot; /* MCA-Slot-# */ struct net_device_stats stat; /* packet statistics */ - int realirq; /* memorizes actual IRQ, even when - currently not allocated */ - ibmlana_medium medium; /* physical cannector */ - u32 tdastart, txbufstart, /* addresses */ - rrastart, rxbufstart, rdastart, rxbufcnt, txusedcnt; - int nextrxdescr, /* next rx descriptor to be used */ - lastrxdescr, /* last free rx descriptor */ - nexttxdescr, /* last tx descriptor to be used */ - currtxdescr, /* tx descriptor currently tx'ed */ - txused[TXBUFCNT]; /* busy flags */ + int realirq; /* memorizes actual IRQ, even when + currently not allocated */ + ibmlana_medium medium; /* physical cannector */ + u32 tdastart, txbufstart, /* addresses */ + rrastart, rxbufstart, rdastart, rxbufcnt, txusedcnt; + int nextrxdescr, /* next rx descriptor to be used */ + lastrxdescr, /* last free rx descriptor */ + nexttxdescr, /* last tx descriptor to be used */ + currtxdescr, /* tx descriptor currently tx'ed */ + txused[TXBUFCNT]; /* busy flags */ + spinlock_t lock; } ibmlana_priv; /* this card uses quite a lot of I/O ports...luckily the MCA bus decodes @@ -289,7 +275,7 @@ #endif /* _IBM_LANA_DRIVER_ */ -extern int ibmlana_probe(struct IBMLANA_NETDEV *); +extern int ibmlana_probe(struct net_device *); #endif /* _IBM_LANA_INCLUDE_ */ diff -Nru a/drivers/net/lasi_82596.c b/drivers/net/lasi_82596.c --- a/drivers/net/lasi_82596.c Mon Oct 28 16:32:35 2002 +++ b/drivers/net/lasi_82596.c Mon Oct 28 16:32:35 2002 @@ -1412,8 +1412,7 @@ DEB(DEB_INIT,printk("%s: Shutting down ethercard, status was %4.4x.\n", dev->name, lp->scb.status)); - save_flags(flags); - cli(); + spin_lock_irqsave(&lp->lock, flags); wait_cmd(dev,lp,100,"close1 timed out"); lp->scb.command = CUC_ABORT | RX_ABORT; @@ -1422,7 +1421,7 @@ CA(dev); wait_cmd(dev,lp,100,"close2 timed out"); - restore_flags(flags); + spin_unlock_irqrestore(&lp->lock, flags); DEB(DEB_STRUCT,i596_display_data(dev)); i596_cleanup_cmd(dev,lp); diff -Nru a/drivers/net/mii.c b/drivers/net/mii.c --- a/drivers/net/mii.c Mon Oct 28 16:32:36 2002 +++ b/drivers/net/mii.c Mon Oct 28 16:32:36 2002 @@ -299,9 +299,9 @@ case MII_BMCR: { unsigned int new_duplex = 0; if (val & (BMCR_RESET|BMCR_ANENABLE)) - mii_if->force_media = 1; - else mii_if->force_media = 0; + else + mii_if->force_media = 1; if (mii_if->force_media && (val & BMCR_FULLDPLX)) new_duplex = 1; diff -Nru a/drivers/net/pcmcia/3c589_cs.c b/drivers/net/pcmcia/3c589_cs.c --- a/drivers/net/pcmcia/3c589_cs.c Mon Oct 28 16:32:38 2002 +++ b/drivers/net/pcmcia/3c589_cs.c Mon Oct 28 16:32:38 2002 @@ -14,11 +14,13 @@ distributed according to the terms of the GNU General Public License, incorporated herein by reference. Donald Becker may be reached at becker@scyld.com + + Updated for 2.5.x by Alan Cox ======================================================================*/ #define DRV_NAME "3c589_cs" -#define DRV_VERSION "1.162" +#define DRV_VERSION "1.162-ac" #include #include @@ -111,9 +113,10 @@ struct net_device_stats stats; /* For transceiver monitoring */ struct timer_list media; - u_short media_status; - u_short fast_poll; - u_long last_irq; + u16 media_status; + u16 fast_poll; + unsigned long last_irq; + spinlock_t lock; }; static char *if_names[] = { "auto", "10baseT", "10base2", "AUI" }; @@ -148,13 +151,13 @@ /*====================================================================*/ static void tc589_config(dev_link_t *link); -static void tc589_release(u_long arg); +static void tc589_release(unsigned long arg); static int tc589_event(event_t event, int priority, event_callback_args_t *args); -static u_short read_eeprom(ioaddr_t ioaddr, int index); +static u16 read_eeprom(ioaddr_t ioaddr, int index); static void tc589_reset(struct net_device *dev); -static void media_check(u_long arg); +static void media_check(unsigned long arg); static int el3_config(struct net_device *dev, struct ifmap *map); static int el3_open(struct net_device *dev); static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev); @@ -223,11 +226,13 @@ lp = kmalloc(sizeof(*lp), GFP_KERNEL); if (!lp) return NULL; memset(lp, 0, sizeof(*lp)); + spin_lock_init(&lp->lock); + link = &lp->link; dev = &lp->dev; link->priv = dev->priv = link->irq.Instance = lp; link->release.function = &tc589_release; - link->release.data = (u_long)link; + link->release.data = (unsigned long)link; link->io.NumPorts1 = 16; link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; @@ -302,9 +307,9 @@ if (*linkp == NULL) return; - del_timer(&link->release); + del_timer_sync(&link->release); if (link->state & DEV_CONFIG) { - tc589_release((u_long)link); + tc589_release((unsigned long)link); if (link->state & DEV_STALE_CONFIG) { link->state |= DEV_STALE_LINK; return; @@ -340,14 +345,14 @@ struct net_device *dev = &lp->dev; tuple_t tuple; cisparse_t parse; - u_short buf[32], *phys_addr; + u16 buf[32], *phys_addr; int last_fn, last_ret, i, j, multi = 0; ioaddr_t ioaddr; char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; DEBUG(0, "3c589_config(0x%p)\n", link); - phys_addr = (u_short *)dev->dev_addr; + phys_addr = (u16 *)dev->dev_addr; tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_CONFIG; CS_CHECK(GetFirstTuple, handle, &tuple); @@ -391,7 +396,7 @@ dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; if (register_netdev(dev) != 0) { - printk(KERN_NOTICE "3c589_cs: register_netdev() failed\n"); + printk(KERN_ERR "3c589_cs: register_netdev() failed\n"); goto failed; } @@ -409,7 +414,7 @@ for (i = 0; i < 3; i++) phys_addr[i] = htons(read_eeprom(ioaddr, i)); if (phys_addr[0] == 0x6060) { - printk(KERN_NOTICE "3c589_cs: IO port conflict at 0x%03lx" + printk(KERN_ERR "3c589_cs: IO port conflict at 0x%03lx" "-0x%03lx\n", dev->base_addr, dev->base_addr+15); goto failed; } @@ -427,7 +432,7 @@ if ((if_port >= 0) && (if_port <= 3)) dev->if_port = if_port; else - printk(KERN_NOTICE "3c589_cs: invalid if_port requested\n"); + printk(KERN_ERR "3c589_cs: invalid if_port requested\n"); printk(KERN_INFO "%s: 3Com 3c%s, io %#3lx, irq %d, hw_addr ", dev->name, (multi ? "562" : "589"), dev->base_addr, @@ -443,7 +448,7 @@ cs_failed: cs_error(link->handle, last_fn, last_ret); failed: - tc589_release((u_long)link); + tc589_release((unsigned long)link); return; } /* tc589_config */ @@ -456,7 +461,7 @@ ======================================================================*/ -static void tc589_release(u_long arg) +static void tc589_release(unsigned long arg) { dev_link_t *link = (dev_link_t *)arg; @@ -545,7 +550,7 @@ while (--i > 0) if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break; if (i == 0) - printk(KERN_NOTICE "%s: command 0x%04x did not complete!\n", + printk(KERN_WARNING "%s: command 0x%04x did not complete!\n", dev->name, cmd); } @@ -553,7 +558,7 @@ Read a word from the EEPROM using the regular EEPROM access register. Assume that we are in register window zero. */ -static u_short read_eeprom(ioaddr_t ioaddr, int index) +static u16 read_eeprom(ioaddr_t ioaddr, int index) { int i; outw(EEPROM_READ + index, ioaddr + 10); @@ -741,7 +746,7 @@ tc589_reset(dev); lp->media.function = &media_check; - lp->media.data = (u_long)lp; + lp->media.data = (unsigned long)lp; lp->media.expires = jiffies + HZ; add_timer(&lp->media); @@ -756,7 +761,7 @@ struct el3_private *lp = (struct el3_private *)dev->priv; ioaddr_t ioaddr = dev->base_addr; - printk(KERN_NOTICE "%s: Transmit timed out!\n", dev->name); + printk(KERN_WARNING "%s: Transmit timed out!\n", dev->name); dump_status(dev); lp->stats.tx_errors++; dev->trans_start = jiffies; @@ -832,7 +837,8 @@ DEBUG(3, "%s: interrupt, status %4.4x.\n", dev->name, inw(ioaddr + EL3_STATUS)); - + + spin_lock(&lp->lock); while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete | StatsFull)) { if (!netif_device_present(dev) || @@ -867,7 +873,7 @@ EL3WINDOW(4); fifo_diag = inw(ioaddr + 4); EL3WINDOW(1); - printk(KERN_NOTICE "%s: adapter failure, FIFO diagnostic" + printk(KERN_WARNING "%s: adapter failure, FIFO diagnostic" " register %04x.\n", dev->name, fifo_diag); if (fifo_diag & 0x0400) { /* Tx overrun */ @@ -885,7 +891,7 @@ } if (++i > 10) { - printk(KERN_NOTICE "%s: infinite loop in interrupt, " + printk(KERN_ERR "%s: infinite loop in interrupt, " "status %4.4x.\n", dev->name, status); /* Clear all interrupts */ outw(AckIntr | 0xFF, ioaddr + EL3_CMD); @@ -896,18 +902,19 @@ } lp->last_irq = jiffies; + spin_unlock(&lp->lock); DEBUG(3, "%s: exiting interrupt, status %4.4x.\n", dev->name, inw(ioaddr + EL3_STATUS)); return; } -static void media_check(u_long arg) +static void media_check(unsigned long arg) { struct el3_private *lp = (struct el3_private *)(arg); struct net_device *dev = &lp->dev; ioaddr_t ioaddr = dev->base_addr; - u_short media, errs; - u_long flags; + u16 media, errs; + unsigned long flags; if (!netif_device_present(dev)) goto reschedule; @@ -917,7 +924,7 @@ if ((inw(ioaddr + EL3_STATUS) & IntLatch) && (inb(ioaddr + EL3_TIMER) == 0xff)) { if (!lp->fast_poll) - printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name); + printk(KERN_WARNING "%s: interrupt(s) dropped!\n", dev->name); el3_interrupt(dev->irq, lp, NULL); lp->fast_poll = HZ; } @@ -927,9 +934,10 @@ add_timer(&lp->media); return; } - - save_flags(flags); - cli(); + + /* lp->lock guards the EL3 window. Window should always be 1 except + when the lock is held */ + spin_lock_irqsave(&lp->lock, flags); EL3WINDOW(4); media = inw(ioaddr+WN4_MEDIA) & 0xc810; @@ -974,7 +982,7 @@ } EL3WINDOW(1); - restore_flags(flags); + spin_unlock_irqrestore(&lp->lock, flags); reschedule: lp->media.expires = jiffies + HZ; @@ -988,10 +996,9 @@ dev_link_t *link = &lp->link; if (DEV_OK(link)) { - save_flags(flags); - cli(); + spin_lock_irqsave(&lp->lock, flags); update_stats(dev); - restore_flags(flags); + spin_unlock_irqrestore(&lp->lock, flags); } return &lp->stats; } @@ -1001,6 +1008,8 @@ single-threaded if the device is active. This is expected to be a rare operation, and it's simpler for the rest of the driver to assume that window 1 is always valid rather than use a special window-state variable. + + Caller must hold the lock for this */ static void update_stats(struct net_device *dev) { @@ -1079,7 +1088,7 @@ tc589_wait_for_completion(dev, RxDiscard); } if (worklimit == 0) - printk(KERN_NOTICE "%s: too much work in el3_rx!\n", dev->name); + printk(KERN_WARNING "%s: too much work in el3_rx!\n", dev->name); return 0; } @@ -1088,7 +1097,7 @@ struct el3_private *lp = dev->priv; dev_link_t *link = &lp->link; ioaddr_t ioaddr = dev->base_addr; - u_short opts = SetRxFilter | RxStation | RxBroadcast; + u16 opts = SetRxFilter | RxStation | RxBroadcast; if (!(DEV_OK(link))) return; if (dev->flags & IFF_PROMISC) @@ -1135,7 +1144,7 @@ link->open--; netif_stop_queue(dev); - del_timer(&lp->media); + del_timer_sync(&lp->media); if (link->state & DEV_STALE_CONFIG) mod_timer(&link->release, jiffies + HZ/20); @@ -1152,8 +1161,7 @@ DEBUG(0, "%s\n", version); CardServices(GetCardServicesInfo, &serv); if (serv.Revision != CS_RELEASE_CODE) { - printk(KERN_NOTICE "3c589_cs: Card Services release " - "does not match!\n"); + printk(KERN_ERR "3c589_cs: Card Services release does not match!\n"); return -1; } register_pccard_driver(&dev_info, &tc589_attach, &tc589_detach); diff -Nru a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c --- a/drivers/net/pcnet32.c Mon Oct 28 16:32:36 2002 +++ b/drivers/net/pcnet32.c Mon Oct 28 16:32:36 2002 @@ -22,8 +22,8 @@ *************************************************************************/ #define DRV_NAME "pcnet32" -#define DRV_VERSION "1.27a" -#define DRV_RELDATE "10.02.2002" +#define DRV_VERSION "1.27b" +#define DRV_RELDATE "01.10.2002" #define PFX DRV_NAME ": " static const char *version = @@ -96,6 +96,8 @@ #define PCNET32_DMA_MASK 0xffffffff +#define PCNET32_WATCHDOG_TIMEOUT (jiffies + (2 * HZ)) + /* * table to translate option values from tulip * to internal options @@ -211,6 +213,8 @@ * fix pci probe not increment cards_found * FD auto negotiate error workaround for xSeries250 * clean up and using new mii module + * v1.27b Sep 30 2002 Kent Yoder + * Added timer for cable connection state changes. */ @@ -318,6 +322,7 @@ mii:1; /* mii port available */ struct net_device *next; struct mii_if_info mii_if; + struct timer_list watchdog_timer; }; static void pcnet32_probe_vlbus(void); @@ -333,6 +338,7 @@ static struct net_device_stats *pcnet32_get_stats(struct net_device *); static void pcnet32_set_multicast_list(struct net_device *); static int pcnet32_ioctl(struct net_device *, struct ifreq *, int); +static void pcnet32_watchdog(struct net_device *); static int mdio_read(struct net_device *dev, int phy_id, int reg_num); static void mdio_write(struct net_device *dev, int phy_id, int reg_num, int val); @@ -777,6 +783,13 @@ } } + /* Set the mii phy_id so that we can query the link state */ + if (lp->mii) + lp->mii_if.phy_id = ((lp->a.read_bcr (ioaddr, 33)) >> 5) & 0x1f; + + init_timer (&lp->watchdog_timer); + lp->watchdog_timer.data = (unsigned long) dev; + lp->watchdog_timer.function = (void *) &pcnet32_watchdog; /* The PCNET32-specific entries in the device structure. */ dev->open = &pcnet32_open; @@ -901,6 +914,12 @@ netif_start_queue(dev); + /* If we have mii, print the link status and start the watchdog */ + if (lp->mii) { + mii_check_media (&lp->mii_if, 1, 1); + mod_timer (&(lp->watchdog_timer), PCNET32_WATCHDOG_TIMEOUT); + } + i = 0; while (i++ < 100) if (lp->a.read_csr (ioaddr, 0) & 0x0100) @@ -1371,6 +1390,8 @@ struct pcnet32_private *lp = dev->priv; int i; + del_timer_sync(&lp->watchdog_timer); + netif_stop_queue(dev); lp->stats.rx_missed_errors = lp->a.read_csr (ioaddr, 112); @@ -1649,6 +1670,17 @@ } } return -EOPNOTSUPP; +} + +static void pcnet32_watchdog(struct net_device *dev) +{ + struct pcnet32_private *lp = dev->priv; + + /* Print the link status if it has changed */ + if (lp->mii) + mii_check_media (&lp->mii_if, 1, 0); + + mod_timer (&(lp->watchdog_timer), PCNET32_WATCHDOG_TIMEOUT); } static struct pci_driver pcnet32_driver = { diff -Nru a/drivers/net/smc9194.c b/drivers/net/smc9194.c --- a/drivers/net/smc9194.c Mon Oct 28 16:32:37 2002 +++ b/drivers/net/smc9194.c Mon Oct 28 16:32:37 2002 @@ -713,11 +713,6 @@ unsigned long cookie; - /* I have to do a STI() here, because this is called from - a routine that does an CLI during this process, making it - rather difficult to get interrupts for auto detection */ - sti(); - cookie = probe_irq_on(); /* @@ -765,10 +760,6 @@ /* and disable all interrupts again */ outb( 0, ioaddr + INT_MASK ); - - /* clear hardware interrupts again, because that's how it - was when I was called... */ - cli(); /* and return what I found */ return probe_irq_off(cookie); diff -Nru a/drivers/net/tokenring/3c359.c b/drivers/net/tokenring/3c359.c --- a/drivers/net/tokenring/3c359.c Mon Oct 28 16:32:38 2002 +++ b/drivers/net/tokenring/3c359.c Mon Oct 28 16:32:38 2002 @@ -1780,7 +1780,7 @@ static void __devexit xl_remove_one (struct pci_dev *pdev) { - struct net_device *dev = pdev->driver_data; + struct net_device *dev = pci_get_drvdata(pdev); struct xl_private *xl_priv=(struct xl_private *)dev->priv; unregister_trdev(dev); diff -Nru a/drivers/net/tokenring/lanstreamer.c b/drivers/net/tokenring/lanstreamer.c --- a/drivers/net/tokenring/lanstreamer.c Mon Oct 28 16:32:36 2002 +++ b/drivers/net/tokenring/lanstreamer.c Mon Oct 28 16:32:36 2002 @@ -65,6 +65,7 @@ * 11/05/01 - Restructured the interrupt function, added delays, reduced the * the number of TX descriptors to 1, which together can prevent * the card from locking up the box - + * 09/27/02 - New PCI interface + bug fix. - * * To Do: * @@ -136,7 +137,7 @@ */ static char version[] = "LanStreamer.c v0.4.0 03/08/01 - Mike Sullivan\n" - " v0.5.1 03/04/02 - Kent Yoder"; + " v0.5.2 09/30/02 - Kent Yoder"; static struct pci_device_id streamer_pci_tbl[] __initdata = { { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_TR, PCI_ANY_ID, PCI_ANY_ID,}, @@ -250,6 +251,12 @@ dev_streamer=streamer_priv; #endif #endif + + if(pci_set_dma_mask(pdev, 0xFFFFFFFF)) { + printk(KERN_ERR "%s: No suitable PCI mapping available.\n", dev->name); + rc = -ENODEV; + goto err_out; + } if (pci_enable_device(pdev)) { printk(KERN_ERR "lanstreamer: unable to enable pci device\n"); @@ -481,9 +488,11 @@ data=((u8 *)skb->data)+sizeof(struct streamer_rx_desc); rx_ring->forward=0; rx_ring->status=0; - rx_ring->buffer=virt_to_bus(data); + rx_ring->buffer=cpu_to_le32(pci_map_single(streamer_priv->pci_dev, data, + 512, PCI_DMA_FROMDEVICE)); rx_ring->framelen_buflen=512; - writel(virt_to_bus(rx_ring),streamer_mmio+RXBDA); + writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, rx_ring, 512, PCI_DMA_FROMDEVICE)), + streamer_mmio+RXBDA); } #if STREAMER_DEBUG @@ -499,6 +508,8 @@ printk(KERN_ERR "IBM PCI tokenring card not responding\n"); release_region(dev->base_addr, STREAMER_IO_SPACE); + if (skb) + dev_kfree_skb(skb); return -1; } } @@ -773,14 +784,19 @@ skb->dev = dev; - streamer_priv->streamer_rx_ring[i].forward = virt_to_bus(&streamer_priv->streamer_rx_ring[i + 1]); + streamer_priv->streamer_rx_ring[i].forward = + cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_rx_ring[i + 1], + sizeof(struct streamer_rx_desc), PCI_DMA_FROMDEVICE)); streamer_priv->streamer_rx_ring[i].status = 0; - streamer_priv->streamer_rx_ring[i].buffer = virt_to_bus(skb->data); + streamer_priv->streamer_rx_ring[i].buffer = + cpu_to_le32(pci_map_single(streamer_priv->pci_dev, skb->data, + streamer_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE)); streamer_priv->streamer_rx_ring[i].framelen_buflen = streamer_priv->pkt_buf_sz; streamer_priv->rx_ring_skb[i] = skb; } streamer_priv->streamer_rx_ring[STREAMER_RX_RING_SIZE - 1].forward = - virt_to_bus(&streamer_priv->streamer_rx_ring[0]); + cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_rx_ring[0], + sizeof(struct streamer_rx_desc), PCI_DMA_FROMDEVICE)); if (i == 0) { printk(KERN_WARNING "%s: Not enough memory to allocate rx buffers. Adapter disabled\n", dev->name); @@ -790,8 +806,12 @@ streamer_priv->rx_ring_last_received = STREAMER_RX_RING_SIZE - 1; /* last processed rx status */ - writel(virt_to_bus(&streamer_priv->streamer_rx_ring[0]), streamer_mmio + RXBDA); - writel(virt_to_bus(&streamer_priv->streamer_rx_ring[STREAMER_RX_RING_SIZE - 1]), streamer_mmio + RXLBDA); + writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_rx_ring[0], + sizeof(struct streamer_rx_desc), PCI_DMA_TODEVICE)), + streamer_mmio + RXBDA); + writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_rx_ring[STREAMER_RX_RING_SIZE - 1], + sizeof(struct streamer_rx_desc), PCI_DMA_TODEVICE)), + streamer_mmio + RXLBDA); /* set bus master interrupt event mask */ writew(MISR_RX_NOBUF | MISR_RX_EOF, streamer_mmio + MISR_MASK); @@ -807,7 +827,10 @@ writew(~BMCTL_TX2_DIS, streamer_mmio + BMCTL_RUM); /* Enables TX channel 2 */ for (i = 0; i < STREAMER_TX_RING_SIZE; i++) { - streamer_priv->streamer_tx_ring[i].forward = virt_to_bus(&streamer_priv->streamer_tx_ring[i + 1]); + streamer_priv->streamer_tx_ring[i].forward = cpu_to_le32(pci_map_single(streamer_priv->pci_dev, + &streamer_priv->streamer_tx_ring[i + 1], + sizeof(struct streamer_tx_desc), + PCI_DMA_TODEVICE)); streamer_priv->streamer_tx_ring[i].status = 0; streamer_priv->streamer_tx_ring[i].bufcnt_framelen = 0; streamer_priv->streamer_tx_ring[i].buffer = 0; @@ -817,7 +840,8 @@ streamer_priv->streamer_tx_ring[i].rsvd3 = 0; } streamer_priv->streamer_tx_ring[STREAMER_TX_RING_SIZE - 1].forward = - virt_to_bus(&streamer_priv->streamer_tx_ring[0]); + cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_tx_ring[0], + sizeof(struct streamer_tx_desc), PCI_DMA_TODEVICE)); streamer_priv->free_tx_ring_entries = STREAMER_TX_RING_SIZE; streamer_priv->tx_ring_free = 0; /* next entry in tx ring to use */ @@ -915,6 +939,11 @@ skb->dev = dev; if (buffer_cnt == 1) { + /* release the DMA mapping */ + pci_unmap_single(streamer_priv->pci_dev, + le32_to_cpu(streamer_priv->streamer_rx_ring[rx_ring_last_received].buffer), + streamer_priv->pkt_buf_sz, + PCI_DMA_FROMDEVICE); skb2 = streamer_priv->rx_ring_skb[rx_ring_last_received]; #if STREAMER_DEBUG_PACKETS { @@ -934,20 +963,29 @@ /* recycle this descriptor */ streamer_priv->streamer_rx_ring[rx_ring_last_received].status = 0; streamer_priv->streamer_rx_ring[rx_ring_last_received].framelen_buflen = streamer_priv->pkt_buf_sz; - streamer_priv->streamer_rx_ring[rx_ring_last_received].buffer = virt_to_bus(skb->data); - streamer_priv-> rx_ring_skb[rx_ring_last_received] = skb; + streamer_priv->streamer_rx_ring[rx_ring_last_received].buffer = + cpu_to_le32(pci_map_single(streamer_priv->pci_dev, skb->data, streamer_priv->pkt_buf_sz, + PCI_DMA_FROMDEVICE)); + streamer_priv->rx_ring_skb[rx_ring_last_received] = skb; /* place recycled descriptor back on the adapter */ - writel(virt_to_bus(&streamer_priv->streamer_rx_ring[rx_ring_last_received]),streamer_mmio + RXLBDA); + writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, + &streamer_priv->streamer_rx_ring[rx_ring_last_received], + sizeof(struct streamer_rx_desc), PCI_DMA_FROMDEVICE)), + streamer_mmio + RXLBDA); /* pass the received skb up to the protocol */ netif_rx(skb2); } else { do { /* Walk the buffers */ - memcpy(skb_put(skb, length),bus_to_virt(rx_desc->buffer), length); /* copy this fragment */ + pci_unmap_single(streamer_priv->pci_dev, le32_to_cpu(rx_desc->buffer), length, PCI_DMA_FROMDEVICE), + memcpy(skb_put(skb, length), (void *)rx_desc->buffer, length); /* copy this fragment */ streamer_priv->streamer_rx_ring[rx_ring_last_received].status = 0; streamer_priv->streamer_rx_ring[rx_ring_last_received].framelen_buflen = streamer_priv->pkt_buf_sz; /* give descriptor back to the adapter */ - writel(virt_to_bus(&streamer_priv->streamer_rx_ring[rx_ring_last_received]), streamer_mmio + RXLBDA); + writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, + &streamer_priv->streamer_rx_ring[rx_ring_last_received], + length, PCI_DMA_FROMDEVICE)), + streamer_mmio + RXLBDA); if (rx_desc->status & 0x80000000) break; /* this descriptor completes the frame */ @@ -1114,7 +1152,8 @@ if (streamer_priv->free_tx_ring_entries) { streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].status = 0; streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].bufcnt_framelen = 0x00020000 | skb->len; - streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].buffer = virt_to_bus(skb->data); + streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].buffer = + cpu_to_le32(pci_map_single(streamer_priv->pci_dev, skb->data, skb->len, PCI_DMA_TODEVICE)); streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].rsvd1 = skb->len; streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].rsvd2 = 0; streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].rsvd3 = 0; @@ -1135,7 +1174,10 @@ } #endif - writel(virt_to_bus (&streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free]),streamer_mmio + TX2LFDA); + writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, + &streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free], + sizeof(struct streamer_tx_desc), PCI_DMA_TODEVICE)), + streamer_mmio + TX2LFDA); (void)readl(streamer_mmio + TX2LFDA); streamer_priv->tx_ring_free = (streamer_priv->tx_ring_free + 1) & (STREAMER_TX_RING_SIZE - 1); diff -Nru a/drivers/net/tokenring/smctr.c b/drivers/net/tokenring/smctr.c --- a/drivers/net/tokenring/smctr.c Mon Oct 28 16:32:37 2002 +++ b/drivers/net/tokenring/smctr.c Mon Oct 28 16:32:37 2002 @@ -24,13 +24,12 @@ * * To do: * 1. Multicast support. + * + * Initial 2.5 cleanup Alan Cox 2002/10/28 */ -#ifdef MODULE #include #include -#endif - #include #include #include @@ -341,7 +340,7 @@ struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 10) - printk("%s: smctr_alloc_shared_memory\n", dev->name); + printk(KERN_DEBUG "%s: smctr_alloc_shared_memory\n", dev->name); /* Allocate initial System Control Block pointer. * This pointer is located in the last page, last offset - 4. @@ -456,10 +455,9 @@ int err; if(smctr_debug > 10) - printk("%s: smctr_bypass_state\n", dev->name); + printk(KERN_DEBUG "%s: smctr_bypass_state\n", dev->name); - err = smctr_setup_single_cmd(dev, ACB_CMD_CHANGE_JOIN_STATE, - JS_BYPASS_STATE); + err = smctr_setup_single_cmd(dev, ACB_CMD_CHANGE_JOIN_STATE, JS_BYPASS_STATE); return (err); } @@ -470,7 +468,7 @@ __u16 i, checksum = 0; if(smctr_debug > 10) - printk("%s: smctr_checksum_firmware\n", dev->name); + printk(KERN_DEBUG "%s: smctr_checksum_firmware\n", dev->name); smctr_enable_adapter_ctrl_store(dev); @@ -656,7 +654,7 @@ int err = 0; if(smctr_debug > 10) - printk("%s: smctr_chg_rx_mask\n", dev->name); + printk(KERN_DEBUG "%s: smctr_chg_rx_mask\n", dev->name); smctr_enable_16bit(dev); smctr_set_page(dev, (__u8 *)tp->ram_access); @@ -787,7 +785,7 @@ __u16 *mem; if(smctr_debug > 10) - printk("%s: smctr_decode_firmware\n", dev->name); + printk(KERN_DEBUG "%s: smctr_decode_firmware\n", dev->name); weight = *(long *)(tp->ptr_ucode + WEIGHT_OFFSET); tsize = *(__u8 *)(tp->ptr_ucode + TREE_SIZE_OFFSET); @@ -852,7 +850,7 @@ int ioaddr = dev->base_addr; if(smctr_debug > 10) - printk("%s: smctr_disable_adapter_ctrl_store\n", dev->name); + printk(KERN_DEBUG "%s: smctr_disable_adapter_ctrl_store\n", dev->name); tp->trc_mask |= CSR_WCSS; outb(tp->trc_mask, ioaddr + CSR); @@ -898,7 +896,7 @@ int ioaddr = dev->base_addr; if(smctr_debug > 10) - printk("%s: smctr_enable_adapter_ctrl_store\n", dev->name); + printk(KERN_DEBUG "%s: smctr_enable_adapter_ctrl_store\n", dev->name); smctr_set_trc_reset(ioaddr); smctr_enable_adapter_ram(dev); @@ -915,7 +913,7 @@ __u8 r; if(smctr_debug > 10) - printk("%s: smctr_enable_adapter_ram\n", dev->name); + printk(KERN_DEBUG "%s: smctr_enable_adapter_ram\n", dev->name); r = inb(ioaddr + MSR); outb(MSR_MEMB | r, ioaddr + MSR); @@ -958,7 +956,7 @@ int i; if(smctr_debug > 10) - printk("%s: smctr_chk_isa %#4x\n", dev->name, ioaddr); + printk(KERN_DEBUG "%s: smctr_chk_isa %#4x\n", dev->name, ioaddr); if((ioaddr & 0x1F) != 0) return (-ENODEV); @@ -979,7 +977,7 @@ b = inb(ioaddr + BDID); if(b != BRD_ID_8115T) { - printk("%s: The adapter found is not supported\n", dev->name); + printk(KERN_ERR "%s: The adapter found is not supported\n", dev->name); return (-1); } @@ -1079,7 +1077,7 @@ break; default: - printk("%s: No IRQ found aborting\n", dev->name); + printk(KERN_ERR "%s: No IRQ found aborting\n", dev->name); return(-1); } @@ -1159,7 +1157,7 @@ /* see if the chip is corrupted if(smctr_read_584_chksum(ioaddr)) { - printk("%s: EEPROM Checksum Failure\n", dev->name); + printk(KERN_ERR "%s: EEPROM Checksum Failure\n", dev->name); return(-1); } */ @@ -1412,7 +1410,7 @@ unsigned short *temp; if(smctr_debug > 20) - printk("smctr_get_tx_fcb\n"); + printk(KERN_DEBUG "smctr_get_tx_fcb\n"); /* check if there is enough FCB blocks */ if(tp->num_tx_fcbs_used[queue] >= tp->num_tx_fcbs[queue]) @@ -1481,7 +1479,7 @@ FCBlock *fcb; if(smctr_debug > 10) - printk("%s: smctr_hardware_send_packet\n", dev->name); + printk(KERN_DEBUG"%s: smctr_hardware_send_packet\n", dev->name); if(tp->status != OPEN) return (-1); @@ -1533,7 +1531,7 @@ ACBlock *acb; if(smctr_debug > 10) - printk("%s: smctr_init_acbs\n", dev->name); + printk(KERN_DEBUG "%s: smctr_init_acbs\n", dev->name); acb = tp->acb_head; acb->cmd_done_status = (ACB_COMMAND_DONE | ACB_COMMAND_SUCCESSFUL); @@ -1576,7 +1574,7 @@ int err; if(smctr_debug > 10) - printk("%s: smctr_init_adapter\n", dev->name); + printk(KERN_DEBUG "%s: smctr_init_adapter\n", dev->name); tp->status = CLOSED; tp->page_offset_mask = (tp->ram_usable * 1024) - 1; @@ -1605,12 +1603,12 @@ if(smctr_checksum_firmware(dev)) { - printk("%s: Previously loaded firmware is missing\n",dev->name); return (-ENOENT); + printk(KERN_ERR "%s: Previously loaded firmware is missing\n",dev->name); return (-ENOENT); } if((err = smctr_ram_memory_test(dev))) { - printk("%s: RAM memory test failed.\n", dev->name); + printk(KERN_ERR "%s: RAM memory test failed.\n", dev->name); return (-EIO); } @@ -1621,7 +1619,7 @@ smctr_reset_adapter(dev); if((err = smctr_init_card_real(dev))) { - printk("%s: Initialization of card failed (%d)\n", + printk(KERN_ERR "%s: Initialization of card failed (%d)\n", dev->name, err); return (-EINVAL); } @@ -1629,7 +1627,7 @@ /* This routine clobbers the TRC's internal registers. */ if((err = smctr_internal_self_test(dev))) { - printk("%s: Card failed internal self test (%d)\n", + printk(KERN_ERR "%s: Card failed internal self test (%d)\n", dev->name, err); return (-EINVAL); } @@ -1638,7 +1636,7 @@ smctr_reset_adapter(dev); if((err = smctr_init_card_real(dev))) { - printk("%s: Initialization of card failed (%d)\n", + printk(KERN_ERR "%s: Initialization of card failed (%d)\n", dev->name, err); return (-EINVAL); } @@ -1657,7 +1655,7 @@ static int __init smctr_init_card(struct net_device *dev) { if(smctr_debug > 10) - printk("%s: smctr_init_card\n", dev->name); + printk(KERN_DEBUG "%s: smctr_init_card\n", dev->name); return (0); } @@ -1668,7 +1666,7 @@ int err = 0; if(smctr_debug > 10) - printk("%s: smctr_init_card_real\n", dev->name); + printk(KERN_DEBUG "%s: smctr_init_card_real\n", dev->name); tp->sh_mem_used = 0; tp->num_acbs = NUM_OF_ACBS; @@ -1731,7 +1729,7 @@ if((err = smctr_issue_init_txrx_cmd(dev))) { - printk("%s: Hardware failure\n", dev->name); + printk(KERN_ERR "%s: Hardware failure\n", dev->name); return (err); } @@ -1746,7 +1744,7 @@ __u16 *buf; if(smctr_debug > 10) - printk("%s: smctr_init_rx_bdbs\n", dev->name); + printk(KERN_DEBUG "%s: smctr_init_rx_bdbs\n", dev->name); for(i = 0; i < NUM_RX_QS_USED; i++) { @@ -1847,7 +1845,7 @@ __u32 *iscpb; if(smctr_debug > 10) - printk("%s: smctr_init_shared_memory\n", dev->name); + printk(KERN_DEBUG "%s: smctr_init_shared_memory\n", dev->name); smctr_set_page(dev, (__u8 *)(unsigned int)tp->iscpb_ptr); @@ -2017,16 +2015,19 @@ if(dev == NULL) { - printk("%s: irq %d for unknown device.\n", dev->name, irq); + printk(KERN_CRIT "%s: irq %d for unknown device.\n", dev->name, irq); return; } ioaddr = dev->base_addr; tp = (struct net_local *)dev->priv; + if(tp->status == NOT_INITIALIZED) return; + spin_lock(&tp->lock); + smctr_disable_bic_int(dev); smctr_enable_16bit(dev); @@ -2046,6 +2047,7 @@ if(isb_type >= 0x10) { smctr_disable_16bit(dev); + spin_unlock(&tp->lock); return; } @@ -2063,56 +2065,45 @@ switch(isb_subtype) { case 0: - tp->monitor_state - = MS_MONITOR_FSM_INACTIVE; - break; + tp->monitor_state = MS_MONITOR_FSM_INACTIVE; + break; case 1: - tp->monitor_state - = MS_REPEAT_BEACON_STATE; + tp->monitor_state = MS_REPEAT_BEACON_STATE; break; case 2: - tp->monitor_state - = MS_REPEAT_CLAIM_TOKEN_STATE; + tp->monitor_state = MS_REPEAT_CLAIM_TOKEN_STATE; break; case 3: - tp->monitor_state - = MS_TRANSMIT_CLAIM_TOKEN_STATE; break; + tp->monitor_state = MS_TRANSMIT_CLAIM_TOKEN_STATE; break; case 4: - tp->monitor_state - = MS_STANDBY_MONITOR_STATE; + tp->monitor_state = MS_STANDBY_MONITOR_STATE; break; case 5: - tp->monitor_state - = MS_TRANSMIT_BEACON_STATE; + tp->monitor_state = MS_TRANSMIT_BEACON_STATE; break; case 6: - tp->monitor_state - = MS_ACTIVE_MONITOR_STATE; + tp->monitor_state = MS_ACTIVE_MONITOR_STATE; break; case 7: - tp->monitor_state - = MS_TRANSMIT_RING_PURGE_STATE; + tp->monitor_state = MS_TRANSMIT_RING_PURGE_STATE; break; case 8: /* diagnostic state */ break; case 9: - tp->monitor_state - = MS_BEACON_TEST_STATE; + tp->monitor_state = MS_BEACON_TEST_STATE; if(smctr_lobe_media_test(dev)) { - tp->ring_status_flags - = RING_STATUS_CHANGED; - tp->ring_status - = AUTO_REMOVAL_ERROR; + tp->ring_status_flags = RING_STATUS_CHANGED; + tp->ring_status = AUTO_REMOVAL_ERROR; smctr_ring_status_chg(dev); smctr_bypass_state(dev); } @@ -2162,16 +2153,14 @@ /* BUG QUEUE for TRC stuck receive BUG */ if(isb_subtype & TX_PENDING_PRIORITY_2) { - if((err = smctr_tx_complete(dev, - BUG_QUEUE)) != SUCCESS) + if((err = smctr_tx_complete(dev, BUG_QUEUE)) != SUCCESS) break; } /* NON-MAC frames only */ if(isb_subtype & TX_PENDING_PRIORITY_1) { - if((err = smctr_tx_complete(dev, - NON_MAC_QUEUE)) != SUCCESS) + if((err = smctr_tx_complete(dev, NON_MAC_QUEUE)) != SUCCESS) break; } @@ -2189,40 +2178,31 @@ */ interrupt_unmask_bits |= 0x800; - tp->tx_queue_status[BUG_QUEUE] - = NOT_TRANSMITING; - if((err = smctr_tx_complete(dev, - BUG_QUEUE)) != SUCCESS) + tp->tx_queue_status[BUG_QUEUE] = NOT_TRANSMITING; + if((err = smctr_tx_complete(dev, BUG_QUEUE)) != SUCCESS) break; - if((err = smctr_restart_tx_chain(dev, - BUG_QUEUE)) != SUCCESS) + if((err = smctr_restart_tx_chain(dev, BUG_QUEUE)) != SUCCESS) break; } /* NON-MAC queue only */ if(isb_subtype & TX_PENDING_PRIORITY_1) { - tp->tx_queue_status[NON_MAC_QUEUE] - = NOT_TRANSMITING; - if((err = smctr_tx_complete(dev, - NON_MAC_QUEUE)) != SUCCESS) + tp->tx_queue_status[NON_MAC_QUEUE] = NOT_TRANSMITING; + if((err = smctr_tx_complete(dev, NON_MAC_QUEUE)) != SUCCESS) break; - if((err = smctr_restart_tx_chain(dev, - NON_MAC_QUEUE)) != SUCCESS) + if((err = smctr_restart_tx_chain(dev, NON_MAC_QUEUE)) != SUCCESS) break; } /* MAC queue only */ if(isb_subtype & TX_PENDING_PRIORITY_0) { - tp->tx_queue_status[MAC_QUEUE] - = NOT_TRANSMITING; - if((err = smctr_tx_complete(dev, - MAC_QUEUE)) != SUCCESS) + tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING; + if((err = smctr_tx_complete(dev, MAC_QUEUE)) != SUCCESS) break; - err = smctr_restart_tx_chain(dev, - MAC_QUEUE); + err = smctr_restart_tx_chain(dev, MAC_QUEUE); } break; @@ -2328,7 +2308,7 @@ * complete posted */ interrupt_unmask_bits &= (~0x800); - printk("Jay please send bug\n");// smctr_send_bug(dev); + printk(KERN_CRIT "Jay please send bug\n");// smctr_send_bug(dev); } if(tp->ptr_rx_fifo_overruns) @@ -2346,7 +2326,7 @@ err = SUCCESS; if(tp->acb_head->cmd == ACB_CMD_HIC_NOP) { - printk("i1\n"); + printk(KERN_ERR "i1\n"); smctr_disable_16bit(dev); /* XXXXXXXXXXXXXXXXX */ @@ -2387,8 +2367,7 @@ if(err != SUCCESS) { - tp->acb_pending -= 0; + tp->acb_pending = 0; break; } } @@ -2397,18 +2376,14 @@ { if(tp->ptr_una) { - tp->ptr_una[0] - = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[0]); - tp->ptr_una[1] - = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[1]); - tp->ptr_una[2] - = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[2]); + tp->ptr_una[0] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[0]); + tp->ptr_una[1] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[1]); + tp->ptr_una[2] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[2]); } } - if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate - & READY_TO_SEND_RQ_INIT) { + if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & READY_TO_SEND_RQ_INIT) { err = smctr_send_rq_init(dev); } } @@ -2446,45 +2421,37 @@ break; case 1: - tp->join_state - = JS_LOBE_TEST_STATE; + tp->join_state = JS_LOBE_TEST_STATE; break; case 2: - tp->join_state - = JS_DETECT_MONITOR_PRESENT_STATE; + tp->join_state = JS_DETECT_MONITOR_PRESENT_STATE; break; case 3: - tp->join_state - = JS_AWAIT_NEW_MONITOR_STATE; + tp->join_state = JS_AWAIT_NEW_MONITOR_STATE; break; case 4: - tp->join_state - = JS_DUPLICATE_ADDRESS_TEST_STATE; + tp->join_state = JS_DUPLICATE_ADDRESS_TEST_STATE; break; case 5: - tp->join_state - = JS_NEIGHBOR_NOTIFICATION_STATE; + tp->join_state = JS_NEIGHBOR_NOTIFICATION_STATE; break; case 6: - tp->join_state - = JS_REQUEST_INITIALIZATION_STATE; + tp->join_state = JS_REQUEST_INITIALIZATION_STATE; break; case 7: - tp->join_state - = JS_JOIN_COMPLETE_STATE; + tp->join_state = JS_JOIN_COMPLETE_STATE; tp->status = OPEN; err = smctr_status_chg(dev); break; case 8: - tp->join_state - = JS_BYPASS_WAIT_STATE; + tp->join_state = JS_BYPASS_WAIT_STATE; break; } break ; @@ -2514,11 +2481,11 @@ * but we still want to issue ack to ISB */ if(!(interrupt_ack_code & 0xff00)) - smctr_issue_int_ack(dev, interrupt_ack_code, - interrupt_unmask_bits); + smctr_issue_int_ack(dev, interrupt_ack_code, interrupt_unmask_bits); smctr_disable_16bit(dev); smctr_enable_bic_int(dev); + spin_unlock(&tp->lock); return; } @@ -2533,16 +2500,14 @@ return (err); tp->sclb_ptr->int_mask_control = interrupt_enable_mask; - tp->sclb_ptr->valid_command = SCLB_VALID - | SCLB_CMD_CLEAR_INTERRUPT_MASK; + tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_CMD_CLEAR_INTERRUPT_MASK; smctr_set_ctrl_attention(dev); return (0); } -static int smctr_issue_int_ack(struct net_device *dev, __u16 iack_code, - __u16 ibits) +static int smctr_issue_int_ack(struct net_device *dev, __u16 iack_code, __u16 ibits) { struct net_local *tp = (struct net_local *)dev->priv; @@ -2551,9 +2516,7 @@ tp->sclb_ptr->int_mask_control = ibits; tp->sclb_ptr->iack_code = iack_code << 1; /* use the offset from base */ tp->sclb_ptr->resume_control = 0; - tp->sclb_ptr->valid_command = - SCLB_VALID | SCLB_IACK_CODE_VALID - | SCLB_CMD_CLEAR_INTERRUPT_MASK; + tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_IACK_CODE_VALID | SCLB_CMD_CLEAR_INTERRUPT_MASK; smctr_set_ctrl_attention(dev); @@ -2729,7 +2692,7 @@ if((err = smctr_wait_cmd(dev))) { - printk("%s: Hardware failure\n", dev->name); + printk(KERN_ERR "%s: Hardware failure\n", dev->name); return (err); } @@ -2864,7 +2827,7 @@ struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 10) - printk("%s: smctr_issue_resume_rx_fcb_cmd\n", dev->name); + printk(KERN_DEBUG "%s: smctr_issue_resume_rx_fcb_cmd\n", dev->name); if(smctr_wait_while_cbusy(dev)) return (-1); @@ -2886,7 +2849,7 @@ struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 10) - printk("%s: smctr_issue_resume_tx_fcb_cmd\n", dev->name); + printk(KERN_DEBUG "%s: smctr_issue_resume_tx_fcb_cmd\n", dev->name); if(smctr_wait_while_cbusy(dev)) return (-1); @@ -3035,7 +2998,7 @@ int err = 0; if(smctr_debug > 10) - printk("%s: smctr_load_firmware\n", dev->name); + printk(KERN_DEBUG "%s: smctr_load_firmware\n", dev->name); tp->ptr_ucode = smctr_code; tp->num_of_tx_buffs = 4; @@ -3151,7 +3114,7 @@ unsigned short saved_rcv_mask; if(smctr_debug > 10) - printk("%s: smctr_lobe_media_test\n", dev->name); + printk(KERN_DEBUG "%s: smctr_lobe_media_test\n", dev->name); /* Clear receive mask for lobe test. */ saved_rcv_mask = tp->receive_mask; @@ -3225,7 +3188,7 @@ int err; if(smctr_debug > 10) - printk("%s: smctr_lobe_media_test_cmd\n", dev->name); + printk(KERN_DEBUG "%s: smctr_lobe_media_test_cmd\n", dev->name); /* Change to lobe media test state. */ if(tp->monitor_state != MS_BEACON_TEST_STATE) @@ -3233,7 +3196,7 @@ smctr_lobe_media_test_state(dev); if(smctr_wait_cmd(dev)) { - printk("Lobe Failed test state\n"); + printk(KERN_ERR "Lobe Failed test state\n"); return (LOBE_MEDIA_TEST_FAILED); } } @@ -3548,7 +3511,7 @@ int err; if(smctr_debug > 10) - printk("%s: smctr_open\n", dev->name); + printk(KERN_DEBUG "%s: smctr_open\n", dev->name); err = smctr_init_adapter(dev); if(err < 0) @@ -3569,7 +3532,7 @@ int err; if(smctr_debug > 10) - printk("%s: smctr_open_tr\n", dev->name); + printk(KERN_DEBUG "%s: smctr_open_tr\n", dev->name); /* Now we can actually open the adapter. */ if(tp->status == OPEN) @@ -3577,9 +3540,10 @@ if(tp->status != INITIALIZED) return (-1); - save_flags(flags); - cli(); - + /* FIXME: it would work a lot better if we masked the irq sources + on the card here, then we could skip the locking and poll nicely */ + spin_lock_irqsave(&tp->lock, flags); + smctr_set_page(dev, (__u8 *)tp->ram_access); if((err = smctr_issue_resume_rx_fcb_cmd(dev, (short)MAC_QUEUE))) @@ -3642,14 +3606,14 @@ else { if(err == LOBE_MEDIA_TEST_FAILED) - printk("%s: Lobe Media Test Failure - Check cable?\n", dev->name); + printk(KERN_WARNING "%s: Lobe Media Test Failure - Check cable?\n", dev->name); } } } } out: - restore_flags(flags); + spin_unlock_irqrestore(&tp->lock, flags); return (err); } @@ -3704,6 +3668,8 @@ goto out; } memset(tp, 0, sizeof(struct net_local)); + spin_lock_init(&tp->lock); + dev->priv = tp; dev->base_addr = ioaddr; @@ -3727,7 +3693,7 @@ err = smctr_load_firmware(dev); if(err != UCODE_PRESENT && err != SUCCESS) { - printk("%s: Firmware load failed (%d)\n", dev->name, err); + printk(KERN_ERR "%s: Firmware load failed (%d)\n", dev->name, err); err = -EIO; goto out_tp; } @@ -3738,7 +3704,7 @@ else tp->media_type = MEDIA_UTP_16; - printk("%s: %s %s at Io %#4x, Irq %d, Rom %#4x, Ram %#4x.\n", + printk(KERN_INFO "%s: %s %s at Io %#4x, Irq %d, Rom %#4x, Ram %#4x.\n", dev->name, smctr_name, smctr_model, (unsigned int)dev->base_addr, dev->irq, tp->rom_base, tp->ram_base); @@ -3777,8 +3743,7 @@ { /* Received MAC Frames Processed by RS. */ case INIT: - if((rcode = smctr_rcv_init(dev, rmf, - &correlator)) == HARDWARE_FAILED) + if((rcode = smctr_rcv_init(dev, rmf, &correlator)) == HARDWARE_FAILED) { return (rcode); } @@ -3993,7 +3958,7 @@ __u8 err = 0; if(smctr_debug > 10) - printk("%s: smctr_ram_memory_test\n", dev->name); + printk(KERN_DEBUG "%s: smctr_ram_memory_test\n", dev->name); start_pattern = 0x0001; pages_of_ram = tp->ram_size / tp->ram_usable; @@ -4401,7 +4366,7 @@ int err = 0; if(smctr_debug > 10) - printk("%s: smctr_restart_tx_chain\n", dev->name); + printk(KERN_DEBUG "%s: smctr_restart_tx_chain\n", dev->name); if(tp->num_tx_fcbs_used[queue] != 0 && tp->tx_queue_status[queue] == NOT_TRANSMITING) @@ -4418,7 +4383,7 @@ struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 10) - printk("%s: smctr_ring_status_chg\n", dev->name); + printk(KERN_DEBUG "%s: smctr_ring_status_chg\n", dev->name); /* Check for ring_status_flag: whenever MONITOR_STATE_BIT * Bit is set, check value of monitor_state, only then we @@ -4502,7 +4467,7 @@ break; case SIGNAL_LOSS: - printk(KERN_INFO "%s: Singal Loss\n", dev->name); + printk(KERN_INFO "%s: Signal Loss\n", dev->name); tp->current_ring_status |= SIGNAL_LOSS; break; @@ -4522,9 +4487,8 @@ __u8 *pbuff; if(smctr_debug > 10) - printk("%s: smctr_rx_frame\n", dev->name); + printk(KERN_DEBUG "%s: smctr_rx_frame\n", dev->name); - cli(); queue = tp->receive_queue_number; while((status = tp->rx_fcb_curr[queue]->frame_status) != SUCCESS) @@ -4554,7 +4518,6 @@ skb_put(skb, rx_size); memcpy(skb->data, pbuff, rx_size); - sti(); /* Update Counters */ tp->MacStat.rx_packets++; @@ -4566,7 +4529,6 @@ netif_rx(skb); dev->last_rx = jiffies; } else { - sti(); } } else @@ -4593,7 +4555,7 @@ FCBlock *fcb; if(smctr_debug > 10) - printk("%s: smctr_send_dat\n", dev->name); + printk(KERN_DEBUG "%s: smctr_send_dat\n", dev->name); if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER))) == (FCBlock *)(-1L)) @@ -4670,7 +4632,7 @@ struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 10) - printk("%s: smctr_send_packet\n", dev->name); + printk(KERN_DEBUG "%s: smctr_send_packet\n", dev->name); /* * Block a transmit overlap @@ -4700,7 +4662,7 @@ int err; if(smctr_debug > 15) - printk("%s: smctr_send_lobe_media_test\n", dev->name); + printk(KERN_DEBUG "%s: smctr_send_lobe_media_test\n", dev->name); if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(struct trh_hdr) + S_WRAP_DATA + S_WRAP_DATA)) == (FCBlock *)(-1L)) @@ -5241,7 +5203,7 @@ static void smctr_set_multicast_list(struct net_device *dev) { if(smctr_debug > 10) - printk("%s: smctr_set_multicast_list\n", dev->name); + printk(KERN_DEBUG "%s: smctr_set_multicast_list\n", dev->name); return; } @@ -5310,7 +5272,7 @@ __u16 sword, rword; if(smctr_debug > 10) - printk("%s: smctr_set_rx_look_ahead_flag\n", dev->name); + printk(KERN_DEBUG "%s: smctr_set_rx_look_ahead_flag\n", dev->name); tp->adapter_flags &= ~(FORCED_16BIT_MODE); tp->adapter_flags |= RX_VALID_LOOKAHEAD; @@ -5353,7 +5315,7 @@ unsigned int err; if(smctr_debug > 10) - printk("%s: smctr_setup_single_cmd\n", dev->name); + printk(KERN_DEBUG "%s: smctr_setup_single_cmd\n", dev->name); if((err = smctr_wait_while_cbusy(dev))) return (err); @@ -5403,7 +5365,7 @@ struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 10) - printk("%s: smctr_status_chg\n", dev->name); + printk(KERN_DEBUG "%s: smctr_status_chg\n", dev->name); switch(tp->status) { @@ -5440,7 +5402,7 @@ int err = 0; if(smctr_debug > 10) - printk("%s: smctr_trc_send_packet\n", dev->name); + printk(KERN_DEBUG "%s: smctr_trc_send_packet\n", dev->name); fcb->info = FCB_CHAIN_END | FCB_ENABLE_TFS; if(tp->num_tx_fcbs[queue] != 1) @@ -5462,7 +5424,7 @@ int cstatus; if(smctr_debug > 10) - printk("%s: smctr_tx_complete\n", dev->name); + printk(KERN_DEBUG "%s: smctr_tx_complete\n", dev->name); while((status = tp->tx_fcb_end[queue]->frame_status) != SUCCESS) { @@ -5518,7 +5480,7 @@ __u8 *frag, *page; if(smctr_debug > 10) - printk("%s: smctr_tx_move_frame\n", dev->name); + printk(KERN_DEBUG "%s: smctr_tx_move_frame\n", dev->name); ram_usable = ((unsigned int)tp->ram_usable) << 10; frag = skb->data; @@ -5636,7 +5598,7 @@ struct net_local *tp = (struct net_local *)dev->priv; if(smctr_debug > 20) - printk("smctr_update_tx_chain\n"); + printk(KERN_DEBUG "smctr_update_tx_chain\n"); if(tp->num_tx_fcbs_used[queue] <= 0) return (HARDWARE_FAILED); @@ -5673,7 +5635,7 @@ unsigned int loop_count = 0x20000; if(smctr_debug > 10) - printk("%s: smctr_wait_cmd\n", dev->name); + printk(KERN_DEBUG "%s: smctr_wait_cmd\n", dev->name); while(loop_count) { @@ -5764,7 +5726,7 @@ dev_smctr[i] = NULL; if(i == 0) { - printk("%s: register_trdev() returned (<0).\n", + printk(KERN_ERR "%s: register_trdev() returned (<0).\n", cardname); return (-EIO); } diff -Nru a/drivers/net/tokenring/smctr.h b/drivers/net/tokenring/smctr.h --- a/drivers/net/tokenring/smctr.h Mon Oct 28 16:32:37 2002 +++ b/drivers/net/tokenring/smctr.h Mon Oct 28 16:32:37 2002 @@ -1050,6 +1050,8 @@ __u16 QueueSkb; struct tr_statistics MacStat; /* MAC statistics structure */ + + spinlock_t lock; } NET_LOCAL; /************************************ diff -Nru a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c --- a/drivers/net/tulip/tulip_core.c Mon Oct 28 16:32:37 2002 +++ b/drivers/net/tulip/tulip_core.c Mon Oct 28 16:32:37 2002 @@ -210,6 +210,7 @@ { 0x13D1, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, { 0x104A, 0x0981, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, { 0x104A, 0x2774, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, + { 0x1259, 0xa120, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, { 0x11F6, 0x9881, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMPEX9881 }, { 0x8086, 0x0039, PCI_ANY_ID, PCI_ANY_ID, 0, 0, I21145 }, { 0x1282, 0x9100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DM910X }, @@ -1409,7 +1410,6 @@ tp->timer.function = tulip_tbl[tp->chip_id].media_timer; dev->base_addr = ioaddr; - dev->irq = irq; #ifdef CONFIG_TULIP_MWI if (!force_csr0 && (tp->flags & HAS_PCI_MWI)) @@ -1553,6 +1553,7 @@ for (i = 0; i < 6; i++) last_phys_addr[i] = dev->dev_addr[i]; last_irq = irq; + dev->irq = irq; /* The lower four bits are the media type. */ if (board_idx >= 0 && board_idx < MAX_UNITS) { diff -Nru a/drivers/net/tulip/xircom_cb.c b/drivers/net/tulip/xircom_cb.c --- a/drivers/net/tulip/xircom_cb.c Mon Oct 28 16:32:37 2002 +++ b/drivers/net/tulip/xircom_cb.c Mon Oct 28 16:32:37 2002 @@ -299,7 +299,7 @@ dev->get_stats = &xircom_get_stats; dev->priv = private; dev->do_ioctl = &private_ioctl; - pdev->driver_data = dev; + pci_set_drvdata(pdev, dev); /* start the transmitter to get a heartbeat */ @@ -326,7 +326,7 @@ */ static void __devexit xircom_remove(struct pci_dev *pdev) { - struct net_device *dev = pdev->driver_data; + struct net_device *dev = pci_get_drvdata(pdev); struct xircom_private *card; enter("xircom_remove"); if (dev!=NULL) { diff -Nru a/drivers/net/wan/c101.c b/drivers/net/wan/c101.c --- a/drivers/net/wan/c101.c Mon Oct 28 16:32:36 2002 +++ b/drivers/net/wan/c101.c Mon Oct 28 16:32:36 2002 @@ -175,9 +175,8 @@ static int c101_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - union line_settings *line = &ifr->ifr_settings->ifs_line; const size_t size = sizeof(sync_serial_settings); - sync_serial_settings new_line; + sync_serial_settings new_line, *line = ifr->ifr_settings.ifs_ifsu.sync; hdlc_device *hdlc = dev_to_hdlc(dev); port_t *port = hdlc_to_port(hdlc); @@ -190,10 +189,14 @@ if (cmd != SIOCWANDEV) return hdlc_ioctl(dev, ifr, cmd); - switch(ifr->ifr_settings->type) { + switch(ifr->ifr_settings.type) { case IF_GET_IFACE: - ifr->ifr_settings->type = IF_IFACE_SYNC_SERIAL; - if (copy_to_user(&line->sync, &port->settings, size)) + ifr->ifr_settings.type = IF_IFACE_SYNC_SERIAL; + if (ifr->ifr_settings.size < size) { + ifr->ifr_settings.size = size; /* data size wanted */ + return -ENOBUFS; + } + if (copy_to_user(line, &port->settings, size)) return -EFAULT; return 0; @@ -201,7 +204,7 @@ if(!capable(CAP_NET_ADMIN)) return -EPERM; - if (copy_from_user(&new_line, &line->sync, size)) + if (copy_from_user(&new_line, line, size)) return -EFAULT; if (new_line.clock_type != CLOCK_EXT && diff -Nru a/drivers/net/wan/cycx_main.c b/drivers/net/wan/cycx_main.c --- a/drivers/net/wan/cycx_main.c Mon Oct 28 16:32:36 2002 +++ b/drivers/net/wan/cycx_main.c Mon Oct 28 16:32:36 2002 @@ -44,7 +44,6 @@ #include /* printk(), and other useful stuff */ #include /* support for loadable modules */ #include /* request_region(), release_region() */ -#include /* for kernel task queues */ #include /* WAN router definitions */ #include /* cyclomx common user API definitions */ #include /* kernel <-> user copy */ diff -Nru a/drivers/net/wan/dscc4.c b/drivers/net/wan/dscc4.c --- a/drivers/net/wan/dscc4.c Mon Oct 28 16:32:36 2002 +++ b/drivers/net/wan/dscc4.c Mon Oct 28 16:32:36 2002 @@ -1144,7 +1144,7 @@ static int dscc4_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - union line_settings *line = &ifr->ifr_settings->ifs_line; + sync_serial_settings *line = ifr->ifr_settings.ifs_ifsu.sync; struct dscc4_dev_priv *dpriv = dscc4_priv(dev); const size_t size = sizeof(dpriv->settings); int ret = 0; @@ -1155,10 +1155,14 @@ if (cmd != SIOCWANDEV) return -EOPNOTSUPP; - switch(ifr->ifr_settings->type) { + switch(ifr->ifr_settings.type) { case IF_GET_IFACE: - ifr->ifr_settings->type = IF_IFACE_SYNC_SERIAL; - if (copy_to_user(&line->sync, &dpriv->settings, size)) + ifr->ifr_settings.type = IF_IFACE_SYNC_SERIAL; + if (ifr->ifr_settings.size < size) { + ifr->ifr_settings.size = size; /* data size wanted */ + return -ENOBUFS; + } + if (copy_to_user(line, &dpriv->settings, size)) return -EFAULT; break; @@ -1166,7 +1170,7 @@ if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (copy_from_user(&dpriv->settings, &line->sync, size)) + if (copy_from_user(&dpriv->settings, line, size)) return -EFAULT; ret = dscc4_set_iface(dpriv, dev); break; diff -Nru a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c --- a/drivers/net/wan/farsync.c Mon Oct 28 16:32:37 2002 +++ b/drivers/net/wan/farsync.c Mon Oct 28 16:32:37 2002 @@ -1010,11 +1010,11 @@ fst_set_iface ( struct fst_card_info *card, struct fst_port_info *port, struct ifreq *ifr ) { - union line_settings *line = &ifr->ifr_settings->ifs_line; sync_serial_settings sync; int i; - if ( copy_from_user ( &sync, &line->sync, sizeof ( sync ))) + if (copy_from_user (&sync, ifr->ifr_settings.ifs_ifsu.sync, + sizeof (sync))) return -EFAULT; if ( sync.loopback ) @@ -1022,7 +1022,7 @@ i = port->index; - switch ( ifr->ifr_settings->type ) + switch (ifr->ifr_settings.type) { case IF_IFACE_V35: FST_WRW ( card, portConfig[i].lineInterface, V35 ); @@ -1067,7 +1067,6 @@ fst_get_iface ( struct fst_card_info *card, struct fst_port_info *port, struct ifreq *ifr ) { - union line_settings *line = &ifr->ifr_settings->ifs_line; sync_serial_settings sync; int i; @@ -1078,24 +1077,30 @@ switch ( port->hwif ) { case V35: - ifr->ifr_settings->type = IF_IFACE_V35; + ifr->ifr_settings.type = IF_IFACE_V35; break; case V24: - ifr->ifr_settings->type = IF_IFACE_V24; + ifr->ifr_settings.type = IF_IFACE_V24; break; case X21: default: - ifr->ifr_settings->type = IF_IFACE_X21; + ifr->ifr_settings.type = IF_IFACE_X21; break; } + if (ifr->ifr_settings.size < sizeof(sync)) { + ifr->ifr_settings.size = sizeof(sync); /* data size wanted */ + return -ENOBUFS; + } + i = port->index; sync.clock_rate = FST_RDL ( card, portConfig[i].lineSpeed ); /* Lucky card and linux use same encoding here */ sync.clock_type = FST_RDB ( card, portConfig[i].internalClock ); sync.loopback = 0; - if ( copy_to_user (&line->sync, &sync, sizeof ( sync ))) + if (copy_to_user (ifr->ifr_settings.ifs_ifsu.sync, &sync, + sizeof(sync))) return -EFAULT; return 0; @@ -1221,7 +1226,7 @@ return set_conf_from_info ( card, port, &info ); case SIOCWANDEV: - switch ( ifr->ifr_settings->type ) + switch (ifr->ifr_settings.type) { case IF_GET_IFACE: return fst_get_iface ( card, port, ifr ); diff -Nru a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c --- a/drivers/net/wan/hdlc_cisco.c Mon Oct 28 16:32:36 2002 +++ b/drivers/net/wan/hdlc_cisco.c Mon Oct 28 16:32:36 2002 @@ -247,15 +247,19 @@ int hdlc_cisco_ioctl(hdlc_device *hdlc, struct ifreq *ifr) { - cisco_proto *cisco_s = &ifr->ifr_settings->ifs_hdlc.cisco; + cisco_proto *cisco_s = ifr->ifr_settings.ifs_ifsu.cisco; const size_t size = sizeof(cisco_proto); cisco_proto new_settings; struct net_device *dev = hdlc_to_dev(hdlc); int result; - switch (ifr->ifr_settings->type) { + switch (ifr->ifr_settings.type) { case IF_GET_PROTO: - ifr->ifr_settings->type = IF_PROTO_CISCO; + ifr->ifr_settings.type = IF_PROTO_CISCO; + if (ifr->ifr_settings.size < size) { + ifr->ifr_settings.size = size; /* data size wanted */ + return -ENOBUFS; + } if (copy_to_user(cisco_s, &hdlc->state.cisco.settings, size)) return -EFAULT; return 0; diff -Nru a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c --- a/drivers/net/wan/hdlc_fr.c Mon Oct 28 16:32:36 2002 +++ b/drivers/net/wan/hdlc_fr.c Mon Oct 28 16:32:36 2002 @@ -778,16 +778,20 @@ int hdlc_fr_ioctl(hdlc_device *hdlc, struct ifreq *ifr) { - fr_proto *fr_s = &ifr->ifr_settings->ifs_hdlc.fr; + fr_proto *fr_s = ifr->ifr_settings.ifs_ifsu.fr; const size_t size = sizeof(fr_proto); fr_proto new_settings; struct net_device *dev = hdlc_to_dev(hdlc); fr_proto_pvc pvc; int result; - switch (ifr->ifr_settings->type) { + switch (ifr->ifr_settings.type) { case IF_GET_PROTO: - ifr->ifr_settings->type = IF_PROTO_FR; + ifr->ifr_settings.type = IF_PROTO_FR; + if (ifr->ifr_settings.size < size) { + ifr->ifr_settings.size = size; /* data size wanted */ + return -ENOBUFS; + } if (copy_to_user(fr_s, &hdlc->state.fr.settings, size)) return -EFAULT; return 0; @@ -847,12 +851,12 @@ if(!capable(CAP_NET_ADMIN)) return -EPERM; - if (copy_from_user(&pvc, &ifr->ifr_settings->ifs_hdlc.fr_pvc, + if (copy_from_user(&pvc, ifr->ifr_settings.ifs_ifsu.fr_pvc, sizeof(fr_proto_pvc))) return -EFAULT; return fr_pvc(hdlc, pvc.dlci, - ifr->ifr_settings->type == IF_PROTO_FR_ADD_PVC); + ifr->ifr_settings.type == IF_PROTO_FR_ADD_PVC); } return -EINVAL; diff -Nru a/drivers/net/wan/hdlc_generic.c b/drivers/net/wan/hdlc_generic.c --- a/drivers/net/wan/hdlc_generic.c Mon Oct 28 16:32:35 2002 +++ b/drivers/net/wan/hdlc_generic.c Mon Oct 28 16:32:35 2002 @@ -38,7 +38,7 @@ #include -static const char* version = "HDLC support module revision 1.10"; +static const char* version = "HDLC support module revision 1.11"; static int hdlc_change_mtu(struct net_device *dev, int new_mtu) @@ -95,13 +95,13 @@ if (cmd != SIOCWANDEV) return -EINVAL; - switch(ifr->ifr_settings->type) { + switch(ifr->ifr_settings.type) { case IF_PROTO_HDLC: case IF_PROTO_PPP: case IF_PROTO_CISCO: case IF_PROTO_FR: case IF_PROTO_X25: - proto = ifr->ifr_settings->type; + proto = ifr->ifr_settings.type; break; default: diff -Nru a/drivers/net/wan/hdlc_ppp.c b/drivers/net/wan/hdlc_ppp.c --- a/drivers/net/wan/hdlc_ppp.c Mon Oct 28 16:32:35 2002 +++ b/drivers/net/wan/hdlc_ppp.c Mon Oct 28 16:32:35 2002 @@ -82,9 +82,9 @@ struct net_device *dev = hdlc_to_dev(hdlc); int result; - switch (ifr->ifr_settings->type) { + switch (ifr->ifr_settings.type) { case IF_GET_PROTO: - ifr->ifr_settings->type = IF_PROTO_PPP; + ifr->ifr_settings.type = IF_PROTO_PPP; return 0; /* return protocol only, no settable parameters */ case IF_PROTO_PPP: diff -Nru a/drivers/net/wan/hdlc_raw.c b/drivers/net/wan/hdlc_raw.c --- a/drivers/net/wan/hdlc_raw.c Mon Oct 28 16:32:37 2002 +++ b/drivers/net/wan/hdlc_raw.c Mon Oct 28 16:32:37 2002 @@ -37,15 +37,19 @@ int hdlc_raw_ioctl(hdlc_device *hdlc, struct ifreq *ifr) { - raw_hdlc_proto *raw_s = &ifr->ifr_settings->ifs_hdlc.raw_hdlc; + raw_hdlc_proto *raw_s = ifr->ifr_settings.ifs_ifsu.raw_hdlc; const size_t size = sizeof(raw_hdlc_proto); raw_hdlc_proto new_settings; struct net_device *dev = hdlc_to_dev(hdlc); int result; - switch (ifr->ifr_settings->type) { + switch (ifr->ifr_settings.type) { case IF_GET_PROTO: - ifr->ifr_settings->type = IF_PROTO_HDLC; + ifr->ifr_settings.type = IF_PROTO_HDLC; + if (ifr->ifr_settings.size < size) { + ifr->ifr_settings.size = size; /* data size wanted */ + return -ENOBUFS; + } if (copy_to_user(raw_s, &hdlc->state.raw_hdlc.settings, size)) return -EFAULT; return 0; diff -Nru a/drivers/net/wan/hdlc_x25.c b/drivers/net/wan/hdlc_x25.c --- a/drivers/net/wan/hdlc_x25.c Mon Oct 28 16:32:38 2002 +++ b/drivers/net/wan/hdlc_x25.c Mon Oct 28 16:32:38 2002 @@ -184,9 +184,9 @@ struct net_device *dev = hdlc_to_dev(hdlc); int result; - switch (ifr->ifr_settings->type) { + switch (ifr->ifr_settings.type) { case IF_GET_PROTO: - ifr->ifr_settings->type = IF_PROTO_X25; + ifr->ifr_settings.type = IF_PROTO_X25; return 0; /* return protocol only, no settable parameters */ case IF_PROTO_X25: diff -Nru a/drivers/net/wan/n2.c b/drivers/net/wan/n2.c --- a/drivers/net/wan/n2.c Mon Oct 28 16:32:36 2002 +++ b/drivers/net/wan/n2.c Mon Oct 28 16:32:36 2002 @@ -246,9 +246,8 @@ static int n2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - union line_settings *line = &ifr->ifr_settings->ifs_line; const size_t size = sizeof(sync_serial_settings); - sync_serial_settings new_line; + sync_serial_settings new_line, *line = ifr->ifr_settings.ifs_ifsu.sync; hdlc_device *hdlc = dev_to_hdlc(dev); port_t *port = hdlc_to_port(hdlc); @@ -261,10 +260,14 @@ if (cmd != SIOCWANDEV) return hdlc_ioctl(dev, ifr, cmd); - switch(ifr->ifr_settings->type) { + switch(ifr->ifr_settings.type) { case IF_GET_IFACE: - ifr->ifr_settings->type = IF_IFACE_SYNC_SERIAL; - if (copy_to_user(&line->sync, &port->settings, size)) + ifr->ifr_settings.type = IF_IFACE_SYNC_SERIAL; + if (ifr->ifr_settings.size < size) { + ifr->ifr_settings.size = size; /* data size wanted */ + return -ENOBUFS; + } + if (copy_to_user(line, &port->settings, size)) return -EFAULT; return 0; @@ -272,7 +275,7 @@ if(!capable(CAP_NET_ADMIN)) return -EPERM; - if (copy_from_user(&new_line, &line->sync, size)) + if (copy_from_user(&new_line, line, size)) return -EFAULT; if (new_line.clock_type != CLOCK_EXT && diff -Nru a/drivers/net/wan/pc300_drv.c b/drivers/net/wan/pc300_drv.c --- a/drivers/net/wan/pc300_drv.c Mon Oct 28 16:32:38 2002 +++ b/drivers/net/wan/pc300_drv.c Mon Oct 28 16:32:38 2002 @@ -2542,7 +2542,7 @@ pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; int ch = chan->channel; void *arg = (void *) ifr->ifr_data; - union line_settings * line = &ifr->ifr_settings->ifs_line; + struct if_settings *settings = &ifr->ifr_settings; uclong scabase = card->hw.scabase; if (!capable(CAP_NET_ADMIN)) @@ -2741,13 +2741,19 @@ } case SIOCWANDEV: - switch (ifr->ifr_settings->type) { + switch (ifr->ifr_settings.type) { case IF_GET_IFACE: { const size_t size = sizeof(sync_serial_settings); - ifr->ifr_settings->type = conf->media; + ifr->ifr_settings.type = conf->media; + if (ifr->ifr_settings.size < size) { + /* data size wanted */ + ifr->ifr_settings.size = size; + return -ENOBUFS; + } - if (copy_to_user(&line->sync, &conf->phys_settings, size)) { + if (copy_to_user(settings->ifs_ifsu.sync, + &conf->phys_settings, size)) { return -EFAULT; } return 0; @@ -2764,7 +2770,7 @@ } if (copy_from_user(&conf->phys_settings, - &line->sync, size)) { + settings->ifs_ifsu.sync, size)) { return -EFAULT; } @@ -2773,7 +2779,7 @@ cpc_readb(card->hw.scabase + M_REG(MD2, ch)) | MD2_LOOP_MIR); } - conf->media = ifr->ifr_settings->type; + conf->media = ifr->ifr_settings.type; return 0; } @@ -2787,7 +2793,7 @@ } if (copy_from_user(&conf->phys_settings, - &line->te1, size)) { + settings->ifs_ifsu.te1, size)) { return -EFAULT; }/* Ignoring HDLC slot_map for a while */ @@ -2796,7 +2802,7 @@ cpc_readb(card->hw.scabase + M_REG(MD2, ch)) | MD2_LOOP_MIR); } - conf->media = ifr->ifr_settings->type; + conf->media = ifr->ifr_settings.type; return 0; } default: @@ -3556,7 +3562,7 @@ #endif /* Set PCI drv pointer to the card structure */ - pdev->driver_data = card; + pci_set_drvdata(pdev, card); /* Set board type */ switch (device_id) { @@ -3631,7 +3637,7 @@ static void __devexit cpc_remove_one(struct pci_dev *pdev) { - pc300_t *card = (pc300_t *) pdev->driver_data; + pc300_t *card = pci_get_drvdata(pdev); if (card->hw.rambase != 0) { int i; diff -Nru a/drivers/net/wan/pc300_tty.c b/drivers/net/wan/pc300_tty.c --- a/drivers/net/wan/pc300_tty.c Mon Oct 28 16:32:36 2002 +++ b/drivers/net/wan/pc300_tty.c Mon Oct 28 16:32:36 2002 @@ -728,8 +728,8 @@ if (cpc_tty->tty && (cpc_tty->tty->ldisc.receive_buf)) { CPC_TTY_DBG("%s: call line disc. receive_buf\n",cpc_tty->name); - cpc_tty->tty->ldisc.receive_buf(cpc_tty->tty, buf->data, - &flags, buf->size); + cpc_tty->tty->ldisc.receive_buf(cpc_tty->tty, (char *)(buf->data), + &flags, buf->size); } cpc_tty->buf_rx.first = cpc_tty->buf_rx.first->next; kfree((unsigned char *)buf); diff -Nru a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c --- a/drivers/net/wan/sdla.c Mon Oct 28 16:32:38 2002 +++ b/drivers/net/wan/sdla.c Mon Oct 28 16:32:38 2002 @@ -1665,7 +1665,10 @@ } #ifdef MODULE -static struct net_device sdla0 = {"sdla0", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, sdla_init}; +static struct net_device sdla0 = { + .name = "sdla0", + .init = sdla_init +}; MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/znet.c b/drivers/net/znet.c --- a/drivers/net/znet.c Mon Oct 28 16:32:35 2002 +++ b/drivers/net/znet.c Mon Oct 28 16:32:35 2002 @@ -1,7 +1,5 @@ /* znet.c: An Zenith Z-Note ethernet driver for linux. */ -static const char version[] = "znet.c:v1.02 9/23/94 becker@cesdis.gsfc.nasa.gov\n"; - /* Written by Donald Becker. @@ -62,6 +60,30 @@ functionality from the serial subsystem. */ +/* 10/2002 + + o Resurected for Linux 2.5+ by Marc Zyngier : + + - Removed strange DMA snooping in znet_sent_packet, which lead to + TX buffer corruption on my laptop. + - Use init_etherdev stuff. + - Use kmalloc-ed DMA buffers. + - Use as few global variables as possible. + - Use proper resources management. + - Use wireless/i82593.h as much as possible (structure, constants) + - Compiles as module or build-in. + + Tested on a vintage Zenith Z-Note 433Lnp+. Probably broken on + anything else. Testers (and detailed bug reports) are welcome :-). + + o TODO : + + - Properly handle multicast + - Understand why some traffic patterns add a 1s latency... + */ + +#include +#include #include #include #include @@ -69,6 +91,7 @@ #include #include #include +#include #include #include #include @@ -79,52 +102,35 @@ #include #include +/* This include could be elsewhere, since it is not wireless specific */ +#include "wireless/i82593.h" + +static const char version[] __initdata = "znet.c:v1.02 9/23/94 becker@cesdis.gsfc.nasa.gov\n"; + #ifndef ZNET_DEBUG #define ZNET_DEBUG 1 #endif static unsigned int znet_debug = ZNET_DEBUG; +MODULE_PARM (znet_debug, "i"); +MODULE_PARM_DESC (znet_debug, "ZNet debug level"); +MODULE_LICENSE("GPL"); /* The DMA modes we need aren't in . */ #define DMA_RX_MODE 0x14 /* Auto init, I/O to mem, ++, demand. */ #define DMA_TX_MODE 0x18 /* Auto init, Mem to I/O, ++, demand. */ #define dma_page_eq(ptr1, ptr2) ((long)(ptr1)>>17 == (long)(ptr2)>>17) -#define DMA_BUF_SIZE 8192 #define RX_BUF_SIZE 8192 #define TX_BUF_SIZE 8192 - -/* Commands to the i82593 channel 0. */ -#define CMD0_CHNL_0 0x00 -#define CMD0_CHNL_1 0x10 /* Switch to channel 1. */ -#define CMD0_NOP (CMD0_CHNL_0) -#define CMD0_PORT_1 CMD0_CHNL_1 -#define CMD1_PORT_0 1 -#define CMD0_IA_SETUP 1 -#define CMD0_CONFIGURE 2 -#define CMD0_MULTICAST_LIST 3 -#define CMD0_TRANSMIT 4 -#define CMD0_DUMP 6 -#define CMD0_DIAGNOSE 7 -#define CMD0_Rx_ENABLE 8 -#define CMD0_Rx_DISABLE 10 -#define CMD0_Rx_STOP 11 -#define CMD0_RETRANSMIT 12 -#define CMD0_ABORT 13 -#define CMD0_RESET 14 - -#define CMD0_ACK 0x80 - -#define CMD0_STAT0 (0 << 5) -#define CMD0_STAT1 (1 << 5) -#define CMD0_STAT2 (2 << 5) -#define CMD0_STAT3 (3 << 5) +#define DMA_BUF_SIZE (RX_BUF_SIZE + 16) /* 8k + 16 bytes for trailers */ #define TX_TIMEOUT 10 -#define net_local znet_private struct znet_private { int rx_dma, tx_dma; struct net_device_stats stats; spinlock_t lock; + short sia_base, sia_size, io_size; + struct i82593_conf_block i593_init; /* The starting, current, and end pointers for the packet buffers. */ ushort *rx_start, *rx_cur, *rx_end; ushort *tx_start, *tx_cur, *tx_end; @@ -132,40 +138,7 @@ }; /* Only one can be built-in;-> */ -static struct znet_private zn; -static ushort dma_buffer1[DMA_BUF_SIZE/2]; -static ushort dma_buffer2[DMA_BUF_SIZE/2]; -static ushort dma_buffer3[DMA_BUF_SIZE/2 + 8]; - -/* The configuration block. What an undocumented nightmare. The first - set of values are those suggested (without explanation) for ethernet - in the Intel 82586 databook. The rest appear to be completely undocumented, - except for cryptic notes in the Crynwr packet driver. This driver uses - the Crynwr values verbatim. */ - -static unsigned char i593_init[] = { - 0xAA, /* 0: 16-byte input & 80-byte output FIFO. */ - /* threshold, 96-byte FIFO, 82593 mode. */ - 0x88, /* 1: Continuous w/interrupts, 128-clock DMA.*/ - 0x2E, /* 2: 8-byte preamble, NO address insertion, */ - /* 6-byte Ethernet address, loopback off.*/ - 0x00, /* 3: Default priorities & backoff methods. */ - 0x60, /* 4: 96-bit interframe spacing. */ - 0x00, /* 5: 512-bit slot time (low-order). */ - 0xF2, /* 6: Slot time (high-order), 15 COLL retries. */ - 0x00, /* 7: Promisc-off, broadcast-on, default CRC. */ - 0x00, /* 8: Default carrier-sense, collision-detect. */ - 0x40, /* 9: 64-byte minimum frame length. */ - 0x5F, /* A: Type/length checks OFF, no CRC input, - "jabber" termination, etc. */ - 0x00, /* B: Full-duplex disabled. */ - 0x3F, /* C: Default multicast addresses & backoff. */ - 0x07, /* D: Default IFS retriggering. */ - 0x31, /* E: Internal retransmit, drop "runt" packets, - synchr. DRQ deassertion, 6 status bytes. */ - 0x22, /* F: Receive ring-buffer size (8K), - receive-stop register enable. */ -}; +static struct net_device *znet_dev; struct netidblk { char magic[8]; /* The magic number (string) "NETIDBLK" */ @@ -182,33 +155,225 @@ char pad; }; -int znet_probe(struct net_device *dev); static int znet_open(struct net_device *dev); static int znet_send_packet(struct sk_buff *skb, struct net_device *dev); static void znet_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void znet_rx(struct net_device *dev); static int znet_close(struct net_device *dev); static struct net_device_stats *net_get_stats(struct net_device *dev); -static void set_multicast_list(struct net_device *dev); static void hardware_init(struct net_device *dev); static void update_stop_hit(short ioaddr, unsigned short rx_stop_offset); static void znet_tx_timeout (struct net_device *dev); -#ifdef notdef -static struct sigaction znet_sigaction = { &znet_interrupt, 0, 0, NULL, }; -#endif +/* Request needed resources */ +static int znet_request_resources (struct net_device *dev) +{ + struct znet_private *znet = dev->priv; + unsigned long flags; + + if (request_irq (dev->irq, &znet_interrupt, 0, "ZNet", dev)) + goto failed; + if (request_dma (znet->rx_dma, "ZNet rx")) + goto free_irq; + if (request_dma (znet->tx_dma, "ZNet tx")) + goto free_rx_dma; + if (!request_region (znet->sia_base, znet->sia_size, "ZNet SIA")) + goto free_tx_dma; + if (!request_region (dev->base_addr, znet->io_size, "ZNet I/O")) + goto free_sia; + + return 0; /* Happy ! */ + + free_sia: + release_region (znet->sia_base, znet->sia_size); + free_tx_dma: + flags = claim_dma_lock(); + free_dma (znet->tx_dma); + release_dma_lock (flags); + free_rx_dma: + flags = claim_dma_lock(); + free_dma (znet->rx_dma); + release_dma_lock (flags); + free_irq: + free_irq (dev->irq, dev); + failed: + return -1; +} + +static void znet_release_resources (struct net_device *dev) +{ + struct znet_private *znet = dev->priv; + unsigned long flags; + + release_region (znet->sia_base, znet->sia_size); + release_region (dev->base_addr, znet->io_size); + flags = claim_dma_lock(); + free_dma (znet->tx_dma); + free_dma (znet->rx_dma); + release_dma_lock (flags); + free_irq (dev->irq, dev); +} + +/* Keep the magical SIA stuff in a single function... */ +static void znet_transceiver_power (struct net_device *dev, int on) +{ + struct znet_private *znet = dev->priv; + unsigned char v; + + /* Turn on/off the 82501 SIA, using zenith-specific magic. */ + /* Select LAN control register */ + outb(0x10, znet->sia_base); + if (on) + v = inb(znet->sia_base + 1) | 0x84; + else + v = inb(znet->sia_base + 1) & ~0x84; + + outb(v, znet->sia_base+1); /* Turn on/off LAN power (bit 2). */ +} + +/* Init the i82593, with current promisc/mcast configuration. + Also used from hardware_init. */ +static void znet_set_multicast_list (struct net_device *dev) +{ + struct znet_private *znet = dev->priv; + short ioaddr = dev->base_addr; + struct i82593_conf_block *cfblk = &znet->i593_init; + + memset(cfblk, 0x00, sizeof(struct i82593_conf_block)); + + /* The configuration block. What an undocumented nightmare. + The first set of values are those suggested (without explanation) + for ethernet in the Intel 82586 databook. The rest appear to be + completely undocumented, except for cryptic notes in the Crynwr + packet driver. This driver uses the Crynwr values verbatim. */ + + /* maz : Rewritten to take advantage of the wanvelan includes. + At least we have names, not just blind values */ + + /* Byte 0 */ + cfblk->fifo_limit = 10; /* = 16 B rx and 80 B tx fifo thresholds */ + cfblk->forgnesi = 0; /* 0=82C501, 1=AMD7992B compatibility */ + cfblk->fifo_32 = 1; + cfblk->d6mod = 0; /* Run in i82593 advanced mode */ + cfblk->throttle_enb = 1; + + /* Byte 1 */ + cfblk->throttle = 8; /* Continuous w/interrupts, 128-clock DMA. */ + cfblk->cntrxint = 0; /* enable continuous mode receive interrupts */ + cfblk->contin = 1; /* enable continuous mode */ + + /* Byte 2 */ + cfblk->addr_len = ETH_ALEN; + cfblk->acloc = 1; /* Disable source addr insertion by i82593 */ + cfblk->preamb_len = 2; /* 8 bytes preamble */ + cfblk->loopback = 0; /* Loopback off */ + + /* Byte 3 */ + cfblk->lin_prio = 0; /* Default priorities & backoff methods. */ + cfblk->tbofstop = 0; + cfblk->exp_prio = 0; + cfblk->bof_met = 0; + + /* Byte 4 */ + cfblk->ifrm_spc = 6; /* 96 bit times interframe spacing */ + + /* Byte 5 */ + cfblk->slottim_low = 0; /* 512 bit times slot time (low) */ + + /* Byte 6 */ + cfblk->slottim_hi = 2; /* 512 bit times slot time (high) */ + cfblk->max_retr = 15; /* 15 collisions retries */ + + /* Byte 7 */ + cfblk->prmisc = ((dev->flags & IFF_PROMISC) ? 1 : 0); /* Promiscuous mode */ + cfblk->bc_dis = 0; /* Enable broadcast reception */ + cfblk->crs_1 = 0; /* Don't transmit without carrier sense */ + cfblk->nocrc_ins = 0; /* i82593 generates CRC */ + cfblk->crc_1632 = 0; /* 32-bit Autodin-II CRC */ + cfblk->crs_cdt = 0; /* CD not to be interpreted as CS */ + + /* Byte 8 */ + cfblk->cs_filter = 0; /* CS is recognized immediately */ + cfblk->crs_src = 0; /* External carrier sense */ + cfblk->cd_filter = 0; /* CD is recognized immediately */ + + /* Byte 9 */ + cfblk->min_fr_len = 64 >> 2; /* Minimum frame length 64 bytes */ + + /* Byte A */ + cfblk->lng_typ = 1; /* Type/length checks OFF */ + cfblk->lng_fld = 1; /* Disable 802.3 length field check */ + cfblk->rxcrc_xf = 1; /* Don't transfer CRC to memory */ + cfblk->artx = 1; /* Disable automatic retransmission */ + cfblk->sarec = 1; /* Disable source addr trig of CD */ + cfblk->tx_jabber = 0; /* Disable jabber jam sequence */ + cfblk->hash_1 = 1; /* Use bits 0-5 in mc address hash */ + cfblk->lbpkpol = 0; /* Loopback pin active high */ + + /* Byte B */ + cfblk->fdx = 0; /* Disable full duplex operation */ + + /* Byte C */ + cfblk->dummy_6 = 0x3f; /* all ones, Default multicast addresses & backoff. */ + cfblk->mult_ia = 0; /* No multiple individual addresses */ + cfblk->dis_bof = 0; /* Disable the backoff algorithm ?! */ + + /* Byte D */ + cfblk->dummy_1 = 1; /* set to 1 */ + cfblk->tx_ifs_retrig = 3; /* Hmm... Disabled */ + cfblk->mc_all = (dev->mc_list || (dev->flags&IFF_ALLMULTI));/* multicast all mode */ + cfblk->rcv_mon = 0; /* Monitor mode disabled */ + cfblk->frag_acpt = 0; /* Do not accept fragments */ + cfblk->tstrttrs = 0; /* No start transmission threshold */ + + /* Byte E */ + cfblk->fretx = 1; /* FIFO automatic retransmission */ + cfblk->runt_eop = 0; /* drop "runt" packets */ + cfblk->hw_sw_pin = 0; /* ?? */ + cfblk->big_endn = 0; /* Big Endian ? no... */ + cfblk->syncrqs = 1; /* Synchronous DRQ deassertion... */ + cfblk->sttlen = 1; /* 6 byte status registers */ + cfblk->rx_eop = 0; /* Signal EOP on packet reception */ + cfblk->tx_eop = 0; /* Signal EOP on packet transmission */ + + /* Byte F */ + cfblk->rbuf_size = RX_BUF_SIZE >> 12; /* Set receive buffer size */ + cfblk->rcvstop = 1; /* Enable Receive Stop Register */ + + if (znet_debug > 2) { + int i; + unsigned char *c; + + for (i = 0, c = (char *) cfblk; i < sizeof (*cfblk); i++) + printk ("%02X ", c[i]); + printk ("\n"); + } + + *znet->tx_cur++ = sizeof(struct i82593_conf_block); + memcpy(znet->tx_cur, cfblk, sizeof(struct i82593_conf_block)); + znet->tx_cur += sizeof(struct i82593_conf_block)/2; + outb(OP0_CONFIGURE | CR0_CHNL, ioaddr); + + /* XXX FIXME maz : Add multicast adresses here, so having a + * multicast address configured isn't equal to IFF_ALLMULTI */ +} /* The Z-Note probe is pretty easy. The NETIDBLK exists in the safe-to-probe BIOS area. We just scan for the signature, and pull the vital parameters out of the structure. */ -int __init znet_probe(struct net_device *dev) +static int __init znet_probe (void) { int i; struct netidblk *netinfo; + struct znet_private *znet; + struct net_device *dev; char *p; + if (znet_dev) /* Only look for a single adaptor */ + return -ENODEV; + /* This code scans the region 0xf0000 to 0xfffff for a "NETIDBLK". */ for(p = (char *)phys_to_virt(0xf0000); p < (char *)phys_to_virt(0x100000); p++) if (*p == 'N' && strncmp(p, "NETIDBLK", 8) == 0) @@ -219,6 +384,13 @@ printk(KERN_INFO "No Z-Note ethernet adaptor found.\n"); return -ENODEV; } + + if (!(znet_dev = dev = init_etherdev(0, sizeof(struct znet_private)))) + return -ENOMEM; + + znet = dev->priv; + + SET_MODULE_OWNER (dev); netinfo = (struct netidblk *)p; dev->base_addr = netinfo->iobase1; dev->irq = netinfo->irq1; @@ -230,62 +402,67 @@ printk(" %2.2x", dev->dev_addr[i] = netinfo->netid[i]); printk(", using IRQ %d DMA %d and %d.\n", dev->irq, netinfo->dma1, - netinfo->dma2); + netinfo->dma2); if (znet_debug > 1) { printk(KERN_INFO "%s: vendor '%16.16s' IRQ1 %d IRQ2 %d DMA1 %d DMA2 %d.\n", - dev->name, netinfo->vendor, - netinfo->irq1, netinfo->irq2, - netinfo->dma1, netinfo->dma2); + dev->name, netinfo->vendor, + netinfo->irq1, netinfo->irq2, + netinfo->dma1, netinfo->dma2); printk(KERN_INFO "%s: iobase1 %#x size %d iobase2 %#x size %d net type %2.2x.\n", - dev->name, netinfo->iobase1, netinfo->iosize1, - netinfo->iobase2, netinfo->iosize2, netinfo->nettype); + dev->name, netinfo->iobase1, netinfo->iosize1, + netinfo->iobase2, netinfo->iosize2, netinfo->nettype); } if (znet_debug > 0) - printk("%s%s", KERN_INFO, version); + printk(KERN_INFO "%s", version); - dev->priv = (void *) &zn; - zn.rx_dma = netinfo->dma1; - zn.tx_dma = netinfo->dma2; - zn.lock = SPIN_LOCK_UNLOCKED; - - /* These should never fail. You can't add devices to a sealed box! */ - if (request_irq(dev->irq, &znet_interrupt, 0, "ZNet", dev) - || request_dma(zn.rx_dma,"ZNet rx") - || request_dma(zn.tx_dma,"ZNet tx")) { - printk(KERN_WARNING "%s: Not opened -- resource busy?!?\n", dev->name); - return -EBUSY; + znet->rx_dma = netinfo->dma1; + znet->tx_dma = netinfo->dma2; + znet->lock = SPIN_LOCK_UNLOCKED; + znet->sia_base = 0xe6; /* Magic address for the 82501 SIA */ + znet->sia_size = 2; + /* maz: Despite the '593 being advertised above as using a + * single 8bits I/O port, this driver does many 16bits + * access. So set io_size accordingly */ + znet->io_size = 2; + + if (!(znet->rx_start = kmalloc (DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA))) + goto free_netdev; + if (!(znet->tx_start = kmalloc (DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA))) + goto free_rx; + + if (!dma_page_eq (znet->rx_start, znet->rx_start + (RX_BUF_SIZE/2-1)) || + !dma_page_eq (znet->tx_start, znet->tx_start + (TX_BUF_SIZE/2-1))) { + printk (KERN_WARNING "tx/rx crossing DMA frontiers, giving up\n"); + goto free_tx; } - - /* Allocate buffer memory. We can cross a 128K boundary, so we - must be careful about the allocation. It's easiest to waste 8K. */ - if (dma_page_eq(dma_buffer1, &dma_buffer1[RX_BUF_SIZE/2-1])) - zn.rx_start = dma_buffer1; - else - zn.rx_start = dma_buffer2; - - if (dma_page_eq(dma_buffer3, &dma_buffer3[RX_BUF_SIZE/2-1])) - zn.tx_start = dma_buffer3; - else - zn.tx_start = dma_buffer2; - zn.rx_end = zn.rx_start + RX_BUF_SIZE/2; - zn.tx_buf_len = TX_BUF_SIZE/2; - zn.tx_end = zn.tx_start + zn.tx_buf_len; + + znet->rx_end = znet->rx_start + RX_BUF_SIZE/2; + znet->tx_buf_len = TX_BUF_SIZE/2; + znet->tx_end = znet->tx_start + znet->tx_buf_len; /* The ZNET-specific entries in the device structure. */ dev->open = &znet_open; dev->hard_start_xmit = &znet_send_packet; dev->stop = &znet_close; dev->get_stats = net_get_stats; - dev->set_multicast_list = &set_multicast_list; + dev->set_multicast_list = &znet_set_multicast_list; dev->tx_timeout = znet_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; - /* Fill in the 'dev' with ethernet-generic values. */ - ether_setup(dev); - return 0; + + free_tx: + kfree (znet->tx_start); + free_rx: + kfree (znet->rx_start); + free_netdev: + unregister_netdev (dev); + kfree (dev); + znet_dev = NULL; + + return -ENOMEM; } @@ -296,9 +473,14 @@ if (znet_debug > 2) printk(KERN_DEBUG "%s: znet_open() called.\n", dev->name); - /* Turn on the 82501 SIA, using zenith-specific magic. */ - outb(0x10, 0xe6); /* Select LAN control register */ - outb(inb(0xe7) | 0x84, 0xe7); /* Turn on LAN power (bit 2). */ + /* These should never fail. You can't add devices to a sealed box! */ + if (znet_request_resources (dev)) { + printk(KERN_WARNING "%s: Not opened -- resource busy?!?\n", dev->name); + return -EBUSY; + } + + znet_transceiver_power (dev, 1); + /* According to the Crynwr driver we should wait 50 msec. for the LAN clock to stabilize. My experiments indicates that the '593 can be initialized immediately. The delay is probably needed for the @@ -307,10 +489,17 @@ Until this proves to be a problem we rely on the higher layers for the delay and save allocating a timer entry. */ + /* maz : Well, I'm getting every time the following message + * without the delay on a 486@33. This machine is much too + * fast... :-) So maybe the Crynwr driver wasn't wrong after + * all, even if the message is completly harmless on my + * setup. */ + mdelay (50); + /* This follows the packet driver's lead, and checks for success. */ if (inb(ioaddr) != 0x10 && inb(ioaddr) != 0x00) printk(KERN_WARNING "%s: Problem turning on the transceiver power.\n", - dev->name); + dev->name); hardware_init(dev); netif_start_queue (dev); @@ -324,20 +513,20 @@ int ioaddr = dev->base_addr; ushort event, tx_status, rx_offset, state; - outb (CMD0_STAT0, ioaddr); + outb (CR0_STATUS_0, ioaddr); event = inb (ioaddr); - outb (CMD0_STAT1, ioaddr); + outb (CR0_STATUS_1, ioaddr); tx_status = inw (ioaddr); - outb (CMD0_STAT2, ioaddr); + outb (CR0_STATUS_2, ioaddr); rx_offset = inw (ioaddr); - outb (CMD0_STAT3, ioaddr); + outb (CR0_STATUS_3, ioaddr); state = inb (ioaddr); printk (KERN_WARNING "%s: transmit timed out, status %02x %04x %04x %02x," " resetting.\n", dev->name, event, tx_status, rx_offset, state); - if (tx_status == 0x0400) + if (tx_status == TX_LOST_CRS) printk (KERN_WARNING "%s: Tx carrier error, check transceiver cable.\n", dev->name); - outb (CMD0_RESET, ioaddr); + outb (OP0_RESET, ioaddr); hardware_init (dev); netif_wake_queue (dev); } @@ -345,7 +534,7 @@ static int znet_send_packet(struct sk_buff *skb, struct net_device *dev) { int ioaddr = dev->base_addr; - struct net_local *lp = (struct net_local *)dev->priv; + struct znet_private *znet = dev->priv; unsigned long flags; if (znet_debug > 4) @@ -354,7 +543,7 @@ netif_stop_queue (dev); /* Check that the part hasn't reset itself, probably from suspend. */ - outb(CMD0_STAT0, ioaddr); + outb(CR0_STATUS_0, ioaddr); if (inw(ioaddr) == 0x0010 && inw(ioaddr) == 0x0000 && inw(ioaddr) == 0x0010) @@ -363,44 +552,33 @@ if (1) { short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; unsigned char *buf = (void *)skb->data; - ushort *tx_link = zn.tx_cur - 1; + ushort *tx_link = znet->tx_cur - 1; ushort rnd_len = (length + 1)>>1; - lp->stats.tx_bytes+=length; - - { - short dma_port = ((zn.tx_dma&3)<<2) + IO_DMA2_BASE; - unsigned addr = inb(dma_port); - addr |= inb(dma_port) << 8; - addr <<= 1; - if (((int)zn.tx_cur & 0x1ffff) != addr) - printk(KERN_WARNING "Address mismatch at Tx: %#x vs %#x.\n", - (int)zn.tx_cur & 0xffff, addr); - zn.tx_cur = (ushort *)(((int)zn.tx_cur & 0xfe0000) | addr); - } + znet->stats.tx_bytes+=length; - if (zn.tx_cur >= zn.tx_end) - zn.tx_cur = zn.tx_start; - *zn.tx_cur++ = length; - if (zn.tx_cur + rnd_len + 1 > zn.tx_end) { - int semi_cnt = (zn.tx_end - zn.tx_cur)<<1; /* Cvrt to byte cnt. */ - memcpy(zn.tx_cur, buf, semi_cnt); + if (znet->tx_cur >= znet->tx_end) + znet->tx_cur = znet->tx_start; + *znet->tx_cur++ = length; + if (znet->tx_cur + rnd_len + 1 > znet->tx_end) { + int semi_cnt = (znet->tx_end - znet->tx_cur)<<1; /* Cvrt to byte cnt. */ + memcpy(znet->tx_cur, buf, semi_cnt); rnd_len -= semi_cnt>>1; - memcpy(zn.tx_start, buf + semi_cnt, length - semi_cnt); - zn.tx_cur = zn.tx_start + rnd_len; + memcpy(znet->tx_start, buf + semi_cnt, length - semi_cnt); + znet->tx_cur = znet->tx_start + rnd_len; } else { - memcpy(zn.tx_cur, buf, skb->len); - zn.tx_cur += rnd_len; + memcpy(znet->tx_cur, buf, skb->len); + znet->tx_cur += rnd_len; } - *zn.tx_cur++ = 0; + *znet->tx_cur++ = 0; - spin_lock_irqsave(&lp->lock, flags); + spin_lock_irqsave(&znet->lock, flags); { - *tx_link = CMD0_TRANSMIT + CMD0_CHNL_1; + *tx_link = OP0_TRANSMIT | CR0_CHNL; /* Is this always safe to do? */ - outb(CMD0_TRANSMIT + CMD0_CHNL_1,ioaddr); + outb(OP0_TRANSMIT | CR0_CHNL, ioaddr); } - spin_unlock_irqrestore (&lp->lock, flags); + spin_unlock_irqrestore (&znet->lock, flags); dev->trans_start = jiffies; netif_start_queue (dev); @@ -416,7 +594,7 @@ static void znet_interrupt(int irq, void *dev_id, struct pt_regs * regs) { struct net_device *dev = dev_id; - struct net_local *lp = (struct net_local *)dev->priv; + struct znet_private *znet = dev->priv; int ioaddr; int boguscnt = 20; @@ -425,73 +603,77 @@ return; } - spin_lock (&lp->lock); + spin_lock (&znet->lock); ioaddr = dev->base_addr; - outb(CMD0_STAT0, ioaddr); + outb(CR0_STATUS_0, ioaddr); do { ushort status = inb(ioaddr); if (znet_debug > 5) { ushort result, rx_ptr, running; - outb(CMD0_STAT1, ioaddr); + outb(CR0_STATUS_1, ioaddr); result = inw(ioaddr); - outb(CMD0_STAT2, ioaddr); + outb(CR0_STATUS_2, ioaddr); rx_ptr = inw(ioaddr); - outb(CMD0_STAT3, ioaddr); + outb(CR0_STATUS_3, ioaddr); running = inb(ioaddr); printk(KERN_DEBUG "%s: interrupt, status %02x, %04x %04x %02x serial %d.\n", dev->name, status, result, rx_ptr, running, boguscnt); } - if ((status & 0x80) == 0) + if ((status & SR0_INTERRUPT) == 0) break; - if ((status & 0x0F) == 4) { /* Transmit done. */ + if ((status & 0x0F) == SR0_TRANSMIT_DONE) { int tx_status; - outb(CMD0_STAT1, ioaddr); + outb(CR0_STATUS_1, ioaddr); tx_status = inw(ioaddr); /* It's undocumented, but tx_status seems to match the i82586. */ - if (tx_status & 0x2000) { - lp->stats.tx_packets++; - lp->stats.collisions += tx_status & 0xf; + if (tx_status & TX_OK) { + znet->stats.tx_packets++; + znet->stats.collisions += tx_status & TX_NCOL_MASK; } else { - if (tx_status & 0x0600) lp->stats.tx_carrier_errors++; - if (tx_status & 0x0100) lp->stats.tx_fifo_errors++; - if (!(tx_status & 0x0040)) lp->stats.tx_heartbeat_errors++; - if (tx_status & 0x0020) lp->stats.tx_aborted_errors++; + if (tx_status & (TX_LOST_CTS | TX_LOST_CRS)) + znet->stats.tx_carrier_errors++; + if (tx_status & TX_UND_RUN) + znet->stats.tx_fifo_errors++; + if (!(tx_status & TX_HRT_BEAT)) + znet->stats.tx_heartbeat_errors++; + if (tx_status & TX_MAX_COL) + znet->stats.tx_aborted_errors++; /* ...and the catch-all. */ - if ((tx_status | 0x0760) != 0x0760) - lp->stats.tx_errors++; + if ((tx_status | (TX_LOST_CRS | TX_LOST_CTS | TX_UND_RUN | TX_HRT_BEAT | TX_MAX_COL)) != (TX_LOST_CRS | TX_LOST_CTS | TX_UND_RUN | TX_HRT_BEAT | TX_MAX_COL)) + znet->stats.tx_errors++; } netif_wake_queue (dev); } - if ((status & 0x40) - || (status & 0x0f) == 11) { + if ((status & SR0_RECEPTION) || + (status & SR0_EVENT_MASK) == SR0_STOP_REG_HIT) { znet_rx(dev); } /* Clear the interrupts we've handled. */ - outb(CMD0_ACK,ioaddr); + outb(CR0_INT_ACK, ioaddr); } while (boguscnt--); - spin_unlock (&lp->lock); + spin_unlock (&znet->lock); return; } static void znet_rx(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct znet_private *znet = dev->priv; int ioaddr = dev->base_addr; int boguscount = 1; short next_frame_end_offset = 0; /* Offset of next frame start. */ short *cur_frame_end; short cur_frame_end_offset; - outb(CMD0_STAT2, ioaddr); + outb(CR0_STATUS_2, ioaddr); cur_frame_end_offset = inw(ioaddr); - if (cur_frame_end_offset == zn.rx_cur - zn.rx_start) { + if (cur_frame_end_offset == znet->rx_cur - znet->rx_start) { printk(KERN_WARNING "%s: Interrupted, but nothing to receive, offset %03x.\n", dev->name, cur_frame_end_offset); return; @@ -501,7 +683,7 @@ the same area of the backwards links we now have. This allows us to pass packets to the upper layers in the order they were received -- important for fast-path sequential operations. */ - while (zn.rx_start + cur_frame_end_offset != zn.rx_cur + while (znet->rx_start + cur_frame_end_offset != znet->rx_cur && ++boguscount < 5) { unsigned short hi_cnt, lo_cnt, hi_status, lo_status; int count, status; @@ -510,10 +692,10 @@ /* Oh no, we have a special case: the frame trailer wraps around the end of the ring buffer. We've saved space at the end of the ring buffer for just this problem. */ - memcpy(zn.rx_end, zn.rx_start, 8); + memcpy(znet->rx_end, znet->rx_start, 8); cur_frame_end_offset += (RX_BUF_SIZE/2); } - cur_frame_end = zn.rx_start + cur_frame_end_offset - 4; + cur_frame_end = znet->rx_start + cur_frame_end_offset - 4; lo_status = *cur_frame_end++; hi_status = *cur_frame_end++; @@ -538,7 +720,7 @@ /* Now step forward through the list. */ do { - ushort *this_rfp_ptr = zn.rx_start + next_frame_end_offset; + ushort *this_rfp_ptr = znet->rx_start + next_frame_end_offset; int status = this_rfp_ptr[-4]; int pkt_len = this_rfp_ptr[-2]; @@ -547,15 +729,20 @@ " next %04x.\n", next_frame_end_offset<<1, status, pkt_len, this_rfp_ptr[-3]<<1); /* Once again we must assume that the i82586 docs apply. */ - if ( ! (status & 0x2000)) { /* There was an error. */ - lp->stats.rx_errors++; - if (status & 0x0800) lp->stats.rx_crc_errors++; - if (status & 0x0400) lp->stats.rx_frame_errors++; - if (status & 0x0200) lp->stats.rx_over_errors++; /* Wrong. */ - if (status & 0x0100) lp->stats.rx_fifo_errors++; - if (status & 0x0080) lp->stats.rx_length_errors++; + if ( ! (status & RX_RCV_OK)) { /* There was an error. */ + znet->stats.rx_errors++; + if (status & RX_CRC_ERR) znet->stats.rx_crc_errors++; + if (status & RX_ALG_ERR) znet->stats.rx_frame_errors++; +#if 0 + if (status & 0x0200) znet->stats.rx_over_errors++; /* Wrong. */ + if (status & 0x0100) znet->stats.rx_fifo_errors++; +#else + /* maz : Wild guess... */ + if (status & RX_OVRRUN) znet->stats.rx_over_errors++; +#endif + if (status & RX_SRT_FRM) znet->stats.rx_length_errors++; } else if (pkt_len > 1536) { - lp->stats.rx_length_errors++; + znet->stats.rx_length_errors++; } else { /* Malloc up new buffer. */ struct sk_buff *skb; @@ -564,18 +751,18 @@ if (skb == NULL) { if (znet_debug) printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name); - lp->stats.rx_dropped++; + znet->stats.rx_dropped++; break; } skb->dev = dev; - if (&zn.rx_cur[(pkt_len+1)>>1] > zn.rx_end) { - int semi_cnt = (zn.rx_end - zn.rx_cur)<<1; - memcpy(skb_put(skb,semi_cnt), zn.rx_cur, semi_cnt); - memcpy(skb_put(skb,pkt_len-semi_cnt), zn.rx_start, + if (&znet->rx_cur[(pkt_len+1)>>1] > znet->rx_end) { + int semi_cnt = (znet->rx_end - znet->rx_cur)<<1; + memcpy(skb_put(skb,semi_cnt), znet->rx_cur, semi_cnt); + memcpy(skb_put(skb,pkt_len-semi_cnt), znet->rx_start, pkt_len - semi_cnt); } else { - memcpy(skb_put(skb,pkt_len), zn.rx_cur, pkt_len); + memcpy(skb_put(skb,pkt_len), znet->rx_cur, pkt_len); if (znet_debug > 6) { unsigned int *packet = (unsigned int *) skb->data; printk(KERN_DEBUG "Packet data is %08x %08x %08x %08x.\n", packet[0], @@ -585,17 +772,17 @@ skb->protocol=eth_type_trans(skb,dev); netif_rx(skb); dev->last_rx = jiffies; - lp->stats.rx_packets++; - lp->stats.rx_bytes += pkt_len; + znet->stats.rx_packets++; + znet->stats.rx_bytes += pkt_len; } - zn.rx_cur = this_rfp_ptr; - if (zn.rx_cur >= zn.rx_end) - zn.rx_cur -= RX_BUF_SIZE/2; - update_stop_hit(ioaddr, (zn.rx_cur - zn.rx_start)<<1); + znet->rx_cur = this_rfp_ptr; + if (znet->rx_cur >= znet->rx_end) + znet->rx_cur -= RX_BUF_SIZE/2; + update_stop_hit(ioaddr, (znet->rx_cur - znet->rx_start)<<1); next_frame_end_offset = this_rfp_ptr[-3]; if (next_frame_end_offset == 0) /* Read all the frames? */ break; /* Done for now */ - this_rfp_ptr = zn.rx_start + next_frame_end_offset; + this_rfp_ptr = znet->rx_start + next_frame_end_offset; } while (--boguscount); /* If any worth-while packets have been received, dev_rint() @@ -607,26 +794,19 @@ /* The inverse routine to znet_open(). */ static int znet_close(struct net_device *dev) { - unsigned long flags; int ioaddr = dev->base_addr; netif_stop_queue (dev); - outb(CMD0_RESET, ioaddr); /* CMD0_RESET */ - - flags=claim_dma_lock(); - disable_dma(zn.rx_dma); - disable_dma(zn.tx_dma); - release_dma_lock(flags); - - free_irq(dev->irq, dev); + outb(OP0_RESET, ioaddr); /* CMD0_RESET */ if (znet_debug > 1) printk(KERN_DEBUG "%s: Shutting down ethercard.\n", dev->name); /* Turn off transceiver power. */ - outb(0x10, 0xe6); /* Select LAN control register */ - outb(inb(0xe7) & ~0x84, 0xe7); /* Turn on LAN power (bit 2). */ - + znet_transceiver_power (dev, 0); + + znet_release_resources (dev); + return 0; } @@ -634,60 +814,30 @@ closed. */ static struct net_device_stats *net_get_stats(struct net_device *dev) { - struct net_local *lp = (struct net_local *)dev->priv; + struct znet_private *znet = dev->priv; - return &lp->stats; + return &znet->stats; } -/* Set or clear the multicast filter for this adaptor. - As a side effect this routine must also initialize the device parameters. - This is taken advantage of in open(). - - N.B. that we change i593_init[] in place. This (properly) makes the - mode change persistent, but must be changed if this code is moved to - a multiple adaptor environment. - */ -static void set_multicast_list(struct net_device *dev) +static void show_dma(struct net_device *dev) { short ioaddr = dev->base_addr; - - if (dev->flags&IFF_PROMISC) { - /* Enable promiscuous mode */ - i593_init[7] &= ~3; i593_init[7] |= 1; - i593_init[13] &= ~8; i593_init[13] |= 8; - } else if (dev->mc_list || (dev->flags&IFF_ALLMULTI)) { - /* Enable accept-all-multicast mode */ - i593_init[7] &= ~3; i593_init[7] |= 0; - i593_init[13] &= ~8; i593_init[13] |= 8; - } else { /* Enable normal mode. */ - i593_init[7] &= ~3; i593_init[7] |= 0; - i593_init[13] &= ~8; i593_init[13] |= 0; - } - *zn.tx_cur++ = sizeof(i593_init); - memcpy(zn.tx_cur, i593_init, sizeof(i593_init)); - zn.tx_cur += sizeof(i593_init)/2; - outb(CMD0_CONFIGURE+CMD0_CHNL_1, ioaddr); -#ifdef not_tested - if (num_addrs > 0) { - int addrs_len = 6*num_addrs; - *zn.tx_cur++ = addrs_len; - memcpy(zn.tx_cur, addrs, addrs_len); - outb(CMD0_MULTICAST_LIST+CMD0_CHNL_1, ioaddr); - zn.tx_cur += addrs_len>>1; - } -#endif -} - -void show_dma(void) -{ + unsigned char stat = inb (ioaddr); + struct znet_private *znet = dev->priv; unsigned long flags; - short dma_port = ((zn.tx_dma&3)<<2) + IO_DMA2_BASE; + short dma_port = ((znet->tx_dma&3)<<2) + IO_DMA2_BASE; unsigned addr = inb(dma_port); - addr |= inb(dma_port) << 8; + short residue; - flags=claim_dma_lock(); - printk("Addr: %04x cnt:%3x...", addr<<1, get_dma_residue(zn.tx_dma)); - release_dma_lock(flags); + addr |= inb(dma_port) << 8; + residue = get_dma_residue(znet->tx_dma); + + if (znet_debug > 1) { + flags=claim_dma_lock(); + printk(KERN_DEBUG "Stat:%02x Addr: %04x cnt:%3x\n", + stat, addr<<1, residue); + release_dma_lock(flags); + } } /* Initialize the hardware. We have to do this when the board is open()ed @@ -696,72 +846,78 @@ { unsigned long flags; short ioaddr = dev->base_addr; + struct znet_private *znet = dev->priv; - zn.rx_cur = zn.rx_start; - zn.tx_cur = zn.tx_start; + znet->rx_cur = znet->rx_start; + znet->tx_cur = znet->tx_start; /* Reset the chip, and start it up. */ - outb(CMD0_RESET, ioaddr); + outb(OP0_RESET, ioaddr); flags=claim_dma_lock(); - disable_dma(zn.rx_dma); /* reset by an interrupting task. */ - clear_dma_ff(zn.rx_dma); - set_dma_mode(zn.rx_dma, DMA_RX_MODE); - set_dma_addr(zn.rx_dma, (unsigned int) zn.rx_start); - set_dma_count(zn.rx_dma, RX_BUF_SIZE); - enable_dma(zn.rx_dma); + disable_dma(znet->rx_dma); /* reset by an interrupting task. */ + clear_dma_ff(znet->rx_dma); + set_dma_mode(znet->rx_dma, DMA_RX_MODE); + set_dma_addr(znet->rx_dma, (unsigned int) znet->rx_start); + set_dma_count(znet->rx_dma, RX_BUF_SIZE); + enable_dma(znet->rx_dma); /* Now set up the Tx channel. */ - disable_dma(zn.tx_dma); - clear_dma_ff(zn.tx_dma); - set_dma_mode(zn.tx_dma, DMA_TX_MODE); - set_dma_addr(zn.tx_dma, (unsigned int) zn.tx_start); - set_dma_count(zn.tx_dma, zn.tx_buf_len<<1); - enable_dma(zn.tx_dma); + disable_dma(znet->tx_dma); + clear_dma_ff(znet->tx_dma); + set_dma_mode(znet->tx_dma, DMA_TX_MODE); + set_dma_addr(znet->tx_dma, (unsigned int) znet->tx_start); + set_dma_count(znet->tx_dma, znet->tx_buf_len<<1); + enable_dma(znet->tx_dma); release_dma_lock(flags); if (znet_debug > 1) - printk(KERN_DEBUG "%s: Initializing the i82593, tx buf %p... ", dev->name, - zn.tx_start); + printk(KERN_DEBUG "%s: Initializing the i82593, rx buf %p tx buf %p\n", + dev->name, znet->rx_start,znet->tx_start); /* Do an empty configure command, just like the Crynwr driver. This resets to chip to its default values. */ - *zn.tx_cur++ = 0; - *zn.tx_cur++ = 0; - printk("stat:%02x ", inb(ioaddr)); show_dma(); - outb(CMD0_CONFIGURE+CMD0_CHNL_1, ioaddr); - *zn.tx_cur++ = sizeof(i593_init); - memcpy(zn.tx_cur, i593_init, sizeof(i593_init)); - zn.tx_cur += sizeof(i593_init)/2; - printk("stat:%02x ", inb(ioaddr)); show_dma(); - outb(CMD0_CONFIGURE+CMD0_CHNL_1, ioaddr); - *zn.tx_cur++ = 6; - memcpy(zn.tx_cur, dev->dev_addr, 6); - zn.tx_cur += 3; - printk("stat:%02x ", inb(ioaddr)); show_dma(); - outb(CMD0_IA_SETUP + CMD0_CHNL_1, ioaddr); - printk("stat:%02x ", inb(ioaddr)); show_dma(); + *znet->tx_cur++ = 0; + *znet->tx_cur++ = 0; + show_dma(dev); + outb(OP0_CONFIGURE | CR0_CHNL, ioaddr); + + znet_set_multicast_list (dev); + + *znet->tx_cur++ = 6; + memcpy(znet->tx_cur, dev->dev_addr, 6); + znet->tx_cur += 3; + show_dma(dev); + outb(OP0_IA_SETUP | CR0_CHNL, ioaddr); + show_dma(dev); update_stop_hit(ioaddr, 8192); - if (znet_debug > 1) printk("enabling Rx.\n"); - outb(CMD0_Rx_ENABLE+CMD0_CHNL_0, ioaddr); + if (znet_debug > 1) printk(KERN_DEBUG "enabling Rx.\n"); + outb(OP0_RCV_ENABLE, ioaddr); netif_start_queue (dev); } static void update_stop_hit(short ioaddr, unsigned short rx_stop_offset) { - outb(CMD0_PORT_1, ioaddr); + outb(OP0_SWIT_TO_PORT_1 | CR0_CHNL, ioaddr); if (znet_debug > 5) printk(KERN_DEBUG "Updating stop hit with value %02x.\n", - (rx_stop_offset >> 6) | 0x80); - outb((rx_stop_offset >> 6) | 0x80, ioaddr); - outb(CMD1_PORT_0, ioaddr); + (rx_stop_offset >> 6) | CR1_STOP_REG_UPDATE); + outb((rx_stop_offset >> 6) | CR1_STOP_REG_UPDATE, ioaddr); + outb(OP1_SWIT_TO_PORT_0, ioaddr); } - -/* - * Local variables: - * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c znet.c" - * version-control: t - * kept-new-versions: 5 - * c-indent-level: 4 - * tab-width: 4 - * End: - */ + +static __exit void znet_cleanup (void) +{ +#ifdef MODULE + if (znet_dev) { + struct znet_private *znet = znet_dev->priv; + + kfree (znet->rx_start); + kfree (znet->tx_start); + unregister_netdev (znet_dev); + kfree (znet_dev); + } +#endif +} + +module_init (znet_probe); +module_exit (znet_cleanup); diff -Nru a/drivers/scsi/3w-xxxx.h b/drivers/scsi/3w-xxxx.h --- a/drivers/scsi/3w-xxxx.h Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/3w-xxxx.h Mon Oct 28 16:32:36 2002 @@ -468,7 +468,6 @@ /* Scsi_Host_Template Initializer */ #define TWXXXX { \ - next : NULL, \ module : NULL, \ proc_name : "3w-xxxx", \ proc_info : tw_scsi_proc_info, \ diff -Nru a/drivers/scsi/53c7,8xx.c b/drivers/scsi/53c7,8xx.c --- a/drivers/scsi/53c7,8xx.c Mon Oct 28 16:32:35 2002 +++ b/drivers/scsi/53c7,8xx.c Mon Oct 28 16:32:35 2002 @@ -1153,7 +1153,6 @@ /* * Function : static int normal_init(Scsi_Host_Template *tpnt, int board, * int chip, u32 base, int io_port, int irq, int dma, int pcivalid, - * unsigned char pci_bus, unsigned char pci_device_fn, * struct pci_dev *pci_dev, long long options); * * Purpose : initializes a NCR53c7,8x0 based on base addresses, @@ -1161,7 +1160,7 @@ * * Useful where a new NCR chip is backwards compatible with * a supported chip, but the DEVICE ID has changed so it - * doesn't show up when the autoprobe does a pcibios_find_device. + * doesn't show up when the autoprobe does a pci_find_device. * * Inputs : tpnt - Template for this SCSI adapter, board - board level * product, chip - 810, 820, or 825, bus - PCI bus, device_fn - @@ -1174,7 +1173,6 @@ static int __init normal_init (Scsi_Host_Template *tpnt, int board, int chip, u32 base, int io_port, int irq, int dma, int pci_valid, - unsigned char pci_bus, unsigned char pci_device_fn, struct pci_dev *pci_dev, long long options) { struct Scsi_Host *instance; @@ -1275,8 +1273,7 @@ hostdata->board = board; hostdata->chip = chip; if ((hostdata->pci_valid = pci_valid)) { - hostdata->pci_bus = pci_bus; - hostdata->pci_device_fn = pci_device_fn; + hostdata->pci_dev = pci_dev; } /* @@ -1377,7 +1374,7 @@ * * Useful where a new NCR chip is backwards compatible with * a supported chip, but the DEVICE ID has changed so it - * doesn't show up when the autoprobe does a pcibios_find_device. + * doesn't show up when the autoprobe does a pci_find_device. * * Inputs : tpnt - Template for this SCSI adapter, board - board level * product, chip - 810, 820, or 825, bus - PCI bus, device_fn - @@ -1511,7 +1508,7 @@ } return normal_init (tpnt, board, chip, (int) base, io_port, - (int) irq, DMA_NONE, 1, bus, device_fn, pdev, options); + (int) irq, DMA_NONE, 1, pdev, options); } @@ -5085,8 +5082,7 @@ if ((hostdata->chip / 100) == 8) { save_flags (flags); cli(); - tmp = pcibios_read_config_word (hostdata->pci_bus, - hostdata->pci_device_fn, PCI_STATUS, &pci_status); + tmp = pci_read_config_word (hostdata->pcidev, PCI_STATUS, &pci_status); restore_flags (flags); if (tmp == PCIBIOS_SUCCESSFUL) { if (pci_status & PCI_STATUS_REC_TARGET_ABORT) { diff -Nru a/drivers/scsi/53c7,8xx.h b/drivers/scsi/53c7,8xx.h --- a/drivers/scsi/53c7,8xx.h Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/53c7,8xx.h Mon Oct 28 16:32:37 2002 @@ -1159,12 +1159,12 @@ 700-66, rest are last three digits of part number */ /* - * PCI bus, device, function, only for NCR53c8x0 chips. + * PCI device, only for NCR53c8x0 chips. * pci_valid indicates that the PCI configuration information * is valid, and we can twiddle MAX_LAT, etc. as recommended * for maximum performance in the NCR documentation. */ - unsigned char pci_bus, pci_device_fn; + struct pci_dev *pci_dev; unsigned pci_valid:1; u32 *dsp; /* dsp to restart with after diff -Nru a/drivers/scsi/Config.help b/drivers/scsi/Config.help --- a/drivers/scsi/Config.help Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/Config.help Mon Oct 28 16:32:37 2002 @@ -496,9 +496,27 @@ module, say M here and read . CONFIG_SCSI_GENERIC_NCR5380 - This is the generic NCR family of SCSI controllers, not to be - confused with the NCR 53c7 or 8xx controllers. It is explained in - section 3.8 of the SCSI-HOWTO, available from + This is a driver for the old NCR 53c80 series of SCSI controllers + on boards using PIO. Most boards such as the Trantor T130 fit this + category, along with a large number of ISA 8bit controllers shipped + for free with SCSI scanners. If you have a PAS16, T128 or DMX3191 + you should select the specific driver for that card rather than + generic 5380 support. + + It is explained in section 3.8 of the SCSI-HOWTO, available from + . If it doesn't work out + of the box, you may have to change some settings in + . + + This driver is also available as a module ( = code which can be + inserted in and removed from the running kernel whenever you want). + The module will be called g_NCR5380.o. If you want to compile it as + a module, say M here and read . + +CONFIG_SCSI_GENERIC_NCR5380_MMIO + This is a driver for the old NCR 53c80 series of SCSI controllers + on boards using memory mapped I/O. + It is explained in section 3.8 of the SCSI-HOWTO, available from . If it doesn't work out of the box, you may have to change some settings in . @@ -515,11 +533,6 @@ to pass a command line option to the kernel at boot time if it does not detect your card. See the file for details. - -CONFIG_SCSI_G_NCR5380_PORT - The NCR5380 and NCR53c400 SCSI controllers come in two varieties: - port or memory mapped. You should know what you have. The most - common card, Trantor T130B, uses port mapped mode. CONFIG_SCSI_NCR_D700 This is a driver for the MicroChannel Dual 700 card produced by diff -Nru a/drivers/scsi/Config.in b/drivers/scsi/Config.in --- a/drivers/scsi/Config.in Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/Config.in Mon Oct 28 16:32:36 2002 @@ -92,12 +92,10 @@ dep_tristate 'Future Domain MCS-600/700 SCSI support' CONFIG_SCSI_FD_MCS $CONFIG_SCSI fi dep_tristate 'Intel/ICP (former GDT SCSI Disk Array) RAID Controller support' CONFIG_SCSI_GDTH $CONFIG_SCSI -dep_tristate 'Generic NCR5380/53c400 SCSI support' CONFIG_SCSI_GENERIC_NCR5380 $CONFIG_SCSI +dep_tristate 'Generic NCR5380/53c400 SCSI PIO support' CONFIG_SCSI_GENERIC_NCR5380 $CONFIG_SCSI +dep_tristate 'Generic NCR5380/53c400 SCSI MMIO support' CONFIG_SCSI_GENERIC_NCR5380_MMIO $CONFIG_SCSI if [ "$CONFIG_SCSI_GENERIC_NCR5380" != "n" ]; then bool ' Enable NCR53c400 extensions' CONFIG_SCSI_GENERIC_NCR53C400 - choice 'NCR5380/53c400 mapping method (use Port for T130B)' \ - "Port CONFIG_SCSI_G_NCR5380_PORT \ - Memory CONFIG_SCSI_G_NCR5380_MEM" Port fi if [ "$CONFIG_MCA" = "y" ]; then dep_tristate 'IBMMCA SCSI support' CONFIG_SCSI_IBMMCA $CONFIG_SCSI diff -Nru a/drivers/scsi/Makefile b/drivers/scsi/Makefile --- a/drivers/scsi/Makefile Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/Makefile Mon Oct 28 16:32:37 2002 @@ -65,6 +65,7 @@ obj-$(CONFIG_SCSI_FUTURE_DOMAIN)+= fdomain.o obj-$(CONFIG_SCSI_IN2000) += in2000.o obj-$(CONFIG_SCSI_GENERIC_NCR5380) += g_NCR5380.o +obj-$(CONFIG_SCSI_GENERIC_NCR5380_MMIO) += g_NCR5380_mmio.o obj-$(CONFIG_SCSI_NCR53C406A) += NCR53c406a.o obj-$(CONFIG_SCSI_NCR_D700) += NCR_D700.o 53c700.o obj-$(CONFIG_SCSI_SYM53C416) += sym53c416.o diff -Nru a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c --- a/drivers/scsi/NCR5380.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/NCR5380.c Mon Oct 28 16:32:36 2002 @@ -1,6 +1,3 @@ -#ifndef NDEBUG -#define NDEBUG (NDEBUG_RESTART_SELECT | NDEBUG_ABORT) -#endif /* * NCR 5380 generic driver routines. These should make it *trivial* * to implement 5380 SCSI drivers under Linux with a non-trantor @@ -316,8 +313,8 @@ static int do_abort(struct Scsi_Host *host); static void do_reset(struct Scsi_Host *host); -static struct Scsi_Host *first_instance = NULL; -static Scsi_Host_Template *the_template = NULL; +static struct NCR5380_hostdata *first_host = NULL; +static struct NCR5380_hostdata *last_host = NULL; static struct timer_list usleep_timer; /* @@ -348,7 +345,18 @@ } } -#include +static struct { + unsigned char value; + const char *name; +} phases[] = { + {PHASE_DATAOUT, "DATAOUT"}, + {PHASE_DATAIN, "DATAIN"}, + {PHASE_CMDOUT, "CMDOUT"}, + {PHASE_STATIN, "STATIN"}, + {PHASE_MSGOUT, "MSGOUT"}, + {PHASE_MSGIN, "MSGIN"}, + {PHASE_UNKNOWN, "UNKNOWN"} +}; #ifdef NDEBUG static struct { @@ -430,18 +438,6 @@ printk("\n"); } -static struct { - unsigned char value; - const char *name; -} phases[] = { - {PHASE_DATAOUT, "DATAOUT"}, - {PHASE_DATAIN, "DATAIN"}, - {PHASE_CMDOUT, "CMDOUT"}, - {PHASE_STATIN, "STATIN"}, - {PHASE_MSGOUT, "MSGOUT"}, - {PHASE_MSGIN, "MSGIN"}, - {PHASE_UNKNOWN, "UNKNOWN"} -}; /* * NCR5380_print_phase - show SCSI phase @@ -470,44 +466,6 @@ #endif /* - * We need to have our coroutine active given these constraints : - * 1. The mutex flag, main_running, can only be set when the main - * routine can actually process data, otherwise SCSI commands - * will never get issued. - * - * 2. NCR5380_main() shouldn't be called before it has exited, because - * other drivers have had kernel stack overflows in similar - * situations. - * - * 3. We don't want to inline NCR5380_main() because of space concerns, - * even though it is only called in two places. - * - * So, the solution is to set the mutex in an inline wrapper for the - * main coroutine, and have the main coroutine exit with interrupts - * disabled after the final search through the queues so that no race - * conditions are possible. - */ - -static unsigned long main_running = 0; - -/* - * Function : run_main(void) - * - * Purpose : insure that the coroutine is running and will process our - * request. main_running is checked/set here (in an inline function) - * rather than in NCR5380_main itself to reduce the chances of stack - * overflow. - * FIXME: NCR5380_main should probably be run with schedule_task or be a - * thread. - */ - -static __inline__ void run_main(void) -{ - if (!test_and_set_bit(0, &main_running)) - NCR5380_main(); -} - -/* * These need tweaking, and would probably work best as per-device * flags initialized differently for disk, tape, cd, etc devices. * People with broken devices are free to experiment as to what gives @@ -621,13 +579,17 @@ static void NCR5380_timer_fn(unsigned long unused) { struct Scsi_Host *instance; + struct NCR5380_hostdata *hostdata; unsigned long flags; spin_lock_irqsave(&timer_lock, flags); - for (; expires_first && time_before_eq(((struct NCR5380_hostdata *) expires_first->hostdata)->time_expires, jiffies);) { - instance = ((struct NCR5380_hostdata *) expires_first->hostdata)->next_timer; - ((struct NCR5380_hostdata *) expires_first->hostdata)->next_timer = NULL; - ((struct NCR5380_hostdata *) expires_first->hostdata)->time_expires = 0; + for (; expires_first && time_before_eq(((struct NCR5380_hostdata *) expires_first->hostdata)->time_expires, jiffies);) + { + hostdata = (struct NCR5380_hostdata *) expires_first->hostdata; + schedule_work(&hostdata->coroutine); + instance = hostdata->next_timer; + hostdata->next_timer = NULL; + hostdata->time_expires = 0; expires_first = instance; } @@ -636,10 +598,7 @@ usleep_timer.expires = ((struct NCR5380_hostdata *) expires_first->hostdata)->time_expires; add_timer(&usleep_timer); } - spin_unlock_irqrestore(&timer_lock, flags); - - run_main(); } /** @@ -779,6 +738,22 @@ } /** + * NCR5380_coroutine_running - coroutine status + * @instance: controller to check + * + * Return true if the co-routine for this controller is running + * or scheduled to run + * + * FIXME: this test function belongs in the workqueue code! + */ + +static int NCR5380_coroutine_running(struct Scsi_Host *instance) +{ + struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *)instance->hostdata; + return test_bit(0, &hostdata->coroutine.pending); +} + +/** * NCR5380_print_status - dump controller info * @instance: controller to dump * @@ -794,7 +769,7 @@ char *start; int len; - printk("NCR5380 : coroutine is%s running.\n", main_running ? "" : "n't"); + printk("NCR5380 : coroutine is%s running.\n", NCR5380_coroutine_running(instance)? "" : "n't"); NCR5380_dprint(NDEBUG_ANY, instance); NCR5380_dprint_phase(NDEBUG_ANY, instance); @@ -837,7 +812,7 @@ struct NCR5380_hostdata *hostdata; Scsi_Cmnd *ptr; - for (instance = first_instance; instance && instance->host_no != hostno; instance = instance->next); + instance = scsi_host_hn_get(hostno); if (!instance) return (-ESRCH); hostdata = (struct NCR5380_hostdata *) instance->hostdata; @@ -881,7 +856,7 @@ SPRINTF("Highwater I/O busy_spin_counts -- write: %d read: %d\n", pas_wmaxi, pas_maxi); #endif spin_lock_irq(instance->host_lock); - SPRINTF("NCR5380 : coroutine is%s running.\n", main_running ? "" : "n't"); + SPRINTF("NCR5380 : coroutine is%s running.\n", NCR5380_coroutine_running(instance) ? "" : "n't"); if (!hostdata->connected) SPRINTF("scsi%d: no currently connected command\n", instance->host_no); else @@ -904,8 +879,7 @@ return length; } -static -char *lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, char *pos, char *buffer, int length) +static char *lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, char *pos, char *buffer, int length) { SPRINTF("scsi%d : destination target %d, lun %d\n", cmd->host->host_no, cmd->target, cmd->lun); SPRINTF(" command = "); @@ -913,8 +887,7 @@ return (pos); } -static -char *lprint_command(unsigned char *command, char *pos, char *buffer, int length) +static char *lprint_command(unsigned char *command, char *pos, char *buffer, int length) { int i, s; pos = lprint_opcode(command[0], pos, buffer, length); @@ -924,8 +897,7 @@ return (pos); } -static -char *lprint_opcode(int opcode, char *pos, char *buffer, int length) +static char *lprint_opcode(int opcode, char *pos, char *buffer, int length) { SPRINTF("%2d (0x%02x)", opcode, opcode); return (pos); @@ -943,10 +915,12 @@ * Notes : I assume that the host, hostno, and id bits have been * set correctly. I don't care about the irq and other fields. * + * Returns 0 for success + * * Locks: interrupts must be enabled when we are called */ -static void __init NCR5380_init(struct Scsi_Host *instance, int flags) +static int __init NCR5380_init(struct Scsi_Host *instance, int flags) { NCR5380_local_declare(); int i, pass; @@ -982,6 +956,9 @@ hostdata->connected = NULL; hostdata->issue_queue = NULL; hostdata->disconnected_queue = NULL; + + INIT_WORK(&hostdata->coroutine, NCR5380_main, hostdata); + #ifdef NCR5380_STATS for (i = 0; i < 8; ++i) { hostdata->time_read[i] = 0; @@ -1000,10 +977,16 @@ else hostdata->flags = FLAG_CHECK_LAST_BYTE_SENT | flags; - if (!the_template) { - the_template = instance->hostt; - first_instance = instance; - } + hostdata->next = NULL; + + if (!first_host) + first_host = hostdata; + else + last_host->next = hostdata; + + last_host = hostdata; + + hostdata->host = instance; hostdata->time_expires = 0; hostdata->next_timer = NULL; @@ -1041,22 +1024,28 @@ case 1: case 3: case 5: - printk("scsi%d: SCSI bus busy, waiting up to five seconds\n", instance->host_no); + printk(KERN_INFO "scsi%d: SCSI bus busy, waiting up to five seconds\n", instance->host_no); timeout = jiffies + 5 * HZ; - while (time_before(jiffies, timeout) && (NCR5380_read(STATUS_REG) & SR_BSY)); + while (time_before(jiffies, timeout) && (NCR5380_read(STATUS_REG) & SR_BSY)) + { + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(1); + } break; case 2: - printk("scsi%d: bus busy, attempting abort\n", instance->host_no); + printk(KERN_WARNING "scsi%d: bus busy, attempting abort\n", instance->host_no); do_abort(instance); break; case 4: - printk("scsi%d: bus busy, attempting reset\n", instance->host_no); + printk(KERN_WARNING "scsi%d: bus busy, attempting reset\n", instance->host_no); do_reset(instance); break; case 6: - printk("scsi%d: bus locked solid or invalid override\n", instance->host_no); + printk(KERN_ERR "scsi%d: bus locked solid or invalid override\n", instance->host_no); + return -ENXIO; } } + return 0; } /** @@ -1072,15 +1061,11 @@ * retake this lock. Called functions take dma lock. */ -/* Only make static if a wrapper function is used */ -#ifndef NCR5380_queue_command -static -#endif -int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) { +static int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) +{ struct Scsi_Host *instance = cmd->host; struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata; Scsi_Cmnd *tmp; - unsigned long flags; #if (NDEBUG & NDEBUG_NO_WRITE) switch (cmd->cmnd[0]) { @@ -1093,7 +1078,6 @@ } #endif /* (NDEBUG & NDEBUG_NO_WRITE) */ - spin_lock_irqsave(instance->host_lock, flags); #ifdef NCR5380_STATS switch (cmd->cmnd[0]) { case WRITE: @@ -1141,9 +1125,8 @@ dprintk(NDEBUG_QUEUES, ("scsi%d : command added to %s of queue\n", instance->host_no, (cmd->cmnd[0] == REQUEST_SENSE) ? "head" : "tail")); /* Run the coroutine if it isn't already running. */ - spin_unlock_irqrestore(instance->host_lock, flags); - - run_main(); + /* Kick off command processing */ + schedule_work(&hostdata->coroutine); return 0; } @@ -1155,21 +1138,22 @@ * NCR5380_queue_command() and NCR5380_intr() will try to start it * in case it is not running. * - * Locks; The caller must hold the io_request_lock. The lock will still be - * held on return but may be dropped while running. Called functions take - * the DMA lock. + * Locks: called as its own thread with no locks held. Takes the + * host lock and called routines may take the isa dma lock. */ -static void NCR5380_main(void) { +static void NCR5380_main(void *p) +{ + struct NCR5380_hostdata *hostdata = p; Scsi_Cmnd *tmp, *prev; struct Scsi_Host *instance; - struct NCR5380_hostdata *hostdata; int done; - + unsigned long flags; + /* * We run (with interrupts disabled) until we're sure that none of * the host adapters have anything that can be done, at which point - * we set main_running to 0 and exit. + * we can exit * * Interrupts are enabled before doing various other internal * instructions, after we've decided that we need to run through @@ -1178,113 +1162,112 @@ * this should prevent any race conditions. */ + instance = hostdata->host; + + spin_lock_irqsave(instance->host_lock, flags); + do { /* Lock held here */ done = 1; - for (instance = first_instance; instance && instance->hostt == the_template; instance = instance->next) { - hostdata = (struct NCR5380_hostdata *) instance->hostdata; - /* Lock held here */ - if (!hostdata->connected && !hostdata->selecting) { - dprintk(NDEBUG_MAIN, ("scsi%d : not connected\n", instance->host_no)); - /* - * Search through the issue_queue for a command destined - * for a target that's not busy. - */ - for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, prev = NULL; tmp; prev = tmp, tmp = (Scsi_Cmnd *) tmp->host_scribble) - { - if (prev != tmp) - dprintk(NDEBUG_LISTS, ("MAIN tmp=%p target=%d busy=%d lun=%d\n", tmp, tmp->target, hostdata->busy[tmp->target], tmp->lun)); - /* When we find one, remove it from the issue queue. */ - if (!(hostdata->busy[tmp->target] & (1 << tmp->lun))) { - if (prev) { - REMOVE(prev, prev->host_scribble, tmp, tmp->host_scribble); - prev->host_scribble = tmp->host_scribble; - } else { - REMOVE(-1, hostdata->issue_queue, tmp, tmp->host_scribble); - hostdata->issue_queue = (Scsi_Cmnd *) tmp->host_scribble; - } - tmp->host_scribble = NULL; - - - /* - * Attempt to establish an I_T_L nexus here. - * On success, instance->hostdata->connected is set. - * On failure, we must add the command back to the - * issue queue so we can keep trying. - */ - dprintk(NDEBUG_MAIN|NDEBUG_QUEUES, ("scsi%d : main() : command for target %d lun %d removed from issue_queue\n", instance->host_no, tmp->target, tmp->lun)); - - /* - * A successful selection is defined as one that - * leaves us with the command connected and - * in hostdata->connected, OR has terminated the - * command. - * - * With successful commands, we fall through - * and see if we can do an information transfer, - * with failures we will restart. - */ - hostdata->selecting = 0; - /* RvC: have to preset this to indicate a new command is being performed */ + if (!hostdata->connected && !hostdata->selecting) { + dprintk(NDEBUG_MAIN, ("scsi%d : not connected\n", instance->host_no)); + /* + * Search through the issue_queue for a command destined + * for a target that's not busy. + */ + for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, prev = NULL; tmp; prev = tmp, tmp = (Scsi_Cmnd *) tmp->host_scribble) + { + if (prev != tmp) + dprintk(NDEBUG_LISTS, ("MAIN tmp=%p target=%d busy=%d lun=%d\n", tmp, tmp->target, hostdata->busy[tmp->target], tmp->lun)); + /* When we find one, remove it from the issue queue. */ + if (!(hostdata->busy[tmp->target] & (1 << tmp->lun))) { + if (prev) { + REMOVE(prev, prev->host_scribble, tmp, tmp->host_scribble); + prev->host_scribble = tmp->host_scribble; + } else { + REMOVE(-1, hostdata->issue_queue, tmp, tmp->host_scribble); + hostdata->issue_queue = (Scsi_Cmnd *) tmp->host_scribble; + } + tmp->host_scribble = NULL; - if (!NCR5380_select(instance, tmp, - /* - * REQUEST SENSE commands are issued without tagged - * queueing, even on SCSI-II devices because the - * contingent allegiance condition exists for the - * entire unit. - */ - (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE : TAG_NEXT)) { - break; - } else { - LIST(tmp, hostdata->issue_queue); - tmp->host_scribble = (unsigned char *) hostdata->issue_queue; - hostdata->issue_queue = tmp; - done = 0; - dprintk(NDEBUG_MAIN|NDEBUG_QUEUES, ("scsi%d : main(): select() failed, returned to issue_queue\n", instance->host_no)); - } - /* lock held here still */ - } /* if target/lun is not busy */ - } /* for */ - /* exited locked */ - } /* if (!hostdata->connected) */ - if (hostdata->selecting) { - tmp = (Scsi_Cmnd *) hostdata->selecting; - /* Selection will drop and retake the lock */ - if (!NCR5380_select(instance, tmp, (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE : TAG_NEXT)) { - /* Ok ?? */ - } else { - /* RvC: device failed, so we wait a long time - this is needed for Mustek scanners, that - do not respond to commands immediately - after a scan */ - printk(KERN_DEBUG "scsi%d: device %d did not respond in time\n", instance->host_no, tmp->target); - //spin_lock_irq(&io_request_lock); - LIST(tmp, hostdata->issue_queue); - tmp->host_scribble = (unsigned char *) hostdata->issue_queue; - hostdata->issue_queue = tmp; - //spin_unlock_irq(&io_request_lock); - - hostdata->time_expires = jiffies + USLEEP_WAITLONG; - NCR5380_set_timer(instance); - } - } /* if hostdata->selecting */ - if (hostdata->connected + /* + * Attempt to establish an I_T_L nexus here. + * On success, instance->hostdata->connected is set. + * On failure, we must add the command back to the + * issue queue so we can keep trying. + */ + dprintk(NDEBUG_MAIN|NDEBUG_QUEUES, ("scsi%d : main() : command for target %d lun %d removed from issue_queue\n", instance->host_no, tmp->target, tmp->lun)); + + /* + * A successful selection is defined as one that + * leaves us with the command connected and + * in hostdata->connected, OR has terminated the + * command. + * + * With successful commands, we fall through + * and see if we can do an information transfer, + * with failures we will restart. + */ + hostdata->selecting = 0; + /* RvC: have to preset this to indicate a new command is being performed */ + + if (!NCR5380_select(instance, tmp, + /* + * REQUEST SENSE commands are issued without tagged + * queueing, even on SCSI-II devices because the + * contingent allegiance condition exists for the + * entire unit. + */ + (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE : TAG_NEXT)) { + break; + } else { + LIST(tmp, hostdata->issue_queue); + tmp->host_scribble = (unsigned char *) hostdata->issue_queue; + hostdata->issue_queue = tmp; + done = 0; + dprintk(NDEBUG_MAIN|NDEBUG_QUEUES, ("scsi%d : main(): select() failed, returned to issue_queue\n", instance->host_no)); + } + /* lock held here still */ + } /* if target/lun is not busy */ + } /* for */ + /* exited locked */ + } /* if (!hostdata->connected) */ + if (hostdata->selecting) { + tmp = (Scsi_Cmnd *) hostdata->selecting; + /* Selection will drop and retake the lock */ + if (!NCR5380_select(instance, tmp, (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE : TAG_NEXT)) { + /* Ok ?? */ + } else { + /* RvC: device failed, so we wait a long time + this is needed for Mustek scanners, that + do not respond to commands immediately + after a scan */ + printk(KERN_DEBUG "scsi%d: device %d did not respond in time\n", instance->host_no, tmp->target); + //spin_lock_irq(&io_request_lock); + LIST(tmp, hostdata->issue_queue); + tmp->host_scribble = (unsigned char *) hostdata->issue_queue; + hostdata->issue_queue = tmp; + //spin_unlock_irq(&io_request_lock); + + hostdata->time_expires = jiffies + USLEEP_WAITLONG; + NCR5380_set_timer(instance); + } + } /* if hostdata->selecting */ + if (hostdata->connected #ifdef REAL_DMA - && !hostdata->dmalen + && !hostdata->dmalen #endif - && (!hostdata->time_expires || time_before_eq(hostdata->time_expires, jiffies)) - ) { - dprintk(NDEBUG_MAIN, ("scsi%d : main() : performing information transfer\n", instance->host_no)); - NCR5380_information_transfer(instance); - dprintk(NDEBUG_MAIN, ("scsi%d : main() : done set false\n", instance->host_no)); - done = 0; - } else - break; - } /* for instance */ + && (!hostdata->time_expires || time_before_eq(hostdata->time_expires, jiffies)) + ) { + dprintk(NDEBUG_MAIN, ("scsi%d : main() : performing information transfer\n", instance->host_no)); + NCR5380_information_transfer(instance); + dprintk(NDEBUG_MAIN, ("scsi%d : main() : done set false\n", instance->host_no)); + done = 0; + } else + break; } while (!done); - /* Exit lock held */ - clear_bit(0, &main_running); + + spin_unlock_irqrestore(instance->host_lock, flags); } #ifndef DONT_USE_INTR @@ -1308,6 +1291,7 @@ struct Scsi_Host *instance; int done; unsigned char basr; + struct NCR5380_hostdata *hostdata; dprintk(NDEBUG_INTR, ("scsi : NCR5380 irq %d triggered\n", irq)); @@ -1315,8 +1299,9 @@ done = 1; /* The instance list is constant while the driver is loaded */ - for (instance = first_instance; instance && (instance->hostt == the_template); instance = instance->next) + for (hostdata = first_host; hostdata != NULL; hostdata = hostdata->next) { + instance = hostdata->host; if (instance->irq == irq) { spin_lock_irq(instance->host_lock); /* Look for pending interrupts */ @@ -1385,8 +1370,8 @@ } } /* if BASR_IRQ */ spin_unlock_irq(instance->host_lock); - if (!done) - run_main(); + if(!done) + schedule_work(&hostdata->coroutine); } /* if (instance->irq == irq) */ } } while (!done); diff -Nru a/drivers/scsi/NCR5380.h b/drivers/scsi/NCR5380.h --- a/drivers/scsi/NCR5380.h Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/NCR5380.h Mon Oct 28 16:32:37 2002 @@ -248,6 +248,8 @@ #ifndef ASM struct NCR5380_hostdata { NCR5380_implementation_fields; /* implementation specific */ + struct Scsi_Host *host; /* Host backpointer */ + struct NCR5380_hostdata *next; /* Next in our hot chain */ unsigned char id_mask, id_higher_mask; /* 1 << id, all bits greater */ unsigned char targets_present; /* targets we have connected to, so we can call a select @@ -269,6 +271,7 @@ struct Scsi_Host *next_timer; int select_time; /* timer in select for target response */ volatile Scsi_Cmnd *selecting; + struct work_struct coroutine; /* our co-routine */ #ifdef NCR5380_STATS unsigned timebase; /* Base for time calcs */ long time_read[8]; /* time to do reads */ @@ -281,7 +284,6 @@ }; #ifdef __KERNEL__ -static struct Scsi_Host *first_instance; /* linked list of 5380's */ #define dprintk(a,b) do {} while(0) #define NCR5380_dprint(a,b) do {} while(0) @@ -290,36 +292,22 @@ #if defined(AUTOPROBE_IRQ) static int NCR5380_probe_irq(struct Scsi_Host *instance, int possible); #endif -static void NCR5380_init(struct Scsi_Host *instance, int flags); +static int NCR5380_init(struct Scsi_Host *instance, int flags); static void NCR5380_information_transfer(struct Scsi_Host *instance); #ifndef DONT_USE_INTR static void NCR5380_intr(int irq, void *dev_id, struct pt_regs *regs); -static void do_NCR5380_intr(int irq, void *dev_id, struct pt_regs *regs); #endif -static void NCR5380_main(void); +static void NCR5380_main(void *ptr); static void NCR5380_print_options(struct Scsi_Host *instance); +#ifdef NDEBUG static void NCR5380_print_phase(struct Scsi_Host *instance); static void NCR5380_print(struct Scsi_Host *instance); -#ifndef NCR5380_abort -static #endif -int NCR5380_abort(Scsi_Cmnd * cmd); -#ifndef NCR5380_bus_reset -static -#endif -int NCR5380_bus_reset(Scsi_Cmnd * cmd); -#ifndef NCR5380_host_reset -static -#endif -int NCR5380_host_reset(Scsi_Cmnd * cmd); -#ifndef NCR5380_device_reset -static -#endif -int NCR5380_device_reset(Scsi_Cmnd * cmd); -#ifndef NCR5380_queue_command -static -#endif -int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)); +static int NCR5380_abort(Scsi_Cmnd * cmd); +static int NCR5380_bus_reset(Scsi_Cmnd * cmd); +static int NCR5380_host_reset(Scsi_Cmnd * cmd); +static int NCR5380_device_reset(Scsi_Cmnd * cmd); +static int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)); static void NCR5380_reselect(struct Scsi_Host *instance); diff -Nru a/drivers/scsi/NCR53c406a.c b/drivers/scsi/NCR53c406a.c --- a/drivers/scsi/NCR53c406a.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/NCR53c406a.c Mon Oct 28 16:32:36 2002 @@ -26,9 +26,9 @@ #define USE_PIO 1 #define USE_BIOS 0 -/* #define BIOS_ADDR 0xD8000 */ /* define this if autoprobe fails */ -/* #define PORT_BASE 0x330 */ /* define this if autoprobe fails */ -/* #define IRQ_LEV 0 */ /* define this if autoprobe fails */ + /* #define BIOS_ADDR 0xD8000 *//* define this if autoprobe fails */ + /* #define PORT_BASE 0x330 *//* define this if autoprobe fails */ + /* #define IRQ_LEV 0 *//* define this if autoprobe fails */ #define DMA_CHAN 5 /* this is ignored if DMA is disabled */ /* Set this to 0 if you encounter kernel lockups while transferring @@ -63,7 +63,7 @@ #define WATCHDOG 5000000 -#define SYNC_MODE 0 /* Synchronous transfer mode */ +#define SYNC_MODE 0 /* Synchronous transfer mode */ #if DEBUG #undef NCR53C406A_DEBUG @@ -161,24 +161,24 @@ /*----------------------------------------------------------------*/ enum Phase { - idle, - data_out, - data_in, - command_ph, - status_ph, - message_out, - message_in + idle, + data_out, + data_in, + command_ph, + status_ph, + message_out, + message_in }; /* Static function prototypes */ -static void NCR53c406a_intr(int, void *, struct pt_regs *); -static void do_NCR53c406a_intr(int, void *, struct pt_regs *); -static void internal_done(Scsi_Cmnd *); -static void wait_intr(void); -static void chip_init(void); -static void calc_port_addr(void); +static void NCR53c406a_intr(int, void *, struct pt_regs *); +static void do_NCR53c406a_intr(int, void *, struct pt_regs *); +static void internal_done(Scsi_Cmnd *); +static void wait_intr(void); +static void chip_init(void); +static void calc_port_addr(void); #ifndef IRQ_LEV -static int irq_probe(void); +static int irq_probe(void); #endif /* ================================================================= */ @@ -188,26 +188,26 @@ #endif #if PORT_BASE -static int port_base = PORT_BASE; +static int port_base = PORT_BASE; #else -static int port_base; +static int port_base; #endif #if IRQ_LEV -static int irq_level = IRQ_LEV; +static int irq_level = IRQ_LEV; #else -static int irq_level = -1; /* 0 is 'no irq', so use -1 for 'uninitialized'*/ +static int irq_level = -1; /* 0 is 'no irq', so use -1 for 'uninitialized' */ #endif #if USE_DMA -static int dma_chan; +static int dma_chan; #endif #if USE_PIO -static int fast_pio = USE_FAST_PIO; +static int fast_pio = USE_FAST_PIO; #endif -static Scsi_Cmnd *current_SC; +static Scsi_Cmnd *current_SC; static volatile int internal_done_flag; static volatile int internal_done_errcode; static char info_msg[256]; @@ -217,15 +217,14 @@ /* possible BIOS locations */ #if USE_BIOS static void *addresses[] = { - (void *)0xd8000, - (void *)0xc8000 + (void *) 0xd8000, + (void *) 0xc8000 }; #define ADDRESS_COUNT (sizeof( addresses ) / sizeof( unsigned )) -#endif /* USE_BIOS */ - +#endif /* USE_BIOS */ + /* possible i/o port addresses */ -static unsigned short ports[] = - { 0x230, 0x330, 0x280, 0x290, 0x330, 0x340, 0x300, 0x310, 0x348, 0x350 }; +static unsigned short ports[] = { 0x230, 0x330, 0x280, 0x290, 0x330, 0x340, 0x300, 0x310, 0x348, 0x350 }; #define PORT_COUNT (sizeof( ports ) / sizeof( unsigned short )) /* possible interrupt channels */ @@ -235,847 +234,835 @@ /* signatures for NCR 53c406a based controllers */ #if USE_BIOS struct signature { - char *signature; - int sig_offset; - int sig_length; + char *signature; + int sig_offset; + int sig_length; } signatures[] __initdata = { - /* 1 2 3 4 5 6 */ - /* 123456789012345678901234567890123456789012345678901234567890 */ - { "Copyright (C) Acculogic, Inc.\r\n2.8M Diskette Extension Bios ver 4.04.03 03/01/1993", 61, 82 }, -}; + /* 1 2 3 4 5 6 */ + /* 123456789012345678901234567890123456789012345678901234567890 */ + { +"Copyright (C) Acculogic, Inc.\r\n2.8M Diskette Extension Bios ver 4.04.03 03/01/1993", 61, 82},}; + #define SIGNATURE_COUNT (sizeof( signatures ) / sizeof( struct signature )) -#endif /* USE_BIOS */ +#endif /* USE_BIOS */ /* ============================================================ */ /* Control Register Set 0 */ -static int TC_LSB; /* transfer counter lsb */ -static int TC_MSB; /* transfer counter msb */ -static int SCSI_FIFO; /* scsi fifo register */ -static int CMD_REG; /* command register */ -static int STAT_REG; /* status register */ +static int TC_LSB; /* transfer counter lsb */ +static int TC_MSB; /* transfer counter msb */ +static int SCSI_FIFO; /* scsi fifo register */ +static int CMD_REG; /* command register */ +static int STAT_REG; /* status register */ static int DEST_ID; /* selection/reselection bus id */ static int INT_REG; /* interrupt status register */ static int SRTIMOUT; /* select/reselect timeout reg */ -static int SEQ_REG; /* sequence step register */ +static int SEQ_REG; /* sequence step register */ static int SYNCPRD; /* synchronous transfer period */ static int FIFO_FLAGS; /* indicates # of bytes in fifo */ static int SYNCOFF; /* synchronous offset register */ -static int CONFIG1; /* configuration register */ -static int CLKCONV; /* clock conversion reg */ -/*static int TESTREG;*/ /* test mode register */ +static int CONFIG1; /* configuration register */ +static int CLKCONV; /* clock conversion reg */ + /*static int TESTREG;*//* test mode register */ static int CONFIG2; /* Configuration 2 Register */ -static int CONFIG3; /* Configuration 3 Register */ +static int CONFIG3; /* Configuration 3 Register */ static int CONFIG4; /* Configuration 4 Register */ static int TC_HIGH; /* Transfer Counter High */ -/*static int FIFO_BOTTOM;*/ /* Reserve FIFO byte register */ + /*static int FIFO_BOTTOM;*//* Reserve FIFO byte register */ /* Control Register Set 1 */ -/*static int JUMPER_SENSE;*/ /* Jumper sense port reg (r/w) */ -/*static int SRAM_PTR;*/ /* SRAM address pointer reg (r/w) */ -/*static int SRAM_DATA;*/ /* SRAM data register (r/w) */ + /*static int JUMPER_SENSE;*//* Jumper sense port reg (r/w) */ + /*static int SRAM_PTR;*//* SRAM address pointer reg (r/w) */ + /*static int SRAM_DATA;*//* SRAM data register (r/w) */ static int PIO_FIFO; /* PIO FIFO registers (r/w) */ -/*static int PIO_FIFO1;*/ /* */ -/*static int PIO_FIFO2;*/ /* */ -/*static int PIO_FIFO3;*/ /* */ + /*static int PIO_FIFO1;*//* */ + /*static int PIO_FIFO2;*//* */ + /*static int PIO_FIFO3;*//* */ static int PIO_STATUS; /* PIO status (r/w) */ -/*static int ATA_CMD;*/ /* ATA command/status reg (r/w) */ -/*static int ATA_ERR;*/ /* ATA features/error register (r/w)*/ + /*static int ATA_CMD;*//* ATA command/status reg (r/w) */ + /*static int ATA_ERR;*//* ATA features/error register (r/w) */ static int PIO_FLAG; /* PIO flag interrupt enable (r/w) */ static int CONFIG5; /* Configuration 5 register (r/w) */ -/*static int SIGNATURE;*/ /* Signature Register (r) */ -/*static int CONFIG6;*/ /* Configuration 6 register (r) */ + /*static int SIGNATURE;*//* Signature Register (r) */ + /*static int CONFIG6;*//* Configuration 6 register (r) */ /* ============================================================== */ #if USE_DMA -static __inline__ int -NCR53c406a_dma_setup (unsigned char *ptr, - unsigned int count, - unsigned char mode) { - unsigned limit; - unsigned long flags = 0; - - VDEB(printk("dma: before count=%d ", count)); - if (dma_chan <=3) { - if (count > 65536) - count = 65536; - limit = 65536 - (((unsigned) ptr) & 0xFFFF); - } else { - if (count > (65536<<1)) - count = (65536<<1); - limit = (65536<<1) - (((unsigned) ptr) & 0x1FFFF); - } - - if (count > limit) count = limit; - - VDEB(printk("after count=%d\n", count)); - if ((count & 1) || (((unsigned) ptr) & 1)) - panic ("NCR53c406a: attempted unaligned DMA transfer\n"); - - flags=claim_dma_lock(); - disable_dma(dma_chan); - clear_dma_ff(dma_chan); - set_dma_addr(dma_chan, (long) ptr); - set_dma_count(dma_chan, count); - set_dma_mode(dma_chan, mode); - enable_dma(dma_chan); - release_dma_lock(flags); - - return count; -} - -static __inline__ int -NCR53c406a_dma_write(unsigned char *src, unsigned int count) { - return NCR53c406a_dma_setup (src, count, DMA_MODE_WRITE); -} - -static __inline__ int -NCR53c406a_dma_read(unsigned char *src, unsigned int count) { - return NCR53c406a_dma_setup (src, count, DMA_MODE_READ); -} - -static __inline__ int -NCR53c406a_dma_residual (void) { - register int tmp; - unsigned long flags; - - flags=claim_dma_lock(); - clear_dma_ff(dma_chan); - tmp = get_dma_residue(dma_chan); - release_dma_lock(flags); - - return tmp; +static __inline__ int NCR53c406a_dma_setup(unsigned char *ptr, unsigned int count, unsigned char mode) +{ + unsigned limit; + unsigned long flags = 0; + + VDEB(printk("dma: before count=%d ", count)); + if (dma_chan <= 3) { + if (count > 65536) + count = 65536; + limit = 65536 - (((unsigned) ptr) & 0xFFFF); + } else { + if (count > (65536 << 1)) + count = (65536 << 1); + limit = (65536 << 1) - (((unsigned) ptr) & 0x1FFFF); + } + + if (count > limit) + count = limit; + + VDEB(printk("after count=%d\n", count)); + if ((count & 1) || (((unsigned) ptr) & 1)) + panic("NCR53c406a: attempted unaligned DMA transfer\n"); + + flags = claim_dma_lock(); + disable_dma(dma_chan); + clear_dma_ff(dma_chan); + set_dma_addr(dma_chan, (long) ptr); + set_dma_count(dma_chan, count); + set_dma_mode(dma_chan, mode); + enable_dma(dma_chan); + release_dma_lock(flags); + + return count; +} + +static __inline__ int NCR53c406a_dma_write(unsigned char *src, unsigned int count) +{ + return NCR53c406a_dma_setup(src, count, DMA_MODE_WRITE); } -#endif /* USE_DMA */ + +static __inline__ int NCR53c406a_dma_read(unsigned char *src, unsigned int count) +{ + return NCR53c406a_dma_setup(src, count, DMA_MODE_READ); +} + +static __inline__ int NCR53c406a_dma_residual(void) +{ + register int tmp; + unsigned long flags; + + flags = claim_dma_lock(); + clear_dma_ff(dma_chan); + tmp = get_dma_residue(dma_chan); + release_dma_lock(flags); + + return tmp; +} +#endif /* USE_DMA */ #if USE_PIO -static __inline__ int NCR53c406a_pio_read(unsigned char *request, - unsigned int reqlen) +static __inline__ int NCR53c406a_pio_read(unsigned char *request, unsigned int reqlen) +{ + int i; + int len; /* current scsi fifo size */ + + REG1; + while (reqlen) { + i = inb(PIO_STATUS); + /* VDEB(printk("pio_status=%x\n", i)); */ + if (i & 0x80) + return 0; + + switch (i & 0x1e) { + default: + case 0x10: + len = 0; + break; + case 0x0: + len = 1; + break; + case 0x8: + len = 42; + break; + case 0xc: + len = 84; + break; + case 0xe: + len = 128; + break; + } + + if ((i & 0x40) && len == 0) { /* fifo empty and interrupt occurred */ + return 0; + } + + if (len) { + if (len > reqlen) + len = reqlen; + + if (fast_pio && len > 3) { + insl(PIO_FIFO, request, len >> 2); + request += len & 0xfc; + reqlen -= len & 0xfc; + } else { + while (len--) { + *request++ = inb(PIO_FIFO); + reqlen--; + } + } + } + } + return 0; +} + +static __inline__ int NCR53c406a_pio_write(unsigned char *request, unsigned int reqlen) { - int i; - int len; /* current scsi fifo size */ - unsigned long flags = 0; - - REG1; - while (reqlen) { - i = inb(PIO_STATUS); - /* VDEB(printk("pio_status=%x\n", i)); */ - if (i & 0x80) - return 0; - - switch( i & 0x1e ) { - default: - case 0x10: - len=0; break; - case 0x0: - len=1; break; - case 0x8: - len=42; break; - case 0xc: - len=84; break; - case 0xe: - len=128; break; - } - - if ((i & 0x40) && len == 0) { /* fifo empty and interrupt occurred */ - return 0; - } - - if (len) { - if( len > reqlen ) - len = reqlen; - - save_flags(flags); - cli(); - if( fast_pio && len > 3 ) { - insl(PIO_FIFO,request,len>>2); - request += len & 0xfc; - reqlen -= len & 0xfc; - } - else { - while(len--) { - *request++ = inb(PIO_FIFO); - reqlen--; - } - } - restore_flags(flags); - } - } - return 0; -} - -static __inline__ int NCR53c406a_pio_write(unsigned char *request, - unsigned int reqlen) -{ - int i = 0; - int len; /* current scsi fifo size */ - unsigned long flags = 0; - - REG1; - while (reqlen && !(i&0x40)) { - i = inb(PIO_STATUS); - /* VDEB(printk("pio_status=%x\n", i)); */ - if (i & 0x80) /* error */ - return 0; - - switch( i & 0x1e ) { - case 0x10: - len=128; break; - case 0x0: - len=84; break; - case 0x8: - len=42; break; - case 0xc: - len=1; break; - default: - case 0xe: - len=0; break; - } - - if (len) { - if( len > reqlen ) - len = reqlen; - - save_flags(flags); - cli(); - if( fast_pio && len > 3 ) { - outsl(PIO_FIFO,request,len>>2); - request += len & 0xfc; - reqlen -= len & 0xfc; - } - else { - while(len--) { - outb(*request++, PIO_FIFO); - reqlen--; - } - } - restore_flags(flags); - } - } - return 0; -} -#endif /* USE_PIO */ - -int __init -NCR53c406a_detect(Scsi_Host_Template * tpnt){ - struct Scsi_Host *shpnt = NULL; + int i = 0; + int len; /* current scsi fifo size */ + + REG1; + while (reqlen && !(i & 0x40)) { + i = inb(PIO_STATUS); + /* VDEB(printk("pio_status=%x\n", i)); */ + if (i & 0x80) /* error */ + return 0; + + switch (i & 0x1e) { + case 0x10: + len = 128; + break; + case 0x0: + len = 84; + break; + case 0x8: + len = 42; + break; + case 0xc: + len = 1; + break; + default: + case 0xe: + len = 0; + break; + } + + if (len) { + if (len > reqlen) + len = reqlen; + + if (fast_pio && len > 3) { + outsl(PIO_FIFO, request, len >> 2); + request += len & 0xfc; + reqlen -= len & 0xfc; + } else { + while (len--) { + outb(*request++, PIO_FIFO); + reqlen--; + } + } + } + } + return 0; +} +#endif /* USE_PIO */ + +static int __init NCR53c406a_detect(Scsi_Host_Template * tpnt) +{ + struct Scsi_Host *shpnt = NULL; #ifndef PORT_BASE - int i; + int i; #endif - + #if USE_BIOS - int ii, jj; - bios_base = 0; - /* look for a valid signature */ - for( ii=0; ii < ADDRESS_COUNT && !bios_base; ii++) - for( jj=0; (jj < SIGNATURE_COUNT) && !bios_base; jj++) - if(!memcmp((void *) addresses[ii]+signatures[jj].sig_offset, - (void *) signatures[jj].signature, - (int) signatures[jj].sig_length)) - bios_base=addresses[ii]; - - if(!bios_base){ - printk("NCR53c406a: BIOS signature not found\n"); - return 0; - } - - DEB(printk("NCR53c406a BIOS found at %X\n", (unsigned int) bios_base);); -#endif /* USE_BIOS */ - + int ii, jj; + bios_base = 0; + /* look for a valid signature */ + for (ii = 0; ii < ADDRESS_COUNT && !bios_base; ii++) + for (jj = 0; (jj < SIGNATURE_COUNT) && !bios_base; jj++) + if (!memcmp((void *) addresses[ii] + signatures[jj].sig_offset, (void *) signatures[jj].signature, (int) signatures[jj].sig_length)) + bios_base = addresses[ii]; + + if (!bios_base) { + printk("NCR53c406a: BIOS signature not found\n"); + return 0; + } + + DEB(printk("NCR53c406a BIOS found at %X\n", (unsigned int) bios_base); + ); +#endif /* USE_BIOS */ + #ifdef PORT_BASE - if (!request_region(port_base, 0x10, "NCR53c406a")) /* ports already snatched */ - port_base = 0; - -#else /* autodetect */ - if (port_base) { /* LILO override */ - if (!request_region(port_base, 0x10, "NCR53c406a")) - port_base = 0; - } - else { - for(i=0; i= 0*/ - irq_level=irq_probe(); - if (irq_level < 0) { /* Trouble */ - printk("NCR53c406a: IRQ problem, irq_level=%d, giving up\n", irq_level); - goto err_release; - } - } -#endif - - DEB(printk("NCR53c406a: using port_base %x\n", port_base)); - - tpnt->present = 1; - tpnt->proc_name = "NCR53c406a"; - - shpnt = scsi_register(tpnt, 0); - if (!shpnt) { - printk("NCR53c406a: Unable to register host, giving up.\n"); - goto err_release; - } - - if(irq_level > 0) { - if(request_irq(irq_level, do_NCR53c406a_intr, 0, "NCR53c406a", shpnt)){ - printk("NCR53c406a: unable to allocate IRQ %d\n", irq_level); - goto err_free_scsi; - } - tpnt->can_queue = 1; - DEB(printk("NCR53c406a: allocated IRQ %d\n", irq_level)); - } - else if (irq_level == 0) { - tpnt->can_queue = 0; - DEB(printk("NCR53c406a: No interrupts detected\n")); + if (irq_level < 0) { /* LILO override if >= 0 */ + irq_level = irq_probe(); + if (irq_level < 0) { /* Trouble */ + printk("NCR53c406a: IRQ problem, irq_level=%d, giving up\n", irq_level); + goto err_release; + } + } +#endif + + DEB(printk("NCR53c406a: using port_base %x\n", port_base)); + + tpnt->present = 1; + tpnt->proc_name = "NCR53c406a"; + + shpnt = scsi_register(tpnt, 0); + if (!shpnt) { + printk("NCR53c406a: Unable to register host, giving up.\n"); + goto err_release; + } + + if (irq_level > 0) { + if (request_irq(irq_level, do_NCR53c406a_intr, 0, "NCR53c406a", shpnt)) { + printk("NCR53c406a: unable to allocate IRQ %d\n", irq_level); + goto err_free_scsi; + } + tpnt->can_queue = 1; + DEB(printk("NCR53c406a: allocated IRQ %d\n", irq_level)); + } else if (irq_level == 0) { + tpnt->can_queue = 0; + DEB(printk("NCR53c406a: No interrupts detected\n")); #if USE_DMA - printk("NCR53c406a: No interrupts found and DMA mode defined. Giving up.\n"); - goto err_free_scsi; -#endif /* USE_DMA */ - } - else { - DEB(printk("NCR53c406a: Shouldn't get here!\n")); - goto err_free_scsi; - } - + printk("NCR53c406a: No interrupts found and DMA mode defined. Giving up.\n"); + goto err_free_scsi; +#endif /* USE_DMA */ + } else { + DEB(printk("NCR53c406a: Shouldn't get here!\n")); + goto err_free_scsi; + } + #if USE_DMA - dma_chan = DMA_CHAN; - if(request_dma(dma_chan, "NCR53c406a") != 0){ - printk("NCR53c406a: unable to allocate DMA channel %d\n", dma_chan); - goto err_free_irq; - } - - DEB(printk("Allocated DMA channel %d\n", dma_chan)); -#endif /* USE_DMA */ - - shpnt->irq = irq_level; - shpnt->io_port = port_base; - shpnt->n_io_port = 0x10; + dma_chan = DMA_CHAN; + if (request_dma(dma_chan, "NCR53c406a") != 0) { + printk("NCR53c406a: unable to allocate DMA channel %d\n", dma_chan); + goto err_free_irq; + } + + DEB(printk("Allocated DMA channel %d\n", dma_chan)); +#endif /* USE_DMA */ + + shpnt->irq = irq_level; + shpnt->io_port = port_base; + shpnt->n_io_port = 0x10; #if USE_DMA - shpnt->dma = dma_chan; + shpnt->dma = dma_chan; #endif - + #if USE_DMA - sprintf(info_msg, "NCR53c406a at 0x%x, IRQ %d, DMA channel %d.", - port_base, irq_level, dma_chan); + sprintf(info_msg, "NCR53c406a at 0x%x, IRQ %d, DMA channel %d.", port_base, irq_level, dma_chan); #else - sprintf(info_msg, "NCR53c406a at 0x%x, IRQ %d, %s PIO mode.", - port_base, irq_level, fast_pio ? "fast" : "slow"); + sprintf(info_msg, "NCR53c406a at 0x%x, IRQ %d, %s PIO mode.", port_base, irq_level, fast_pio ? "fast" : "slow"); #endif - - return (tpnt->present); + + return (tpnt->present); #if USE_DMA - err_free_irq: - if(irq_level) - free_irq(irq_level, shpnt); -#endif - err_free_scsi: - scsi_unregister(shpnt); - err_release: - release_region(port_base, 0x10); - return 0; + err_free_irq: + if (irq_level) + free_irq(irq_level, shpnt); +#endif + err_free_scsi: + scsi_unregister(shpnt); + err_release: + release_region(port_base, 0x10); + return 0; } /* called from init/main.c */ -void __init NCR53c406a_setup(char *str, int *ints) +static void __init NCR53c406a_setup(char *str, int *ints) +{ + static size_t setup_idx = 0; + size_t i; + + DEB(printk("NCR53c406a: Setup called\n"); + ); + + if (setup_idx >= PORT_COUNT - 1) { + printk("NCR53c406a: Setup called too many times. Bad LILO params?\n"); + return; + } + if (ints[0] < 1 || ints[0] > 3) { + printk("NCR53c406a: Malformed command line\n"); + printk("NCR53c406a: Usage: ncr53c406a=[,[,]]\n"); + return; + } + for (i = 0; i < PORT_COUNT && !port_base; i++) + if (ports[i] == ints[1]) { + port_base = ints[1]; + DEB(printk("NCR53c406a: Specified port_base 0x%X\n", port_base); + ) + } + if (!port_base) { + printk("NCR53c406a: Invalid PORTBASE 0x%X specified\n", ints[1]); + return; + } + + if (ints[0] > 1) { + if (ints[2] == 0) { + irq_level = 0; + DEB(printk("NCR53c406a: Specified irq %d\n", irq_level); + ) + } else + for (i = 0; i < INTR_COUNT && irq_level < 0; i++) + if (intrs[i] == ints[2]) { + irq_level = ints[2]; + DEB(printk("NCR53c406a: Specified irq %d\n", port_base); + ) + } + if (irq_level < 0) + printk("NCR53c406a: Invalid IRQ %d specified\n", ints[2]); + } + + if (ints[0] > 2) + fast_pio = ints[3]; + + DEB(printk("NCR53c406a: port_base=0x%X, irq=%d, fast_pio=%d\n", port_base, irq_level, fast_pio);) +} + +__setup("ncr53c406a=", NCR53c406a_setup); + +static const char *NCR53c406a_info(struct Scsi_Host *SChost) +{ + DEB(printk("NCR53c406a_info called\n")); + return (info_msg); +} + +static void internal_done(Scsi_Cmnd * SCpnt) +{ + internal_done_errcode = SCpnt->result; + ++internal_done_flag; +} + + +static void wait_intr(void) { - static size_t setup_idx = 0; - size_t i; - - DEB(printk("NCR53c406a: Setup called\n");); - - if (setup_idx >= PORT_COUNT - 1) { - printk("NCR53c406a: Setup called too many times. Bad LILO params?\n"); - return; - } - if (ints[0] < 1 || ints[0] > 3) { - printk("NCR53c406a: Malformed command line\n"); - printk("NCR53c406a: Usage: ncr53c406a=[,[,]]\n"); - return; - } - for (i = 0; i < PORT_COUNT && !port_base; i++) - if (ports[i] == ints[1]) { - port_base = ints[1]; - DEB(printk("NCR53c406a: Specified port_base 0x%X\n", port_base);) - } - if (!port_base) { - printk("NCR53c406a: Invalid PORTBASE 0x%X specified\n", ints[1]); - return; - } - - if (ints[0] > 1) { - if (ints[2] == 0) { - irq_level = 0; - DEB(printk("NCR53c406a: Specified irq %d\n", irq_level);) - } - else - for (i = 0; i < INTR_COUNT && irq_level < 0; i++) - if (intrs[i] == ints[2]) { - irq_level = ints[2]; - DEB(printk("NCR53c406a: Specified irq %d\n", port_base);) - } - if (irq_level < 0) - printk("NCR53c406a: Invalid IRQ %d specified\n", ints[2]); - } - - if (ints[0] > 2) - fast_pio = ints[3]; - - DEB(printk("NCR53c406a: port_base=0x%X, irq=%d, fast_pio=%d\n", - port_base, irq_level, fast_pio);) -} - -const char* -NCR53c406a_info(struct Scsi_Host *SChost){ - DEB(printk("NCR53c406a_info called\n")); - return (info_msg); -} - -static void internal_done(Scsi_Cmnd *SCpnt) { - internal_done_errcode = SCpnt->result; - ++internal_done_flag; -} - - -static void wait_intr(void) { - int i = jiffies + WATCHDOG; - - while(time_after(i,jiffies) && !(inb(STAT_REG)&0xe0)) /* wait for a pseudo-interrupt */ - barrier(); - - if (time_before_eq(i,jiffies)) { /* Timed out */ - rtrc(0); - current_SC->result = DID_TIME_OUT << 16; - current_SC->SCp.phase = idle; - current_SC->scsi_done(current_SC); - return; - } - - NCR53c406a_intr(0, NULL, NULL); -} - -int NCR53c406a_command(Scsi_Cmnd *SCpnt){ - DEB(printk("NCR53c406a_command called\n")); - NCR53c406a_queue(SCpnt, internal_done); - if(irq_level) - while (!internal_done_flag); - else /* interrupts not supported */ - while (!internal_done_flag) - wait_intr(); - - internal_done_flag = 0; - return internal_done_errcode; -} - - -int -NCR53c406a_queue(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)){ - int i; - unsigned long flags = 0; - - VDEB(printk("NCR53c406a_queue called\n")); - DEB(printk("cmd=%02x, cmd_len=%02x, target=%02x, lun=%02x, bufflen=%d\n", - SCpnt->cmnd[0], - SCpnt->cmd_len, - SCpnt->target, - SCpnt->lun, - SCpnt->request_bufflen)); - + int i = jiffies + WATCHDOG; + + while (time_after(i, jiffies) && !(inb(STAT_REG) & 0xe0)) { /* wait for a pseudo-interrupt */ + cpu_relax(); + barrier(); + } + + if (time_before_eq(i, jiffies)) { /* Timed out */ + rtrc(0); + current_SC->result = DID_TIME_OUT << 16; + current_SC->SCp.phase = idle; + current_SC->scsi_done(current_SC); + return; + } + + NCR53c406a_intr(0, NULL, NULL); +} + +static int NCR53c406a_command(Scsi_Cmnd * SCpnt) +{ + DEB(printk("NCR53c406a_command called\n")); + NCR53c406a_queue(SCpnt, internal_done); + if (irq_level) + while (!internal_done_flag) + cpu_relax(); + else /* interrupts not supported */ + while (!internal_done_flag) + wait_intr(); + + internal_done_flag = 0; + return internal_done_errcode; +} + + +static int NCR53c406a_queue(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) +{ + int i; + + VDEB(printk("NCR53c406a_queue called\n")); + DEB(printk("cmd=%02x, cmd_len=%02x, target=%02x, lun=%02x, bufflen=%d\n", SCpnt->cmnd[0], SCpnt->cmd_len, SCpnt->target, SCpnt->lun, SCpnt->request_bufflen)); + #if 0 - VDEB(for(i=0; icmd_len; i++) - printk("cmd[%d]=%02x ", i, SCpnt->cmnd[i])); - VDEB(printk("\n")); -#endif - - current_SC = SCpnt; - current_SC->scsi_done = done; - current_SC->SCp.phase = command_ph; - current_SC->SCp.Status = 0; - current_SC->SCp.Message = 0; - - save_flags(flags); - cli(); - REG0; - outb(SCpnt->target, DEST_ID); /* set destination */ - outb(FLUSH_FIFO, CMD_REG); /* reset the fifos */ - - for(i=0; icmd_len; i++){ - outb(SCpnt->cmnd[i], SCSI_FIFO); - } - outb(SELECT_NO_ATN, CMD_REG); - restore_flags(flags); - - rtrc(1); - return 0; -} - -int -NCR53c406a_abort(Scsi_Cmnd *SCpnt){ - DEB(printk("NCR53c406a_abort called\n")); - return SCSI_ABORT_SNOOZE; /* Don't know how to abort */ -} - -int -NCR53c406a_reset(Scsi_Cmnd *SCpnt, unsigned int ignored){ - DEB(printk("NCR53c406a_reset called\n")); - outb(C4_IMG, CONFIG4); /* Select reg set 0 */ - outb(CHIP_RESET, CMD_REG); - outb(SCSI_NOP, CMD_REG); /* required after reset */ - outb(SCSI_RESET, CMD_REG); - chip_init(); - - rtrc(2); - if (irq_level) - return SCSI_RESET_PENDING; /* should get an interrupt */ - else - return SCSI_RESET_WAKEUP; /* won't get any interrupts */ -} - -int -NCR53c406a_biosparm(Scsi_Disk *disk, struct block_device *dev, int* info_array){ - int size; - - DEB(printk("NCR53c406a_biosparm called\n")); - - size = disk->capacity; - info_array[0] = 64; /* heads */ - info_array[1] = 32; /* sectors */ - info_array[2] = size>>11; /* cylinders */ - if (info_array[2] > 1024) { /* big disk */ - info_array[0] = 255; - info_array[1] = 63; - info_array[2] = size / (255*63); - } - return 0; - } - - static void -do_NCR53c406a_intr(int unused, void *dev_id, struct pt_regs *regs){ - unsigned long flags; - struct Scsi_Host * dev = dev_id; - - spin_lock_irqsave(dev->host_lock, flags); - NCR53c406a_intr(0, dev_id, regs); - spin_unlock_irqrestore(dev->host_lock, flags); -} - - static void -NCR53c406a_intr(int unused, void *dev_id, struct pt_regs *regs){ - DEB(unsigned char fifo_size;) - DEB(unsigned char seq_reg;) - unsigned char status, int_reg; - unsigned long flags = 0; + VDEB(for (i = 0; i < SCpnt->cmd_len; i++) + printk("cmd[%d]=%02x ", i, SCpnt->cmnd[i])); + VDEB(printk("\n")); +#endif + + current_SC = SCpnt; + current_SC->scsi_done = done; + current_SC->SCp.phase = command_ph; + current_SC->SCp.Status = 0; + current_SC->SCp.Message = 0; + + /* We are locked here already by the mid layer */ + REG0; + outb(SCpnt->target, DEST_ID); /* set destination */ + outb(FLUSH_FIFO, CMD_REG); /* reset the fifos */ + + for (i = 0; i < SCpnt->cmd_len; i++) { + outb(SCpnt->cmnd[i], SCSI_FIFO); + } + outb(SELECT_NO_ATN, CMD_REG); + + rtrc(1); + return 0; +} + +static int NCR53c406a_abort(Scsi_Cmnd * SCpnt) +{ + DEB(printk("NCR53c406a_abort called\n")); + return FAILED; /* Don't know how to abort */ +} + +static int NCR53c406a_host_reset(Scsi_Cmnd * SCpnt) +{ + DEB(printk("NCR53c406a_reset called\n")); + outb(C4_IMG, CONFIG4); /* Select reg set 0 */ + outb(CHIP_RESET, CMD_REG); + outb(SCSI_NOP, CMD_REG); /* required after reset */ + outb(SCSI_RESET, CMD_REG); + chip_init(); + + rtrc(2); + return SUCCESS; +} + +static int NCR53c406a_device_reset(Scsi_Cmnd * SCpnt) +{ + return FAILED; +} + +static int NCR53c406a_bus_reset(Scsi_Cmnd * SCpnt) +{ + return FAILED; +} + +static int NCR53c406a_biosparm(Scsi_Disk * disk, struct block_device *dev, int *info_array) +{ + int size; + + DEB(printk("NCR53c406a_biosparm called\n")); + + size = disk->capacity; + info_array[0] = 64; /* heads */ + info_array[1] = 32; /* sectors */ + info_array[2] = size >> 11; /* cylinders */ + if (info_array[2] > 1024) { /* big disk */ + info_array[0] = 255; + info_array[1] = 63; + info_array[2] = size / (255 * 63); + } + return 0; +} + +static void do_NCR53c406a_intr(int unused, void *dev_id, struct pt_regs *regs) +{ + unsigned long flags; + struct Scsi_Host *dev = dev_id; + + spin_lock_irqsave(dev->host_lock, flags); + NCR53c406a_intr(0, dev_id, regs); + spin_unlock_irqrestore(dev->host_lock, flags); +} + +static void NCR53c406a_intr(int unused, void *dev_id, struct pt_regs *regs) +{ + DEB(unsigned char fifo_size; + ) + DEB(unsigned char seq_reg; + ) + unsigned char status, int_reg; #if USE_PIO - unsigned char pio_status; - struct scatterlist *sglist; - unsigned int sgcount; -#endif - - VDEB(printk("NCR53c406a_intr called\n")); - - save_flags(flags); - cli(); + unsigned char pio_status; + struct scatterlist *sglist; + unsigned int sgcount; +#endif + + VDEB(printk("NCR53c406a_intr called\n")); + #if USE_PIO - REG1; - pio_status = inb(PIO_STATUS); + REG1; + pio_status = inb(PIO_STATUS); #endif - REG0; - status = inb(STAT_REG); - DEB(seq_reg = inb(SEQ_REG)); - int_reg = inb(INT_REG); - DEB(fifo_size = inb(FIFO_FLAGS) & 0x1f); - restore_flags(flags); - + REG0; + status = inb(STAT_REG); + DEB(seq_reg = inb(SEQ_REG)); + int_reg = inb(INT_REG); + DEB(fifo_size = inb(FIFO_FLAGS) & 0x1f); + #if NCR53C406A_DEBUG - printk("status=%02x, seq_reg=%02x, int_reg=%02x, fifo_size=%02x", - status, seq_reg, int_reg, fifo_size); + printk("status=%02x, seq_reg=%02x, int_reg=%02x, fifo_size=%02x", status, seq_reg, int_reg, fifo_size); #if (USE_DMA) - printk("\n"); + printk("\n"); #else - printk(", pio=%02x\n", pio_status); -#endif /* USE_DMA */ -#endif /* NCR53C406A_DEBUG */ - - if(int_reg & 0x80){ /* SCSI reset intr */ - rtrc(3); - DEB(printk("NCR53c406a: reset intr received\n")); - current_SC->SCp.phase = idle; - current_SC->result = DID_RESET << 16; - current_SC->scsi_done(current_SC); - return; - } - + printk(", pio=%02x\n", pio_status); +#endif /* USE_DMA */ +#endif /* NCR53C406A_DEBUG */ + + if (int_reg & 0x80) { /* SCSI reset intr */ + rtrc(3); + DEB(printk("NCR53c406a: reset intr received\n")); + current_SC->SCp.phase = idle; + current_SC->result = DID_RESET << 16; + current_SC->scsi_done(current_SC); + return; + } #if USE_PIO - if(pio_status & 0x80) { - printk("NCR53C406A: Warning: PIO error!\n"); - current_SC->SCp.phase = idle; - current_SC->result = DID_ERROR << 16; - current_SC->scsi_done(current_SC); - return; - } -#endif /* USE_PIO */ - - if(status & 0x20) { /* Parity error */ - printk("NCR53c406a: Warning: parity error!\n"); - current_SC->SCp.phase = idle; - current_SC->result = DID_PARITY << 16; - current_SC->scsi_done(current_SC); - return; - } - - if(status & 0x40) { /* Gross error */ - printk("NCR53c406a: Warning: gross error!\n"); - current_SC->SCp.phase = idle; - current_SC->result = DID_ERROR << 16; - current_SC->scsi_done(current_SC); - return; - } - - if(int_reg & 0x20){ /* Disconnect */ - DEB(printk("NCR53c406a: disconnect intr received\n")); - if(current_SC->SCp.phase != message_in){ /* Unexpected disconnect */ - current_SC->result = DID_NO_CONNECT << 16; - } - else{ /* Command complete, return status and message */ - current_SC->result = (current_SC->SCp.Status & 0xff) - | ((current_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16); - } - - rtrc(0); - current_SC->SCp.phase = idle; - current_SC->scsi_done( current_SC ); - return; - } - - switch(status & 0x07){ /* scsi phase */ - case 0x00: /* DATA-OUT */ - if(int_reg & 0x10){ /* Target requesting info transfer */ - rtrc(5); - current_SC->SCp.phase = data_out; - VDEB(printk("NCR53c406a: Data-Out phase\n")); - outb(FLUSH_FIFO, CMD_REG); - LOAD_DMA_COUNT(current_SC->request_bufflen); /* Max transfer size */ + if (pio_status & 0x80) { + printk("NCR53C406A: Warning: PIO error!\n"); + current_SC->SCp.phase = idle; + current_SC->result = DID_ERROR << 16; + current_SC->scsi_done(current_SC); + return; + } +#endif /* USE_PIO */ + + if (status & 0x20) { /* Parity error */ + printk("NCR53c406a: Warning: parity error!\n"); + current_SC->SCp.phase = idle; + current_SC->result = DID_PARITY << 16; + current_SC->scsi_done(current_SC); + return; + } + + if (status & 0x40) { /* Gross error */ + printk("NCR53c406a: Warning: gross error!\n"); + current_SC->SCp.phase = idle; + current_SC->result = DID_ERROR << 16; + current_SC->scsi_done(current_SC); + return; + } + + if (int_reg & 0x20) { /* Disconnect */ + DEB(printk("NCR53c406a: disconnect intr received\n")); + if (current_SC->SCp.phase != message_in) { /* Unexpected disconnect */ + current_SC->result = DID_NO_CONNECT << 16; + } else { /* Command complete, return status and message */ + current_SC->result = (current_SC->SCp.Status & 0xff) + | ((current_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16); + } + + rtrc(0); + current_SC->SCp.phase = idle; + current_SC->scsi_done(current_SC); + return; + } + + switch (status & 0x07) { /* scsi phase */ + case 0x00: /* DATA-OUT */ + if (int_reg & 0x10) { /* Target requesting info transfer */ + rtrc(5); + current_SC->SCp.phase = data_out; + VDEB(printk("NCR53c406a: Data-Out phase\n")); + outb(FLUSH_FIFO, CMD_REG); + LOAD_DMA_COUNT(current_SC->request_bufflen); /* Max transfer size */ #if USE_DMA /* No s/g support for DMA */ - NCR53c406a_dma_write(current_SC->request_buffer, - current_SC->request_bufflen); -#endif /* USE_DMA */ - outb(TRANSFER_INFO | DMA_OP, CMD_REG); + NCR53c406a_dma_write(current_SC->request_buffer, current_SC->request_bufflen); +#endif /* USE_DMA */ + outb(TRANSFER_INFO | DMA_OP, CMD_REG); #if USE_PIO - if (!current_SC->use_sg) /* Don't use scatter-gather */ - NCR53c406a_pio_write(current_SC->request_buffer, - current_SC->request_bufflen); - else { /* use scatter-gather */ - sgcount = current_SC->use_sg; - sglist = current_SC->request_buffer; - while( sgcount-- ) { - NCR53c406a_pio_write(page_address(sglist->page) + sglist->offset, sglist->length); - sglist++; - } - } - REG0; -#endif /* USE_PIO */ - } - break; - - case 0x01: /* DATA-IN */ - if(int_reg & 0x10){ /* Target requesting info transfer */ - rtrc(6); - current_SC->SCp.phase = data_in; - VDEB(printk("NCR53c406a: Data-In phase\n")); - outb(FLUSH_FIFO, CMD_REG); - LOAD_DMA_COUNT(current_SC->request_bufflen); /* Max transfer size */ + if (!current_SC->use_sg) /* Don't use scatter-gather */ + NCR53c406a_pio_write(current_SC->request_buffer, current_SC->request_bufflen); + else { /* use scatter-gather */ + sgcount = current_SC->use_sg; + sglist = current_SC->request_buffer; + while (sgcount--) { + NCR53c406a_pio_write(page_address(sglist->page) + sglist->offset, sglist->length); + sglist++; + } + } + REG0; +#endif /* USE_PIO */ + } + break; + + case 0x01: /* DATA-IN */ + if (int_reg & 0x10) { /* Target requesting info transfer */ + rtrc(6); + current_SC->SCp.phase = data_in; + VDEB(printk("NCR53c406a: Data-In phase\n")); + outb(FLUSH_FIFO, CMD_REG); + LOAD_DMA_COUNT(current_SC->request_bufflen); /* Max transfer size */ #if USE_DMA /* No s/g support for DMA */ - NCR53c406a_dma_read(current_SC->request_buffer, - current_SC->request_bufflen); -#endif /* USE_DMA */ - outb(TRANSFER_INFO | DMA_OP, CMD_REG); + NCR53c406a_dma_read(current_SC->request_buffer, current_SC->request_bufflen); +#endif /* USE_DMA */ + outb(TRANSFER_INFO | DMA_OP, CMD_REG); #if USE_PIO - if (!current_SC->use_sg) /* Don't use scatter-gather */ - NCR53c406a_pio_read(current_SC->request_buffer, - current_SC->request_bufflen); - else { /* Use scatter-gather */ - sgcount = current_SC->use_sg; - sglist = current_SC->request_buffer; - while( sgcount-- ) { - NCR53c406a_pio_read(page_address(sglist->page) + sglist->offset, sglist->length); - sglist++; - } - } - REG0; -#endif /* USE_PIO */ - } - break; - - case 0x02: /* COMMAND */ - current_SC->SCp.phase = command_ph; - printk("NCR53c406a: Warning: Unknown interrupt occurred in command phase!\n"); - break; - - case 0x03: /* STATUS */ - rtrc(7); - current_SC->SCp.phase = status_ph; - VDEB(printk("NCR53c406a: Status phase\n")); - outb(FLUSH_FIFO, CMD_REG); - outb(INIT_CMD_COMPLETE, CMD_REG); - break; - - case 0x04: /* Reserved */ - case 0x05: /* Reserved */ - printk("NCR53c406a: WARNING: Reserved phase!!!\n"); - break; - - case 0x06: /* MESSAGE-OUT */ - DEB(printk("NCR53c406a: Message-Out phase\n")); - current_SC->SCp.phase = message_out; - outb(SET_ATN, CMD_REG); /* Reject the message */ - outb(MSG_ACCEPT, CMD_REG); - break; - - case 0x07: /* MESSAGE-IN */ - rtrc(4); - VDEB(printk("NCR53c406a: Message-In phase\n")); - current_SC->SCp.phase = message_in; - - current_SC->SCp.Status = inb(SCSI_FIFO); - current_SC->SCp.Message = inb(SCSI_FIFO); - - VDEB(printk("SCSI FIFO size=%d\n", inb(FIFO_FLAGS) & 0x1f)); - DEB(printk("Status = %02x Message = %02x\n", - current_SC->SCp.Status, current_SC->SCp.Message)); - - if(current_SC->SCp.Message == SAVE_POINTERS || - current_SC->SCp.Message == DISCONNECT) { - outb(SET_ATN, CMD_REG); /* Reject message */ - DEB(printk("Discarding SAVE_POINTERS message\n")); - } - outb(MSG_ACCEPT, CMD_REG); - break; - } + if (!current_SC->use_sg) /* Don't use scatter-gather */ + NCR53c406a_pio_read(current_SC->request_buffer, current_SC->request_bufflen); + else { /* Use scatter-gather */ + sgcount = current_SC->use_sg; + sglist = current_SC->request_buffer; + while (sgcount--) { + NCR53c406a_pio_read(page_address(sglist->page) + sglist->offset, sglist->length); + sglist++; + } + } + REG0; +#endif /* USE_PIO */ + } + break; + + case 0x02: /* COMMAND */ + current_SC->SCp.phase = command_ph; + printk("NCR53c406a: Warning: Unknown interrupt occurred in command phase!\n"); + break; + + case 0x03: /* STATUS */ + rtrc(7); + current_SC->SCp.phase = status_ph; + VDEB(printk("NCR53c406a: Status phase\n")); + outb(FLUSH_FIFO, CMD_REG); + outb(INIT_CMD_COMPLETE, CMD_REG); + break; + + case 0x04: /* Reserved */ + case 0x05: /* Reserved */ + printk("NCR53c406a: WARNING: Reserved phase!!!\n"); + break; + + case 0x06: /* MESSAGE-OUT */ + DEB(printk("NCR53c406a: Message-Out phase\n")); + current_SC->SCp.phase = message_out; + outb(SET_ATN, CMD_REG); /* Reject the message */ + outb(MSG_ACCEPT, CMD_REG); + break; + + case 0x07: /* MESSAGE-IN */ + rtrc(4); + VDEB(printk("NCR53c406a: Message-In phase\n")); + current_SC->SCp.phase = message_in; + + current_SC->SCp.Status = inb(SCSI_FIFO); + current_SC->SCp.Message = inb(SCSI_FIFO); + + VDEB(printk("SCSI FIFO size=%d\n", inb(FIFO_FLAGS) & 0x1f)); + DEB(printk("Status = %02x Message = %02x\n", current_SC->SCp.Status, current_SC->SCp.Message)); + + if (current_SC->SCp.Message == SAVE_POINTERS || current_SC->SCp.Message == DISCONNECT) { + outb(SET_ATN, CMD_REG); /* Reject message */ + DEB(printk("Discarding SAVE_POINTERS message\n")); + } + outb(MSG_ACCEPT, CMD_REG); + break; + } } #ifndef IRQ_LEV static int irq_probe(void) { - int irqs, irq; - int i; - - inb(INT_REG); /* clear the interrupt register */ - irqs = probe_irq_on(); - - /* Invalid command will cause an interrupt */ - REG0; - outb(0xff, CMD_REG); - - /* Wait for the interrupt to occur */ - i = jiffies + WATCHDOG; - while(time_after(i, jiffies) && !(inb(STAT_REG) & 0x80)) - barrier(); - if (time_before_eq(i, jiffies)) { /* Timed out, must be hardware trouble */ - probe_irq_off(irqs); - return -1; - } - - irq = probe_irq_off(irqs); - - /* Kick the chip */ - outb(CHIP_RESET, CMD_REG); - outb(SCSI_NOP, CMD_REG); - chip_init(); - - return irq; + int irqs, irq; + int i; + + inb(INT_REG); /* clear the interrupt register */ + irqs = probe_irq_on(); + + /* Invalid command will cause an interrupt */ + REG0; + outb(0xff, CMD_REG); + + /* Wait for the interrupt to occur */ + i = jiffies + WATCHDOG; + while (time_after(i, jiffies) && !(inb(STAT_REG) & 0x80)) + barrier(); + if (time_before_eq(i, jiffies)) { /* Timed out, must be hardware trouble */ + probe_irq_off(irqs); + return -1; + } + + irq = probe_irq_off(irqs); + + /* Kick the chip */ + outb(CHIP_RESET, CMD_REG); + outb(SCSI_NOP, CMD_REG); + chip_init(); + + return irq; } -#endif /* IRQ_LEV */ +#endif /* IRQ_LEV */ static void chip_init(void) { - REG1; + REG1; #if USE_DMA - outb(0x00, PIO_STATUS); -#else /* USE_PIO */ - outb(0x01, PIO_STATUS); -#endif - outb(0x00, PIO_FLAG); - - outb(C4_IMG, CONFIG4); /* REG0; */ - outb(C3_IMG, CONFIG3); - outb(C2_IMG, CONFIG2); - outb(C1_IMG, CONFIG1); - - outb(0x05, CLKCONV); /* clock conversion factor */ - outb(0x9C, SRTIMOUT); /* Selection timeout */ - outb(0x05, SYNCPRD); /* Synchronous transfer period */ - outb(SYNC_MODE, SYNCOFF); /* synchronous mode */ -} - -void __init calc_port_addr(void) -{ - /* Control Register Set 0 */ - TC_LSB = (port_base+0x00); - TC_MSB = (port_base+0x01); - SCSI_FIFO = (port_base+0x02); - CMD_REG = (port_base+0x03); - STAT_REG = (port_base+0x04); - DEST_ID = (port_base+0x04); - INT_REG = (port_base+0x05); - SRTIMOUT = (port_base+0x05); - SEQ_REG = (port_base+0x06); - SYNCPRD = (port_base+0x06); - FIFO_FLAGS = (port_base+0x07); - SYNCOFF = (port_base+0x07); - CONFIG1 = (port_base+0x08); - CLKCONV = (port_base+0x09); - /* TESTREG = (port_base+0x0A); */ - CONFIG2 = (port_base+0x0B); - CONFIG3 = (port_base+0x0C); - CONFIG4 = (port_base+0x0D); - TC_HIGH = (port_base+0x0E); - /* FIFO_BOTTOM = (port_base+0x0F); */ - - /* Control Register Set 1 */ - /* JUMPER_SENSE = (port_base+0x00);*/ - /* SRAM_PTR = (port_base+0x01);*/ - /* SRAM_DATA = (port_base+0x02);*/ - PIO_FIFO = (port_base+0x04); - /* PIO_FIFO1 = (port_base+0x05);*/ - /* PIO_FIFO2 = (port_base+0x06);*/ - /* PIO_FIFO3 = (port_base+0x07);*/ - PIO_STATUS = (port_base+0x08); - /* ATA_CMD = (port_base+0x09);*/ - /* ATA_ERR = (port_base+0x0A);*/ - PIO_FLAG = (port_base+0x0B); - CONFIG5 = (port_base+0x0D); - /* SIGNATURE = (port_base+0x0E);*/ - /* CONFIG6 = (port_base+0x0F);*/ + outb(0x00, PIO_STATUS); +#else /* USE_PIO */ + outb(0x01, PIO_STATUS); +#endif + outb(0x00, PIO_FLAG); + + outb(C4_IMG, CONFIG4); /* REG0; */ + outb(C3_IMG, CONFIG3); + outb(C2_IMG, CONFIG2); + outb(C1_IMG, CONFIG1); + + outb(0x05, CLKCONV); /* clock conversion factor */ + outb(0x9C, SRTIMOUT); /* Selection timeout */ + outb(0x05, SYNCPRD); /* Synchronous transfer period */ + outb(SYNC_MODE, SYNCOFF); /* synchronous mode */ +} + +static void __init calc_port_addr(void) +{ + /* Control Register Set 0 */ + TC_LSB = (port_base + 0x00); + TC_MSB = (port_base + 0x01); + SCSI_FIFO = (port_base + 0x02); + CMD_REG = (port_base + 0x03); + STAT_REG = (port_base + 0x04); + DEST_ID = (port_base + 0x04); + INT_REG = (port_base + 0x05); + SRTIMOUT = (port_base + 0x05); + SEQ_REG = (port_base + 0x06); + SYNCPRD = (port_base + 0x06); + FIFO_FLAGS = (port_base + 0x07); + SYNCOFF = (port_base + 0x07); + CONFIG1 = (port_base + 0x08); + CLKCONV = (port_base + 0x09); + /* TESTREG = (port_base+0x0A); */ + CONFIG2 = (port_base + 0x0B); + CONFIG3 = (port_base + 0x0C); + CONFIG4 = (port_base + 0x0D); + TC_HIGH = (port_base + 0x0E); + /* FIFO_BOTTOM = (port_base+0x0F); */ + + /* Control Register Set 1 */ + /* JUMPER_SENSE = (port_base+0x00); */ + /* SRAM_PTR = (port_base+0x01); */ + /* SRAM_DATA = (port_base+0x02); */ + PIO_FIFO = (port_base + 0x04); + /* PIO_FIFO1 = (port_base+0x05); */ + /* PIO_FIFO2 = (port_base+0x06); */ + /* PIO_FIFO3 = (port_base+0x07); */ + PIO_STATUS = (port_base + 0x08); + /* ATA_CMD = (port_base+0x09); */ + /* ATA_ERR = (port_base+0x0A); */ + PIO_FLAG = (port_base + 0x0B); + CONFIG5 = (port_base + 0x0D); + /* SIGNATURE = (port_base+0x0E); */ + /* CONFIG6 = (port_base+0x0F); */ } + MODULE_LICENSE("GPL"); /* Eventually this will go into an include file, but this will be later */ diff -Nru a/drivers/scsi/NCR53c406a.h b/drivers/scsi/NCR53c406a.h --- a/drivers/scsi/NCR53c406a.h Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/NCR53c406a.h Mon Oct 28 16:32:36 2002 @@ -26,50 +26,34 @@ * Use SG_NONE if DMA mode is enabled! */ #define NCR53c406a { \ - proc_name: "NCR53c406a" /* proc_name */, \ - name: "NCR53c406a" /* name */, \ - detect: NCR53c406a_detect /* detect */, \ - info: NCR53c406a_info /* info */, \ - command: NCR53c406a_command /* command */, \ - queuecommand: NCR53c406a_queue /* queuecommand */, \ - abort: NCR53c406a_abort /* abort */, \ - reset: NCR53c406a_reset /* reset */, \ - bios_param: NCR53c406a_biosparm /* biosparm */, \ - can_queue: 1 /* can_queue */, \ - this_id: 7 /* SCSI ID of the chip */, \ - sg_tablesize: 32 /*SG_ALL*/ /*SG_NONE*/, \ - cmd_per_lun: 1 /* commands per lun */, \ - unchecked_isa_dma: 1 /* unchecked_isa_dma */, \ - use_clustering: ENABLE_CLUSTERING \ + proc_name: "NCR53c406a" /* proc_name */, \ + name: "NCR53c406a" /* name */, \ + detect: NCR53c406a_detect /* detect */, \ + info: NCR53c406a_info /* info */, \ + command: NCR53c406a_command /* command */, \ + queuecommand: NCR53c406a_queue /* queuecommand */, \ + eh_abort_handler: NCR53c406a_abort /* abort */, \ + eh_bus_reset_handler: NCR53c406a_bus_reset /* reset */, \ + eh_device_reset_handler: NCR53c406a_device_reset /* reset */, \ + eh_host_reset_handler: NCR53c406a_host_reset /* reset */, \ + bios_param: NCR53c406a_biosparm /* biosparm */, \ + can_queue: 1 /* can_queue */, \ + this_id: 7 /* SCSI ID of the chip */, \ + sg_tablesize: 32 /*SG_ALL*/ /*SG_NONE*/, \ + cmd_per_lun: 1 /* commands per lun */, \ + unchecked_isa_dma: 1 /* unchecked_isa_dma */, \ + use_clustering: ENABLE_CLUSTERING \ } -int NCR53c406a_detect(Scsi_Host_Template *); -const char* NCR53c406a_info(struct Scsi_Host *); +static int NCR53c406a_detect(Scsi_Host_Template *); +static const char *NCR53c406a_info(struct Scsi_Host *); -int NCR53c406a_command(Scsi_Cmnd *); -int NCR53c406a_queue(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -int NCR53c406a_abort(Scsi_Cmnd *); -int NCR53c406a_reset(Scsi_Cmnd *, unsigned int); -int NCR53c406a_biosparm(Disk *, struct block_device *, int []); - -#endif /* _NCR53C406A_H */ - -/* - * Overrides for Emacs so that we get a uniform 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: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * indent-tabs-mode: nil - * tab-width: 8 - * End: - */ +static int NCR53c406a_command(Scsi_Cmnd *); +static int NCR53c406a_queue(Scsi_Cmnd *, void (*done) (Scsi_Cmnd *)); +static int NCR53c406a_abort(Scsi_Cmnd *); +static int NCR53c406a_bus_reset(Scsi_Cmnd *); +static int NCR53c406a_device_reset(Scsi_Cmnd *); +static int NCR53c406a_host_reset(Scsi_Cmnd *); +static int NCR53c406a_biosparm(Disk *, struct block_device *, int[]); +#endif /* _NCR53C406A_H */ diff -Nru a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c --- a/drivers/scsi/advansys.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/advansys.c Mon Oct 28 16:32:36 2002 @@ -1570,7 +1570,6 @@ uchar isa_dma_speed; uchar isa_dma_channel; uchar chip_version; - ushort pci_device_id; ushort lib_serial_no; ushort lib_version; ushort mcode_date; @@ -1580,6 +1579,7 @@ uchar sdtr_period_offset[ASC_MAX_TID + 1]; ushort pci_slot_info; uchar adapter_info[6]; + struct pci_dev *pci_dev; } ASC_DVC_CFG; #define ASC_DEF_DVC_CNTL 0xFFFF @@ -3075,7 +3075,6 @@ ushort disc_enable; /* enable disconnection */ uchar chip_version; /* chip version */ uchar termination; /* Term. Ctrl. bits 6-5 of SCSI_CFG1 register */ - ushort pci_device_id; /* PCI device code number */ ushort lib_version; /* Adv Library version number */ ushort control_flag; /* Microcode Control Flag */ ushort mcode_date; /* Microcode date */ @@ -3086,6 +3085,7 @@ ushort serial1; /* EEPROM serial number word 1 */ ushort serial2; /* EEPROM serial number word 2 */ ushort serial3; /* EEPROM serial number word 3 */ + struct pci_dev *pci_dev; /* pointer to the pci dev structure for this board */ } ADV_DVC_CFG; struct adv_dvc_var; @@ -4957,7 +4957,7 @@ #ifdef CONFIG_PCI case ASC_IS_PCI: shp->irq = asc_dvc_varp->irq_no = pci_devp->irq; - asc_dvc_varp->cfg->pci_device_id = pci_devp->device; + asc_dvc_varp->cfg->pci_dev = pci_devp; asc_dvc_varp->cfg->pci_slot_info = ASC_PCI_MKID(pci_devp->bus->number, PCI_SLOT(pci_devp->devfn), @@ -4981,7 +4981,7 @@ */ #ifdef CONFIG_PCI shp->irq = adv_dvc_varp->irq_no = pci_devp->irq; - adv_dvc_varp->cfg->pci_device_id = pci_devp->device; + adv_dvc_varp->cfg->pci_dev = pci_devp; adv_dvc_varp->cfg->pci_slot_info = ASC_PCI_MKID(pci_devp->bus->number, PCI_SLOT(pci_devp->devfn), @@ -9040,10 +9040,7 @@ { #ifdef CONFIG_PCI uchar byte_data; - pcibios_read_config_byte(ASC_PCI_ID2BUS(asc_dvc->cfg->pci_slot_info), - PCI_DEVFN(ASC_PCI_ID2DEV(asc_dvc->cfg->pci_slot_info), - ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info)), - offset, &byte_data); + pci_read_config_byte(asc_dvc->cfg->pci_dev, offset, &byte_data); return byte_data; #else /* !defined(CONFIG_PCI) */ return 0; @@ -9062,10 +9059,7 @@ ) { #ifdef CONFIG_PCI - pcibios_write_config_byte(ASC_PCI_ID2BUS(asc_dvc->cfg->pci_slot_info), - PCI_DEVFN(ASC_PCI_ID2DEV(asc_dvc->cfg->pci_slot_info), - ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info)), - offset, byte_data); + pci_write_config_byte(asc_dvc->cfg->pci_dev, offset, byte_data); #endif /* CONFIG_PCI */ } @@ -9163,10 +9157,7 @@ { #ifdef CONFIG_PCI uchar byte_data; - pcibios_read_config_byte(ASC_PCI_ID2BUS(asc_dvc->cfg->pci_slot_info), - PCI_DEVFN(ASC_PCI_ID2DEV(asc_dvc->cfg->pci_slot_info), - ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info)), - offset, &byte_data); + pci_read_config_byte(asc_dvc->cfg->pci_dev, offset, &byte_data); return byte_data; #else /* CONFIG_PCI */ return 0; @@ -9185,10 +9176,7 @@ ) { #ifdef CONFIG_PCI - pcibios_write_config_byte(ASC_PCI_ID2BUS(asc_dvc->cfg->pci_slot_info), - PCI_DEVFN(ASC_PCI_ID2DEV(asc_dvc->cfg->pci_slot_info), - ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info)), - offset, byte_data); + pci_write_config_byte(asc_dvc->cfg->pci_dev, offset, byte_data); #else /* CONFIG_PCI */ return 0; #endif /* CONFIG_PCI */ @@ -9548,7 +9536,7 @@ printk( " pci_device_id %d, lib_serial_no %u, lib_version %u, mcode_date 0x%x,\n", - h->pci_device_id, h->lib_serial_no, h->lib_version, h->mcode_date); + h->pci_dev->device, h->lib_serial_no, h->lib_version, h->mcode_date); printk( " mcode_version %d, overrun_buf 0x%lx\n", @@ -9673,7 +9661,7 @@ printk( " mcode_version 0x%x, pci_device_id 0x%x, lib_version %u\n", - h->mcode_version, h->pci_device_id, h->lib_version); + h->mcode_version, h->pci_dev->device, h->lib_version); printk( " control_flag 0x%x, pci_slot_info 0x%x\n", @@ -12342,7 +12330,7 @@ ushort pci_device_id; iop_base = asc_dvc->iop_base; - pci_device_id = asc_dvc->cfg->pci_device_id; + pci_device_id = asc_dvc->cfg->pci_dev->device; warn_code = 0; cfg_msw = AscGetChipCfgMsw(iop_base); if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) { diff -Nru a/drivers/scsi/aha1740.c b/drivers/scsi/aha1740.c --- a/drivers/scsi/aha1740.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/aha1740.c Mon Oct 28 16:32:36 2002 @@ -64,6 +64,8 @@ #define HOSTDATA(host) ((struct aha1740_hostdata *) &host->hostdata) +static spinlock_t aha1740_lock = SPIN_LOCK_UNLOCKED; + /* One for each IRQ level (9-15) */ static struct Scsi_Host * aha_host[8] = {NULL, }; @@ -258,7 +260,7 @@ continue; } if (SCtmp->host_scribble) - scsi_free(SCtmp->host_scribble, 512); + kfree(SCtmp->host_scribble); /* Fetch the sense data, and tuck it away, in the required slot. The Adaptec automatically fetches it, and there is no guarantee that we will still have it in the cdb when we come @@ -346,8 +348,8 @@ #endif /* locate an available ecb */ - save_flags(flags); - cli(); + + spin_lock_irqsave(&aha1740_lock, flags); ecbno = host->last_ecb_used + 1; /* An optimization */ if (ecbno >= AHA1740_ECBS) ecbno = 0; @@ -366,7 +368,7 @@ doubles as reserved flag */ host->last_ecb_used = ecbno; - restore_flags(flags); + spin_unlock_irqrestore(&aha1740_lock, flags); #ifdef DEBUG printk("Sending command (%d %x)...", ecbno, done); @@ -390,14 +392,18 @@ DEB(unsigned char * ptr); host->ecb[ecbno].sg = 1; /* SCSI Initiator Command w/scatter-gather*/ - SCpnt->host_scribble = (unsigned char *) scsi_malloc(512); + SCpnt->host_scribble = (unsigned char *)kmalloc(512, GFP_KERNEL); + if(SCpnt->host_scribble == NULL) + { + printk(KERN_WARNING "aha1740: out of memory in queuecommand!\n"); + return 1; + } sgpnt = (struct scatterlist *) SCpnt->request_buffer; cptr = (struct aha1740_chain *) SCpnt->host_scribble; - if (cptr == NULL) panic("aha1740.c: unable to allocate DMA memory\n"); for(i=0; iuse_sg; i++) { cptr[i].datalen = sgpnt[i].length; - cptr[i].dataptr = isa_virt_to_bus(sgpnt[i].address); + cptr[i].dataptr = isa_virt_to_bus(page_address(sgpnt[i].page) + sgpnt[i].offset); } host->ecb[ecbno].datalen = SCpnt->use_sg * sizeof(struct aha1740_chain); host->ecb[ecbno].dataptr = isa_virt_to_bus(cptr); @@ -448,13 +454,12 @@ int loopcnt; unsigned int base = SCpnt->host->io_port; DEB(printk("aha1740[%d] critical section\n",ecbno)); - save_flags(flags); - cli(); + + spin_lock_irqsave(&aha1740_lock, flags); for (loopcnt = 0; ; loopcnt++) { if (inb(G2STAT(base)) & G2STAT_MBXOUT) break; if (loopcnt == LOOPCNT_WARN) { printk("aha1740[%d]_mbxout wait!\n",ecbno); - cli(); /* printk may have done a sti()! */ } if (loopcnt == LOOPCNT_MAX) panic("aha1740.c: mbxout busy!\n"); @@ -464,13 +469,12 @@ if (! (inb(G2STAT(base)) & G2STAT_BUSY)) break; if (loopcnt == LOOPCNT_WARN) { printk("aha1740[%d]_attn wait!\n",ecbno); - cli(); } if (loopcnt == LOOPCNT_MAX) panic("aha1740.c: attn wait failed!\n"); } outb(ATTN_START | (target & 7), ATTN(base)); /* Start it up */ - restore_flags(flags); + spin_unlock_irqrestore(&aha1740_lock, flags); DEB(printk("aha1740[%d] request queued.\n",ecbno)); } else @@ -488,7 +492,10 @@ aha1740_queuecommand(SCpnt, internal_done); SCpnt->SCp.Status = 0; while (!SCpnt->SCp.Status) + { + cpu_relax(); barrier(); + } return SCpnt->result; } diff -Nru a/drivers/scsi/aic7xxx/Makefile b/drivers/scsi/aic7xxx/Makefile --- a/drivers/scsi/aic7xxx/Makefile Mon Oct 28 16:32:38 2002 +++ b/drivers/scsi/aic7xxx/Makefile Mon Oct 28 16:32:38 2002 @@ -24,8 +24,7 @@ clean-files := aic7xxx_seq.h aic7xxx_reg.h # Command to be executed upon make clean -# Note: Assignment without ':' to force late evaluation of $(src) -clean-rule = @$(MAKE) -C $(src)/aicasm clean +clean-rule := $(MAKE) -C $(src)/aicasm clean include $(TOPDIR)/Rules.make @@ -39,7 +38,7 @@ $(obj)/aic7xxx_seq.h: $(src)/aic7xxx.seq $(src)/aic7xxx.reg \ $(obj)/aicasm/aicasm - $(obj)/aicasm/aicasm -I. -r $(obj)/aic7xxx_reg.h \ + $(obj)/aicasm/aicasm -I$(obj) -r $(obj)/aic7xxx_reg.h \ -o $(obj)/aic7xxx_seq.h $(src)/aic7xxx.seq $(obj)/aic7xxx_reg.h: $(obj)/aix7xxx_seq.h diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_linux.c b/drivers/scsi/aic7xxx/aic7xxx_linux.c --- a/drivers/scsi/aic7xxx/aic7xxx_linux.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/aic7xxx/aic7xxx_linux.c Mon Oct 28 16:32:36 2002 @@ -398,26 +398,26 @@ MODULE_LICENSE("Dual BSD/GPL"); #endif MODULE_PARM(aic7xxx, "s"); -MODULE_PARM_DESC(aic7xxx, "period delimited, options string. - verbose Enable verbose/diagnostic logging - no_probe Disable EISA/VLB controller probing - no_reset Supress initial bus resets - extended Enable extended geometry on all controllers - periodic_otag Send an ordered tagged transaction periodically - to prevent tag starvation. This may be - required by some older disk drives/RAID arrays. - reverse_scan Sort PCI devices highest Bus/Slot to lowest - tag_info: Set per-target tag depth - seltime: Selection Timeout(0/256ms,1/128ms,2/64ms,3/32ms) - - Sample /etc/modules.conf line: - Enable verbose logging - Disable EISA/VLB probing - Set tag depth on Controller 2/Target 2 to 10 tags - Shorten the selection timeout to 128ms from its default of 256 - - options aic7xxx='\"verbose.no_probe.tag_info:{{}.{}.{..10}}.seltime:1\"' -"); +MODULE_PARM_DESC(aic7xxx, "period delimited, options string.\n" \ +" verbose Enable verbose/diagnostic logging\n" \ +" no_probe Disable EISA/VLB controller probing\n" \ +" no_reset Supress initial bus resets\n" \ +" extended Enable extended geometry on all controllers\n" \ +" periodic_otag Send an ordered tagged transaction periodically\n" \ +" to prevent tag starvation. This may be\n" \ +" required by some older disk drives/RAID arrays. \n" \ +" reverse_scan Sort PCI devices highest Bus/Slot to lowest\n" \ +" tag_info: Set per-target tag depth\n" \ +" seltime: Selection Timeout(0/256ms,1/128ms,2/64ms,3/32ms)\n" \ +"\n" \ +" Sample /etc/modules.conf line:\n" \ +" Enable verbose logging\n" \ +" Disable EISA/VLB probing\n" \ +" Set tag depth on Controller 2/Target 2 to 10 tags\n" \ +" Shorten the selection timeout to 128ms from its default of 256\n" \ +" \n" \ +" options aic7xxx='\"verbose.no_probe.tag_info:{{}.{}.{..10}}.seltime:1\"'\n" +); #endif static void ahc_linux_handle_scsi_status(struct ahc_softc *, diff -Nru a/drivers/scsi/atp870u.h b/drivers/scsi/atp870u.h --- a/drivers/scsi/atp870u.h Mon Oct 28 16:32:35 2002 +++ b/drivers/scsi/atp870u.h Mon Oct 28 16:32:35 2002 @@ -37,18 +37,13 @@ extern int atp870u_proc_info(char *, char **, off_t, int, int, int); #define ATP870U { \ - next: NULL, \ - module: NULL, \ proc_info: atp870u_proc_info, \ - name: NULL, \ detect: atp870u_detect, \ release: atp870u_release, \ info: atp870u_info, \ command: atp870u_command, \ queuecommand: atp870u_queuecommand, \ - eh_strategy_handler: NULL, \ eh_abort_handler: atp870u_abort, \ - slave_attach: NULL, \ bios_param: atp870u_biosparam, \ can_queue: qcnt, /* max simultaneous cmds */\ this_id: 7, /* scsi id of host adapter */\ diff -Nru a/drivers/scsi/dmx3191d.c b/drivers/scsi/dmx3191d.c --- a/drivers/scsi/dmx3191d.c Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/dmx3191d.c Mon Oct 28 16:32:37 2002 @@ -31,6 +31,7 @@ #include #include #include +#include #include "scsi.h" #include "hosts.h" @@ -52,7 +53,7 @@ #include "NCR5380.c" -int __init dmx3191d_detect(Scsi_Host_Template *tmpl) { +static int __init dmx3191d_detect(Scsi_Host_Template *tmpl) { int boards = 0; struct Scsi_Host *instance = NULL; struct pci_dev *pdev = NULL; @@ -90,7 +91,7 @@ instance->irq = pdev->irq; NCR5380_init(instance, FLAG_NO_PSEUDO_DMA | FLAG_DTC3181E); - if (request_irq(pdev->irq, dmx3191d_do_intr, SA_SHIRQ, + if (request_irq(pdev->irq, dmx3191d_intr, SA_SHIRQ, DMX3191D_DRIVER_NAME, instance)) { printk(KERN_WARNING "dmx3191: IRQ %d not available - switching to polled mode.\n", pdev->irq); /* Steam powered scsi controllers run without an IRQ @@ -103,13 +104,13 @@ return boards; } -const char * dmx3191d_info(struct Scsi_Host *host) { +static const char * dmx3191d_info(struct Scsi_Host *host) { static const char *info ="Domex DMX3191D"; return info; } -int dmx3191d_release_resources(struct Scsi_Host *instance) +static int dmx3191d_release_resources(struct Scsi_Host *instance) { release_region(instance->io_port, DMX3191D_REGION); if(instance->irq!=IRQ_NONE) diff -Nru a/drivers/scsi/dmx3191d.h b/drivers/scsi/dmx3191d.h --- a/drivers/scsi/dmx3191d.h Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/dmx3191d.h Mon Oct 28 16:32:37 2002 @@ -20,16 +20,15 @@ #define PCI_DEVICE_ID_DOMEX_DMX3191D 0x0001 #endif -#ifndef ASM -int dmx3191d_abort(Scsi_Cmnd *); -int dmx3191d_detect(Scsi_Host_Template *); -const char* dmx3191d_info(struct Scsi_Host *); -int dmx3191d_proc_info(char *, char **, off_t, int, int, int); -int dmx3191d_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -int dmx3191d_release_resources(struct Scsi_Host *); -int dmx3191d_bus_reset(Scsi_Cmnd *); -int dmx3191d_host_reset(Scsi_Cmnd *); -int dmx3191d_device_reset(Scsi_Cmnd *); +static int dmx3191d_abort(Scsi_Cmnd *); +static int dmx3191d_detect(Scsi_Host_Template *); +static const char* dmx3191d_info(struct Scsi_Host *); +static int dmx3191d_proc_info(char *, char **, off_t, int, int, int); +static int dmx3191d_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); +static int dmx3191d_release_resources(struct Scsi_Host *); +static int dmx3191d_bus_reset(Scsi_Cmnd *); +static int dmx3191d_host_reset(Scsi_Cmnd *); +static int dmx3191d_device_reset(Scsi_Cmnd *); #define DMX3191D { \ @@ -64,9 +63,9 @@ #define NCR5380_intr dmx3191d_intr #define NCR5380_proc_info dmx3191d_proc_info #define NCR5380_queue_command dmx3191d_queue_command -#define NCR5380_reset dmx3191d_reset - -#endif /* ASM */ +#define NCR5380_host_reset dmx3191d_host_reset +#define NCR5380_bus_reset dmx3191d_bus_reset +#define NCR5380_device_reset dmx3191d_device_reset #endif /* __DMX3191D_H */ diff -Nru a/drivers/scsi/dtc.c b/drivers/scsi/dtc.c --- a/drivers/scsi/dtc.c Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/dtc.c Mon Oct 28 16:32:37 2002 @@ -2,7 +2,7 @@ #define AUTOSENSE #define PSEUDO_DMA #define DONT_USE_INTR -#define UNSAFE /* Leave interrupts enabled during pseudo-dma I/O */ +#define UNSAFE /* Leave interrupts enabled during pseudo-dma I/O */ #define xNDEBUG (NDEBUG_INTR+NDEBUG_RESELECTION+\ NDEBUG_SELECTION+NDEBUG_ARBITRATION) #define DMA_WORKS_RIGHT @@ -77,6 +77,7 @@ #include #include #include +#include #include #include "scsi.h" #include "hosts.h" @@ -101,65 +102,77 @@ */ /* - */ + */ /* Offset from DTC_5380_OFFSET */ #define DTC_CONTROL_REG 0x100 /* rw */ #define D_CR_ACCESS 0x80 /* ro set=can access 3280 registers */ #define CSR_DIR_READ 0x40 /* rw direction, 1 = read 0 = write */ -#define CSR_RESET 0x80 /* wo Resets 53c400 */ -#define CSR_5380_REG 0x80 /* ro 5380 registers can be accessed */ -#define CSR_TRANS_DIR 0x40 /* rw Data transfer direction */ -#define CSR_SCSI_BUFF_INTR 0x20 /* rw Enable int on transfer ready */ -#define CSR_5380_INTR 0x10 /* rw Enable 5380 interrupts */ -#define CSR_SHARED_INTR 0x08 /* rw Interrupt sharing */ -#define CSR_HOST_BUF_NOT_RDY 0x04 /* ro Host buffer not ready */ -#define CSR_SCSI_BUF_RDY 0x02 /* ro SCSI buffer ready */ -#define CSR_GATED_5380_IRQ 0x01 /* ro Last block xferred */ +#define CSR_RESET 0x80 /* wo Resets 53c400 */ +#define CSR_5380_REG 0x80 /* ro 5380 registers can be accessed */ +#define CSR_TRANS_DIR 0x40 /* rw Data transfer direction */ +#define CSR_SCSI_BUFF_INTR 0x20 /* rw Enable int on transfer ready */ +#define CSR_5380_INTR 0x10 /* rw Enable 5380 interrupts */ +#define CSR_SHARED_INTR 0x08 /* rw Interrupt sharing */ +#define CSR_HOST_BUF_NOT_RDY 0x04 /* ro Host buffer not ready */ +#define CSR_SCSI_BUF_RDY 0x02 /* ro SCSI buffer ready */ +#define CSR_GATED_5380_IRQ 0x01 /* ro Last block xferred */ #define CSR_INT_BASE (CSR_SCSI_BUFF_INTR | CSR_5380_INTR) -#define DTC_BLK_CNT 0x101 /* rw +#define DTC_BLK_CNT 0x101 /* rw * # of 128-byte blocks to transfer */ -#define D_CR_ACCESS 0x80 /* ro set=can access 3280 registers */ +#define D_CR_ACCESS 0x80 /* ro set=can access 3280 registers */ #define DTC_SWITCH_REG 0x3982 /* ro - DIP switches */ #define DTC_RESUME_XFER 0x3982 /* wo - resume data xfer - * after disconnect/reconnect*/ + * after disconnect/reconnect*/ #define DTC_5380_OFFSET 0x3880 /* 8 registers here, see NCR5380.h */ /*!!!! for dtc, it's a 128 byte buffer at 3900 !!! */ -#define DTC_DATA_BUF 0x3900 /* rw 128 bytes long */ +#define DTC_DATA_BUF 0x3900 /* rw 128 bytes long */ static struct override { - unsigned int address; - int irq; + unsigned int address; + int irq; } overrides #ifdef OVERRIDE [] __initdata = OVERRIDE; #else -[4] __initdata = {{0, IRQ_AUTO}, {0, IRQ_AUTO}, {0, IRQ_AUTO}, {0, IRQ_AUTO}}; +[4] __initdata = { { +0, IRQ_AUTO}, { +0, IRQ_AUTO}, { +0, IRQ_AUTO}, { +0, IRQ_AUTO}}; #endif #define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override)) static struct base { - unsigned long address; - int noauto; -} bases[] __initdata = {{0xcc000, 0}, {0xc8000, 0}, {0xdc000, 0}, {0xd8000, 0}}; + unsigned long address; + int noauto; +} bases[] __initdata = { + { 0xcc000, 0 }, + { 0xc8000, 0 }, + { 0xdc000, 0 }, + { 0xd8000, 0 } +}; #define NO_BASES (sizeof (bases) / sizeof (struct base)) static const struct signature { - const char *string; - int offset; -} signatures[] = { {"DATA TECHNOLOGY CORPORATION BIOS", 0x25}, }; + const char *string; + int offset; +} signatures[] = { + {"DATA TECHNOLOGY CORPORATION BIOS", 0x25}, +}; #define NO_SIGNATURES (sizeof (signatures) / sizeof (struct signature)) +#ifndef MODULE /* * Function : dtc_setup(char *str, int *ints) * @@ -170,23 +183,24 @@ * */ -void __init dtc_setup(char *str, int *ints){ - static int commandline_current = 0; - int i; - if (ints[0] != 2) - printk("dtc_setup: usage dtc=address,irq\n"); - else - if (commandline_current < NO_OVERRIDES) { - overrides[commandline_current].address = ints[1]; - overrides[commandline_current].irq = ints[2]; - for (i = 0; i < NO_BASES; ++i) - if (bases[i].address == ints[1]) { - bases[i].noauto = 1; - break; - } - ++commandline_current; - } +static void __init dtc_setup(char *str, int *ints) +{ + static int commandline_current = 0; + int i; + if (ints[0] != 2) + printk("dtc_setup: usage dtc=address,irq\n"); + else if (commandline_current < NO_OVERRIDES) { + overrides[commandline_current].address = ints[1]; + overrides[commandline_current].irq = ints[2]; + for (i = 0; i < NO_BASES; ++i) + if (bases[i].address == ints[1]) { + bases[i].noauto = 1; + break; + } + ++commandline_current; + } } +#endif /* * Function : int dtc_detect(Scsi_Host_Template * tpnt) @@ -201,97 +215,92 @@ * */ -int __init dtc_detect(Scsi_Host_Template * tpnt){ - static int current_override = 0, current_base = 0; - struct Scsi_Host *instance; - unsigned int base; - int sig, count; - - tpnt->proc_name = "dtc3x80"; - tpnt->proc_info = &dtc_proc_info; - - for (count = 0; current_override < NO_OVERRIDES; ++current_override) { - base = 0; - - if (overrides[current_override].address) - base = overrides[current_override].address; - else - for (; !base && (current_base < NO_BASES); ++current_base) { +static int __init dtc_detect(Scsi_Host_Template * tpnt) +{ + static int current_override = 0, current_base = 0; + struct Scsi_Host *instance; + unsigned int base; + int sig, count; + + tpnt->proc_name = "dtc3x80"; + tpnt->proc_info = &dtc_proc_info; + + for (count = 0; current_override < NO_OVERRIDES; ++current_override) { + base = 0; + + if (overrides[current_override].address) + base = overrides[current_override].address; + else + for (; !base && (current_base < NO_BASES); ++current_base) { #if (DTCDEBUG & DTCDEBUG_INIT) - printk("scsi-dtc : probing address %08x\n", bases[current_base].address); + printk("scsi-dtc : probing address %08x\n", bases[current_base].address); #endif - for (sig = 0; sig < NO_SIGNATURES; ++sig) - if (!bases[current_base].noauto && - isa_check_signature(bases[current_base].address + - signatures[sig].offset, - signatures[sig].string, strlen(signatures[sig].string))) { - base = bases[current_base].address; + for (sig = 0; sig < NO_SIGNATURES; ++sig) + if (!bases[current_base].noauto && isa_check_signature(bases[current_base].address + signatures[sig].offset, signatures[sig].string, strlen(signatures[sig].string))) { + base = bases[current_base].address; #if (DTCDEBUG & DTCDEBUG_INIT) - printk("scsi-dtc : detected board.\n"); + printk("scsi-dtc : detected board.\n"); #endif - break; - } - } + break; + } + } #if defined(DTCDEBUG) && (DTCDEBUG & DTCDEBUG_INIT) - printk("scsi-dtc : base = %08x\n", base); + printk("scsi-dtc : base = %08x\n", base); #endif - if (!base) - break; + if (!base) + break; - instance = scsi_register (tpnt, sizeof(struct NCR5380_hostdata)); - if(instance == NULL) - break; - - instance->base = base; - - NCR5380_init(instance, 0); - - NCR5380_write(DTC_CONTROL_REG, CSR_5380_INTR); /* Enable int's */ - if (overrides[current_override].irq != IRQ_AUTO) - instance->irq = overrides[current_override].irq; - else - instance->irq = NCR5380_probe_irq(instance, DTC_IRQS); + instance = scsi_register(tpnt, sizeof(struct NCR5380_hostdata)); + if (instance == NULL) + break; + + instance->base = base; + + NCR5380_init(instance, 0); + + NCR5380_write(DTC_CONTROL_REG, CSR_5380_INTR); /* Enable int's */ + if (overrides[current_override].irq != IRQ_AUTO) + instance->irq = overrides[current_override].irq; + else + instance->irq = NCR5380_probe_irq(instance, DTC_IRQS); #ifndef DONT_USE_INTR -/* With interrupts enabled, it will sometimes hang when doing heavy - * reads. So better not enable them until I finger it out. */ - if (instance->irq != IRQ_NONE) - if (request_irq(instance->irq, do_dtc_intr, SA_INTERRUPT, "dtc", instance)) { - printk("scsi%d : IRQ%d not free, interrupts disabled\n", - instance->host_no, instance->irq); - instance->irq = IRQ_NONE; - } - - if (instance->irq == IRQ_NONE) { - printk("scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no); - printk("scsi%d : please jumper the board for a free IRQ.\n", instance->host_no); - } + /* With interrupts enabled, it will sometimes hang when doing heavy + * reads. So better not enable them until I finger it out. */ + if (instance->irq != IRQ_NONE) + if (request_irq(instance->irq, dtc_intr, SA_INTERRUPT, "dtc", instance)) { + printk(KERN_ERR "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); + instance->irq = IRQ_NONE; + } + + if (instance->irq == IRQ_NONE) { + printk(KERN_WARNING "scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no); + printk(KERN_WARNING "scsi%d : please jumper the board for a free IRQ.\n", instance->host_no); + } #else - if (instance->irq != IRQ_NONE) - printk("scsi%d : interrupts not used. Might as well not jumper it.\n", - instance->host_no); - instance->irq = IRQ_NONE; + if (instance->irq != IRQ_NONE) + printk(KERN_WARNING "scsi%d : interrupts not used. Might as well not jumper it.\n", instance->host_no); + instance->irq = IRQ_NONE; #endif #if defined(DTCDEBUG) && (DTCDEBUG & DTCDEBUG_INIT) - printk("scsi%d : irq = %d\n", instance->host_no, instance->irq); + printk("scsi%d : irq = %d\n", instance->host_no, instance->irq); #endif - printk("scsi%d : at 0x%05X", instance->host_no, (int)instance->base); - if (instance->irq == IRQ_NONE) - printk (" interrupts disabled"); - else - printk (" irq %d", instance->irq); - printk(" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d", - CAN_QUEUE, CMD_PER_LUN, DTC_PUBLIC_RELEASE); - NCR5380_print_options(instance); - printk("\n"); - - ++current_override; - ++count; - } - return count; + printk(KERN_INFO "scsi%d : at 0x%05X", instance->host_no, (int) instance->base); + if (instance->irq == IRQ_NONE) + printk(" interrupts disabled"); + else + printk(" irq %d", instance->irq); + printk(" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d", CAN_QUEUE, CMD_PER_LUN, DTC_PUBLIC_RELEASE); + NCR5380_print_options(instance); + printk("\n"); + + ++current_override; + ++count; + } + return count; } /* @@ -314,14 +323,14 @@ * and matching the H_C_S coordinates to what DOS uses. */ -int dtc_biosparam(Disk * disk, struct block_device *dev, int * ip) +static int dtc_biosparam(Disk * disk, struct block_device *dev, int *ip) { - int size = disk->capacity; + int size = disk->capacity; - ip[0] = 64; - ip[1] = 32; - ip[2] = size >> 11; - return 0; + ip[0] = 64; + ip[1] = 32; + ip[2] = size >> 11; + return 0; } @@ -341,43 +350,43 @@ static int dtc_maxi = 0; static int dtc_wmaxi = 0; -static inline int NCR5380_pread (struct Scsi_Host *instance, - unsigned char *dst, int len) - { - unsigned char *d = dst; - int i; /* For counting time spent in the poll-loop */ - NCR5380_local_declare(); - NCR5380_setup(instance); - - i = 0; - NCR5380_read(RESET_PARITY_INTERRUPT_REG); - NCR5380_write(MODE_REG, MR_ENABLE_EOP_INTR | MR_DMA_MODE); - if (instance->irq == IRQ_NONE) - NCR5380_write(DTC_CONTROL_REG, CSR_DIR_READ); - else - NCR5380_write(DTC_CONTROL_REG, CSR_DIR_READ | CSR_INT_BASE); - NCR5380_write(DTC_BLK_CNT, len >> 7); /* Block count */ - rtrc(1); - while (len > 0) { - rtrc(2); - while (NCR5380_read(DTC_CONTROL_REG) & CSR_HOST_BUF_NOT_RDY) - ++i; - rtrc(3); - isa_memcpy_fromio(d, base + DTC_DATA_BUF, 128); - d += 128; - len -= 128; - rtrc(7); /*** with int's on, it sometimes hangs after here. +static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, int len) +{ + unsigned char *d = dst; + int i; /* For counting time spent in the poll-loop */ + NCR5380_local_declare(); + NCR5380_setup(instance); + + i = 0; + NCR5380_read(RESET_PARITY_INTERRUPT_REG); + NCR5380_write(MODE_REG, MR_ENABLE_EOP_INTR | MR_DMA_MODE); + if (instance->irq == IRQ_NONE) + NCR5380_write(DTC_CONTROL_REG, CSR_DIR_READ); + else + NCR5380_write(DTC_CONTROL_REG, CSR_DIR_READ | CSR_INT_BASE); + NCR5380_write(DTC_BLK_CNT, len >> 7); /* Block count */ + rtrc(1); + while (len > 0) { + rtrc(2); + while (NCR5380_read(DTC_CONTROL_REG) & CSR_HOST_BUF_NOT_RDY) + ++i; + rtrc(3); + isa_memcpy_fromio(d, base + DTC_DATA_BUF, 128); + d += 128; + len -= 128; + rtrc(7); + /*** with int's on, it sometimes hangs after here. * Looks like something makes HBNR go away. */ - } - rtrc(4); - while ( !(NCR5380_read(DTC_CONTROL_REG) & D_CR_ACCESS)) - ++i; - NCR5380_write(MODE_REG, 0); /* Clear the operating mode */ - rtrc(0); - NCR5380_read(RESET_PARITY_INTERRUPT_REG); - if (i > dtc_maxi) - dtc_maxi = i; - return(0); + } + rtrc(4); + while (!(NCR5380_read(DTC_CONTROL_REG) & D_CR_ACCESS)) + ++i; + NCR5380_write(MODE_REG, 0); /* Clear the operating mode */ + rtrc(0); + NCR5380_read(RESET_PARITY_INTERRUPT_REG); + if (i > dtc_maxi) + dtc_maxi = i; + return (0); } /**************************************************************** @@ -393,44 +402,44 @@ * timeout. */ -static inline int NCR5380_pwrite (struct Scsi_Host *instance, - unsigned char *src, int len) { - int i; - NCR5380_local_declare(); - NCR5380_setup(instance); - - NCR5380_read(RESET_PARITY_INTERRUPT_REG); - NCR5380_write(MODE_REG, MR_ENABLE_EOP_INTR | MR_DMA_MODE); - /* set direction (write) */ - if (instance->irq == IRQ_NONE) - NCR5380_write(DTC_CONTROL_REG, 0); - else - NCR5380_write(DTC_CONTROL_REG, CSR_5380_INTR); - NCR5380_write(DTC_BLK_CNT, len >> 7); /* Block count */ - for (i = 0; len > 0; ++i) { - rtrc(5); - /* Poll until the host buffer can accept data. */ - while (NCR5380_read(DTC_CONTROL_REG) & CSR_HOST_BUF_NOT_RDY) - ++i; - rtrc(3); - isa_memcpy_toio(base + DTC_DATA_BUF, src, 128); - src += 128; - len -= 128; - } - rtrc(4); - while ( !(NCR5380_read(DTC_CONTROL_REG) & D_CR_ACCESS)) - ++i; - rtrc(6); - /* Wait until the last byte has been sent to the disk */ - while (!(NCR5380_read(TARGET_COMMAND_REG) & TCR_LAST_BYTE_SENT)) - ++i; - rtrc(7); - /* Check for parity error here. fixme. */ - NCR5380_write(MODE_REG, 0); /* Clear the operating mode */ - rtrc(0); - if (i > dtc_wmaxi) - dtc_wmaxi = i; - return (0); +static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src, int len) +{ + int i; + NCR5380_local_declare(); + NCR5380_setup(instance); + + NCR5380_read(RESET_PARITY_INTERRUPT_REG); + NCR5380_write(MODE_REG, MR_ENABLE_EOP_INTR | MR_DMA_MODE); + /* set direction (write) */ + if (instance->irq == IRQ_NONE) + NCR5380_write(DTC_CONTROL_REG, 0); + else + NCR5380_write(DTC_CONTROL_REG, CSR_5380_INTR); + NCR5380_write(DTC_BLK_CNT, len >> 7); /* Block count */ + for (i = 0; len > 0; ++i) { + rtrc(5); + /* Poll until the host buffer can accept data. */ + while (NCR5380_read(DTC_CONTROL_REG) & CSR_HOST_BUF_NOT_RDY) + ++i; + rtrc(3); + isa_memcpy_toio(base + DTC_DATA_BUF, src, 128); + src += 128; + len -= 128; + } + rtrc(4); + while (!(NCR5380_read(DTC_CONTROL_REG) & D_CR_ACCESS)) + ++i; + rtrc(6); + /* Wait until the last byte has been sent to the disk */ + while (!(NCR5380_read(TARGET_COMMAND_REG) & TCR_LAST_BYTE_SENT)) + ++i; + rtrc(7); + /* Check for parity error here. fixme. */ + NCR5380_write(MODE_REG, 0); /* Clear the operating mode */ + rtrc(0); + if (i > dtc_wmaxi) + dtc_wmaxi = i; + return (0); } MODULE_LICENSE("GPL"); diff -Nru a/drivers/scsi/dtc.h b/drivers/scsi/dtc.h --- a/drivers/scsi/dtc.h Mon Oct 28 16:32:35 2002 +++ b/drivers/scsi/dtc.h Mon Oct 28 16:32:35 2002 @@ -28,19 +28,16 @@ #ifndef DTC3280_H #define DTC3280_H -#ifndef ASM -int dtc_abort(Scsi_Cmnd *); -int dtc_biosparam(Disk *, struct block_device *, int*); -int dtc_detect(Scsi_Host_Template *); -int dtc_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -int dtc_reset(Scsi_Cmnd *, unsigned int reset_flags); -int dtc_proc_info (char *buffer, char **start, off_t offset, +static int dtc_abort(Scsi_Cmnd *); +static int dtc_biosparam(Disk *, struct block_device *, int*); +static int dtc_detect(Scsi_Host_Template *); +static int dtc_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); +static int dtc_bus_reset(Scsi_Cmnd *); +static int dtc_device_reset(Scsi_Cmnd *); +static int dtc_host_reset(Scsi_Cmnd *); +static int dtc_proc_info (char *buffer, char **start, off_t offset, int length, int hostno, int inout); -#ifndef NULL -#define NULL 0 -#endif - #ifndef CMD_PER_LUN #define CMD_PER_LUN 2 #endif @@ -55,24 +52,26 @@ * macros when this is being used solely for the host stub. */ -#define DTC3x80 { \ - name: "DTC 3180/3280 ", \ - detect: dtc_detect, \ - queuecommand: dtc_queue_command, \ - abort: dtc_abort, \ - reset: dtc_reset, \ - bios_param: dtc_biosparam, \ - can_queue: CAN_QUEUE, \ - this_id: 7, \ - sg_tablesize: SG_ALL, \ - cmd_per_lun: CMD_PER_LUN , \ +#define DTC3x80 { \ + name: "DTC 3180/3280 ", \ + detect: dtc_detect, \ + queuecommand: dtc_queue_command, \ + eh_abort_handler: dtc_abort, \ + eh_bus_reset_handler: dtc_bus_reset, \ + eh_device_reset_handler: dtc_device_reset, \ + eh_host_reset_handler: dtc_host_reset, \ + bios_param: dtc_biosparam, \ + can_queue: CAN_QUEUE, \ + this_id: 7, \ + sg_tablesize: SG_ALL, \ + cmd_per_lun: CMD_PER_LUN , \ use_clustering: DISABLE_CLUSTERING} #define NCR5380_implementation_fields \ - volatile unsigned int base + unsigned int base #define NCR5380_local_declare() \ - volatile unsigned int base + unsigned int base #define NCR5380_setup(instance) \ base = (unsigned int)(instance)->base @@ -105,12 +104,13 @@ isa_writeb(value, DTC_address(reg));} while(0) #endif -#define NCR5380_intr dtc_intr -#define do_NCR5380_intr do_dtc_intr -#define NCR5380_queue_command dtc_queue_command -#define NCR5380_abort dtc_abort -#define NCR5380_reset dtc_reset -#define NCR5380_proc_info dtc_proc_info +#define NCR5380_intr dtc_intr +#define NCR5380_queue_command dtc_queue_command +#define NCR5380_abort dtc_abort +#define NCR5380_bus_reset dtc_bus_reset +#define NCR5380_device_reset dtc_device_reset +#define NCR5380_host_reset dtc_host_reset +#define NCR5380_proc_info dtc_proc_info /* 15 12 11 10 1001 1100 0000 0000 */ @@ -118,5 +118,4 @@ #define DTC_IRQS 0x9c00 -#endif /* ndef ASM */ #endif /* DTC3280_H */ diff -Nru a/drivers/scsi/eata.c b/drivers/scsi/eata.c --- a/drivers/scsi/eata.c Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/eata.c Mon Oct 28 16:32:37 2002 @@ -1,6 +1,31 @@ /* * eata.c - Low-level driver for EATA/DMA SCSI host adapters. * + * 10 Oct 2002 Rev. 7.70 for linux 2.5.42 + * + Foreport from revision 6.70. + * + * 25 Jun 2002 Rev. 6.70 for linux 2.4.19 + * + This release is the first one tested on a Big Endian platform: + * fixed endian-ness problem due to bitfields; + * fixed endian-ness problem in read_pio. + * + Added new options for selectively probing ISA, EISA and PCI bus: + * + * Boot option Parameter name Default according to + * + * ip:[y|n] isa_probe=[1|0] CONFIG_ISA defined + * ep:[y|n] eisa_probe=[1|0] CONFIG_EISA defined + * pp:[y|n] pci_probe=[1|0] CONFIG_PCI defined + * + * The default action is to perform probing if the corrisponding + * bus is configured and to skip probing otherwise. + * + * + If pci_probe is in effect and a list of I/O ports is specified + * as parameter or boot option, pci_enable_device() is performed + * on all pci devices matching PCI_CLASS_STORAGE_SCSI. + * + * 21 Feb 2002 Rev. 6.52 for linux 2.4.18 + * + Backport from rev. 7.22 (use io_request_lock). + * * 20 Feb 2002 Rev. 7.22 for linux 2.5.5 * + Remove any reference to virt_to_bus(). * + Fix pio hang while detecting multiple HBAs. @@ -428,6 +453,9 @@ MODULE_PARM(tag_mode, "i"); MODULE_PARM(ext_tran, "i"); MODULE_PARM(rev_scan, "i"); +MODULE_PARM(isa_probe, "i"); +MODULE_PARM(eisa_probe, "i"); +MODULE_PARM(pci_probe, "i"); MODULE_AUTHOR("Dario Ballabio"); #endif @@ -455,6 +483,10 @@ #include #include +#if !defined(__BIG_ENDIAN_BITFIELD) && !defined(__LITTLE_ENDIAN_BITFIELD) +#error "Adjust your defines" +#endif + /* Subversion values */ #define ISA 0 #define ESA 1 @@ -512,7 +544,7 @@ #define REG_LM 3 #define REG_MID 4 #define REG_MSB 5 -#define REGION_SIZE 9 +#define REGION_SIZE 9UL #define MAX_ISA_ADDR 0x03ff #define MIN_EISA_ADDR 0x1c88 #define MAX_EISA_ADDR 0xfc88 @@ -536,7 +568,7 @@ #define TLDEV(type) ((type) == TYPE_DISK || (type) == TYPE_ROM) /* "EATA", in Big Endian format */ -#define EATA_SIGNATURE 0x41544145 +#define EATA_SIG_BE 0x45415441 /* Number of valid bytes in the board config structure for EATA 2.0x */ #define EATA_2_0A_SIZE 28 @@ -547,6 +579,12 @@ struct eata_info { u_int32_t data_len; /* Number of valid bytes after this field */ u_int32_t sign; /* ASCII "EATA" signature */ + +#if defined(__BIG_ENDIAN_BITFIELD) + unchar version:4, :4; + unchar haaval:1, ata:1, drqvld:1, dmasup:1, morsup:1, trnxfr:1, tarsup:1, + ocsena:1; +#else unchar :4, /* unused low nibble */ version:4; /* EATA version, should be 0x1 */ unchar ocsena:1, /* Overlap Command Support Enabled */ @@ -557,6 +595,8 @@ drqvld:1, /* DRQ Index (DRQX) is valid */ ata:1, /* This is an ATA device */ haaval:1; /* Host Adapter Address Valid */ +#endif + ushort cp_pad_len; /* Number of pad bytes after cp_len */ unchar host_addr[4]; /* Host Adapter SCSI ID for channels 3, 2, 1, 0 */ u_int32_t cp_len; /* Number of valid bytes in cp */ @@ -564,6 +604,15 @@ ushort queue_size; /* Max number of cp that can be queued */ ushort unused; ushort scatt_size; /* Max number of entries in scatter/gather table */ + +#if defined(__BIG_ENDIAN_BITFIELD) + unchar drqx:2, second:1, irq_tr:1, irq:4; + unchar sync; + unchar :4, res1:1, large_sg:1, forcaddr:1, isaena:1; + unchar max_chan:3, max_id:5; + unchar max_lun; + unchar eisa:1, pci:1, idquest:1, m1:1, :4; +#else unchar irq:4, /* Interrupt Request assigned to this controller */ irq_tr:1, /* 0 for edge triggered, 1 for level triggered */ second:1, /* 1 if this is a secondary (not primary) controller */ @@ -586,6 +635,8 @@ idquest:1, /* RAIDNUM returned is questionable */ pci:1, /* This board is PCI */ eisa:1; /* This board is EISA */ +#endif + unchar raidnum; /* Uniquely identifies this HBA in a system */ unchar notused; @@ -595,18 +646,30 @@ /* Board config structure */ struct eata_config { ushort len; /* Number of bytes following this field */ + +#if defined(__BIG_ENDIAN_BITFIELD) + unchar :4, tarena:1, mdpena:1, ocena:1, edis:1; +#else unchar edis:1, /* Disable EATA interface after config command */ ocena:1, /* Overlapped Commands Enabled */ mdpena:1, /* Transfer all Modified Data Pointer Messages */ tarena:1, /* Target Mode Enabled for this controller */ :4; +#endif + unchar cpad[511]; }; /* Returned status packet structure */ struct mssp { + +#if defined(__BIG_ENDIAN_BITFIELD) + unchar eoc:1, adapter_status:7; +#else unchar adapter_status:7, /* State related to current command */ eoc:1; /* End Of Command (1 = command completed) */ +#endif + unchar target_status; /* SCSI status received after data transfer */ unchar unused[2]; u_int32_t inv_res_len; /* Number of bytes not transferred */ @@ -621,6 +684,16 @@ /* MailBox SCSI Command Packet */ struct mscp { + +#if defined(__BIG_ENDIAN_BITFIELD) + unchar din:1, dout:1, interp:1, :1, sg:1, reqsen:1, init:1, sreset:1; + unchar sense_len; + unchar unused[3]; + unchar :7, fwnest:1; + unchar :5, hbaci:1, iat:1, phsunit:1; + unchar channel:3, target:5; + unchar one:1, dispri:1, luntar:1, lun:5; +#else unchar sreset:1, /* SCSI Bus Reset Signal should be asserted */ init:1, /* Re-initialize controller and self test */ reqsen:1, /* Transfer Request Sense Data to addr using DMA */ @@ -643,6 +716,8 @@ luntar:1, /* This cp is for Target (not LUN) */ dispri:1, /* Disconnect Privilege granted */ one:1; /* 1 */ +#endif + unchar mess[3]; /* Massage to/from Target */ unchar cdb[12]; /* Command Descriptor Block */ u_int32_t data_len; /* If sg=0 Data Length, if sg=1 sglist length */ @@ -719,8 +794,13 @@ #define BN(board) (HD(board)->board_name) /* Device is Big Endian */ -#define H2DEV(x) cpu_to_be32(x) -#define DEV2H(x) be32_to_cpu(x) +#define H2DEV(x) cpu_to_be32(x) +#define DEV2H(x) be32_to_cpu(x) +#define H2DEV16(x) cpu_to_be16(x) +#define DEV2H16(x) be16_to_cpu(x) + +/* But transfer orientation from the 16 bit data register is Little Endian */ +#define REG2H(x) le16_to_cpu(x) static void do_interrupt_handler(int, void *, struct pt_regs *); static void flush_dev(Scsi_Device *, unsigned long, unsigned int, unsigned int); @@ -750,6 +830,24 @@ static int max_queue_depth = MAX_CMD_PER_LUN; #endif +#if defined(CONFIG_ISA) +static int isa_probe = TRUE; +#else +static int isa_probe = FALSE; +#endif + +#if defined(CONFIG_EISA) +static int eisa_probe = TRUE; +#else +static int eisa_probe = FALSE; +#endif + +#if defined(CONFIG_PCI) +static int pci_probe = TRUE; +#else +static int pci_probe = FALSE; +#endif + static int eata2x_slave_attach(Scsi_Device *dev) { int j, tqd, utqd; char *link_suffix = ""; @@ -791,14 +889,18 @@ } static inline int do_dma(unsigned long iobase, unsigned long addr, unchar cmd) { + unsigned char *byaddr; + unsigned long devaddr; if (wait_on_busy(iobase, (addr ? MAXLOOP * 100 : MAXLOOP))) return TRUE; - if ((addr = H2DEV(addr))) { - outb((char) (addr >> 24), iobase + REG_LOW); - outb((char) (addr >> 16), iobase + REG_LM); - outb((char) (addr >> 8), iobase + REG_MID); - outb((char) addr, iobase + REG_MSB); + if (addr) { + devaddr = H2DEV(addr); + byaddr = (unsigned char *) &devaddr; + outb(byaddr[3], iobase + REG_LOW); + outb(byaddr[2], iobase + REG_LM); + outb(byaddr[1], iobase + REG_MID); + outb(byaddr[0], iobase + REG_MSB); } outb(cmd, iobase + REG_CMD); @@ -817,7 +919,7 @@ } loop = MAXLOOP; - *p = inw(iobase); + *p = REG2H(inw(iobase)); } return FALSE; @@ -848,6 +950,29 @@ return NULL; } +static void enable_pci_ports(void) { + +#if defined(CONFIG_PCI) + + struct pci_dev *dev = NULL; + + if (!pci_present()) return; + + while((dev = pci_find_class(PCI_CLASS_STORAGE_SCSI << 8, dev))) { + +#if defined(DEBUG_PCI_DETECT) + printk("%s: enable_pci_ports, bus %d, devfn 0x%x.\n", + driver_name, dev->bus->number, dev->devfn); +#endif + + if (pci_enable_device (dev)) + printk("%s: warning, pci_enable_device failed, bus %d devfn 0x%x.\n", + driver_name, dev->bus->number, dev->devfn); + } + +#endif /* end CONFIG_PCI */ +} + static inline int port_detect \ (unsigned long port_base, unsigned int j, Scsi_Host_Template *tpnt) { unsigned char irq, dma_channel, subversion, i, is_pci = FALSE; @@ -871,31 +996,48 @@ } if (do_dma(port_base, 0, READ_CONFIG_PIO)) { +#if defined(DEBUG_DETECT) + printk("%s: detect, do_dma failed at 0x%03lx.\n", name, port_base); +#endif release_region(port_base, REGION_SIZE); return FALSE; } /* Read the info structure */ if (read_pio(port_base, (ushort *)&info, (ushort *)&info.ipad[0])) { +#if defined(DEBUG_DETECT) + printk("%s: detect, read_pio failed at 0x%03lx.\n", name, port_base); +#endif release_region(port_base, REGION_SIZE); return FALSE; } + info.data_len = DEV2H(info.data_len); + info.sign = DEV2H(info.sign); + info.cp_pad_len = DEV2H16(info.cp_pad_len); + info.cp_len = DEV2H(info.cp_len); + info.sp_len = DEV2H(info.sp_len); + info.scatt_size = DEV2H16(info.scatt_size); + info.queue_size = DEV2H16(info.queue_size); + /* Check the controller "EATA" signature */ - if (info.sign != EATA_SIGNATURE) { + if (info.sign != EATA_SIG_BE) { +#if defined(DEBUG_DETECT) + printk("%s: signature 0x%04x discarded.\n", name, info.sign); +#endif release_region(port_base, REGION_SIZE); return FALSE; } - if (DEV2H(info.data_len) < EATA_2_0A_SIZE) { + if (info.data_len < EATA_2_0A_SIZE) { printk("%s: config structure size (%d bytes) too short, detaching.\n", - name, DEV2H(info.data_len)); + name, info.data_len); release_region(port_base, REGION_SIZE); return FALSE; } - else if (DEV2H(info.data_len) == EATA_2_0A_SIZE) + else if (info.data_len == EATA_2_0A_SIZE) protocol_rev = 'A'; - else if (DEV2H(info.data_len) == EATA_2_0B_SIZE) + else if (info.data_len == EATA_2_0B_SIZE) protocol_rev = 'B'; else protocol_rev = 'C'; @@ -1007,7 +1149,7 @@ /* Set board configuration */ memset((char *)cf, 0, sizeof(struct eata_config)); - cf->len = (ushort) cpu_to_be16((ushort)510); + cf->len = (ushort) H2DEV16((ushort)510); cf->ocena = TRUE; if (do_dma(port_base, cf_dma_addr, SET_CONFIG_DMA)) { @@ -1038,9 +1180,9 @@ sh[j]->n_io_port = REGION_SIZE; sh[j]->dma_channel = dma_channel; sh[j]->irq = irq; - sh[j]->sg_tablesize = (ushort) be16_to_cpu(info.scatt_size); + sh[j]->sg_tablesize = (ushort) info.scatt_size; sh[j]->this_id = (ushort) info.host_addr[3]; - sh[j]->can_queue = (ushort) be16_to_cpu(info.queue_size); + sh[j]->can_queue = (ushort) info.queue_size; sh[j]->cmd_per_lun = MAX_CMD_PER_LUN; memset(HD(j), 0, sizeof(struct hostdata)); HD(j)->subversion = subversion; @@ -1137,9 +1279,11 @@ if (j == 0) { printk("EATA/DMA 2.0x: Copyright (C) 1994-2002 Dario Ballabio.\n"); - printk("%s config options -> tc:%c, lc:%c, mq:%d, rs:%c, et:%c.\n", - driver_name, tag_type, YESNO(linked_comm), max_queue_depth, - YESNO(rev_scan), YESNO(ext_tran)); + printk("%s config options -> tc:%c, lc:%c, mq:%d, rs:%c, et:%c, "\ + "ip:%c, ep:%c, pp:%c.\n", driver_name, tag_type, + YESNO(linked_comm), max_queue_depth, YESNO(rev_scan), + YESNO(ext_tran), YESNO(isa_probe), YESNO(eisa_probe), + YESNO(pci_probe)); } printk("%s: 2.0%c, %s 0x%03lx, IRQ %u, %s, SG %d, MB %d.\n", @@ -1158,8 +1302,8 @@ printk("%s: Vers. 0x%x, ocs %u, tar %u, trnxfr %u, more %u, SYNC 0x%x, "\ "sec. %u, infol %d, cpl %d spl %d.\n", name, info.version, info.ocsena, info.tarsup, info.trnxfr, info.morsup, info.sync, - info.second, DEV2H(info.data_len), DEV2H(info.cp_len), - DEV2H(info.sp_len)); + info.second, info.data_len, info.cp_len, + info.sp_len); if (protocol_rev == 'B' || protocol_rev == 'C') printk("%s: isaena %u, forcaddr %u, max_id %u, max_chan %u, "\ @@ -1209,6 +1353,9 @@ else if (!strncmp(cur, "ls:", 3)) link_statistics = val; else if (!strncmp(cur, "et:", 3)) ext_tran = val; else if (!strncmp(cur, "rs:", 3)) rev_scan = val; + else if (!strncmp(cur, "ip:", 3)) isa_probe = val; + else if (!strncmp(cur, "ep:", 3)) eisa_probe = val; + else if (!strncmp(cur, "pp:", 3)) pci_probe = val; if ((cur = strchr(cur, ','))) ++cur; } @@ -1293,7 +1440,19 @@ for (k = 0; k < MAX_BOARDS + 1; k++) sh[k] = NULL; - if (!setup_done) add_pci_ports(); + for (k = MAX_INT_PARAM; io_port[k]; k++) + if (io_port[k] == SKIP) continue; + else if (io_port[k] <= MAX_ISA_ADDR) { + if (!isa_probe) io_port[k] = SKIP; + } + else if (io_port[k] >= MIN_EISA_ADDR && io_port[k] <= MAX_EISA_ADDR) { + if (!eisa_probe) io_port[k] = SKIP; + } + + if (pci_probe) { + if (!setup_done) add_pci_ports(); + else enable_pci_ports(); + } for (k = 0; io_port[k]; k++) { @@ -1984,6 +2143,19 @@ /* Read the status register to clear the interrupt indication */ reg = inb(sh[j]->io_port + REG_STATUS); + +#if defined (DEBUG_INTERRUPT) + { + unsigned char *bytesp; + int cnt; + bytesp= (unsigned char *) spp; + if (HD(j)->iocount < 200) { + printk("sp[] ="); + for (cnt=0; cnt < 15; cnt++) printk(" 0x%x", bytesp[cnt]); + printk("\n"); + } + } +#endif /* Reject any sp with supspect data */ if (spp->eoc == FALSE && HD(j)->iocount > 1) diff -Nru a/drivers/scsi/eata.h b/drivers/scsi/eata.h --- a/drivers/scsi/eata.h Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/eata.h Mon Oct 28 16:32:36 2002 @@ -14,7 +14,7 @@ int eata2x_biosparam(Disk *, struct block_device *, int *); static int eata2x_slave_attach(Scsi_Device *); -#define EATA_VERSION "7.22.00" +#define EATA_VERSION "7.70.00" #define EATA { \ name: "EATA/DMA 2.0x rev. " EATA_VERSION " ", \ diff -Nru a/drivers/scsi/eata_generic.h b/drivers/scsi/eata_generic.h --- a/drivers/scsi/eata_generic.h Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/eata_generic.h Mon Oct 28 16:32:37 2002 @@ -94,12 +94,6 @@ #define CD(cmd) ((struct eata_ccb *)(cmd->host_scribble)) #define SD(host) ((hostdata *)&(host->hostdata)) -#define DELAY(x) { ulong flags, i; \ - save_flags(flags); sti(); \ - i = jiffies + (x * HZ); \ - while (jiffies < i); \ - restore_flags(flags); } - /*********************************************** * EATA Command & Register definitions * ***********************************************/ diff -Nru a/drivers/scsi/eata_pio.c b/drivers/scsi/eata_pio.c --- a/drivers/scsi/eata_pio.c Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/eata_pio.c Mon Oct 28 16:32:37 2002 @@ -99,7 +99,7 @@ else { SCp->buffer++; - SCp->ptr=SCp->buffer->address; + SCp->ptr=page_address(SCp->buffer->page) + SCp->buffer->offset; SCp->this_residual=SCp->buffer->length; } } @@ -124,15 +124,11 @@ hostdata *hd; struct eata_ccb *cp; uint base; - ulong flags; uint x,z; struct Scsi_Host *sh; ushort zwickel=0; unchar stat,odd; - save_flags(flags); - cli(); - for (x = 1, sh = first_HBA; x <= registered_HBAs; x++, sh = SD(sh)->prev) { if (sh->irq != irq) continue; @@ -234,10 +230,8 @@ if (cp->status == LOCKED) { cp->status = FREE; eata_stat = inb(base + HA_RSTATUS); - printk(KERN_NOTICE "eata_pio: int_handler, freeing locked " + printk(KERN_CRIT "eata_pio: int_handler, freeing locked " "queueslot\n"); - DBG(DBG_INTR&&DBG_DELAY,DELAY(1)); - restore_flags(flags); return; } @@ -245,17 +239,12 @@ if (stat != 0x50) printk(KERN_DEBUG "stat: %#.2x, result: %#.8x\n", stat, cmd->result); - DBG(DBG_INTR&&DBG_DELAY,DELAY(1)); #endif cp->status = FREE; /* now we can release the slot */ - restore_flags(flags); cmd->scsi_done(cmd); - save_flags(flags); - cli(); } - restore_flags(flags); return; } @@ -281,16 +270,12 @@ int eata_pio_queue(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) { uint x, y; - long flags; uint base; hostdata *hd; struct Scsi_Host *sh; struct eata_ccb *cp; - save_flags(flags); - cli(); - queue_counter++; hd = HD(cmd); @@ -322,10 +307,10 @@ DBG(DBG_QUEUE, printk(KERN_DEBUG "eata_pio_queue pid %ld, target: %x, lun:" " %x, y %d\n", cmd->pid, cmd->target, cmd->lun, y)); - DBG(DBG_QUEUE && DBG_DELAY, DELAY(1)); cmd->scsi_done = (void *)done; + /* FIXME: use passed direction flag !! */ switch (cmd->cmnd[0]) { case CHANGE_DEFINITION: case COMPARE: case COPY: case COPY_VERIFY: case LOG_SELECT: case MODE_SELECT: @@ -372,7 +357,7 @@ } else { cmd->SCp.buffer = cmd->request_buffer; cmd->SCp.buffers_residual = cmd->use_sg; - cmd->SCp.ptr = cmd->SCp.buffer->address; + cmd->SCp.ptr = page_address(cmd->SCp.buffer->page) + cmd->SCp.buffer->offset; cmd->SCp.this_residual = cmd->SCp.buffer->length; } cmd->SCp.Status = (cmd->SCp.this_residual != 0); /* TRUE as long as bytes @@ -385,10 +370,10 @@ "returning DID_BUS_BUSY, done.\n", cmd->target, cmd->pid); done(cmd); cp->status = FREE; - restore_flags(flags); return (0); } - while (!(inb(base + HA_RSTATUS) & HA_SDRQ)); + while (!(inb(base + HA_RSTATUS) & HA_SDRQ)) + cpu_relax(); outsw(base + HA_RDATA, cp, hd->cplen); outb(EATA_CMD_PIO_TRUNC, base + HA_WCOMMAND); for (x = 0; x < hd->cppadlen; x++) outw(0, base + HA_RDATA); @@ -396,9 +381,7 @@ DBG(DBG_QUEUE,printk(KERN_DEBUG "Queued base %#.4lx pid: %ld target: %x " "lun: %x slot %d irq %d\n", (long)sh->base, cmd->pid, cmd->target, cmd->lun, y, sh->irq)); - DBG(DBG_QUEUE && DBG_DELAY, DELAY(1)); - restore_flags(flags); return (0); } @@ -407,66 +390,58 @@ ulong flags; uint loop = HZ; - save_flags(flags); - cli(); - + spin_lock_irqsave(cmd->host->host_lock, flags); DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_abort called pid: %ld " "target: %x lun: %x reason %x\n", cmd->pid, cmd->target, cmd->lun, cmd->abort_reason)); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); while (inb((uint)(cmd->host->base) + HA_RAUXSTAT) & HA_ABUSY) if (--loop == 0) { printk(KERN_WARNING "eata_pio: abort, timeout error.\n"); - restore_flags(flags); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); + spin_unlock_irqrestore(cmd->host->host_lock, flags); return (SCSI_ABORT_ERROR); } if (CD(cmd)->status == FREE) { DBG(DBG_ABNORM, printk(KERN_WARNING "Returning: SCSI_ABORT_NOT_RUNNING\n")); - restore_flags(flags); + spin_unlock_irqrestore(cmd->host->host_lock, flags); return (SCSI_ABORT_NOT_RUNNING); } if (CD(cmd)->status == USED) { DBG(DBG_ABNORM, printk(KERN_WARNING "Returning: SCSI_ABORT_BUSY\n")); - restore_flags(flags); + spin_unlock_irqrestore(cmd->host->host_lock, flags); return (SCSI_ABORT_BUSY); /* SNOOZE */ } if (CD(cmd)->status == RESET) { - restore_flags(flags); + spin_unlock_irqrestore(cmd->host->host_lock, flags); printk(KERN_WARNING "eata_pio: abort, command reset error.\n"); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); return (SCSI_ABORT_ERROR); } if (CD(cmd)->status == LOCKED) { - restore_flags(flags); + spin_unlock_irqrestore(cmd->host->host_lock, flags); DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio: abort, queue slot " "locked.\n")); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); return (SCSI_ABORT_NOT_RUNNING); } - restore_flags(flags); + spin_unlock_irqrestore(cmd->host->host_lock, flags); panic("eata_pio: abort: invalid slot status\n"); } int eata_pio_reset(Scsi_Cmnd * cmd, unsigned int dummy) { - uint x, time, limit = 0; + uint x, limit = 0; ulong flags; unchar success = FALSE; Scsi_Cmnd *sp; - save_flags(flags); - cli(); DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset called pid:%ld target:" " %x lun: %x reason %x\n", cmd->pid, cmd->target, cmd->lun, cmd->abort_reason)); + spin_lock_irqsave(cmd->host->host_lock, flags); if (HD(cmd)->state == RESET) { printk(KERN_WARNING "eata_pio_reset: exit, already in reset.\n"); - restore_flags(flags); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); + spin_unlock_irqrestore(cmd->host->host_lock, flags); return (SCSI_RESET_ERROR); } @@ -481,11 +456,9 @@ HD(cmd)->ccb[x].status = RESET; printk(KERN_WARNING "eata_pio_reset: slot %d in reset, pid %ld.\n", x, sp->pid); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); if (sp == NULL) panic("eata_pio_reset: slot %d, sp==NULL.\n", x); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); } /* hard reset the HBA */ @@ -494,12 +467,11 @@ DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset: board reset done.\n")); HD(cmd)->state = RESET; - time = jiffies; - while (time_before(jiffies, time + 3 * HZ) && limit++ < 10000000); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(3*HZ); DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset: interrupts disabled, " "loops %d.\n", limit)); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); for (x = 0; x < cmd->host->can_queue; x++) { @@ -514,21 +486,17 @@ printk(KERN_WARNING "eata_pio_reset: reset ccb %d.\n",x); HD(cmd)->ccb[x].status = FREE; - restore_flags(flags); sp->scsi_done(sp); - cli(); } HD(cmd)->state = FALSE; - restore_flags(flags); + spin_unlock_irqrestore(cmd->host->host_lock, flags); if (success) { /* hmmm... */ DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset: exit, success.\n")); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); return (SCSI_RESET_SUCCESS); } else { DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset: exit, wakeup.\n")); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); return (SCSI_RESET_PUNT); } } @@ -643,7 +611,6 @@ printk("IRQ:%d IRQT:%d FORCADR:%d MCH:%d RIDQ:%d\n", gc->IRQ, gc->IRQ_TR, gc->FORCADR, gc->MAX_CHAN, gc->ID_qest); - DBG(DPT_DEBUG, DELAY(14)); } static uint print_selftest(uint base) @@ -949,9 +916,6 @@ struct get_conf gc; int i; - DBG((DBG_PROBE && DBG_DELAY) || DPT_DEBUG, - printk("Using lots of delays to let you read the debugging output\n")); - tpnt->proc_name = "eata_pio"; find_pio_PCI(&gc, tpnt); @@ -989,8 +953,6 @@ HBA_ptr = SD(HBA_ptr)->next; } } - DBG(DPT_DEBUG,DELAY(12)); - return (registered_HBAs); } diff -Nru a/drivers/scsi/fd_mcs.c b/drivers/scsi/fd_mcs.c --- a/drivers/scsi/fd_mcs.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/fd_mcs.c Mon Oct 28 16:32:36 2002 @@ -96,7 +96,7 @@ #include "fd_mcs.h" #define DRIVER_VERSION "v0.2 by ZP Gu" - + /* START OF USER DEFINABLE OPTIONS */ #define DEBUG 0 /* Enable debugging output */ @@ -112,7 +112,7 @@ #define DEBUG_MESSAGES 1 /* Debug MESSAGE IN phase */ #define DEBUG_ABORT 1 /* Debug abort() routine */ #define DEBUG_RESET 1 /* Debug reset() routine */ -#define DEBUG_RACE 1 /* Debug interrupt-driven race condition */ +#define DEBUG_RACE 1 /* Debug interrupt-driven race condition */ #else #define EVERY_ACCESS 0 /* LEAVE THESE ALONE--CHANGE THE ONES ABOVE */ #define ERRORS_ONLY 0 @@ -136,86 +136,86 @@ #endif enum chip_type { - unknown = 0x00, - tmc1800 = 0x01, - tmc18c50 = 0x02, - tmc18c30 = 0x03, + unknown = 0x00, + tmc1800 = 0x01, + tmc18c50 = 0x02, + tmc18c30 = 0x03, }; enum { - in_arbitration = 0x02, - in_selection = 0x04, - in_other = 0x08, - disconnect = 0x10, - aborted = 0x20, - sent_ident = 0x40, + in_arbitration = 0x02, + in_selection = 0x04, + in_other = 0x08, + disconnect = 0x10, + aborted = 0x20, + sent_ident = 0x40, }; enum in_port_type { - Read_SCSI_Data = 0, - SCSI_Status = 1, - TMC_Status = 2, - FIFO_Status = 3, /* tmc18c50/tmc18c30 only */ - Interrupt_Cond = 4, /* tmc18c50/tmc18c30 only */ - LSB_ID_Code = 5, - MSB_ID_Code = 6, - Read_Loopback = 7, - SCSI_Data_NoACK = 8, - Interrupt_Status = 9, - Configuration1 = 10, - Configuration2 = 11, /* tmc18c50/tmc18c30 only */ - Read_FIFO = 12, - FIFO_Data_Count = 14 + Read_SCSI_Data = 0, + SCSI_Status = 1, + TMC_Status = 2, + FIFO_Status = 3, /* tmc18c50/tmc18c30 only */ + Interrupt_Cond = 4, /* tmc18c50/tmc18c30 only */ + LSB_ID_Code = 5, + MSB_ID_Code = 6, + Read_Loopback = 7, + SCSI_Data_NoACK = 8, + Interrupt_Status = 9, + Configuration1 = 10, + Configuration2 = 11, /* tmc18c50/tmc18c30 only */ + Read_FIFO = 12, + FIFO_Data_Count = 14 }; enum out_port_type { - Write_SCSI_Data = 0, - SCSI_Cntl = 1, - Interrupt_Cntl = 2, - SCSI_Mode_Cntl = 3, - TMC_Cntl = 4, - Memory_Cntl = 5, /* tmc18c50/tmc18c30 only */ - Write_Loopback = 7, - IO_Control = 11, /* tmc18c30 only */ - Write_FIFO = 12 + Write_SCSI_Data = 0, + SCSI_Cntl = 1, + Interrupt_Cntl = 2, + SCSI_Mode_Cntl = 3, + TMC_Cntl = 4, + Memory_Cntl = 5, /* tmc18c50/tmc18c30 only */ + Write_Loopback = 7, + IO_Control = 11, /* tmc18c30 only */ + Write_FIFO = 12 }; struct fd_hostdata { - unsigned long _bios_base; - int _bios_major; - int _bios_minor; - volatile int _in_command; - Scsi_Cmnd *_current_SC; - enum chip_type _chip; - int _adapter_mask; - int _fifo_count; /* Number of 512 byte blocks before INTR */ + unsigned long _bios_base; + int _bios_major; + int _bios_minor; + volatile int _in_command; + Scsi_Cmnd *_current_SC; + enum chip_type _chip; + int _adapter_mask; + int _fifo_count; /* Number of 512 byte blocks before INTR */ - char _adapter_name[64]; + char _adapter_name[64]; #if DEBUG_RACE - volatile int _in_interrupt_flag; + volatile int _in_interrupt_flag; #endif - int _SCSI_Mode_Cntl_port; - int _FIFO_Data_Count_port; - int _Interrupt_Cntl_port; - int _Interrupt_Status_port; - int _Interrupt_Cond_port; - int _Read_FIFO_port; - int _Read_SCSI_Data_port; - int _SCSI_Cntl_port; - int _SCSI_Data_NoACK_port; - int _SCSI_Status_port; - int _TMC_Cntl_port; - int _TMC_Status_port; - int _Write_FIFO_port; - int _Write_SCSI_Data_port; + int _SCSI_Mode_Cntl_port; + int _FIFO_Data_Count_port; + int _Interrupt_Cntl_port; + int _Interrupt_Status_port; + int _Interrupt_Cond_port; + int _Read_FIFO_port; + int _Read_SCSI_Data_port; + int _SCSI_Cntl_port; + int _SCSI_Data_NoACK_port; + int _SCSI_Status_port; + int _TMC_Cntl_port; + int _TMC_Status_port; + int _Write_FIFO_port; + int _Write_SCSI_Data_port; - int _FIFO_Size; /* = 0x2000; 8k FIFO for + int _FIFO_Size; /* = 0x2000; 8k FIFO for pre-tmc18c30 chips */ - /* simple stats */ - int _Bytes_Read; - int _Bytes_Written; - int _INTR_Processed; + /* simple stats */ + int _Bytes_Read; + int _Bytes_Written; + int _INTR_Processed; }; #define FD_MAX_HOSTS 3 /* enough? */ @@ -232,7 +232,7 @@ #define adapter_name (HOSTDATA(shpnt)->_adapter_name) #if DEBUG_RACE #define in_interrupt_flag (HOSTDATA(shpnt)->_in_interrupt_flag) -#endif +#endif #define SCSI_Mode_Cntl_port (HOSTDATA(shpnt)->_SCSI_Mode_Cntl_port) #define FIFO_Data_Count_port (HOSTDATA(shpnt)->_FIFO_Data_Count_port) #define Interrupt_Cntl_port (HOSTDATA(shpnt)->_Interrupt_Cntl_port) @@ -253,337 +253,324 @@ #define INTR_Processed (HOSTDATA(shpnt)->_INTR_Processed) struct fd_mcs_adapters_struct { - char* name; - int id; - enum chip_type fd_chip; - int fifo_size; - int fifo_count; + char *name; + int id; + enum chip_type fd_chip; + int fifo_size; + int fifo_count; }; #define REPLY_ID 0x5137 static struct fd_mcs_adapters_struct fd_mcs_adapters[] = { - { "Future Domain SCSI Adapter MCS-700(18C50)", - 0x60e9, - tmc18c50, - 0x2000, - 4 }, - { "Future Domain SCSI Adapter MCS-600/700(TMC-1800)", - 0x6127, - tmc1800, - 0x2000, - 4 }, - { "Reply Sound Blaster/SCSI Adapter", - REPLY_ID, - tmc18c30, - 0x800, - 2 }, + {"Future Domain SCSI Adapter MCS-700(18C50)", + 0x60e9, + tmc18c50, + 0x2000, + 4}, + {"Future Domain SCSI Adapter MCS-600/700(TMC-1800)", + 0x6127, + tmc1800, + 0x2000, + 4}, + {"Reply Sound Blaster/SCSI Adapter", + REPLY_ID, + tmc18c30, + 0x800, + 2}, }; #define FD_BRDS sizeof(fd_mcs_adapters)/sizeof(struct fd_mcs_adapters_struct) -static void fd_mcs_intr( int irq, void *dev_id, struct pt_regs * regs ); +static void fd_mcs_intr(int irq, void *dev_id, struct pt_regs *regs); -static unsigned long addresses[] = {0xc8000, 0xca000, 0xce000, 0xde000}; +static unsigned long addresses[] = { 0xc8000, 0xca000, 0xce000, 0xde000 }; static unsigned short ports[] = { 0x140, 0x150, 0x160, 0x170 }; static unsigned short ints[] = { 3, 5, 10, 11, 12, 14, 15, 0 }; /* host information */ static int found = 0; -static struct Scsi_Host *hosts[FD_MAX_HOSTS+1] = { NULL }; +static struct Scsi_Host *hosts[FD_MAX_HOSTS + 1] = { NULL }; static int user_fifo_count = 0; static int user_fifo_size = 0; -void fd_mcs_setup( char *str, int *ints ) +static void fd_mcs_setup(char *str, int *ints) { - static int done_setup = 0; + static int done_setup = 0; - if (done_setup++ || ints[0] < 1 || ints[0] > 2 || - ints[1] < 1 || ints[1] > 16) { - printk( "fd_mcs: usage: fd_mcs=FIFO_COUNT, FIFO_SIZE\n" ); - } + if (done_setup++ || ints[0] < 1 || ints[0] > 2 || ints[1] < 1 || ints[1] > 16) { + printk("fd_mcs: usage: fd_mcs=FIFO_COUNT, FIFO_SIZE\n"); + } - user_fifo_count = ints[0] >= 1 ? ints[1] : 0; - user_fifo_size = ints[0] >= 2 ? ints[2] : 0; + user_fifo_count = ints[0] >= 1 ? ints[1] : 0; + user_fifo_size = ints[0] >= 2 ? ints[2] : 0; } -static void print_banner( struct Scsi_Host *shpnt ) +__setup("fd_mcs=", fd_mcs_setup); + +static void print_banner(struct Scsi_Host *shpnt) { - printk( "scsi%d : ", shpnt->host_no); + printk("scsi%d : ", shpnt->host_no); - if (bios_base) { - printk( "BIOS at 0x%lX", bios_base); - } else { - printk( "No BIOS"); - } - - printk( ", HostID %d, %s Chip, IRQ %d, IO 0x%lX\n", - shpnt->this_id, - chip == tmc18c50 ? "TMC-18C50" - : (chip == tmc18c30 ? "TMC-18C30" : - (chip == tmc1800 ? "TMC-1800" : "Unknown")), - shpnt->irq, - shpnt->io_port ); + if (bios_base) { + printk("BIOS at 0x%lX", bios_base); + } else { + printk("No BIOS"); + } + + printk(", HostID %d, %s Chip, IRQ %d, IO 0x%lX\n", shpnt->this_id, chip == tmc18c50 ? "TMC-18C50" : (chip == tmc18c30 ? "TMC-18C30" : (chip == tmc1800 ? "TMC-1800" : "Unknown")), shpnt->irq, shpnt->io_port); } -static void do_pause( unsigned amount ) /* Pause for amount*10 milliseconds */ -{ - do { - udelay(10*1000); - } while (--amount); +static void do_pause(unsigned amount) +{ /* Pause for amount*10 milliseconds */ + do { + mdelay(10); + } while (--amount); } -inline static void fd_mcs_make_bus_idle( struct Scsi_Host *shpnt ) +static void fd_mcs_make_bus_idle(struct Scsi_Host *shpnt) { - outb( 0, SCSI_Cntl_port ); - outb( 0, SCSI_Mode_Cntl_port ); - if (chip == tmc18c50 || chip == tmc18c30) - outb( 0x21 | PARITY_MASK, TMC_Cntl_port ); /* Clear forced intr. */ - else - outb( 0x01 | PARITY_MASK, TMC_Cntl_port ); + outb(0, SCSI_Cntl_port); + outb(0, SCSI_Mode_Cntl_port); + if (chip == tmc18c50 || chip == tmc18c30) + outb(0x21 | PARITY_MASK, TMC_Cntl_port); /* Clear forced intr. */ + else + outb(0x01 | PARITY_MASK, TMC_Cntl_port); } -int fd_mcs_detect( Scsi_Host_Template *tpnt ) +static int fd_mcs_detect(Scsi_Host_Template * tpnt) { - int loop; - struct Scsi_Host *shpnt; - - /* get id, port, bios, irq */ - int slot; - u_char pos2, pos3, pos4; - int id, port, irq; - unsigned long bios; - - /* if not MCA machine, return */ - if (!MCA_bus) - return 0; - - /* changeable? */ - id = 7; - - for( loop = 0; loop < FD_BRDS; loop++ ) { - slot = 0; - while ( MCA_NOTFOUND != - (slot = mca_find_adapter(fd_mcs_adapters[loop].id, - slot)) ) { - - /* if we get this far, an adapter has been detected and is - enabled */ - - printk("scsi : %s at slot %d\n", - fd_mcs_adapters[loop].name, slot + 1 ); + int loop; + struct Scsi_Host *shpnt; - pos2 = mca_read_stored_pos( slot, 2 ); - pos3 = mca_read_stored_pos( slot, 3 ); - pos4 = mca_read_stored_pos( slot, 4); - - /* ready for next probe */ - slot++; - - if (fd_mcs_adapters[loop].id == REPLY_ID) { /* reply card */ - static int reply_irq[] = {10, 11, 14, 15}; - - bios = 0; /* no bios */ - - if (pos2 & 0x2) - port = ports[pos4 & 0x3]; - else - continue; - - /* can't really disable it, same as irq=10 */ - irq = reply_irq[((pos4 >> 2) & 0x1) + 2*((pos4 >> 4) & 0x1)]; - } else { - bios = addresses[pos2 >> 6]; - port = ports[(pos2 >> 4) & 0x03]; - irq = ints[(pos2 >> 1) & 0x07]; - } - - if (irq) { - /* claim the slot */ - mca_set_adapter_name( slot-1, fd_mcs_adapters[loop].name ); - - /* check irq/region */ - if (check_region(port, 0x10) || - request_irq(irq, fd_mcs_intr, - SA_SHIRQ, "fd_mcs", hosts)) { - printk( "fd_mcs: check_region() || request_irq() failed, Skip it\n"); - - continue; - } - - /* register */ - if (!(shpnt = scsi_register(tpnt, sizeof(struct fd_hostdata)))) { - printk( "fd_mcs: scsi_register() failed\n"); - continue; - } - - /* request I/O region */ - request_region( port, 0x10, "fd_mcs" ); - - /* save name */ - strcpy(adapter_name, fd_mcs_adapters[loop].name); - - /* chip/fifo */ - chip = fd_mcs_adapters[loop].fd_chip; - /* use boot time value if available */ - FIFO_COUNT = - user_fifo_count?user_fifo_count:fd_mcs_adapters[loop].fifo_count; - FIFO_Size = - user_fifo_size?user_fifo_size:fd_mcs_adapters[loop].fifo_size; + /* get id, port, bios, irq */ + int slot; + u_char pos2, pos3, pos4; + int id, port, irq; + unsigned long bios; + + /* if not MCA machine, return */ + if (!MCA_bus) + return 0; + + /* changeable? */ + id = 7; + + for (loop = 0; loop < FD_BRDS; loop++) { + slot = 0; + while (MCA_NOTFOUND != (slot = mca_find_adapter(fd_mcs_adapters[loop].id, slot))) { + + /* if we get this far, an adapter has been detected and is + enabled */ + + printk(KERN_INFO "scsi : %s at slot %d\n", fd_mcs_adapters[loop].name, slot + 1); + + pos2 = mca_read_stored_pos(slot, 2); + pos3 = mca_read_stored_pos(slot, 3); + pos4 = mca_read_stored_pos(slot, 4); + + /* ready for next probe */ + slot++; + + if (fd_mcs_adapters[loop].id == REPLY_ID) { /* reply card */ + static int reply_irq[] = { 10, 11, 14, 15 }; + + bios = 0; /* no bios */ + + if (pos2 & 0x2) + port = ports[pos4 & 0x3]; + else + continue; + + /* can't really disable it, same as irq=10 */ + irq = reply_irq[((pos4 >> 2) & 0x1) + 2 * ((pos4 >> 4) & 0x1)]; + } else { + bios = addresses[pos2 >> 6]; + port = ports[(pos2 >> 4) & 0x03]; + irq = ints[(pos2 >> 1) & 0x07]; + } + + if (irq) { + /* claim the slot */ + mca_set_adapter_name(slot - 1, fd_mcs_adapters[loop].name); + + /* check irq/region */ + if (request_irq(irq, fd_mcs_intr, SA_SHIRQ, "fd_mcs", hosts)) { + printk(KERN_ERR "fd_mcs: interrupt is not available, skipping...\n"); + continue; + } + + /* request I/O region */ + if (request_region(port, 0x10, "fd_mcs")) { + printk(KERN_ERR "fd_mcs: I/O region is already in use, skipping...\n"); + continue; + } + /* register */ + if (!(shpnt = scsi_register(tpnt, sizeof(struct fd_hostdata)))) { + printk(KERN_ERR "fd_mcs: scsi_register() failed\n"); + release_region(port, 0x10); + free_irq(irq, hosts); + continue; + } + + + /* save name */ + strcpy(adapter_name, fd_mcs_adapters[loop].name); + + /* chip/fifo */ + chip = fd_mcs_adapters[loop].fd_chip; + /* use boot time value if available */ + FIFO_COUNT = user_fifo_count ? user_fifo_count : fd_mcs_adapters[loop].fifo_count; + FIFO_Size = user_fifo_size ? user_fifo_size : fd_mcs_adapters[loop].fifo_size; #ifdef NOT_USED - /* *************************************************** */ - /* Try to toggle 32-bit mode. This only - works on an 18c30 chip. (User reports - say this works, so we should switch to - it in the near future.) */ - outb( 0x80, port + IO_Control ); - if ((inb( port + Configuration2 ) & 0x80) == 0x80) { - outb( 0x00, port + IO_Control ); - if ((inb( port + Configuration2 ) & 0x80) == 0x00) { - chip = tmc18c30; - FIFO_Size = 0x800; /* 2k FIFO */ - - printk("FIRST: chip=%s, fifo_size=0x%x\n", - (chip == tmc18c30)?"tmc18c30":"tmc18c50", FIFO_Size); - } - } - - /* That should have worked, but appears to - have problems. Let's assume it is an - 18c30 if the RAM is disabled. */ - - if (inb( port + Configuration2 ) & 0x02) { - chip = tmc18c30; - FIFO_Size = 0x800; /* 2k FIFO */ - - printk("SECOND: chip=%s, fifo_size=0x%x\n", - (chip == tmc18c30)?"tmc18c30":"tmc18c50", FIFO_Size); - } - /* *************************************************** */ -#endif - - /* IBM/ANSI scsi scan ordering */ - /* Stick this back in when the scsi.c changes are there */ - shpnt->reverse_ordering = 1; - - - /* saving info */ - hosts[found++] = shpnt; - - shpnt->this_id = id; - shpnt->irq = irq; - shpnt->io_port = port; - shpnt->n_io_port = 0x10; - - /* save */ - bios_base = bios; - adapter_mask = (1 << id); - - /* save more */ - SCSI_Mode_Cntl_port = port + SCSI_Mode_Cntl; - FIFO_Data_Count_port = port + FIFO_Data_Count; - Interrupt_Cntl_port = port + Interrupt_Cntl; - Interrupt_Status_port = port + Interrupt_Status; - Interrupt_Cond_port = port + Interrupt_Cond; - Read_FIFO_port = port + Read_FIFO; - Read_SCSI_Data_port = port + Read_SCSI_Data; - SCSI_Cntl_port = port + SCSI_Cntl; - SCSI_Data_NoACK_port = port + SCSI_Data_NoACK; - SCSI_Status_port = port + SCSI_Status; - TMC_Cntl_port = port + TMC_Cntl; - TMC_Status_port = port + TMC_Status; - Write_FIFO_port = port + Write_FIFO; - Write_SCSI_Data_port = port + Write_SCSI_Data; - - Bytes_Read = 0; - Bytes_Written = 0; - INTR_Processed = 0; - - /* say something */ - print_banner( shpnt ); - - /* reset */ - outb( 1, SCSI_Cntl_port ); - do_pause( 2 ); - outb( 0, SCSI_Cntl_port ); - do_pause( 115 ); - outb( 0, SCSI_Mode_Cntl_port ); - outb( PARITY_MASK, TMC_Cntl_port ); - /* done reset */ + /* *************************************************** */ + /* Try to toggle 32-bit mode. This only + works on an 18c30 chip. (User reports + say this works, so we should switch to + it in the near future.) */ + outb(0x80, port + IO_Control); + if ((inb(port + Configuration2) & 0x80) == 0x80) { + outb(0x00, port + IO_Control); + if ((inb(port + Configuration2) & 0x80) == 0x00) { + chip = tmc18c30; + FIFO_Size = 0x800; /* 2k FIFO */ + + printk("FIRST: chip=%s, fifo_size=0x%x\n", (chip == tmc18c30) ? "tmc18c30" : "tmc18c50", FIFO_Size); + } + } + + /* That should have worked, but appears to + have problems. Let's assume it is an + 18c30 if the RAM is disabled. */ + + if (inb(port + Configuration2) & 0x02) { + chip = tmc18c30; + FIFO_Size = 0x800; /* 2k FIFO */ + + printk("SECOND: chip=%s, fifo_size=0x%x\n", (chip == tmc18c30) ? "tmc18c30" : "tmc18c50", FIFO_Size); + } + /* *************************************************** */ +#endif + + /* IBM/ANSI scsi scan ordering */ + /* Stick this back in when the scsi.c changes are there */ + shpnt->reverse_ordering = 1; + + + /* saving info */ + hosts[found++] = shpnt; + + shpnt->this_id = id; + shpnt->irq = irq; + shpnt->io_port = port; + shpnt->n_io_port = 0x10; + + /* save */ + bios_base = bios; + adapter_mask = (1 << id); + + /* save more */ + SCSI_Mode_Cntl_port = port + SCSI_Mode_Cntl; + FIFO_Data_Count_port = port + FIFO_Data_Count; + Interrupt_Cntl_port = port + Interrupt_Cntl; + Interrupt_Status_port = port + Interrupt_Status; + Interrupt_Cond_port = port + Interrupt_Cond; + Read_FIFO_port = port + Read_FIFO; + Read_SCSI_Data_port = port + Read_SCSI_Data; + SCSI_Cntl_port = port + SCSI_Cntl; + SCSI_Data_NoACK_port = port + SCSI_Data_NoACK; + SCSI_Status_port = port + SCSI_Status; + TMC_Cntl_port = port + TMC_Cntl; + TMC_Status_port = port + TMC_Status; + Write_FIFO_port = port + Write_FIFO; + Write_SCSI_Data_port = port + Write_SCSI_Data; + + Bytes_Read = 0; + Bytes_Written = 0; + INTR_Processed = 0; + + /* say something */ + print_banner(shpnt); + + /* reset */ + outb(1, SCSI_Cntl_port); + do_pause(2); + outb(0, SCSI_Cntl_port); + do_pause(115); + outb(0, SCSI_Mode_Cntl_port); + outb(PARITY_MASK, TMC_Cntl_port); + /* done reset */ #if DO_DETECT - /* scan devices attached */ - { - const int buflen = 255; - int i, j, retcode; - Scsi_Cmnd SCinit; - unsigned char do_inquiry[] = { INQUIRY, 0, 0, 0, buflen, 0 }; - unsigned char do_request_sense[] = { REQUEST_SENSE, - 0, 0, 0, buflen, 0 }; - unsigned char do_read_capacity[] = { READ_CAPACITY, - 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - unsigned char buf[buflen]; - - SCinit.request_buffer = SCinit.buffer = buf; - SCinit.request_bufflen = SCinit.bufflen = sizeof(buf)-1; - SCinit.use_sg = 0; - SCinit.lun = 0; - SCinit.host = shpnt; - - printk( "fd_mcs: detection routine scanning for devices:\n" ); - for (i = 0; i < 8; i++) { - if (i == shpnt->this_id) /* Skip host adapter */ - continue; - SCinit.target = i; - memcpy(SCinit.cmnd, do_request_sense, - sizeof(do_request_sense)); - retcode = fd_mcs_command(&SCinit); - if (!retcode) { - memcpy(SCinit.cmnd, do_inquiry, sizeof(do_inquiry)); - retcode = fd_mcs_command(&SCinit); - if (!retcode) { - printk( " SCSI ID %d: ", i ); - for (j = 8; j < (buf[4] < 32 ? buf[4] : 32); j++) - printk( "%c", buf[j] >= 20 ? buf[j] : ' ' ); - memcpy(SCinit.cmnd, do_read_capacity, - sizeof(do_read_capacity)); - retcode = fd_mcs_command(&SCinit); - if (!retcode) { - unsigned long blocks, size, capacity; - - blocks = (buf[0] << 24) | (buf[1] << 16) - | (buf[2] << 8) | buf[3]; - size = (buf[4] << 24) | (buf[5] << 16) | - (buf[6] << 8) | buf[7]; - capacity = +( +(blocks / 1024L) * +(size * 10L)) / 1024L; - - printk( "%lu MB (%lu byte blocks)\n", - ((capacity + 5L) / 10L), size ); + /* scan devices attached */ + { + const int buflen = 255; + int i, j, retcode; + Scsi_Cmnd SCinit; + unsigned char do_inquiry[] = { INQUIRY, 0, 0, 0, buflen, 0 }; + unsigned char do_request_sense[] = { REQUEST_SENSE, + 0, 0, 0, buflen, 0 + }; + unsigned char do_read_capacity[] = { READ_CAPACITY, + 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + unsigned char buf[buflen]; + + SCinit.request_buffer = SCinit.buffer = buf; + SCinit.request_bufflen = SCinit.bufflen = sizeof(buf) - 1; + SCinit.use_sg = 0; + SCinit.lun = 0; + SCinit.host = shpnt; + + printk("fd_mcs: detection routine scanning for devices:\n"); + for (i = 0; i < 8; i++) { + if (i == shpnt->this_id) /* Skip host adapter */ + continue; + SCinit.target = i; + memcpy(SCinit.cmnd, do_request_sense, sizeof(do_request_sense)); + retcode = fd_mcs_command(&SCinit); + if (!retcode) { + memcpy(SCinit.cmnd, do_inquiry, sizeof(do_inquiry)); + retcode = fd_mcs_command(&SCinit); + if (!retcode) { + printk(" SCSI ID %d: ", i); + for (j = 8; j < (buf[4] < 32 ? buf[4] : 32); j++) + printk("%c", buf[j] >= 20 ? buf[j] : ' '); + memcpy(SCinit.cmnd, do_read_capacity, sizeof(do_read_capacity)); + retcode = fd_mcs_command(&SCinit); + if (!retcode) { + unsigned long blocks, size, capacity; + + blocks = (buf[0] << 24) | (buf[1] << 16) + | (buf[2] << 8) | buf[3]; + size = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7]; + capacity = +(+(blocks / 1024L) * +(size * 10L)) / 1024L; + + printk("%lu MB (%lu byte blocks)\n", ((capacity + 5L) / 10L), size); + } + } + } + } + } +#endif + } } - } - } - } - } -#endif - } - } - - if (found == FD_MAX_HOSTS) { - printk( "fd_mcs: detecting reached max=%d host adapters.\n", - FD_MAX_HOSTS); - break; - } - } - return found; + if (found == FD_MAX_HOSTS) { + printk("fd_mcs: detecting reached max=%d host adapters.\n", FD_MAX_HOSTS); + break; + } + } + + return found; } -const char *fd_mcs_info(struct Scsi_Host *shpnt) +static const char *fd_mcs_info(struct Scsi_Host *shpnt) { - return adapter_name; + return adapter_name; } static int TOTAL_INTR = 0; @@ -598,869 +585,864 @@ * length: If inout==FALSE max number of bytes to be written into the buffer * else number of bytes in the buffer */ -int fd_mcs_proc_info( char *buffer, char **start, off_t offset, - int length, int hostno, int inout ) +static int fd_mcs_proc_info(char *buffer, char **start, off_t offset, int length, int hostno, int inout) { - struct Scsi_Host *shpnt; - int len = 0; - int i; - - if (inout) - return(-ENOSYS); - - *start = buffer + offset; - - for (i = 0; hosts[i] && hosts[i]->host_no != hostno; i++); - shpnt = hosts[i]; - - if (!shpnt) { - return(-ENOENT); - } else { - len += sprintf(buffer+len, "Future Domain MCS-600/700 Driver %s\n", - DRIVER_VERSION); - - len += sprintf(buffer+len, "HOST #%d: %s\n", - hostno, adapter_name); - - len += sprintf(buffer+len, "FIFO Size=0x%x, FIFO Count=%d\n", - FIFO_Size, FIFO_COUNT); - - len += sprintf(buffer+len, "DriverCalls=%d, Interrupts=%d, BytesRead=%d, BytesWrite=%d\n\n", - TOTAL_INTR, INTR_Processed, Bytes_Read, Bytes_Written); - } - - if ((len -= offset) <= 0) - return 0; - if (len > length) - len = length; - return len; + struct Scsi_Host *shpnt; + int len = 0; + int i; + + if (inout) + return (-ENOSYS); + + *start = buffer + offset; + + for (i = 0; hosts[i] && hosts[i]->host_no != hostno; i++); + shpnt = hosts[i]; + + if (!shpnt) { + return (-ENOENT); + } else { + len += sprintf(buffer + len, "Future Domain MCS-600/700 Driver %s\n", DRIVER_VERSION); + + len += sprintf(buffer + len, "HOST #%d: %s\n", hostno, adapter_name); + + len += sprintf(buffer + len, "FIFO Size=0x%x, FIFO Count=%d\n", FIFO_Size, FIFO_COUNT); + + len += sprintf(buffer + len, "DriverCalls=%d, Interrupts=%d, BytesRead=%d, BytesWrite=%d\n\n", TOTAL_INTR, INTR_Processed, Bytes_Read, Bytes_Written); + } + + if ((len -= offset) <= 0) + return 0; + if (len > length) + len = length; + return len; } - -static int fd_mcs_select(struct Scsi_Host *shpnt, int target ) + +static int fd_mcs_select(struct Scsi_Host *shpnt, int target) { - int status; - unsigned long timeout; + int status; + unsigned long timeout; - outb( 0x82, SCSI_Cntl_port ); /* Bus Enable + Select */ - outb( adapter_mask | (1 << target), SCSI_Data_NoACK_port ); + outb(0x82, SCSI_Cntl_port); /* Bus Enable + Select */ + outb(adapter_mask | (1 << target), SCSI_Data_NoACK_port); - /* Stop arbitration and enable parity */ - outb( PARITY_MASK, TMC_Cntl_port ); + /* Stop arbitration and enable parity */ + outb(PARITY_MASK, TMC_Cntl_port); - timeout = 350; /* 350mS -- because of timeouts + timeout = 350; /* 350mS -- because of timeouts (was 250mS) */ - do { - status = inb( SCSI_Status_port ); /* Read adapter status */ - if (status & 1) { /* Busy asserted */ - /* Enable SCSI Bus (on error, should make bus idle with 0) */ - outb( 0x80, SCSI_Cntl_port ); - return 0; - } - udelay(1000); /* wait one msec */ - } while (--timeout); + do { + status = inb(SCSI_Status_port); /* Read adapter status */ + if (status & 1) { /* Busy asserted */ + /* Enable SCSI Bus (on error, should make bus idle with 0) */ + outb(0x80, SCSI_Cntl_port); + return 0; + } + udelay(1000); /* wait one msec */ + } while (--timeout); - /* Make bus idle */ - fd_mcs_make_bus_idle(shpnt); + /* Make bus idle */ + fd_mcs_make_bus_idle(shpnt); #if EVERY_ACCESS - if (!target) printk( "Selection failed\n" ); + if (!target) + printk("Selection failed\n"); #endif #if ERRORS_ONLY - if (!target) { - static int flag = 0; + if (!target) { + static int flag = 0; - if (!flag) /* Skip first failure for all chips. */ - ++flag; - else - printk( "fd_mcs: Selection failed\n" ); - } + if (!flag) /* Skip first failure for all chips. */ + ++flag; + else + printk("fd_mcs: Selection failed\n"); + } #endif - return 1; + return 1; } -static void my_done( struct Scsi_Host *shpnt, int error ) +static void my_done(struct Scsi_Host *shpnt, int error) { - if (in_command) { - in_command = 0; - outb( 0x00, Interrupt_Cntl_port ); - fd_mcs_make_bus_idle(shpnt); - current_SC->result = error; - current_SC->scsi_done( current_SC ); - } else { - panic( "fd_mcs: my_done() called outside of command\n" ); - } + if (in_command) { + in_command = 0; + outb(0x00, Interrupt_Cntl_port); + fd_mcs_make_bus_idle(shpnt); + current_SC->result = error; + current_SC->scsi_done(current_SC); + } else { + panic("fd_mcs: my_done() called outside of command\n"); + } #if DEBUG_RACE - in_interrupt_flag = 0; + in_interrupt_flag = 0; #endif } /* only my_done needs to be protected */ -static void fd_mcs_intr( int irq, void *dev_id, struct pt_regs * regs ) +static void fd_mcs_intr(int irq, void *dev_id, struct pt_regs *regs) { - unsigned long flags; - int status; - int done = 0; - unsigned data_count, tmp_count; - - int i = 0; - struct Scsi_Host *shpnt; - - TOTAL_INTR++; - - /* search for one adapter-response on shared interrupt */ - while ((shpnt = hosts[i++])) { - if ((inb(TMC_Status_port)) & 1) - break; - } - - /* return if some other device on this IRQ caused the interrupt */ - if (!shpnt) { - return; - } + unsigned long flags; + int status; + int done = 0; + unsigned data_count, tmp_count; + + int i = 0; + struct Scsi_Host *shpnt; + + TOTAL_INTR++; + + /* search for one adapter-response on shared interrupt */ + while ((shpnt = hosts[i++])) { + if ((inb(TMC_Status_port)) & 1) + break; + } + + /* return if some other device on this IRQ caused the interrupt */ + if (!shpnt) { + return; + } - INTR_Processed++; + INTR_Processed++; - outb( 0x00, Interrupt_Cntl_port ); + outb(0x00, Interrupt_Cntl_port); - /* Abort calls my_done, so we do nothing here. */ - if (current_SC->SCp.phase & aborted) { + /* Abort calls my_done, so we do nothing here. */ + if (current_SC->SCp.phase & aborted) { #if DEBUG_ABORT - printk( "Interrupt after abort, ignoring\n" ); + printk("Interrupt after abort, ignoring\n"); #endif - /* return; */ - } - + /* return; */ + } #if DEBUG_RACE - ++in_interrupt_flag; + ++in_interrupt_flag; #endif - if (current_SC->SCp.phase & in_arbitration) { - status = inb( TMC_Status_port ); /* Read adapter status */ - if (!(status & 0x02)) { + if (current_SC->SCp.phase & in_arbitration) { + status = inb(TMC_Status_port); /* Read adapter status */ + if (!(status & 0x02)) { #if EVERY_ACCESS - printk( " AFAIL " ); + printk(" AFAIL "); #endif - spin_lock_irqsave(shpnt->host_lock, flags); - my_done( shpnt, DID_BUS_BUSY << 16 ); - spin_unlock_irqrestore(shpnt->host_lock, flags); - return; - } - current_SC->SCp.phase = in_selection; - - outb( 0x40 | FIFO_COUNT, Interrupt_Cntl_port ); - - outb( 0x82, SCSI_Cntl_port ); /* Bus Enable + Select */ - outb( adapter_mask | (1 << current_SC->target), SCSI_Data_NoACK_port ); - - /* Stop arbitration and enable parity */ - outb( 0x10 | PARITY_MASK, TMC_Cntl_port ); + spin_lock_irqsave(shpnt->host_lock, flags); + my_done(shpnt, DID_BUS_BUSY << 16); + spin_unlock_irqrestore(shpnt->host_lock, flags); + return; + } + current_SC->SCp.phase = in_selection; + + outb(0x40 | FIFO_COUNT, Interrupt_Cntl_port); + + outb(0x82, SCSI_Cntl_port); /* Bus Enable + Select */ + outb(adapter_mask | (1 << current_SC->target), SCSI_Data_NoACK_port); + + /* Stop arbitration and enable parity */ + outb(0x10 | PARITY_MASK, TMC_Cntl_port); #if DEBUG_RACE - in_interrupt_flag = 0; + in_interrupt_flag = 0; #endif - return; - } else if (current_SC->SCp.phase & in_selection) { - status = inb( SCSI_Status_port ); - if (!(status & 0x01)) { - /* Try again, for slow devices */ - if (fd_mcs_select(shpnt, current_SC->target )) { + return; + } else if (current_SC->SCp.phase & in_selection) { + status = inb(SCSI_Status_port); + if (!(status & 0x01)) { + /* Try again, for slow devices */ + if (fd_mcs_select(shpnt, current_SC->target)) { #if EVERY_ACCESS - printk( " SFAIL " ); + printk(" SFAIL "); #endif - spin_lock_irqsave(shpnt->host_lock, flags); - my_done( shpnt, DID_NO_CONNECT << 16 ); - spin_unlock_irqrestore(shpnt->host_lock, flags); - return; - } else { + spin_lock_irqsave(shpnt->host_lock, flags); + my_done(shpnt, DID_NO_CONNECT << 16); + spin_unlock_irqrestore(shpnt->host_lock, flags); + return; + } else { #if EVERY_ACCESS - printk( " AltSel " ); + printk(" AltSel "); #endif - /* Stop arbitration and enable parity */ - outb( 0x10 | PARITY_MASK, TMC_Cntl_port ); - } - } - current_SC->SCp.phase = in_other; - outb( 0x90 | FIFO_COUNT, Interrupt_Cntl_port ); - outb( 0x80, SCSI_Cntl_port ); + /* Stop arbitration and enable parity */ + outb(0x10 | PARITY_MASK, TMC_Cntl_port); + } + } + current_SC->SCp.phase = in_other; + outb(0x90 | FIFO_COUNT, Interrupt_Cntl_port); + outb(0x80, SCSI_Cntl_port); #if DEBUG_RACE - in_interrupt_flag = 0; + in_interrupt_flag = 0; #endif - return; - } - - /* current_SC->SCp.phase == in_other: this is the body of the routine */ - - status = inb( SCSI_Status_port ); - - if (status & 0x10) { /* REQ */ - - switch (status & 0x0e) { - - case 0x08: /* COMMAND OUT */ - outb( current_SC->cmnd[current_SC->SCp.sent_command++], - Write_SCSI_Data_port ); + return; + } + + /* current_SC->SCp.phase == in_other: this is the body of the routine */ + + status = inb(SCSI_Status_port); + + if (status & 0x10) { /* REQ */ + + switch (status & 0x0e) { + + case 0x08: /* COMMAND OUT */ + outb(current_SC->cmnd[current_SC->SCp.sent_command++], Write_SCSI_Data_port); #if EVERY_ACCESS - printk( "CMD = %x,", - current_SC->cmnd[ current_SC->SCp.sent_command - 1] ); + printk("CMD = %x,", current_SC->cmnd[current_SC->SCp.sent_command - 1]); #endif - break; - case 0x00: /* DATA OUT -- tmc18c50/tmc18c30 only */ - if (chip != tmc1800 && !current_SC->SCp.have_data_in) { - current_SC->SCp.have_data_in = -1; - outb( 0xd0 | PARITY_MASK, TMC_Cntl_port ); - } - break; - case 0x04: /* DATA IN -- tmc18c50/tmc18c30 only */ - if (chip != tmc1800 && !current_SC->SCp.have_data_in) { - current_SC->SCp.have_data_in = 1; - outb( 0x90 | PARITY_MASK, TMC_Cntl_port ); - } - break; - case 0x0c: /* STATUS IN */ - current_SC->SCp.Status = inb( Read_SCSI_Data_port ); + break; + case 0x00: /* DATA OUT -- tmc18c50/tmc18c30 only */ + if (chip != tmc1800 && !current_SC->SCp.have_data_in) { + current_SC->SCp.have_data_in = -1; + outb(0xd0 | PARITY_MASK, TMC_Cntl_port); + } + break; + case 0x04: /* DATA IN -- tmc18c50/tmc18c30 only */ + if (chip != tmc1800 && !current_SC->SCp.have_data_in) { + current_SC->SCp.have_data_in = 1; + outb(0x90 | PARITY_MASK, TMC_Cntl_port); + } + break; + case 0x0c: /* STATUS IN */ + current_SC->SCp.Status = inb(Read_SCSI_Data_port); #if EVERY_ACCESS - printk( "Status = %x, ", current_SC->SCp.Status ); + printk("Status = %x, ", current_SC->SCp.Status); #endif #if ERRORS_ONLY - if (current_SC->SCp.Status - && current_SC->SCp.Status != 2 - && current_SC->SCp.Status != 8) { - printk( "ERROR fd_mcs: target = %d, command = %x, status = %x\n", - current_SC->target, - current_SC->cmnd[0], - current_SC->SCp.Status ); - } -#endif - break; - case 0x0a: /* MESSAGE OUT */ - outb( MESSAGE_REJECT, Write_SCSI_Data_port ); /* Reject */ - break; - case 0x0e: /* MESSAGE IN */ - current_SC->SCp.Message = inb( Read_SCSI_Data_port ); + if (current_SC->SCp.Status && current_SC->SCp.Status != 2 && current_SC->SCp.Status != 8) { + printk("ERROR fd_mcs: target = %d, command = %x, status = %x\n", current_SC->target, current_SC->cmnd[0], current_SC->SCp.Status); + } +#endif + break; + case 0x0a: /* MESSAGE OUT */ + outb(MESSAGE_REJECT, Write_SCSI_Data_port); /* Reject */ + break; + case 0x0e: /* MESSAGE IN */ + current_SC->SCp.Message = inb(Read_SCSI_Data_port); #if EVERY_ACCESS - printk( "Message = %x, ", current_SC->SCp.Message ); + printk("Message = %x, ", current_SC->SCp.Message); #endif - if (!current_SC->SCp.Message) ++done; + if (!current_SC->SCp.Message) + ++done; #if DEBUG_MESSAGES || EVERY_ACCESS - if (current_SC->SCp.Message) { - printk( "fd_mcs: message = %x\n", current_SC->SCp.Message ); - } -#endif - break; - } - } - - if (chip == tmc1800 - && !current_SC->SCp.have_data_in - && (current_SC->SCp.sent_command - >= current_SC->cmd_len)) { - /* We have to get the FIFO direction - correct, so I've made a table based - on the SCSI Standard of which commands - appear to require a DATA OUT phase. - */ - /* - p. 94: Command for all device types - CHANGE DEFINITION 40 DATA OUT - COMPARE 39 DATA OUT - COPY 18 DATA OUT - COPY AND VERIFY 3a DATA OUT - INQUIRY 12 - LOG SELECT 4c DATA OUT - LOG SENSE 4d - MODE SELECT (6) 15 DATA OUT - MODE SELECT (10) 55 DATA OUT - MODE SENSE (6) 1a - MODE SENSE (10) 5a - READ BUFFER 3c - RECEIVE DIAGNOSTIC RESULTS 1c - REQUEST SENSE 03 - SEND DIAGNOSTIC 1d DATA OUT - TEST UNIT READY 00 - WRITE BUFFER 3b DATA OUT - - p.178: Commands for direct-access devices (not listed on p. 94) - FORMAT UNIT 04 DATA OUT - LOCK-UNLOCK CACHE 36 - PRE-FETCH 34 - PREVENT-ALLOW MEDIUM REMOVAL 1e - READ (6)/RECEIVE 08 - READ (10) 3c - READ CAPACITY 25 - READ DEFECT DATA (10) 37 - READ LONG 3e - REASSIGN BLOCKS 07 DATA OUT - RELEASE 17 - RESERVE 16 DATA OUT - REZERO UNIT/REWIND 01 - SEARCH DATA EQUAL (10) 31 DATA OUT - SEARCH DATA HIGH (10) 30 DATA OUT - SEARCH DATA LOW (10) 32 DATA OUT - SEEK (6) 0b - SEEK (10) 2b - SET LIMITS (10) 33 - START STOP UNIT 1b - SYNCHRONIZE CACHE 35 - VERIFY (10) 2f - WRITE (6)/PRINT/SEND 0a DATA OUT - WRITE (10)/SEND 2a DATA OUT - WRITE AND VERIFY (10) 2e DATA OUT - WRITE LONG 3f DATA OUT - WRITE SAME 41 DATA OUT ? - - p. 261: Commands for sequential-access devices (not previously listed) - ERASE 19 - LOAD UNLOAD 1b - LOCATE 2b - READ BLOCK LIMITS 05 - READ POSITION 34 - READ REVERSE 0f - RECOVER BUFFERED DATA 14 - SPACE 11 - WRITE FILEMARKS 10 ? - - p. 298: Commands for printer devices (not previously listed) - ****** NOT SUPPORTED BY THIS DRIVER, since 0b is SEEK (6) ***** - SLEW AND PRINT 0b DATA OUT -- same as seek - STOP PRINT 1b - SYNCHRONIZE BUFFER 10 - - p. 315: Commands for processor devices (not previously listed) - - p. 321: Commands for write-once devices (not previously listed) - MEDIUM SCAN 38 - READ (12) a8 - SEARCH DATA EQUAL (12) b1 DATA OUT - SEARCH DATA HIGH (12) b0 DATA OUT - SEARCH DATA LOW (12) b2 DATA OUT - SET LIMITS (12) b3 - VERIFY (12) af - WRITE (12) aa DATA OUT - WRITE AND VERIFY (12) ae DATA OUT - - p. 332: Commands for CD-ROM devices (not previously listed) - PAUSE/RESUME 4b - PLAY AUDIO (10) 45 - PLAY AUDIO (12) a5 - PLAY AUDIO MSF 47 - PLAY TRACK RELATIVE (10) 49 - PLAY TRACK RELATIVE (12) a9 - READ HEADER 44 - READ SUB-CHANNEL 42 - READ TOC 43 - - p. 370: Commands for scanner devices (not previously listed) - GET DATA BUFFER STATUS 34 - GET WINDOW 25 - OBJECT POSITION 31 - SCAN 1b - SET WINDOW 24 DATA OUT - - p. 391: Commands for optical memory devices (not listed) - ERASE (10) 2c - ERASE (12) ac - MEDIUM SCAN 38 DATA OUT - READ DEFECT DATA (12) b7 - READ GENERATION 29 - READ UPDATED BLOCK 2d - UPDATE BLOCK 3d DATA OUT - - p. 419: Commands for medium changer devices (not listed) - EXCHANGE MEDIUM 46 - INITIALIZE ELEMENT STATUS 07 - MOVE MEDIUM a5 - POSITION TO ELEMENT 2b - READ ELEMENT STATUS b8 - REQUEST VOL. ELEMENT ADDRESS b5 - SEND VOLUME TAG b6 DATA OUT - - p. 454: Commands for communications devices (not listed previously) - GET MESSAGE (6) 08 - GET MESSAGE (10) 28 - GET MESSAGE (12) a8 - */ - - switch (current_SC->cmnd[0]) { - case CHANGE_DEFINITION: case COMPARE: case COPY: - case COPY_VERIFY: case LOG_SELECT: case MODE_SELECT: - case MODE_SELECT_10: case SEND_DIAGNOSTIC: case WRITE_BUFFER: - - case FORMAT_UNIT: case REASSIGN_BLOCKS: case RESERVE: - case SEARCH_EQUAL: case SEARCH_HIGH: case SEARCH_LOW: - case WRITE_6: case WRITE_10: case WRITE_VERIFY: - case 0x3f: case 0x41: - - case 0xb1: case 0xb0: case 0xb2: - case 0xaa: case 0xae: - - case 0x24: - - case 0x38: case 0x3d: - - case 0xb6: - - case 0xea: /* alternate number for WRITE LONG */ - - current_SC->SCp.have_data_in = -1; - outb( 0xd0 | PARITY_MASK, TMC_Cntl_port ); - break; - - case 0x00: - default: - - current_SC->SCp.have_data_in = 1; - outb( 0x90 | PARITY_MASK, TMC_Cntl_port ); - break; - } - } + if (current_SC->SCp.Message) { + printk("fd_mcs: message = %x\n", current_SC->SCp.Message); + } +#endif + break; + } + } - if (current_SC->SCp.have_data_in == -1) { /* DATA OUT */ - while ( (data_count = FIFO_Size - inw( FIFO_Data_Count_port )) > 512 ) { + if (chip == tmc1800 && !current_SC->SCp.have_data_in && (current_SC->SCp.sent_command >= current_SC->cmd_len)) { + /* We have to get the FIFO direction + correct, so I've made a table based + on the SCSI Standard of which commands + appear to require a DATA OUT phase. + */ + /* + p. 94: Command for all device types + CHANGE DEFINITION 40 DATA OUT + COMPARE 39 DATA OUT + COPY 18 DATA OUT + COPY AND VERIFY 3a DATA OUT + INQUIRY 12 + LOG SELECT 4c DATA OUT + LOG SENSE 4d + MODE SELECT (6) 15 DATA OUT + MODE SELECT (10) 55 DATA OUT + MODE SENSE (6) 1a + MODE SENSE (10) 5a + READ BUFFER 3c + RECEIVE DIAGNOSTIC RESULTS 1c + REQUEST SENSE 03 + SEND DIAGNOSTIC 1d DATA OUT + TEST UNIT READY 00 + WRITE BUFFER 3b DATA OUT + + p.178: Commands for direct-access devices (not listed on p. 94) + FORMAT UNIT 04 DATA OUT + LOCK-UNLOCK CACHE 36 + PRE-FETCH 34 + PREVENT-ALLOW MEDIUM REMOVAL 1e + READ (6)/RECEIVE 08 + READ (10) 3c + READ CAPACITY 25 + READ DEFECT DATA (10) 37 + READ LONG 3e + REASSIGN BLOCKS 07 DATA OUT + RELEASE 17 + RESERVE 16 DATA OUT + REZERO UNIT/REWIND 01 + SEARCH DATA EQUAL (10) 31 DATA OUT + SEARCH DATA HIGH (10) 30 DATA OUT + SEARCH DATA LOW (10) 32 DATA OUT + SEEK (6) 0b + SEEK (10) 2b + SET LIMITS (10) 33 + START STOP UNIT 1b + SYNCHRONIZE CACHE 35 + VERIFY (10) 2f + WRITE (6)/PRINT/SEND 0a DATA OUT + WRITE (10)/SEND 2a DATA OUT + WRITE AND VERIFY (10) 2e DATA OUT + WRITE LONG 3f DATA OUT + WRITE SAME 41 DATA OUT ? + + p. 261: Commands for sequential-access devices (not previously listed) + ERASE 19 + LOAD UNLOAD 1b + LOCATE 2b + READ BLOCK LIMITS 05 + READ POSITION 34 + READ REVERSE 0f + RECOVER BUFFERED DATA 14 + SPACE 11 + WRITE FILEMARKS 10 ? + + p. 298: Commands for printer devices (not previously listed) + ****** NOT SUPPORTED BY THIS DRIVER, since 0b is SEEK (6) ***** + SLEW AND PRINT 0b DATA OUT -- same as seek + STOP PRINT 1b + SYNCHRONIZE BUFFER 10 + + p. 315: Commands for processor devices (not previously listed) + + p. 321: Commands for write-once devices (not previously listed) + MEDIUM SCAN 38 + READ (12) a8 + SEARCH DATA EQUAL (12) b1 DATA OUT + SEARCH DATA HIGH (12) b0 DATA OUT + SEARCH DATA LOW (12) b2 DATA OUT + SET LIMITS (12) b3 + VERIFY (12) af + WRITE (12) aa DATA OUT + WRITE AND VERIFY (12) ae DATA OUT + + p. 332: Commands for CD-ROM devices (not previously listed) + PAUSE/RESUME 4b + PLAY AUDIO (10) 45 + PLAY AUDIO (12) a5 + PLAY AUDIO MSF 47 + PLAY TRACK RELATIVE (10) 49 + PLAY TRACK RELATIVE (12) a9 + READ HEADER 44 + READ SUB-CHANNEL 42 + READ TOC 43 + + p. 370: Commands for scanner devices (not previously listed) + GET DATA BUFFER STATUS 34 + GET WINDOW 25 + OBJECT POSITION 31 + SCAN 1b + SET WINDOW 24 DATA OUT + + p. 391: Commands for optical memory devices (not listed) + ERASE (10) 2c + ERASE (12) ac + MEDIUM SCAN 38 DATA OUT + READ DEFECT DATA (12) b7 + READ GENERATION 29 + READ UPDATED BLOCK 2d + UPDATE BLOCK 3d DATA OUT + + p. 419: Commands for medium changer devices (not listed) + EXCHANGE MEDIUM 46 + INITIALIZE ELEMENT STATUS 07 + MOVE MEDIUM a5 + POSITION TO ELEMENT 2b + READ ELEMENT STATUS b8 + REQUEST VOL. ELEMENT ADDRESS b5 + SEND VOLUME TAG b6 DATA OUT + + p. 454: Commands for communications devices (not listed previously) + GET MESSAGE (6) 08 + GET MESSAGE (10) 28 + GET MESSAGE (12) a8 + */ + + switch (current_SC->cmnd[0]) { + case CHANGE_DEFINITION: + case COMPARE: + case COPY: + case COPY_VERIFY: + case LOG_SELECT: + case MODE_SELECT: + case MODE_SELECT_10: + case SEND_DIAGNOSTIC: + case WRITE_BUFFER: + + case FORMAT_UNIT: + case REASSIGN_BLOCKS: + case RESERVE: + case SEARCH_EQUAL: + case SEARCH_HIGH: + case SEARCH_LOW: + case WRITE_6: + case WRITE_10: + case WRITE_VERIFY: + case 0x3f: + case 0x41: + + case 0xb1: + case 0xb0: + case 0xb2: + case 0xaa: + case 0xae: + + case 0x24: + + case 0x38: + case 0x3d: + + case 0xb6: + + case 0xea: /* alternate number for WRITE LONG */ + + current_SC->SCp.have_data_in = -1; + outb(0xd0 | PARITY_MASK, TMC_Cntl_port); + break; + + case 0x00: + default: + + current_SC->SCp.have_data_in = 1; + outb(0x90 | PARITY_MASK, TMC_Cntl_port); + break; + } + } + + if (current_SC->SCp.have_data_in == -1) { /* DATA OUT */ + while ((data_count = FIFO_Size - inw(FIFO_Data_Count_port)) > 512) { #if EVERY_ACCESS - printk( "DC=%d, ", data_count ) ; + printk("DC=%d, ", data_count); #endif - if (data_count > current_SC->SCp.this_residual) - data_count = current_SC->SCp.this_residual; - if (data_count > 0) { + if (data_count > current_SC->SCp.this_residual) + data_count = current_SC->SCp.this_residual; + if (data_count > 0) { #if EVERY_ACCESS - printk( "%d OUT, ", data_count ); + printk("%d OUT, ", data_count); #endif - if (data_count == 1) { - Bytes_Written++; + if (data_count == 1) { + Bytes_Written++; - outb( *current_SC->SCp.ptr++, Write_FIFO_port ); - --current_SC->SCp.this_residual; - } else { - data_count >>= 1; - tmp_count = data_count << 1; - outsw( Write_FIFO_port, current_SC->SCp.ptr, data_count ); - current_SC->SCp.ptr += tmp_count; - Bytes_Written += tmp_count; - current_SC->SCp.this_residual -= tmp_count; - } - } - if (!current_SC->SCp.this_residual) { - if (current_SC->SCp.buffers_residual) { - --current_SC->SCp.buffers_residual; - ++current_SC->SCp.buffer; - current_SC->SCp.ptr = current_SC->SCp.buffer->address; - current_SC->SCp.this_residual = current_SC->SCp.buffer->length; - } else - break; - } - } - } else if (current_SC->SCp.have_data_in == 1) { /* DATA IN */ - while ((data_count = inw( FIFO_Data_Count_port )) > 0) { + outb(*current_SC->SCp.ptr++, Write_FIFO_port); + --current_SC->SCp.this_residual; + } else { + data_count >>= 1; + tmp_count = data_count << 1; + outsw(Write_FIFO_port, current_SC->SCp.ptr, data_count); + current_SC->SCp.ptr += tmp_count; + Bytes_Written += tmp_count; + current_SC->SCp.this_residual -= tmp_count; + } + } + if (!current_SC->SCp.this_residual) { + if (current_SC->SCp.buffers_residual) { + --current_SC->SCp.buffers_residual; + ++current_SC->SCp.buffer; + current_SC->SCp.ptr = page_address(current_SC->SCp.buffer->page) + current_SC->SCp.buffer->offset; + current_SC->SCp.this_residual = current_SC->SCp.buffer->length; + } else + break; + } + } + } else if (current_SC->SCp.have_data_in == 1) { /* DATA IN */ + while ((data_count = inw(FIFO_Data_Count_port)) > 0) { #if EVERY_ACCESS - printk( "DC=%d, ", data_count ); + printk("DC=%d, ", data_count); #endif - if (data_count > current_SC->SCp.this_residual) - data_count = current_SC->SCp.this_residual; - if (data_count) { + if (data_count > current_SC->SCp.this_residual) + data_count = current_SC->SCp.this_residual; + if (data_count) { #if EVERY_ACCESS - printk( "%d IN, ", data_count ); + printk("%d IN, ", data_count); #endif - if (data_count == 1) { - Bytes_Read++; - *current_SC->SCp.ptr++ = inb( Read_FIFO_port ); - --current_SC->SCp.this_residual; - } else { - data_count >>= 1; /* Number of words */ - tmp_count = data_count << 1; - insw( Read_FIFO_port, current_SC->SCp.ptr, data_count ); - current_SC->SCp.ptr += tmp_count; - Bytes_Read += tmp_count; - current_SC->SCp.this_residual -= tmp_count; - } - } - if (!current_SC->SCp.this_residual - && current_SC->SCp.buffers_residual) { - --current_SC->SCp.buffers_residual; - ++current_SC->SCp.buffer; - current_SC->SCp.ptr = current_SC->SCp.buffer->address; - current_SC->SCp.this_residual = current_SC->SCp.buffer->length; - } - } - } - - if (done) { + if (data_count == 1) { + Bytes_Read++; + *current_SC->SCp.ptr++ = inb(Read_FIFO_port); + --current_SC->SCp.this_residual; + } else { + data_count >>= 1; /* Number of words */ + tmp_count = data_count << 1; + insw(Read_FIFO_port, current_SC->SCp.ptr, data_count); + current_SC->SCp.ptr += tmp_count; + Bytes_Read += tmp_count; + current_SC->SCp.this_residual -= tmp_count; + } + } + if (!current_SC->SCp.this_residual && current_SC->SCp.buffers_residual) { + --current_SC->SCp.buffers_residual; + ++current_SC->SCp.buffer; + current_SC->SCp.ptr = page_address(current_SC->SCp.buffer->page) + current_SC->SCp.buffer->offset; + current_SC->SCp.this_residual = current_SC->SCp.buffer->length; + } + } + } + + if (done) { #if EVERY_ACCESS - printk( " ** IN DONE %d ** ", current_SC->SCp.have_data_in ); + printk(" ** IN DONE %d ** ", current_SC->SCp.have_data_in); #endif #if ERRORS_ONLY - if (current_SC->cmnd[0] == REQUEST_SENSE && !current_SC->SCp.Status) { - if ((unsigned char)(*((char *)current_SC->request_buffer+2)) & 0x0f) { - unsigned char key; - unsigned char code; - unsigned char qualifier; - - key = (unsigned char)(*((char *)current_SC->request_buffer + 2)) - & 0x0f; - code = (unsigned char)(*((char *)current_SC->request_buffer + 12)); - qualifier = (unsigned char)(*((char *)current_SC->request_buffer - + 13)); - - if (key != UNIT_ATTENTION - && !(key == NOT_READY - && code == 0x04 - && (!qualifier || qualifier == 0x02 || qualifier == 0x01)) - && !(key == ILLEGAL_REQUEST && (code == 0x25 - || code == 0x24 - || !code))) - - printk( "fd_mcs: REQUEST SENSE " - "Key = %x, Code = %x, Qualifier = %x\n", - key, code, qualifier ); - } - } + if (current_SC->cmnd[0] == REQUEST_SENSE && !current_SC->SCp.Status) { + if ((unsigned char) (*((char *) current_SC->request_buffer + 2)) & 0x0f) { + unsigned char key; + unsigned char code; + unsigned char qualifier; + + key = (unsigned char) (*((char *) current_SC->request_buffer + 2)) & 0x0f; + code = (unsigned char) (*((char *) current_SC->request_buffer + 12)); + qualifier = (unsigned char) (*((char *) current_SC->request_buffer + 13)); + + if (key != UNIT_ATTENTION && !(key == NOT_READY && code == 0x04 && (!qualifier || qualifier == 0x02 || qualifier == 0x01)) + && !(key == ILLEGAL_REQUEST && (code == 0x25 || code == 0x24 || !code))) + + printk("fd_mcs: REQUEST SENSE " "Key = %x, Code = %x, Qualifier = %x\n", key, code, qualifier); + } + } #endif #if EVERY_ACCESS - printk( "BEFORE MY_DONE. . ." ); + printk("BEFORE MY_DONE. . ."); #endif - spin_lock_irqsave(shpnt->host_lock, flags); - my_done( shpnt, - (current_SC->SCp.Status & 0xff) - | ((current_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16) ); - spin_unlock_irqrestore(shpnt->host_lock, flags); + spin_lock_irqsave(shpnt->host_lock, flags); + my_done(shpnt, (current_SC->SCp.Status & 0xff) + | ((current_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16)); + spin_unlock_irqrestore(shpnt->host_lock, flags); #if EVERY_ACCESS - printk( "RETURNING.\n" ); + printk("RETURNING.\n"); #endif - - } else { - if (current_SC->SCp.phase & disconnect) { - outb( 0xd0 | FIFO_COUNT, Interrupt_Cntl_port ); - outb( 0x00, SCSI_Cntl_port ); - } else { - outb( 0x90 | FIFO_COUNT, Interrupt_Cntl_port ); - } - } + + } else { + if (current_SC->SCp.phase & disconnect) { + outb(0xd0 | FIFO_COUNT, Interrupt_Cntl_port); + outb(0x00, SCSI_Cntl_port); + } else { + outb(0x90 | FIFO_COUNT, Interrupt_Cntl_port); + } + } #if DEBUG_RACE - in_interrupt_flag = 0; + in_interrupt_flag = 0; #endif - return; + return; } -int fd_mcs_release(struct Scsi_Host *shpnt) +static int fd_mcs_release(struct Scsi_Host *shpnt) { - int i, this_host, irq_usage; + int i, this_host, irq_usage; - release_region(shpnt->io_port, shpnt->n_io_port); + release_region(shpnt->io_port, shpnt->n_io_port); - this_host = -1; - irq_usage = 0; - for (i = 0; i < found; i++) { - if (shpnt == hosts[i]) - this_host = i; - if (shpnt->irq == hosts[i]->irq) - irq_usage++; - } + this_host = -1; + irq_usage = 0; + for (i = 0; i < found; i++) { + if (shpnt == hosts[i]) + this_host = i; + if (shpnt->irq == hosts[i]->irq) + irq_usage++; + } - /* only for the last one */ - if (1 == irq_usage) - free_irq(shpnt->irq, hosts); + /* only for the last one */ + if (1 == irq_usage) + free_irq(shpnt->irq, hosts); - found--; + found--; - for (i = this_host; i < found; i++) - hosts[i] = hosts[i+1]; + for (i = this_host; i < found; i++) + hosts[i] = hosts[i + 1]; - hosts[found] = NULL; + hosts[found] = NULL; - return 0; + return 0; } -int fd_mcs_queue( Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *)) +static int fd_mcs_queue(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) { - struct Scsi_Host *shpnt = SCpnt->host; + struct Scsi_Host *shpnt = SCpnt->host; - if (in_command) { - panic( "fd_mcs: fd_mcs_queue() NOT REENTRANT!\n" ); - } + if (in_command) { + panic("fd_mcs: fd_mcs_queue() NOT REENTRANT!\n"); + } #if EVERY_ACCESS - printk( "queue: target = %d cmnd = 0x%02x pieces = %d size = %u\n", - SCpnt->target, - *(unsigned char *)SCpnt->cmnd, - SCpnt->use_sg, - SCpnt->request_bufflen ); -#endif - - fd_mcs_make_bus_idle(shpnt); - - SCpnt->scsi_done = done; /* Save this for the done function */ - current_SC = SCpnt; - - /* Initialize static data */ - - if (current_SC->use_sg) { - current_SC->SCp.buffer = - (struct scatterlist *)current_SC->request_buffer; - current_SC->SCp.ptr = current_SC->SCp.buffer->address; - current_SC->SCp.this_residual = current_SC->SCp.buffer->length; - current_SC->SCp.buffers_residual = current_SC->use_sg - 1; - } else { - current_SC->SCp.ptr = (char *)current_SC->request_buffer; - current_SC->SCp.this_residual = current_SC->request_bufflen; - current_SC->SCp.buffer = NULL; - current_SC->SCp.buffers_residual = 0; - } - - - current_SC->SCp.Status = 0; - current_SC->SCp.Message = 0; - current_SC->SCp.have_data_in = 0; - current_SC->SCp.sent_command = 0; - current_SC->SCp.phase = in_arbitration; - - /* Start arbitration */ - outb( 0x00, Interrupt_Cntl_port ); - outb( 0x00, SCSI_Cntl_port ); /* Disable data drivers */ - outb( adapter_mask, SCSI_Data_NoACK_port ); /* Set our id bit */ - in_command = 1; - outb( 0x20, Interrupt_Cntl_port ); - outb( 0x14 | PARITY_MASK, TMC_Cntl_port ); /* Start arbitration */ + printk("queue: target = %d cmnd = 0x%02x pieces = %d size = %u\n", SCpnt->target, *(unsigned char *) SCpnt->cmnd, SCpnt->use_sg, SCpnt->request_bufflen); +#endif + + fd_mcs_make_bus_idle(shpnt); + + SCpnt->scsi_done = done; /* Save this for the done function */ + current_SC = SCpnt; - return 0; + /* Initialize static data */ + + if (current_SC->use_sg) { + current_SC->SCp.buffer = (struct scatterlist *) current_SC->request_buffer; + current_SC->SCp.ptr = page_address(current_SC->SCp.buffer->page) + current_SC->SCp.buffer->offset; + current_SC->SCp.this_residual = current_SC->SCp.buffer->length; + current_SC->SCp.buffers_residual = current_SC->use_sg - 1; + } else { + current_SC->SCp.ptr = (char *) current_SC->request_buffer; + current_SC->SCp.this_residual = current_SC->request_bufflen; + current_SC->SCp.buffer = NULL; + current_SC->SCp.buffers_residual = 0; + } + + + current_SC->SCp.Status = 0; + current_SC->SCp.Message = 0; + current_SC->SCp.have_data_in = 0; + current_SC->SCp.sent_command = 0; + current_SC->SCp.phase = in_arbitration; + + /* Start arbitration */ + outb(0x00, Interrupt_Cntl_port); + outb(0x00, SCSI_Cntl_port); /* Disable data drivers */ + outb(adapter_mask, SCSI_Data_NoACK_port); /* Set our id bit */ + in_command = 1; + outb(0x20, Interrupt_Cntl_port); + outb(0x14 | PARITY_MASK, TMC_Cntl_port); /* Start arbitration */ + + return 0; } -static void internal_done( Scsi_Cmnd *SCpnt ) +static void internal_done(Scsi_Cmnd * SCpnt) { - /* flag it done */ - SCpnt->host_scribble = (unsigned char *)1; + /* flag it done */ + SCpnt->host_scribble = (unsigned char *) 1; } -int fd_mcs_command( Scsi_Cmnd *SCpnt ) +int fd_mcs_command(Scsi_Cmnd * SCpnt) { - fd_mcs_queue( SCpnt, internal_done ); - /* host_scribble is used for status here */ - SCpnt->host_scribble = NULL; - while (!SCpnt->host_scribble) - barrier(); - return SCpnt->result; + fd_mcs_queue(SCpnt, internal_done); + /* host_scribble is used for status here */ + SCpnt->host_scribble = NULL; + while (!SCpnt->host_scribble) { + cpu_relax(); + barrier(); + } + return SCpnt->result; } #if DEBUG_ABORT || DEBUG_RESET -static void fd_mcs_print_info( Scsi_Cmnd *SCpnt ) +static void fd_mcs_print_info(Scsi_Cmnd * SCpnt) { - unsigned int imr; - unsigned int irr; - unsigned int isr; - struct Scsi_Host *shpnt = SCpnt->host; - - if (!SCpnt || !SCpnt->host) { - printk( "fd_mcs: cannot provide detailed information\n" ); - } - - printk( "%s\n", fd_mcs_info( SCpnt->host ) ); - print_banner( SCpnt->host ); - switch (SCpnt->SCp.phase) { - case in_arbitration: printk( "arbitration " ); break; - case in_selection: printk( "selection " ); break; - case in_other: printk( "other " ); break; - default: printk( "unknown " ); break; - } - - printk( "(%d), target = %d cmnd = 0x%02x pieces = %d size = %u\n", - SCpnt->SCp.phase, - SCpnt->target, - *(unsigned char *)SCpnt->cmnd, - SCpnt->use_sg, - SCpnt->request_bufflen ); - printk( "sent_command = %d, have_data_in = %d, timeout = %d\n", - SCpnt->SCp.sent_command, - SCpnt->SCp.have_data_in, - SCpnt->timeout ); + unsigned int imr; + unsigned int irr; + unsigned int isr; + struct Scsi_Host *shpnt = SCpnt->host; + + if (!SCpnt || !SCpnt->host) { + printk("fd_mcs: cannot provide detailed information\n"); + } + + printk("%s\n", fd_mcs_info(SCpnt->host)); + print_banner(SCpnt->host); + switch (SCpnt->SCp.phase) { + case in_arbitration: + printk("arbitration "); + break; + case in_selection: + printk("selection "); + break; + case in_other: + printk("other "); + break; + default: + printk("unknown "); + break; + } + + printk("(%d), target = %d cmnd = 0x%02x pieces = %d size = %u\n", SCpnt->SCp.phase, SCpnt->target, *(unsigned char *) SCpnt->cmnd, SCpnt->use_sg, SCpnt->request_bufflen); + printk("sent_command = %d, have_data_in = %d, timeout = %d\n", SCpnt->SCp.sent_command, SCpnt->SCp.have_data_in, SCpnt->timeout); #if DEBUG_RACE - printk( "in_interrupt_flag = %d\n", in_interrupt_flag ); + printk("in_interrupt_flag = %d\n", in_interrupt_flag); #endif - imr = (inb( 0x0a1 ) << 8) + inb( 0x21 ); - outb( 0x0a, 0xa0 ); - irr = inb( 0xa0 ) << 8; - outb( 0x0a, 0x20 ); - irr += inb( 0x20 ); - outb( 0x0b, 0xa0 ); - isr = inb( 0xa0 ) << 8; - outb( 0x0b, 0x20 ); - isr += inb( 0x20 ); - - /* Print out interesting information */ - printk( "IMR = 0x%04x", imr ); - if (imr & (1 << shpnt->irq)) - printk( " (masked)" ); - printk( ", IRR = 0x%04x, ISR = 0x%04x\n", irr, isr ); - - printk( "SCSI Status = 0x%02x\n", inb( SCSI_Status_port ) ); - printk( "TMC Status = 0x%02x", inb( TMC_Status_port ) ); - if (inb( TMC_Status_port ) & 1) - printk( " (interrupt)" ); - printk( "\n" ); - printk( "Interrupt Status = 0x%02x", inb( Interrupt_Status_port ) ); - if (inb( Interrupt_Status_port ) & 0x08) - printk( " (enabled)" ); - printk( "\n" ); - if (chip == tmc18c50 || chip == tmc18c30) { - printk( "FIFO Status = 0x%02x\n", inb( shpnt->io_port + FIFO_Status ) ); - printk( "Int. Condition = 0x%02x\n", - inb( shpnt->io_port + Interrupt_Cond ) ); - } - printk( "Configuration 1 = 0x%02x\n", inb( shpnt->io_port + Configuration1 ) ); - if (chip == tmc18c50 || chip == tmc18c30) - printk( "Configuration 2 = 0x%02x\n", - inb( shpnt->io_port + Configuration2 ) ); + imr = (inb(0x0a1) << 8) + inb(0x21); + outb(0x0a, 0xa0); + irr = inb(0xa0) << 8; + outb(0x0a, 0x20); + irr += inb(0x20); + outb(0x0b, 0xa0); + isr = inb(0xa0) << 8; + outb(0x0b, 0x20); + isr += inb(0x20); + + /* Print out interesting information */ + printk("IMR = 0x%04x", imr); + if (imr & (1 << shpnt->irq)) + printk(" (masked)"); + printk(", IRR = 0x%04x, ISR = 0x%04x\n", irr, isr); + + printk("SCSI Status = 0x%02x\n", inb(SCSI_Status_port)); + printk("TMC Status = 0x%02x", inb(TMC_Status_port)); + if (inb(TMC_Status_port) & 1) + printk(" (interrupt)"); + printk("\n"); + printk("Interrupt Status = 0x%02x", inb(Interrupt_Status_port)); + if (inb(Interrupt_Status_port) & 0x08) + printk(" (enabled)"); + printk("\n"); + if (chip == tmc18c50 || chip == tmc18c30) { + printk("FIFO Status = 0x%02x\n", inb(shpnt->io_port + FIFO_Status)); + printk("Int. Condition = 0x%02x\n", inb(shpnt->io_port + Interrupt_Cond)); + } + printk("Configuration 1 = 0x%02x\n", inb(shpnt->io_port + Configuration1)); + if (chip == tmc18c50 || chip == tmc18c30) + printk("Configuration 2 = 0x%02x\n", inb(shpnt->io_port + Configuration2)); } #endif -int fd_mcs_abort( Scsi_Cmnd *SCpnt) +static int fd_mcs_abort(Scsi_Cmnd * SCpnt) { - struct Scsi_Host *shpnt = SCpnt->host; + struct Scsi_Host *shpnt = SCpnt->host; - unsigned long flags; + unsigned long flags; #if EVERY_ACCESS || ERRORS_ONLY || DEBUG_ABORT - printk( "fd_mcs: abort " ); + printk("fd_mcs: abort "); #endif - save_flags( flags ); - cli(); - if (!in_command) { + spin_lock_irqsave(shpnt->host_lock, flags); + if (!in_command) { #if EVERY_ACCESS || ERRORS_ONLY - printk( " (not in command)\n" ); + printk(" (not in command)\n"); #endif - restore_flags( flags ); - return SCSI_ABORT_NOT_RUNNING; - } else printk( "\n" ); + spin_unlock_irqrestore(shpnt->host_lock, flags); + return FAILED; + } else + printk("\n"); #if DEBUG_ABORT - fd_mcs_print_info( SCpnt ); + fd_mcs_print_info(SCpnt); #endif - fd_mcs_make_bus_idle(shpnt); + fd_mcs_make_bus_idle(shpnt); - current_SC->SCp.phase |= aborted; + current_SC->SCp.phase |= aborted; - current_SC->result = DID_ABORT << 16; + current_SC->result = DID_ABORT << 16; - restore_flags( flags ); - - /* Aborts are not done well. . . */ - spin_lock_irqsave(shpnt->host_lock, flags); - my_done( shpnt, DID_ABORT << 16 ); - spin_unlock_irqrestore(shpnt->host_lock, flags); + /* Aborts are not done well. . . */ + my_done(shpnt, DID_ABORT << 16); - return SCSI_ABORT_SUCCESS; + spin_unlock_irqrestore(shpnt->host_lock, flags); + return SUCCESS; } -int fd_mcs_reset( Scsi_Cmnd *SCpnt, unsigned int reset_flags ) +static int fd_mcs_host_reset(Scsi_Cmnd * SCpnt) { - struct Scsi_Host *shpnt = SCpnt->host; + return FAILED; +} + +static int fd_mcs_device_reset(Scsi_Cmnd * SCpnt) { + return FAILED; + } + + static int fd_mcs_bus_reset(Scsi_Cmnd * SCpnt) { + struct Scsi_Host *shpnt = SCpnt->host; + unsigned long flags; #if DEBUG_RESET - static int called_once = 0; + static int called_once = 0; #endif #if ERRORS_ONLY - if (SCpnt) printk( "fd_mcs: SCSI Bus Reset\n" ); + if (SCpnt) + printk("fd_mcs: SCSI Bus Reset\n"); #endif #if DEBUG_RESET - if (called_once) fd_mcs_print_info( current_SC ); - called_once = 1; -#endif - - outb( 1, SCSI_Cntl_port ); - do_pause( 2 ); - outb( 0, SCSI_Cntl_port ); - do_pause( 115 ); - outb( 0, SCSI_Mode_Cntl_port ); - outb( PARITY_MASK, TMC_Cntl_port ); - - /* Unless this is the very first call (i.e., SCPnt == NULL), everything - is probably hosed at this point. We will, however, try to keep - things going by informing the high-level code that we need help. */ + if (called_once) + fd_mcs_print_info(current_SC); + called_once = 1; +#endif + + spin_lock_irqsave(shpnt->host_lock, flags); + + outb(1, SCSI_Cntl_port); + do_pause(2); + outb(0, SCSI_Cntl_port); + do_pause(115); + outb(0, SCSI_Mode_Cntl_port); + outb(PARITY_MASK, TMC_Cntl_port); + + /* Unless this is the very first call (i.e., SCPnt == NULL), everything + is probably hosed at this point. We will, however, try to keep + things going by informing the high-level code that we need help. */ - return SCSI_RESET_WAKEUP; -} + spin_unlock_irqrestore(shpnt->host_lock, flags); + return SUCCESS; + } #include "sd.h" #include -int fd_mcs_biosparam( Scsi_Disk *disk, struct block_device *bdev, int *info_array ) -{ - unsigned char buf[512 + sizeof( int ) * 2]; - int size = disk->capacity; - int *sizes = (int *)buf; - unsigned char *data = (unsigned char *)(sizes + 2); - unsigned char do_read[] = { READ_6, 0, 0, 0, 1, 0 }; - int retcode; - - /* BIOS >= 3.4 for MCA cards */ - /* This algorithm was provided by Future Domain (much thanks!). */ - - sizes[0] = 0; /* zero bytes out */ - sizes[1] = 512; /* one sector in */ - memcpy( data, do_read, sizeof( do_read ) ); - retcode = kernel_scsi_ioctl( disk->device, - SCSI_IOCTL_SEND_COMMAND, - (void *)buf ); - if (!retcode /* SCSI command ok */ - && data[511] == 0xaa && data[510] == 0x55 /* Partition table valid */ - && data[0x1c2]) { /* Partition type */ - - /* The partition table layout is as follows: - - Start: 0x1b3h - Offset: 0 = partition status - 1 = starting head - 2 = starting sector and cylinder (word, encoded) - 4 = partition type - 5 = ending head - 6 = ending sector and cylinder (word, encoded) - 8 = starting absolute sector (double word) - c = number of sectors (double word) - Signature: 0x1fe = 0x55aa - - So, this algorithm assumes: - 1) the first partition table is in use, - 2) the data in the first entry is correct, and - 3) partitions never divide cylinders - - Note that (1) may be FALSE for NetBSD (and other BSD flavors), - as well as for Linux. Note also, that Linux doesn't pay any - attention to the fields that are used by this algorithm -- it - only uses the absolute sector data. Recent versions of Linux's - fdisk(1) will fill this data in correctly, and forthcoming - versions will check for consistency. - - Checking for a non-zero partition type is not part of the - Future Domain algorithm, but it seemed to be a reasonable thing - to do, especially in the Linux and BSD worlds. */ - - info_array[0] = data[0x1c3] + 1; /* heads */ - info_array[1] = data[0x1c4] & 0x3f; /* sectors */ - } else { - - /* Note that this new method guarantees that there will always be - less than 1024 cylinders on a platter. This is good for drives - up to approximately 7.85GB (where 1GB = 1024 * 1024 kB). */ - - if ((unsigned int)size >= 0x7e0000U) { - info_array[0] = 0xff; /* heads = 255 */ - info_array[1] = 0x3f; /* sectors = 63 */ - } else if ((unsigned int)size >= 0x200000U) { - info_array[0] = 0x80; /* heads = 128 */ - info_array[1] = 0x3f; /* sectors = 63 */ - } else { - info_array[0] = 0x40; /* heads = 64 */ - info_array[1] = 0x20; /* sectors = 32 */ - } - } - /* For both methods, compute the cylinders */ - info_array[2] = (unsigned int)size / (info_array[0] * info_array[1] ); + static int fd_mcs_biosparam(Scsi_Disk * disk, struct block_device *bdev, int *info_array) { + unsigned char buf[512 + sizeof(int) * 2]; + int size = disk->capacity; + int *sizes = (int *) buf; + unsigned char *data = (unsigned char *) (sizes + 2); + unsigned char do_read[] = { READ_6, 0, 0, 0, 1, 0 }; + int retcode; + + /* BIOS >= 3.4 for MCA cards */ + /* This algorithm was provided by Future Domain (much thanks!). */ + + sizes[0] = 0; /* zero bytes out */ + sizes[1] = 512; /* one sector in */ + memcpy(data, do_read, sizeof(do_read)); + retcode = kernel_scsi_ioctl(disk->device, SCSI_IOCTL_SEND_COMMAND, (void *) buf); + if (!retcode /* SCSI command ok */ + && data[511] == 0xaa && data[510] == 0x55 /* Partition table valid */ + && data[0x1c2]) { /* Partition type */ + + /* The partition table layout is as follows: + + Start: 0x1b3h + Offset: 0 = partition status + 1 = starting head + 2 = starting sector and cylinder (word, encoded) + 4 = partition type + 5 = ending head + 6 = ending sector and cylinder (word, encoded) + 8 = starting absolute sector (double word) + c = number of sectors (double word) + Signature: 0x1fe = 0x55aa + + So, this algorithm assumes: + 1) the first partition table is in use, + 2) the data in the first entry is correct, and + 3) partitions never divide cylinders + + Note that (1) may be FALSE for NetBSD (and other BSD flavors), + as well as for Linux. Note also, that Linux doesn't pay any + attention to the fields that are used by this algorithm -- it + only uses the absolute sector data. Recent versions of Linux's + fdisk(1) will fill this data in correctly, and forthcoming + versions will check for consistency. + + Checking for a non-zero partition type is not part of the + Future Domain algorithm, but it seemed to be a reasonable thing + to do, especially in the Linux and BSD worlds. */ + + info_array[0] = data[0x1c3] + 1; /* heads */ + info_array[1] = data[0x1c4] & 0x3f; /* sectors */ + } else { + + /* Note that this new method guarantees that there will always be + less than 1024 cylinders on a platter. This is good for drives + up to approximately 7.85GB (where 1GB = 1024 * 1024 kB). */ + + if ((unsigned int) size >= 0x7e0000U) { + info_array[0] = 0xff; /* heads = 255 */ + info_array[1] = 0x3f; /* sectors = 63 */ + } else if ((unsigned int) size >= 0x200000U) { + info_array[0] = 0x80; /* heads = 128 */ + info_array[1] = 0x3f; /* sectors = 63 */ + } else { + info_array[0] = 0x40; /* heads = 64 */ + info_array[1] = 0x20; /* sectors = 32 */ + } + } + /* For both methods, compute the cylinders */ + info_array[2] = (unsigned int) size / (info_array[0] * info_array[1]); - - return 0; -} + + return 0; + } /* Eventually this will go into an include file, but this will be later */ -static Scsi_Host_Template driver_template = FD_MCS; + static Scsi_Host_Template driver_template = FD_MCS; #include "scsi_module.c" diff -Nru a/drivers/scsi/fd_mcs.h b/drivers/scsi/fd_mcs.h --- a/drivers/scsi/fd_mcs.h Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/fd_mcs.h Mon Oct 28 16:32:36 2002 @@ -22,31 +22,36 @@ #ifndef _FD_MCS_H #define _FD_MCS_H -extern int fd_mcs_detect( Scsi_Host_Template * ); -extern int fd_mcs_release( struct Scsi_Host * ); -extern int fd_mcs_command( Scsi_Cmnd * ); -extern int fd_mcs_abort( Scsi_Cmnd * ); -extern int fd_mcs_reset( Scsi_Cmnd *, unsigned int ); -extern int fd_mcs_queue( Scsi_Cmnd *, void (*done)(Scsi_Cmnd *) ); -extern int fd_mcs_biosparam( Disk *, struct block_device *, int * ); -extern int fd_mcs_proc_info( char *, char **, off_t, int, int, int ); -extern const char *fd_mcs_info(struct Scsi_Host *); +static int fd_mcs_detect(Scsi_Host_Template *); +static int fd_mcs_release(struct Scsi_Host *); +static int fd_mcs_command(Scsi_Cmnd *); +static int fd_mcs_abort(Scsi_Cmnd *); +static int fd_mcs_bus_reset(Scsi_Cmnd *); +static int fd_mcs_device_reset(Scsi_Cmnd *); +static int fd_mcs_host_reset(Scsi_Cmnd *); +static int fd_mcs_queue(Scsi_Cmnd *, void (*done) (Scsi_Cmnd *)); +static int fd_mcs_biosparam(Disk *, struct block_device *, int *); +static int fd_mcs_proc_info(char *, char **, off_t, int, int, int); +static const char *fd_mcs_info(struct Scsi_Host *); #define FD_MCS {\ - proc_name: "fd_mcs", \ - proc_info: fd_mcs_proc_info, \ - detect: fd_mcs_detect, \ - release: fd_mcs_release, \ - info: fd_mcs_info, \ - command: fd_mcs_command, \ - queuecommand: fd_mcs_queue, \ - abort: fd_mcs_abort, \ - reset: fd_mcs_reset, \ - bios_param: fd_mcs_biosparam, \ - can_queue: 1, \ - this_id: 7, \ - sg_tablesize: 64, \ - cmd_per_lun: 1, \ - use_clustering: DISABLE_CLUSTERING } + proc_name: "fd_mcs", \ + proc_info: fd_mcs_proc_info, \ + detect: fd_mcs_detect, \ + release: fd_mcs_release, \ + info: fd_mcs_info, \ + command: fd_mcs_command, \ + queuecommand: fd_mcs_queue, \ + eh_abort_handler: fd_mcs_abort, \ + eh_bus_reset_handler: fd_mcs_bus_reset, \ + eh_host_reset_handler: fd_mcs_host_reset, \ + eh_device_reset_handler: fd_mcs_device_reset, \ + bios_param: fd_mcs_biosparam, \ + can_queue: 1, \ + this_id: 7, \ + sg_tablesize: 64, \ + cmd_per_lun: 1, \ + use_clustering: DISABLE_CLUSTERING \ + } -#endif /* _FD_MCS_H */ +#endif /* _FD_MCS_H */ diff -Nru a/drivers/scsi/g_NCR5380.c b/drivers/scsi/g_NCR5380.c --- a/drivers/scsi/g_NCR5380.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/g_NCR5380.c Mon Oct 28 16:32:36 2002 @@ -100,12 +100,6 @@ #define NCR5380_STATS #undef NCR5380_STAT_LIMIT #endif -#if defined(CONFIG_SCSI_G_NCR5380_PORT) && defined(CONFIG_SCSI_G_NCR5380_MEM) -#error You can not configure the Generic NCR 5380 SCSI Driver for memory mapped I/O and port mapped I/O at the same time (yet) -#endif -#if !defined(CONFIG_SCSI_G_NCR5380_PORT) && !defined(CONFIG_SCSI_G_NCR5380_MEM) -#error You must configure the Generic NCR 5380 SCSI Driver for one of memory mapped I/O and port mapped I/O. -#endif #include #include @@ -121,6 +115,7 @@ #include #include #include +#include #define NCR_NOT_SET 0 static int ncr_irq = NCR_NOT_SET; @@ -143,8 +138,11 @@ [1] __initdata = { { 0,},}; #endif + #define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override)) +#ifndef MODULE + /** * internal_setup - handle lilo command string override * @board: BOARD_* identifier for the board @@ -199,6 +197,7 @@ } } + /** * do_NCR53C80_setup - set up entry point * @str: unused @@ -270,6 +269,8 @@ return 1; } +#endif + /** * generic_NCR5380_detect - look for NCR5380 controllers * @tpnt: the scsi template @@ -367,7 +368,7 @@ break; } -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM if (ports) { /* wakeup sequence for the NCR53C400A and DTC3181E */ @@ -412,7 +413,7 @@ #endif instance = scsi_register(tpnt, sizeof(struct NCR5380_hostdata)); if (instance == NULL) { -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM release_region(overrides[current_override].NCR5380_map_name, NCR5380_region_size); #else release_mem_region(overrides[current_override].NCR5380_map_name, NCR5380_region_size); @@ -430,7 +431,7 @@ instance->irq = NCR5380_probe_irq(instance, 0xffff); if (instance->irq != IRQ_NONE) - if (request_irq(instance->irq, do_generic_NCR5380_intr, SA_INTERRUPT, "NCR5380", NULL)) { + if (request_irq(instance->irq, generic_NCR5380_intr, SA_INTERRUPT, "NCR5380", NULL)) { printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); instance->irq = IRQ_NONE; } @@ -482,7 +483,7 @@ NCR5380_local_declare(); NCR5380_setup(instance); -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM release_region(instance->NCR5380_instance_name, NCR5380_region_size); #else release_mem_region(instance->NCR5380_instance_name, NCR5380_region_size); @@ -555,7 +556,7 @@ } while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY); -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM { int i; for (i = 0; i < 128; i++) @@ -575,7 +576,7 @@ // FIXME - no timeout } -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM { int i; for (i = 0; i < 128; i++) @@ -641,7 +642,7 @@ } while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY) ; // FIXME - timeout -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM { for (i = 0; i < 128; i++) NCR5380_write(C400_HOST_BUFFER, src[start + i]); @@ -657,7 +658,7 @@ while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY) ; // FIXME - no timeout -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM { for (i = 0; i < 128; i++) NCR5380_write(C400_HOST_BUFFER, src[start + i]); @@ -781,9 +782,8 @@ #endif /* For now this is constant so we may walk it */ - for (scsi_ptr = first_instance; scsi_ptr; scsi_ptr = scsi_ptr->next) - if (scsi_ptr->host_no == hostno) - break; + scsi_ptr = scsi_host_hn_get(hostno); + NCR5380_setup(scsi_ptr); hostdata = (struct NCR5380_hostdata *) scsi_ptr->hostdata; diff -Nru a/drivers/scsi/g_NCR5380.h b/drivers/scsi/g_NCR5380.h --- a/drivers/scsi/g_NCR5380.h Mon Oct 28 16:32:35 2002 +++ b/drivers/scsi/g_NCR5380.h Mon Oct 28 16:32:35 2002 @@ -44,25 +44,19 @@ #endif #ifndef ASM -int generic_NCR5380_abort(Scsi_Cmnd *); -int generic_NCR5380_detect(Scsi_Host_Template *); -int generic_NCR5380_release_resources(struct Scsi_Host *); -int generic_NCR5380_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -int generic_NCR5380_bus_reset(Scsi_Cmnd *); -int generic_NCR5380_host_reset(Scsi_Cmnd *); -int generic_NCR5380_device_reset(Scsi_Cmnd *); -int notyet_generic_proc_info (char *buffer ,char **start, off_t offset, +static int generic_NCR5380_abort(Scsi_Cmnd *); +static int generic_NCR5380_detect(Scsi_Host_Template *); +static int generic_NCR5380_release_resources(struct Scsi_Host *); +static int generic_NCR5380_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); +static int generic_NCR5380_bus_reset(Scsi_Cmnd *); +static int generic_NCR5380_host_reset(Scsi_Cmnd *); +static int generic_NCR5380_device_reset(Scsi_Cmnd *); +static int notyet_generic_proc_info (char *buffer ,char **start, off_t offset, int length, int hostno, int inout); -const char* generic_NCR5380_info(struct Scsi_Host *); -#ifdef BIOSPARAM -int generic_NCR5380_biosparam(Disk *, struct block_device *, int *); -#endif - -int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int length, int hostno, int inout); +static const char* generic_NCR5380_info(struct Scsi_Host *); +static int generic_NCR5380_biosparam(Disk *, struct block_device *, int *); -#ifndef NULL -#define NULL 0 -#endif +static int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int length, int hostno, int inout); #ifndef CMD_PER_LUN #define CMD_PER_LUN 2 @@ -95,18 +89,13 @@ #define __STRVAL(x) #x #define STRVAL(x) __STRVAL(x) -#ifdef CONFIG_SCSI_G_NCR5380_PORT +#ifndef CONFIG_SCSI_G_NCR5380_MEM #define NCR5380_map_config port - #define NCR5380_map_type int - #define NCR5380_map_name port - #define NCR5380_instance_name io_port - #define NCR53C400_register_offset 0 - #define NCR53C400_address_adjust 8 #ifdef NCR53C400 @@ -122,27 +111,17 @@ /* therefore CONFIG_SCSI_G_NCR5380_MEM */ #define NCR5380_map_config memory - #define NCR5380_map_type unsigned long - #define NCR5380_map_name base - #define NCR5380_instance_name base - #define NCR53C400_register_offset 0x108 - #define NCR53C400_address_adjust 0 - #define NCR53C400_mem_base 0x3880 - #define NCR53C400_host_buffer 0x3900 - #define NCR5380_region_size 0x3a00 - #define NCR5380_read(reg) isa_readb(NCR5380_map_name + NCR53C400_mem_base + (reg)) #define NCR5380_write(reg, value) isa_writeb(NCR5380_map_name + NCR53C400_mem_base + (reg), value) - #endif #define NCR5380_implementation_fields \ @@ -155,7 +134,6 @@ NCR5380_map_name = (NCR5380_map_type)((instance)->NCR5380_instance_name) #define NCR5380_intr generic_NCR5380_intr -#define do_NCR5380_intr do_generic_NCR5380_intr #define NCR5380_queue_command generic_NCR5380_queue_command #define NCR5380_abort generic_NCR5380_abort #define NCR5380_bus_reset generic_NCR5380_bus_reset diff -Nru a/drivers/scsi/g_NCR5380_mmio.c b/drivers/scsi/g_NCR5380_mmio.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/scsi/g_NCR5380_mmio.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,10 @@ +/* + * There is probably a nicer way to do this but this one makes + * pretty obvious what is happening. We rebuild the same file with + * different options for mmio versus pio. + */ + +#define SCSI_G_NCR5380_MEM + +#include "g_NCR5380.c" + diff -Nru a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c --- a/drivers/scsi/hosts.c Mon Oct 28 16:32:35 2002 +++ b/drivers/scsi/hosts.c Mon Oct 28 16:32:35 2002 @@ -91,8 +91,8 @@ * @shost: * * Description: - * This is the default case for the release function. It should do - * the right thing for most correctly written host adapters. + * This is the default case for the release function. Its completely + * useless for anything but old ISA adapters **/ static void scsi_host_generic_release(struct Scsi_Host *shost) { diff -Nru a/drivers/scsi/ibmmca.c b/drivers/scsi/ibmmca.c --- a/drivers/scsi/ibmmca.c Mon Oct 28 16:32:35 2002 +++ b/drivers/scsi/ibmmca.c Mon Oct 28 16:32:35 2002 @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -504,15 +505,16 @@ unsigned long flags; Scsi_Cmnd *cmd; int lastSCSI; + struct Scsi_Host *dev = dev_id; - IBMLOCK(dev_id) + IBMLOCK(dev) /* search for one adapter-response on shared interrupt */ for (host_index=0; hosts[host_index] && !(inb(IM_STAT_REG(host_index)) & IM_INTR_REQUEST); host_index++); /* return if some other device on this IRQ caused the interrupt */ if (!hosts[host_index]) { - IBMUNLOCK(dev_id) + IBMUNLOCK(dev) return; } @@ -521,15 +523,16 @@ if ((reset_status(host_index) == IM_RESET_NOT_IN_PROGRESS_NO_INT)|| (reset_status(host_index) == IM_RESET_FINISHED_OK_NO_INT)) { reset_status(host_index) = IM_RESET_NOT_IN_PROGRESS; - IBMUNLOCK(dev_id) + IBMUNLOCK(dev) return; } /*must wait for attention reg not busy, then send EOI to subsystem */ while (1) { if (!(inb (IM_STAT_REG(host_index)) & IM_BUSY)) break; - IBMUNLOCK(dev_id) /* cycle interrupt */ - IBMLOCK(dev_id) + IBMUNLOCK(dev) /* cycle interrupt */ + cpu_relax(); + IBMLOCK(dev) } ihost_index=host_index; /*get command result and logical device */ @@ -539,7 +542,7 @@ /* get the last_scsi_command here */ lastSCSI = last_scsi_command(ihost_index)[ldn]; outb (IM_EOI | ldn, IM_ATTN_REG(ihost_index)); - IBMUNLOCK(dev_id) + IBMUNLOCK(dev) /*these should never happen (hw fails, or a local programming bug) */ if (!global_command_error_excuse) { switch (cmd_result) { @@ -1435,12 +1438,13 @@ return; } -static int ibmmca_getinfo (char *buf, int slot, void *dev) +static int ibmmca_getinfo (char *buf, int slot, void *dev_id) { struct Scsi_Host *shpnt; int len, speciale, connectore, k; unsigned int pos[8]; unsigned long flags; + struct Scsi_Host *dev = dev_id; IBMLOCK(dev) shpnt = dev; /* assign host-structure to local pointer */ diff -Nru a/drivers/scsi/imm.c b/drivers/scsi/imm.c --- a/drivers/scsi/imm.c Mon Oct 28 16:32:38 2002 +++ b/drivers/scsi/imm.c Mon Oct 28 16:32:38 2002 @@ -199,6 +199,8 @@ continue; } + INIT_WORK(&imm_hosts[i].imm_tq, imm_interrupt, &imm_hosts[i]); + host->can_queue = IMM_CAN_QUEUE; host->sg_tablesize = imm_sg; hreg = scsi_register(host, 0); diff -Nru a/drivers/scsi/in2000.c b/drivers/scsi/in2000.c --- a/drivers/scsi/in2000.c Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/in2000.c Mon Oct 28 16:32:37 2002 @@ -832,7 +832,7 @@ static void in2000_intr (int irqnum, void * dev_id, struct pt_regs *ptregs) { -struct Scsi_Host *instance; +struct Scsi_Host *instance = dev_id; struct IN2000_hostdata *hostdata; Scsi_Cmnd *patch, *cmd; uchar asr, sr, phs, id, lun, *ucp, msg; @@ -842,14 +842,6 @@ unsigned short f; unsigned long flags; - for (instance = instance_list; instance; instance = instance->next) { - if (instance->irq == irqnum) - break; - } - if (!instance) { - printk("*** Hmm... interrupts are screwed up! ***\n"); - return; - } hostdata = (struct IN2000_hostdata *)instance->hostdata; /* Get the spin_lock and disable further ints, for SMP */ @@ -2046,7 +2038,7 @@ write1_io(0,IO_FIFO_READ); /* start fifo out in read mode */ write1_io(0,IO_INTR_MASK); /* allow all ints */ x = int_tab[(switches & (SW_INT0 | SW_INT1)) >> SW_INT_SHIFT]; - if (request_irq(x, in2000_intr, SA_INTERRUPT, "in2000", NULL)) { + if (request_irq(x, in2000_intr, SA_INTERRUPT, "in2000", instance)) { printk("in2000_detect: Unable to allocate IRQ.\n"); detect_count--; continue; @@ -2163,6 +2155,15 @@ return detect_count; } +static int in2000_release(struct Scsi_Host *shost) +{ + if (shost->irq) + free_irq(shost->irq, shost); + if (shost->io_port && shost->n_io_port) + release_region(shost->io_port, shost->n_io_port); + return 0; +} + /* NOTE: I lifted this function straight out of the old driver, * and have not tested it. Presumably it does what it's @@ -2215,10 +2216,7 @@ int x,i; static int stop = 0; - for (instance=instance_list; instance; instance=instance->next) { - if (instance->host_no == hn) - break; - } + instance = scsi_host_hn_get(hn); if (!instance) { printk("*** Hmm... Can't find host #%d!\n",hn); return (-ESRCH); diff -Nru a/drivers/scsi/in2000.h b/drivers/scsi/in2000.h --- a/drivers/scsi/in2000.h Mon Oct 28 16:32:35 2002 +++ b/drivers/scsi/in2000.h Mon Oct 28 16:32:35 2002 @@ -417,6 +417,7 @@ proc_info: in2000_proc_info, /* pointer to proc info function */ \ name: "Always IN2000", /* device name */ \ detect: in2000_detect, /* returns number of in2000's found */ \ + release: in2000_release, /* release the in2000 controller */ \ queuecommand: in2000_queuecommand, /* queue scsi command, don't wait */ \ eh_abort_handler: in2000_abort, /* abort current command */ \ eh_bus_reset_handler: in2000_bus_reset, /* reset scsi bus */ \ diff -Nru a/drivers/scsi/inia100.h b/drivers/scsi/inia100.h --- a/drivers/scsi/inia100.h Mon Oct 28 16:32:35 2002 +++ b/drivers/scsi/inia100.h Mon Oct 28 16:32:35 2002 @@ -85,10 +85,9 @@ extern int inia100_biosparam(Scsi_Disk *, struct block_device *, int *); -#define inia100_REVID "Initio INI-A100U2W SCSI device driver; Revision: 1.02c" +#define inia100_REVID "Initio INI-A100U2W SCSI device driver; Revision: 1.02d" #define INIA100 { \ - next: NULL, \ module: NULL, \ proc_name: "inia100", \ proc_info: NULL, \ diff -Nru a/drivers/scsi/mesh.c b/drivers/scsi/mesh.c --- a/drivers/scsi/mesh.c Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/mesh.c Mon Oct 28 16:32:37 2002 @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include diff -Nru a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c --- a/drivers/scsi/ncr53c8xx.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/ncr53c8xx.c Mon Oct 28 16:32:36 2002 @@ -9125,16 +9125,11 @@ printk("ncr53c8xx_proc_info: hostno=%d, func=%d\n", hostno, func); #endif - for (host = first_host; host; host = host->next) { - if (host->hostt == the_template && host->host_no == hostno) { - host_data = (struct host_data *) host->hostdata; - ncb = host_data->ncb; - break; - } - } - - if (!ncb) + if((host = scsi_host_hn_get(hostno))==NULL) return -EINVAL; + + host_data = (struct host_data *) host->hostdata; + ncb = host_data->ncb; if (func) { #ifdef SCSI_NCR_USER_COMMAND_SUPPORT diff -Nru a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c --- a/drivers/scsi/nsp32.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/nsp32.c Mon Oct 28 16:32:36 2002 @@ -1575,11 +1575,9 @@ } /* search this HBA host */ - for (host=scsi_hostlist; host; host=host->next) { - if (host->host_no == hostno) { - break; - } - } + + host = scsi_host_hn_get(hostno); + if (host == NULL) { return -ESRCH; } diff -Nru a/drivers/scsi/pas16.c b/drivers/scsi/pas16.c --- a/drivers/scsi/pas16.c Mon Oct 28 16:32:35 2002 +++ b/drivers/scsi/pas16.c Mon Oct 28 16:32:35 2002 @@ -118,6 +118,7 @@ #include #include #include +#include #include "scsi.h" #include "hosts.h" #include "pas16.h" @@ -450,7 +451,7 @@ instance->irq = NCR5380_probe_irq(instance, PAS16_IRQS); if (instance->irq != IRQ_NONE) - if (request_irq(instance->irq, do_pas16_intr, SA_INTERRUPT, "pas16", instance)) { + if (request_irq(instance->irq, pas16_intr, SA_INTERRUPT, "pas16", instance)) { printk("scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); instance->irq = IRQ_NONE; diff -Nru a/drivers/scsi/pas16.h b/drivers/scsi/pas16.h --- a/drivers/scsi/pas16.h Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/pas16.h Mon Oct 28 16:32:37 2002 @@ -114,14 +114,14 @@ #ifndef ASM -int pas16_abort(Scsi_Cmnd *); -int pas16_biosparam(Disk *, struct block_device *, int*); -int pas16_detect(Scsi_Host_Template *); -int pas16_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -int pas16_bus_reset(Scsi_Cmnd *); -int pas16_host_reset(Scsi_Cmnd *); -int pas16_device_reset(Scsi_Cmnd *); -int pas16_proc_info (char *buffer ,char **start, off_t offset, +static int pas16_abort(Scsi_Cmnd *); +static int pas16_biosparam(Disk *, struct block_device *, int*); +static int pas16_detect(Scsi_Host_Template *); +static int pas16_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); +static int pas16_bus_reset(Scsi_Cmnd *); +static int pas16_host_reset(Scsi_Cmnd *); +static int pas16_device_reset(Scsi_Cmnd *); +static int pas16_proc_info (char *buffer ,char **start, off_t offset, int length, int hostno, int inout); #ifndef NULL diff -Nru a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c --- a/drivers/scsi/pcmcia/nsp_cs.c Mon Oct 28 16:32:38 2002 +++ b/drivers/scsi/pcmcia/nsp_cs.c Mon Oct 28 16:32:38 2002 @@ -1,8 +1,10 @@ /*====================================================================== - NinjaSCSI-3 / NinjaSCSI-32Bi PCMCIA SCSI hostadapter card driver + NinjaSCSI-3 / NinjaSCSI-32Bi PCMCIA SCSI host adapter card driver By: YOKOTA Hiroshi + Ver.2.8 Support 32bit MMIO mode + Support Synchronous Data TRansfer (SDTR) mode Ver.2.0 Support 32bit PIO mode Ver.1.1.2 Fix for scatter list buffer exceeds Ver.1.1 Support scatter list @@ -23,7 +25,7 @@ ***********************************************************************/ -/* $Id: nsp_cs.c,v 1.42 2001/09/10 10:30:58 elca Exp $ */ +/* $Id: nsp_cs.c,v 1.4 2002/10/15 15:57:01 elca Exp $ */ #ifdef NSP_KERNEL_2_2 #include @@ -39,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -51,7 +52,6 @@ #include <../drivers/scsi/scsi.h> #include <../drivers/scsi/hosts.h> -#include <../drivers/scsi/sd.h> #include #include @@ -60,20 +60,24 @@ #include #include #include +#include #include +#include #include "nsp_cs.h" MODULE_AUTHOR("YOKOTA Hiroshi "); -MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module"); +MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module $Revision: 1.4 $"); MODULE_SUPPORTED_DEVICE("sd,sr,sg,st"); +#ifdef MODULE_LICENSE MODULE_LICENSE("GPL"); +#endif #ifdef PCMCIA_DEBUG static int pc_debug = PCMCIA_DEBUG; MODULE_PARM(pc_debug, "i"); MODULE_PARM_DESC(pc_debug, "set debug level"); -static char *version = "$Id: nsp_cs.c,v 1.42 2001/09/10 10:30:58 elca Exp $"; +static char *version = "$Id: nsp_cs.c,v 1.4 2002/10/15 15:57:01 elca Exp $"; #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args) #else #define DEBUG(n, args...) /* */ @@ -108,48 +112,56 @@ static unsigned int irq_mask = 0xffff; MODULE_PARM(irq_mask, "i"); -MODULE_PARM_DESC(irq_mask, "IRQ mask bits"); +MODULE_PARM_DESC(irq_mask, "IRQ mask bits (default: 0xffff)"); static int irq_list[4] = { -1 }; MODULE_PARM(irq_list, "1-4i"); -MODULE_PARM_DESC(irq_list, "IRQ number list"); +MODULE_PARM_DESC(irq_list, "Use specified IRQ number. (default: auto select)"); -/*----------------------------------------------------------------*/ -/* driver state info, local to driver */ -static char nspinfo[100]; /* description */ +static int nsp_burst_mode = 2; +MODULE_PARM(nsp_burst_mode, "i"); +MODULE_PARM_DESC(nsp_burst_mode, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))"); + +/* Release IO ports after configuration? */ +static int free_ports = 0; +MODULE_PARM(free_ports, "i"); +MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))"); /* /usr/src/linux/drivers/scsi/hosts.h */ static Scsi_Host_Template driver_template = { -/* next: NULL,*/ -#if (KERNEL_VERSION(2,3,99) > LINUX_VERSION_CODE) - proc_dir: &proc_scsi_nsp, /* kernel 2.2 */ +/* .next = NULL,*/ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)) + .proc_name = "nsp_cs", /* kernel 2.4 */ #else - proc_name: "nsp_cs", /* kernel 2.4 */ + .proc_dir = &proc_scsi_nsp, /* kernel 2.2 */ +#endif + .proc_info = nsp_proc_info, + .name = "WorkBit NinjaSCSI-3/32Bi", + .detect = nsp_detect, + .release = nsp_release, + .info = nsp_info, +/* .command = NULL,*/ + .queuecommand = nsp_queuecommand, +/* .eh_strategy_handler = nsp_eh_strategy,*/ +/* .eh_abort_handler = nsp_eh_abort,*/ +/* .eh_device_reset_handler = nsp_eh_device_reset,*/ + .eh_bus_reset_handler = nsp_eh_bus_reset, + .eh_host_reset_handler = nsp_eh_host_reset, + .abort = nsp_abort, + .reset = nsp_reset, +/* .slave_attach = NULL,*/ +/* .bios_param = NULL,*/ + .can_queue = 1, + .this_id = NSP_INITIATOR_ID, + .sg_tablesize = SG_ALL, + .cmd_per_lun = 1, +/* .present = 0,*/ +/* .unchecked_isa_dma = 0,*/ + .use_clustering = DISABLE_CLUSTERING, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,2)) + .use_new_eh_code = 1, #endif -/* proc_info: NULL,*/ - name: "WorkBit NinjaSCSI-3/32Bi", - detect: nsp_detect, - release: nsp_release, - info: nsp_info, -/* command: NULL,*/ - queuecommand: nsp_queuecommand, -/* eh_strategy_handler: nsp_eh_strategy,*/ - eh_abort_handler: nsp_eh_abort, - eh_device_reset_handler: nsp_eh_device_reset, - eh_bus_reset_handler: nsp_eh_bus_reset, - eh_host_reset_handler: nsp_eh_host_reset, - abort: nsp_abort, - reset: nsp_reset, -/* slave_attach: NULL,*/ -/* bios_param: NULL,*/ - can_queue: 1, - this_id: SCSI_INITIATOR_ID, - sg_tablesize: SG_ALL, - cmd_per_lun: 1, -/* present: 0,*/ -/* unchecked_isa_dma: 0,*/ - use_clustering: DISABLE_CLUSTERING, -/* emulated: 0,*/ +/* .emulated = 0,*/ }; static dev_link_t *dev_list = NULL; @@ -162,18 +174,18 @@ static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) { #ifdef PCMCIA_DEBUG - //unsigned int host_id = SCpnt->host->this_id; - //unsigned int base = SCpnt->host->io_port; + /*unsigned int host_id = SCpnt->host->this_id;*/ + /*unsigned int base = SCpnt->host->io_port;*/ unsigned char target = SCpnt->target; #endif nsp_hw_data *data = &nsp_data; - DEBUG(0, __FUNCTION__ "() SCpnt=0x%p target=%d lun=%d buff=0x%p bufflen=%d use_sg=%d\n", - SCpnt, target, SCpnt->lun, SCpnt->request_buffer, SCpnt->request_bufflen, SCpnt->use_sg); + DEBUG(0, "%s() SCpnt=0x%p target=%d lun=%d buff=0x%p bufflen=%d use_sg=%d\n", + __FUNCTION__, SCpnt, target, SCpnt->lun, SCpnt->request_buffer, SCpnt->request_bufflen, SCpnt->use_sg); //DEBUG(0, " before CurrentSC=0x%p\n", data->CurrentSC); if(data->CurrentSC != NULL) { - printk(KERN_DEBUG " " __FUNCTION__ "() CurrentSC!=NULL this can't be happen\n"); + printk(KERN_DEBUG " %s() CurrentSC!=NULL cannot happen!\n", __FUNCTION__); data->CurrentSC = NULL; SCpnt->result = DID_BAD_TARGET << 16; done(SCpnt); @@ -184,13 +196,13 @@ SCpnt->scsi_done = done; data->CurrentSC = SCpnt; - RESID = SCpnt->request_bufflen; - SCpnt->SCp.Status = -1; - SCpnt->SCp.Message = -1; + SCpnt->SCp.Status = CHECK_CONDITION; + SCpnt->SCp.Message = 0; SCpnt->SCp.have_data_in = IO_UNKNOWN; SCpnt->SCp.sent_command = 0; SCpnt->SCp.phase = PH_UNDETERMINED; + RESID = SCpnt->request_bufflen; /* setup scratch area SCp.ptr : buffer pointer @@ -200,7 +212,7 @@ SCp.phase : current state of the command */ if (SCpnt->use_sg) { SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->request_buffer; - SCpnt->SCp.ptr = SCpnt->SCp.buffer->address; + SCpnt->SCp.ptr = BUFFER_ADDR; SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1; } else { @@ -219,7 +231,7 @@ } - //DEBUG(0, __FUNCTION__ "() out\n"); + //DEBUG(0, __func__ "() out\n"); return 0; } @@ -231,7 +243,7 @@ unsigned int base = data->BaseAddress; unsigned char transfer_mode_reg; - //DEBUG(0, __FUNCTION__ "() enabled=%d\n", enabled); + //DEBUG(0, __func__ "() enabled=%d\n", enabled); if (enabled != FALSE) { transfer_mode_reg = TRANSFER_GO | BRAIND; @@ -244,31 +256,35 @@ nsp_index_write(base, TRANSFERMODE, transfer_mode_reg); } +static void nsphw_init_sync(nsp_hw_data *data) +{ + sync_data tmp_sync = { .SyncNegotiation = SYNC_NOT_YET, + .SyncPeriod = 0, + .SyncOffset = 0 + }; + int i; + + /* setup sync data */ + for ( i = 0; i < N_TARGET; i++ ) { + data->Sync[i] = tmp_sync; + } +} + /* * Initialize Ninja hardware */ static int nsphw_init(nsp_hw_data *data) { unsigned int base = data->BaseAddress; - int i, j; - sync_data tmp_sync = { SyncNegotiation: SYNC_NOT_YET, - SyncPeriod: 0, - SyncOffset: 0 - }; - DEBUG(0, __FUNCTION__ "() in base=0x%x\n", base); + DEBUG(0, "%s() in base=0x%x\n", __FUNCTION__, base); - data->ScsiClockDiv = CLOCK_40M; + data->ScsiClockDiv = CLOCK_40M | FAST_20; data->CurrentSC = NULL; data->FifoCount = 0; data->TransferMode = MODE_IO8; - /* setup sync data */ - for ( i = 0; i < N_TARGET; i++ ) { - for ( j = 0; j < N_LUN; j++ ) { - data->Sync[i][j] = tmp_sync; - } - } + nsphw_init_sync(data); /* block all interrupts */ nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK); @@ -321,10 +337,10 @@ unsigned int host_id = SCpnt->host->this_id; unsigned int base = SCpnt->host->io_port; unsigned char target = SCpnt->target; - int wait_count; + int time_out; unsigned char phase, arbit; - //DEBUG(0, __FUNCTION__ "()in\n"); + //DEBUG(0, __func__ "()in\n"); phase = nsp_index_read(base, SCSIBUSMON); if(phase != BUSMON_BUS_FREE) { @@ -337,14 +353,14 @@ SCpnt->SCp.phase = PH_ARBSTART; nsp_index_write(base, SETARBIT, ARBIT_GO); - wait_count = jiffies + 10 * HZ; + time_out = 1000; do { /* XXX: what a stupid chip! */ arbit = nsp_index_read(base, ARBITSTATUS); //DEBUG(0, " arbit=%d, wait_count=%d\n", arbit, wait_count); udelay(1); /* hold 1.2us */ } while((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 && - time_before(jiffies, wait_count)); + (time_out-- != 0)); if((arbit & ARBIT_WIN) == 0) { //DEBUG(0, " arbit fail\n"); @@ -356,13 +372,13 @@ //DEBUG(0, " assert SEL line\n"); SCpnt->SCp.phase = PH_SELSTART; udelay(3); - nsp_index_write(base, SCSIDATALATCH, (1 << host_id) | (1 << target)); - nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN); + nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target)); + nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN); udelay(3); nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_DATAOUT_ENB | SCSI_ATN); nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR); udelay(3); - nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_DATAOUT_ENB | SCSI_ATN); + nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_DATAOUT_ENB | SCSI_ATN); /* check selection timeout */ nsp_start_timer(SCpnt, data, 1000/51); @@ -399,23 +415,21 @@ static int nsp_msg(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { unsigned char target = SCpnt->target; - unsigned char lun = SCpnt->lun; - sync_data *sync = &(data->Sync[target][lun]); +// unsigned char lun = SCpnt->lun; + sync_data *sync = &(data->Sync[target]); struct nsp_sync_table *sync_table; unsigned int period, offset; int i; - DEBUG(0, __FUNCTION__ "()\n"); - -/**!**/ + DEBUG(0, "%s()\n", __FUNCTION__); period = sync->SyncPeriod; offset = sync->SyncOffset; DEBUG(0, " period=0x%x, offset=0x%x\n", period, offset); - if (data->ScsiClockDiv == CLOCK_20M) { + if ((data->ScsiClockDiv & (BIT(0)|BIT(1))) == CLOCK_20M) { sync_table = &nsp_sync_table_20M[0]; } else { sync_table = &nsp_sync_table_40M[0]; @@ -438,7 +452,6 @@ sync->SyncOffset = 0; sync->SyncRegister = 0; sync->AckWidth = 0; - sync->SyncNegotiation = SYNC_OK; return FALSE; } @@ -446,7 +459,6 @@ sync->SyncRegister = (sync_table->chip_period << SYNCREG_PERIOD_SHIFT) | (offset & SYNCREG_OFFSET_MASK); sync->AckWidth = sync_table->ack_width; - sync->SyncNegotiation = SYNC_OK; DEBUG(0, " sync_reg=0x%x, ack_width=0x%x\n", sync->SyncRegister, sync->AckWidth); @@ -461,7 +473,7 @@ { unsigned int base = SCpnt->host->io_port; - //DEBUG(0, __FUNCTION__ "() in SCpnt=0x%p, time=%d\n", SCpnt, time); + //DEBUG(0, __func__ "() in SCpnt=0x%p, time=%d\n", SCpnt, time); data->TimerCount = time; nsp_index_write(base, TIMERCOUNT, time); } @@ -473,21 +485,21 @@ { unsigned int base = SCpnt->host->io_port; unsigned char reg; - int count, i = TRUE; + int time_out; - //DEBUG(0, __FUNCTION__ "()\n"); + //DEBUG(0, __func__ "()\n"); - count = jiffies + HZ; + time_out = 100; do { reg = nsp_index_read(base, SCSIBUSMON); if (reg == 0xff) { break; } - } while ((i = time_before(jiffies, count)) && (reg & mask) != 0); + } while ((time_out-- != 0) && (reg & mask) != 0); - if (!i) { - printk(KERN_DEBUG __FUNCTION__ " %s signal off timeut\n", str); + if (time_out == 0) { + printk(KERN_DEBUG "%s: %s signal off timeut\n", __FUNCTION__, str); } return 0; @@ -501,12 +513,12 @@ unsigned char mask) { unsigned int base = SCpnt->host->io_port; - int wait_count; + int time_out; unsigned char phase, i_src; - //DEBUG(0, __FUNCTION__ "() current_phase=0x%x, mask=0x%x\n", current_phase, mask); + //DEBUG(0, __func__ "() current_phase=0x%x, mask=0x%x\n", current_phase, mask); - wait_count = jiffies + HZ; + time_out = 100; do { phase = nsp_index_read(base, SCSIBUSMON); if (phase == 0xff) { @@ -522,9 +534,9 @@ //DEBUG(0, " ret 1 phase=0x%x\n", phase); return 1; } - } while(time_before(jiffies, wait_count)); + } while(time_out-- != 0); - //DEBUG(0, __FUNCTION__ " : " __FUNCTION__ " timeout\n"); + //DEBUG(0, __func__ " : " __func__ " timeout\n"); return -1; } @@ -539,7 +551,7 @@ int ptr; int ret; - //DEBUG(0, __FUNCTION__ "()\n"); + //DEBUG(0, __func__ "()\n"); for (ptr = 0; len > 0; len --, ptr ++) { ret = nsp_expect_signal(SCpnt, phase, BUSMON_REQ); @@ -574,7 +586,7 @@ { unsigned int count; - //DEBUG(0, __FUNCTION__ "()\n"); + //DEBUG(0, __func__ "()\n"); if (SCpnt->SCp.have_data_in != IO_IN) { return 0; @@ -590,11 +602,11 @@ * XXX: NSP_QUIRK * data phase skip only occures in case of SCSI_LOW_READ */ + DEBUG(0, " use bypass quirk\n"); SCpnt->SCp.phase = PH_DATA; nsp_pio_read(SCpnt, data); nsp_setup_fifo(data, FALSE); - DEBUG(0, " use bypass quirk\n"); return 0; } @@ -606,7 +618,7 @@ unsigned int base = SCpnt->host->io_port; unsigned char reg; - //DEBUG(0, __FUNCTION__ "()\n"); + //DEBUG(0, __func__ "()\n"); nsp_negate_signal(SCpnt, BUSMON_SEL, "reselect"); @@ -625,17 +637,18 @@ { unsigned int base = SCpnt->host->io_port; unsigned int count; - unsigned int l, m, h; + unsigned int l, m, h, dummy; - nsp_index_write(base, POINTERCLR, POINTER_CLEAR); + nsp_index_write(base, POINTERCLR, POINTER_CLEAR | ACK_COUNTER); - l = (unsigned int)nsp_read(base, DATAREG); - m = (unsigned int)nsp_read(base, DATAREG); - h = (unsigned int)nsp_read(base, DATAREG); + l = nsp_index_read(base, TRANSFERCOUNT); + m = nsp_index_read(base, TRANSFERCOUNT); + h = nsp_index_read(base, TRANSFERCOUNT); + dummy = nsp_index_read(base, TRANSFERCOUNT); count = (h << 16) | (m << 8) | (l << 0); - //DEBUG(0, __FUNCTION__ "() =0x%x\n", count); + //DEBUG(0, __func__ "() =0x%x\n", count); return count; } @@ -649,25 +662,27 @@ */ static void nsp_pio_read(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { - unsigned int base = SCpnt->host->io_port; - int time_out, i; + unsigned int base = SCpnt->host->io_port; + unsigned long mmio_base = SCpnt->host->base; + long time_out; int ocount, res; unsigned char stat, fifo_stat; ocount = data->FifoCount; - DEBUG(0, __FUNCTION__ "() in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d\n", SCpnt, RESID, ocount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual); + DEBUG(0, "%s() in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d\n", + __FUNCTION__, SCpnt, RESID, ocount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual); - time_out = jiffies + 10 * HZ; + time_out = 1000; - while ((i = time_before(jiffies,time_out)) && + while ((time_out-- != 0) && (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0 ) ) { stat = nsp_index_read(base, SCSIBUSMON); stat &= BUSMON_PHASE_MASK; - res = nsp_fifo_count(SCpnt) - ocount; + res = nsp_fifo_count(SCpnt) - ocount; //DEBUG(0, " ptr=0x%p this=0x%x ocount=0x%x res=0x%x\n", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount, res); if (res == 0) { /* if some data avilable ? */ if (stat == BUSPHASE_DATA_IN) { /* phase changed? */ @@ -695,9 +710,15 @@ case MODE_IO8: nsp_fifo8_read (base, SCpnt->SCp.ptr, res ); break; + + case MODE_MEM32: + res &= ~(BIT(1)|BIT(0)); /* align 4 */ + nsp_mmio_fifo32_read(mmio_base, SCpnt->SCp.ptr, res >> 2); + break; + default: DEBUG(0, "unknown read mode\n"); - break; + return; } RESID -= res; @@ -712,17 +733,19 @@ //DEBUG(0, " scatterlist next timeout=%d\n", time_out); SCpnt->SCp.buffers_residual--; SCpnt->SCp.buffer++; - SCpnt->SCp.ptr = SCpnt->SCp.buffer->address; + SCpnt->SCp.ptr = BUFFER_ADDR; SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; - } + time_out = 1000; - time_out = jiffies + 10 * HZ; + //DEBUG(0, "page: 0x%p, off: 0x%x\n", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset); + } } data->FifoCount = ocount; - if (!i) { - printk(KERN_DEBUG __FUNCTION__ "() pio read timeout resid=%d this_residual=%d buffers_residual=%d\n", RESID, SCpnt->SCp.this_residual, SCpnt->SCp.buffers_residual); + if (time_out == 0) { + printk(KERN_DEBUG "%s() pio read timeout resid=%d this_residual=%d buffers_residual=%d\n", + __FUNCTION__, RESID, SCpnt->SCp.this_residual, SCpnt->SCp.buffers_residual); } DEBUG(0, " read ocount=0x%x\n", ocount); } @@ -733,22 +756,32 @@ static void nsp_pio_write(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { unsigned int base = SCpnt->host->io_port; - int time_out, i; - unsigned int ocount, res; + unsigned long mmio_base = SCpnt->host->base; + int time_out; + int ocount, res; unsigned char stat; ocount = data->FifoCount; - DEBUG(0, __FUNCTION__ "() in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x\n", data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual, RESID); + DEBUG(0, "%s() in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x\n", __FUNCTION__, data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual, RESID); - time_out = jiffies + 10 * HZ; + time_out = 1000; - while ((i = time_before(jiffies, time_out)) && + while ((time_out-- != 0) && (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0)) { stat = nsp_index_read(base, SCSIBUSMON); stat &= BUSMON_PHASE_MASK; + if (stat != BUSPHASE_DATA_OUT) { - DEBUG(0, " phase changed stat=0x%x\n", stat); + res = ocount - nsp_fifo_count(SCpnt); + + DEBUG(0, " phase changed stat=0x%x, res=%d\n", stat, res); + /* Put back pointer */ + RESID += res; + SCpnt->SCp.ptr -= res; + SCpnt->SCp.this_residual += res; + ocount -= res; + break; } @@ -769,6 +802,12 @@ case MODE_IO8: nsp_fifo8_write (base, SCpnt->SCp.ptr, res ); break; + + case MODE_MEM32: + res &= ~(BIT(1)|BIT(0)); /* align 4 */ + nsp_mmio_fifo32_write(mmio_base, SCpnt->SCp.ptr, res >> 2); + break; + default: DEBUG(0, "unknown write mode\n"); break; @@ -785,19 +824,18 @@ //DEBUG(0, " scatterlist next\n"); SCpnt->SCp.buffers_residual--; SCpnt->SCp.buffer++; - SCpnt->SCp.ptr = SCpnt->SCp.buffer->address; + SCpnt->SCp.ptr = BUFFER_ADDR; SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; + time_out = 1000; } - - time_out = jiffies + 10 * HZ; } data->FifoCount = ocount; - if (!i) { - printk(KERN_DEBUG __FUNCTION__ "() pio write timeout resid=%d\n", RESID); + if (time_out == 0) { + printk(KERN_DEBUG "%s() pio write timeout resid=0x%x\n", __FUNCTION__, RESID); } - //DEBUG(0, " write ocount=%d\n", ocount); + DEBUG(0, " write ocount=0x%x\n", ocount); } #undef RFIFO_CRIT @@ -810,20 +848,25 @@ { unsigned int base = SCpnt->host->io_port; unsigned char target = SCpnt->target; - unsigned char lun = SCpnt->lun; - sync_data *sync = &(data->Sync[target][lun]); +// unsigned char lun = SCpnt->lun; + sync_data *sync = &(data->Sync[target]); - //DEBUG(0, __FUNCTION__ "() in SCpnt=0x%p\n", SCpnt); + //DEBUG(0, __func__ "() in SCpnt=0x%p\n", SCpnt); /* setup synch transfer registers */ nsp_index_write(base, SYNCREG, sync->SyncRegister); nsp_index_write(base, ACKWIDTH, sync->AckWidth); - if (RESID % 4 != 0 || - RESID <= 256 ) { + if (SCpnt->use_sg == 0 || + RESID % 4 != 0 || + RESID <= PAGE_SIZE ) { data->TransferMode = MODE_IO8; - } else { + } else if (nsp_burst_mode == BURST_MEM32) { + data->TransferMode = MODE_MEM32; + } else if (nsp_burst_mode == BURST_IO32) { data->TransferMode = MODE_IO32; + } else { + data->TransferMode = MODE_IO8; } /* setup pdma fifo */ @@ -848,24 +891,13 @@ unsigned int base; unsigned char i_src, irq_phase, phase; Scsi_Cmnd *tmpSC; - int len; unsigned char target, lun; unsigned int *sync_neg; int i, tmp; - nsp_hw_data *data; + nsp_hw_data *data = dev_id; //printk("&nsp_data=0x%p, dev_id=0x%p\n", &nsp_data, dev_id); - /* sanity check */ - if (&nsp_data != dev_id) { - DEBUG(0, " irq conflict? this can't happen\n"); - return; - } - data = dev_id; - if (irq != data->IrqNumber) { - return; - } - base = data->BaseAddress; //DEBUG(0, " base=0x%x\n", base); @@ -874,13 +906,13 @@ */ nsp_write(base, IRQCONTROL, IRQCONTROL_IRQDISABLE); i_src = nsp_read(base, IRQSTATUS); - if (i_src == 0xff || (i_src & IRQSTATUS_MASK) == 0) { + //DEBUG(0, " i_src=0x%x\n", i_src); + if ((i_src == 0xff) || ((i_src & IRQSTATUS_MASK) == 0)) { nsp_write(base, IRQCONTROL, 0); - //DEBUG(0, " no irq\n"); + //DEBUG(0, " no irq/shared irq\n"); return; } - //DEBUG(0, " i_src=0x%x\n", i_src); /* XXX: IMPORTANT * Do not read an irq_phase register if no scsi phase interrupt. @@ -916,13 +948,13 @@ nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR | IRQCONTROL_FIFO_CLEAR); if (data->CurrentSC == NULL) { - printk(KERN_DEBUG __FUNCTION__ " CurrentSC==NULL irq_status=0x%x phase=0x%x irq_phase=0x%x this can't be happen\n", i_src, phase, irq_phase); + printk(KERN_DEBUG "%s: CurrentSC==NULL irq_status=0x%x phase=0x%x irq_phase=0x%x cannot happen\n", __FUNCTION__, i_src, phase, irq_phase); return; } else { tmpSC = data->CurrentSC; target = tmpSC->target; lun = tmpSC->lun; - sync_neg = &(data->Sync[target][lun].SyncNegotiation); + sync_neg = &(data->Sync[target].SyncNegotiation); } /* @@ -930,10 +962,12 @@ */ if ((i_src & IRQSTATUS_SCSI) != 0) { if ((irq_phase & SCSI_RESET_IRQ) != 0) { - printk(KERN_DEBUG " " __FUNCTION__ "() bus reset (power off?)\n"); + printk(KERN_DEBUG " %s() bus reset (power off?)\n", __FUNCTION__); *sync_neg = SYNC_NOT_YET; data->CurrentSC = NULL; - tmpSC->result = DID_RESET << 16; + tmpSC->result = (DID_RESET << 16) | + ((tmpSC->SCp.Message & 0xff) << 8) | + ((tmpSC->SCp.Status & 0xff) << 0); tmpSC->scsi_done(tmpSC); return; } @@ -955,7 +989,7 @@ switch(tmpSC->SCp.phase) { case PH_SELSTART: - *sync_neg = SYNC_NOT_YET; + //*sync_neg = SYNC_NOT_YET; if ((phase & BUSMON_BSY) == 0) { //DEBUG(0, " selection count=%d\n", data->SelectionTimeOut); if (data->SelectionTimeOut >= NSP_SELTIMEOUT) { @@ -987,7 +1021,7 @@ case PH_RESELECT: //DEBUG(0, " phase reselect\n"); - *sync_neg = SYNC_NOT_YET; + //*sync_neg = SYNC_NOT_YET; if ((phase & BUSMON_PHASE_MASK) != BUSPHASE_MESSAGE_IN) { data->CurrentSC = NULL; @@ -1009,16 +1043,18 @@ //DEBUG(0, " start scsi seq\n"); /* normal disconnect */ - if ((irq_phase & LATCHED_BUS_FREE) != 0) { - //DEBUG(0, " normal disconnect i_src=0x%x, phase=0x%x, irq_phase=0x%x\n", i_src, phase, irq_phase); + if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) && + (irq_phase & LATCHED_BUS_FREE) != 0 ) { + DEBUG(0, " normal disconnect i_src=0x%x, phase=0x%x, irq_phase=0x%x\n", i_src, phase, irq_phase); if ((tmpSC->SCp.Message == MSG_COMMAND_COMPLETE)) { /* all command complete and return status */ - *sync_neg = SYNC_NOT_YET; + //*sync_neg = SYNC_NOT_YET; data->CurrentSC = NULL; - tmpSC->result = (DID_OK << 16) | - (tmpSC->SCp.Message << 8) | - (tmpSC->SCp.Status << 0); + tmpSC->result = (DID_OK << 16) | + ((tmpSC->SCp.Message & 0xff) << 8) | + ((tmpSC->SCp.Status & 0xff) << 0); DEBUG(0, " command complete result=0x%x\n", tmpSC->result); tmpSC->scsi_done(tmpSC); + return; } @@ -1028,7 +1064,7 @@ /* check unexpected bus free state */ if (phase == 0) { - printk(KERN_DEBUG " " __FUNCTION__ " unexpected bus free. i_src=0x%x, phase=0x%x, irq_phase=0x%x\n", i_src, phase, irq_phase); + printk(KERN_DEBUG "%s: unexpected bus free. i_src=0x%x, phase=0x%x, irq_phase=0x%x\n", __FUNCTION__, i_src, phase, irq_phase); *sync_neg = SYNC_NOT_YET; data->CurrentSC = NULL; @@ -1050,9 +1086,10 @@ nsp_nexus(tmpSC, data); /* write scsi command */ + DEBUG(0, " cmd_len=%d\n", tmpSC->cmd_len); nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER); - for (len = 0; len < COMMAND_SIZE(tmpSC->cmnd[0]); len++) { - nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[len]); + for (i = 0; i < tmpSC->cmd_len; i++) { + nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[i]); } nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER | AUTO_COMMAND_GO); break; @@ -1084,7 +1121,7 @@ tmpSC->SCp.phase = PH_STATUS; tmpSC->SCp.Status = nsp_index_read(base, SCSIDATAWITHACK); - //DEBUG(0, " message=0x%x status=0x%x\n", tmpSC->SCp.Message, tmpSC->SCp.Status); + DEBUG(0, " message=0x%x status=0x%x\n", tmpSC->SCp.Message, tmpSC->SCp.Status); break; @@ -1096,26 +1133,24 @@ tmpSC->SCp.phase = PH_MSG_OUT; - data->MsgLen = len = 0; + data->MsgLen = i = 0; + data->MsgBuffer[i] = IDENTIFY(TRUE, lun); i++; + if (*sync_neg == SYNC_NOT_YET) { - data->Sync[target][lun].SyncPeriod = 0; - data->Sync[target][lun].SyncOffset = 0; - nsp_msg(tmpSC, data); + data->Sync[target].SyncPeriod = 0; + data->Sync[target].SyncOffset = 0; - data->MsgBuffer[len] = IDENTIFY(TRUE, lun); len++; - /* - data->MsgBuffer[len] = MSG_EXTENDED; len++; - data->MsgBuffer[len] = 3; len++; - data->MsgBuffer[len] = MSG_EXT_SDTR; len++; - data->MsgBuffer[len] = 0x0c; len++; - data->MsgBuffer[len] = 15; len++; - */ - } - if (len == 0) { - data->MsgBuffer[len] = MSG_NO_OPERATION; len++; + /**/ + data->MsgBuffer[i] = MSG_EXTENDED; i++; + data->MsgBuffer[i] = 3; i++; + data->MsgBuffer[i] = MSG_EXT_SDTR; i++; + data->MsgBuffer[i] = 0x0c; i++; + data->MsgBuffer[i] = 15; i++; + /**/ } - data->MsgLen = len; + data->MsgLen = i; + nsp_msg(tmpSC, data); show_message(data); nsp_message_out(tmpSC, data); break; @@ -1130,16 +1165,26 @@ tmpSC->SCp.phase = PH_MSG_IN; nsp_message_in(tmpSC, data); - /* - if (data->MsgLen >= 5 && - data->MsgBuffer[0] == MSG_EXTENDED && - data->MsgBuffer[1] == 3 && - data->MsgBuffer[2] == MSG_EXT_SDTR ) { - data->Sync[target][lun].SyncPeriod = data->MsgBuffer[3]; - data->Sync[target][lun].SyncOffset = data->MsgBuffer[4]; + /**/ + if (*sync_neg == SYNC_NOT_YET) { + //printk("%d,%d\n",target,lun); + + if (data->MsgLen >= 5 && + data->MsgBuffer[0] == MSG_EXTENDED && + data->MsgBuffer[1] == 3 && + data->MsgBuffer[2] == MSG_EXT_SDTR ) { + data->Sync[target].SyncPeriod = data->MsgBuffer[3]; + data->Sync[target].SyncOffset = data->MsgBuffer[4]; + //printk("sync ok, %d %d\n", data->MsgBuffer[3], data->MsgBuffer[4]); + *sync_neg = SYNC_OK; + } else { + data->Sync[target].SyncPeriod = 0; + data->Sync[target].SyncOffset = 0; + *sync_neg = SYNC_NG; + } nsp_msg(tmpSC, data); } - */ + /**/ /* search last messeage byte */ tmp = -1; @@ -1163,7 +1208,7 @@ break; } - //DEBUG(0, __FUNCTION__ "() out\n"); + //DEBUG(0, __func__ "() out\n"); return; timer_out: @@ -1183,41 +1228,52 @@ struct Scsi_Host *host; /* registered host structure */ nsp_hw_data *data = &nsp_data; - DEBUG(0, __FUNCTION__ " this_id=%d\n", sht->this_id); + DEBUG(0, "%s: this_id=%d\n", __FUNCTION__, sht->this_id); request_region(data->BaseAddress, data->NumAddress, "nsp_cs"); host = scsi_register(sht, 0); - host->io_port = data->BaseAddress; host->unique_id = data->BaseAddress; + host->io_port = data->BaseAddress; host->n_io_port = data->NumAddress; host->irq = data->IrqNumber; - host->dma_channel = 0xff; /* not use dms */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)) + host->base = data->MmioAddress; /* kernel 2.4 */ +#else + host->base = (char *)(data->MmioAddress); /* 2.2 */ +#endif + + spin_lock_init(&(data->Lock)); - sprintf(nspinfo, -/* Buffer size is 100 bytes */ -/* 0 1 2 3 4 5 6 7 8 9 0*/ -/* 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890*/ - "NinjaSCSI-3/32Bi Driver $Revision: 1.42 $, I/O 0x%04lx-0x%04lx IRQ %2d", - host->io_port, host->io_port + host->n_io_port, - host->irq); - sht->name = nspinfo; + snprintf(data->nspinfo, + sizeof(data->nspinfo), + "NinjaSCSI-3/32Bi Driver $Revision: 1.4 $ IO:0x%04lx-0x%04lx MMIO(virt addr):0x%04lx IRQ:%02d", + host->io_port, host->io_port + host->n_io_port - 1, + host->base, + host->irq); + data->nspinfo[sizeof(data->nspinfo) - 1] = '\0'; + sht->name = data->nspinfo; - DEBUG(0, __FUNCTION__ " end\n"); + DEBUG(0, "%s: end\n", __FUNCTION__); + + //MOD_INC_USE_COUNT; return 1; /* detect done. */ } -/* nsp_cs requires own release handler because its uses dev_id (=data) */ static int nsp_release(struct Scsi_Host *shpnt) { - nsp_hw_data *data = &nsp_data; + //nsp_hw_data *data = &nsp_data; + + /* PCMCIA Card Service dose same things */ + //if (shpnt->irq) { + // free_irq(shpnt->irq, data); + //} + //if (shpnt->io_port) { + // release_region(shpnt->io_port, shpnt->n_io_port); + //} + + //MOD_DEC_USE_COUNT; - if (shpnt->irq) { - free_irq(shpnt->irq, data); - } - if (shpnt->io_port && shpnt->n_io_port) { - release_region(shpnt->io_port, shpnt->n_io_port); - } return 0; } @@ -1226,25 +1282,152 @@ /*----------------------------------------------------------------*/ static const char *nsp_info(struct Scsi_Host *shpnt) { - return nspinfo; + nsp_hw_data *data = &nsp_data; + + return data->nspinfo; } +#undef SPRINTF +#define SPRINTF(args...) \ + do { if(pos < buffer + length) pos += sprintf(pos, ## args); } while(0) +static int nsp_proc_info(char *buffer, + char **start, + off_t offset, + int length, + int hostno, + int inout) +{ + int id; + char *pos = buffer; + int thislength; + int speed; + unsigned long flags; + nsp_hw_data *data = &nsp_data; + struct Scsi_Host *host; + + if (inout) { + return -EINVAL; + } + + host = scsi_host_hn_get(hostno); + + SPRINTF("NinjaSCSI status\n\n"); + SPRINTF("Driver version: $Revision: 1.4 $\n"); + SPRINTF("SCSI host No.: %d\n", hostno); + SPRINTF("IRQ: %d\n", host->irq); + SPRINTF("IO: 0x%lx-0x%lx\n", host->io_port, host->io_port + host->n_io_port - 1); + SPRINTF("MMIO(virtual address): 0x%lx\n", host->base); + SPRINTF("sg_tablesize: %d\n", host->sg_tablesize); + + SPRINTF("burst transfer mode: "); + switch (nsp_burst_mode) { + case BURST_IO8: + SPRINTF("io8"); + break; + case BURST_IO32: + SPRINTF("io32"); + break; + case BURST_MEM32: + SPRINTF("mem32"); + break; + default: + SPRINTF("???"); + break; + } + SPRINTF("\n"); + + + spin_lock_irqsave(&(data->Lock), flags); + SPRINTF("CurrentSC: 0x%p\n\n", data->CurrentSC); + spin_unlock_irqrestore(&(data->Lock), flags); + + SPRINTF("SDTR status\n"); + for(id = 0; id < N_TARGET; id++) { + + SPRINTF("id %d: ", id); + + if (id == host->this_id) { + SPRINTF("----- NinjaSCSI-3 host adapter\n"); + continue; + } + + switch(data->Sync[id].SyncNegotiation) { + case SYNC_OK: + SPRINTF(" sync"); + break; + case SYNC_NG: + SPRINTF("async"); + break; + case SYNC_NOT_YET: + SPRINTF(" none"); + break; + default: + SPRINTF("?????"); + break; + } + + if (data->Sync[id].SyncPeriod != 0) { + speed = 1000000 / (data->Sync[id].SyncPeriod * 4); + + SPRINTF(" transfer %d.%dMB/s, offset %d", + speed / 1000, + speed % 1000, + data->Sync[id].SyncOffset + ); + } + SPRINTF("\n"); + } + + thislength = pos - (buffer + offset); + + if(thislength < 0) { + *start = 0; + return 0; + } + + + thislength = MIN(thislength, length); + *start = buffer + offset; + + return thislength; +} +#undef SPRINTF + /*---------------------------------------------------------------*/ /* error handler */ /*---------------------------------------------------------------*/ -static int nsp_reset(Scsi_Cmnd *SCpnt, unsigned int why) +static int nsp_reset(Scsi_Cmnd *SCpnt, unsigned int reset_flags) { - DEBUG(0, __FUNCTION__ " SCpnt=0x%p why=%d\n", SCpnt, why); + nsp_hw_data *data = &nsp_data; + int ret = 0; - nsp_eh_bus_reset(SCpnt); + DEBUG(0, "%s: SCpnt=0x%p why=%d\n", __FUNCTION__, SCpnt, reset_flags); - return SCSI_RESET_SUCCESS; + if (reset_flags & SCSI_RESET_SUGGEST_BUS_RESET) { + nsp_eh_bus_reset(SCpnt); + + ret |= SCSI_RESET_BUS_RESET; + } + + if (reset_flags & SCSI_RESET_SUGGEST_HOST_RESET) { + nsp_eh_host_reset(SCpnt); + + ret |= SCSI_RESET_HOST_RESET; + } + + if (ret != 0) { + return SCSI_RESET_SUCCESS | ret; + } else { + nsphw_init_sync(data); + return SCSI_RESET_PUNT; + } } static int nsp_abort(Scsi_Cmnd *SCpnt) { - DEBUG(0, __FUNCTION__ " SCpnt=0x%p\n", SCpnt); + DEBUG(0, "%s: SCpnt=0x%p\n", __FUNCTION__, SCpnt); + nsp_eh_host_reset(SCpnt); nsp_eh_bus_reset(SCpnt); return SCSI_ABORT_SUCCESS; @@ -1255,28 +1438,29 @@ return FAILED; }*/ +/* static int nsp_eh_abort(Scsi_Cmnd *SCpnt) { - DEBUG(0, __FUNCTION__ " SCpnt=0x%p\n", SCpnt); - - nsp_eh_bus_reset(SCpnt); + DEBUG(0, "%s: SCpnt=0x%p\n", __FUNCTION__, SCpnt); - return SUCCESS; -} + return nsp_eh_bus_reset(SCpnt); +}*/ +/* static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt) { - DEBUG(0, __FUNCTION__ " SCpnt=0x%p\n", SCpnt); + DEBUG(0, "%s: SCpnt=0x%p\n", __FUNCTION__, SCpnt); return FAILED; -} +}*/ static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt) { + nsp_hw_data *data = &nsp_data; unsigned int base = SCpnt->host->io_port; int i; - DEBUG(0, __FUNCTION__ "() SCpnt=0x%p base=0x%x\n", SCpnt, base); + DEBUG(0, "%s() SCpnt=0x%p base=0x%x\n", __FUNCTION__, SCpnt, base); nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK); @@ -1289,6 +1473,8 @@ nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR); + nsphw_init_sync(data); + return SUCCESS; } @@ -1296,17 +1482,17 @@ { nsp_hw_data *data = &nsp_data; - DEBUG(0, __FUNCTION__ "\n"); + DEBUG(0, "%s\n", __FUNCTION__); nsphw_init(data); - return nsp_eh_bus_reset(SCpnt); + return SUCCESS; } /********************************************************************** PCMCIA functions - *********************************************************************/ +**********************************************************************/ /*====================================================================*/ static void cs_error(client_handle_t handle, int func, int ret) @@ -1331,7 +1517,7 @@ dev_link_t *link; int ret, i; - DEBUG(0, __FUNCTION__ "()\n"); + DEBUG(0, "%s()\n", __FUNCTION__); /* Create new SCSI device */ info = kmalloc(sizeof(*info), GFP_KERNEL); @@ -1359,8 +1545,15 @@ link->irq.IRQInfo2 |= 1 << irq_list[i]; } } + + /* IRQ $B$N3NJ]$O$3$3$G(B PCMCIA $B$N4X?t$rMQ$$$F9T$J$&$N$G(B + * host->hostdata $B$r(B irq.Instance $B$KBeF~$G$-$J$$!#(B + * host->hostdata $B$,;H$($l$PJ#?t$N(B NinjaSCSI $B$,(B + * $B;HMQ$G$-$k$N$@$,!#(B + */ link->irq.Handler = &nspintr; link->irq.Instance = &nsp_data; + link->irq.Attributes |= (SA_SHIRQ | SA_SAMPLE_RANDOM); /* General socket configuration */ link->conf.Attributes = CONF_ENABLE_IRQ; @@ -1402,7 +1595,7 @@ { dev_link_t **linkp; - DEBUG(0, __FUNCTION__ "(0x%p)\n", link); + DEBUG(0, "%s(0x%p)\n", __FUNCTION__, link); /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) { @@ -1414,7 +1607,7 @@ return; } - del_timer(&link->release); + del_timer_sync(&link->release); if (link->state & DEV_CONFIG) { nsp_cs_release((u_long)link); if (link->state & DEV_STALE_CONFIG) { @@ -1431,6 +1624,7 @@ /* Unlink device structure, free bits */ *linkp = link->next; kfree(link->priv); + link->priv = NULL; } /* nsp_cs_detach */ @@ -1452,15 +1646,20 @@ scsi_info_t *info = link->priv; tuple_t tuple; cisparse_t parse; - int i, last_ret, last_fn; + int last_ret, last_fn; u_char tuple_data[64]; config_info_t conf; + win_req_t req; + memreq_t map; + cistpl_cftable_entry_t dflt = { 0 }; + Scsi_Device *dev; dev_node_t **tail, *node; struct Scsi_Host *host; nsp_hw_data *data = &nsp_data; - DEBUG(0, __FUNCTION__ "() in\n"); + + DEBUG(0, "%s() in\n", __FUNCTION__); tuple.DesiredTuple = CISTPL_CONFIG; tuple.Attributes = 0; @@ -1474,7 +1673,6 @@ link->conf.Present = parse.config.rmask[0]; /* Configure card */ - driver_template.module = &__this_module; link->state |= DEV_CONFIG; /* Look up the current Vcc */ @@ -1484,44 +1682,130 @@ tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; CS_CHECK(GetFirstTuple, handle, &tuple); while (1) { + cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); + CFG_CHECK(GetTupleData, handle, &tuple); CFG_CHECK(ParseTuple, handle, &tuple, &parse); - link->conf.ConfigIndex = parse.cftable_entry.index; - link->io.BasePort1 = parse.cftable_entry.io.win[0].base; - i = CardServices(RequestIO, handle, &link->io); - if (i == CS_SUCCESS) { - break; + + if (cfg->flags & CISTPL_CFTABLE_DEFAULT) { dflt = *cfg; } + if (cfg->index == 0) { goto next_entry; } + link->conf.ConfigIndex = cfg->index; + + /* Does this card need audio output? */ + if (cfg->flags & CISTPL_CFTABLE_AUDIO) { + link->conf.Attributes |= CONF_ENABLE_SPKR; + link->conf.Status = CCSR_AUDIO_ENA; + } + + /* Use power settings for Vcc and Vpp if present */ + /* Note that the CIS values need to be rescaled */ + if (cfg->vcc.present & (1<vcc.param[CISTPL_POWER_VNOM]/10000) { + goto next_entry; + } + } else if (dflt.vcc.present & (1<vpp1.present & (1<conf.Vpp1 = link->conf.Vpp2 = + cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; + } else if (dflt.vpp1.present & (1<conf.Vpp1 = link->conf.Vpp2 = + dflt.vpp1.param[CISTPL_POWER_VNOM]/10000; + } + + /* Do we need to allocate an interrupt? */ + if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1) { + link->conf.Attributes |= CONF_ENABLE_IRQ; + } + + /* IO window settings */ + link->io.NumPorts1 = link->io.NumPorts2 = 0; + if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) { + cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io; + link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; + if (!(io->flags & CISTPL_IO_8BIT)) + link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; + if (!(io->flags & CISTPL_IO_16BIT)) + link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; + link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; + link->io.BasePort1 = io->win[0].base; + link->io.NumPorts1 = io->win[0].len; + if (io->nwin > 1) { + link->io.Attributes2 = link->io.Attributes1; + link->io.BasePort2 = io->win[1].base; + link->io.NumPorts2 = io->win[1].len; + } + /* This reserves IO space but doesn't actually enable it */ + CFG_CHECK(RequestIO, link->handle, &link->io); } + + if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) { + cistpl_mem_t *mem = + (cfg->mem.nwin) ? &cfg->mem : &dflt.mem; + req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM; + req.Attributes |= WIN_ENABLE; + req.Base = mem->win[0].host_addr; + req.Size = mem->win[0].len; + if (req.Size < 0x1000) + req.Size = 0x1000; + req.AccessSpeed = 0; + link->win = (window_handle_t)link->handle; + CFG_CHECK(RequestWindow, &link->win, &req); + map.Page = 0; map.CardOffset = mem->win[0].card_addr; + CFG_CHECK(MapMemPage, link->win, &map); + + data->MmioAddress = (u_long)ioremap_nocache(req.Base, req.Size); + } + /* If we got this far, we're cool! */ + break; + next_entry: - DEBUG(0, __FUNCTION__ " next\n"); + DEBUG(0, "%s next\n", __FUNCTION__); + + if (link->io.NumPorts1) + CardServices(ReleaseIO, link->handle, &link->io); CS_CHECK(GetNextTuple, handle, &tuple); } - CS_CHECK(RequestIRQ, handle, &link->irq); + if (link->conf.Attributes & CONF_ENABLE_IRQ) + CS_CHECK(RequestIRQ, link->handle, &link->irq); CS_CHECK(RequestConfiguration, handle, &link->conf); - /* A bad hack... */ - release_region(link->io.BasePort1, link->io.NumPorts1); + if (free_ports) { + if (link->io.BasePort1) + release_region(link->io.BasePort1, link->io.NumPorts1); + if (link->io.BasePort2) + release_region(link->io.BasePort2, link->io.NumPorts2); + } /* Set port and IRQ */ - data->BaseAddress = link->io.BasePort1; - data->NumAddress = link->io.NumPorts1; - data->IrqNumber = link->irq.AssignedIRQ; + data->BaseAddress = link->io.BasePort1; + data->NumAddress = link->io.NumPorts1; + data->IrqNumber = link->irq.AssignedIRQ; - DEBUG(0, __FUNCTION__ " I/O[0x%x+0x%x] IRQ %d\n", + DEBUG(0, "%s I/O[0x%x+0x%x] IRQ %d\n", + __FUNCTION__, data->BaseAddress, data->NumAddress, data->IrqNumber); if(nsphw_init(data) == FALSE) { goto cs_failed; } +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2)) scsi_register_host(&driver_template); +#else + scsi_register_module(MODULE_SCSI_HA, &driver_template); +#endif DEBUG(0, "GET_SCSI_INFO\n"); tail = &link->dev; info->ndev = 0; for (host = scsi_host_get_next(NULL); host; - host = scsi_host_get_next(host)) + host = scsi_host_get_next(host)) { if (host->hostt == &driver_template) { for (dev = host->host_queue; dev != NULL; dev = dev->next) { u_long arg[2], id; @@ -1575,6 +1859,12 @@ printk(", io 0x%04x-0x%04x", link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1-1); } + if (link->io.NumPorts2) + printk(" & 0x%04x-0x%04x", link->io.BasePort2, + link->io.BasePort2+link->io.NumPorts2-1); + if (link->win) + printk(", mem 0x%06lx-0x%06lx", req.Base, + req.Base+req.Size-1); printk("\n"); link->state &= ~DEV_CONFIG_PENDING; @@ -1598,7 +1888,7 @@ { dev_link_t *link = (dev_link_t *)arg; - DEBUG(0, __FUNCTION__ "(0x%p)\n", link); + DEBUG(0, "%s(0x%p)\n", __FUNCTION__, link); /* * If the device is currently in use, we won't release until it @@ -1612,10 +1902,15 @@ } /* Unlink the device chain */ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2)) scsi_unregister_host(&driver_template); +#else + scsi_unregister_module(MODULE_SCSI_HA, &driver_template); +#endif link->dev = NULL; if (link->win) { + iounmap((void *)(nsp_data.MmioAddress)); CardServices(ReleaseWindow, link->win); } CardServices(ReleaseConfiguration, link->handle); @@ -1645,14 +1940,15 @@ the card is still present. ======================================================================*/ -static int nsp_cs_event(event_t event, - int priority, - event_callback_args_t *args) +static int nsp_cs_event(event_t event, + int priority, + event_callback_args_t *args) { dev_link_t *link = args->client_data; scsi_info_t *info = link->priv; + Scsi_Cmnd tmp; - DEBUG(1, __FUNCTION__ "(0x%06x)\n", event); + DEBUG(1, "%s(0x%06x)\n", __FUNCTION__, event); switch (event) { case CS_EVENT_CARD_REMOVAL: @@ -1688,20 +1984,21 @@ case CS_EVENT_CARD_RESET: DEBUG(0, " event: reset\n"); if (link->state & DEV_CONFIG) { - Scsi_Cmnd tmp; - CardServices(RequestConfiguration, link->handle, &link->conf); - tmp.host = info->host; - nsp_eh_host_reset(&tmp); } info->stop = 0; + + tmp.host = info->host; + nsp_eh_host_reset(&tmp); + nsp_eh_bus_reset(&tmp); + break; default: DEBUG(0, " event: unknown\n"); break; } - DEBUG(0, __FUNCTION__ " end\n"); + DEBUG(0, "%s end\n", __FUNCTION__); return 0; } /* nsp_cs_event */ @@ -1712,7 +2009,7 @@ { servinfo_t serv; - DEBUG(0, __FUNCTION__ "() in\n"); + DEBUG(0, "%s() in\n", __FUNCTION__); DEBUG(0, "%s\n", version); CardServices(GetCardServicesInfo, &serv); if (serv.Revision != CS_RELEASE_CODE) { @@ -1722,14 +2019,14 @@ } register_pcmcia_driver(&dev_info, &nsp_cs_attach, &nsp_cs_detach); - DEBUG(0, __FUNCTION__ "() out\n"); + DEBUG(0, "%s() out\n", __FUNCTION__); return 0; } static void __exit nsp_cs_cleanup(void) { - DEBUG(0, __FUNCTION__ "() unloading\n"); + DEBUG(0, "%s() unloading\n", __FUNCTION__); unregister_pcmcia_driver(&dev_info); while (dev_list != NULL) { if (dev_list->state & DEV_CONFIG) { @@ -1739,8 +2036,8 @@ } } -module_init(nsp_cs_init); -module_exit(nsp_cs_cleanup); +module_init(nsp_cs_init) +module_exit(nsp_cs_cleanup) /* * diff -Nru a/drivers/scsi/pcmcia/nsp_cs.h b/drivers/scsi/pcmcia/nsp_cs.h --- a/drivers/scsi/pcmcia/nsp_cs.h Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/pcmcia/nsp_cs.h Mon Oct 28 16:32:36 2002 @@ -10,13 +10,13 @@ =========================================================*/ -/* $Id: nsp_cs.h,v 1.27 2001/09/10 10:31:13 elca Exp $ */ +/* $Id: nsp_cs.h,v 1.3 2002/10/10 11:07:52 elca Exp $ */ #ifndef __nsp_cs__ #define __nsp_cs__ /* for debugging */ -/*#define PCMCIA_DEBUG 9*/ +//#define PCMCIA_DEBUG 9 /* #define static @@ -27,11 +27,11 @@ * Some useful macros... */ #define Number(arr) ((int) (sizeof(arr) / sizeof(arr[0]))) -#define BIT(x) (1<<(x)) +#define BIT(x) (1L << (x)) #define MIN(a,b) ((a) > (b) ? (b) : (a)) -/* SCSI initiator must be 7 */ -#define SCSI_INITIATOR_ID 7 +/* SCSI initiator must be ID 7 */ +#define NSP_INITIATOR_ID 7 #define NSP_SELTIMEOUT 200 @@ -73,6 +73,7 @@ #define CLOCKDIV 0x11 # define CLOCK_40M 0x02 # define CLOCK_20M 0x01 +# define FAST_20 BIT(2) #define TERMPWRCTRL 0x13 # define POWER_ON BIT(0) @@ -133,6 +134,9 @@ # define REQ_COUNTER_CLEAR BIT(2) # define HOST_COUNTER_CLEAR BIT(3) # define READ_SOURCE 0x30 +# define ACK_COUNTER (0) +# define REQ_COUNTER (BIT(4)) +# define HOST_COUNTER (BIT(5)) #define TRANSFERCOUNT 0x1E /* R */ @@ -222,11 +226,14 @@ unsigned char AckWidth; } sync_data; -typedef struct _nsp_data { +typedef struct _nsp_hw_data { unsigned int BaseAddress; unsigned int NumAddress; unsigned int IrqNumber; + unsigned long MmioAddress; +#define NSP_MMIO_OFFSET 0x0800 + unsigned char ScsiClockDiv; unsigned char TransferMode; @@ -238,9 +245,9 @@ int FifoCount; #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)) int Residual; -#define RESID data->Residual +#define RESID (data->Residual) #else -#define RESID SCpnt->resid +#define RESID (SCpnt->resid) #endif #define MSGBUF_SIZE 20 @@ -248,10 +255,20 @@ int MsgLen; #define N_TARGET 8 -#define N_LUN 8 - sync_data Sync[N_TARGET][N_LUN]; + sync_data Sync[N_TARGET]; + + char nspinfo[110]; /* description */ + spinlock_t Lock; } nsp_hw_data; +/* scatter-gather table */ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2)) +# define BUFFER_ADDR ((char *)((unsigned int)(SCpnt->SCp.buffer->page) + SCpnt->SCp.buffer->offset)) +#else +# define BUFFER_ADDR SCpnt->SCp.buffer->address +#endif + + static void nsp_cs_release(u_long arg); static int nsp_cs_event(event_t event, int priority, event_callback_args_t *args); @@ -263,14 +280,16 @@ static int nsp_detect(Scsi_Host_Template * ); static int nsp_release(struct Scsi_Host *shpnt); -static const char * nsp_info(struct Scsi_Host *shpnt); +static const char *nsp_info(struct Scsi_Host *shpnt); +static int nsp_proc_info(char *buffer, char **start, off_t offset, + int length, int hostno, int inout); static int nsp_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); static int nsp_abort(Scsi_Cmnd *); static int nsp_reset(Scsi_Cmnd *, unsigned int); -static int nsp_eh_abort(Scsi_Cmnd * SCpnt); -static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt); +/*static int nsp_eh_abort(Scsi_Cmnd * SCpnt);*/ +/*static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt);*/ static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt); static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt); @@ -294,17 +313,19 @@ * SCSI phase */ enum _scsi_phase { - PH_UNDETERMINED, - PH_ARBSTART, - PH_SELSTART, - PH_SELECTED, - PH_COMMAND, - PH_DATA, - PH_STATUS, - PH_MSG_IN, - PH_MSG_OUT, - PH_DISCONNECT, - PH_RESELECT + PH_UNDETERMINED , + PH_ARBSTART , + PH_SELSTART , + PH_SELECTED , + PH_COMMAND , + PH_DATA , + PH_STATUS , + PH_MSG_IN , + PH_MSG_OUT , + PH_DISCONNECT , + PH_RESELECT , + PH_ABORT , + PH_RESET }; enum _data_in_out { @@ -313,11 +334,19 @@ IO_OUT }; +enum _burst_mode { + BURST_IO8 = 0, + BURST_IO32, + BURST_MEM32 +}; + /* SCSI messaage */ #define MSG_COMMAND_COMPLETE 0x00 #define MSG_EXTENDED 0x01 +#define MSG_ABORT 0x06 #define MSG_NO_OPERATION 0x08 +#define MSG_BUS_DEVICE_RESET 0x0c #define MSG_EXT_SDTR 0x01 diff -Nru a/drivers/scsi/pcmcia/nsp_debug.c b/drivers/scsi/pcmcia/nsp_debug.c --- a/drivers/scsi/pcmcia/nsp_debug.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/pcmcia/nsp_debug.c Mon Oct 28 16:32:36 2002 @@ -6,7 +6,7 @@ the GNU General Public License. =========================================================================*/ -/* $Id: nsp_debug.c,v 1.8 2001/09/07 04:32:28 elca Exp $ */ +/* $Id: nsp_debug.c,v 1.2 2002/09/20 04:06:58 gotom Exp $ */ /* * Show the command data of a command @@ -87,14 +87,21 @@ static void print_commandk (unsigned char *command) { - int i,s; + int i, s; printk(KERN_DEBUG); print_opcodek(command[0]); /*printk(KERN_DEBUG __FUNCTION__ " ");*/ - for ( i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i) { + if ((command[0] >> 5) == 6 || + (command[0] >> 5) == 7 ) { + s = 12; /* vender specific */ + } else { + s = COMMAND_SIZE(command[0]); + } + for ( i = 1; i < s; ++i) { printk("%02x ", command[i]); } - switch (COMMAND_SIZE(command[0])) { + + switch (s) { case 6: printk("LBA=%d len=%d", (((unsigned int)command[1] & 0x0f) << 16) | diff -Nru a/drivers/scsi/pcmcia/nsp_io.h b/drivers/scsi/pcmcia/nsp_io.h --- a/drivers/scsi/pcmcia/nsp_io.h Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/pcmcia/nsp_io.h Mon Oct 28 16:32:37 2002 @@ -7,7 +7,7 @@ */ -/* $Id: nsp_io.h,v 1.9 2001/09/07 04:32:42 elca Exp $ */ +/* $Id: nsp_io.h,v 1.2 2002/09/20 04:06:58 gotom Exp $ */ #ifndef __NSP_IO_H__ #define __NSP_IO_H__ @@ -76,7 +76,7 @@ void *buf, unsigned long count) { - //DEBUG(0, __FUNCTION__ "() buf=0x%p, count=0x%lx\n", buf, count); + /*DEBUG(0, __FUNCTION__ "() buf=0x%p, count=0x%lx\n", buf, count);*/ nsp_multi_read_1(base, FIFODATA, buf, count); } @@ -171,6 +171,104 @@ { nsp_multi_write_4(base, FIFODATA, buf, count); } + + +/*====================================================================*/ + +static inline void nsp_mmio_write(unsigned long base, + unsigned int index, + unsigned char val) +{ + unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index); + + writeb(val, ptr); +} + +static inline unsigned char nsp_mmio_read(unsigned long base, + unsigned int index) +{ + unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index); + + return readb(ptr); +} + +/*-----------*/ + +static inline unsigned char nsp_mmio_index_read(unsigned long base, + unsigned int reg) +{ + unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG); + unsigned char *data_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG); + + writeb((unsigned char)reg, index_ptr); + return readb(data_ptr); +} + +static inline void nsp_mmio_index_write(unsigned long base, + unsigned int reg, + unsigned char val) +{ + unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG); + unsigned char *data_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG); + + writeb((unsigned char)reg, index_ptr); + writeb(val, data_ptr); +} + +/* read 32bit FIFO */ +static inline void nsp_mmio_multi_read_4(unsigned long base, + unsigned int Register, + void *buf, + unsigned long count) +{ + unsigned long *ptr = (unsigned long *)(base + Register); + unsigned long *tmp = (unsigned long *)buf; + int i; + + //printk("base 0x%0lx ptr 0x%p\n",base,ptr); + + for (i = 0; i < count; i++) { + *tmp = readl(ptr); + //printk("<%d,%p,%p,%lx>", i, ptr, tmp, *tmp); + tmp++; + } +} + +static inline void nsp_mmio_fifo32_read(unsigned int base, + void *buf, + unsigned long count) +{ + //DEBUG(0, __FUNCTION__ "() buf=0x%p, count=0x%lx*4\n", buf, count); + nsp_mmio_multi_read_4(base, FIFODATA, buf, count); +} + +static inline void nsp_mmio_multi_write_4(unsigned long base, + unsigned int Register, + void *buf, + unsigned long count) +{ + unsigned long *ptr = (unsigned long *)(base + Register); + unsigned long *tmp = (unsigned long *)buf; + int i; + + //printk("base 0x%0lx ptr 0x%p\n",base,ptr); + + for (i = 0; i < count; i++) { + writel(*tmp, ptr); + //printk("<%d,%p,%p,%lx>", i, ptr, tmp, *tmp); + tmp++; + } +} + +static inline void nsp_mmio_fifo32_write(unsigned int base, + void *buf, + unsigned long count) +{ + //DEBUG(0, __FUNCTION__ "() buf=0x%p, count=0x%lx*4\n", buf, count); + nsp_mmio_multi_write_4(base, FIFODATA, buf, count); +} + + #endif /* end */ diff -Nru a/drivers/scsi/pcmcia/nsp_message.c b/drivers/scsi/pcmcia/nsp_message.c --- a/drivers/scsi/pcmcia/nsp_message.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/pcmcia/nsp_message.c Mon Oct 28 16:32:36 2002 @@ -6,7 +6,7 @@ the GNU General Public License. */ -/* $Id: nsp_message.c,v 1.7 2001/09/07 04:33:01 elca Exp $ */ +/* $Id: nsp_message.c,v 1.2 2002/09/20 04:06:58 gotom Exp $ */ static void nsp_message_in(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { @@ -64,7 +64,7 @@ DEBUG(0, " msgout loop\n"); do { if (nsp_xfer(SCpnt, data, BUSPHASE_MESSAGE_OUT)) { - printk(KERN_DEBUG " " __FUNCTION__ " msgout: xfer short\n"); + printk(KERN_DEBUG " %s msgout: xfer short\n", __FUNCTION__); } /* catch a next signal */ diff -Nru a/drivers/scsi/ppa.c b/drivers/scsi/ppa.c --- a/drivers/scsi/ppa.c Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/ppa.c Mon Oct 28 16:32:37 2002 @@ -201,6 +201,8 @@ default: /* Never gets here */ continue; } + + INIT_WORK(&ppa_hosts[i].ppa_tq, ppa_interrupt, &ppa_hosts[i]); host->can_queue = PPA_CAN_QUEUE; host->sg_tablesize = ppa_sg; diff -Nru a/drivers/scsi/qla1280.h b/drivers/scsi/qla1280.h --- a/drivers/scsi/qla1280.h Mon Oct 28 16:32:38 2002 +++ b/drivers/scsi/qla1280.h Mon Oct 28 16:32:38 2002 @@ -1324,22 +1324,12 @@ */ #define QLA1280_LINUX_TEMPLATE { \ - next: NULL, \ - module: NULL, \ - proc_dir: NULL, \ proc_info: qla1280_proc_info, \ name: "Qlogic ISP 1280/12160", \ detect: qla1280_detect, \ release: qla1280_release, \ info: qla1280_info, \ - ioctl: NULL, \ - command: NULL, \ queuecommand: qla1280_queuecommand, \ - eh_strategy_handler: NULL, \ - eh_abort_handler: NULL, \ - eh_device_reset_handler: NULL, \ - eh_bus_reset_handler: NULL, \ - eh_host_reset_handler: NULL, \ /* use_new_eh_code: 0, */ \ abort: qla1280_abort, \ reset: qla1280_reset, \ diff -Nru a/drivers/scsi/qlogicfas.c b/drivers/scsi/qlogicfas.c --- a/drivers/scsi/qlogicfas.c Mon Oct 28 16:32:38 2002 +++ b/drivers/scsi/qlogicfas.c Mon Oct 28 16:32:38 2002 @@ -22,9 +22,22 @@ Functions as standalone, loadable, and PCMCIA driver, the latter from Dave Hinds' PCMCIA package. + + Cleaned up 26/10/2002 by Alan Cox as part of the 2.5 + SCSI driver cleanup and audit. This driver still needs work on the + following + - Non terminating hardware waits + - Support multiple cards at a time + - Some layering violations with its pcmcia stub Redistributable under terms of the GNU General Public License + For the avoidance of doubt the "preferred form" of this code is one which + is in an open non patent encumbered format. Where cryptographic key signing + forms part of the process of creating an executable the information + including keys needed to generate an equivalently functional executable + are deemed to be part of the source code. + */ /*----------------------------------------------------------------*/ /* Configuration */ @@ -32,17 +45,21 @@ /* Set the following to 2 to use normal interrupt (active high/totempole- tristate), otherwise use 0 (REQUIRED FOR PCMCIA) for active low, open drain */ + #define QL_INT_ACTIVE_HIGH 2 /* Set the following to 1 to enable the use of interrupts. Note that 0 tends to be more stable, but slower (or ties up the system more) */ + #define QL_USE_IRQ 1 /* Set the following to max out the speed of the PIO PseudoDMA transfers, again, 0 tends to be slower, but more stable. */ + #define QL_TURBO_PDMA 1 /* This should be 1 to enable parity detection */ + #define QL_ENABLE_PARITY 1 /* This will reset all devices when the driver is initialized (during bootup). @@ -51,11 +68,13 @@ without requiring a cold boot. It does take some time to recover from a reset, so it is slower, and I have seen timeouts so that devices weren't recognized when this was set. */ + #define QL_RESET_AT_START 0 /* crystal frequency in megahertz (for offset 5 and 9) Please set this for your card. Most Qlogic cards are 40 Mhz. The Control Concepts ISA (not VLB) is 24 Mhz */ + #define XTALFREQ 40 /**********/ @@ -79,16 +98,14 @@ #define FASTSCSI 0 /* This when set to 1 will set a faster sync transfer rate */ -#define FASTCLK 0 -/*(XTALFREQ>25?1:0)*/ +#define FASTCLK 0 /*(XTALFREQ>25?1:0)*/ /*****/ /* offset 6 */ /* This is the sync transfer divisor, XTALFREQ/X will be the maximum achievable data rate (assuming the rest of the system is capable and set properly) */ -#define SYNCXFRPD 5 -/*(XTALFREQ/5)*/ +#define SYNCXFRPD 5 /*(XTALFREQ/5)*/ /*****/ /* offset 7 */ @@ -107,15 +124,15 @@ #ifdef PCMCIA #undef QL_INT_ACTIVE_HIGH #define QL_INT_ACTIVE_HIGH 0 -#endif +#endif #include #ifdef PCMCIA #undef MODULE -#endif +#endif -#include /* to get disk capacity */ +#include /* to get disk capacity */ #include #include #include @@ -133,19 +150,19 @@ /*----------------------------------------------------------------*/ /* driver state info, local to driver */ -static int qbase; /* Port */ -static int qinitid; /* initiator ID */ -static int qabort; /* Flag to cause an abort */ -static int qlirq = -1; /* IRQ being used */ -static char qinfo[80]; /* description */ -static Scsi_Cmnd *qlcmd; /* current command being processed */ - -static int qlcfg5 = ( XTALFREQ << 5 ); /* 15625/512 */ -static int qlcfg6 = SYNCXFRPD; -static int qlcfg7 = SYNCOFFST; -static int qlcfg8 = ( SLOWCABLE << 7 ) | ( QL_ENABLE_PARITY << 4 ); -static int qlcfg9 = ( ( XTALFREQ + 4 ) / 5 ); -static int qlcfgc = ( FASTCLK << 3 ) | ( FASTSCSI << 4 ); +static int qbase; /* Port */ +static int qinitid; /* initiator ID */ +static int qabort; /* Flag to cause an abort */ +static int qlirq = -1; /* IRQ being used */ +static char qinfo[80]; /* description */ +static Scsi_Cmnd *qlcmd; /* current command being processed */ + +static int qlcfg5 = (XTALFREQ << 5); /* 15625/512 */ +static int qlcfg6 = SYNCXFRPD; +static int qlcfg7 = SYNCOFFST; +static int qlcfg8 = (SLOWCABLE << 7) | (QL_ENABLE_PARITY << 4); +static int qlcfg9 = ((XTALFREQ + 4) / 5); +static int qlcfgc = (FASTCLK << 3) | (FASTSCSI << 4); /*----------------------------------------------------------------*/ /* The qlogic card uses two register maps - These macros select which one */ @@ -168,107 +185,112 @@ /*----------------------------------------------------------------*/ /* local functions */ /*----------------------------------------------------------------*/ -static void ql_zap(void); + /* error recovery - reset everything */ -void ql_zap() + +static void ql_zap(void) { -int x; -unsigned long flags; - save_flags( flags ); - cli(); + int x; + x = inb(qbase + 0xd); REG0; - outb(3, qbase + 3); /* reset SCSI */ - outb(2, qbase + 3); /* reset chip */ + outb(3, qbase + 3); /* reset SCSI */ + outb(2, qbase + 3); /* reset chip */ if (x & 0x80) REG1; - restore_flags( flags ); } -/*----------------------------------------------------------------*/ -/* do pseudo-dma */ -static int ql_pdma(int phase, char *request, int reqlen) +/* + * Do a pseudo-dma tranfer + */ + +static int ql_pdma(int phase, char *request, int reqlen) { -int j; + int j; j = 0; if (phase & 1) { /* in */ #if QL_TURBO_PDMA -rtrc(4) + rtrc(4) /* empty fifo in large chunks */ - if( reqlen >= 128 && (inb( qbase + 8 ) & 2) ) { /* full */ - insl( qbase + 4, request, 32 ); + if (reqlen >= 128 && (inb(qbase + 8) & 2)) { /* full */ + insl(qbase + 4, request, 32); reqlen -= 128; request += 128; } - while( reqlen >= 84 && !( j & 0xc0 ) ) /* 2/3 */ - if( (j=inb( qbase + 8 )) & 4 ) { - insl( qbase + 4, request, 21 ); + while (reqlen >= 84 && !(j & 0xc0)) /* 2/3 */ + if ((j = inb(qbase + 8)) & 4) + { + insl(qbase + 4, request, 21); reqlen -= 84; request += 84; } - if( reqlen >= 44 && (inb( qbase + 8 ) & 8) ) { /* 1/3 */ - insl( qbase + 4, request, 11 ); + if (reqlen >= 44 && (inb(qbase + 8) & 8)) { /* 1/3 */ + insl(qbase + 4, request, 11); reqlen -= 44; request += 44; } #endif /* until both empty and int (or until reclen is 0) */ -rtrc(7) + rtrc(7) j = 0; - while( reqlen && !( (j & 0x10) && (j & 0xc0) ) ) { + while (reqlen && !((j & 0x10) && (j & 0xc0))) + { /* while bytes to receive and not empty */ j &= 0xc0; - while ( reqlen && !( (j=inb(qbase + 8)) & 0x10 ) ) { + while (reqlen && !((j = inb(qbase + 8)) & 0x10)) + { *request++ = inb(qbase + 4); reqlen--; } - if( j & 0x10 ) - j = inb(qbase+8); + if (j & 0x10) + j = inb(qbase + 8); } - } - else { /* out */ + } else { /* out */ #if QL_TURBO_PDMA -rtrc(4) - if( reqlen >= 128 && inb( qbase + 8 ) & 0x10 ) { /* empty */ - outsl(qbase + 4, request, 32 ); + rtrc(4) + if (reqlen >= 128 && inb(qbase + 8) & 0x10) { /* empty */ + outsl(qbase + 4, request, 32); reqlen -= 128; request += 128; } - while( reqlen >= 84 && !( j & 0xc0 ) ) /* 1/3 */ - if( !((j=inb( qbase + 8 )) & 8) ) { - outsl( qbase + 4, request, 21 ); + while (reqlen >= 84 && !(j & 0xc0)) /* 1/3 */ + if (!((j = inb(qbase + 8)) & 8)) { + outsl(qbase + 4, request, 21); reqlen -= 84; request += 84; } - if( reqlen >= 40 && !(inb( qbase + 8 ) & 4 ) ) { /* 2/3 */ - outsl( qbase + 4, request, 10 ); + if (reqlen >= 40 && !(inb(qbase + 8) & 4)) { /* 2/3 */ + outsl(qbase + 4, request, 10); reqlen -= 40; request += 40; } #endif /* until full and int (or until reclen is 0) */ -rtrc(7) - j = 0; - while( reqlen && !( (j & 2) && (j & 0xc0) ) ) { + rtrc(7) + j = 0; + while (reqlen && !((j & 2) && (j & 0xc0))) { /* while bytes to send and not full */ - while ( reqlen && !( (j=inb(qbase + 8)) & 2 ) ) { + while (reqlen && !((j = inb(qbase + 8)) & 2)) + { outb(*request++, qbase + 4); reqlen--; } - if( j & 2 ) - j = inb(qbase+8); + if (j & 2) + j = inb(qbase + 8); } } -/* maybe return reqlen */ - return inb( qbase + 8 ) & 0xc0; + /* maybe return reqlen */ + return inb(qbase + 8) & 0xc0; } -/*----------------------------------------------------------------*/ -/* wait for interrupt flag (polled - not real hardware interrupt) */ -static int ql_wai(void) +/* + * Wait for interrupt flag (polled - not real hardware interrupt) + */ + +static int ql_wai(void) { -int i,k; + int i, k; k = 0; i = jiffies + WATCHDOG; while (time_before(jiffies, i) && !qabort && !((k = inb(qbase + 4)) & 0xe0)) { @@ -288,65 +310,68 @@ return 0; } -/*----------------------------------------------------------------*/ -/* initiate scsi command - queueing handler */ -static void ql_icmd(Scsi_Cmnd * cmd) +/* + * Initiate scsi command - queueing handler + * caller must hold host lock + */ + +static void ql_icmd(Scsi_Cmnd * cmd) { -unsigned int i; -unsigned long flags; + unsigned int i; qabort = 0; - save_flags( flags ); - cli(); REG0; -/* clearing of interrupts and the fifo is needed */ - inb(qbase + 5); /* clear interrupts */ - if (inb(qbase + 5)) /* if still interrupting */ - outb(2, qbase + 3); /* reset chip */ + /* clearing of interrupts and the fifo is needed */ + + inb(qbase + 5); /* clear interrupts */ + if (inb(qbase + 5)) /* if still interrupting */ + outb(2, qbase + 3); /* reset chip */ else if (inb(qbase + 7) & 0x1f) - outb(1, qbase + 3); /* clear fifo */ - while (inb(qbase + 5)); /* clear ints */ + outb(1, qbase + 3); /* clear fifo */ + while (inb(qbase + 5)); /* clear ints */ REG1; - outb(1, qbase + 8); /* set for PIO pseudo DMA */ - outb(0, qbase + 0xb); /* disable ints */ - inb(qbase + 8); /* clear int bits */ + outb(1, qbase + 8); /* set for PIO pseudo DMA */ + outb(0, qbase + 0xb); /* disable ints */ + inb(qbase + 8); /* clear int bits */ REG0; - outb(0x40, qbase + 0xb); /* enable features */ + outb(0x40, qbase + 0xb); /* enable features */ -/* configurables */ - outb( qlcfgc , qbase + 0xc); -/* config: no reset interrupt, (initiator) bus id */ - outb( 0x40 | qlcfg8 | qinitid, qbase + 8); - outb( qlcfg7 , qbase + 7 ); - outb( qlcfg6 , qbase + 6 ); -/**/ - outb(qlcfg5, qbase + 5); /* select timer */ - outb(qlcfg9 & 7, qbase + 9); /* prescaler */ + /* configurables */ + outb(qlcfgc, qbase + 0xc); + /* config: no reset interrupt, (initiator) bus id */ + outb(0x40 | qlcfg8 | qinitid, qbase + 8); + outb(qlcfg7, qbase + 7); + outb(qlcfg6, qbase + 6); + /**/ outb(qlcfg5, qbase + 5); /* select timer */ + outb(qlcfg9 & 7, qbase + 9); /* prescaler */ /* outb(0x99, qbase + 5); */ outb(cmd->target, qbase + 4); for (i = 0; i < cmd->cmd_len; i++) outb(cmd->cmnd[i], qbase + 2); + qlcmd = cmd; outb(0x41, qbase + 3); /* select and send command */ - restore_flags( flags ); } -/*----------------------------------------------------------------*/ -/* process scsi command - usually after interrupt */ -static unsigned int ql_pcmd(Scsi_Cmnd * cmd) -{ -unsigned int i, j, k; -unsigned int result; /* ultimate return result */ -unsigned int status; /* scsi returned status */ -unsigned int message; /* scsi returned message */ -unsigned int phase; /* recorded scsi phase */ -unsigned int reqlen; /* total length of transfer */ -struct scatterlist *sglist; /* scatter-gather list pointer */ -unsigned int sgcount; /* sg counter */ -char *buf; -rtrc(1) +/* + * Process scsi command - usually after interrupt + */ + +static unsigned int ql_pcmd(Scsi_Cmnd * cmd) +{ + unsigned int i, j, k; + unsigned int result; /* ultimate return result */ + unsigned int status; /* scsi returned status */ + unsigned int message; /* scsi returned message */ + unsigned int phase; /* recorded scsi phase */ + unsigned int reqlen; /* total length of transfer */ + struct scatterlist *sglist; /* scatter-gather list pointer */ + unsigned int sgcount; /* sg counter */ + char *buf; + + rtrc(1) j = inb(qbase + 6); i = inb(qbase + 5); if (i == 0x20) { @@ -354,36 +379,40 @@ } i |= inb(qbase + 5); /* the 0x10 bit can be set after the 0x08 */ if (i != 0x18) { - printk("Ql:Bad Interrupt status:%02x\n", i); + printk(KERN_ERR "Ql:Bad Interrupt status:%02x\n", i); ql_zap(); return (DID_BAD_INTR << 16); } - j &= 7; /* j = inb( qbase + 7 ) >> 5; */ -/* correct status is supposed to be step 4 */ -/* it sometimes returns step 3 but with 0 bytes left to send */ -/* We can try stuffing the FIFO with the max each time, but we will get a - sequence of 3 if any bytes are left (but we do flush the FIFO anyway */ - if(j != 3 && j != 4) { - printk("Ql:Bad sequence for command %d, int %02X, cmdleft = %d\n", j, i, inb( qbase+7 ) & 0x1f ); + j &= 7; /* j = inb( qbase + 7 ) >> 5; */ + + /* correct status is supposed to be step 4 */ + /* it sometimes returns step 3 but with 0 bytes left to send */ + /* We can try stuffing the FIFO with the max each time, but we will get a + sequence of 3 if any bytes are left (but we do flush the FIFO anyway */ + + if (j != 3 && j != 4) { + printk(KERN_ERR "Ql:Bad sequence for command %d, int %02X, cmdleft = %d\n", + j, i, inb(qbase + 7) & 0x1f); ql_zap(); return (DID_ERROR << 16); } result = DID_OK; if (inb(qbase + 7) & 0x1f) /* if some bytes in fifo */ - outb(1, qbase + 3); /* clear fifo */ -/* note that request_bufflen is the total xfer size when sg is used */ + outb(1, qbase + 3); /* clear fifo */ + /* note that request_bufflen is the total xfer size when sg is used */ reqlen = cmd->request_bufflen; -/* note that it won't work if transfers > 16M are requested */ + /* note that it won't work if transfers > 16M are requested */ if (reqlen && !((phase = inb(qbase + 4)) & 6)) { /* data phase */ -rtrc(2) - outb(reqlen, qbase); /* low-mid xfer cnt */ - outb(reqlen >> 8, qbase+1); /* low-mid xfer cnt */ + rtrc(2) + outb(reqlen, qbase); /* low-mid xfer cnt */ + outb(reqlen >> 8, qbase + 1); /* low-mid xfer cnt */ outb(reqlen >> 16, qbase + 0xe); /* high xfer cnt */ - outb(0x90, qbase + 3); /* command do xfer */ -/* PIO pseudo DMA to buffer or sglist */ + outb(0x90, qbase + 3); /* command do xfer */ + /* PIO pseudo DMA to buffer or sglist */ REG1; if (!cmd->use_sg) - ql_pdma(phase, cmd->request_buffer, cmd->request_bufflen); + ql_pdma(phase, cmd->request_buffer, + cmd->request_bufflen); else { sgcount = cmd->use_sg; sglist = cmd->request_buffer; @@ -399,74 +428,107 @@ } } REG0; -rtrc(2) -/* wait for irq (split into second state of irq handler if this can take time) */ + rtrc(2) + /* + * Wait for irq (split into second state of irq handler + * if this can take time) + */ if ((k = ql_wai())) return (k << 16); k = inb(qbase + 5); /* should be 0x10, bus service */ } -/*** Enter Status (and Message In) Phase ***/ + + /* + * Enter Status (and Message In) Phase + */ + k = jiffies + WATCHDOG; - while ( time_before(jiffies, k) && !qabort && !(inb(qbase + 4) & 6)); /* wait for status phase */ - if ( time_after_eq(jiffies, k) ) { + + while (time_before(jiffies, k) && !qabort && !(inb(qbase + 4) & 6)) + cpu_relax(); /* wait for status phase */ + + if (time_after_eq(jiffies, k)) { ql_zap(); return (DID_TIME_OUT << 16); } - while (inb(qbase + 5)); /* clear pending ints */ + + /* FIXME: timeout ?? */ + while (inb(qbase + 5)) + cpu_relax(); /* clear pending ints */ + if (qabort) return ((qabort == 1 ? DID_ABORT : DID_RESET) << 16); - outb(0x11, qbase + 3); /* get status and message */ + + outb(0x11, qbase + 3); /* get status and message */ if ((k = ql_wai())) return (k << 16); - i = inb(qbase + 5); /* get chip irq stat */ - j = inb(qbase + 7) & 0x1f; /* and bytes rec'd */ + i = inb(qbase + 5); /* get chip irq stat */ + j = inb(qbase + 7) & 0x1f; /* and bytes rec'd */ status = inb(qbase + 2); message = inb(qbase + 2); -/* should get function complete int if Status and message, else bus serv if only status */ + + /* + * Should get function complete int if Status and message, else + * bus serv if only status + */ if (!((i == 8 && j == 2) || (i == 0x10 && j == 1))) { - printk("Ql:Error during status phase, int=%02X, %d bytes recd\n", i, j); + printk(KERN_ERR "Ql:Error during status phase, int=%02X, %d bytes recd\n", i, j); result = DID_ERROR; } outb(0x12, qbase + 3); /* done, disconnect */ -rtrc(1) + rtrc(1) if ((k = ql_wai())) return (k << 16); -/* should get bus service interrupt and disconnect interrupt */ + + /* + * Should get bus service interrupt and disconnect interrupt + */ + i = inb(qbase + 5); /* should be bus service */ while (!qabort && ((i & 0x20) != 0x20)) { barrier(); cpu_relax(); i |= inb(qbase + 5); } -rtrc(0) + rtrc(0) + if (qabort) return ((qabort == 1 ? DID_ABORT : DID_RESET) << 16); + return (result << 16) | (message << 8) | (status & STATUS_MASK); } #if QL_USE_IRQ -/*----------------------------------------------------------------*/ -/* interrupt handler */ -static void ql_ihandl(int irq, void *dev_id, struct pt_regs * regs) + +/* + * Interrupt handler + */ + +static void ql_ihandl(int irq, void *dev_id, struct pt_regs *regs) { -Scsi_Cmnd *icmd; + Scsi_Cmnd *icmd; REG0; + if (!(inb(qbase + 4) & 0x80)) /* false alarm? */ return; - if (qlcmd == NULL) { /* no command to process? */ - int i; + + if (qlcmd == NULL) { /* no command to process? */ + int i; i = 16; - while (i-- && inb(qbase + 5)); /* maybe also ql_zap() */ + while (i-- && inb(qbase + 5)); /* maybe also ql_zap() */ return; } icmd = qlcmd; icmd->result = ql_pcmd(icmd); qlcmd = NULL; -/* if result is CHECK CONDITION done calls qcommand to request sense */ + /* + * If result is CHECK CONDITION done calls qcommand to request + * sense + */ (icmd->scsi_done) (icmd); } -static void do_ql_ihandl(int irq, void *dev_id, struct pt_regs * regs) +static void do_ql_ihandl(int irq, void *dev_id, struct pt_regs *regs) { unsigned long flags; struct Scsi_Host *host = dev_id; @@ -475,28 +537,40 @@ ql_ihandl(irq, dev_id, regs); spin_unlock_irqrestore(host->host_lock, flags); } + #endif -/*----------------------------------------------------------------*/ -/* global functions */ -/*----------------------------------------------------------------*/ -/* non queued command */ #if QL_USE_IRQ -static void qlidone(Scsi_Cmnd * cmd) {}; /* null function */ + +static void qlidone(Scsi_Cmnd * cmd) +{ +} /* null function */ + #endif -/* command process */ -int qlogicfas_command(Scsi_Cmnd * cmd) +/* + * Synchronous command processing + */ + +static int qlogicfas_command(Scsi_Cmnd * cmd) { -int k; + int k; #if QL_USE_IRQ if (qlirq >= 0) { qlogicfas_queuecommand(cmd, qlidone); - while (qlcmd != NULL); + while (qlcmd != NULL) + { + cpu_relax(); + barrier(); + } return cmd->result; } #endif -/* non-irq version */ + + /* + * Non-irq version + */ + if (cmd->target == qinitid) return (DID_BAD_TARGET << 16); ql_icmd(cmd); @@ -507,18 +581,21 @@ } #if QL_USE_IRQ -/*----------------------------------------------------------------*/ -/* queued command */ -int qlogicfas_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) + +/* + * Queued command + */ + +int qlogicfas_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) { - if(cmd->target == qinitid) { + if (cmd->target == qinitid) { cmd->result = DID_BAD_TARGET << 16; done(cmd); return 0; } cmd->scsi_done = done; -/* wait for the last command's interrupt to finish */ + /* wait for the last command's interrupt to finish */ while (qlcmd != NULL) { barrier(); cpu_relax(); @@ -527,121 +604,129 @@ return 0; } #else -int qlogicfas_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) +int qlogicfas_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) { return 1; } #endif #ifdef PCMCIA -/*----------------------------------------------------------------*/ -/* allow PCMCIA code to preset the port */ -/* port should be 0 and irq to -1 respectively for autoprobing */ -void qlogicfas_preset(int port, int irq) + +/* + * Allow PCMCIA code to preset the port */ + * port should be 0 and irq to -1 respectively for autoprobing + */ + +void qlogicfas_preset(int port, int irq) { - qbase=port; - qlirq=irq; + qbase = port; + qlirq = irq; } + #endif -/*----------------------------------------------------------------*/ -/* look for qlogic card and init if found */ -int __QLINIT qlogicfas_detect(Scsi_Host_Template * host) +/* + * Look for qlogic card and init if found + */ + +int __devinit qlogicfas_detect(Scsi_Host_Template * host) { -int i, j; /* these are only used by IRQ detect */ -int qltyp; /* type of chip */ -struct Scsi_Host *hreg; /* registered host structure */ -unsigned long flags; - -host->proc_name = "qlogicfas"; - -/* Qlogic Cards only exist at 0x230 or 0x330 (the chip itself decodes the - address - I check 230 first since MIDI cards are typically at 330 - - Theoretically, two Qlogic cards can coexist in the same system. This - should work by simply using this as a loadable module for the second - card, but I haven't tested this. -*/ + int i, j; /* these are only used by IRQ detect */ + int qltyp; /* type of chip */ + struct Scsi_Host *hreg; /* registered host structure */ + + host->proc_name = "qlogicfas"; - if( !qbase ) { + /* Qlogic Cards only exist at 0x230 or 0x330 (the chip itself + * decodes the address - I check 230 first since MIDI cards are + * typically at 0x330 + * + * Theoretically, two Qlogic cards can coexist in the same system. + * This should work by simply using this as a loadable module for + * the second card, but I haven't tested this. + */ + + if (!qbase) { for (qbase = 0x230; qbase < 0x430; qbase += 0x100) { - if( !request_region( qbase , 0x10, "qlogicfas" ) ) + if (!request_region(qbase, 0x10, "qlogicfas")) continue; REG1; - if ( ( (inb(qbase + 0xe) ^ inb(qbase + 0xe)) == 7 ) - && ( (inb(qbase + 0xe) ^ inb(qbase + 0xe)) == 7 ) ) + if (((inb(qbase + 0xe) ^ inb(qbase + 0xe)) == 7) + && ((inb(qbase + 0xe) ^ inb(qbase + 0xe)) == 7)) break; - release_region(qbase, 0x10 ); + release_region(qbase, 0x10); } if (qbase == 0x430) return 0; - } - else - printk( "Ql: Using preset base address of %03x\n", qbase ); + } else + printk(KERN_INFO "Ql: Using preset base address of %03x\n", qbase); qltyp = inb(qbase + 0xe) & 0xf8; qinitid = host->this_id; if (qinitid < 0) - qinitid = 7; /* if no ID, use 7 */ - outb(1, qbase + 8); /* set for PIO pseudo DMA */ + qinitid = 7; /* if no ID, use 7 */ + outb(1, qbase + 8); /* set for PIO pseudo DMA */ REG0; outb(0x40 | qlcfg8 | qinitid, qbase + 8); /* (ini) bus id, disable scsi rst */ - outb(qlcfg5, qbase + 5); /* select timer */ - outb(qlcfg9, qbase + 9); /* prescaler */ + outb(qlcfg5, qbase + 5); /* select timer */ + outb(qlcfg9, qbase + 9); /* prescaler */ + #if QL_RESET_AT_START - outb( 3 , qbase + 3 ); + outb(3, qbase + 3); REG1; - while( inb( qbase + 0xf ) & 4 ); + /* FIXME: timeout */ + while (inb(qbase + 0xf) & 4) + cpu_relax(); REG0; #endif + #if QL_USE_IRQ -/* IRQ probe - toggle pin and check request pending */ + /* + * IRQ probe - toggle pin and check request pending + */ - if( qlirq == -1 ) { - save_flags( flags ); - cli(); + if (qlirq == -1) { i = 0xffff; j = 3; outb(0x90, qbase + 3); /* illegal command - cause interrupt */ REG1; - outb(10, 0x20); /* access pending interrupt map */ + outb(10, 0x20); /* access pending interrupt map */ outb(10, 0xa0); while (j--) { - outb(0xb0 | QL_INT_ACTIVE_HIGH , qbase + 0xd); /* int pin off */ - i &= ~(inb(0x20) | (inb(0xa0) << 8)); /* find IRQ off */ - outb(0xb4 | QL_INT_ACTIVE_HIGH , qbase + 0xd); /* int pin on */ - i &= inb(0x20) | (inb(0xa0) << 8); /* find IRQ on */ + outb(0xb0 | QL_INT_ACTIVE_HIGH, qbase + 0xd); /* int pin off */ + i &= ~(inb(0x20) | (inb(0xa0) << 8)); /* find IRQ off */ + outb(0xb4 | QL_INT_ACTIVE_HIGH, qbase + 0xd); /* int pin on */ + i &= inb(0x20) | (inb(0xa0) << 8); /* find IRQ on */ } REG0; - while (inb(qbase + 5)); /* purge int */ + while (inb(qbase + 5)); /* purge int */ j = -1; - while (i) /* find on bit */ + while (i) /* find on bit */ i >>= 1, j++; /* should check for exactly 1 on */ qlirq = j; - restore_flags( flags ); - } - else - printk( "Ql: Using preset IRQ %d\n", qlirq ); + } else + printk(KERN_INFO "Ql: Using preset IRQ %d\n", qlirq); if (qlirq >= 0 && !request_irq(qlirq, do_ql_ihandl, 0, "qlogicfas", NULL)) host->can_queue = 1; #endif - hreg = scsi_register( host , 0 ); /* no host data */ + hreg = scsi_register(host, 0); /* no host data */ if (!hreg) goto err_release_mem; hreg->io_port = qbase; hreg->n_io_port = 16; hreg->dma_channel = -1; - if( qlirq != -1 ) + if (qlirq != -1) hreg->irq = qlirq; - sprintf(qinfo, "Qlogicfas Driver version 0.46, chip %02X at %03X, IRQ %d, TPdma:%d", - qltyp, qbase, qlirq, QL_TURBO_PDMA ); + sprintf(qinfo, + "Qlogicfas Driver version 0.46, chip %02X at %03X, IRQ %d, TPdma:%d", + qltyp, qbase, qlirq, QL_TURBO_PDMA); host->name = qinfo; return 1; - err_release_mem: +err_release_mem: release_region(qbase, 0x10); if (host->can_queue) free_irq(qlirq, do_ql_ihandl); @@ -649,18 +734,20 @@ } -/*----------------------------------------------------------------*/ -/* return bios parameters */ -int qlogicfas_biosparam(Disk * disk, struct block_device *dev, int ip[]) +/* + * Return bios parameters + */ + +int qlogicfas_biosparam(Disk * disk, struct block_device *dev, int ip[]) { /* This should mimic the DOS Qlogic driver's behavior exactly */ ip[0] = 0x40; ip[1] = 0x20; - ip[2] = (unsigned long)disk->capacity / (ip[0] * ip[1]); + ip[2] = (unsigned long) disk->capacity / (ip[0] * ip[1]); if (ip[2] > 1024) { ip[0] = 0xff; ip[1] = 0x3f; - ip[2] = (unsigned long)disk->capacity / (ip[0] * ip[1]); + ip[2] = (unsigned long) disk->capacity / (ip[0] * ip[1]); #if 0 if (ip[2] > 1023) ip[2] = 1023; @@ -669,33 +756,67 @@ return 0; } -/*----------------------------------------------------------------*/ -/* abort command in progress */ -int qlogicfas_abort(Scsi_Cmnd * cmd) +/* + * Abort a command in progress + */ + +static int qlogicfas_abort(Scsi_Cmnd * cmd) { qabort = 1; ql_zap(); - return 0; + return SUCCESS; } -/*----------------------------------------------------------------*/ -/* reset SCSI bus */ -int qlogicfas_reset(Scsi_Cmnd * cmd, unsigned int ignored) +/* + * Reset SCSI bus + * FIXME: This function is invoked with cmd = NULL directly by + * the PCMCIA qlogic_stub code. This wants fixing + */ + +static int qlogicfas_bus_reset(Scsi_Cmnd * cmd) { qabort = 2; ql_zap(); - return 1; + return SUCCESS; } -/*----------------------------------------------------------------*/ -/* return info string */ -const char *qlogicfas_info(struct Scsi_Host * host) +/* + * Reset SCSI host controller + */ + +static int qlogicfas_host_reset(Scsi_Cmnd * cmd) +{ + return FAILED; +} + +/* + * Reset SCSI device + */ + +static int qlogicfas_device_reset(Scsi_Cmnd * cmd) +{ + return FAILED; +} + +/* + * Return info string + */ + +static const char *qlogicfas_info(struct Scsi_Host *host) { return qinfo; } + +MODULE_AUTHOR("Tom Zerucha, Michael Griffith"); +MODULE_DESCRIPTION("Driver for the Qlogic FAS SCSI controllers"); MODULE_LICENSE("GPL"); -/* Eventually this will go into an include file, but this will be later */ -static Scsi_Host_Template driver_template = QLOGICFAS; +/* + * The driver template is also needed for PCMCIA + */ + +Scsi_Host_Template qlogicfas_driver_template = QLOGICFAS; +#define driver_template qlogicfas_driver_template + #include "scsi_module.c" diff -Nru a/drivers/scsi/qlogicfas.h b/drivers/scsi/qlogicfas.h --- a/drivers/scsi/qlogicfas.h Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/qlogicfas.h Mon Oct 28 16:32:36 2002 @@ -1,37 +1,31 @@ #ifndef _QLOGICFAS_H #define _QLOGICFAS_H -int qlogicfas_detect(Scsi_Host_Template * ); -const char * qlogicfas_info(struct Scsi_Host *); -int qlogicfas_command(Scsi_Cmnd *); -int qlogicfas_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); -int qlogicfas_abort(Scsi_Cmnd *); -int qlogicfas_reset(Scsi_Cmnd *, unsigned int); -int qlogicfas_biosparam(Disk *, struct block_device *, int[]); +static int qlogicfas_detect(Scsi_Host_Template * ); +static const char * qlogicfas_info(struct Scsi_Host *); +static int qlogicfas_command(Scsi_Cmnd *); +static int qlogicfas_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); +static int qlogicfas_abort(Scsi_Cmnd *); +static int qlogicfas_bus_reset(Scsi_Cmnd *); +static int qlogicfas_device_reset(Scsi_Cmnd *); +static int qlogicfas_host_reset(Scsi_Cmnd *); +static int qlogicfas_biosparam(Disk *, struct block_device *, int[]); -#ifndef NULL -#define NULL (0) -#endif - -#ifdef PCMCIA -#define __QLINIT __devinit -#else -#define __QLINIT __init -#endif - -#define QLOGICFAS { \ - detect: qlogicfas_detect, \ - info: qlogicfas_info, \ - command: qlogicfas_command, \ - queuecommand: qlogicfas_queuecommand, \ - abort: qlogicfas_abort, \ - reset: qlogicfas_reset, \ - bios_param: qlogicfas_biosparam, \ - can_queue: 0, \ - this_id: -1, \ - sg_tablesize: SG_ALL, \ - cmd_per_lun: 1, \ - use_clustering: DISABLE_CLUSTERING \ +#define QLOGICFAS { \ + detect: qlogicfas_detect, \ + info: qlogicfas_info, \ + command: qlogicfas_command, \ + queuecommand: qlogicfas_queuecommand, \ + eh_abort_handler: qlogicfas_abort, \ + eh_bus_reset_handler: qlogicfas_bus_reset, \ + eh_device_reset_handler: qlogicfas_device_reset, \ + eh_host_reset_handler: qlogicfas_host_reset, \ + bios_param: qlogicfas_biosparam, \ + can_queue: 0, \ + this_id: -1, \ + sg_tablesize: SG_ALL, \ + cmd_per_lun: 1, \ + use_clustering: DISABLE_CLUSTERING \ } #endif /* _QLOGICFAS_H */ diff -Nru a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c --- a/drivers/scsi/scsi_lib.c Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/scsi_lib.c Mon Oct 28 16:32:37 2002 @@ -240,7 +240,7 @@ SCpnt->request->special = (void *) SCpnt; if(blk_rq_tagged(SCpnt->request)) blk_queue_end_tag(q, SCpnt->request); - _elv_add_request(q, SCpnt->request, 0, 0); + __elv_add_request(q, SCpnt->request, 0, 0); } /* @@ -514,6 +514,12 @@ } } + if (blk_pc_request(req)) { + req->errors = result & 0xff; + if (!result) + req->data_len -= SCpnt->bufflen; + } + /* * Zero these out. They now point to freed memory, and it is * dangerous to hang onto the pointers. @@ -527,7 +533,7 @@ * Next deal with any sectors which we were able to correctly * handle. */ - if (good_sectors > 0) { + if (good_sectors >= 0) { SCSI_LOG_HLCOMPLETE(1, printk("%ld sectors total, %d sectors done.\n", req->nr_sectors, good_sectors)); SCSI_LOG_HLCOMPLETE(1, printk("use_sg is %d\n ", SCpnt->use_sg)); @@ -951,7 +957,7 @@ SCpnt->request->flags |= REQ_SPECIAL; if(blk_rq_tagged(SCpnt->request)) blk_queue_end_tag(q, SCpnt->request); - _elv_add_request(q, SCpnt->request, 0, 0); + __elv_add_request(q, SCpnt->request, 0, 0); break; } diff -Nru a/drivers/scsi/scsi_merge.c b/drivers/scsi/scsi_merge.c --- a/drivers/scsi/scsi_merge.c Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/scsi_merge.c Mon Oct 28 16:32:37 2002 @@ -62,15 +62,9 @@ int count, gfp_mask; /* - * non-sg block request. FIXME: check bouncing for isa hosts! + * if this is a rq->data based REQ_BLOCK_PC, setup for a non-sg xfer */ if ((req->flags & REQ_BLOCK_PC) && !req->bio) { - /* - * FIXME: isa bouncing - */ - if (SCpnt->host->unchecked_isa_dma) - goto fail; - SCpnt->request_bufflen = req->data_len; SCpnt->request_buffer = req->data; req->buffer = req->data; @@ -100,6 +94,8 @@ SCpnt->request_buffer = (char *) sgpnt; SCpnt->request_bufflen = req->nr_sectors << 9; + if (blk_pc_request(req)) + SCpnt->request_bufflen = req->data_len; req->buffer = NULL; /* @@ -123,7 +119,6 @@ /* * kill it. there should be no leftover blocks in this request */ -fail: SCpnt = scsi_end_request(SCpnt, 0, req->nr_sectors); BUG_ON(SCpnt); return 0; diff -Nru a/drivers/scsi/sd.c b/drivers/scsi/sd.c --- a/drivers/scsi/sd.c Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/sd.c Mon Oct 28 16:32:37 2002 @@ -308,6 +308,8 @@ if (rq->timeout) timeout = rq->timeout; + SCpnt->transfersize = rq->data_len; + SCpnt->underflow = rq->data_len; goto queue; } @@ -431,10 +433,10 @@ * host adapter, it's safe to assume that we can at least transfer * this many bytes between each connect / disconnect. */ -queue: SCpnt->transfersize = sdp->sector_size; SCpnt->underflow = this_count << 9; +queue: SCpnt->allowed = MAX_RETRIES; SCpnt->timeout_per_command = timeout; diff -Nru a/drivers/scsi/seagate.c b/drivers/scsi/seagate.c --- a/drivers/scsi/seagate.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/seagate.c Mon Oct 28 16:32:36 2002 @@ -1689,6 +1689,14 @@ return FAILED; } +static int seagate_st0x_release(struct Scsi_Host *shost) +{ + if (shost->irq) + free_irq(shost->irq, shost); + release_region(shost->io_port, shost->n_io_port); + return 0; +} + /* Eventually this will go into an include file, but this will be later */ static Scsi_Host_Template driver_template = SEAGATE_ST0X; diff -Nru a/drivers/scsi/seagate.h b/drivers/scsi/seagate.h --- a/drivers/scsi/seagate.h Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/seagate.h Mon Oct 28 16:32:37 2002 @@ -20,6 +20,7 @@ static int seagate_st0x_host_reset(Scsi_Cmnd *); #define SEAGATE_ST0X { detect: seagate_st0x_detect, \ + release: seagate_st0x_release, \ info: seagate_st0x_info, \ command: seagate_st0x_command, \ queuecommand: seagate_st0x_queue_command, \ diff -Nru a/drivers/scsi/sr.c b/drivers/scsi/sr.c --- a/drivers/scsi/sr.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/sr.c Mon Oct 28 16:32:36 2002 @@ -287,6 +287,8 @@ if (rq->timeout) timeout = rq->timeout; + SCpnt->transfersize = rq->data_len; + SCpnt->underflow = rq->data_len; goto queue; } @@ -360,10 +362,10 @@ * host adapter, it's safe to assume that we can at least transfer * this many bytes between each connect / disconnect. */ -queue: SCpnt->transfersize = cd->device->sector_size; SCpnt->underflow = this_count << 9; +queue: SCpnt->allowed = MAX_RETRIES; SCpnt->timeout_per_command = timeout; diff -Nru a/drivers/scsi/sr_ioctl.c b/drivers/scsi/sr_ioctl.c --- a/drivers/scsi/sr_ioctl.c Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/sr_ioctl.c Mon Oct 28 16:32:37 2002 @@ -160,13 +160,11 @@ if (!cgc->quiet) printk(KERN_ERR "%s: CDROM (ioctl) reports ILLEGAL " "REQUEST.\n", cd->cdi.name); + err = -EIO; if (SRpnt->sr_sense_buffer[12] == 0x20 && - SRpnt->sr_sense_buffer[13] == 0x00) { + SRpnt->sr_sense_buffer[13] == 0x00) /* sense: Invalid command operation code */ err = -EDRIVE_CANT_DO_THIS; - } else { - err = -EINVAL; - } #ifdef DEBUG print_command(cgc->cmd); print_req_sense("sr", SRpnt); diff -Nru a/drivers/scsi/sym53c416.c b/drivers/scsi/sym53c416.c --- a/drivers/scsi/sym53c416.c Mon Oct 28 16:32:35 2002 +++ b/drivers/scsi/sym53c416.c Mon Oct 28 16:32:35 2002 @@ -715,7 +715,6 @@ if(shpnt==NULL) continue; spin_lock_irqsave(&sym53c416_lock, flags); - /* FIXME: Request_irq with CLI is not safe */ /* Request for specified IRQ */ if(request_irq(hosts[i].irq, sym53c416_intr_handle, 0, ID, shpnt)) { @@ -800,12 +799,20 @@ static int sym53c416_abort(Scsi_Cmnd *SCpnt) { - /* printk("sym53c416_abort\n"); */ - /* We don't know how to abort for the moment */ - return SCSI_ABORT_SNOOZE; + return FAILED; } -static int sym53c416_reset(Scsi_Cmnd *SCpnt, unsigned int reset_flags) +static int sym53c416_bus_reset(Scsi_Cmnd *SCpnt) +{ + return FAILED; +} + +static int sym53c416_device_reset(Scsi_Cmnd *SCpnt) +{ + return FAILED; +} + +static int sym53c416_host_reset(Scsi_Cmnd *SCpnt) { int base; int scsi_id = -1; @@ -813,7 +820,7 @@ /* printk("sym53c416_reset\n"); */ base = SCpnt->host->io_port; - /* search scsi_id */ + /* search scsi_id - fixme, we shouldnt need to iterate for this! */ for(i = 0; i < host_index && scsi_id != -1; i++) if(hosts[i].base == base) scsi_id = hosts[i].scsi_id; @@ -821,7 +828,16 @@ outb(NOOP | PIO_MODE, base + COMMAND_REG); outb(RESET_SCSI_BUS, base + COMMAND_REG); sym53c416_init(base, scsi_id); - return SCSI_RESET_PENDING; + return SUCCESS; +} + +static int sym53c416_release(struct Scsi_Host *shost) +{ + if (shost->irq) + free_irq(shost->irq, shost); + if (shost->io_port && shost->n_io_port) + release_region(shost->io_port, shost->n_io_port); + return 0; } static int sym53c416_bios_param(Disk *disk, struct block_device *dev, int *ip) diff -Nru a/drivers/scsi/sym53c416.h b/drivers/scsi/sym53c416.h --- a/drivers/scsi/sym53c416.h Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/sym53c416.h Mon Oct 28 16:32:36 2002 @@ -32,28 +32,34 @@ static int sym53c416_detect(Scsi_Host_Template *); static const char *sym53c416_info(struct Scsi_Host *); +static int sym53c416_release(struct Scsi_Host *); static int sym53c416_command(Scsi_Cmnd *); static int sym53c416_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); static int sym53c416_abort(Scsi_Cmnd *); -static int sym53c416_reset(Scsi_Cmnd *, unsigned int); +static int sym53c416_host_reset(Scsi_Cmnd *); +static int sym53c416_bus_reset(Scsi_Cmnd *); +static int sym53c416_device_reset(Scsi_Cmnd *); static int sym53c416_bios_param(Disk *, struct block_device *, int *); static void sym53c416_setup(char *str, int *ints); -#define SYM53C416 { \ - proc_name: "sym53c416", \ - name: "Symbios Logic 53c416", \ - detect: sym53c416_detect, \ - info: sym53c416_info, \ - command: sym53c416_command, \ - queuecommand: sym53c416_queuecommand, \ - abort: sym53c416_abort, \ - reset: sym53c416_reset, \ - bios_param: sym53c416_bios_param, \ - can_queue: 1, \ - this_id: SYM53C416_SCSI_ID, \ - sg_tablesize: 32, \ - cmd_per_lun: 1, \ - unchecked_isa_dma: 1, \ - use_clustering: ENABLE_CLUSTERING \ - } +#define SYM53C416 { \ + .proc_name = "sym53c416", \ + .name = "Symbios Logic 53c416", \ + .detect = sym53c416_detect, \ + .info = sym53c416_info, \ + .command = sym53c416_command, \ + .queuecommand = sym53c416_queuecommand, \ + .eh_abort_handler = sym53c416_abort, \ + .eh_host_reset_handler =sym53c416_host_reset, \ + .eh_bus_reset_handler = sym53c416_bus_reset, \ + .eh_device_reset_handler =sym53c416_device_reset,\ + .release = sym53c416_release, \ + .bios_param = sym53c416_bios_param, \ + .can_queue = 1, \ + .this_id = SYM53C416_SCSI_ID, \ + .sg_tablesize = 32, \ + .cmd_per_lun = 1, \ + .unchecked_isa_dma = 1, \ + .use_clustering = ENABLE_CLUSTERING \ + } #endif diff -Nru a/drivers/scsi/t128.c b/drivers/scsi/t128.c --- a/drivers/scsi/t128.c Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/t128.c Mon Oct 28 16:32:37 2002 @@ -120,6 +120,7 @@ #include #include #include +#include static struct override { unsigned long address; @@ -247,7 +248,7 @@ instance->irq = NCR5380_probe_irq(instance, T128_IRQS); if (instance->irq != IRQ_NONE) - if (request_irq(instance->irq, do_t128_intr, SA_INTERRUPT, "t128", instance)) { + if (request_irq(instance->irq, t128_intr, SA_INTERRUPT, "t128", instance)) { printk("scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); instance->irq = IRQ_NONE; diff -Nru a/drivers/scsi/t128.h b/drivers/scsi/t128.h --- a/drivers/scsi/t128.h Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/t128.h Mon Oct 28 16:32:36 2002 @@ -91,14 +91,14 @@ #define T_DATA_REG_OFFSET 0x1e00 /* rw 512 bytes long */ #ifndef ASM -int t128_abort(Scsi_Cmnd *); -int t128_biosparam(Disk *, struct block_device *, int*); -int t128_detect(Scsi_Host_Template *); -int t128_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -int t128_host_reset(Scsi_Cmnd *); -int t128_bus_reset(Scsi_Cmnd *); -int t128_device_reset(Scsi_Cmnd *); -int t128_proc_info (char *buffer, char **start, off_t offset, +static int t128_abort(Scsi_Cmnd *); +static int t128_biosparam(Disk *, struct block_device *, int*); +static int t128_detect(Scsi_Host_Template *); +static int t128_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); +static int t128_host_reset(Scsi_Cmnd *); +static int t128_bus_reset(Scsi_Cmnd *); +static int t128_device_reset(Scsi_Cmnd *); +static int t128_proc_info (char *buffer, char **start, off_t offset, int length, int hostno, int inout); #ifndef NULL @@ -166,7 +166,7 @@ #define do_NCR5380_intr do_t128_intr #define NCR5380_queue_command t128_queue_command #define NCR5380_abort t128_abort -#define NCR5380_host_reset t128_hostreset +#define NCR5380_host_reset t128_host_reset #define NCR5380_device_reset t128_device_reset #define NCR5380_bus_reset t128_bus_reset #define NCR5380_proc_info t128_proc_info diff -Nru a/drivers/scsi/u14-34f.c b/drivers/scsi/u14-34f.c --- a/drivers/scsi/u14-34f.c Mon Oct 28 16:32:36 2002 +++ b/drivers/scsi/u14-34f.c Mon Oct 28 16:32:36 2002 @@ -1,6 +1,15 @@ /* * u14-34f.c - Low-level driver for UltraStor 14F/34F SCSI host adapters. * + * 10 Oct 2002 Rev. 7.70 for linux 2.5.42 + * + Foreport from revision 6.70. + * + * 25 Jun 2002 Rev. 6.70 for linux 2.4.19 + * + Fixed endian-ness problem due to bitfields. + * + * 21 Feb 2002 Rev. 6.52 for linux 2.4.18 + * + Backport from rev. 7.22 (use io_request_lock). + * * 20 Feb 2002 Rev. 7.22 for linux 2.5.5 * + Remove any reference to virt_to_bus(). * + Fix pio hang while detecting multiple HBAs. @@ -393,6 +402,10 @@ #include #include +#if !defined(__BIG_ENDIAN_BITFIELD) && !defined(__LITTLE_ENDIAN_BITFIELD) +#error "Adjust your defines" +#endif + /* Values for the PRODUCT_ID ports for the 14/34F */ #define PRODUCT_ID1 0x56 #define PRODUCT_ID2 0x40 /* NOTE: Only upper nibble is used */ @@ -459,7 +472,7 @@ #define REG_CONFIG2 7 #define REG_OGM 8 #define REG_ICM 12 -#define REGION_SIZE 13 +#define REGION_SIZE 13UL #define BSY_ASSERTED 0x01 #define IRQ_ASSERTED 0x01 #define CMD_RESET 0xc0 @@ -481,14 +494,21 @@ /* MailBox SCSI Command Packet */ struct mscp { - unsigned char opcode: 3; /* type of command */ - unsigned char xdir: 2; /* data transfer direction */ - unsigned char dcn: 1; /* disable disconnect */ - unsigned char ca: 1; /* use cache (if available) */ - unsigned char sg: 1; /* scatter/gather operation */ - unsigned char target: 3; /* SCSI target id */ - unsigned char channel: 2; /* SCSI channel number */ - unsigned char lun: 3; /* SCSI logical unit number */ + +#if defined(__BIG_ENDIAN_BITFIELD) + unsigned char sg:1, ca:1, dcn:1, xdir:2, opcode:3; + unsigned char lun: 3, channel:2, target:3; +#else + unsigned char opcode: 3, /* type of command */ + xdir: 2, /* data transfer direction */ + dcn: 1, /* disable disconnect */ + ca: 1, /* use cache (if available) */ + sg: 1; /* scatter/gather operation */ + unsigned char target: 3, /* SCSI target id */ + channel: 2, /* SCSI channel number */ + lun: 3; /* SCSI logical unit number */ +#endif + unsigned int data_address PACKED; /* transfer data pointer */ unsigned int data_len PACKED; /* length in bytes */ unsigned int link_address PACKED; /* for linking command chains */ @@ -730,17 +750,27 @@ }; struct config_1 { - unsigned char bios_segment: 3; - unsigned char removable_disks_as_fixed: 1; - unsigned char interrupt: 2; - unsigned char dma_channel: 2; + +#if defined(__BIG_ENDIAN_BITFIELD) + unsigned char dma_channel: 2, interrupt:2, + removable_disks_as_fixed:1, bios_segment: 3; +#else + unsigned char bios_segment: 3, removable_disks_as_fixed: 1, + interrupt: 2, dma_channel: 2; +#endif + } config_1; struct config_2 { - unsigned char ha_scsi_id: 3; - unsigned char mapping_mode: 2; - unsigned char bios_drive_number: 1; - unsigned char tfr_port: 2; + +#if defined(__BIG_ENDIAN_BITFIELD) + unsigned char tfr_port: 2, bios_drive_number: 1, + mapping_mode: 2, ha_scsi_id: 3; +#else + unsigned char ha_scsi_id: 3, mapping_mode: 2, + bios_drive_number: 1, tfr_port: 2; +#endif + } config_2; char name[16]; diff -Nru a/drivers/scsi/u14-34f.h b/drivers/scsi/u14-34f.h --- a/drivers/scsi/u14-34f.h Mon Oct 28 16:32:37 2002 +++ b/drivers/scsi/u14-34f.h Mon Oct 28 16:32:37 2002 @@ -13,7 +13,7 @@ int u14_34f_reset(Scsi_Cmnd *); int u14_34f_biosparam(Disk *, struct block_device *, int *); -#define U14_34F_VERSION "7.22.00" +#define U14_34F_VERSION "7.70.00" #define ULTRASTOR_14_34F { \ name: "UltraStor 14F/34F rev. " U14_34F_VERSION " ", \ diff -Nru a/drivers/usb/class/audio.c b/drivers/usb/class/audio.c --- a/drivers/usb/class/audio.c Mon Oct 28 16:32:38 2002 +++ b/drivers/usb/class/audio.c Mon Oct 28 16:32:38 2002 @@ -914,7 +914,7 @@ if (!usbin_retire_desc(u, urb) && u->flags & FLG_RUNNING && !usbin_prepare_desc(u, urb) && - (suret = usb_submit_urb(urb, GFP_KERNEL)) == 0) { + (suret = usb_submit_urb(urb, GFP_ATOMIC)) == 0) { u->flags |= mask; } else { u->flags &= ~(mask | FLG_RUNNING); @@ -980,7 +980,7 @@ if (!usbin_sync_retire_desc(u, urb) && u->flags & FLG_RUNNING && !usbin_sync_prepare_desc(u, urb) && - (suret = usb_submit_urb(urb, GFP_KERNEL)) == 0) { + (suret = usb_submit_urb(urb, GFP_ATOMIC)) == 0) { u->flags |= mask; } else { u->flags &= ~(mask | FLG_RUNNING); @@ -1274,7 +1274,7 @@ if (!usbout_retire_desc(u, urb) && u->flags & FLG_RUNNING && !usbout_prepare_desc(u, urb) && - (suret = usb_submit_urb(urb, GFP_KERNEL)) == 0) { + (suret = usb_submit_urb(urb, GFP_ATOMIC)) == 0) { u->flags |= mask; } else { u->flags &= ~(mask | FLG_RUNNING); @@ -1347,7 +1347,7 @@ if (!usbout_sync_retire_desc(u, urb) && u->flags & FLG_RUNNING && !usbout_sync_prepare_desc(u, urb) && - (suret = usb_submit_urb(urb, GFP_KERNEL)) == 0) { + (suret = usb_submit_urb(urb, GFP_ATOMIC)) == 0) { u->flags |= mask; } else { u->flags &= ~(mask | FLG_RUNNING); diff -Nru a/drivers/usb/class/bluetty.c b/drivers/usb/class/bluetty.c --- a/drivers/usb/class/bluetty.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/class/bluetty.c Mon Oct 28 16:32:36 2002 @@ -767,6 +767,7 @@ unsigned int i; unsigned int count = urb->actual_length; unsigned int packet_size; + int status; dbg("%s", __FUNCTION__); @@ -775,14 +776,24 @@ return; } - if (urb->status) { - dbg("%s - nonzero int status received: %d", __FUNCTION__, urb->status); - return; + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); + return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; } if (!count) { dbg("%s - zero length int", __FUNCTION__); - return; + goto exit; } @@ -803,7 +814,7 @@ } if (count == 0) { urb->actual_length = 0; - return; + goto exit; } #endif /* We add a packet type identifier to the beginning of each @@ -820,7 +831,7 @@ if (bluetooth->int_packet_pos + count > EVENT_BUFFER_SIZE) { err("%s - exceeded EVENT_BUFFER_SIZE", __FUNCTION__); bluetooth->int_packet_pos = 0; - return; + goto exit; } memcpy (&bluetooth->int_buffer[bluetooth->int_packet_pos], @@ -831,12 +842,12 @@ if (bluetooth->int_packet_pos >= EVENT_HDR_SIZE) packet_size = bluetooth->int_buffer[2]; else - return; + goto exit; if (packet_size + EVENT_HDR_SIZE < bluetooth->int_packet_pos) { err("%s - packet was too long", __FUNCTION__); bluetooth->int_packet_pos = 0; - return; + goto exit; } if (packet_size + EVENT_HDR_SIZE == bluetooth->int_packet_pos) { @@ -851,6 +862,12 @@ bluetooth->int_packet_pos = 0; } + +exit: + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, status); } diff -Nru a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c --- a/drivers/usb/class/cdc-acm.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/class/cdc-acm.c Mon Oct 28 16:32:37 2002 @@ -185,20 +185,32 @@ struct usb_ctrlrequest *dr = urb->transfer_buffer; unsigned char *data = (unsigned char *)(dr + 1); int newctrl; + int status; - if (!ACM_READY(acm)) return; - - if (urb->status < 0) { - dbg("nonzero ctrl irq status received: %d", urb->status); + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; } + if (!ACM_READY(acm)) + goto exit; + switch (dr->bRequest) { case ACM_IRQ_NETWORK: dbg("%s network", data[0] ? "connected to" : "disconnected from"); - return; + break; case ACM_IRQ_LINE_STATE: @@ -217,13 +229,18 @@ acm->ctrlin & ACM_CTRL_FRAMING ? '+' : '-', acm->ctrlin & ACM_CTRL_PARITY ? '+' : '-', acm->ctrlin & ACM_CTRL_OVERRUN ? '+' : '-'); - return; + break; default: dbg("unknown control event received: request %d index %d len %d data0 %d data1 %d", dr->bRequest, dr->wIndex, dr->wLength, data[0], data[1]); - return; + break; } +exit: + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, status); } static void acm_read_bulk(struct urb *urb) diff -Nru a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c --- a/drivers/usb/core/hcd.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/core/hcd.c Mon Oct 28 16:32:37 2002 @@ -495,25 +495,17 @@ if (length > 0) { urb->actual_length = length; urb->status = 0; + urb->hcpriv = 0; urb->complete (urb); + return; } - spin_lock_irqsave (&hcd_data_lock, flags); - urb->status = -EINPROGRESS; - if (HCD_IS_RUNNING (hcd->state) - && rh_status_urb (hcd, urb) != 0) { - /* another driver snuck in? */ - dbg ("%s, can't resubmit roothub status urb?", - hcd->self.bus_name); - spin_unlock_irqrestore (&hcd_data_lock, flags); - BUG (); - } - spin_unlock_irqrestore (&hcd_data_lock, flags); - } else { + } else spin_unlock_irqrestore (&urb->lock, flags); - spin_lock_irqsave (&hcd_data_lock, flags); - rh_status_urb (hcd, urb); - spin_unlock_irqrestore (&hcd_data_lock, flags); - } + + /* retrigger timer until completion: success or unlink */ + spin_lock_irqsave (&hcd_data_lock, flags); + rh_status_urb (hcd, urb); + spin_unlock_irqrestore (&hcd_data_lock, flags); } else { /* this urb's been unlinked */ urb->hcpriv = 0; @@ -967,7 +959,6 @@ spin_lock_irqsave (&hcd_data_lock, flags); list_del_init (&urb->urb_list); dev = urb->dev; - urb->dev = NULL; usb_put_dev (dev); spin_unlock_irqrestore (&hcd_data_lock, flags); } @@ -1155,7 +1146,10 @@ goto done; } - /* maybe set up to block on completion notification */ + /* maybe set up to block until the urb's completion fires. the + * lower level hcd code is always async, locking on urb->status + * updates; an intercepted completion unblocks us. + */ if ((urb->transfer_flags & USB_TIMEOUT_KILLED)) urb->status = -ETIMEDOUT; else if (!(urb->transfer_flags & USB_ASYNC_UNLINK)) { @@ -1290,11 +1284,6 @@ * (and is done using urb->hcpriv). It also released all HCD locks; * the device driver won't cause problems if it frees, modifies, * or resubmits this URB. - * Bandwidth and other resources will be deallocated. - * - * HCDs must not use this for periodic URBs that are still scheduled - * and will be reissued. They should just call their completion handlers - * until the urb is returned to the device driver by unlinking. */ void usb_hcd_giveback_urb (struct usb_hcd *hcd, struct urb *urb) { diff -Nru a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c --- a/drivers/usb/core/hub.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/core/hub.c Mon Oct 28 16:32:36 2002 @@ -119,6 +119,7 @@ { struct usb_hub *hub = (struct usb_hub *)urb->context; unsigned long flags; + int status; switch (urb->status) { case -ENOENT: /* synchronous unlink */ @@ -131,7 +132,7 @@ dbg("hub '%s' status %d for interrupt transfer", urb->dev->devpath, urb->status); if ((++hub->nerrors < 10) || hub->error) - return; + goto resubmit; hub->error = urb->status; /* FALL THROUGH */ @@ -149,6 +150,12 @@ wake_up(&khubd_wait); } spin_unlock_irqrestore(&hub_event_lock, flags); + +resubmit: + if ((status = usb_submit_urb (hub->urb, GFP_ATOMIC)) != 0) + err ("hub '%s-%s' status %d for interrupt resubmit", + urb->dev->bus->bus_name, urb->dev->devpath, + status); } /* USB 2.0 spec Section 11.24.2.3 */ diff -Nru a/drivers/usb/core/message.c b/drivers/usb/core/message.c --- a/drivers/usb/core/message.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/core/message.c Mon Oct 28 16:32:36 2002 @@ -287,12 +287,6 @@ * * The request may be canceled with usb_sg_cancel(), either before or after * usb_sg_wait() is called. - * - * NOTE: - * - * At this writing, don't use the interrupt transfer mode, since the old old - * "automagic resubmit" mode hasn't yet been removed. It should be removed - * by the time 2.5 finalizes. */ int usb_sg_init ( struct usb_sg_request *io, @@ -686,8 +680,9 @@ * as reported by URB completion status. Endpoints that are halted are * sometimes referred to as being "stalled". Such endpoints are unable * to transmit or receive data until the halt status is cleared. Any URBs - * queued queued for such an endpoint should normally be unlinked before - * clearing the halt condition. + * queued for such an endpoint should normally be unlinked by the driver + * before clearing the halt condition, as described in sections 5.7.5 + * and 5.8.5 of the USB 2.0 spec. * * Note that control and isochronous endpoints don't halt, although control * endpoints report "protocol stall" (for unsupported requests) using the @@ -701,48 +696,34 @@ int usb_clear_halt(struct usb_device *dev, int pipe) { int result; - __u16 status; - unsigned char *buffer; - int endp=usb_pipeendpoint(pipe)|(usb_pipein(pipe)<<7); - -/* - if (!usb_endpoint_halted(dev, endp & 0x0f, usb_endpoint_out(endp))) - return 0; -*/ + int endp = usb_pipeendpoint(pipe); + + if (usb_pipein (pipe)) + endp |= USB_DIR_IN; + /* we don't care if it wasn't halted first. in fact some devices + * (like some ibmcam model 1 units) seem to expect hosts to make + * this request for iso endpoints, which can't halt! + */ result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0, endp, NULL, 0, HZ * USB_CTRL_SET_TIMEOUT); - /* don't clear if failed */ + /* don't un-halt or force to DATA0 except on success */ if (result < 0) return result; - buffer = kmalloc(sizeof(status), GFP_KERNEL); - if (!buffer) { - err("unable to allocate memory for configuration descriptors"); - return -ENOMEM; - } - - result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), - USB_REQ_GET_STATUS, USB_DIR_IN | USB_RECIP_ENDPOINT, 0, endp, - // FIXME USB_CTRL_GET_TIMEOUT, yes? why not usb_get_status() ? - buffer, sizeof(status), HZ * USB_CTRL_SET_TIMEOUT); - - memcpy(&status, buffer, sizeof(status)); - kfree(buffer); - - if (result < 0) - return result; - - if (le16_to_cpu(status) & 1) - return -EPIPE; /* still halted */ - - usb_endpoint_running(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe)); - - /* toggle is reset on clear */ + /* NOTE: seems like Microsoft and Apple don't bother verifying + * the clear "took", so some devices could lock up if you check... + * such as the Hagiwara FlashGate DUAL. So we won't bother. + * + * NOTE: make sure the logic here doesn't diverge much from + * the copy in usb-storage, for as long as we need two copies. + */ + /* toggle was reset by the clear, then ep was reactivated */ usb_settoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe), 0); + usb_endpoint_running(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe)); return 0; } diff -Nru a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c --- a/drivers/usb/core/urb.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/core/urb.c Mon Oct 28 16:32:37 2002 @@ -108,45 +108,47 @@ * * Successful submissions return 0; otherwise this routine returns a * negative error number. If the submission is successful, the complete() - * fuction of the urb will be called when the USB host driver is - * finished with the urb (either a successful transmission, or some - * error case.) - * - * Unreserved Bandwidth Transfers: - * - * Bulk or control requests complete only once. When the completion + * callback from the urb will be called exactly once, when the USB core and + * host controller driver are finished with the urb. When the completion * function is called, control of the URB is returned to the device * driver which issued the request. The completion handler may then * immediately free or reuse that URB. * - * Bulk URBs may be queued by submitting an URB to an endpoint before - * previous ones complete. This can maximize bandwidth utilization by - * letting the USB controller start work on the next URB without any - * delay to report completion (scheduling and processing an interrupt) - * and then submit that next request. - * * For control endpoints, the synchronous usb_control_msg() call is * often used (in non-interrupt context) instead of this call. + * That is often used through convenience wrappers, for the requests + * that are standardized in the USB 2.0 specification. For bulk + * endpoints, a synchronous usb_bulk_msg() call is available. + * + * Request Queuing: + * + * URBs may be submitted to endpoints before previous ones complete, to + * minimize the impact of interrupt latencies and system overhead on data + * throughput. This is required for continuous isochronous data streams, + * and may also be required for some kinds of interrupt transfers. Such + * queueing also maximizes bandwidth utilization by letting USB controllers + * start work on later requests before driver software has finished the + * completion processing for earlier requests. + * + * Bulk and Isochronous URBs may always be queued. At this writing, all + * mainstream host controller drivers support queueing for control and + * interrupt transfer requests. * * Reserved Bandwidth Transfers: * - * Periodic URBs (interrupt or isochronous) are performed repeatedly. - * - * For interrupt requests this is (currently) automagically done - * until the original request is aborted. When the completion callback - * indicates the URB has been unlinked (with a special status code), - * control of that URB returns to the device driver. Otherwise, the - * completion handler does not control the URB, and should not change - * any of its fields. - * - * For isochronous requests, the completion handler is expected to - * submit an urb, typically resubmitting its parameter, until drivers - * stop wanting data transfers. (For example, audio playback might have - * finished, or a webcam turned off.) - * - * If the USB subsystem can't reserve sufficient bandwidth to perform - * the periodic request, and bandwidth reservation is being done for - * this controller, submitting such a periodic request will fail. + * Periodic transfers (interrupt or isochronous) are performed repeatedly, + * using the interval specified in the urb. Submitting the first urb to + * the endpoint reserves the bandwidth necessary to make those transfers. + * If the USB subsystem can't allocate sufficient bandwidth to perform + * the periodic request, submitting such a periodic request should fail. + * + * Device drivers must explicitly request that repetition, by ensuring that + * some URB is always on the endpoint's queue (except possibly for short + * periods during completion callacks). When there is no longer an urb + * queued, the endpoint's bandwidth reservation is canceled. This means + * drivers can use their completion handlers to ensure they keep bandwidth + * they need, by reinitializing and resubmitting the just-completed urb + * until the driver longer needs that periodic bandwidth. * * Memory Flags: * @@ -356,8 +358,7 @@ * This routine cancels an in-progress request. The requests's * completion handler will be called with a status code indicating * that the request has been canceled, and that control of the URB - * has been returned to that device driver. This is the only way - * to stop an interrupt transfer, so long as the device is connected. + * has been returned to that device driver. * * When the USB_ASYNC_UNLINK transfer flag for the URB is clear, this * request is synchronous. Success is indicated by returning zero, diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c --- a/drivers/usb/core/usb.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/core/usb.c Mon Oct 28 16:32:37 2002 @@ -942,12 +942,27 @@ int i; int j; - /* USB v1.1 5.5.3 */ - /* We read the first 8 bytes from the device descriptor to get to */ - /* the bMaxPacketSize0 field. Then we set the maximum packet size */ - /* for the control pipe, and retrieve the rest */ - dev->epmaxpacketin [0] = 8; - dev->epmaxpacketout[0] = 8; + /* USB 2.0 section 5.5.3 talks about ep0 maxpacket ... + * it's fixed size except for full speed devices. + */ + switch (dev->speed) { + case USB_SPEED_HIGH: /* fixed at 64 */ + i = 64; + break; + case USB_SPEED_FULL: /* 8, 16, 32, or 64 */ + /* to determine the ep0 maxpacket size, read the first 8 + * bytes from the device descriptor to get bMaxPacketSize0; + * then correct our initial (small) guess. + */ + // FALLTHROUGH + case USB_SPEED_LOW: /* fixed at 8 */ + i = 8; + break; + default: + return -EINVAL; + } + dev->epmaxpacketin [0] = i; + dev->epmaxpacketout[0] = i; for (i = 0; i < NEW_DEVICE_RETRYS; ++i) { @@ -967,6 +982,7 @@ wait_ms(10); /* Let the SET_ADDRESS settle */ + /* high and low speed devices don't need this... */ err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, 8); if (err >= 8) break; @@ -982,8 +998,10 @@ dev->devnum = -1; return 1; } - dev->epmaxpacketin [0] = dev->descriptor.bMaxPacketSize0; - dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0; + if (dev->speed == USB_SPEED_FULL) { + dev->epmaxpacketin [0] = dev->descriptor.bMaxPacketSize0; + dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0; + } err = usb_get_device_descriptor(dev); if (err < (signed)sizeof(dev->descriptor)) { diff -Nru a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c --- a/drivers/usb/host/ehci-hcd.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/host/ehci-hcd.c Mon Oct 28 16:32:37 2002 @@ -106,8 +106,6 @@ #define EHCI_STATS #endif -#define INTR_AUTOMAGIC /* to be removed later in 2.5 */ - /* magic numbers that can affect system performance */ #define EHCI_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */ #define EHCI_TUNE_RL_HS 0 /* nak throttle; see 4.9 */ diff -Nru a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c --- a/drivers/usb/host/ehci-q.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/host/ehci-q.c Mon Oct 28 16:32:37 2002 @@ -160,13 +160,6 @@ static void ehci_urb_done (struct ehci_hcd *ehci, struct urb *urb) { -#ifdef INTR_AUTOMAGIC - struct urb *resubmit = 0; - struct usb_device *dev = 0; - - static int ehci_urb_enqueue (struct usb_hcd *, struct urb *, int); -#endif - if (likely (urb->hcpriv != 0)) { struct ehci_qh *qh = (struct ehci_qh *) urb->hcpriv; @@ -175,14 +168,6 @@ /* ... update hc-wide periodic stats (for usbfs) */ hcd_to_bus (&ehci->hcd)->bandwidth_int_reqs--; - -#ifdef INTR_AUTOMAGIC - if (!((urb->status == -ENOENT) - || (urb->status == -ECONNRESET))) { - resubmit = usb_get_urb (urb); - dev = urb->dev; - } -#endif } qh_put (ehci, qh); urb->hcpriv = 0; @@ -207,25 +192,6 @@ spin_unlock (&ehci->lock); usb_hcd_giveback_urb (&ehci->hcd, urb); -#ifdef INTR_AUTOMAGIC - if (resubmit && ((urb->status == -ENOENT) - || (urb->status == -ECONNRESET))) { - usb_put_urb (resubmit); - resubmit = 0; - } - // device drivers will soon be doing something like this - if (resubmit) { - int status; - - resubmit->dev = dev; - status = SUBMIT_URB (resubmit, SLAB_KERNEL); - if (status != 0) - err ("can't resubmit interrupt urb %p: status %d", - resubmit, status); - usb_put_urb (resubmit); - } -#endif - spin_lock (&ehci->lock); } @@ -778,10 +744,26 @@ qtd = list_entry (qtd_list->next, struct ehci_qtd, qtd_list); - /* maybe patch the qh used for set_address */ - if (unlikely (epnum == 0 - && le32_to_cpu (qh->hw_info1 & 0x7f) == 0)) - qh->hw_info1 |= cpu_to_le32 (usb_pipedevice(urb->pipe)); + /* control qh may need patching after enumeration */ + if (unlikely (epnum == 0)) { + /* set_address changes the address */ + if (le32_to_cpu (qh->hw_info1 & 0x7f) == 0) + qh->hw_info1 |= cpu_to_le32 ( + usb_pipedevice (urb->pipe)); + + /* for full speed, ep0 maxpacket can grow */ + else if (!(qh->hw_info1 & cpu_to_le32 (0x3 << 12))) { + u32 info, max; + + info = le32_to_cpu (qh->hw_info1); + max = urb->dev->descriptor.bMaxPacketSize0; + if (max > (0x07ff & (info >> 16))) { + info &= ~(0x07ff << 16); + info |= max << 16; + qh->hw_info1 = cpu_to_le32 (info); + } + } + } /* append to tds already queued to this qh? */ if (unlikely (!list_empty (&qh->qtd_list) && qtd)) { diff -Nru a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c --- a/drivers/usb/host/ohci-hcd.c Mon Oct 28 16:32:35 2002 +++ b/drivers/usb/host/ohci-hcd.c Mon Oct 28 16:32:35 2002 @@ -383,10 +383,16 @@ /* SMM owns the HC? not for long! */ if (readl (&ohci->regs->control) & OHCI_CTRL_IR) { - temp = 50; /* arbitrary: half second */ + dbg ("USB HC TakeOver from BIOS/SMM"); + + /* this timeout is arbitrary. we make it long, so systems + * depending on usb keyboards may be usable even if the + * BIOS/SMM code seems pretty broken. + */ + temp = 500; /* arbitrary: five seconds */ + writel (OHCI_INTR_OC, &ohci->regs->intrenable); writel (OHCI_OCR, &ohci->regs->cmdstatus); - dbg ("USB HC TakeOver from SMM"); while (readl (&ohci->regs->control) & OHCI_CTRL_IR) { wait_ms (10); if (--temp == 0) { diff -Nru a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c --- a/drivers/usb/host/ohci-q.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/host/ohci-q.c Mon Oct 28 16:32:37 2002 @@ -62,54 +62,6 @@ usb_hcd_giveback_urb (&ohci->hcd, urb); } -static void td_submit_urb (struct ohci_hcd *ohci, struct urb *urb); - -/* Report interrupt transfer completion, maybe reissue */ -static inline void intr_resub (struct ohci_hcd *hc, struct urb *urb) -{ - struct urb_priv *urb_priv = urb->hcpriv; - unsigned long flags; - -// FIXME going away along with the rest of interrrupt automagic... - - /* FIXME: MP race. If another CPU partially unlinks - * this URB (urb->status was updated, hasn't yet told - * us to dequeue) before we call complete() here, an - * extra "unlinked" completion will be reported... - */ - - spin_lock_irqsave (&urb->lock, flags); - if (likely (urb->status == -EINPROGRESS)) - urb->status = 0; - spin_unlock_irqrestore (&urb->lock, flags); - - if (!(urb->transfer_flags & URB_NO_DMA_MAP) - && usb_pipein (urb->pipe)) - pci_dma_sync_single (hc->hcd.pdev, urb->transfer_dma, - urb->transfer_buffer_length, - PCI_DMA_FROMDEVICE); - -#ifdef OHCI_VERBOSE_DEBUG - urb_print (urb, "INTR", usb_pipeout (urb->pipe)); -#endif - urb->complete (urb); - - /* always requeued, but ED_SKIP if complete() unlinks. - * EDs are removed from periodic table only at SOF intr. - */ - urb->actual_length = 0; - spin_lock_irqsave (&urb->lock, flags); - if (urb_priv->state != URB_DEL) - urb->status = -EINPROGRESS; - spin_unlock (&urb->lock); - - /* syncing with PCI_DMA_TODEVICE is evidently trouble... */ - - spin_lock (&hc->lock); - td_submit_urb (hc, urb); - spin_unlock_irqrestore (&hc->lock, flags); -} - /*-------------------------------------------------------------------------* * ED handling functions @@ -1022,22 +974,10 @@ td_done (urb, td); urb_priv->td_cnt++; - /* If all this urb's TDs are done, call complete(). - * Interrupt transfers are the only special case: - * they're reissued, until "deleted" by usb_unlink_urb - * (real work done in a SOF intr, by finish_unlinks). - */ + /* If all this urb's TDs are done, call complete() */ if (urb_priv->td_cnt == urb_priv->length) { - int resubmit; - - resubmit = usb_pipeint (urb->pipe) - && (urb_priv->state != URB_DEL); - spin_unlock_irqrestore (&ohci->lock, flags); - if (resubmit) - intr_resub (ohci, urb); - else - finish_urb (ohci, urb); + finish_urb (ohci, urb); spin_lock_irqsave (&ohci->lock, flags); } diff -Nru a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c --- a/drivers/usb/host/uhci-hcd.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/host/uhci-hcd.c Mon Oct 28 16:32:37 2002 @@ -1247,10 +1247,11 @@ static inline int uhci_submit_interrupt(struct uhci_hcd *uhci, struct urb *urb, struct urb *eurb) { - /* Interrupt-IN can't be more than 1 packet */ - if (usb_pipein(urb->pipe) && urb->transfer_buffer_length > usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe))) - return -EINVAL; - + /* USB 1.1 interrupt transfers only involve one packet per interval; + * that's the uhci_submit_common() "breadth first" policy. Drivers + * can submit urbs of any length, but longer ones might need many + * intervals to complete. + */ return uhci_submit_common(uhci, urb, eurb, uhci->skelqh[__interval_to_skel(urb->interval)]); } @@ -1804,44 +1805,19 @@ static void uhci_finish_urb(struct usb_hcd *hcd, struct urb *urb) { struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv; - struct usb_device *dev = urb->dev; struct uhci_hcd *uhci = hcd_to_uhci(hcd); - int killed, resubmit_interrupt, status, ret; + int status; unsigned long flags; spin_lock_irqsave(&urb->lock, flags); - - killed = (urb->status == -ENOENT || urb->status == -ECONNRESET); - resubmit_interrupt = (usb_pipetype(urb->pipe) == PIPE_INTERRUPT && - urb->interval && !killed); - status = urbp->status; uhci_destroy_urb_priv(uhci, urb); - if (!killed) + if (urb->status != -ENOENT && urb->status != -ECONNRESET) urb->status = status; spin_unlock_irqrestore(&urb->lock, flags); - if (resubmit_interrupt) { - urb->complete(urb); - - /* Recheck the status. The completion handler may have */ - /* unlinked the resubmitting interrupt URB */ - /* Note that this doesn't do what usb_hcd_giveback_urb() */ - /* normally does, so that doesn't ever get done. */ - if (urb->status == -ECONNRESET) { - usb_put_urb(urb); - return; - } - - urb->dev = dev; - urb->status = -EINPROGRESS; - urb->actual_length = 0; - urb->bandwidth = 0; - if ((ret = uhci_urb_enqueue(&uhci->hcd, urb, 0))) - printk(KERN_ERR __FILE__ ": could not resubmit interrupt URB : %d\n", ret); - } else - usb_hcd_giveback_urb(hcd, urb); + usb_hcd_giveback_urb(hcd, urb); } static void uhci_finish_completion(struct usb_hcd *hcd) diff -Nru a/drivers/usb/image/hpusbscsi.c b/drivers/usb/image/hpusbscsi.c --- a/drivers/usb/image/hpusbscsi.c Mon Oct 28 16:32:38 2002 +++ b/drivers/usb/image/hpusbscsi.c Mon Oct 28 16:32:38 2002 @@ -31,7 +31,7 @@ /* USB related parts */ static int -hpusbscsi_usb_probe (struct usb_interface *intf, +hpusbscsi_usb_probe (struct usb_interface *intf, const struct usb_device_id *id) { struct hpusbscsi *new; @@ -109,11 +109,6 @@ switch (result) { case 0: /* no error */ break; - - case -EPIPE: - usb_clear_halt (dev, usb_sndctrlpipe (dev, 0)); - break; - default: printk (KERN_ERR "unknown error %d from usb_set_interface\n", result); diff -Nru a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c --- a/drivers/usb/image/microtek.c Mon Oct 28 16:32:38 2002 +++ b/drivers/usb/image/microtek.c Mon Oct 28 16:32:38 2002 @@ -915,10 +915,6 @@ return -ENODEV; } - - /* I don't understand the following fully (it's from usb-storage) -- John */ - - /* set the interface -- STALL is an acceptable response here */ result = usb_set_interface(dev, altsetting->bInterfaceNumber, 0); MTS_DEBUG("usb_set_interface returned %d.\n",result); @@ -926,12 +922,7 @@ { case 0: /* no error */ break; - - case -EPIPE: - usb_clear_halt(dev, usb_sndctrlpipe(dev, 0)); - MTS_DEBUG( "clearing clearing stall on control interface\n" ); - break; - + default: MTS_DEBUG( "unknown error %d from usb_set_interface\n", (int)result ); diff -Nru a/drivers/usb/image/scanner.c b/drivers/usb/image/scanner.c --- a/drivers/usb/image/scanner.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/image/scanner.c Mon Oct 28 16:32:36 2002 @@ -364,18 +364,33 @@ struct scn_usb_data *scn; unsigned char *data; + int status; + scn = urb->context; data = &scn->button; data += 0; /* Keep gcc from complaining about unused var */ - if (urb->status) { + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); } dbg("irq_scanner(%d): data:%x", scn->scn_minor, *data); - return; + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, status); } static int diff -Nru a/drivers/usb/input/aiptek.c b/drivers/usb/input/aiptek.c --- a/drivers/usb/input/aiptek.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/input/aiptek.c Mon Oct 28 16:32:37 2002 @@ -134,9 +134,22 @@ int y; int pressure; int proximity; + int retval; - if (urb->status) + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; + } if ((data[0] & 2) == 0) { dbg("received unknown report #%d", data[0]); @@ -165,6 +178,11 @@ input_sync(dev); +exit: + retval = usb_submit_urb (urb, GFP_ATOMIC); + if (retval) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, retval); } struct aiptek_features aiptek_features[] = { diff -Nru a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c --- a/drivers/usb/input/hid-core.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/input/hid-core.c Mon Oct 28 16:32:37 2002 @@ -900,12 +900,26 @@ static void hid_irq_in(struct urb *urb) { - if (urb->status) { - dbg("nonzero status in input irq %d", urb->status); + struct hid_device *hid = urb->context; + int status; + + switch (urb->status) { + case 0: /* success */ + hid_input_report(HID_INPUT_REPORT, urb); + break; + case -ECONNRESET: /* unlink */ + case -ENOENT: + case -ESHUTDOWN: return; + default: /* error */ + dbg("nonzero status in input irq %d", urb->status); } - - hid_input_report(HID_INPUT_REPORT, urb); + + status = usb_submit_urb (urb, SLAB_ATOMIC); + if (status) + err ("can't resubmit intr, %s-%s/input%d, status %d", + hid->dev->bus->bus_name, hid->dev->devpath, + hid->ifnum, status); } /* diff -Nru a/drivers/usb/input/hiddev.c b/drivers/usb/input/hiddev.c --- a/drivers/usb/input/hiddev.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/input/hiddev.c Mon Oct 28 16:32:36 2002 @@ -701,7 +701,7 @@ init_waitqueue_head(&hiddev->wait); hiddev->minor = minor; - hiddev_table[minor] = hiddev; + hiddev_table[minor - HIDDEV_MINOR_BASE] = hiddev; hiddev->hid = hid; hiddev->exist = 1; diff -Nru a/drivers/usb/input/powermate.c b/drivers/usb/input/powermate.c --- a/drivers/usb/input/powermate.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/input/powermate.c Mon Oct 28 16:32:37 2002 @@ -78,14 +78,33 @@ static void powermate_irq(struct urb *urb) { struct powermate_device *pm = urb->context; + int retval; - if (urb->status) + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; + } /* handle updates to device state */ input_report_key(&pm->input, BTN_0, pm->data[0] & 0x01); input_report_rel(&pm->input, REL_DIAL, pm->data[1]); input_sync(&pm->input); + +exit: + retval = usb_submit_urb (urb, GFP_ATOMIC); + if (retval) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, retval); } /* Decide if we need to issue a control message and do so. Must be called with pm->lock down */ diff -Nru a/drivers/usb/input/usbkbd.c b/drivers/usb/input/usbkbd.c --- a/drivers/usb/input/usbkbd.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/input/usbkbd.c Mon Oct 28 16:32:36 2002 @@ -87,7 +87,17 @@ struct usb_kbd *kbd = urb->context; int i; - if (urb->status) return; + switch (urb->status) { + case 0: /* success */ + break; + case -ECONNRESET: /* unlink */ + case -ENOENT: + case -ESHUTDOWN: + return; + /* -EPIPE: should clear the halt */ + default: /* error */ + goto resubmit; + } for (i = 0; i < 8; i++) input_report_key(&kbd->dev, usb_kbd_keycode[i + 224], (kbd->new[0] >> i) & 1); @@ -112,6 +122,13 @@ input_sync(&kbd->dev); memcpy(kbd->old, kbd->new, 8); + +resubmit: + i = usb_submit_urb (urb, SLAB_ATOMIC); + if (i) + err ("can't resubmit intr, %s-%s/input0, status %d", + kbd->usbdev->bus->bus_name, + kbd->usbdev->devpath, i); } int usb_kbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) diff -Nru a/drivers/usb/input/usbmouse.c b/drivers/usb/input/usbmouse.c --- a/drivers/usb/input/usbmouse.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/input/usbmouse.c Mon Oct 28 16:32:37 2002 @@ -62,8 +62,20 @@ struct usb_mouse *mouse = urb->context; signed char *data = mouse->data; struct input_dev *dev = &mouse->dev; + int status; + + switch (urb->status) { + case 0: /* success */ + break; + case -ECONNRESET: /* unlink */ + case -ENOENT: + case -ESHUTDOWN: + return; + /* -EPIPE: should clear the halt */ + default: /* error */ + goto resubmit; + } - if (urb->status) return; input_report_key(dev, BTN_LEFT, data[0] & 0x01); input_report_key(dev, BTN_RIGHT, data[0] & 0x02); @@ -76,6 +88,12 @@ input_report_rel(dev, REL_WHEEL, data[3]); input_sync(dev); +resubmit: + status = usb_submit_urb (urb, SLAB_ATOMIC); + if (status) + err ("can't resubmit intr, %s-%s/input0, status %d", + mouse->usbdev->bus->bus_name, + mouse->usbdev->devpath, status); } static int usb_mouse_open(struct input_dev *dev) diff -Nru a/drivers/usb/input/wacom.c b/drivers/usb/input/wacom.c --- a/drivers/usb/input/wacom.c Mon Oct 28 16:32:35 2002 +++ b/drivers/usb/input/wacom.c Mon Oct 28 16:32:35 2002 @@ -108,8 +108,22 @@ unsigned char *data = wacom->data; struct input_dev *dev = &wacom->dev; int prox, pressure; + int retval; - if (urb->status) return; + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); + return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; + } if (data[0] != 2) dbg("received unknown report #%d", data[0]); @@ -135,6 +149,12 @@ } input_sync(dev); + +exit: + retval = usb_submit_urb (urb, GFP_ATOMIC); + if (retval) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, retval); } static void wacom_penpartner_irq(struct urb *urb) @@ -142,8 +162,22 @@ struct wacom *wacom = urb->context; unsigned char *data = wacom->data; struct input_dev *dev = &wacom->dev; + int retval; - if (urb->status) return; + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); + return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; + } input_report_key(dev, BTN_TOOL_PEN, 1); input_report_abs(dev, ABS_X, data[2] << 8 | data[1]); @@ -152,6 +186,12 @@ input_report_key(dev, BTN_TOUCH, ((signed char)data[6] > -80) && !(data[5] & 0x20)); input_report_key(dev, BTN_STYLUS, (data[5] & 0x40)); input_sync(dev); + +exit: + retval = usb_submit_urb (urb, GFP_ATOMIC); + if (retval) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, retval); } static void wacom_graphire_irq(struct urb *urb) @@ -160,8 +200,22 @@ unsigned char *data = wacom->data; struct input_dev *dev = &wacom->dev; int x, y; + int retval; - if (urb->status) return; + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); + return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; + } if (data[0] != 2) dbg("received unknown report #%d", data[0]); @@ -191,7 +245,7 @@ input_report_abs(dev, ABS_Y, y); input_sync(dev); - return; + goto exit; } if (data[1] & 0x80) { @@ -205,6 +259,12 @@ input_report_key(dev, BTN_STYLUS2, data[1] & 0x04); input_sync(dev); + +exit: + retval = usb_submit_urb (urb, GFP_ATOMIC); + if (retval) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, retval); } static void wacom_intuos_irq(struct urb *urb) @@ -214,8 +274,22 @@ struct input_dev *dev = &wacom->dev; unsigned int t; int idx; + int retval; - if (urb->status) return; + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); + return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; + } if (data[0] != 2) dbg("received unknown report #%d", data[0]); @@ -253,13 +327,13 @@ input_report_key(dev, wacom->tool[idx], 1); input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); input_sync(dev); - return; + goto exit; } if ((data[1] & 0xfe) == 0x80) { /* Exit report */ input_report_key(dev, wacom->tool[idx], 0); input_sync(dev); - return; + goto exit; } input_report_abs(dev, ABS_X, ((__u32)data[2] << 8) | data[3]); @@ -323,6 +397,12 @@ } input_sync(dev); + +exit: + retval = usb_submit_urb (urb, GFP_ATOMIC); + if (retval) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, retval); } struct wacom_features wacom_features[] = { diff -Nru a/drivers/usb/input/xpad.c b/drivers/usb/input/xpad.c --- a/drivers/usb/input/xpad.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/input/xpad.c Mon Oct 28 16:32:37 2002 @@ -166,11 +166,30 @@ static void xpad_irq_in(struct urb *urb) { struct usb_xpad *xpad = urb->context; + int retval; - if (urb->status) + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; + } xpad_process_packet(xpad, 0, xpad->idata); + +exit: + retval = usb_submit_urb (urb, GFP_ATOMIC); + if (retval) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, retval); } static int xpad_open (struct input_dev *dev) diff -Nru a/drivers/usb/media/se401.c b/drivers/usb/media/se401.c --- a/drivers/usb/media/se401.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/media/se401.c Mon Oct 28 16:32:36 2002 @@ -428,16 +428,37 @@ static void se401_button_irq(struct urb *urb) { struct usb_se401 *se401 = urb->context; + int status; if (!se401->dev) { info("ohoh: device vapourished"); return; } - if (urb->actual_length >=2 && !urb->status) { + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); + return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; + } + + if (urb->actual_length >=2) { if (se401->button) se401->buttonpressed=1; } +exit: + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, status); } static void se401_video_irq(struct urb *urb) @@ -676,7 +697,8 @@ static inline void enhance_picture(unsigned char *frame, int len) { while (len--) { - *frame++=(((*frame^255)*(*frame^255))/255)^255; + *frame=(((*frame^255)*(*frame^255))/255)^255; + frame++; } } @@ -910,7 +932,8 @@ /* Fix the top line */ framedata+=linelength; for (i=0; icheight; i++) { diff -Nru a/drivers/usb/media/vicam.c b/drivers/usb/media/vicam.c --- a/drivers/usb/media/vicam.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/media/vicam.c Mon Oct 28 16:32:36 2002 @@ -421,9 +421,6 @@ u8 bulkEndpoint; bool needsDummyRead; - u32 framebuf_size; // # of valid bytes in framebuf - u32 framebuf_read_start; // position in frame buf that a read is happening at. - #ifdef CONFIG_PROC_FS struct proc_dir_entry *proc_entry; #endif @@ -924,6 +921,11 @@ int n; int actual_length; + if (cam->needsDummyRead) { + cam->needsDummyRead = 0; + read_frame(cam, framenum); + } + memset(request, 0, 16); request[0] = cam->gain; // 0 = 0% gain, FF = 100% gain @@ -974,74 +976,37 @@ vicam_decode_color(cam->raw_image, cam->framebuf + framenum * VICAM_MAX_FRAME_SIZE ); - - cam->framebuf_size = - 320 * 240 * VICAM_BYTES_PER_PIXEL; - cam->framebuf_read_start = 0; - - return; - } static int vicam_read( struct file *file, char *buf, size_t count, loff_t *ppos ) { struct vicam_camera *cam = file->private_data; - DBG("read %d bytes.\n", (int) count); - if (!buf) - return -EINVAL; + DBG("read %d bytes.\n", (int) count); - if (!count) - return -EINVAL; + down_interruptible(&cam->busy_lock); - // This is some code that will hopefully allow us to do shell copies from - // the /dev/videoX to a file and have it actually work. - if (cam->framebuf_size != 0) { - if (cam->framebuf_read_start == cam->framebuf_size) { - cam->framebuf_size = cam->framebuf_read_start = 0; - return 0; - } else { - if (cam->framebuf_read_start + count <= - cam->framebuf_size) { - // count does not exceed available bytes - copy_to_user(buf, - (cam->framebuf) + - cam->framebuf_read_start, count); - cam->framebuf_read_start += count; - return count; - } else { - count = - cam->framebuf_size - - cam->framebuf_read_start; - copy_to_user(buf, - (cam->framebuf) + - cam->framebuf_read_start, count); - cam->framebuf_read_start = cam->framebuf_size; - return count; - } - } + if (*ppos >= VICAM_MAX_FRAME_SIZE) { + *ppos = 0; + return 0; } - down_interruptible(&cam->busy_lock); - - if (cam->needsDummyRead) { + if (*ppos == 0) { read_frame(cam, 0); - cam->needsDummyRead = 0; } - // read_frame twice because the camera doesn't seem to take the shutter speed for the first one. - - read_frame(cam, 0); - if (count > cam->framebuf_size) - count = cam->framebuf_size; + count = min_t(size_t, count, VICAM_MAX_FRAME_SIZE - *ppos); - copy_to_user(buf, cam->framebuf, count); + if (copy_to_user(buf, &cam->framebuf[*ppos], count)) { + count = -EFAULT; + } else { + *ppos += count; + } - if (count != cam->framebuf_size) - cam->framebuf_read_start = count; - else - cam->framebuf_size = 0; + if (count == VICAM_MAX_FRAME_SIZE) { + *ppos = 0; + } up(&cam->busy_lock); diff -Nru a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c --- a/drivers/usb/misc/auerswald.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/misc/auerswald.c Mon Oct 28 16:32:36 2002 @@ -1014,30 +1014,39 @@ pauerbuf_t bp = NULL; pauerswald_t cp = (pauerswald_t) urb->context; - dbg ("auerswald_int_complete called"); + dbg ("%s called", __FUNCTION__); - /* do not respond to an error condition */ - if (urb->status != 0) { - dbg ("nonzero URB status = %d", urb->status); - return; - } + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); + return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; + } /* check if all needed data was received */ if (urb->actual_length < AU_IRQMINSIZE) { dbg ("invalid data length received: %d bytes", urb->actual_length); - return; + goto exit; } /* check the command code */ if (cp->intbufp[0] != AU_IRQCMDID) { dbg ("invalid command received: %d", cp->intbufp[0]); - return; + goto exit; } /* check the command type */ if (cp->intbufp[1] != AU_BLOCKRDY) { dbg ("invalid command type received: %d", cp->intbufp[1]); - return; + goto exit; } /* now extract the information */ @@ -1047,13 +1056,13 @@ /* check the channel id */ if (channelid >= AUH_TYPESIZE) { dbg ("invalid channel id received: %d", channelid); - return; + goto exit; } /* check the byte count */ if (bytecount > (cp->maxControlLength+AUH_SIZE)) { dbg ("invalid byte count received: %d", bytecount); - return; + goto exit; } dbg ("Service Channel = %d", channelid); dbg ("Byte Count = %d", bytecount); @@ -1077,7 +1086,7 @@ The only real solution is: having enought buffers! Or perhaps temporary disabling the int endpoint? */ - return; + goto exit; } /* fill the control message */ @@ -1098,6 +1107,11 @@ auerswald_ctrlread_complete( bp->urbp); /* here applies the same problem as above: device locking! */ } +exit: + ret = usb_submit_urb (urb, GFP_ATOMIC); + if (ret) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, ret); } /* int memory deallocation diff -Nru a/drivers/usb/misc/brlvger.c b/drivers/usb/misc/brlvger.c --- a/drivers/usb/misc/brlvger.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/misc/brlvger.c Mon Oct 28 16:32:37 2002 @@ -846,14 +846,21 @@ { struct brlvger_priv *priv = urb->context; int intr_idx, read_idx; + int status; - if( urb->status ) { - if(urb->status == -ETIMEDOUT) - dbg2("Status -ETIMEDOUT, " - "probably disconnected"); - else if(urb->status != -ENOENT) - err("Status: %d", urb->status); + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; } read_idx = atomic_read(&priv->read_idx); @@ -862,7 +869,7 @@ if(read_idx == intr_idx) { dbg2("Queue full, dropping braille display input"); spin_unlock(&priv->intr_idx_lock); - return; /* queue full */ + goto exit; /* queue full */ } memcpy(priv->event_queue[intr_idx], urb->transfer_buffer, @@ -873,6 +880,12 @@ spin_unlock(&priv->intr_idx_lock); wake_up_interruptible(&priv->read_wait); + +exit: + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, status); } /* ----------------------------------------------------------------------- */ diff -Nru a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c --- a/drivers/usb/misc/usbtest.c Mon Oct 28 16:32:38 2002 +++ b/drivers/usb/misc/usbtest.c Mon Oct 28 16:32:38 2002 @@ -449,7 +449,10 @@ if (udev->descriptor.bNumConfigurations != 1) { int expected = udev->actconfig->bConfigurationValue; - /* [9.4.2] get_configuration always works */ + /* [9.4.2] get_configuration always works + * ... although some cheap devices (like one TI Hub I've got) + * won't return config descriptors except before set_config. + */ retval = usb_control_msg (udev, usb_rcvctrlpipe (udev, 0), USB_REQ_GET_CONFIGURATION, USB_RECIP_DEVICE, 0, 0, dev->buf, 1, HZ * USB_CTRL_GET_TIMEOUT); @@ -543,6 +546,10 @@ /*-------------------------------------------------------------------------*/ +// control queueing !! + +/*-------------------------------------------------------------------------*/ + /* We only have this one interface to user space, through usbfs. * User mode code can scan usbfs to find N different devices (maybe on * different busses) to use when testing, and allocate one thread per @@ -839,14 +846,6 @@ dev->out_pipe = usb_sndintpipe (udev, info->ep_out); wtest = " intr-out"; } - -#if 1 - // FIXME disabling this until we finally get rid of - // interrupt "automagic" resubmission - dbg ("%s: no interrupt transfers for now", dev->id); - kfree (dev); - return -ENODEV; -#endif } else { if (info->ep_in) { dev->in_pipe = usb_rcvbulkpipe (udev, info->ep_in); diff -Nru a/drivers/usb/net/catc.c b/drivers/usb/net/catc.c --- a/drivers/usb/net/catc.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/net/catc.c Mon Oct 28 16:32:36 2002 @@ -308,9 +308,17 @@ linksts = LinkBad; } - if (urb->status) { - dbg("irq_done, status %d, data %02x %02x.", urb->status, data[0], data[1]); + switch (urb->status) { + case 0: /* success */ + break; + case -ECONNRESET: /* unlink */ + case -ENOENT: + case -ESHUTDOWN: return; + /* -EPIPE: should clear the halt */ + default: /* error */ + dbg("irq_done, status %d, data %02x %02x.", urb->status, data[0], data[1]); + goto resubmit; } if (linksts == LinkGood) { @@ -334,6 +342,12 @@ } } } +resubmit: + status = usb_submit_urb (urb, SLAB_ATOMIC); + if (status) + err ("can't resubmit intr, %s-%s, status %d", + catc->usbdev->bus->bus_name, + catc->usbdev->devpath, status); } /* diff -Nru a/drivers/usb/net/kaweth.c b/drivers/usb/net/kaweth.c --- a/drivers/usb/net/kaweth.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/net/kaweth.c Mon Oct 28 16:32:37 2002 @@ -471,12 +471,24 @@ static void int_callback(struct urb *u) { struct kaweth_device *kaweth = u->context; - int act_state; + int act_state, status; /* we abuse the interrupt urb for rebsubmitting under low memory saving a timer */ if (kaweth->suspend_lowmem) kaweth_resubmit_rx_urb(kaweth, GFP_ATOMIC); + switch (u->status) { + case 0: /* success */ + break; + case -ECONNRESET: /* unlink */ + case -ENOENT: + case -ESHUTDOWN: + return; + /* -EPIPE: should clear the halt */ + default: /* error */ + goto resubmit; + } + /* we check the link state to report changes */ if (kaweth->linkstate != (act_state = ( kaweth->intbuffer[STATE_OFFSET] | STATE_MASK) >> STATE_SHIFT)) { if (!act_state) @@ -486,7 +498,12 @@ kaweth->linkstate = act_state; } - +resubmit: + status = usb_submit_urb (u, SLAB_ATOMIC); + if (status) + err ("can't resubmit intr, %s-%s, status %d", + kaweth->dev->bus->bus_name, + kaweth->dev->devpath, status); } /**************************************************************** diff -Nru a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c --- a/drivers/usb/net/pegasus.c Mon Oct 28 16:32:38 2002 +++ b/drivers/usb/net/pegasus.c Mon Oct 28 16:32:38 2002 @@ -670,6 +670,7 @@ pegasus_t *pegasus = urb->context; struct net_device *net; __u8 *d; + int status; if (!pegasus) return; @@ -677,7 +678,9 @@ switch (urb->status) { case 0: break; + case -ECONNRESET: /* unlink */ case -ENOENT: + case -ESHUTDOWN: return; default: info("intr status %d", urb->status); @@ -700,6 +703,11 @@ netif_carrier_on(net); } } + + status = usb_submit_urb (urb, SLAB_ATOMIC); + if (status) + err ("%s: can't resubmit interrupt urb, %d", + net->name, status); } static void pegasus_tx_timeout(struct net_device *net) diff -Nru a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c --- a/drivers/usb/net/rtl8150.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/net/rtl8150.c Mon Oct 28 16:32:37 2002 @@ -454,18 +454,32 @@ void intr_callback(struct urb *urb) { rtl8150_t *dev; + int status; dev = urb->context; if (!dev) return; switch (urb->status) { - case 0: + case 0: /* success */ break; + case -ECONNRESET: /* unlink */ case -ENOENT: + case -ESHUTDOWN: return; + /* -EPIPE: should clear the halt */ default: info("%s: intr status %d", dev->netdev->name, urb->status); + goto resubmit; } + + /* FIXME if this doesn't do anything, don't submit the urb! */ + +resubmit: + status = usb_submit_urb (urb, SLAB_ATOMIC); + if (status) + err ("can't resubmit intr, %s-%s/input0, status %d", + dev->udev->bus->bus_name, + dev->udev->devpath, status); } /* diff -Nru a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c --- a/drivers/usb/net/usbnet.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/net/usbnet.c Mon Oct 28 16:32:37 2002 @@ -1,6 +1,21 @@ /* * USB Host-to-Host Links * Copyright (C) 2000-2002 by David Brownell + * Copyright (C) 2002 Pavel Machek + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* @@ -18,13 +33,15 @@ * - Belkin, eTEK (interops with Win32 drivers) * - EPSON USB clients * - GeneSys GL620USB-A - * - "Linux Devices" (like iPaq and similar SA-1100 based PDAs) * - NetChip 1080 (interoperates with NetChip Win32 drivers) * - Prolific PL-2301/2302 (replaces "plusb" driver) + * - SA-1100 based Linux PDAs like iPaq, Yopy, and Zaurus * * USB devices can implement their side of this protocol at the cost * of two bulk endpoints; it's not restricted to "cable" applications. - * See the LINUXDEV or EPSON device/client support. + * See the SA1110, Zaurus, or EPSON device/client support in this driver; + * slave/target drivers such as "usb-eth" (on most SA-1100 PDAs) are + * used inside USB slave/target devices. * * * Status: @@ -37,10 +54,6 @@ * handshaking; it'd be worth implementing those as "carrier detect". * Prefer generic hooks, not minidriver-specific hacks. * - * - Linux devices ... the www.handhelds.org SA-1100 support works nicely, - * but the Sharp Zaurus uses an incompatible protocol (extra checksums). - * No reason not to merge the Zaurus protocol here too (got patch? :) - * * - For Netchip, should use keventd to poll via control requests to detect * hardware level "carrier detect". * @@ -48,11 +61,14 @@ * sheets, sometimes it's not needed and sometimes it hangs. Prolific has * not responded to repeated support/information requests. * + * - SA-1100 PDAs ... the www.handhelds.org SA-1100 support works nicely. + * Zaurus support has some problems; it's made UHCI die. + * * Interop with more Win32 drivers may be a good thing. * * Seems like reporting "peer connected" (carrier present) events may end - * up going through the netlink event system, not hotplug ... that may be - * awkward in terms of automatic configuration though. + * up going through the netlink event system, not hotplug ... so new links + * would likely be handled with a link monitoring thread in some daemon. * * There are reports that bridging gives lower-than-usual throughput. * @@ -100,6 +116,7 @@ * 07-may-2002 Generalize/cleanup keventd support, handling rx stalls (mostly * for USB 2.0 TTs) and memory shortages (potential) too. (db) * Use "locally assigned" IEEE802 address space. (Brad Hards) + * 18-oct-2002 Support for Zaurus (Pavel Machek), related cleanup (db). * *-------------------------------------------------------------------------*/ @@ -131,12 +148,13 @@ #define CONFIG_USB_BELKIN #define CONFIG_USB_EPSON2888 #define CONFIG_USB_GENESYS -#define CONFIG_USB_LINUXDEV #define CONFIG_USB_NET1080 #define CONFIG_USB_PL2301 +#define CONFIG_USB_SA1110 +#define CONFIG_USB_ZAURUS -#define DRIVER_VERSION "17-Jul-2002" +#define DRIVER_VERSION "18-Oct-2002" /*-------------------------------------------------------------------------*/ @@ -337,7 +355,7 @@ * * EPSON USB clients * - * This is the same idea as "linuxdev" (below) except the firmware in the + * This is the same idea as Linux PDAs (below) except the firmware in the * device might not be Tux-powered. Epson provides reference firmware that * implements this interface. Product developers can reuse or modify that * code, such as by using their own product and vendor codes. @@ -431,10 +449,24 @@ { int status = urb->status; + switch (status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, status); + return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + } + + status = usb_submit_urb (urb, GFP_ATOMIC); if (status) - dbg ("gl_interrupt_complete fail - %X", status); - else - dbg ("gl_interrupt_complete success..."); + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, status); } static int gl_interrupt_read (struct usbnet *dev) @@ -674,34 +706,6 @@ -#ifdef CONFIG_USB_LINUXDEV - -/*------------------------------------------------------------------------- - * - * This could talk to a device that uses Linux, such as a PDA or - * an embedded system, or in fact to any "smart" device using this - * particular mapping of USB and Ethernet. - * - * Such a Linux host would need a "USB Device Controller" hardware - * (not "USB Host Controller"), and a network driver talking to that - * hardware. - * - * One example is Intel's SA-1100 chip, which integrates basic USB - * support (arch/arm/sa1100/usb-eth.c); it's used in the iPaq PDA. - * And others too, like the Yopy. - * - *-------------------------------------------------------------------------*/ - -static const struct driver_info linuxdev_info = { - .description = "Linux Device", - - .in = 2, .out = 1, - .epsize = 64, -}; - -#endif /* CONFIG_USB_LINUXDEV */ - - #ifdef CONFIG_USB_NET1080 /*------------------------------------------------------------------------- @@ -1220,6 +1224,146 @@ +#ifdef CONFIG_USB_SA1100 + +/*------------------------------------------------------------------------- + * + * Intel's SA-1100 chip integrates basic USB support, and is used + * in PDAs like some iPaqs, the Yopy, some Zaurus models, and more. + * When they runs Linux, arch/arm/sa1100/usb-eth.c may be used to + * network using minimal USB framing data. + * + * This describes the driver currently in www.handhelds.org kernels. + * The Zaurus uses a different driver (see later). + * + *-------------------------------------------------------------------------*/ + +static const struct driver_info linuxdev_info = { + .description = "SA-1100 Linux Device", + + .in = 2, .out = 1, + .epsize = 64, +}; + +static const struct driver_info yopy_info = { + .description = "Yopy", + + .in = 2, .out = 1, + .epsize = 64, +}; + +#endif /* CONFIG_USB_SA1100 */ + + +#ifdef CONFIG_USB_ZAURUS + +/*------------------------------------------------------------------------- + * + * Zaurus is also a SA-1110 based PDA, but one using a different driver + * for its USB slave/target controller than the case above. + * + * The key differences are that (a) it's got a msft-friendly configuration, + * and (b) the linux-friendly framing adds a crc32 to cope with some + * memory corruption observed with usb-to-memory DMA in some cases. + * + *-------------------------------------------------------------------------*/ + +static const u32 crc32_table [256] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +#define CRC32_INITFCS 0xffffffff // Initial FCS value +#define CRC32_FCS(fcs, c) (((fcs) >> 8) ^ crc32_table[((fcs) ^ (c)) & 0xff]) + +/* fcs_compute32 - memcpy and calculate fcs + * Perform a memcpy and calculate fcs using ppp 32bit CRC algorithm. + */ +static inline u32 fcs_compute32 (unsigned char *sp, int len, u32 fcs) +{ + for (;len-- > 0; fcs = CRC32_FCS (fcs, *sp++)) + continue; + return fcs; +} + +static struct sk_buff * +zaurus_tx_fixup (struct usbnet *dev, struct sk_buff *skb, int flags) +{ + int padlen; + struct sk_buff *skb2; + + padlen = 2; + if (!skb_cloned (skb)) { + int tailroom = skb_tailroom (skb); + if ((padlen + 4) <= tailroom) + goto done; + } + skb2 = skb_copy_expand (skb, 0, 4 + padlen, flags); + dev_kfree_skb_any (skb); + skb = skb2; + if (skb) { + u32 fcs; +done: + fcs = fcs_compute32 (skb->data, skb->len, CRC32_INITFCS); + fcs = ~fcs; + + // ? add optional byte make addr even ? + + *skb_put (skb, 1) = fcs & 0xff; + *skb_put (skb, 1) = (fcs>> 8) & 0xff; + *skb_put (skb, 1) = (fcs>>16) & 0xff; + *skb_put (skb, 1) = (fcs>>24) & 0xff; + } + return skb; +} + +static const struct driver_info zaurus_sl5x00_info = { + .description = "Sharp Zaurus SL-5x00", + .tx_fixup = zaurus_tx_fixup, + + .in = 2, .out = 1, + .epsize = 64, +}; +static const struct driver_info zaurus_sla300_info = { + .description = "Sharp Zaurus SL-A300", + .tx_fixup = zaurus_tx_fixup, + + .in = 1, .out = 2, + .epsize = 64, +}; +#endif + + /*------------------------------------------------------------------------- * * Network Device Driver (peer link to "Host Device", from USB host) @@ -1654,7 +1798,7 @@ /* could also map RINGPARAM to RX/TX QLEN */ } - /* Note that the ethtool user space code requires EOPNOTSUPP */ + /* Note that the ethtool user space code requires EOPNOTSUPP */ return -EOPNOTSUPP; } @@ -2043,6 +2187,16 @@ xdev->bus->bus_name, xdev->devpath, dev->driver_info->description); +#ifdef CONFIG_USB_ZAURUS + if (dev->driver_info == &zaurus_sl5x00_info) { + int status; + status = usb_set_configuration (xdev, 1); + devinfo (dev, "set config --> %d", status); + status = usb_set_interface (xdev, 1, 1); + devinfo (dev, "set altsetting --> %d", status); + } +#endif + // ok, it's ready to go. dev_set_drvdata (&udev->dev, net); mutex_lock (&usbnet_mutex); @@ -2106,23 +2260,6 @@ */ #endif -#ifdef CONFIG_USB_LINUXDEV -/* - * for example, this can be a host side talk-to-PDA driver. - * this driver is NOT what runs _inside_ a Linux device !! - */ -{ - // 1183 = 0x049F, both used as hex values? - USB_DEVICE (0x049F, 0x505A), // Compaq "Itsy" - .driver_info = (unsigned long) &linuxdev_info, -}, { - USB_DEVICE (0x0E7E, 0x1001), // G.Mate "Yopy" - .driver_info = (unsigned long) &linuxdev_info, -}, - // NOTE: the Sharp Zaurus uses a modified version of - // this driver, which is not interoperable with this. -#endif - #ifdef CONFIG_USB_NET1080 { USB_DEVICE (0x0525, 0x1080), // NetChip ref design @@ -2140,6 +2277,49 @@ }, { USB_DEVICE (0x067b, 0x0001), // PL-2302 .driver_info = (unsigned long) &prolific_info, +}, +#endif + +#ifdef CONFIG_USB_SA1100 +/* + * SA-1100 using www.handhelds.org kernels, or compatible. + * Often used when talking to Linux PDAs (iPaq, Yopy, etc). + * The sa-1100 "usb-eth" driver handles the basic framing. + */ +{ + // 1183 = 0x049F, both used as hex values? + USB_DEVICE (0x049F, 0x505A), // iPaq: Compaq "Itsy" + .driver_info = (unsigned long) &linuxdev_info, +}, { + USB_DEVICE (0x0E7E, 0x1001), // G.Mate "Yopy" + .driver_info = (unsigned long) &yopy_info, +}, +#endif + +#ifdef CONFIG_USB_ZAURUS +/* + * SA-1100 based Sharp Zaurus ("collie"), or compatible. + * Same idea as above, but different framing. + */ +{ + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO + | USB_DEVICE_ID_MATCH_DEVICE, + .idVendor = 0x04DD, + .idProduct = 0x8004, + .bInterfaceClass = 0x0a, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .driver_info = (unsigned long) &zaurus_sl5x00_info, +}, +{ + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO + | USB_DEVICE_ID_MATCH_DEVICE, + .idVendor = 0x04DD, + .idProduct = 0x8005, + .bInterfaceClass = 0x02, + .bInterfaceSubClass = 0x0a, + .bInterfaceProtocol = 0x00, + .driver_info = (unsigned long) &zaurus_sla300_info, }, #endif diff -Nru a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c --- a/drivers/usb/serial/belkin_sa.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/serial/belkin_sa.c Mon Oct 28 16:32:37 2002 @@ -258,11 +258,23 @@ struct belkin_sa_private *priv; struct usb_serial *serial; unsigned char *data = urb->transfer_buffer; + int retval; - /* the urb might have been killed. */ - if (urb->status) + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; - + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; + } + if (port_paranoia_check (port, __FUNCTION__)) return; serial = port->serial; @@ -321,8 +333,11 @@ } } #endif - - /* INT urbs are automatically re-submitted */ +exit: + retval = usb_submit_urb (urb, GFP_ATOMIC); + if (retval) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, retval); } static void belkin_sa_set_termios (struct usb_serial_port *port, struct termios *old_termios) diff -Nru a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c --- a/drivers/usb/serial/io_edgeport.c Mon Oct 28 16:32:35 2002 +++ b/drivers/usb/serial/io_edgeport.c Mon Oct 28 16:32:35 2002 @@ -772,9 +772,19 @@ return; } - if (urb->status) { - dbg("%s - nonzero control read status received: %d", __FUNCTION__, urb->status); + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; } // process this interrupt-read even if there are no ports open @@ -826,6 +836,12 @@ ++portNumber; } } + +exit: + result = usb_submit_urb (urb, GFP_ATOMIC); + if (result) { + err("%s - Error %d submitting control urb", __FUNCTION__, result); + } } @@ -1020,21 +1036,22 @@ edge_serial->bulk_out_endpoint = port0->bulk_out_endpointAddress; /* set up our interrupt urb */ - FILL_INT_URB(edge_serial->interrupt_read_urb, - serial->dev, - usb_rcvintpipe(serial->dev, - port0->interrupt_in_endpointAddress), - port0->interrupt_in_buffer, - edge_serial->interrupt_read_urb->transfer_buffer_length, - edge_interrupt_callback, edge_serial, - edge_serial->interrupt_read_urb->interval); + usb_fill_int_urb(edge_serial->interrupt_read_urb, + serial->dev, + usb_rcvintpipe(serial->dev, + port0->interrupt_in_endpointAddress), + port0->interrupt_in_buffer, + edge_serial->interrupt_read_urb->transfer_buffer_length, + edge_interrupt_callback, edge_serial, + edge_serial->interrupt_read_urb->interval); /* set up our bulk in urb */ - FILL_BULK_URB(edge_serial->read_urb, serial->dev, - usb_rcvbulkpipe(serial->dev, port0->bulk_in_endpointAddress), - port0->bulk_in_buffer, - edge_serial->read_urb->transfer_buffer_length, - edge_bulk_in_callback, edge_serial); + usb_fill_bulk_urb(edge_serial->read_urb, serial->dev, + usb_rcvbulkpipe(serial->dev, + port0->bulk_in_endpointAddress), + port0->bulk_in_buffer, + edge_serial->read_urb->transfer_buffer_length, + edge_bulk_in_callback, edge_serial); /* start interrupt read for this edgeport * this interrupt will continue as long as the edgeport is connected */ diff -Nru a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c --- a/drivers/usb/serial/io_ti.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/serial/io_ti.c Mon Oct 28 16:32:36 2002 @@ -1623,6 +1623,7 @@ int length = urb->actual_length; int port_number; int function; + int status; __u8 lsr; __u8 msr; @@ -1632,21 +1633,31 @@ return; } - if (urb->status) { - dbg("%s - nonzero control read status received: %d", __FUNCTION__, urb->status); + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; } if (!length) { dbg ("%s - no data in urb", __FUNCTION__); - return; + goto exit; } usb_serial_debug_data (__FILE__, __FUNCTION__, length, data); if (length != 2) { dbg ("%s - expecting packet of size 2, got %d", __FUNCTION__, length); - return; + goto exit; } port_number = TIUMP_GET_PORT_FROM_CODE (data[0]); @@ -1694,6 +1705,12 @@ break; } + +exit: + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, status); } static void edge_bulk_in_callback (struct urb *urb) @@ -1758,7 +1775,6 @@ exit: /* continue always trying to read */ - urb->dev = edge_port->port->serial->dev; status = usb_submit_urb (urb, GFP_ATOMIC); if (status) err ("%s - usb_submit_urb failed with result %d", diff -Nru a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c --- a/drivers/usb/serial/keyspan_pda.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/serial/keyspan_pda.c Mon Oct 28 16:32:37 2002 @@ -229,12 +229,25 @@ struct tty_struct *tty; unsigned char *data = urb->transfer_buffer; int i; + int status; struct keyspan_pda_private *priv; priv = (struct keyspan_pda_private *)(port->private); - /* the urb might have been killed. */ - if (urb->status) + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; + } + if (port_paranoia_check (port, "keyspan_pda_rx_interrupt")) { return; @@ -277,7 +290,11 @@ break; } - /* INT urbs are automatically re-submitted */ +exit: + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, status); } diff -Nru a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c --- a/drivers/usb/serial/mct_u232.c Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/serial/mct_u232.c Mon Oct 28 16:32:37 2002 @@ -521,15 +521,25 @@ struct usb_serial *serial = port->serial; struct tty_struct *tty; unsigned char *data = urb->transfer_buffer; + int status; dbg("%s - port %d", __FUNCTION__, port->number); - /* The urb might have been killed. */ - if (urb->status) { - dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, - urb->status); - return; - } + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); + return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; + } + if (!serial) { dbg("%s - bad serial pointer, exiting", __FUNCTION__); return; @@ -549,8 +559,7 @@ } tty_flip_buffer_push(tty); } - /* INT urbs are automatically re-submitted */ - return; + goto exit; } /* @@ -587,8 +596,11 @@ } } #endif - - /* INT urbs are automatically re-submitted */ +exit: + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, status); } /* mct_u232_read_int_callback */ diff -Nru a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c --- a/drivers/usb/serial/pl2303.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/serial/pl2303.c Mon Oct 28 16:32:36 2002 @@ -592,25 +592,36 @@ struct usb_serial_port *port = (struct usb_serial_port *) urb->context; struct usb_serial *serial = get_usb_serial (port, __FUNCTION__); //unsigned char *data = urb->transfer_buffer; - //int i; + int status; -//ints auto restart... - - if (!serial) { + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); return; + default: + dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); + goto exit; } - if (urb->status) { - urb->status = 0; + if (!serial) { return; } usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, urb->transfer_buffer); -#if 0 -//FIXME need to update state of terminal lines variable -#endif - return; + //FIXME need to update state of terminal lines variable + +exit: + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, status); } diff -Nru a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c --- a/drivers/usb/serial/visor.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/serial/visor.c Mon Oct 28 16:32:36 2002 @@ -190,6 +190,7 @@ { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_0_ID) }, { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_S360_ID) }, { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_1_ID) }, + { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID) }, { } /* Terminating entry */ }; @@ -211,6 +212,7 @@ { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_0_ID) }, { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_S360_ID) }, { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_1_ID) }, + { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID) }, { } /* Terminating entry */ }; diff -Nru a/drivers/usb/serial/visor.h b/drivers/usb/serial/visor.h --- a/drivers/usb/serial/visor.h Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/serial/visor.h Mon Oct 28 16:32:36 2002 @@ -34,6 +34,7 @@ #define SONY_CLIE_4_0_ID 0x0066 #define SONY_CLIE_S360_ID 0x0095 #define SONY_CLIE_4_1_ID 0x009A +#define SONY_CLIE_NX60_ID 0x00DA /**************************************************************************** * Handspring Visor Vendor specific request codes (bRequest values) diff -Nru a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c --- a/drivers/usb/serial/whiteheat.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/serial/whiteheat.c Mon Oct 28 16:32:36 2002 @@ -446,19 +446,6 @@ if (retval) goto exit; - /* Work around HCD bugs */ - usb_clear_halt(port->serial->dev, port->read_urb->pipe); - usb_clear_halt(port->serial->dev, port->write_urb->pipe); - - /* Start reading from the device */ - port->read_urb->dev = port->serial->dev; - retval = usb_submit_urb(port->read_urb, GFP_KERNEL); - if (retval) { - err("%s - failed submitting read urb, error %d", __FUNCTION__, retval); - stop_command_port(port->serial); - goto exit; - } - /* send an open port command */ retval = firm_open(port); if (retval) { @@ -477,15 +464,15 @@ old_term.c_iflag = ~port->tty->termios->c_iflag; whiteheat_set_termios(port, &old_term); - retval = firm_set_rts(port, WHITEHEAT_RTS_ON); - if (retval) { - firm_close(port); - stop_command_port(port->serial); - goto exit; - } - retval = firm_set_dtr(port, WHITEHEAT_DTR_ON); + /* Work around HCD bugs */ + usb_clear_halt(port->serial->dev, port->read_urb->pipe); + usb_clear_halt(port->serial->dev, port->write_urb->pipe); + + /* Start reading from the device */ + port->read_urb->dev = port->serial->dev; + retval = usb_submit_urb(port->read_urb, GFP_KERNEL); if (retval) { - firm_set_rts(port, WHITEHEAT_RTS_OFF); + err("%s - failed submitting read urb, error %d", __FUNCTION__, retval); firm_close(port); stop_command_port(port->serial); goto exit; @@ -525,9 +512,6 @@ firm_report_tx_done(port); - firm_set_dtr(port, WHITEHEAT_DTR_OFF); - firm_set_rts(port, WHITEHEAT_RTS_OFF); - firm_close(port); /* shutdown our bulk reads and writes */ @@ -711,7 +695,7 @@ /* check that they really want us to change something */ if (old_termios) { if ((port->tty->termios->c_cflag == old_termios->c_cflag) && - (RELEVANT_IFLAG(port->tty->termios->c_iflag) == RELEVANT_IFLAG(old_termios->c_iflag))) { + (port->tty->termios->c_iflag == old_termios->c_iflag)) { dbg("%s - nothing to change...", __FUNCTION__); goto exit; } diff -Nru a/drivers/usb/serial/whiteheat_fw.h b/drivers/usb/serial/whiteheat_fw.h --- a/drivers/usb/serial/whiteheat_fw.h Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/serial/whiteheat_fw.h Mon Oct 28 16:32:36 2002 @@ -50,7 +50,7 @@ }; static const struct whiteheat_hex_record whiteheat_firmware[] = { -{ 0x0000, 3, {0x02, 0x97, 0xaf} }, +{ 0x0000, 3, {0x02, 0x97, 0xe3} }, { 0x0003, 3, {0x02, 0x13, 0x12} }, { 0x000b, 3, {0x02, 0x0b, 0xb5} }, { 0x0033, 3, {0x02, 0x08, 0x1c} }, @@ -64,9 +64,9 @@ { 0x03c0, 16, {0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x0a, 0x99, 0xea, 0x49, 0x60, 0x0d} }, { 0x03d0, 16, {0xea, 0x90, 0x7f, 0xd4, 0xf0, 0xe9, 0x90, 0x7f, 0xd5, 0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xb4} }, { 0x03e0, 16, {0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xea, 0xe0, 0xff, 0x12, 0x0a, 0x58, 0xea} }, -{ 0x03f0, 16, {0x49, 0x60, 0x33, 0x12, 0xa2, 0x07, 0xf5, 0x4e, 0x90, 0x7f, 0xee, 0xe0, 0xff, 0xe5, 0x4e, 0xd3} }, +{ 0x03f0, 16, {0x49, 0x60, 0x33, 0x12, 0xa2, 0x3b, 0xf5, 0x4e, 0x90, 0x7f, 0xee, 0xe0, 0xff, 0xe5, 0x4e, 0xd3} }, { 0x0400, 16, {0x9f, 0x40, 0x03, 0xe0, 0xf5, 0x4e, 0xe5, 0x4e, 0xd3, 0x94, 0x40, 0x40, 0x03, 0x75, 0x4e, 0x40} }, -{ 0x0410, 16, {0xae, 0x02, 0xaf, 0x01, 0x7c, 0x7f, 0x7d, 0x00, 0xab, 0x4e, 0x12, 0x91, 0x03, 0x90, 0x7f, 0xb5} }, +{ 0x0410, 16, {0xae, 0x02, 0xaf, 0x01, 0x7c, 0x7f, 0x7d, 0x00, 0xab, 0x4e, 0x12, 0x91, 0x37, 0x90, 0x7f, 0xb5} }, { 0x0420, 16, {0xe5, 0x4e, 0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa5} }, { 0x0430, 16, {0x90, 0x7f, 0xb4, 0xe0, 0x44, 0x01, 0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0x00, 0xe5, 0x21, 0xf0} }, { 0x0440, 16, {0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x05, 0xa5, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x21, 0x02} }, @@ -108,7 +108,7 @@ { 0x066d, 16, {0x74, 0x01, 0x93, 0x90, 0x01, 0x1c, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0x01, 0x1c, 0xe0, 0xff} }, { 0x067d, 16, {0xa3, 0xe0, 0xfe, 0xef, 0x6e, 0xff, 0x90, 0x01, 0x1c, 0xf0, 0xa3, 0xe0, 0x6f, 0xff, 0xf0, 0x90} }, { 0x068d, 16, {0x01, 0x1c, 0xe0, 0x6f, 0xf0, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe4, 0xfc, 0xfd, 0x75, 0x52, 0x10} }, -{ 0x069d, 16, {0x75, 0x53, 0x02, 0x75, 0x54, 0x12, 0x75, 0x55, 0xac, 0x12, 0x93, 0xf2, 0x75, 0x4c, 0x12, 0x75} }, +{ 0x069d, 16, {0x75, 0x53, 0x02, 0x75, 0x54, 0x12, 0x75, 0x55, 0xac, 0x12, 0x94, 0x26, 0x75, 0x4c, 0x12, 0x75} }, { 0x06ad, 16, {0x4d, 0xb2, 0x90, 0x01, 0x0d, 0xe0, 0xff, 0x05, 0x4d, 0xe5, 0x4d, 0xac, 0x4c, 0x70, 0x02, 0x05} }, { 0x06bd, 16, {0x4c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x90, 0x01, 0x0e, 0xe0, 0xff, 0x05, 0x4d, 0xe5} }, { 0x06cd, 16, {0x4d, 0xac, 0x4c, 0x70, 0x02, 0x05, 0x4c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x90, 0x7f} }, @@ -116,17 +116,17 @@ { 0x06ed, 16, {0x02, 0x05, 0x4c, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x05, 0x4d, 0xe5, 0x4d, 0xae, 0x4c} }, { 0x06fd, 16, {0x70, 0x02, 0x05, 0x4c, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe4, 0xf0, 0x75, 0x82, 0x10, 0x75, 0x83} }, { 0x070d, 16, {0x01, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x90, 0x01, 0x18, 0x12} }, -{ 0x071d, 16, {0xa3, 0xba, 0x7e, 0x01, 0x7f, 0x18, 0x12, 0x86, 0xbe, 0x90, 0x01, 0x18, 0xe0, 0xfc, 0xa3, 0xe0} }, +{ 0x071d, 16, {0xa3, 0xee, 0x7e, 0x01, 0x7f, 0x18, 0x12, 0x86, 0xbe, 0x90, 0x01, 0x18, 0xe0, 0xfc, 0xa3, 0xe0} }, { 0x072d, 16, {0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x75, 0x52, 0x0a, 0x75, 0x53, 0x06, 0x75, 0x54, 0x12} }, -{ 0x073d, 16, {0x75, 0x55, 0xb8, 0x12, 0x93, 0xf2, 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xab, 0x74, 0xff} }, +{ 0x073d, 16, {0x75, 0x55, 0xb8, 0x12, 0x94, 0x26, 0xd2, 0xe8, 0x43, 0xd8, 0x20, 0x90, 0x7f, 0xab, 0x74, 0xff} }, { 0x074d, 16, {0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaf, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x7f, 0xae, 0xe0, 0x44} }, { 0x075d, 16, {0x1f, 0xf0, 0xd2, 0xaf, 0x20, 0x01, 0x2e, 0x20, 0x01, 0x2b, 0xa2, 0x03, 0x92, 0x07, 0x12, 0x09} }, { 0x076d, 16, {0xc5, 0x75, 0x46, 0x50, 0x75, 0x45, 0x6d, 0x75, 0x44, 0x33, 0x75, 0x43, 0x00, 0x20, 0x01, 0xe4} }, -{ 0x077d, 16, {0x7f, 0xff, 0x7e, 0xff, 0x7d, 0xff, 0x7c, 0xff, 0x78, 0x43, 0x12, 0xa3, 0xa3, 0xec, 0x4d, 0x4e} }, +{ 0x077d, 16, {0x7f, 0xff, 0x7e, 0xff, 0x7d, 0xff, 0x7c, 0xff, 0x78, 0x43, 0x12, 0xa3, 0xd7, 0xec, 0x4d, 0x4e} }, { 0x078d, 16, {0x4f, 0x60, 0xd1, 0x80, 0xe8, 0x30, 0x01, 0x05, 0x12, 0x03, 0x70, 0xc2, 0x01, 0x30, 0x06, 0x0a} }, -{ 0x079d, 16, {0x12, 0x09, 0xfb, 0x50, 0x03, 0x12, 0x0a, 0xe8, 0xc2, 0x06, 0x12, 0x96, 0x2a, 0x90, 0x01, 0xbd} }, -{ 0x07ad, 16, {0xe0, 0x60, 0x0c, 0x12, 0x91, 0xcd, 0xe4, 0x90, 0x01, 0xbd, 0xf0, 0x90, 0x7f, 0xd3, 0xf0, 0x90} }, -{ 0x07bd, 16, {0x02, 0xaf, 0xe0, 0xb4, 0x0f, 0x03, 0x12, 0x99, 0x85, 0x12, 0xa0, 0x61, 0xe4, 0xff, 0x74, 0x01} }, +{ 0x079d, 16, {0x12, 0x09, 0xfb, 0x50, 0x03, 0x12, 0x0a, 0xe8, 0xc2, 0x06, 0x12, 0x96, 0x5e, 0x90, 0x01, 0xbd} }, +{ 0x07ad, 16, {0xe0, 0x60, 0x0c, 0x12, 0x92, 0x01, 0xe4, 0x90, 0x01, 0xbd, 0xf0, 0x90, 0x7f, 0xd3, 0xf0, 0x90} }, +{ 0x07bd, 16, {0x02, 0xaf, 0xe0, 0xb4, 0x0f, 0x03, 0x12, 0x99, 0xb9, 0x12, 0xa0, 0x95, 0xe4, 0xff, 0x74, 0x01} }, { 0x07cd, 16, {0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xfe, 0x90, 0x01, 0xbc, 0xe0, 0x5e, 0x60} }, { 0x07dd, 16, {0x14, 0x74, 0x28, 0x2f, 0xf8, 0xe6, 0xd3, 0x94, 0x0a, 0x40, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e} }, { 0x07ed, 16, {0x00, 0x8e, 0x4b, 0x80, 0x03, 0x75, 0x4b, 0x01, 0x74, 0x68, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x20} }, @@ -176,13 +176,13 @@ { 0x0a50, 8, {0x02, 0x0f, 0x4b, 0x00, 0x02, 0x0f, 0x61, 0x00} }, { 0x0a58, 2, {0x8f, 0x4f} }, { 0x0a5a, 16, {0xe4, 0xf5, 0x50, 0x75, 0x51, 0xff, 0x75, 0x52, 0x12, 0x75, 0x53, 0x6a, 0xab, 0x51, 0xaa, 0x52} }, -{ 0x0a6a, 16, {0xa9, 0x53, 0x90, 0x00, 0x01, 0x12, 0xa2, 0x20, 0xb4, 0x03, 0x1d, 0xaf, 0x50, 0x05, 0x50, 0xef} }, -{ 0x0a7a, 16, {0xb5, 0x4f, 0x01, 0x22, 0x12, 0xa2, 0x07, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75} }, +{ 0x0a6a, 16, {0xa9, 0x53, 0x90, 0x00, 0x01, 0x12, 0xa2, 0x54, 0xb4, 0x03, 0x1d, 0xaf, 0x50, 0x05, 0x50, 0xef} }, +{ 0x0a7a, 16, {0xb5, 0x4f, 0x01, 0x22, 0x12, 0xa2, 0x3b, 0x7e, 0x00, 0x29, 0xff, 0xee, 0x3a, 0xa9, 0x07, 0x75} }, { 0x0a8a, 14, {0x51, 0xff, 0xf5, 0x52, 0x89, 0x53, 0x80, 0xd4, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} }, { 0x0a98, 1, {0x22} }, { 0x0a99, 16, {0xe4, 0xfe, 0x75, 0x51, 0xff, 0x75, 0x52, 0x12, 0x75, 0x53, 0x12, 0xab, 0x51, 0xaa, 0x52, 0xa9} }, -{ 0x0aa9, 16, {0x53, 0x90, 0x00, 0x01, 0x12, 0xa2, 0x20, 0x64, 0x02, 0x70, 0x2d, 0xad, 0x06, 0x0e, 0xed, 0xb5} }, -{ 0x0ab9, 16, {0x07, 0x01, 0x22, 0x90, 0x00, 0x02, 0x12, 0xa2, 0x79, 0x85, 0xf0, 0x4f, 0xf5, 0x50, 0x62, 0x4f} }, +{ 0x0aa9, 16, {0x53, 0x90, 0x00, 0x01, 0x12, 0xa2, 0x54, 0x64, 0x02, 0x70, 0x2d, 0xad, 0x06, 0x0e, 0xed, 0xb5} }, +{ 0x0ab9, 16, {0x07, 0x01, 0x22, 0x90, 0x00, 0x02, 0x12, 0xa2, 0xad, 0x85, 0xf0, 0x4f, 0xf5, 0x50, 0x62, 0x4f} }, { 0x0ac9, 16, {0xe5, 0x4f, 0x62, 0x50, 0xe5, 0x50, 0x62, 0x4f, 0x29, 0xfd, 0xe5, 0x4f, 0x3a, 0xa9, 0x05, 0x75} }, { 0x0ad9, 14, {0x51, 0xff, 0xf5, 0x52, 0x89, 0x53, 0x80, 0xc3, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x00} }, { 0x0ae7, 1, {0x22} }, @@ -194,7 +194,7 @@ { 0x0af1, 1, {0x32} }, { 0x0af2, 1, {0x32} }, { 0x0af3, 1, {0x32} }, -{ 0x0af4, 3, {0x00, 0x04, 0x06} }, +{ 0x0af4, 3, {0x00, 0x04, 0x07} }, { 0x0b00, 9, {0x90, 0x7f, 0xd6, 0xe0, 0x44, 0x80, 0xf0, 0x80, 0x74} }, { 0x0b7d, 16, {0x43, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22} }, { 0x0b8d, 16, {0x53, 0x8e, 0xf7, 0xe5, 0x89, 0x54, 0xf1, 0x44, 0x01, 0xf5, 0x89, 0x75, 0x8c, 0xb1, 0xd2, 0xa9} }, @@ -211,7 +211,7 @@ { 0x0c13, 15, {0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} }, { 0x0c22, 16, {0xd2, 0x00, 0x75, 0x8e, 0x10, 0x12, 0x09, 0x30, 0xe5, 0x33, 0xc3, 0x94, 0x01, 0x40, 0x08, 0x90} }, { 0x0c32, 16, {0x7f, 0x92, 0x74, 0x02, 0xf0, 0x80, 0x05, 0xe4, 0x90, 0x7f, 0x92, 0xf0, 0x12, 0x80, 0x00, 0x12} }, -{ 0x0c42, 12, {0x0f, 0x7d, 0x12, 0x94, 0xc3, 0x12, 0x1b, 0x0c, 0x12, 0x0b, 0x8d, 0x22} }, +{ 0x0c42, 12, {0x0f, 0x7d, 0x12, 0x94, 0xf7, 0x12, 0x1b, 0x0c, 0x12, 0x0b, 0x8d, 0x22} }, { 0x0c4e, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xd2, 0x01, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xab, 0x74, 0x01} }, { 0x0c5e, 8, {0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} }, { 0x0c66, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x7f, 0xc4, 0xe4, 0xf0, 0x53, 0x91, 0xef, 0x90, 0x7f} }, @@ -267,12 +267,12 @@ { 0x0f5b, 6, {0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} }, { 0x0f61, 16, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x53, 0x91, 0xef, 0x90, 0x7f, 0xaa, 0x74, 0x80, 0xf0, 0x90} }, { 0x0f71, 12, {0x01, 0xbd, 0x74, 0xff, 0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} }, -{ 0x0f7d, 16, {0x90, 0x01, 0x20, 0x12, 0xa3, 0xc6, 0x00, 0x00, 0x25, 0x80, 0x90, 0x01, 0x24, 0x74, 0x08, 0xf0} }, +{ 0x0f7d, 16, {0x90, 0x01, 0x20, 0x12, 0xa3, 0xfa, 0x00, 0x00, 0x25, 0x80, 0x90, 0x01, 0x24, 0x74, 0x08, 0xf0} }, { 0x0f8d, 16, {0xa3, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x6e, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x13, 0xf0, 0xa3, 0x74} }, { 0x0f9d, 16, {0x11, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0xf0, 0x90, 0x01, 0x1e, 0xf0, 0x90, 0x01, 0x1e, 0xe0, 0xff} }, { 0x0fad, 16, {0x04, 0xa3, 0xf0, 0xef, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x01, 0xf9, 0x74, 0x03, 0x35, 0xf0, 0xa8} }, -{ 0x0fbd, 16, {0x01, 0xfc, 0x7d, 0x01, 0x7b, 0x01, 0x7a, 0x01, 0x79, 0x1f, 0x7e, 0x00, 0x7f, 0x0d, 0x12, 0xa1} }, -{ 0x0fcd, 16, {0xde, 0x7e, 0x01, 0x7f, 0x1f, 0x12, 0x87, 0xa6, 0x90, 0x01, 0x1e, 0xe0, 0x04, 0xf0, 0xe0, 0xc3} }, +{ 0x0fbd, 16, {0x01, 0xfc, 0x7d, 0x01, 0x7b, 0x01, 0x7a, 0x01, 0x79, 0x1f, 0x7e, 0x00, 0x7f, 0x0d, 0x12, 0xa2} }, +{ 0x0fcd, 16, {0x12, 0x7e, 0x01, 0x7f, 0x1f, 0x12, 0x87, 0xa6, 0x90, 0x01, 0x1e, 0xe0, 0x04, 0xf0, 0xe0, 0xc3} }, { 0x0fdd, 16, {0x94, 0x04, 0x40, 0xc7, 0xe4, 0xf5, 0x27, 0x90, 0x01, 0x1e, 0xf0, 0x90, 0x01, 0x1e, 0xe0, 0xff} }, { 0x0fed, 16, {0xc3, 0x94, 0x04, 0x50, 0x1a, 0x74, 0xf8, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe4} }, { 0x0ffd, 16, {0xf0, 0x74, 0x23, 0x2f, 0xf8, 0xe4, 0xf6, 0x90, 0x01, 0x1e, 0xe0, 0x04, 0xf0, 0x80, 0xdc, 0xe4} }, @@ -450,9 +450,9 @@ { 0x1a65, 16, {0x20, 0xf0, 0x19, 0x90, 0x7f, 0xa6, 0xe0, 0xf5, 0x59, 0x19, 0x80, 0x6a, 0xed, 0x24, 0x04, 0xf5} }, { 0x1a75, 16, {0x82, 0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0xfe, 0xa3, 0xe0, 0x64, 0x02, 0x4e, 0x70, 0x08, 0x90, 0x7f} }, { 0x1a85, 16, {0xa5, 0xe0, 0x44, 0x20, 0xf0, 0x19, 0x90, 0x7f, 0xa6, 0xe0, 0xff, 0xed, 0x24, 0x06, 0xf5, 0x82} }, -{ 0x1a95, 16, {0xe4, 0x3c, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x63, 0x85, 0xf0, 0x82, 0xf5, 0x83} }, +{ 0x1a95, 16, {0xe4, 0x3c, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5, 0x83} }, { 0x1aa5, 16, {0xef, 0xf0, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0x74, 0xff, 0xf5, 0xf0, 0x12} }, -{ 0x1ab5, 16, {0xa2, 0x4d, 0x80, 0x22, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xff} }, +{ 0x1ab5, 16, {0xa2, 0x81, 0x80, 0x22, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0xff} }, { 0x1ac5, 16, {0xed, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0xfa, 0xa3, 0xe0, 0xf5, 0x82, 0x8a} }, { 0x1ad5, 16, {0x83, 0xef, 0xf0, 0x7f, 0x08, 0x22, 0x90, 0x7f, 0xa5, 0xe0, 0xf5, 0x59, 0x30, 0xe0, 0xf7, 0x30} }, { 0x1ae5, 16, {0xe2, 0x07, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x06, 0x22, 0xe9, 0xd3, 0x94, 0x02, 0x50, 0x03, 0x02} }, @@ -462,14 +462,14 @@ { 0x1b0c, 16, {0xe5, 0x33, 0xc3, 0x94, 0x01, 0x50, 0x1c, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x7f, 0x02} }, { 0x1b1c, 16, {0x7d, 0xff, 0x12, 0x82, 0xea, 0x7f, 0x05, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x7f, 0x03, 0x7d, 0xff} }, { 0x1b2c, 4, {0x12, 0x82, 0xea, 0x22} }, -{ 0x8000, 16, {0x7b, 0xff, 0x7a, 0x12, 0x79, 0x1b, 0x90, 0x00, 0x04, 0x12, 0xa2, 0x20, 0xfd, 0x8b, 0x50, 0x75} }, +{ 0x8000, 16, {0x7b, 0xff, 0x7a, 0x12, 0x79, 0x1b, 0x90, 0x00, 0x04, 0x12, 0xa2, 0x54, 0xfd, 0x8b, 0x50, 0x75} }, { 0x8010, 16, {0x51, 0x12, 0x75, 0x52, 0x24, 0xe4, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x7f, 0xe0, 0xf0, 0xf5, 0x4e} }, { 0x8020, 16, {0xf5, 0x4f, 0x90, 0x02, 0xae, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xde, 0xf0, 0x90, 0x7f} }, { 0x8030, 16, {0xa9, 0x74, 0xff, 0xf0, 0x90, 0x7f, 0xaa, 0xf0, 0xe4, 0xfc, 0xec, 0x25, 0xe0, 0x24, 0xb4, 0xf5} }, { 0x8040, 16, {0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0x0c, 0xbc, 0x10, 0xee, 0xe4, 0x90, 0x7f, 0xdd} }, { 0x8050, 16, {0xf0, 0xaf, 0x05, 0x1d, 0xef, 0x70, 0x03, 0x02, 0x81, 0xc6, 0xab, 0x50, 0xaa, 0x51, 0xa9, 0x52} }, -{ 0x8060, 16, {0x90, 0x00, 0x01, 0x12, 0xa2, 0x20, 0x64, 0x05, 0x60, 0x03, 0x02, 0x81, 0xb5, 0x90, 0x00, 0x03} }, -{ 0x8070, 16, {0x12, 0xa2, 0x20, 0x64, 0x01, 0x60, 0x03, 0x02, 0x81, 0x3c, 0x90, 0x00, 0x02, 0x12, 0xa2, 0x20} }, +{ 0x8060, 16, {0x90, 0x00, 0x01, 0x12, 0xa2, 0x54, 0x64, 0x05, 0x60, 0x03, 0x02, 0x81, 0xb5, 0x90, 0x00, 0x03} }, +{ 0x8070, 16, {0x12, 0xa2, 0x54, 0x64, 0x01, 0x60, 0x03, 0x02, 0x81, 0x3c, 0x90, 0x00, 0x02, 0x12, 0xa2, 0x54} }, { 0x8080, 16, {0xff, 0x54, 0x7f, 0xfc, 0xd3, 0x94, 0x07, 0x50, 0x03, 0x02, 0x81, 0x16, 0xec, 0xc3, 0x94, 0x10} }, { 0x8090, 16, {0x40, 0x03, 0x02, 0x81, 0x16, 0xef, 0x30, 0xe7, 0x42, 0xe5, 0x4f, 0xae, 0x4e, 0x78, 0x02, 0xce} }, { 0x80a0, 16, {0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0x74, 0xf0, 0x2c, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5} }, @@ -479,11 +479,11 @@ { 0x80e0, 16, {0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0x74, 0xe8, 0x2c, 0xf5, 0x82, 0xe4, 0x34} }, { 0x80f0, 16, {0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x90, 0x7f, 0xe1, 0xe0, 0xff, 0xec, 0x24, 0xf8, 0xfe, 0x74, 0x01} }, { 0x8100, 16, {0xa8, 0x06, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x4f, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x02} }, -{ 0x8110, 16, {0xae, 0xe0, 0x04, 0xf0, 0x80, 0x03, 0x7f, 0xff, 0x22, 0x90, 0x00, 0x04, 0x12, 0xa2, 0x20, 0x25} }, -{ 0x8120, 16, {0x4f, 0xf5, 0x4f, 0xe4, 0x35, 0x4e, 0xf5, 0x4e, 0x90, 0x00, 0x05, 0x12, 0xa2, 0x20, 0xfe, 0xe4} }, +{ 0x8110, 16, {0xae, 0xe0, 0x04, 0xf0, 0x80, 0x03, 0x7f, 0xff, 0x22, 0x90, 0x00, 0x04, 0x12, 0xa2, 0x54, 0x25} }, +{ 0x8120, 16, {0x4f, 0xf5, 0x4f, 0xe4, 0x35, 0x4e, 0xf5, 0x4e, 0x90, 0x00, 0x05, 0x12, 0xa2, 0x54, 0xfe, 0xe4} }, { 0x8130, 16, {0x25, 0x4f, 0xf5, 0x4f, 0xee, 0x35, 0x4e, 0xf5, 0x4e, 0x02, 0x81, 0xb8, 0xab, 0x50, 0xaa, 0x51} }, -{ 0x8140, 16, {0xa9, 0x52, 0x90, 0x00, 0x03, 0x12, 0xa2, 0x20, 0xff, 0x64, 0x02, 0x60, 0x05, 0xef, 0x64, 0x03} }, -{ 0x8150, 16, {0x70, 0x60, 0x90, 0x00, 0x02, 0x12, 0xa2, 0x20, 0xff, 0x54, 0x7f, 0xfc, 0xd3, 0x94, 0x07, 0x50} }, +{ 0x8140, 16, {0xa9, 0x52, 0x90, 0x00, 0x03, 0x12, 0xa2, 0x54, 0xff, 0x64, 0x02, 0x60, 0x05, 0xef, 0x64, 0x03} }, +{ 0x8150, 16, {0x70, 0x60, 0x90, 0x00, 0x02, 0x12, 0xa2, 0x54, 0xff, 0x54, 0x7f, 0xfc, 0xd3, 0x94, 0x07, 0x50} }, { 0x8160, 16, {0x4e, 0xef, 0x30, 0xe7, 0x1e, 0x90, 0x7f, 0xde, 0xe0, 0xff, 0x74, 0x01, 0xa8, 0x04, 0x08, 0x80} }, { 0x8170, 16, {0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xfe, 0x4f, 0x90, 0x7f, 0xde, 0xf0, 0x90, 0x7f, 0xac, 0xe0, 0x4e} }, { 0x8180, 16, {0xf0, 0x80, 0x35, 0x90, 0x7f, 0xdf, 0xe0, 0xff, 0x74, 0x01, 0xa8, 0x04, 0x08, 0x80, 0x02, 0xc3} }, @@ -501,10 +501,10 @@ { 0x821d, 16, {0x80, 0x6c, 0x85, 0x5a, 0x82, 0x85, 0x59, 0x83, 0xe0, 0xc3, 0x94, 0x20, 0x40, 0x09, 0xa3, 0xa3} }, { 0x822d, 16, {0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x80, 0x57, 0x15, 0x5b, 0x85, 0x5a, 0x82, 0x85, 0x59, 0x83, 0xa3} }, { 0x823d, 16, {0xa3, 0xe0, 0xa3, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x80, 0x44, 0xe5, 0x5a, 0x24, 0x06, 0xf5, 0x82} }, -{ 0x824d, 16, {0xe4, 0x35, 0x59, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x63, 0x85, 0xf0, 0x82, 0xf5} }, +{ 0x824d, 16, {0xe4, 0x35, 0x59, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5} }, { 0x825d, 16, {0x83, 0xe0, 0x90, 0x7f, 0xa6, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0xe5, 0x5a, 0x24} }, -{ 0x826d, 16, {0x04, 0xf5, 0x82, 0xe4, 0x35, 0x59, 0xf5, 0x83, 0x74, 0xff, 0xf5, 0xf0, 0x12, 0xa2, 0x4d, 0x85} }, -{ 0x827d, 16, {0x5a, 0x82, 0x85, 0x59, 0x83, 0xa3, 0xa3, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x4d, 0x90, 0x7f} }, +{ 0x826d, 16, {0x04, 0xf5, 0x82, 0xe4, 0x35, 0x59, 0xf5, 0x83, 0x74, 0xff, 0xf5, 0xf0, 0x12, 0xa2, 0x81, 0x85} }, +{ 0x827d, 16, {0x5a, 0x82, 0x85, 0x59, 0x83, 0xa3, 0xa3, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x81, 0x90, 0x7f} }, { 0x828d, 16, {0xa5, 0xe0, 0xf5, 0x5c, 0x30, 0xe0, 0xf7, 0x30, 0xe2, 0x07, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x06} }, { 0x829d, 16, {0x22, 0xe5, 0x5c, 0x20, 0xe1, 0x0a, 0x90, 0x7f, 0xa5, 0xe0, 0x44, 0x40, 0xf0, 0x7f, 0x07, 0x22} }, { 0x82ad, 16, {0xe5, 0x5b, 0x70, 0x31, 0x7f, 0x01, 0x7e, 0x00, 0x12, 0x09, 0xae, 0x90, 0x7f, 0xa5, 0xe0, 0x44} }, @@ -533,8 +533,8 @@ { 0x83de, 1, {0x22} }, { 0x83df, 4, {0x8f, 0x61, 0x8d, 0x62} }, { 0x83e3, 16, {0xe4, 0xf5, 0x67, 0x74, 0x3f, 0x2f, 0xf8, 0x76, 0x08, 0x7f, 0x80, 0x7e, 0x25, 0x7d, 0x00, 0x7c} }, -{ 0x83f3, 16, {0x00, 0xab, 0x66, 0xaa, 0x65, 0xa9, 0x64, 0xa8, 0x63, 0xd3, 0x12, 0xa3, 0x7f, 0x40, 0x26, 0x7f} }, -{ 0x8403, 16, {0x00, 0x7e, 0x96, 0x7d, 0x00, 0x7c, 0x00, 0xa8, 0x63, 0xd3, 0x12, 0xa3, 0x7f, 0x50, 0x0c, 0x75} }, +{ 0x83f3, 16, {0x00, 0xab, 0x66, 0xaa, 0x65, 0xa9, 0x64, 0xa8, 0x63, 0xd3, 0x12, 0xa3, 0xb3, 0x40, 0x26, 0x7f} }, +{ 0x8403, 16, {0x00, 0x7e, 0x96, 0x7d, 0x00, 0x7c, 0x00, 0xa8, 0x63, 0xd3, 0x12, 0xa3, 0xb3, 0x50, 0x0c, 0x75} }, { 0x8413, 16, {0x67, 0x40, 0x74, 0x3f, 0x25, 0x61, 0xf8, 0x76, 0x10, 0x80, 0x0a, 0x75, 0x67, 0x80, 0x74, 0x3f} }, { 0x8423, 16, {0x25, 0x61, 0xf8, 0x76, 0x38, 0xe5, 0x67, 0x45, 0x62, 0x44, 0x01, 0xff, 0xe5, 0x61, 0x75, 0xf0} }, { 0x8433, 13, {0x08, 0xa4, 0x24, 0x02, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xef, 0xf0} }, @@ -605,499 +605,503 @@ { 0x87ba, 16, {0xe5, 0x5e, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5} }, { 0x87ca, 16, {0x5f, 0x8f, 0x60, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3} }, { 0x87da, 16, {0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x7b, 0x08, 0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0xd3, 0x12, 0xa3} }, -{ 0x87ea, 16, {0x7f, 0x40, 0x10, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0x12, 0xa3, 0xc6, 0x00, 0x00, 0x00} }, +{ 0x87ea, 16, {0xb3, 0x40, 0x10, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0x12, 0xa3, 0xfa, 0x00, 0x00, 0x00} }, { 0x87fa, 16, {0x08, 0x80, 0x2e, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3} }, { 0x880a, 16, {0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x7b, 0x00, 0x7a, 0x08, 0x79, 0x07, 0x78, 0x00, 0xc3, 0x12, 0xa3} }, -{ 0x881a, 16, {0x7f, 0x50, 0x0e, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0x12, 0xa3, 0xc6, 0x00, 0x07, 0x08} }, +{ 0x881a, 16, {0xb3, 0x50, 0x0e, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0x12, 0xa3, 0xfa, 0x00, 0x07, 0x08} }, { 0x882a, 16, {0x00, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xf8, 0xa3, 0xe0, 0xf9, 0xa3, 0xe0, 0xfa} }, -{ 0x883a, 16, {0xa3, 0xe0, 0xfb, 0x7f, 0x00, 0x7e, 0x50, 0x7d, 0x46, 0x7c, 0x00, 0x12, 0xa2, 0xed, 0x8f, 0x5c} }, -{ 0x884a, 16, {0x8e, 0x5b, 0x8d, 0x5a, 0x8c, 0x59, 0x7b, 0x0a, 0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0x12, 0xa2} }, -{ 0x885a, 16, {0xed, 0xaf, 0x03, 0x8f, 0x5d, 0xaf, 0x5c, 0xae, 0x5b, 0xad, 0x5a, 0xac, 0x59, 0x7b, 0x0a, 0x7a} }, -{ 0x886a, 16, {0x00, 0x79, 0x00, 0x78, 0x00, 0x12, 0xa2, 0xed, 0x8f, 0x5c, 0x8e, 0x5b, 0x8d, 0x5a, 0x8c, 0x59} }, +{ 0x883a, 16, {0xa3, 0xe0, 0xfb, 0x7f, 0x00, 0x7e, 0x50, 0x7d, 0x46, 0x7c, 0x00, 0x12, 0xa3, 0x21, 0x8f, 0x5c} }, +{ 0x884a, 16, {0x8e, 0x5b, 0x8d, 0x5a, 0x8c, 0x59, 0x7b, 0x0a, 0x7a, 0x00, 0x79, 0x00, 0x78, 0x00, 0x12, 0xa3} }, +{ 0x885a, 16, {0x21, 0xaf, 0x03, 0x8f, 0x5d, 0xaf, 0x5c, 0xae, 0x5b, 0xad, 0x5a, 0xac, 0x59, 0x7b, 0x0a, 0x7a} }, +{ 0x886a, 16, {0x00, 0x79, 0x00, 0x78, 0x00, 0x12, 0xa3, 0x21, 0x8f, 0x5c, 0x8e, 0x5b, 0x8d, 0x5a, 0x8c, 0x59} }, { 0x887a, 16, {0xe5, 0x5d, 0xc3, 0x94, 0x05, 0x40, 0x15, 0xe5, 0x5c, 0x24, 0x01, 0xf5, 0x5c, 0xe4, 0x35, 0x5b} }, { 0x888a, 16, {0xf5, 0x5b, 0xe4, 0x35, 0x5a, 0xf5, 0x5a, 0xe4, 0x35, 0x59, 0xf5, 0x59, 0x85, 0x60, 0x82, 0x85} }, { 0x889a, 16, {0x5f, 0x83, 0xa3, 0xe4, 0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x44} }, { 0x88aa, 16, {0x80, 0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xe5, 0x5c, 0xf0, 0xaf, 0x5c, 0xae, 0x5b, 0xad} }, -{ 0x88ba, 16, {0x5a, 0xac, 0x59, 0x78, 0x08, 0x12, 0xa3, 0x90, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xef} }, +{ 0x88ba, 16, {0x5a, 0xac, 0x59, 0x78, 0x08, 0x12, 0xa3, 0xc4, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xef} }, { 0x88ca, 16, {0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x54, 0x7f, 0xf0, 0xe4, 0xf5} }, { 0x88da, 16, {0x5d, 0xe5, 0x58, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0x30, 0xe0} }, { 0x88ea, 16, {0x23, 0x54, 0x01, 0xf0, 0xe5, 0x60, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0} }, { 0x88fa, 16, {0x54, 0xfd, 0xf0, 0xaf, 0x5e, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc} }, -{ 0x890a, 16, {0x42, 0x22, 0x80, 0x1f, 0xe5, 0x60, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0} }, -{ 0x891a, 16, {0x44, 0x02, 0xf0, 0xaf, 0x5e, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc} }, -{ 0x892a, 16, {0xf4, 0x52, 0x22, 0xe5, 0x58, 0x24, 0x08, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff} }, -{ 0x893a, 16, {0xb4, 0x62, 0x05, 0x43, 0x5d, 0x0a, 0x80, 0x1a, 0xef, 0xb4, 0x72, 0x05, 0x43, 0x5d, 0x08, 0x80} }, -{ 0x894a, 16, {0x11, 0xef, 0xb4, 0x74, 0x05, 0x43, 0x5d, 0x02, 0x80, 0x08, 0xef, 0x64, 0x6e, 0x60, 0x03, 0x7f} }, -{ 0x895a, 16, {0xff, 0x22, 0xe5, 0x58, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0x30} }, -{ 0x896a, 16, {0xe3, 0x03, 0x43, 0x5d, 0x80, 0xef, 0x30, 0xe7, 0x12, 0x43, 0x5d, 0x40, 0xe5, 0x60, 0x24, 0x04} }, -{ 0x897a, 16, {0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x58, 0x24, 0x0b, 0xf5} }, -{ 0x898a, 16, {0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0x30, 0xe1, 0x20, 0xaf, 0x5e, 0x74, 0x01, 0xa8, 0x07} }, -{ 0x899a, 16, {0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x32, 0xe5, 0x60, 0x24, 0x04, 0xf5, 0x82, 0xe4} }, -{ 0x89aa, 16, {0x35, 0x5f, 0xf5, 0x83, 0xe0, 0x44, 0x01, 0xf0, 0x80, 0x10, 0xaf, 0x5e, 0x74, 0x01, 0xa8, 0x07} }, -{ 0x89ba, 16, {0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf4, 0x52, 0x32, 0xe5, 0x58, 0x24, 0x0b, 0xf5, 0x82} }, -{ 0x89ca, 16, {0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0x30, 0xe4, 0x11, 0xae, 0x5e, 0x74, 0x01, 0xa8, 0x06} }, -{ 0x89da, 16, {0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x31, 0x80, 0x10, 0xae, 0x5e, 0x74, 0x01, 0xa8} }, -{ 0x89ea, 16, {0x06, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf4, 0x52, 0x31, 0xef, 0x20, 0xe1, 0x03, 0x30} }, -{ 0x89fa, 16, {0xe4, 0x03, 0xe4, 0xf5, 0x5d, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3, 0xa3, 0x74, 0xbf} }, -{ 0x8a0a, 16, {0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3, 0xe4, 0xf0, 0xe5, 0x5d, 0xf0, 0xe5, 0x58} }, -{ 0x8a1a, 16, {0x24, 0x0a, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x60, 0x24, 0x04, 0xf5} }, -{ 0x8a2a, 16, {0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x58, 0x24, 0x0a, 0xf5, 0x82, 0xe4, 0x35} }, -{ 0x8a3a, 16, {0x57, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x60, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83} }, -{ 0x8a4a, 16, {0xef, 0xf0, 0xe5, 0x58, 0x24, 0x09, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0xe5} }, -{ 0x8a5a, 16, {0x60, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x58, 0x24, 0x09} }, -{ 0x8a6a, 16, {0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x60, 0x24, 0x07, 0xf5, 0x82, 0xe4} }, -{ 0x8a7a, 16, {0x35, 0x5f, 0xf5, 0x83, 0xef, 0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3, 0xa3, 0xe4} }, -{ 0x8a8a, 16, {0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3, 0xf0, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83} }, -{ 0x8a9a, 16, {0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xf5, 0x66, 0x8e, 0x65, 0x8d} }, -{ 0x8aaa, 16, {0x64, 0x8c, 0x63, 0x7d, 0x06, 0xaf, 0x5e, 0x12, 0x83, 0xdf, 0x75, 0x5d, 0x08, 0xe5, 0x58, 0x24} }, -{ 0x8aba, 16, {0x0c, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0x60, 0x03, 0x43, 0x5d, 0x10, 0xe5, 0x60} }, -{ 0x8aca, 16, {0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0x54, 0x03, 0x45, 0x5d, 0xf0, 0xe5} }, -{ 0x8ada, 16, {0x58, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xfe, 0xc3, 0x94, 0x05, 0x40} }, -{ 0x8aea, 16, {0x06, 0xee, 0xd3, 0x94, 0x08, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xe5, 0x58, 0x24, 0x06, 0xf5, 0x82} }, -{ 0x8afa, 16, {0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xfd, 0xc3, 0x94, 0x01, 0x40, 0x06, 0xed, 0xd3, 0x94, 0x02} }, -{ 0x8b0a, 16, {0x40, 0x03, 0x7f, 0xff, 0x22, 0xed, 0x14, 0xff, 0x25, 0xe0, 0x25, 0xe0, 0xff, 0xee, 0x24, 0xfb} }, -{ 0x8b1a, 16, {0x4f, 0xf5, 0x5d, 0xe5, 0x58, 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0x24} }, -{ 0x8b2a, 16, {0xd0, 0x60, 0x18, 0x14, 0x60, 0x1a, 0x24, 0xc3, 0x60, 0x1e, 0x14, 0x60, 0x09, 0x24, 0x0a, 0x70} }, -{ 0x8b3a, 16, {0x14, 0x43, 0x5d, 0x18, 0x80, 0x12, 0x43, 0x5d, 0x08, 0x80, 0x0d, 0x43, 0x5d, 0x38, 0x80, 0x08} }, -{ 0x8b4a, 16, {0x43, 0x5d, 0x28, 0x80, 0x03, 0x7f, 0xff, 0x22, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3} }, -{ 0x8b5a, 16, {0xa3, 0xe5, 0x5d, 0xf0, 0xaf, 0x5e, 0x7d, 0x01, 0x12, 0x83, 0x5a, 0xaa, 0x57, 0xa9, 0x58, 0x7b} }, -{ 0x8b6a, 16, {0x01, 0xc0, 0x01, 0xe5, 0x5e, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x01, 0xf9, 0x74, 0x03, 0x35, 0xf0} }, -{ 0x8b7a, 14, {0xa8, 0x01, 0xfc, 0xd0, 0x01, 0x7e, 0x00, 0x7f, 0x0d, 0x12, 0xa1, 0xde, 0x7f, 0x00} }, -{ 0x8b88, 1, {0x22} }, -{ 0x8b89, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} }, -{ 0x8b99, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xad, 0x82, 0xfc, 0x90, 0x01} }, -{ 0x8ba9, 16, {0x2c, 0x74, 0x08, 0xf0, 0xee, 0x04, 0xa3, 0xf0, 0xe4, 0xa3, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xe5} }, -{ 0x8bb9, 16, {0x82, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x90, 0x01, 0x2f, 0xf0, 0x8d} }, -{ 0x8bc9, 16, {0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54} }, -{ 0x8bd9, 16, {0x1e, 0x90, 0x01, 0x30, 0xf0, 0x74, 0x2d, 0x2e, 0xf8, 0xe6, 0xa3, 0xf0, 0xaf, 0x06, 0x74, 0x01} }, -{ 0x8be9, 16, {0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x57, 0xe5, 0x33, 0xc3, 0x94, 0x01} }, -{ 0x8bf9, 16, {0x40, 0x0d, 0x90, 0x20, 0x78, 0xe0, 0x54, 0x0f, 0x75, 0x58, 0x00, 0xf5, 0x59, 0x80, 0x09, 0x7f} }, -{ 0x8c09, 16, {0x02, 0x12, 0x11, 0x27, 0x8e, 0x58, 0x8f, 0x59, 0xc3, 0xe5, 0x58, 0x64, 0x80, 0x94, 0x80, 0x40} }, -{ 0x8c19, 16, {0xda, 0xe5, 0x57, 0x55, 0x59, 0x90, 0x01, 0x32, 0xf0, 0x7e, 0x01, 0x7f, 0x2c, 0x7d, 0x07, 0x12} }, -{ 0x8c29, 4, {0x91, 0x36, 0x7f, 0x00} }, -{ 0x8c2d, 1, {0x22} }, -{ 0x8c2e, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} }, -{ 0x8c3e, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xfe, 0x90, 0x01} }, -{ 0x8c4e, 16, {0x33, 0x74, 0x0a, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xe5, 0x82, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35} }, -{ 0x8c5e, 16, {0x83, 0xf5, 0x83, 0xe0, 0x90, 0x01, 0x34, 0xf0, 0x7e, 0x01, 0x7f, 0x33, 0x7d, 0x02, 0x12, 0x91} }, -{ 0x8c6e, 3, {0x36, 0x7f, 0x00} }, -{ 0x8c71, 1, {0x22} }, -{ 0x8c72, 4, {0x8e, 0x57, 0x8f, 0x58} }, -{ 0x8c76, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} }, -{ 0x8c86, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xad, 0x82, 0xfc, 0x85, 0x58} }, -{ 0x8c96, 16, {0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0x60, 0x0f, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c, 0xf5} }, -{ 0x8ca6, 16, {0x83, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x43, 0xee, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x0c, 0xf5, 0x82} }, -{ 0x8cb6, 16, {0xe4, 0x34, 0x03, 0xf5, 0x83, 0xe0, 0x30, 0xe0, 0x20, 0xee, 0x25, 0xe0, 0x24, 0xc6, 0xf5, 0x82} }, -{ 0x8cc6, 16, {0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x30, 0xe1, 0xf0, 0x7f, 0x60, 0xed, 0x24, 0x05, 0xf5, 0x82} }, -{ 0x8cd6, 16, {0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0x5f, 0xb5, 0x07, 0xf2, 0xae, 0x04, 0xaf, 0x05, 0xef, 0x24, 0x04} }, -{ 0x8ce6, 12, {0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0xf0, 0x7f, 0x00} }, -{ 0x8cf2, 1, {0x22} }, -{ 0x8cf3, 4, {0xad, 0x07, 0xac, 0x06} }, -{ 0x8cf7, 16, {0x8d, 0x82, 0x8c, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} }, -{ 0x8d07, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xfe, 0x8d, 0x82} }, -{ 0x8d17, 16, {0x8c, 0x83, 0xa3, 0xe0, 0x60, 0x0f, 0xef, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0} }, -{ 0x8d27, 16, {0x44, 0x01, 0xf0, 0x80, 0x0d, 0xef, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0x54} }, -{ 0x8d37, 4, {0xfe, 0xf0, 0x7f, 0x00} }, -{ 0x8d3b, 1, {0x22} }, -{ 0x8d3c, 4, {0xad, 0x07, 0xac, 0x06} }, -{ 0x8d40, 16, {0x8d, 0x82, 0x8c, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} }, -{ 0x8d50, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xfe, 0x8d, 0x82} }, -{ 0x8d60, 16, {0x8c, 0x83, 0xa3, 0xe0, 0x60, 0x0d, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x44, 0x40} }, -{ 0x8d70, 16, {0xf0, 0x80, 0x0b, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x00} }, -{ 0x8d80, 1, {0x22} }, -{ 0x8d81, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xaf} }, -{ 0x8d91, 16, {0x06, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x3e, 0x7f, 0x00} }, -{ 0x8da1, 1, {0x22} }, -{ 0x8da2, 4, {0x8e, 0x57, 0x8f, 0x58} }, -{ 0x8da6, 16, {0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xe0, 0xf5, 0x5c, 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0xf5, 0x59, 0xd3} }, -{ 0x8db6, 16, {0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xe5, 0x59, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60, 0x1f} }, -{ 0x8dc6, 16, {0x14, 0x60, 0x28, 0x24, 0x03, 0x70, 0x2e, 0x7e, 0x7e, 0x7f, 0x80, 0x75, 0x5a, 0x7e, 0x75, 0x5b} }, -{ 0x8dd6, 16, {0x80, 0x80, 0x22, 0x7e, 0x7e, 0x7f, 0x00, 0x75, 0x5a, 0x7e, 0x75, 0x5b, 0x00, 0x80, 0x16, 0x7e} }, -{ 0x8de6, 16, {0x7d, 0x7f, 0x80, 0x75, 0x5a, 0x7d, 0x75, 0x5b, 0x80, 0x80, 0x0a, 0x7e, 0x7d, 0x7f, 0x00, 0x75} }, -{ 0x8df6, 16, {0x5a, 0x7d, 0x75, 0x5b, 0x00, 0xe5, 0x5c, 0x70, 0x1b, 0x85, 0x5b, 0x82, 0x85, 0x5a, 0x83, 0x74} }, -{ 0x8e06, 16, {0xff, 0xf0, 0xe5, 0x59, 0x25, 0xe0, 0x24, 0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74} }, -{ 0x8e16, 16, {0x01, 0xf0, 0x80, 0x48, 0xe5, 0x58, 0x24, 0x02, 0xff, 0xe4, 0x35, 0x57, 0xfe, 0xe5, 0x5c, 0x60} }, -{ 0x8e26, 16, {0x23, 0x0f, 0xef, 0xac, 0x06, 0x70, 0x01, 0x0e, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xe0, 0xfd, 0x05} }, -{ 0x8e36, 16, {0x5b, 0xe5, 0x5b, 0xaa, 0x5a, 0x70, 0x02, 0x05, 0x5a, 0x14, 0xf5, 0x82, 0x8a, 0x83, 0xed, 0xf0} }, -{ 0x8e46, 16, {0x15, 0x5c, 0x80, 0xd9, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xff, 0xe5, 0x59, 0x25} }, -{ 0x8e56, 14, {0xe0, 0x24, 0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x7f, 0x00} }, -{ 0x8e64, 1, {0x22} }, -{ 0x8e65, 16, {0xef, 0x24, 0x05, 0xf5, 0x58, 0xe4, 0x3e, 0xf5, 0x57, 0x90, 0x01, 0x35, 0x74, 0x07, 0xf0, 0x90} }, -{ 0x8e75, 16, {0x01, 0x7a, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x36, 0xf0, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3} }, -{ 0x8e85, 16, {0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0x8e, 0x59, 0xf5, 0x5a, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83} }, -{ 0x8e95, 16, {0xe0, 0x24, 0x9e, 0x60, 0x61, 0x24, 0xf9, 0x60, 0x0e, 0x24, 0xf1, 0x70, 0x03, 0x02, 0x8f, 0x46} }, -{ 0x8ea5, 16, {0x24, 0x14, 0x60, 0x03, 0x02, 0x8f, 0x94, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe} }, -{ 0x8eb5, 16, {0xa3, 0xe0, 0xff, 0xc3, 0xe4, 0x9f, 0xf5, 0x5c, 0x74, 0x01, 0x9e, 0xf5, 0x5b, 0xd3, 0xe5, 0x5c} }, -{ 0x8ec5, 16, {0x94, 0x3f, 0xe5, 0x5b, 0x94, 0x00, 0x40, 0x06, 0x75, 0x5b, 0x00, 0x75, 0x5c, 0x3f, 0xd3, 0xe5} }, -{ 0x8ed5, 16, {0x5a, 0x95, 0x5c, 0xe5, 0x59, 0x95, 0x5b, 0x50, 0x03, 0x02, 0x8f, 0x97, 0xae, 0x5b, 0xaf, 0x5c} }, -{ 0x8ee5, 16, {0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e} }, -{ 0x8ef5, 16, {0x59, 0xf5, 0x5a, 0x02, 0x8f, 0x97, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3} }, -{ 0x8f05, 16, {0xe0, 0xff, 0xc3, 0x74, 0x30, 0x9f, 0xf5, 0x5c, 0xe4, 0x9e, 0xf5, 0x5b, 0xd3, 0xe5, 0x5c, 0x94} }, -{ 0x8f15, 16, {0x10, 0xe5, 0x5b, 0x94, 0x00, 0x40, 0x06, 0x75, 0x5b, 0x00, 0x75, 0x5c, 0x10, 0xd3, 0xe5, 0x5a} }, -{ 0x8f25, 16, {0x95, 0x5c, 0xe5, 0x59, 0x95, 0x5b, 0x40, 0x6a, 0xae, 0x5b, 0xaf, 0x5c, 0x85, 0x58, 0x82, 0x85} }, -{ 0x8f35, 16, {0x57, 0x83, 0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e, 0x59, 0xf5, 0x5a, 0x80} }, -{ 0x8f45, 16, {0x51, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0xe4, 0x9f} }, -{ 0x8f55, 16, {0xf5, 0x5c, 0xe4, 0x9e, 0xf5, 0x5b, 0x45, 0x5c, 0x60, 0x0b, 0xd3, 0xe5, 0x5c, 0x94, 0x3f, 0xe5} }, -{ 0x8f65, 16, {0x5b, 0x94, 0x00, 0x40, 0x06, 0x75, 0x5b, 0x00, 0x75, 0x5c, 0x3f, 0xd3, 0xe5, 0x5a, 0x95, 0x5c} }, -{ 0x8f75, 16, {0xe5, 0x59, 0x95, 0x5b, 0x40, 0x1c, 0xae, 0x5b, 0xaf, 0x5c, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83} }, -{ 0x8f85, 16, {0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e, 0x59, 0xf5, 0x5a, 0x80, 0x03, 0x7f} }, -{ 0x8f95, 16, {0x01, 0x22, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xe0, 0x24, 0x9e, 0x70, 0x03, 0x02, 0x90, 0x57} }, -{ 0x8fa5, 16, {0x24, 0xf9, 0x60, 0x58, 0x24, 0xf1, 0x70, 0x03, 0x02, 0x90, 0xa7, 0x24, 0x14, 0x60, 0x03, 0x02} }, -{ 0x8fb5, 16, {0x90, 0xeb, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xd3, 0x94} }, -{ 0x8fc5, 16, {0xff, 0xee, 0x94, 0x00, 0x40, 0x03, 0x02, 0x90, 0xeb, 0x90, 0x01, 0x75, 0xef, 0xf0, 0xe5, 0x5a} }, -{ 0x8fd5, 16, {0x15, 0x5a, 0xae, 0x59, 0x70, 0x02, 0x15, 0x59, 0x4e, 0x70, 0x03, 0x02, 0x90, 0xeb, 0x90, 0x01} }, -{ 0x8fe5, 16, {0x75, 0xe0, 0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90, 0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01} }, -{ 0x8ff5, 16, {0x12, 0xa2, 0x63, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0, 0x80, 0xd2, 0x85, 0x58, 0x82, 0x85} }, -{ 0x9005, 16, {0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x94, 0x80, 0xee, 0x94, 0x00, 0x50, 0x03} }, -{ 0x9015, 16, {0x02, 0x90, 0xeb, 0xd3, 0xef, 0x94, 0xff, 0xee, 0x94, 0x00, 0x40, 0x03, 0x02, 0x90, 0xeb, 0x90} }, -{ 0x9025, 16, {0x01, 0x76, 0xef, 0xf0, 0xe5, 0x5a, 0x15, 0x5a, 0xae, 0x59, 0x70, 0x02, 0x15, 0x59, 0x4e, 0x70} }, -{ 0x9035, 16, {0x03, 0x02, 0x90, 0xeb, 0x90, 0x01, 0x76, 0xe0, 0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90} }, -{ 0x9045, 16, {0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x63, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0} }, -{ 0x9055, 16, {0x80, 0xd2, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x94} }, -{ 0x9065, 16, {0x20, 0xee, 0x94, 0x00, 0x50, 0x03, 0x02, 0x90, 0xeb, 0xd3, 0xef, 0x94, 0x2f, 0xee, 0x94, 0x00} }, -{ 0x9075, 16, {0x50, 0x74, 0x90, 0x01, 0x77, 0xef, 0xf0, 0xe5, 0x5a, 0x15, 0x5a, 0xae, 0x59, 0x70, 0x02, 0x15} }, -{ 0x9085, 16, {0x59, 0x4e, 0x60, 0x62, 0x90, 0x01, 0x77, 0xe0, 0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90} }, -{ 0x9095, 16, {0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x63, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0} }, -{ 0x90a5, 16, {0x80, 0xd5, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xff, 0xa3, 0xe0, 0x90, 0x01, 0x78} }, -{ 0x90b5, 16, {0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0xe5, 0x5a, 0x15, 0x5a, 0xae, 0x59, 0x70, 0x02, 0x15, 0x59, 0x4e} }, -{ 0x90c5, 16, {0x60, 0x24, 0x90, 0x01, 0x78, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x63, 0x85, 0xf0, 0x82, 0xf5} }, -{ 0x90d5, 16, {0x83, 0xe0, 0xff, 0x90, 0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x63, 0x85, 0xf0, 0x82} }, -{ 0x90e5, 16, {0xf5, 0x83, 0xef, 0xf0, 0x80, 0xcf, 0x7e, 0x01, 0x7f, 0x35, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83} }, -{ 0x90f5, 13, {0xa3, 0xa3, 0xa3, 0xe0, 0xa3, 0xe0, 0x04, 0xfd, 0x12, 0x91, 0x36, 0x7f, 0x00} }, -{ 0x9102, 1, {0x22} }, -{ 0x9103, 16, {0x8e, 0x62, 0x8f, 0x63, 0x8c, 0x64, 0x8d, 0x65, 0xaf, 0x03, 0x1b, 0xef, 0x60, 0x24, 0x05, 0x63} }, -{ 0x9113, 16, {0xe5, 0x63, 0xae, 0x62, 0x70, 0x02, 0x05, 0x62, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe0, 0xff, 0x05} }, -{ 0x9123, 16, {0x65, 0xe5, 0x65, 0xac, 0x64, 0x70, 0x02, 0x05, 0x64, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0} }, -{ 0x9133, 3, {0x80, 0xd6, 0x22} }, -{ 0x9136, 6, {0x8d, 0x5d, 0xab, 0x07, 0xaa, 0x06} }, -{ 0x913c, 16, {0x75, 0x61, 0x40, 0x75, 0x60, 0x0d, 0x75, 0x5f, 0x03, 0x75, 0x5e, 0x00, 0x90, 0x7f, 0xc2, 0xe0} }, -{ 0x914c, 16, {0x20, 0xe1, 0xf9, 0xaf, 0x61, 0xae, 0x60, 0xad, 0x5f, 0xac, 0x5e, 0xec, 0x4d, 0x4e, 0x4f, 0x70} }, -{ 0x915c, 16, {0x08, 0x90, 0x7f, 0xc2, 0x74, 0x02, 0xf0, 0x80, 0xd7, 0x90, 0x7f, 0xc2, 0xe0, 0x20, 0xe1, 0x16} }, -{ 0x916c, 16, {0xaf, 0x03, 0xae, 0x02, 0x7c, 0x7b, 0x7d, 0x80, 0xab, 0x5d, 0x12, 0x91, 0x03, 0x90, 0x7f, 0xc3} }, -{ 0x917c, 8, {0xe5, 0x5d, 0xf0, 0x7f, 0x01, 0x22, 0x7f, 0x00} }, -{ 0x9184, 1, {0x22} }, -{ 0x9185, 16, {0x90, 0x01, 0x84, 0x74, 0x0b, 0xf0, 0xa3, 0xe5, 0x33, 0xf0, 0x90, 0x0a, 0xf5, 0xe4, 0x93, 0x90} }, -{ 0x9195, 16, {0x01, 0x86, 0xf0, 0x90, 0x0a, 0xf6, 0xe4, 0x93, 0x90, 0x01, 0x87, 0xf0, 0xe4, 0x90, 0x01, 0x7c} }, -{ 0x91a5, 16, {0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0x74, 0x01} }, -{ 0x91b5, 16, {0xf0, 0xa3, 0x74, 0x88, 0xf0, 0x7e, 0x01, 0x7f, 0x7c, 0x12, 0x19, 0xc1, 0x7e, 0x01, 0x7f, 0x84} }, -{ 0x91c5, 7, {0x7d, 0x14, 0x12, 0x91, 0x36, 0x7f, 0x00} }, -{ 0x91cc, 1, {0x22} }, -{ 0x91cd, 16, {0x7e, 0x7b, 0x7f, 0x40, 0x75, 0x4e, 0x7b, 0x75, 0x4f, 0x40, 0x90, 0x7f, 0xd3, 0xe0, 0xff, 0x85} }, -{ 0x91dd, 16, {0x4e, 0x51, 0x85, 0x4f, 0x52, 0xe5, 0x52, 0x24, 0x01, 0xf5, 0x56, 0xe4, 0x35, 0x51, 0xf5, 0x55} }, -{ 0x91ed, 16, {0xe4, 0xf5, 0x50, 0x85, 0x52, 0x82, 0x85, 0x51, 0x83, 0xe0, 0xfe, 0x14, 0xb4, 0x0c, 0x00, 0x50} }, -{ 0x91fd, 16, {0x5b, 0x90, 0x92, 0x05, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x92, 0x29, 0x02, 0x92, 0x29, 0x02, 0x92} }, -{ 0x920d, 16, {0x33, 0x02, 0x92, 0x3d, 0x02, 0x92, 0x3d, 0x02, 0x92, 0x3d, 0x02, 0x92, 0x51, 0x02, 0x92, 0x29} }, -{ 0x921d, 16, {0x02, 0x92, 0x47, 0x02, 0x92, 0x29, 0x02, 0x92, 0x59, 0x02, 0x92, 0x29, 0xef, 0x64, 0x02, 0x60} }, -{ 0x922d, 16, {0x2b, 0x75, 0x50, 0xff, 0x80, 0x26, 0xef, 0x64, 0x0e, 0x60, 0x21, 0x75, 0x50, 0xff, 0x80, 0x1c} }, -{ 0x923d, 16, {0xef, 0x64, 0x03, 0x60, 0x17, 0x75, 0x50, 0xff, 0x80, 0x12, 0xef, 0x64, 0x03, 0x60, 0x0d, 0x75} }, -{ 0x924d, 16, {0x50, 0xff, 0x80, 0x08, 0xef, 0x64, 0x06, 0x60, 0x03, 0x75, 0x50, 0xff, 0xe5, 0x50, 0x60, 0x15} }, -{ 0x925d, 16, {0x90, 0x01, 0x98, 0x74, 0x11, 0xf0, 0xa3, 0xee, 0xf0, 0x7e, 0x01, 0x7f, 0x98, 0x7d, 0x02, 0x12} }, -{ 0x926d, 16, {0x91, 0x36, 0xaf, 0x50, 0x22, 0xe4, 0xf5, 0x50, 0x85, 0x52, 0x82, 0x85, 0x51, 0x83, 0xe0, 0x14} }, -{ 0x927d, 16, {0xb4, 0x0f, 0x00, 0x40, 0x03, 0x02, 0x93, 0x9b, 0x90, 0x92, 0x8c, 0xf8, 0x28, 0x28, 0x73, 0x02} }, -{ 0x928d, 16, {0x92, 0xb9, 0x02, 0x92, 0xc5, 0x02, 0x92, 0xd1, 0x02, 0x93, 0x1f, 0x02, 0x93, 0x2a, 0x02, 0x93} }, -{ 0x929d, 16, {0x35, 0x02, 0x93, 0x40, 0x02, 0x93, 0x4b, 0x02, 0x93, 0x56, 0x02, 0x93, 0x61, 0x02, 0x93, 0x6c} }, -{ 0x92ad, 16, {0x02, 0x93, 0x73, 0x02, 0x93, 0x9b, 0x02, 0x93, 0x7e, 0x02, 0x93, 0x89, 0xaf, 0x56, 0xae, 0x55} }, -{ 0x92bd, 16, {0x12, 0x84, 0x41, 0x8f, 0x50, 0x02, 0x93, 0x9e, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x85, 0x61, 0x8f} }, -{ 0x92cd, 16, {0x50, 0x02, 0x93, 0x9e, 0x85, 0x55, 0x53, 0x85, 0x56, 0x54, 0xe5, 0x54, 0x24, 0x01, 0xff, 0xe4} }, -{ 0x92dd, 16, {0x35, 0x53, 0xfe, 0x12, 0x86, 0xbe, 0xaf, 0x54, 0xae, 0x53, 0x12, 0x87, 0x51, 0x8f, 0x50, 0xef} }, -{ 0x92ed, 16, {0x64, 0x01, 0x60, 0x03, 0x02, 0x93, 0x9e, 0xaf, 0x54, 0xae, 0x53, 0x12, 0x87, 0xa6, 0x8f, 0x50} }, -{ 0x92fd, 16, {0xe5, 0x50, 0x70, 0x03, 0x02, 0x93, 0x9e, 0x85, 0x54, 0x82, 0x85, 0x53, 0x83, 0xe0, 0x75, 0xf0} }, -{ 0x930d, 16, {0x0d, 0xa4, 0x24, 0xf4, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xaf, 0x82, 0xfe, 0x12, 0x87, 0xa6, 0x02} }, -{ 0x931d, 16, {0x93, 0x9e, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8c, 0x72, 0x8f, 0x50, 0x80, 0x74, 0xaf, 0x56, 0xae} }, -{ 0x932d, 16, {0x55, 0x12, 0x8c, 0xf3, 0x8f, 0x50, 0x80, 0x69, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8d, 0x3c, 0x8f} }, -{ 0x933d, 16, {0x50, 0x80, 0x5e, 0xaf, 0x4f, 0xae, 0x4e, 0x12, 0x8e, 0x65, 0x8f, 0x50, 0x80, 0x53, 0xaf, 0x56} }, -{ 0x934d, 16, {0xae, 0x55, 0x12, 0x8b, 0x89, 0x8f, 0x50, 0x80, 0x48, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x86, 0x2d} }, -{ 0x935d, 16, {0x8f, 0x50, 0x80, 0x3d, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8c, 0x2e, 0x8f, 0x50, 0x80, 0x32, 0x12} }, -{ 0x936d, 16, {0x91, 0x85, 0x8f, 0x50, 0x80, 0x2b, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8d, 0x81, 0x8f, 0x50, 0x80} }, -{ 0x937d, 16, {0x20, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8d, 0xa2, 0x8f, 0x50, 0x80, 0x15, 0xaf, 0x4f, 0xae, 0x4e} }, -{ 0x938d, 16, {0x7c, 0x02, 0x7d, 0xaf, 0x7b, 0x40, 0x12, 0x91, 0x03, 0xe4, 0xf5, 0x50, 0x80, 0x03, 0x75, 0x50} }, -{ 0x939d, 16, {0xff, 0xe5, 0x50, 0x60, 0x1d, 0x90, 0x01, 0x98, 0x74, 0x11, 0xf0, 0x85, 0x52, 0x82, 0x85, 0x51} }, -{ 0x93ad, 16, {0x83, 0xe0, 0x90, 0x01, 0x99, 0xf0, 0x7e, 0x01, 0x7f, 0x98, 0x7d, 0x02, 0x12, 0x91, 0x36, 0xaf} }, -{ 0x93bd, 16, {0x50, 0x22, 0x85, 0x52, 0x82, 0x85, 0x51, 0x83, 0xe0, 0xff, 0x14, 0x24, 0xfa, 0x50, 0x04, 0x24} }, -{ 0x93cd, 16, {0xfe, 0x70, 0x1f, 0x90, 0x01, 0x98, 0x74, 0x10, 0xf0, 0xa3, 0xef, 0xf0, 0x85, 0x56, 0x82, 0x85} }, -{ 0x93dd, 16, {0x55, 0x83, 0xe0, 0x90, 0x01, 0x9a, 0xf0, 0x7e, 0x01, 0x7f, 0x98, 0x7d, 0x03, 0x12, 0x91, 0x36} }, -{ 0x93ed, 4, {0x8f, 0x50, 0xaf, 0x50} }, -{ 0x93f1, 1, {0x22} }, -{ 0x93f2, 8, {0x8f, 0x51, 0x8e, 0x50, 0x8d, 0x4f, 0x8c, 0x4e} }, -{ 0x93fa, 16, {0x75, 0x58, 0x01, 0x75, 0x59, 0x9c, 0xe4, 0xf5, 0x57, 0xaf, 0x53, 0x15, 0x53, 0xef, 0x70, 0x03} }, -{ 0x940a, 16, {0x02, 0x94, 0x90, 0xaf, 0x52, 0xe4, 0xfc, 0xfd, 0xfe, 0xf8, 0xf9, 0xfa, 0xab, 0x07, 0xaf, 0x51} }, -{ 0x941a, 16, {0xae, 0x50, 0xad, 0x4f, 0xac, 0x4e, 0x12, 0xa2, 0xed, 0xaf, 0x03, 0x8f, 0x56, 0xaf, 0x51, 0xae} }, -{ 0x942a, 16, {0x50, 0xad, 0x4f, 0xac, 0x4e, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xaf, 0x52, 0xe4} }, -{ 0x943a, 16, {0xfc, 0xfd, 0xfe, 0xf8, 0xf9, 0xfa, 0xab, 0x07, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04} }, -{ 0x944a, 16, {0x12, 0xa2, 0xed, 0x8f, 0x51, 0x8e, 0x50, 0x8d, 0x4f, 0x8c, 0x4e, 0xe5, 0x56, 0x24, 0x30, 0xf5} }, -{ 0x945a, 16, {0x56, 0xd3, 0x94, 0x39, 0x40, 0x06, 0x74, 0x07, 0x25, 0x56, 0xf5, 0x56, 0x05, 0x59, 0xe5, 0x59} }, -{ 0x946a, 16, {0xae, 0x58, 0x70, 0x02, 0x05, 0x58, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe4, 0xf0, 0x05, 0x59, 0xe5} }, -{ 0x947a, 16, {0x59, 0xae, 0x58, 0x70, 0x02, 0x05, 0x58, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x56, 0xf0, 0x05} }, -{ 0x948a, 16, {0x57, 0x05, 0x57, 0x02, 0x94, 0x03, 0xe5, 0x59, 0x15, 0x59, 0x70, 0x02, 0x15, 0x58, 0xaf, 0x57} }, -{ 0x949a, 16, {0x15, 0x57, 0xef, 0x60, 0x23, 0xe5, 0x59, 0x15, 0x59, 0xae, 0x58, 0x70, 0x02, 0x15, 0x58, 0xf5} }, -{ 0x94aa, 16, {0x82, 0x8e, 0x83, 0xe0, 0xff, 0x05, 0x55, 0xe5, 0x55, 0xac, 0x54, 0x70, 0x02, 0x05, 0x54, 0x14} }, -{ 0x94ba, 8, {0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x80, 0xd6} }, -{ 0x94c2, 1, {0x22} }, -{ 0x94c3, 16, {0xe4, 0x90, 0x01, 0xc9, 0xf0, 0x7e, 0x01, 0x7f, 0xca, 0x90, 0x01, 0xbe, 0xee, 0xf0, 0xa3, 0xef} }, -{ 0x94d3, 10, {0xf0, 0x90, 0x01, 0xc2, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x22} }, -{ 0x94dd, 16, {0xaa, 0x07, 0xa9, 0x05, 0x90, 0x01, 0xc9, 0xe0, 0xc3, 0x94, 0x40, 0x50, 0x61, 0xac, 0x02, 0x74} }, -{ 0x94ed, 16, {0x01, 0x7e, 0x00, 0xa8, 0x04, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff} }, -{ 0x94fd, 16, {0xe4, 0xef, 0x55, 0x34, 0x60, 0x45, 0xea, 0x04, 0xff, 0x90, 0x01, 0xc2, 0xe0, 0xfc, 0xa3, 0xe0} }, -{ 0x950d, 16, {0xfd, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0xa3, 0xe9, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3} }, -{ 0x951d, 16, {0xeb, 0xf0, 0x90, 0x01, 0xc2, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0xa2, 0x4d, 0xfc, 0xd3, 0xe5, 0xf0} }, -{ 0x952d, 16, {0x94, 0x87, 0xec, 0x94, 0x02, 0x40, 0x0a, 0x90, 0x01, 0xc2, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0xca} }, -{ 0x953d, 16, {0xf0, 0xc2, 0xaf, 0x90, 0x01, 0xc9, 0xe0, 0x04, 0xf0, 0xd2, 0xaf, 0x7f, 0x01, 0x22, 0x7f, 0x00} }, -{ 0x954d, 1, {0x22} }, -{ 0x954e, 16, {0x90, 0x01, 0xc9, 0xe0, 0xd3, 0x94, 0x00, 0x40, 0x55, 0x90, 0x01, 0xbe, 0xe0, 0xfc, 0xa3, 0xe0} }, -{ 0x955e, 16, {0xaa, 0x04, 0xf9, 0x7b, 0x01, 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0xaa, 0x06, 0xa9, 0x07, 0xa8} }, -{ 0x956e, 16, {0x01, 0xac, 0x02, 0xad, 0x03, 0xd0, 0x01, 0xd0, 0x02, 0xd0, 0x03, 0x7e, 0x00, 0x7f, 0x03, 0x12} }, -{ 0x957e, 16, {0xa1, 0xde, 0x90, 0x01, 0xbe, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0xa2, 0x4d, 0xfc, 0xd3, 0xe5, 0xf0} }, -{ 0x958e, 16, {0x94, 0x87, 0xec, 0x94, 0x02, 0x40, 0x0a, 0x90, 0x01, 0xbe, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0xca} }, -{ 0x959e, 16, {0xf0, 0xc2, 0xaf, 0x90, 0x01, 0xc9, 0xe0, 0x14, 0xf0, 0xd2, 0xaf, 0x7f, 0x01, 0x22, 0x7f, 0x00} }, -{ 0x95ae, 1, {0x22} }, -{ 0x95af, 16, {0x90, 0x7f, 0xc2, 0xe0, 0x20, 0xe1, 0x73, 0x7e, 0x7b, 0x7f, 0x80, 0x75, 0x53, 0x7b, 0x75, 0x54} }, -{ 0x95bf, 16, {0x80, 0xe5, 0x54, 0x24, 0x01, 0xff, 0xe4, 0x35, 0x53, 0xa9, 0x07, 0x7b, 0x01, 0x8b, 0x55, 0xf5} }, -{ 0x95cf, 16, {0x56, 0x89, 0x57, 0xfe, 0x12, 0x95, 0x4e, 0xef, 0x60, 0x50, 0xab, 0x55, 0xaa, 0x56, 0xa9, 0x57} }, -{ 0x95df, 16, {0x12, 0xa2, 0x07, 0x14, 0xff, 0x90, 0x00, 0x01, 0x12, 0xa2, 0x20, 0xb4, 0x02, 0x16, 0xc2, 0xaf} }, -{ 0x95ef, 16, {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0x44} }, -{ 0x95ff, 16, {0x04, 0xf0, 0xd2, 0xaf, 0x74, 0x01, 0x7e, 0x00, 0xa8, 0x07, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce} }, -{ 0x960f, 16, {0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe4, 0xef, 0x55, 0x34, 0x60, 0x0f, 0x85, 0x54, 0x82, 0x85, 0x53} }, -{ 0x961f, 10, {0x83, 0x74, 0x0d, 0xf0, 0x90, 0x7f, 0xc3, 0x74, 0x04, 0xf0} }, -{ 0x9629, 1, {0x22} }, -{ 0x962a, 16, {0x12, 0x95, 0xaf, 0xe4, 0xf5, 0x4e, 0x74, 0x3a, 0x25, 0x4e, 0xf8, 0xe6, 0x54, 0xf0, 0xf5, 0x4f} }, -{ 0x963a, 16, {0x74, 0xc5, 0x25, 0x4e, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, 0xe0, 0x65, 0x4f, 0xff, 0xc4} }, -{ 0x964a, 16, {0x54, 0x0f, 0xf5, 0x50, 0x60, 0x22, 0x74, 0xc5, 0x25, 0x4e, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5} }, -{ 0x965a, 16, {0x83, 0xe5, 0x4f, 0xf0, 0xaf, 0x4e, 0x7d, 0x01, 0xe5, 0x4f, 0x45, 0x50, 0xfb, 0x12, 0x94, 0xdd} }, -{ 0x966a, 16, {0xef, 0x70, 0x05, 0x12, 0x95, 0xaf, 0x80, 0xec, 0x05, 0x4e, 0xe5, 0x4e, 0xc3, 0x94, 0x04, 0x40} }, -{ 0x967a, 16, {0xb5, 0x12, 0x95, 0xaf, 0xe5, 0x3e, 0x60, 0x48, 0xe4, 0xf5, 0x4e, 0xaf, 0x4e, 0x74, 0x01, 0xa8} }, -{ 0x968a, 16, {0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x4f, 0x55, 0x3e, 0x60, 0x29, 0xe5, 0x4e} }, -{ 0x969a, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0x30, 0xe6} }, -{ 0x96aa, 16, {0x16, 0xaf, 0x4e, 0x7d, 0x04, 0x7b, 0x80, 0x12, 0x94, 0xdd, 0xef, 0x70, 0x05, 0x12, 0x95, 0xaf} }, -{ 0x96ba, 16, {0x80, 0xef, 0xe5, 0x4f, 0xf4, 0x52, 0x3e, 0x05, 0x4e, 0xe5, 0x4e, 0xc3, 0x94, 0x04, 0x40, 0xbb} }, -{ 0x96ca, 16, {0x90, 0x03, 0x00, 0xe0, 0x60, 0x03, 0x02, 0x97, 0xab, 0x74, 0x19, 0xf0, 0xe5, 0x33, 0xc3, 0x94} }, -{ 0x96da, 16, {0x01, 0x40, 0x0d, 0x90, 0x20, 0x78, 0xe0, 0x54, 0x0f, 0x75, 0x51, 0x00, 0xf5, 0x52, 0x80, 0x09} }, -{ 0x96ea, 16, {0x7f, 0x02, 0x12, 0x11, 0x27, 0x8e, 0x51, 0x8f, 0x52, 0xc3, 0xe5, 0x51, 0x64, 0x80, 0x94, 0x80} }, -{ 0x96fa, 16, {0x40, 0xda, 0x90, 0x01, 0xbc, 0xe0, 0x65, 0x52, 0xf0, 0x60, 0x37, 0xe4, 0xf5, 0x4e, 0xaf, 0x4e} }, -{ 0x970a, 16, {0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x4f, 0x90, 0x01, 0xbc} }, -{ 0x971a, 16, {0xe0, 0x55, 0x4f, 0x60, 0x14, 0xaf, 0x4e, 0x7d, 0x08, 0xe5, 0x4f, 0x55, 0x52, 0xfb, 0x12, 0x94} }, -{ 0x972a, 16, {0xdd, 0xef, 0x70, 0x05, 0x12, 0x95, 0xaf, 0x80, 0xec, 0x05, 0x4e, 0xe5, 0x4e, 0xc3, 0x94, 0x04} }, -{ 0x973a, 16, {0x40, 0xcc, 0x90, 0x01, 0xbc, 0xe5, 0x52, 0xf0, 0xe4, 0xf5, 0x4e, 0xc2, 0xaf, 0x74, 0x36, 0x25} }, -{ 0x974a, 16, {0x4e, 0xf8, 0xe6, 0xf5, 0x4f, 0xe4, 0xf6, 0xd2, 0xaf, 0x53, 0x4f, 0x1e, 0xe5, 0x4f, 0x60, 0x11} }, -{ 0x975a, 16, {0xaf, 0x4e, 0x7d, 0x02, 0xab, 0x4f, 0x12, 0x94, 0xdd, 0xef, 0x70, 0x05, 0x12, 0x95, 0xaf, 0x80} }, -{ 0x976a, 16, {0xef, 0x74, 0x2d, 0x25, 0x4e, 0xf8, 0xe6, 0xf5, 0x4f, 0x74, 0xfc, 0x25, 0x4e, 0xf5, 0x82, 0xe4} }, -{ 0x977a, 16, {0x34, 0x02, 0xf5, 0x83, 0xe0, 0x65, 0x4f, 0x60, 0x11, 0xaf, 0x4e, 0x7d, 0x04, 0xab, 0x4f, 0x12} }, -{ 0x978a, 16, {0x94, 0xdd, 0xef, 0x70, 0x05, 0x12, 0x95, 0xaf, 0x80, 0xef, 0x74, 0xfc, 0x25, 0x4e, 0xf5, 0x82} }, -{ 0x979a, 16, {0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe5, 0x4f, 0xf0, 0x05, 0x4e, 0xe5, 0x4e, 0xc3, 0x94, 0x04, 0x40} }, -{ 0x97aa, 4, {0x9a, 0x12, 0x95, 0xaf} }, -{ 0x97ae, 1, {0x22} }, -{ 0x97af, 12, {0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x67, 0x02, 0x97, 0xf6} }, -{ 0x97bb, 16, {0x02, 0x05, 0xad, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2} }, -{ 0x97cb, 16, {0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33} }, -{ 0x97db, 16, {0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf} }, -{ 0x97eb, 16, {0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x98, 0x3b, 0xe4, 0x7e} }, -{ 0x97fb, 16, {0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93} }, -{ 0x980b, 16, {0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3} }, -{ 0x981b, 16, {0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca} }, -{ 0x982b, 16, {0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe} }, -{ 0x983b, 16, {0x60, 0x24, 0x02, 0x8a, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x81, 0x82, 0x84, 0x88} }, -{ 0x984b, 16, {0x90, 0xa0, 0xc0, 0xc1, 0xc2, 0xc4, 0xc8, 0xd0, 0xe0, 0xe1, 0xe2, 0xe4, 0xe8, 0xf0, 0xf1, 0xf2} }, -{ 0x985b, 8, {0xf4, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xfe, 0xff} }, -{ 0x9863, 1, {0x00} }, -{ 0x9864, 8, {0x8b, 0x59, 0x8a, 0x5a, 0x89, 0x5b, 0x8d, 0x5c} }, -{ 0x986c, 16, {0xe4, 0xf5, 0x5d, 0xf5, 0x5e, 0xaf, 0x5c, 0x15, 0x5c, 0xef, 0x60, 0x36, 0xab, 0x59, 0x05, 0x5b} }, -{ 0x987c, 16, {0xe5, 0x5b, 0xaa, 0x5a, 0x70, 0x02, 0x05, 0x5a, 0x14, 0xf9, 0x12, 0xa2, 0x07, 0xff, 0xe5, 0x5d} }, -{ 0x988c, 16, {0xe5, 0x5e, 0x6f, 0x25, 0xe0, 0xff, 0xe4, 0x33, 0xfe, 0x74, 0x61, 0x2f, 0xf5, 0x82, 0xee, 0x34} }, -{ 0x989c, 16, {0x9e, 0xf5, 0x83, 0xe5, 0x5d, 0xff, 0xe4, 0x93, 0xf5, 0x5d, 0x74, 0x01, 0x93, 0x6f, 0xf5, 0x5e} }, -{ 0x98ac, 6, {0x80, 0xc3, 0xae, 0x5d, 0xaf, 0x5e} }, -{ 0x98b2, 1, {0x22} }, -{ 0x98b3, 11, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x18} }, -{ 0x98be, 16, {0x90, 0x20, 0x60, 0xe0, 0x54, 0x0f, 0xfe, 0x30, 0xe0, 0x05, 0x90, 0x20, 0x02, 0xe0, 0xff, 0xee} }, -{ 0x98ce, 16, {0x30, 0xe1, 0x05, 0x90, 0x20, 0x0a, 0xe0, 0xff, 0xee, 0x30, 0xe2, 0x05, 0x90, 0x20, 0x12, 0xe0} }, -{ 0x98de, 16, {0xff, 0xee, 0x30, 0xe3, 0x05, 0x90, 0x20, 0x1a, 0xe0, 0xff, 0x90, 0x01, 0xc4, 0xe0, 0xb5, 0x1e} }, -{ 0x98ee, 10, {0x04, 0xe4, 0xf0, 0x80, 0x05, 0x90, 0x01, 0xc4, 0xee, 0xf0} }, -{ 0x98f8, 9, {0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} }, -{ 0x9901, 2, {0xa9, 0x03} }, -{ 0x9903, 16, {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xab, 0x82, 0xfa, 0xe5} }, -{ 0x9913, 16, {0x5c, 0x45, 0x5d, 0xf5, 0x5e, 0xe9, 0x60, 0x14, 0x8a, 0x83, 0xe5, 0x82, 0x24, 0x04, 0xf5, 0x82} }, -{ 0x9923, 16, {0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x4d, 0xf0, 0xe4, 0xfe, 0x80, 0x13, 0xeb, 0x24, 0x04, 0xf5} }, -{ 0x9933, 16, {0x82, 0xe4, 0x3a, 0xf5, 0x83, 0xe0, 0xff, 0xed, 0xf4, 0xfc, 0xef, 0x5c, 0xf0, 0xae, 0x5e, 0xeb} }, -{ 0x9943, 16, {0x24, 0x06, 0xf5, 0x82, 0xe4, 0x3a, 0xf5, 0x83, 0xe0, 0x55, 0x5e, 0xfc, 0xb5, 0x06, 0x03, 0xaf} }, -{ 0x9953, 16, {0x05, 0x22, 0xe5, 0x5c, 0x5c, 0xfe, 0xe5, 0x5d, 0x5c, 0xfd, 0xe9, 0x60, 0x16, 0xee, 0x70, 0x04} }, -{ 0x9963, 16, {0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xae, 0x07, 0xed, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f} }, -{ 0x9973, 16, {0x00, 0xad, 0x07, 0xee, 0x60, 0x03, 0xaf, 0x5c, 0x22, 0xed, 0x60, 0x03, 0xaf, 0x5d, 0x22, 0x7f} }, -{ 0x9983, 1, {0x00} }, -{ 0x9984, 1, {0x22} }, -{ 0x9985, 16, {0x75, 0x55, 0x02, 0x75, 0x56, 0xb0, 0x90, 0x03, 0x35, 0x74, 0x0f, 0xf0, 0x85, 0x56, 0x82, 0x85} }, -{ 0x9995, 16, {0x55, 0x83, 0xa3, 0xe0, 0xff, 0x90, 0x03, 0x37, 0xf0, 0x85, 0x56, 0x82, 0x85, 0x55, 0x83, 0xe0} }, -{ 0x99a5, 16, {0x90, 0x03, 0x36, 0xf0, 0x90, 0x03, 0x38, 0x74, 0xff, 0xf0, 0x75, 0x57, 0x03, 0x75, 0x58, 0x39} }, -{ 0x99b5, 16, {0xef, 0x14, 0xb4, 0x0b, 0x00, 0x40, 0x03, 0x02, 0x9e, 0x29, 0x90, 0x99, 0xc6, 0xf8, 0x28, 0x28} }, -{ 0x99c5, 16, {0x73, 0x02, 0x99, 0xe7, 0x02, 0x9a, 0x86, 0x02, 0x9b, 0x8b, 0x02, 0x9b, 0xaa, 0x02, 0x9b, 0xaa} }, -{ 0x99d5, 16, {0x02, 0x9c, 0x60, 0x02, 0x9c, 0x9b, 0x02, 0x9c, 0xc0, 0x02, 0x9d, 0x7e, 0x02, 0x9d, 0xae, 0x02} }, -{ 0x99e5, 16, {0x9d, 0xda, 0xe4, 0xf5, 0x4e, 0xe5, 0x4e, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4} }, -{ 0x99f5, 16, {0x34, 0x20, 0xaf, 0x82, 0xf5, 0x53, 0x8f, 0x54, 0xe4, 0xff, 0xe4, 0xfe, 0xef, 0x60, 0x10, 0x74} }, -{ 0x9a05, 16, {0x8a, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xf4, 0xf5, 0x4f, 0x80, 0x0d, 0x74} }, -{ 0x9a15, 16, {0x8a, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xf5, 0x4f, 0xe5, 0x54, 0x24, 0x07} }, -{ 0x9a25, 16, {0xf5, 0x82, 0xe4, 0x35, 0x53, 0xf5, 0x83, 0xe5, 0x4f, 0xf0, 0xe0, 0xf5, 0x50, 0x65, 0x4f, 0x60} }, -{ 0x9a35, 16, {0x38, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4e, 0x04, 0xfd, 0x05, 0x58, 0xe5, 0x58, 0xaa, 0x57} }, -{ 0x9a45, 16, {0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8a, 0x83, 0xed, 0xf0, 0x05, 0x58, 0xe5, 0x58, 0xac} }, -{ 0x9a55, 16, {0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xe5, 0x4f, 0xf0, 0x85, 0x58, 0x82} }, -{ 0x9a65, 16, {0x85, 0x57, 0x83, 0xe5, 0x50, 0xf0, 0x02, 0x9e, 0x2f, 0x0e, 0xbe, 0x24, 0x8f, 0x0f, 0xef, 0x64} }, -{ 0x9a75, 16, {0x02, 0x70, 0x87, 0x05, 0x4e, 0xe5, 0x4e, 0x64, 0x04, 0x60, 0x03, 0x02, 0x99, 0xea, 0x02, 0x9e} }, -{ 0x9a85, 16, {0x2f, 0xe4, 0xf5, 0x4e, 0xaf, 0x4e, 0xe4, 0xfd, 0x12, 0x83, 0x5a, 0x05, 0x4e, 0xe5, 0x4e, 0xd3} }, -{ 0x9a95, 16, {0x94, 0x03, 0x40, 0xf0, 0x90, 0x00, 0x04, 0x74, 0x98, 0xf0, 0xa3, 0x74, 0xb3, 0xf0, 0xe4, 0xf5} }, -{ 0x9aa5, 16, {0x50, 0x7e, 0x20, 0x7f, 0x00, 0x75, 0x53, 0x20, 0x75, 0x54, 0x00, 0xf5, 0x4e, 0xaf, 0x4e, 0x74} }, -{ 0x9ab5, 16, {0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x4f, 0x90, 0x01, 0xc4, 0xf0} }, -{ 0x9ac5, 16, {0x90, 0x01, 0xc0, 0xe4, 0xf0, 0xa3, 0x74, 0x0a, 0xf0, 0x85, 0x54, 0x82, 0x85, 0x53, 0x83, 0xa3} }, -{ 0x9ad5, 16, {0x74, 0x02, 0xf0, 0x90, 0x01, 0xc4, 0xe0, 0xb5, 0x4f, 0x34, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02} }, -{ 0x9ae5, 16, {0xa3, 0xe0, 0x70, 0xef, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4e, 0x04, 0xff, 0x05, 0x58, 0xe5, 0x58} }, -{ 0x9af5, 16, {0xac, 0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x85, 0x58, 0x82} }, -{ 0x9b05, 16, {0x85, 0x57, 0x83, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x01, 0xc4, 0xf0, 0x75, 0x50, 0xff, 0x90, 0x01} }, -{ 0x9b15, 16, {0xc4, 0xe0, 0xff, 0x60, 0x37, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4e, 0x04, 0xfe, 0x05, 0x58} }, -{ 0x9b25, 16, {0xe5, 0x58, 0xac, 0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xee, 0xf0, 0x05} }, -{ 0x9b35, 16, {0x58, 0xe5, 0x58, 0xac, 0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0} }, -{ 0x9b45, 16, {0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xe5, 0x4f, 0xf0, 0x75, 0x50, 0xff, 0xe5, 0x50, 0x70, 0x16} }, -{ 0x9b55, 16, {0x74, 0x08, 0x25, 0x54, 0xf5, 0x54, 0xe4, 0x35, 0x53, 0xf5, 0x53, 0x05, 0x4e, 0xe5, 0x4e, 0x64} }, -{ 0x9b65, 16, {0x04, 0x60, 0x03, 0x02, 0x9a, 0xb2, 0xe4, 0xf5, 0x4e, 0xaf, 0x4e, 0x7d, 0x01, 0x12, 0x83, 0x5a} }, -{ 0x9b75, 16, {0x05, 0x4e, 0xe5, 0x4e, 0xd3, 0x94, 0x03, 0x40, 0xf0, 0x90, 0x00, 0x04, 0x74, 0x13, 0xf0, 0xa3} }, -{ 0x9b85, 16, {0x74, 0x12, 0xf0, 0x02, 0x9e, 0x2f, 0x85, 0x56, 0x82, 0x85, 0x55, 0x83, 0xe0, 0x14, 0xff, 0x74} }, -{ 0x9b95, 16, {0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x90, 0x02, 0xf7, 0xf0, 0x90, 0x01} }, -{ 0x9ba5, 16, {0xc4, 0xf0, 0x02, 0x9e, 0x2f, 0x90, 0x01, 0xc0, 0x74, 0x03, 0xf0, 0xa3, 0x74, 0xe8, 0xf0, 0xe4} }, -{ 0x9bb5, 16, {0xf5, 0x50, 0x90, 0x02, 0xf7, 0xe0, 0xff, 0x90, 0x01, 0xc4, 0xe0, 0xb5, 0x07, 0x19, 0x90, 0x01} }, -{ 0x9bc5, 16, {0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xea, 0x90, 0x03, 0x38, 0xf0, 0x85, 0x58, 0x82, 0x85} }, -{ 0x9bd5, 16, {0x57, 0x83, 0x74, 0xff, 0xf0, 0xf5, 0x50, 0xe5, 0x50, 0x60, 0x03, 0x02, 0x9e, 0x2f, 0x90, 0x01} }, -{ 0x9be5, 16, {0xc0, 0xf0, 0xa3, 0x74, 0x96, 0xf0, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xf6} }, -{ 0x9bf5, 16, {0xe5, 0x33, 0xc3, 0x94, 0x01, 0x40, 0x0d, 0x90, 0x20, 0x78, 0xe0, 0x54, 0x0f, 0x75, 0x51, 0x00} }, -{ 0x9c05, 16, {0xf5, 0x52, 0x80, 0x09, 0x7f, 0x02, 0x12, 0x11, 0x27, 0x8e, 0x51, 0x8f, 0x52, 0xc3, 0xe5, 0x51} }, -{ 0x9c15, 16, {0x64, 0x80, 0x94, 0x80, 0x40, 0xda, 0xe5, 0x52, 0x54, 0x0f, 0xf5, 0x50, 0x90, 0x02, 0xf7, 0xe0} }, -{ 0x9c25, 16, {0x55, 0x50, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0x8f, 0x4f, 0x85, 0x56, 0x82, 0x85} }, -{ 0x9c35, 16, {0x55, 0x83, 0xa3, 0xe0, 0xb4, 0x05, 0x0c, 0xe5, 0x4f, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f} }, -{ 0x9c45, 16, {0x00, 0x8f, 0x4f, 0xe5, 0x4f, 0x70, 0x03, 0x02, 0x9e, 0x2f, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0x85} }, -{ 0x9c55, 16, {0x58, 0x82, 0x85, 0x57, 0x83, 0xe5, 0x50, 0xf0, 0x02, 0x9e, 0x2f, 0xe4, 0xff, 0xfd, 0x12, 0x83} }, -{ 0x9c65, 16, {0x5a, 0x7e, 0x20, 0x7f, 0x00, 0x75, 0x53, 0x20, 0x75, 0x54, 0x00, 0x85, 0x54, 0x82, 0x85, 0x53} }, -{ 0x9c75, 16, {0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x44, 0x80, 0xf0, 0x85, 0x54, 0x82, 0x85, 0x53, 0x83, 0x74, 0x01} }, -{ 0x9c85, 16, {0xf0, 0xa3, 0xe4, 0xf0, 0x85, 0x54, 0x82, 0x85, 0x53, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x54, 0x7f} }, -{ 0x9c95, 16, {0xf0, 0xd2, 0x04, 0x02, 0x9e, 0x2f, 0xc2, 0x04, 0x7e, 0x20, 0x7f, 0x00, 0x75, 0x53, 0x20, 0x75} }, -{ 0x9ca5, 16, {0x54, 0x00, 0xe5, 0x54, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x53, 0xf5, 0x83, 0xe0, 0x30, 0xe6} }, -{ 0x9cb5, 16, {0xf1, 0xe4, 0xff, 0x7d, 0x01, 0x12, 0x83, 0x5a, 0x02, 0x9e, 0x2f, 0xe4, 0xf5, 0x50, 0xf5, 0x4e} }, -{ 0x9cc5, 16, {0xaf, 0x4e, 0xe4, 0xfd, 0x12, 0x83, 0x5a, 0xe5, 0x4e, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5} }, -{ 0x9cd5, 16, {0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5, 0x53, 0x8f, 0x54, 0xf5, 0x83, 0xe5, 0x82, 0x24, 0x04} }, -{ 0x9ce5, 16, {0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54, 0xfc, 0xf0, 0xaf, 0x4e, 0x7d, 0x01, 0x7b} }, -{ 0x9cf5, 16, {0x01, 0x75, 0x5c, 0x80, 0x75, 0x5d, 0x40, 0x12, 0x99, 0x01, 0x8f, 0x50, 0xe5, 0x50, 0x70, 0x11} }, -{ 0x9d05, 16, {0xaf, 0x4e, 0x7d, 0x02, 0x7b, 0x01, 0x75, 0x5c, 0x10, 0x75, 0x5d, 0x20, 0x12, 0x99, 0x01, 0x8f} }, -{ 0x9d15, 16, {0x50, 0xe5, 0x50, 0x70, 0x10, 0xaf, 0x4e, 0x7d, 0x01, 0xfb, 0x75, 0x5c, 0x80, 0x75, 0x5d, 0x40} }, -{ 0x9d25, 16, {0x12, 0x99, 0x01, 0x8f, 0x50, 0xe5, 0x50, 0x70, 0x10, 0xaf, 0x4e, 0x7d, 0x02, 0xfb, 0x75, 0x5c} }, -{ 0x9d35, 16, {0x10, 0x75, 0x5d, 0x20, 0x12, 0x99, 0x01, 0x8f, 0x50, 0xaf, 0x4e, 0x7d, 0x01, 0x12, 0x83, 0x5a} }, -{ 0x9d45, 16, {0xe5, 0x50, 0x60, 0x26, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4e, 0x04, 0xff, 0x05, 0x58, 0xe5} }, -{ 0x9d55, 16, {0x58, 0xac, 0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x85, 0x58} }, -{ 0x9d65, 16, {0x82, 0x85, 0x57, 0x83, 0xe5, 0x50, 0xf0, 0x02, 0x9e, 0x2f, 0x05, 0x4e, 0xe5, 0x4e, 0xd3, 0x94} }, -{ 0x9d75, 16, {0x03, 0x50, 0x03, 0x02, 0x9c, 0xc5, 0x02, 0x9e, 0x2f, 0xe4, 0x90, 0x03, 0x59, 0xf0, 0xa3, 0xf0} }, -{ 0x9d85, 16, {0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0x74, 0x9e, 0xf0, 0xa3, 0x74} }, -{ 0x9d95, 16, {0x51, 0xf0, 0x7e, 0x03, 0x7f, 0x59, 0x12, 0x81, 0xd9, 0xef, 0x64, 0x08, 0x70, 0x03, 0x02, 0x9e} }, -{ 0x9da5, 16, {0x2f, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0x02, 0x9e, 0x2f, 0xe4, 0x90, 0x03, 0x59, 0xf0, 0xa3, 0xf0} }, -{ 0x9db5, 16, {0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0xe5, 0x57, 0xf0, 0xa3, 0xe5} }, -{ 0x9dc5, 16, {0x58, 0xf0, 0x7e, 0x03, 0x7f, 0x59, 0x12, 0x19, 0xc1, 0xef, 0x64, 0x08, 0x60, 0x5c, 0xe4, 0x90} }, -{ 0x9dd5, 16, {0x03, 0x38, 0xf0, 0x80, 0x55, 0xe5, 0x56, 0x24, 0x02, 0xff, 0xe4, 0x35, 0x55, 0xfa, 0xa9, 0x07} }, -{ 0x9de5, 16, {0x7b, 0x01, 0x7d, 0x10, 0x12, 0x98, 0x64, 0xef, 0x4e, 0x70, 0x32, 0x90, 0x03, 0x59, 0xf0, 0xa3} }, -{ 0x9df5, 16, {0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xe5, 0x56, 0x24, 0x02, 0x90} }, -{ 0x9e05, 16, {0x03, 0x60, 0xf0, 0xe4, 0x35, 0x55, 0x90, 0x03, 0x5f, 0xf0, 0x7e, 0x03, 0x7f, 0x59, 0x12, 0x81} }, -{ 0x9e15, 16, {0xd9, 0xef, 0x64, 0x08, 0x60, 0x14, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0x80, 0x0d, 0xe4, 0x90, 0x03} }, -{ 0x9e25, 16, {0x38, 0xf0, 0x80, 0x06, 0x90, 0x03, 0x38, 0x74, 0x01, 0xf0, 0x90, 0x01, 0xc0, 0xe4, 0xf0, 0xa3} }, -{ 0x9e35, 16, {0x74, 0x0a, 0xf0, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xf6, 0x7e, 0x03, 0x7f} }, -{ 0x9e45, 11, {0x35, 0x7d, 0x24, 0x12, 0x91, 0x36, 0xe4, 0x90, 0x02, 0xaf, 0xf0} }, -{ 0x9e50, 1, {0x22} }, -{ 0x9e51, 16, {0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f} }, -{ 0x9e61, 16, {0x00, 0x00, 0xc0, 0xc1, 0xc1, 0x81, 0x01, 0x40, 0xc3, 0x01, 0x03, 0xc0, 0x02, 0x80, 0xc2, 0x41} }, -{ 0x9e71, 16, {0xc6, 0x01, 0x06, 0xc0, 0x07, 0x80, 0xc7, 0x41, 0x05, 0x00, 0xc5, 0xc1, 0xc4, 0x81, 0x04, 0x40} }, -{ 0x9e81, 16, {0xcc, 0x01, 0x0c, 0xc0, 0x0d, 0x80, 0xcd, 0x41, 0x0f, 0x00, 0xcf, 0xc1, 0xce, 0x81, 0x0e, 0x40} }, -{ 0x9e91, 16, {0x0a, 0x00, 0xca, 0xc1, 0xcb, 0x81, 0x0b, 0x40, 0xc9, 0x01, 0x09, 0xc0, 0x08, 0x80, 0xc8, 0x41} }, -{ 0x9ea1, 16, {0xd8, 0x01, 0x18, 0xc0, 0x19, 0x80, 0xd9, 0x41, 0x1b, 0x00, 0xdb, 0xc1, 0xda, 0x81, 0x1a, 0x40} }, -{ 0x9eb1, 16, {0x1e, 0x00, 0xde, 0xc1, 0xdf, 0x81, 0x1f, 0x40, 0xdd, 0x01, 0x1d, 0xc0, 0x1c, 0x80, 0xdc, 0x41} }, -{ 0x9ec1, 16, {0x14, 0x00, 0xd4, 0xc1, 0xd5, 0x81, 0x15, 0x40, 0xd7, 0x01, 0x17, 0xc0, 0x16, 0x80, 0xd6, 0x41} }, -{ 0x9ed1, 16, {0xd2, 0x01, 0x12, 0xc0, 0x13, 0x80, 0xd3, 0x41, 0x11, 0x00, 0xd1, 0xc1, 0xd0, 0x81, 0x10, 0x40} }, -{ 0x9ee1, 16, {0xf0, 0x01, 0x30, 0xc0, 0x31, 0x80, 0xf1, 0x41, 0x33, 0x00, 0xf3, 0xc1, 0xf2, 0x81, 0x32, 0x40} }, -{ 0x9ef1, 16, {0x36, 0x00, 0xf6, 0xc1, 0xf7, 0x81, 0x37, 0x40, 0xf5, 0x01, 0x35, 0xc0, 0x34, 0x80, 0xf4, 0x41} }, -{ 0x9f01, 16, {0x3c, 0x00, 0xfc, 0xc1, 0xfd, 0x81, 0x3d, 0x40, 0xff, 0x01, 0x3f, 0xc0, 0x3e, 0x80, 0xfe, 0x41} }, -{ 0x9f11, 16, {0xfa, 0x01, 0x3a, 0xc0, 0x3b, 0x80, 0xfb, 0x41, 0x39, 0x00, 0xf9, 0xc1, 0xf8, 0x81, 0x38, 0x40} }, -{ 0x9f21, 16, {0x28, 0x00, 0xe8, 0xc1, 0xe9, 0x81, 0x29, 0x40, 0xeb, 0x01, 0x2b, 0xc0, 0x2a, 0x80, 0xea, 0x41} }, -{ 0x9f31, 16, {0xee, 0x01, 0x2e, 0xc0, 0x2f, 0x80, 0xef, 0x41, 0x2d, 0x00, 0xed, 0xc1, 0xec, 0x81, 0x2c, 0x40} }, -{ 0x9f41, 16, {0xe4, 0x01, 0x24, 0xc0, 0x25, 0x80, 0xe5, 0x41, 0x27, 0x00, 0xe7, 0xc1, 0xe6, 0x81, 0x26, 0x40} }, -{ 0x9f51, 16, {0x22, 0x00, 0xe2, 0xc1, 0xe3, 0x81, 0x23, 0x40, 0xe1, 0x01, 0x21, 0xc0, 0x20, 0x80, 0xe0, 0x41} }, -{ 0x9f61, 16, {0xa0, 0x01, 0x60, 0xc0, 0x61, 0x80, 0xa1, 0x41, 0x63, 0x00, 0xa3, 0xc1, 0xa2, 0x81, 0x62, 0x40} }, -{ 0x9f71, 16, {0x66, 0x00, 0xa6, 0xc1, 0xa7, 0x81, 0x67, 0x40, 0xa5, 0x01, 0x65, 0xc0, 0x64, 0x80, 0xa4, 0x41} }, -{ 0x9f81, 16, {0x6c, 0x00, 0xac, 0xc1, 0xad, 0x81, 0x6d, 0x40, 0xaf, 0x01, 0x6f, 0xc0, 0x6e, 0x80, 0xae, 0x41} }, -{ 0x9f91, 16, {0xaa, 0x01, 0x6a, 0xc0, 0x6b, 0x80, 0xab, 0x41, 0x69, 0x00, 0xa9, 0xc1, 0xa8, 0x81, 0x68, 0x40} }, -{ 0x9fa1, 16, {0x78, 0x00, 0xb8, 0xc1, 0xb9, 0x81, 0x79, 0x40, 0xbb, 0x01, 0x7b, 0xc0, 0x7a, 0x80, 0xba, 0x41} }, -{ 0x9fb1, 16, {0xbe, 0x01, 0x7e, 0xc0, 0x7f, 0x80, 0xbf, 0x41, 0x7d, 0x00, 0xbd, 0xc1, 0xbc, 0x81, 0x7c, 0x40} }, -{ 0x9fc1, 16, {0xb4, 0x01, 0x74, 0xc0, 0x75, 0x80, 0xb5, 0x41, 0x77, 0x00, 0xb7, 0xc1, 0xb6, 0x81, 0x76, 0x40} }, -{ 0x9fd1, 16, {0x72, 0x00, 0xb2, 0xc1, 0xb3, 0x81, 0x73, 0x40, 0xb1, 0x01, 0x71, 0xc0, 0x70, 0x80, 0xb0, 0x41} }, -{ 0x9fe1, 16, {0x50, 0x00, 0x90, 0xc1, 0x91, 0x81, 0x51, 0x40, 0x93, 0x01, 0x53, 0xc0, 0x52, 0x80, 0x92, 0x41} }, -{ 0x9ff1, 16, {0x96, 0x01, 0x56, 0xc0, 0x57, 0x80, 0x97, 0x41, 0x55, 0x00, 0x95, 0xc1, 0x94, 0x81, 0x54, 0x40} }, -{ 0xa001, 16, {0x9c, 0x01, 0x5c, 0xc0, 0x5d, 0x80, 0x9d, 0x41, 0x5f, 0x00, 0x9f, 0xc1, 0x9e, 0x81, 0x5e, 0x40} }, -{ 0xa011, 16, {0x5a, 0x00, 0x9a, 0xc1, 0x9b, 0x81, 0x5b, 0x40, 0x99, 0x01, 0x59, 0xc0, 0x58, 0x80, 0x98, 0x41} }, -{ 0xa021, 16, {0x88, 0x01, 0x48, 0xc0, 0x49, 0x80, 0x89, 0x41, 0x4b, 0x00, 0x8b, 0xc1, 0x8a, 0x81, 0x4a, 0x40} }, -{ 0xa031, 16, {0x4e, 0x00, 0x8e, 0xc1, 0x8f, 0x81, 0x4f, 0x40, 0x8d, 0x01, 0x4d, 0xc0, 0x4c, 0x80, 0x8c, 0x41} }, -{ 0xa041, 16, {0x44, 0x00, 0x84, 0xc1, 0x85, 0x81, 0x45, 0x40, 0x87, 0x01, 0x47, 0xc0, 0x46, 0x80, 0x86, 0x41} }, -{ 0xa051, 16, {0x82, 0x01, 0x42, 0xc0, 0x43, 0x80, 0x83, 0x41, 0x41, 0x00, 0x81, 0xc1, 0x80, 0x81, 0x40, 0x40} }, -{ 0xa061, 16, {0xe4, 0xff, 0x74, 0xf8, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0x70, 0x03, 0x02} }, -{ 0xa071, 16, {0xa1, 0x04, 0x74, 0x3a, 0x2f, 0xf8, 0xe6, 0x20, 0xe5, 0x03, 0x02, 0xa1, 0x04, 0xef, 0x75, 0xf0} }, -{ 0xa081, 16, {0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xad, 0x82, 0xfc, 0xf5, 0x83, 0xe5, 0x82} }, -{ 0xa091, 16, {0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54, 0x60, 0x64, 0x60, 0x70, 0x63} }, -{ 0xa0a1, 16, {0xef, 0x25, 0xe0, 0x24, 0xef, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01} }, -{ 0xa0b1, 16, {0x12, 0xa2, 0x63, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xe0, 0x8d, 0x82, 0x8c, 0x83, 0xf0, 0x74, 0xf8} }, -{ 0xa0c1, 16, {0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0x14, 0xf0, 0x70, 0x36, 0xef, 0x25, 0xe0} }, -{ 0xa0d1, 16, {0x24, 0xc7, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0xef, 0x25, 0xe0, 0xfe, 0xc3} }, -{ 0xa0e1, 16, {0x74, 0x0c, 0x9e, 0x75, 0xf0, 0x40, 0xa4, 0x24, 0x40, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x7b, 0xad} }, -{ 0xa0f1, 16, {0x82, 0xfc, 0xef, 0x25, 0xe0, 0x24, 0xef, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xec, 0xf0} }, -{ 0xa101, 12, {0xa3, 0xed, 0xf0, 0x0f, 0xef, 0x64, 0x04, 0x60, 0x03, 0x02, 0xa0, 0x63} }, -{ 0xa10d, 1, {0x22} }, -{ 0xa10e, 16, {0xe7, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x46, 0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x3e} }, -{ 0xa11e, 16, {0x88, 0x82, 0x8c, 0x83, 0xe7, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x32, 0xe3, 0x09, 0xf6, 0x08} }, -{ 0xa12e, 16, {0xdf, 0xfa, 0x80, 0x78, 0xe3, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x70, 0x88, 0x82, 0x8c, 0x83} }, -{ 0xa13e, 16, {0xe3, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x64, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf6, 0x08} }, -{ 0xa14e, 16, {0xdf, 0xfa, 0x80, 0x58, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x4c} }, -{ 0xa15e, 16, {0x80, 0xd2, 0x80, 0xfa, 0x80, 0xc6, 0x80, 0xd4, 0x80, 0x69, 0x80, 0xf2, 0x80, 0x33, 0x80, 0x10} }, -{ 0xa16e, 16, {0x80, 0xa6, 0x80, 0xea, 0x80, 0x9a, 0x80, 0xa8, 0x80, 0xda, 0x80, 0xe2, 0x80, 0xca, 0x80, 0x33} }, -{ 0xa17e, 16, {0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83} }, -{ 0xa18e, 16, {0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xe9, 0xde, 0xe7, 0x80} }, -{ 0xa19e, 16, {0x0d, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf6, 0x08, 0xdf, 0xf9, 0xec, 0xfa, 0xa9, 0xf0} }, -{ 0xa1ae, 16, {0xed, 0xfb, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc} }, -{ 0xa1be, 16, {0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xea, 0xde} }, -{ 0xa1ce, 16, {0xe8, 0x80, 0xdb, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf2, 0x08, 0xdf, 0xf9, 0x80, 0xcc} }, -{ 0xa1de, 16, {0x88, 0xf0, 0xed, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xc2, 0xf5, 0x82, 0xeb, 0x24, 0x02, 0xb4} }, -{ 0xa1ee, 16, {0x04, 0x00, 0x50, 0xb8, 0x23, 0x23, 0x45, 0x82, 0xf5, 0x82, 0xef, 0x4e, 0x60, 0xae, 0xef, 0x60} }, -{ 0xa1fe, 9, {0x01, 0x0e, 0xe5, 0x82, 0x23, 0x90, 0xa1, 0x5e, 0x73} }, -{ 0xa207, 16, {0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02} }, -{ 0xa217, 9, {0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22} }, -{ 0xa220, 16, {0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50} }, -{ 0xa230, 16, {0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22} }, -{ 0xa240, 13, {0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22} }, -{ 0xa24d, 16, {0xc5, 0xf0, 0xf8, 0xa3, 0xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02} }, -{ 0xa25d, 6, {0x15, 0x83, 0xe0, 0x38, 0xf0, 0x22} }, -{ 0xa263, 16, {0xa3, 0xf8, 0xe0, 0xc5, 0xf0, 0x25, 0xf0, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83} }, -{ 0xa273, 6, {0xe0, 0xc8, 0x38, 0xf0, 0xe8, 0x22} }, -{ 0xa279, 16, {0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0} }, -{ 0xa289, 16, {0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe} }, -{ 0xa299, 16, {0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83} }, -{ 0xa2a9, 8, {0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22} }, -{ 0xa2b1, 16, {0x75, 0xf0, 0x08, 0x75, 0x82, 0x00, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xcd, 0x33, 0xcd, 0xcc} }, -{ 0xa2c1, 16, {0x33, 0xcc, 0xc5, 0x82, 0x33, 0xc5, 0x82, 0x9b, 0xed, 0x9a, 0xec, 0x99, 0xe5, 0x82, 0x98, 0x40} }, -{ 0xa2d1, 16, {0x0c, 0xf5, 0x82, 0xee, 0x9b, 0xfe, 0xed, 0x9a, 0xfd, 0xec, 0x99, 0xfc, 0x0f, 0xd5, 0xf0, 0xd6} }, -{ 0xa2e1, 16, {0xe4, 0xce, 0xfb, 0xe4, 0xcd, 0xfa, 0xe4, 0xcc, 0xf9, 0xa8, 0x82, 0x22, 0xb8, 0x00, 0xc1, 0xb9} }, -{ 0xa2f1, 16, {0x00, 0x59, 0xba, 0x00, 0x2d, 0xec, 0x8b, 0xf0, 0x84, 0xcf, 0xce, 0xcd, 0xfc, 0xe5, 0xf0, 0xcb} }, -{ 0xa301, 16, {0xf9, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xeb} }, -{ 0xa311, 16, {0x33, 0xfb, 0x10, 0xd7, 0x03, 0x99, 0x40, 0x04, 0xeb, 0x99, 0xfb, 0x0f, 0xd8, 0xe5, 0xe4, 0xf9} }, -{ 0xa321, 16, {0xfa, 0x22, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc} }, -{ 0xa331, 16, {0xc9, 0x33, 0xc9, 0x10, 0xd7, 0x05, 0x9b, 0xe9, 0x9a, 0x40, 0x07, 0xec, 0x9b, 0xfc, 0xe9, 0x9a} }, -{ 0xa341, 16, {0xf9, 0x0f, 0xd8, 0xe0, 0xe4, 0xc9, 0xfa, 0xe4, 0xcc, 0xfb, 0x22, 0x75, 0xf0, 0x10, 0xef, 0x2f} }, -{ 0xa351, 16, {0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xcc, 0x33, 0xcc, 0xc8, 0x33, 0xc8, 0x10, 0xd7, 0x07} }, -{ 0xa361, 16, {0x9b, 0xec, 0x9a, 0xe8, 0x99, 0x40, 0x0a, 0xed, 0x9b, 0xfd, 0xec, 0x9a, 0xfc, 0xe8, 0x99, 0xf8} }, -{ 0xa371, 14, {0x0f, 0xd5, 0xf0, 0xda, 0xe4, 0xcd, 0xfb, 0xe4, 0xcc, 0xfa, 0xe4, 0xc8, 0xf9, 0x22} }, -{ 0xa37f, 16, {0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0} }, -{ 0xa38f, 1, {0x22} }, -{ 0xa390, 16, {0xe8, 0x60, 0x0f, 0xec, 0xc3, 0x13, 0xfc, 0xed, 0x13, 0xfd, 0xee, 0x13, 0xfe, 0xef, 0x13, 0xff} }, -{ 0xa3a0, 3, {0xd8, 0xf1, 0x22} }, -{ 0xa3a3, 16, {0x08, 0x08, 0x08, 0xe6, 0xcf, 0x2f, 0xf6, 0x18, 0xe6, 0xce, 0x3e, 0xf6, 0x18, 0xe6, 0xcd, 0x3d} }, -{ 0xa3b3, 7, {0xf6, 0x18, 0xe6, 0xcc, 0x3c, 0xf6, 0x22} }, -{ 0xa3ba, 12, {0xec, 0xf0, 0xa3, 0xed, 0xf0, 0xa3, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x22} }, -{ 0xa3c6, 16, {0xa8, 0x82, 0x85, 0x83, 0xf0, 0xd0, 0x83, 0xd0, 0x82, 0x12, 0xa3, 0xdd, 0x12, 0xa3, 0xdd, 0x12} }, -{ 0xa3d6, 16, {0xa3, 0xdd, 0x12, 0xa3, 0xdd, 0xe4, 0x73, 0xe4, 0x93, 0xa3, 0xc5, 0x83, 0xc5, 0xf0, 0xc5, 0x83} }, -{ 0xa3e6, 16, {0xc8, 0xc5, 0x82, 0xc8, 0xf0, 0xa3, 0xc5, 0x83, 0xc5, 0xf0, 0xc5, 0x83, 0xc8, 0xc5, 0x82, 0xc8} }, -{ 0xa3f6, 1, {0x22} }, +{ 0x890a, 16, {0x42, 0x22, 0x80, 0x36, 0x74, 0x01, 0x7e, 0x00, 0xa8, 0x5e, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce} }, +{ 0x891a, 16, {0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe4, 0xef, 0x55, 0x22, 0x60, 0x1f, 0xe5, 0x60, 0x24, 0x04, 0xf5} }, +{ 0x892a, 16, {0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0x44, 0x02, 0xf0, 0xaf, 0x5e, 0x74, 0x01, 0xa8, 0x07} }, +{ 0x893a, 16, {0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf4, 0x52, 0x22, 0xe5, 0x58, 0x24, 0x08, 0xf5, 0x82} }, +{ 0x894a, 16, {0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0xb4, 0x62, 0x05, 0x43, 0x5d, 0x0a, 0x80, 0x1a, 0xef} }, +{ 0x895a, 16, {0xb4, 0x72, 0x05, 0x43, 0x5d, 0x08, 0x80, 0x11, 0xef, 0xb4, 0x74, 0x05, 0x43, 0x5d, 0x02, 0x80} }, +{ 0x896a, 16, {0x08, 0xef, 0x64, 0x6e, 0x60, 0x03, 0x7f, 0xff, 0x22, 0xe5, 0x58, 0x24, 0x0b, 0xf5, 0x82, 0xe4} }, +{ 0x897a, 16, {0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0x30, 0xe3, 0x03, 0x43, 0x5d, 0x80, 0xef, 0x30, 0xe7, 0x12} }, +{ 0x898a, 16, {0x43, 0x5d, 0x40, 0xe5, 0x60, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0x44} }, +{ 0x899a, 16, {0x02, 0xf0, 0xe5, 0x58, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0x30, 0xe1} }, +{ 0x89aa, 16, {0x20, 0xaf, 0x5e, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x32} }, +{ 0x89ba, 16, {0xe5, 0x60, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xe0, 0x44, 0x01, 0xf0, 0x80} }, +{ 0x89ca, 16, {0x10, 0xaf, 0x5e, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf4, 0x52} }, +{ 0x89da, 16, {0x32, 0xe5, 0x58, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0x30, 0xe4} }, +{ 0x89ea, 16, {0x11, 0xae, 0x5e, 0x74, 0x01, 0xa8, 0x06, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x31} }, +{ 0x89fa, 16, {0x80, 0x10, 0xae, 0x5e, 0x74, 0x01, 0xa8, 0x06, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf4} }, +{ 0x8a0a, 16, {0x52, 0x31, 0xef, 0x20, 0xe1, 0x03, 0x30, 0xe4, 0x03, 0xe4, 0xf5, 0x5d, 0x85, 0x60, 0x82, 0x85} }, +{ 0x8a1a, 16, {0x5f, 0x83, 0xa3, 0xa3, 0xa3, 0x74, 0xbf, 0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3} }, +{ 0x8a2a, 16, {0xe4, 0xf0, 0xe5, 0x5d, 0xf0, 0xe5, 0x58, 0x24, 0x0a, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83} }, +{ 0x8a3a, 16, {0xe0, 0xff, 0xe5, 0x60, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xef, 0xf0, 0xe5} }, +{ 0x8a4a, 16, {0x58, 0x24, 0x0a, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x60, 0x24, 0x05} }, +{ 0x8a5a, 16, {0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xef, 0xf0, 0xe5, 0x58, 0x24, 0x09, 0xf5, 0x82, 0xe4} }, +{ 0x8a6a, 16, {0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff, 0xe5, 0x60, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5} }, +{ 0x8a7a, 16, {0x83, 0xef, 0xf0, 0xe5, 0x58, 0x24, 0x09, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xff} }, +{ 0x8a8a, 16, {0xe5, 0x60, 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83, 0xef, 0xf0, 0x85, 0x60, 0x82} }, +{ 0x8a9a, 16, {0x85, 0x5f, 0x83, 0xa3, 0xa3, 0xa3, 0xe4, 0xf0, 0x85, 0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3} }, +{ 0x8aaa, 16, {0xf0, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe} }, +{ 0x8aba, 16, {0xa3, 0xe0, 0xf5, 0x66, 0x8e, 0x65, 0x8d, 0x64, 0x8c, 0x63, 0x7d, 0x06, 0xaf, 0x5e, 0x12, 0x83} }, +{ 0x8aca, 16, {0xdf, 0x75, 0x5d, 0x08, 0xe5, 0x58, 0x24, 0x0c, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0} }, +{ 0x8ada, 16, {0x60, 0x03, 0x43, 0x5d, 0x10, 0xe5, 0x60, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35, 0x5f, 0xf5, 0x83} }, +{ 0x8aea, 16, {0xe0, 0x54, 0x03, 0x45, 0x5d, 0xf0, 0xe5, 0x58, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5} }, +{ 0x8afa, 16, {0x83, 0xe0, 0xfe, 0xc3, 0x94, 0x05, 0x40, 0x06, 0xee, 0xd3, 0x94, 0x08, 0x40, 0x03, 0x7f, 0xff} }, +{ 0x8b0a, 16, {0x22, 0xe5, 0x58, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0xfd, 0xc3, 0x94} }, +{ 0x8b1a, 16, {0x01, 0x40, 0x06, 0xed, 0xd3, 0x94, 0x02, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xed, 0x14, 0xff, 0x25} }, +{ 0x8b2a, 16, {0xe0, 0x25, 0xe0, 0xff, 0xee, 0x24, 0xfb, 0x4f, 0xf5, 0x5d, 0xe5, 0x58, 0x24, 0x07, 0xf5, 0x82} }, +{ 0x8b3a, 16, {0xe4, 0x35, 0x57, 0xf5, 0x83, 0xe0, 0x24, 0xd0, 0x60, 0x18, 0x14, 0x60, 0x1a, 0x24, 0xc3, 0x60} }, +{ 0x8b4a, 16, {0x1e, 0x14, 0x60, 0x09, 0x24, 0x0a, 0x70, 0x14, 0x43, 0x5d, 0x18, 0x80, 0x12, 0x43, 0x5d, 0x08} }, +{ 0x8b5a, 16, {0x80, 0x0d, 0x43, 0x5d, 0x38, 0x80, 0x08, 0x43, 0x5d, 0x28, 0x80, 0x03, 0x7f, 0xff, 0x22, 0x85} }, +{ 0x8b6a, 16, {0x60, 0x82, 0x85, 0x5f, 0x83, 0xa3, 0xa3, 0xa3, 0xe5, 0x5d, 0xf0, 0x74, 0x01, 0x7e, 0x00, 0xa8} }, +{ 0x8b7a, 16, {0x5e, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe4, 0xef, 0x55, 0x34} }, +{ 0x8b8a, 16, {0x60, 0x07, 0xaf, 0x5e, 0x7d, 0x01, 0x12, 0x83, 0x5a, 0xaa, 0x57, 0xa9, 0x58, 0x7b, 0x01, 0xc0} }, +{ 0x8b9a, 16, {0x03, 0xc0, 0x01, 0xe5, 0x5e, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x01, 0xf9, 0x74, 0x03, 0x35, 0xf0} }, +{ 0x8baa, 16, {0xa8, 0x01, 0xfc, 0xad, 0x03, 0xd0, 0x01, 0xd0, 0x03, 0x7e, 0x00, 0x7f, 0x0d, 0x12, 0xa2, 0x12} }, +{ 0x8bba, 2, {0x7f, 0x00} }, +{ 0x8bbc, 1, {0x22} }, +{ 0x8bbd, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} }, +{ 0x8bcd, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xad, 0x82, 0xfc, 0x90, 0x01} }, +{ 0x8bdd, 16, {0x2c, 0x74, 0x08, 0xf0, 0xee, 0x04, 0xa3, 0xf0, 0xe4, 0xa3, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xe5} }, +{ 0x8bed, 16, {0x82, 0x24, 0x06, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x90, 0x01, 0x2f, 0xf0, 0x8d} }, +{ 0x8bfd, 16, {0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54} }, +{ 0x8c0d, 16, {0x1e, 0x90, 0x01, 0x30, 0xf0, 0x74, 0x2d, 0x2e, 0xf8, 0xe6, 0xa3, 0xf0, 0xaf, 0x06, 0x74, 0x01} }, +{ 0x8c1d, 16, {0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x57, 0xe5, 0x33, 0xc3, 0x94, 0x01} }, +{ 0x8c2d, 16, {0x40, 0x0d, 0x90, 0x20, 0x78, 0xe0, 0x54, 0x0f, 0x75, 0x58, 0x00, 0xf5, 0x59, 0x80, 0x09, 0x7f} }, +{ 0x8c3d, 16, {0x02, 0x12, 0x11, 0x27, 0x8e, 0x58, 0x8f, 0x59, 0xc3, 0xe5, 0x58, 0x64, 0x80, 0x94, 0x80, 0x40} }, +{ 0x8c4d, 16, {0xda, 0xe5, 0x57, 0x55, 0x59, 0x90, 0x01, 0x32, 0xf0, 0x7e, 0x01, 0x7f, 0x2c, 0x7d, 0x07, 0x12} }, +{ 0x8c5d, 4, {0x91, 0x6a, 0x7f, 0x00} }, +{ 0x8c61, 1, {0x22} }, +{ 0x8c62, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} }, +{ 0x8c72, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xfe, 0x90, 0x01} }, +{ 0x8c82, 16, {0x33, 0x74, 0x0a, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xe5, 0x82, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x35} }, +{ 0x8c92, 16, {0x83, 0xf5, 0x83, 0xe0, 0x90, 0x01, 0x34, 0xf0, 0x7e, 0x01, 0x7f, 0x33, 0x7d, 0x02, 0x12, 0x91} }, +{ 0x8ca2, 3, {0x6a, 0x7f, 0x00} }, +{ 0x8ca5, 1, {0x22} }, +{ 0x8ca6, 4, {0x8e, 0x57, 0x8f, 0x58} }, +{ 0x8caa, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} }, +{ 0x8cba, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xad, 0x82, 0xfc, 0x85, 0x58} }, +{ 0x8cca, 16, {0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0x60, 0x0f, 0xed, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3c, 0xf5} }, +{ 0x8cda, 16, {0x83, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x43, 0xee, 0x75, 0xf0, 0x0d, 0xa4, 0x24, 0x0c, 0xf5, 0x82} }, +{ 0x8cea, 16, {0xe4, 0x34, 0x03, 0xf5, 0x83, 0xe0, 0x30, 0xe0, 0x20, 0xee, 0x25, 0xe0, 0x24, 0xc6, 0xf5, 0x82} }, +{ 0x8cfa, 16, {0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe0, 0x30, 0xe1, 0xf0, 0x7f, 0x60, 0xed, 0x24, 0x05, 0xf5, 0x82} }, +{ 0x8d0a, 16, {0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0x5f, 0xb5, 0x07, 0xf2, 0xae, 0x04, 0xaf, 0x05, 0xef, 0x24, 0x04} }, +{ 0x8d1a, 12, {0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0x54, 0xfd, 0xf0, 0x7f, 0x00} }, +{ 0x8d26, 1, {0x22} }, +{ 0x8d27, 4, {0xad, 0x07, 0xac, 0x06} }, +{ 0x8d2b, 16, {0x8d, 0x82, 0x8c, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} }, +{ 0x8d3b, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xfe, 0x8d, 0x82} }, +{ 0x8d4b, 16, {0x8c, 0x83, 0xa3, 0xe0, 0x60, 0x0f, 0xef, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0} }, +{ 0x8d5b, 16, {0x44, 0x01, 0xf0, 0x80, 0x0d, 0xef, 0x24, 0x04, 0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0x54} }, +{ 0x8d6b, 4, {0xfe, 0xf0, 0x7f, 0x00} }, +{ 0x8d6f, 1, {0x22} }, +{ 0x8d70, 4, {0xad, 0x07, 0xac, 0x06} }, +{ 0x8d74, 16, {0x8d, 0x82, 0x8c, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xee} }, +{ 0x8d84, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xfe, 0x8d, 0x82} }, +{ 0x8d94, 16, {0x8c, 0x83, 0xa3, 0xe0, 0x60, 0x0d, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x44, 0x40} }, +{ 0x8da4, 16, {0xf0, 0x80, 0x0b, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x54, 0xbf, 0xf0, 0x7f, 0x00} }, +{ 0x8db4, 1, {0x22} }, +{ 0x8db5, 16, {0x8f, 0x82, 0x8e, 0x83, 0xe0, 0x14, 0xfe, 0xc3, 0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xaf} }, +{ 0x8dc5, 16, {0x06, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x3e, 0x7f, 0x00} }, +{ 0x8dd5, 1, {0x22} }, +{ 0x8dd6, 4, {0x8e, 0x57, 0x8f, 0x58} }, +{ 0x8dda, 16, {0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xe0, 0xf5, 0x5c, 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0xf5, 0x59, 0xd3} }, +{ 0x8dea, 16, {0x94, 0x04, 0x40, 0x03, 0x7f, 0xff, 0x22, 0xe5, 0x59, 0x24, 0xfe, 0x60, 0x16, 0x14, 0x60, 0x1f} }, +{ 0x8dfa, 16, {0x14, 0x60, 0x28, 0x24, 0x03, 0x70, 0x2e, 0x7e, 0x7e, 0x7f, 0x80, 0x75, 0x5a, 0x7e, 0x75, 0x5b} }, +{ 0x8e0a, 16, {0x80, 0x80, 0x22, 0x7e, 0x7e, 0x7f, 0x00, 0x75, 0x5a, 0x7e, 0x75, 0x5b, 0x00, 0x80, 0x16, 0x7e} }, +{ 0x8e1a, 16, {0x7d, 0x7f, 0x80, 0x75, 0x5a, 0x7d, 0x75, 0x5b, 0x80, 0x80, 0x0a, 0x7e, 0x7d, 0x7f, 0x00, 0x75} }, +{ 0x8e2a, 16, {0x5a, 0x7d, 0x75, 0x5b, 0x00, 0xe5, 0x5c, 0x70, 0x1b, 0x85, 0x5b, 0x82, 0x85, 0x5a, 0x83, 0x74} }, +{ 0x8e3a, 16, {0xff, 0xf0, 0xe5, 0x59, 0x25, 0xe0, 0x24, 0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0x74} }, +{ 0x8e4a, 16, {0x01, 0xf0, 0x80, 0x48, 0xe5, 0x58, 0x24, 0x02, 0xff, 0xe4, 0x35, 0x57, 0xfe, 0xe5, 0x5c, 0x60} }, +{ 0x8e5a, 16, {0x23, 0x0f, 0xef, 0xac, 0x06, 0x70, 0x01, 0x0e, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xe0, 0xfd, 0x05} }, +{ 0x8e6a, 16, {0x5b, 0xe5, 0x5b, 0xaa, 0x5a, 0x70, 0x02, 0x05, 0x5a, 0x14, 0xf5, 0x82, 0x8a, 0x83, 0xed, 0xf0} }, +{ 0x8e7a, 16, {0x15, 0x5c, 0x80, 0xd9, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xff, 0xe5, 0x59, 0x25} }, +{ 0x8e8a, 14, {0xe0, 0x24, 0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xef, 0xf0, 0x7f, 0x00} }, +{ 0x8e98, 1, {0x22} }, +{ 0x8e99, 16, {0xef, 0x24, 0x05, 0xf5, 0x58, 0xe4, 0x3e, 0xf5, 0x57, 0x90, 0x01, 0x35, 0x74, 0x07, 0xf0, 0x90} }, +{ 0x8ea9, 16, {0x01, 0x7a, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0x36, 0xf0, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3} }, +{ 0x8eb9, 16, {0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0x8e, 0x59, 0xf5, 0x5a, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83} }, +{ 0x8ec9, 16, {0xe0, 0x24, 0x9e, 0x60, 0x61, 0x24, 0xf9, 0x60, 0x0e, 0x24, 0xf1, 0x70, 0x03, 0x02, 0x8f, 0x7a} }, +{ 0x8ed9, 16, {0x24, 0x14, 0x60, 0x03, 0x02, 0x8f, 0xc8, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe} }, +{ 0x8ee9, 16, {0xa3, 0xe0, 0xff, 0xc3, 0xe4, 0x9f, 0xf5, 0x5c, 0x74, 0x01, 0x9e, 0xf5, 0x5b, 0xd3, 0xe5, 0x5c} }, +{ 0x8ef9, 16, {0x94, 0x3f, 0xe5, 0x5b, 0x94, 0x00, 0x40, 0x06, 0x75, 0x5b, 0x00, 0x75, 0x5c, 0x3f, 0xd3, 0xe5} }, +{ 0x8f09, 16, {0x5a, 0x95, 0x5c, 0xe5, 0x59, 0x95, 0x5b, 0x50, 0x03, 0x02, 0x8f, 0xcb, 0xae, 0x5b, 0xaf, 0x5c} }, +{ 0x8f19, 16, {0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e} }, +{ 0x8f29, 16, {0x59, 0xf5, 0x5a, 0x02, 0x8f, 0xcb, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3} }, +{ 0x8f39, 16, {0xe0, 0xff, 0xc3, 0x74, 0x30, 0x9f, 0xf5, 0x5c, 0xe4, 0x9e, 0xf5, 0x5b, 0xd3, 0xe5, 0x5c, 0x94} }, +{ 0x8f49, 16, {0x10, 0xe5, 0x5b, 0x94, 0x00, 0x40, 0x06, 0x75, 0x5b, 0x00, 0x75, 0x5c, 0x10, 0xd3, 0xe5, 0x5a} }, +{ 0x8f59, 16, {0x95, 0x5c, 0xe5, 0x59, 0x95, 0x5b, 0x40, 0x6a, 0xae, 0x5b, 0xaf, 0x5c, 0x85, 0x58, 0x82, 0x85} }, +{ 0x8f69, 16, {0x57, 0x83, 0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e, 0x59, 0xf5, 0x5a, 0x80} }, +{ 0x8f79, 16, {0x51, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0xe4, 0x9f} }, +{ 0x8f89, 16, {0xf5, 0x5c, 0xe4, 0x9e, 0xf5, 0x5b, 0x45, 0x5c, 0x60, 0x0b, 0xd3, 0xe5, 0x5c, 0x94, 0x3f, 0xe5} }, +{ 0x8f99, 16, {0x5b, 0x94, 0x00, 0x40, 0x06, 0x75, 0x5b, 0x00, 0x75, 0x5c, 0x3f, 0xd3, 0xe5, 0x5a, 0x95, 0x5c} }, +{ 0x8fa9, 16, {0xe5, 0x59, 0x95, 0x5b, 0x40, 0x1c, 0xae, 0x5b, 0xaf, 0x5c, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83} }, +{ 0x8fb9, 16, {0xa3, 0xa3, 0xa3, 0xee, 0xf0, 0xfe, 0xa3, 0xef, 0xf0, 0x8e, 0x59, 0xf5, 0x5a, 0x80, 0x03, 0x7f} }, +{ 0x8fc9, 16, {0x01, 0x22, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xe0, 0x24, 0x9e, 0x70, 0x03, 0x02, 0x90, 0x8b} }, +{ 0x8fd9, 16, {0x24, 0xf9, 0x60, 0x58, 0x24, 0xf1, 0x70, 0x03, 0x02, 0x90, 0xdb, 0x24, 0x14, 0x60, 0x03, 0x02} }, +{ 0x8fe9, 16, {0x91, 0x1f, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xd3, 0x94} }, +{ 0x8ff9, 16, {0xff, 0xee, 0x94, 0x00, 0x40, 0x03, 0x02, 0x91, 0x1f, 0x90, 0x01, 0x75, 0xef, 0xf0, 0xe5, 0x5a} }, +{ 0x9009, 16, {0x15, 0x5a, 0xae, 0x59, 0x70, 0x02, 0x15, 0x59, 0x4e, 0x70, 0x03, 0x02, 0x91, 0x1f, 0x90, 0x01} }, +{ 0x9019, 16, {0x75, 0xe0, 0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90, 0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01} }, +{ 0x9029, 16, {0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0, 0x80, 0xd2, 0x85, 0x58, 0x82, 0x85} }, +{ 0x9039, 16, {0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x94, 0x80, 0xee, 0x94, 0x00, 0x50, 0x03} }, +{ 0x9049, 16, {0x02, 0x91, 0x1f, 0xd3, 0xef, 0x94, 0xff, 0xee, 0x94, 0x00, 0x40, 0x03, 0x02, 0x91, 0x1f, 0x90} }, +{ 0x9059, 16, {0x01, 0x76, 0xef, 0xf0, 0xe5, 0x5a, 0x15, 0x5a, 0xae, 0x59, 0x70, 0x02, 0x15, 0x59, 0x4e, 0x70} }, +{ 0x9069, 16, {0x03, 0x02, 0x91, 0x1f, 0x90, 0x01, 0x76, 0xe0, 0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90} }, +{ 0x9079, 16, {0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0} }, +{ 0x9089, 16, {0x80, 0xd2, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x94} }, +{ 0x9099, 16, {0x20, 0xee, 0x94, 0x00, 0x50, 0x03, 0x02, 0x91, 0x1f, 0xd3, 0xef, 0x94, 0x2f, 0xee, 0x94, 0x00} }, +{ 0x90a9, 16, {0x50, 0x74, 0x90, 0x01, 0x77, 0xef, 0xf0, 0xe5, 0x5a, 0x15, 0x5a, 0xae, 0x59, 0x70, 0x02, 0x15} }, +{ 0x90b9, 16, {0x59, 0x4e, 0x60, 0x62, 0x90, 0x01, 0x77, 0xe0, 0xff, 0x04, 0xf0, 0xa8, 0x07, 0xe6, 0xff, 0x90} }, +{ 0x90c9, 16, {0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xef, 0xf0} }, +{ 0x90d9, 16, {0x80, 0xd5, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xa3, 0xe0, 0xff, 0xa3, 0xe0, 0x90, 0x01, 0x78} }, +{ 0x90e9, 16, {0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0xe5, 0x5a, 0x15, 0x5a, 0xae, 0x59, 0x70, 0x02, 0x15, 0x59, 0x4e} }, +{ 0x90f9, 16, {0x60, 0x24, 0x90, 0x01, 0x78, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5} }, +{ 0x9109, 16, {0x83, 0xe0, 0xff, 0x90, 0x01, 0x7a, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82} }, +{ 0x9119, 16, {0xf5, 0x83, 0xef, 0xf0, 0x80, 0xcf, 0x7e, 0x01, 0x7f, 0x35, 0x85, 0x58, 0x82, 0x85, 0x57, 0x83} }, +{ 0x9129, 13, {0xa3, 0xa3, 0xa3, 0xe0, 0xa3, 0xe0, 0x04, 0xfd, 0x12, 0x91, 0x6a, 0x7f, 0x00} }, +{ 0x9136, 1, {0x22} }, +{ 0x9137, 16, {0x8e, 0x62, 0x8f, 0x63, 0x8c, 0x64, 0x8d, 0x65, 0xaf, 0x03, 0x1b, 0xef, 0x60, 0x24, 0x05, 0x63} }, +{ 0x9147, 16, {0xe5, 0x63, 0xae, 0x62, 0x70, 0x02, 0x05, 0x62, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe0, 0xff, 0x05} }, +{ 0x9157, 16, {0x65, 0xe5, 0x65, 0xac, 0x64, 0x70, 0x02, 0x05, 0x64, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0} }, +{ 0x9167, 3, {0x80, 0xd6, 0x22} }, +{ 0x916a, 6, {0x8d, 0x5d, 0xab, 0x07, 0xaa, 0x06} }, +{ 0x9170, 16, {0x75, 0x61, 0x40, 0x75, 0x60, 0x0d, 0x75, 0x5f, 0x03, 0x75, 0x5e, 0x00, 0x90, 0x7f, 0xc2, 0xe0} }, +{ 0x9180, 16, {0x20, 0xe1, 0xf9, 0xaf, 0x61, 0xae, 0x60, 0xad, 0x5f, 0xac, 0x5e, 0xec, 0x4d, 0x4e, 0x4f, 0x70} }, +{ 0x9190, 16, {0x08, 0x90, 0x7f, 0xc2, 0x74, 0x02, 0xf0, 0x80, 0xd7, 0x90, 0x7f, 0xc2, 0xe0, 0x20, 0xe1, 0x16} }, +{ 0x91a0, 16, {0xaf, 0x03, 0xae, 0x02, 0x7c, 0x7b, 0x7d, 0x80, 0xab, 0x5d, 0x12, 0x91, 0x37, 0x90, 0x7f, 0xc3} }, +{ 0x91b0, 8, {0xe5, 0x5d, 0xf0, 0x7f, 0x01, 0x22, 0x7f, 0x00} }, +{ 0x91b8, 1, {0x22} }, +{ 0x91b9, 16, {0x90, 0x01, 0x84, 0x74, 0x0b, 0xf0, 0xa3, 0xe5, 0x33, 0xf0, 0x90, 0x0a, 0xf5, 0xe4, 0x93, 0x90} }, +{ 0x91c9, 16, {0x01, 0x86, 0xf0, 0x90, 0x0a, 0xf6, 0xe4, 0x93, 0x90, 0x01, 0x87, 0xf0, 0xe4, 0x90, 0x01, 0x7c} }, +{ 0x91d9, 16, {0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0x74, 0x01} }, +{ 0x91e9, 16, {0xf0, 0xa3, 0x74, 0x88, 0xf0, 0x7e, 0x01, 0x7f, 0x7c, 0x12, 0x19, 0xc1, 0x7e, 0x01, 0x7f, 0x84} }, +{ 0x91f9, 7, {0x7d, 0x14, 0x12, 0x91, 0x6a, 0x7f, 0x00} }, +{ 0x9200, 1, {0x22} }, +{ 0x9201, 16, {0x7e, 0x7b, 0x7f, 0x40, 0x75, 0x4e, 0x7b, 0x75, 0x4f, 0x40, 0x90, 0x7f, 0xd3, 0xe0, 0xff, 0x85} }, +{ 0x9211, 16, {0x4e, 0x51, 0x85, 0x4f, 0x52, 0xe5, 0x52, 0x24, 0x01, 0xf5, 0x56, 0xe4, 0x35, 0x51, 0xf5, 0x55} }, +{ 0x9221, 16, {0xe4, 0xf5, 0x50, 0x85, 0x52, 0x82, 0x85, 0x51, 0x83, 0xe0, 0xfe, 0x14, 0xb4, 0x0c, 0x00, 0x50} }, +{ 0x9231, 16, {0x5b, 0x90, 0x92, 0x39, 0xf8, 0x28, 0x28, 0x73, 0x02, 0x92, 0x5d, 0x02, 0x92, 0x5d, 0x02, 0x92} }, +{ 0x9241, 16, {0x67, 0x02, 0x92, 0x71, 0x02, 0x92, 0x71, 0x02, 0x92, 0x71, 0x02, 0x92, 0x85, 0x02, 0x92, 0x5d} }, +{ 0x9251, 16, {0x02, 0x92, 0x7b, 0x02, 0x92, 0x5d, 0x02, 0x92, 0x8d, 0x02, 0x92, 0x5d, 0xef, 0x64, 0x02, 0x60} }, +{ 0x9261, 16, {0x2b, 0x75, 0x50, 0xff, 0x80, 0x26, 0xef, 0x64, 0x0e, 0x60, 0x21, 0x75, 0x50, 0xff, 0x80, 0x1c} }, +{ 0x9271, 16, {0xef, 0x64, 0x03, 0x60, 0x17, 0x75, 0x50, 0xff, 0x80, 0x12, 0xef, 0x64, 0x03, 0x60, 0x0d, 0x75} }, +{ 0x9281, 16, {0x50, 0xff, 0x80, 0x08, 0xef, 0x64, 0x06, 0x60, 0x03, 0x75, 0x50, 0xff, 0xe5, 0x50, 0x60, 0x15} }, +{ 0x9291, 16, {0x90, 0x01, 0x98, 0x74, 0x11, 0xf0, 0xa3, 0xee, 0xf0, 0x7e, 0x01, 0x7f, 0x98, 0x7d, 0x02, 0x12} }, +{ 0x92a1, 16, {0x91, 0x6a, 0xaf, 0x50, 0x22, 0xe4, 0xf5, 0x50, 0x85, 0x52, 0x82, 0x85, 0x51, 0x83, 0xe0, 0x14} }, +{ 0x92b1, 16, {0xb4, 0x0f, 0x00, 0x40, 0x03, 0x02, 0x93, 0xcf, 0x90, 0x92, 0xc0, 0xf8, 0x28, 0x28, 0x73, 0x02} }, +{ 0x92c1, 16, {0x92, 0xed, 0x02, 0x92, 0xf9, 0x02, 0x93, 0x05, 0x02, 0x93, 0x53, 0x02, 0x93, 0x5e, 0x02, 0x93} }, +{ 0x92d1, 16, {0x69, 0x02, 0x93, 0x74, 0x02, 0x93, 0x7f, 0x02, 0x93, 0x8a, 0x02, 0x93, 0x95, 0x02, 0x93, 0xa0} }, +{ 0x92e1, 16, {0x02, 0x93, 0xa7, 0x02, 0x93, 0xcf, 0x02, 0x93, 0xb2, 0x02, 0x93, 0xbd, 0xaf, 0x56, 0xae, 0x55} }, +{ 0x92f1, 16, {0x12, 0x84, 0x41, 0x8f, 0x50, 0x02, 0x93, 0xd2, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x85, 0x61, 0x8f} }, +{ 0x9301, 16, {0x50, 0x02, 0x93, 0xd2, 0x85, 0x55, 0x53, 0x85, 0x56, 0x54, 0xe5, 0x54, 0x24, 0x01, 0xff, 0xe4} }, +{ 0x9311, 16, {0x35, 0x53, 0xfe, 0x12, 0x86, 0xbe, 0xaf, 0x54, 0xae, 0x53, 0x12, 0x87, 0x51, 0x8f, 0x50, 0xef} }, +{ 0x9321, 16, {0x64, 0x01, 0x60, 0x03, 0x02, 0x93, 0xd2, 0xaf, 0x54, 0xae, 0x53, 0x12, 0x87, 0xa6, 0x8f, 0x50} }, +{ 0x9331, 16, {0xe5, 0x50, 0x70, 0x03, 0x02, 0x93, 0xd2, 0x85, 0x54, 0x82, 0x85, 0x53, 0x83, 0xe0, 0x75, 0xf0} }, +{ 0x9341, 16, {0x0d, 0xa4, 0x24, 0xf4, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xaf, 0x82, 0xfe, 0x12, 0x87, 0xa6, 0x02} }, +{ 0x9351, 16, {0x93, 0xd2, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8c, 0xa6, 0x8f, 0x50, 0x80, 0x74, 0xaf, 0x56, 0xae} }, +{ 0x9361, 16, {0x55, 0x12, 0x8d, 0x27, 0x8f, 0x50, 0x80, 0x69, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8d, 0x70, 0x8f} }, +{ 0x9371, 16, {0x50, 0x80, 0x5e, 0xaf, 0x4f, 0xae, 0x4e, 0x12, 0x8e, 0x99, 0x8f, 0x50, 0x80, 0x53, 0xaf, 0x56} }, +{ 0x9381, 16, {0xae, 0x55, 0x12, 0x8b, 0xbd, 0x8f, 0x50, 0x80, 0x48, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x86, 0x2d} }, +{ 0x9391, 16, {0x8f, 0x50, 0x80, 0x3d, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8c, 0x62, 0x8f, 0x50, 0x80, 0x32, 0x12} }, +{ 0x93a1, 16, {0x91, 0xb9, 0x8f, 0x50, 0x80, 0x2b, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8d, 0xb5, 0x8f, 0x50, 0x80} }, +{ 0x93b1, 16, {0x20, 0xaf, 0x56, 0xae, 0x55, 0x12, 0x8d, 0xd6, 0x8f, 0x50, 0x80, 0x15, 0xaf, 0x4f, 0xae, 0x4e} }, +{ 0x93c1, 16, {0x7c, 0x02, 0x7d, 0xaf, 0x7b, 0x40, 0x12, 0x91, 0x37, 0xe4, 0xf5, 0x50, 0x80, 0x03, 0x75, 0x50} }, +{ 0x93d1, 16, {0xff, 0xe5, 0x50, 0x60, 0x1d, 0x90, 0x01, 0x98, 0x74, 0x11, 0xf0, 0x85, 0x52, 0x82, 0x85, 0x51} }, +{ 0x93e1, 16, {0x83, 0xe0, 0x90, 0x01, 0x99, 0xf0, 0x7e, 0x01, 0x7f, 0x98, 0x7d, 0x02, 0x12, 0x91, 0x6a, 0xaf} }, +{ 0x93f1, 16, {0x50, 0x22, 0x85, 0x52, 0x82, 0x85, 0x51, 0x83, 0xe0, 0xff, 0x14, 0x24, 0xfa, 0x50, 0x04, 0x24} }, +{ 0x9401, 16, {0xfe, 0x70, 0x1f, 0x90, 0x01, 0x98, 0x74, 0x10, 0xf0, 0xa3, 0xef, 0xf0, 0x85, 0x56, 0x82, 0x85} }, +{ 0x9411, 16, {0x55, 0x83, 0xe0, 0x90, 0x01, 0x9a, 0xf0, 0x7e, 0x01, 0x7f, 0x98, 0x7d, 0x03, 0x12, 0x91, 0x6a} }, +{ 0x9421, 4, {0x8f, 0x50, 0xaf, 0x50} }, +{ 0x9425, 1, {0x22} }, +{ 0x9426, 8, {0x8f, 0x51, 0x8e, 0x50, 0x8d, 0x4f, 0x8c, 0x4e} }, +{ 0x942e, 16, {0x75, 0x58, 0x01, 0x75, 0x59, 0x9c, 0xe4, 0xf5, 0x57, 0xaf, 0x53, 0x15, 0x53, 0xef, 0x70, 0x03} }, +{ 0x943e, 16, {0x02, 0x94, 0xc4, 0xaf, 0x52, 0xe4, 0xfc, 0xfd, 0xfe, 0xf8, 0xf9, 0xfa, 0xab, 0x07, 0xaf, 0x51} }, +{ 0x944e, 16, {0xae, 0x50, 0xad, 0x4f, 0xac, 0x4e, 0x12, 0xa3, 0x21, 0xaf, 0x03, 0x8f, 0x56, 0xaf, 0x51, 0xae} }, +{ 0x945e, 16, {0x50, 0xad, 0x4f, 0xac, 0x4e, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xaf, 0x52, 0xe4} }, +{ 0x946e, 16, {0xfc, 0xfd, 0xfe, 0xf8, 0xf9, 0xfa, 0xab, 0x07, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04} }, +{ 0x947e, 16, {0x12, 0xa3, 0x21, 0x8f, 0x51, 0x8e, 0x50, 0x8d, 0x4f, 0x8c, 0x4e, 0xe5, 0x56, 0x24, 0x30, 0xf5} }, +{ 0x948e, 16, {0x56, 0xd3, 0x94, 0x39, 0x40, 0x06, 0x74, 0x07, 0x25, 0x56, 0xf5, 0x56, 0x05, 0x59, 0xe5, 0x59} }, +{ 0x949e, 16, {0xae, 0x58, 0x70, 0x02, 0x05, 0x58, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe4, 0xf0, 0x05, 0x59, 0xe5} }, +{ 0x94ae, 16, {0x59, 0xae, 0x58, 0x70, 0x02, 0x05, 0x58, 0x14, 0xf5, 0x82, 0x8e, 0x83, 0xe5, 0x56, 0xf0, 0x05} }, +{ 0x94be, 16, {0x57, 0x05, 0x57, 0x02, 0x94, 0x37, 0xe5, 0x59, 0x15, 0x59, 0x70, 0x02, 0x15, 0x58, 0xaf, 0x57} }, +{ 0x94ce, 16, {0x15, 0x57, 0xef, 0x60, 0x23, 0xe5, 0x59, 0x15, 0x59, 0xae, 0x58, 0x70, 0x02, 0x15, 0x58, 0xf5} }, +{ 0x94de, 16, {0x82, 0x8e, 0x83, 0xe0, 0xff, 0x05, 0x55, 0xe5, 0x55, 0xac, 0x54, 0x70, 0x02, 0x05, 0x54, 0x14} }, +{ 0x94ee, 8, {0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x80, 0xd6} }, +{ 0x94f6, 1, {0x22} }, +{ 0x94f7, 16, {0xe4, 0x90, 0x01, 0xc9, 0xf0, 0x7e, 0x01, 0x7f, 0xca, 0x90, 0x01, 0xbe, 0xee, 0xf0, 0xa3, 0xef} }, +{ 0x9507, 10, {0xf0, 0x90, 0x01, 0xc2, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x22} }, +{ 0x9511, 16, {0xaa, 0x07, 0xa9, 0x05, 0x90, 0x01, 0xc9, 0xe0, 0xc3, 0x94, 0x40, 0x50, 0x61, 0xac, 0x02, 0x74} }, +{ 0x9521, 16, {0x01, 0x7e, 0x00, 0xa8, 0x04, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff} }, +{ 0x9531, 16, {0xe4, 0xef, 0x55, 0x34, 0x60, 0x45, 0xea, 0x04, 0xff, 0x90, 0x01, 0xc2, 0xe0, 0xfc, 0xa3, 0xe0} }, +{ 0x9541, 16, {0xfd, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0xa3, 0xe9, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3} }, +{ 0x9551, 16, {0xeb, 0xf0, 0x90, 0x01, 0xc2, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0xa2, 0x81, 0xfc, 0xd3, 0xe5, 0xf0} }, +{ 0x9561, 16, {0x94, 0x87, 0xec, 0x94, 0x02, 0x40, 0x0a, 0x90, 0x01, 0xc2, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0xca} }, +{ 0x9571, 16, {0xf0, 0xc2, 0xaf, 0x90, 0x01, 0xc9, 0xe0, 0x04, 0xf0, 0xd2, 0xaf, 0x7f, 0x01, 0x22, 0x7f, 0x00} }, +{ 0x9581, 1, {0x22} }, +{ 0x9582, 16, {0x90, 0x01, 0xc9, 0xe0, 0xd3, 0x94, 0x00, 0x40, 0x55, 0x90, 0x01, 0xbe, 0xe0, 0xfc, 0xa3, 0xe0} }, +{ 0x9592, 16, {0xaa, 0x04, 0xf9, 0x7b, 0x01, 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0xaa, 0x06, 0xa9, 0x07, 0xa8} }, +{ 0x95a2, 16, {0x01, 0xac, 0x02, 0xad, 0x03, 0xd0, 0x01, 0xd0, 0x02, 0xd0, 0x03, 0x7e, 0x00, 0x7f, 0x03, 0x12} }, +{ 0x95b2, 16, {0xa2, 0x12, 0x90, 0x01, 0xbe, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0xa2, 0x81, 0xfc, 0xd3, 0xe5, 0xf0} }, +{ 0x95c2, 16, {0x94, 0x87, 0xec, 0x94, 0x02, 0x40, 0x0a, 0x90, 0x01, 0xbe, 0x74, 0x01, 0xf0, 0xa3, 0x74, 0xca} }, +{ 0x95d2, 16, {0xf0, 0xc2, 0xaf, 0x90, 0x01, 0xc9, 0xe0, 0x14, 0xf0, 0xd2, 0xaf, 0x7f, 0x01, 0x22, 0x7f, 0x00} }, +{ 0x95e2, 1, {0x22} }, +{ 0x95e3, 16, {0x90, 0x7f, 0xc2, 0xe0, 0x20, 0xe1, 0x73, 0x7e, 0x7b, 0x7f, 0x80, 0x75, 0x53, 0x7b, 0x75, 0x54} }, +{ 0x95f3, 16, {0x80, 0xe5, 0x54, 0x24, 0x01, 0xff, 0xe4, 0x35, 0x53, 0xa9, 0x07, 0x7b, 0x01, 0x8b, 0x55, 0xf5} }, +{ 0x9603, 16, {0x56, 0x89, 0x57, 0xfe, 0x12, 0x95, 0x82, 0xef, 0x60, 0x50, 0xab, 0x55, 0xaa, 0x56, 0xa9, 0x57} }, +{ 0x9613, 16, {0x12, 0xa2, 0x3b, 0x14, 0xff, 0x90, 0x00, 0x01, 0x12, 0xa2, 0x54, 0xb4, 0x02, 0x16, 0xc2, 0xaf} }, +{ 0x9623, 16, {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0x44} }, +{ 0x9633, 16, {0x04, 0xf0, 0xd2, 0xaf, 0x74, 0x01, 0x7e, 0x00, 0xa8, 0x07, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce} }, +{ 0x9643, 16, {0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe4, 0xef, 0x55, 0x34, 0x60, 0x0f, 0x85, 0x54, 0x82, 0x85, 0x53} }, +{ 0x9653, 10, {0x83, 0x74, 0x0d, 0xf0, 0x90, 0x7f, 0xc3, 0x74, 0x04, 0xf0} }, +{ 0x965d, 1, {0x22} }, +{ 0x965e, 16, {0x12, 0x95, 0xe3, 0xe4, 0xf5, 0x4e, 0x74, 0x3a, 0x25, 0x4e, 0xf8, 0xe6, 0x54, 0xf0, 0xf5, 0x4f} }, +{ 0x966e, 16, {0x74, 0xc5, 0x25, 0x4e, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, 0xe0, 0x65, 0x4f, 0xff, 0xc4} }, +{ 0x967e, 16, {0x54, 0x0f, 0xf5, 0x50, 0x60, 0x22, 0x74, 0xc5, 0x25, 0x4e, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5} }, +{ 0x968e, 16, {0x83, 0xe5, 0x4f, 0xf0, 0xaf, 0x4e, 0x7d, 0x01, 0xe5, 0x4f, 0x45, 0x50, 0xfb, 0x12, 0x95, 0x11} }, +{ 0x969e, 16, {0xef, 0x70, 0x05, 0x12, 0x95, 0xe3, 0x80, 0xec, 0x05, 0x4e, 0xe5, 0x4e, 0xc3, 0x94, 0x04, 0x40} }, +{ 0x96ae, 16, {0xb5, 0x12, 0x95, 0xe3, 0xe5, 0x3e, 0x60, 0x48, 0xe4, 0xf5, 0x4e, 0xaf, 0x4e, 0x74, 0x01, 0xa8} }, +{ 0x96be, 16, {0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x4f, 0x55, 0x3e, 0x60, 0x29, 0xe5, 0x4e} }, +{ 0x96ce, 16, {0x75, 0xf0, 0x08, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xf5, 0x83, 0xe0, 0x30, 0xe6} }, +{ 0x96de, 16, {0x16, 0xaf, 0x4e, 0x7d, 0x04, 0x7b, 0x80, 0x12, 0x95, 0x11, 0xef, 0x70, 0x05, 0x12, 0x95, 0xe3} }, +{ 0x96ee, 16, {0x80, 0xef, 0xe5, 0x4f, 0xf4, 0x52, 0x3e, 0x05, 0x4e, 0xe5, 0x4e, 0xc3, 0x94, 0x04, 0x40, 0xbb} }, +{ 0x96fe, 16, {0x90, 0x03, 0x00, 0xe0, 0x60, 0x03, 0x02, 0x97, 0xdf, 0x74, 0x19, 0xf0, 0xe5, 0x33, 0xc3, 0x94} }, +{ 0x970e, 16, {0x01, 0x40, 0x0d, 0x90, 0x20, 0x78, 0xe0, 0x54, 0x0f, 0x75, 0x51, 0x00, 0xf5, 0x52, 0x80, 0x09} }, +{ 0x971e, 16, {0x7f, 0x02, 0x12, 0x11, 0x27, 0x8e, 0x51, 0x8f, 0x52, 0xc3, 0xe5, 0x51, 0x64, 0x80, 0x94, 0x80} }, +{ 0x972e, 16, {0x40, 0xda, 0x90, 0x01, 0xbc, 0xe0, 0x65, 0x52, 0xf0, 0x60, 0x37, 0xe4, 0xf5, 0x4e, 0xaf, 0x4e} }, +{ 0x973e, 16, {0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x4f, 0x90, 0x01, 0xbc} }, +{ 0x974e, 16, {0xe0, 0x55, 0x4f, 0x60, 0x14, 0xaf, 0x4e, 0x7d, 0x08, 0xe5, 0x4f, 0x55, 0x52, 0xfb, 0x12, 0x95} }, +{ 0x975e, 16, {0x11, 0xef, 0x70, 0x05, 0x12, 0x95, 0xe3, 0x80, 0xec, 0x05, 0x4e, 0xe5, 0x4e, 0xc3, 0x94, 0x04} }, +{ 0x976e, 16, {0x40, 0xcc, 0x90, 0x01, 0xbc, 0xe5, 0x52, 0xf0, 0xe4, 0xf5, 0x4e, 0xc2, 0xaf, 0x74, 0x36, 0x25} }, +{ 0x977e, 16, {0x4e, 0xf8, 0xe6, 0xf5, 0x4f, 0xe4, 0xf6, 0xd2, 0xaf, 0x53, 0x4f, 0x1e, 0xe5, 0x4f, 0x60, 0x11} }, +{ 0x978e, 16, {0xaf, 0x4e, 0x7d, 0x02, 0xab, 0x4f, 0x12, 0x95, 0x11, 0xef, 0x70, 0x05, 0x12, 0x95, 0xe3, 0x80} }, +{ 0x979e, 16, {0xef, 0x74, 0x2d, 0x25, 0x4e, 0xf8, 0xe6, 0xf5, 0x4f, 0x74, 0xfc, 0x25, 0x4e, 0xf5, 0x82, 0xe4} }, +{ 0x97ae, 16, {0x34, 0x02, 0xf5, 0x83, 0xe0, 0x65, 0x4f, 0x60, 0x11, 0xaf, 0x4e, 0x7d, 0x04, 0xab, 0x4f, 0x12} }, +{ 0x97be, 16, {0x95, 0x11, 0xef, 0x70, 0x05, 0x12, 0x95, 0xe3, 0x80, 0xef, 0x74, 0xfc, 0x25, 0x4e, 0xf5, 0x82} }, +{ 0x97ce, 16, {0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe5, 0x4f, 0xf0, 0x05, 0x4e, 0xe5, 0x4e, 0xc3, 0x94, 0x04, 0x40} }, +{ 0x97de, 4, {0x9a, 0x12, 0x95, 0xe3} }, +{ 0x97e2, 1, {0x22} }, +{ 0x97e3, 12, {0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x67, 0x02, 0x98, 0x2a} }, +{ 0x97ef, 16, {0x02, 0x05, 0xad, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2} }, +{ 0x97ff, 16, {0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33} }, +{ 0x980f, 16, {0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf} }, +{ 0x981f, 16, {0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x98, 0x6f, 0xe4, 0x7e} }, +{ 0x982f, 16, {0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93} }, +{ 0x983f, 16, {0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3} }, +{ 0x984f, 16, {0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca} }, +{ 0x985f, 16, {0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe} }, +{ 0x986f, 16, {0x60, 0x24, 0x02, 0x8a, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x81, 0x82, 0x84, 0x88} }, +{ 0x987f, 16, {0x90, 0xa0, 0xc0, 0xc1, 0xc2, 0xc4, 0xc8, 0xd0, 0xe0, 0xe1, 0xe2, 0xe4, 0xe8, 0xf0, 0xf1, 0xf2} }, +{ 0x988f, 8, {0xf4, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xfe, 0xff} }, +{ 0x9897, 1, {0x00} }, +{ 0x9898, 8, {0x8b, 0x59, 0x8a, 0x5a, 0x89, 0x5b, 0x8d, 0x5c} }, +{ 0x98a0, 16, {0xe4, 0xf5, 0x5d, 0xf5, 0x5e, 0xaf, 0x5c, 0x15, 0x5c, 0xef, 0x60, 0x36, 0xab, 0x59, 0x05, 0x5b} }, +{ 0x98b0, 16, {0xe5, 0x5b, 0xaa, 0x5a, 0x70, 0x02, 0x05, 0x5a, 0x14, 0xf9, 0x12, 0xa2, 0x3b, 0xff, 0xe5, 0x5d} }, +{ 0x98c0, 16, {0xe5, 0x5e, 0x6f, 0x25, 0xe0, 0xff, 0xe4, 0x33, 0xfe, 0x74, 0x95, 0x2f, 0xf5, 0x82, 0xee, 0x34} }, +{ 0x98d0, 16, {0x9e, 0xf5, 0x83, 0xe5, 0x5d, 0xff, 0xe4, 0x93, 0xf5, 0x5d, 0x74, 0x01, 0x93, 0x6f, 0xf5, 0x5e} }, +{ 0x98e0, 6, {0x80, 0xc3, 0xae, 0x5d, 0xaf, 0x5e} }, +{ 0x98e6, 1, {0x22} }, +{ 0x98e7, 11, {0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x18} }, +{ 0x98f2, 16, {0x90, 0x20, 0x60, 0xe0, 0x54, 0x0f, 0xfe, 0x30, 0xe0, 0x05, 0x90, 0x20, 0x02, 0xe0, 0xff, 0xee} }, +{ 0x9902, 16, {0x30, 0xe1, 0x05, 0x90, 0x20, 0x0a, 0xe0, 0xff, 0xee, 0x30, 0xe2, 0x05, 0x90, 0x20, 0x12, 0xe0} }, +{ 0x9912, 16, {0xff, 0xee, 0x30, 0xe3, 0x05, 0x90, 0x20, 0x1a, 0xe0, 0xff, 0x90, 0x01, 0xc4, 0xe0, 0xb5, 0x1e} }, +{ 0x9922, 10, {0x04, 0xe4, 0xf0, 0x80, 0x05, 0x90, 0x01, 0xc4, 0xee, 0xf0} }, +{ 0x992c, 9, {0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32} }, +{ 0x9935, 2, {0xa9, 0x03} }, +{ 0x9937, 16, {0xef, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xab, 0x82, 0xfa, 0xe5} }, +{ 0x9947, 16, {0x5c, 0x45, 0x5d, 0xf5, 0x5e, 0xe9, 0x60, 0x14, 0x8a, 0x83, 0xe5, 0x82, 0x24, 0x04, 0xf5, 0x82} }, +{ 0x9957, 16, {0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x4d, 0xf0, 0xe4, 0xfe, 0x80, 0x13, 0xeb, 0x24, 0x04, 0xf5} }, +{ 0x9967, 16, {0x82, 0xe4, 0x3a, 0xf5, 0x83, 0xe0, 0xff, 0xed, 0xf4, 0xfc, 0xef, 0x5c, 0xf0, 0xae, 0x5e, 0xeb} }, +{ 0x9977, 16, {0x24, 0x06, 0xf5, 0x82, 0xe4, 0x3a, 0xf5, 0x83, 0xe0, 0x55, 0x5e, 0xfc, 0xb5, 0x06, 0x03, 0xaf} }, +{ 0x9987, 16, {0x05, 0x22, 0xe5, 0x5c, 0x5c, 0xfe, 0xe5, 0x5d, 0x5c, 0xfd, 0xe9, 0x60, 0x16, 0xee, 0x70, 0x04} }, +{ 0x9997, 16, {0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xae, 0x07, 0xed, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f} }, +{ 0x99a7, 16, {0x00, 0xad, 0x07, 0xee, 0x60, 0x03, 0xaf, 0x5c, 0x22, 0xed, 0x60, 0x03, 0xaf, 0x5d, 0x22, 0x7f} }, +{ 0x99b7, 1, {0x00} }, +{ 0x99b8, 1, {0x22} }, +{ 0x99b9, 16, {0x75, 0x55, 0x02, 0x75, 0x56, 0xb0, 0x90, 0x03, 0x35, 0x74, 0x0f, 0xf0, 0x85, 0x56, 0x82, 0x85} }, +{ 0x99c9, 16, {0x55, 0x83, 0xa3, 0xe0, 0xff, 0x90, 0x03, 0x37, 0xf0, 0x85, 0x56, 0x82, 0x85, 0x55, 0x83, 0xe0} }, +{ 0x99d9, 16, {0x90, 0x03, 0x36, 0xf0, 0x90, 0x03, 0x38, 0x74, 0xff, 0xf0, 0x75, 0x57, 0x03, 0x75, 0x58, 0x39} }, +{ 0x99e9, 16, {0xef, 0x14, 0xb4, 0x0b, 0x00, 0x40, 0x03, 0x02, 0x9e, 0x5d, 0x90, 0x99, 0xfa, 0xf8, 0x28, 0x28} }, +{ 0x99f9, 16, {0x73, 0x02, 0x9a, 0x1b, 0x02, 0x9a, 0xba, 0x02, 0x9b, 0xbf, 0x02, 0x9b, 0xde, 0x02, 0x9b, 0xde} }, +{ 0x9a09, 16, {0x02, 0x9c, 0x94, 0x02, 0x9c, 0xcf, 0x02, 0x9c, 0xf4, 0x02, 0x9d, 0xb2, 0x02, 0x9d, 0xe2, 0x02} }, +{ 0x9a19, 16, {0x9e, 0x0e, 0xe4, 0xf5, 0x4e, 0xe5, 0x4e, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4} }, +{ 0x9a29, 16, {0x34, 0x20, 0xaf, 0x82, 0xf5, 0x53, 0x8f, 0x54, 0xe4, 0xff, 0xe4, 0xfe, 0xef, 0x60, 0x10, 0x74} }, +{ 0x9a39, 16, {0x8a, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xf4, 0xf5, 0x4f, 0x80, 0x0d, 0x74} }, +{ 0x9a49, 16, {0x8a, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xf5, 0x4f, 0xe5, 0x54, 0x24, 0x07} }, +{ 0x9a59, 16, {0xf5, 0x82, 0xe4, 0x35, 0x53, 0xf5, 0x83, 0xe5, 0x4f, 0xf0, 0xe0, 0xf5, 0x50, 0x65, 0x4f, 0x60} }, +{ 0x9a69, 16, {0x38, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4e, 0x04, 0xfd, 0x05, 0x58, 0xe5, 0x58, 0xaa, 0x57} }, +{ 0x9a79, 16, {0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8a, 0x83, 0xed, 0xf0, 0x05, 0x58, 0xe5, 0x58, 0xac} }, +{ 0x9a89, 16, {0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xe5, 0x4f, 0xf0, 0x85, 0x58, 0x82} }, +{ 0x9a99, 16, {0x85, 0x57, 0x83, 0xe5, 0x50, 0xf0, 0x02, 0x9e, 0x63, 0x0e, 0xbe, 0x24, 0x8f, 0x0f, 0xef, 0x64} }, +{ 0x9aa9, 16, {0x02, 0x70, 0x87, 0x05, 0x4e, 0xe5, 0x4e, 0x64, 0x04, 0x60, 0x03, 0x02, 0x9a, 0x1e, 0x02, 0x9e} }, +{ 0x9ab9, 16, {0x63, 0xe4, 0xf5, 0x4e, 0xaf, 0x4e, 0xe4, 0xfd, 0x12, 0x83, 0x5a, 0x05, 0x4e, 0xe5, 0x4e, 0xd3} }, +{ 0x9ac9, 16, {0x94, 0x03, 0x40, 0xf0, 0x90, 0x00, 0x04, 0x74, 0x98, 0xf0, 0xa3, 0x74, 0xe7, 0xf0, 0xe4, 0xf5} }, +{ 0x9ad9, 16, {0x50, 0x7e, 0x20, 0x7f, 0x00, 0x75, 0x53, 0x20, 0x75, 0x54, 0x00, 0xf5, 0x4e, 0xaf, 0x4e, 0x74} }, +{ 0x9ae9, 16, {0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf5, 0x4f, 0x90, 0x01, 0xc4, 0xf0} }, +{ 0x9af9, 16, {0x90, 0x01, 0xc0, 0xe4, 0xf0, 0xa3, 0x74, 0x0a, 0xf0, 0x85, 0x54, 0x82, 0x85, 0x53, 0x83, 0xa3} }, +{ 0x9b09, 16, {0x74, 0x02, 0xf0, 0x90, 0x01, 0xc4, 0xe0, 0xb5, 0x4f, 0x34, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02} }, +{ 0x9b19, 16, {0xa3, 0xe0, 0x70, 0xef, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4e, 0x04, 0xff, 0x05, 0x58, 0xe5, 0x58} }, +{ 0x9b29, 16, {0xac, 0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x85, 0x58, 0x82} }, +{ 0x9b39, 16, {0x85, 0x57, 0x83, 0x74, 0xff, 0xf0, 0xe4, 0x90, 0x01, 0xc4, 0xf0, 0x75, 0x50, 0xff, 0x90, 0x01} }, +{ 0x9b49, 16, {0xc4, 0xe0, 0xff, 0x60, 0x37, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4e, 0x04, 0xfe, 0x05, 0x58} }, +{ 0x9b59, 16, {0xe5, 0x58, 0xac, 0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xee, 0xf0, 0x05} }, +{ 0x9b69, 16, {0x58, 0xe5, 0x58, 0xac, 0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0} }, +{ 0x9b79, 16, {0x85, 0x58, 0x82, 0x85, 0x57, 0x83, 0xe5, 0x4f, 0xf0, 0x75, 0x50, 0xff, 0xe5, 0x50, 0x70, 0x16} }, +{ 0x9b89, 16, {0x74, 0x08, 0x25, 0x54, 0xf5, 0x54, 0xe4, 0x35, 0x53, 0xf5, 0x53, 0x05, 0x4e, 0xe5, 0x4e, 0x64} }, +{ 0x9b99, 16, {0x04, 0x60, 0x03, 0x02, 0x9a, 0xe6, 0xe4, 0xf5, 0x4e, 0xaf, 0x4e, 0x7d, 0x01, 0x12, 0x83, 0x5a} }, +{ 0x9ba9, 16, {0x05, 0x4e, 0xe5, 0x4e, 0xd3, 0x94, 0x03, 0x40, 0xf0, 0x90, 0x00, 0x04, 0x74, 0x13, 0xf0, 0xa3} }, +{ 0x9bb9, 16, {0x74, 0x12, 0xf0, 0x02, 0x9e, 0x63, 0x85, 0x56, 0x82, 0x85, 0x55, 0x83, 0xe0, 0x14, 0xff, 0x74} }, +{ 0x9bc9, 16, {0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x90, 0x02, 0xf7, 0xf0, 0x90, 0x01} }, +{ 0x9bd9, 16, {0xc4, 0xf0, 0x02, 0x9e, 0x63, 0x90, 0x01, 0xc0, 0x74, 0x03, 0xf0, 0xa3, 0x74, 0xe8, 0xf0, 0xe4} }, +{ 0x9be9, 16, {0xf5, 0x50, 0x90, 0x02, 0xf7, 0xe0, 0xff, 0x90, 0x01, 0xc4, 0xe0, 0xb5, 0x07, 0x19, 0x90, 0x01} }, +{ 0x9bf9, 16, {0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xea, 0x90, 0x03, 0x38, 0xf0, 0x85, 0x58, 0x82, 0x85} }, +{ 0x9c09, 16, {0x57, 0x83, 0x74, 0xff, 0xf0, 0xf5, 0x50, 0xe5, 0x50, 0x60, 0x03, 0x02, 0x9e, 0x63, 0x90, 0x01} }, +{ 0x9c19, 16, {0xc0, 0xf0, 0xa3, 0x74, 0x96, 0xf0, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xf6} }, +{ 0x9c29, 16, {0xe5, 0x33, 0xc3, 0x94, 0x01, 0x40, 0x0d, 0x90, 0x20, 0x78, 0xe0, 0x54, 0x0f, 0x75, 0x51, 0x00} }, +{ 0x9c39, 16, {0xf5, 0x52, 0x80, 0x09, 0x7f, 0x02, 0x12, 0x11, 0x27, 0x8e, 0x51, 0x8f, 0x52, 0xc3, 0xe5, 0x51} }, +{ 0x9c49, 16, {0x64, 0x80, 0x94, 0x80, 0x40, 0xda, 0xe5, 0x52, 0x54, 0x0f, 0xf5, 0x50, 0x90, 0x02, 0xf7, 0xe0} }, +{ 0x9c59, 16, {0x55, 0x50, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0x8f, 0x4f, 0x85, 0x56, 0x82, 0x85} }, +{ 0x9c69, 16, {0x55, 0x83, 0xa3, 0xe0, 0xb4, 0x05, 0x0c, 0xe5, 0x4f, 0x70, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f} }, +{ 0x9c79, 16, {0x00, 0x8f, 0x4f, 0xe5, 0x4f, 0x70, 0x03, 0x02, 0x9e, 0x63, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0x85} }, +{ 0x9c89, 16, {0x58, 0x82, 0x85, 0x57, 0x83, 0xe5, 0x50, 0xf0, 0x02, 0x9e, 0x63, 0xe4, 0xff, 0xfd, 0x12, 0x83} }, +{ 0x9c99, 16, {0x5a, 0x7e, 0x20, 0x7f, 0x00, 0x75, 0x53, 0x20, 0x75, 0x54, 0x00, 0x85, 0x54, 0x82, 0x85, 0x53} }, +{ 0x9ca9, 16, {0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x44, 0x80, 0xf0, 0x85, 0x54, 0x82, 0x85, 0x53, 0x83, 0x74, 0x01} }, +{ 0x9cb9, 16, {0xf0, 0xa3, 0xe4, 0xf0, 0x85, 0x54, 0x82, 0x85, 0x53, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0x54, 0x7f} }, +{ 0x9cc9, 16, {0xf0, 0xd2, 0x04, 0x02, 0x9e, 0x63, 0xc2, 0x04, 0x7e, 0x20, 0x7f, 0x00, 0x75, 0x53, 0x20, 0x75} }, +{ 0x9cd9, 16, {0x54, 0x00, 0xe5, 0x54, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x53, 0xf5, 0x83, 0xe0, 0x30, 0xe6} }, +{ 0x9ce9, 16, {0xf1, 0xe4, 0xff, 0x7d, 0x01, 0x12, 0x83, 0x5a, 0x02, 0x9e, 0x63, 0xe4, 0xf5, 0x50, 0xf5, 0x4e} }, +{ 0x9cf9, 16, {0xaf, 0x4e, 0xe4, 0xfd, 0x12, 0x83, 0x5a, 0xe5, 0x4e, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, 0xf5} }, +{ 0x9d09, 16, {0x82, 0xe4, 0x34, 0x20, 0xaf, 0x82, 0xf5, 0x53, 0x8f, 0x54, 0xf5, 0x83, 0xe5, 0x82, 0x24, 0x04} }, +{ 0x9d19, 16, {0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54, 0xfc, 0xf0, 0xaf, 0x4e, 0x7d, 0x01, 0x7b} }, +{ 0x9d29, 16, {0x01, 0x75, 0x5c, 0x80, 0x75, 0x5d, 0x40, 0x12, 0x99, 0x35, 0x8f, 0x50, 0xe5, 0x50, 0x70, 0x11} }, +{ 0x9d39, 16, {0xaf, 0x4e, 0x7d, 0x02, 0x7b, 0x01, 0x75, 0x5c, 0x10, 0x75, 0x5d, 0x20, 0x12, 0x99, 0x35, 0x8f} }, +{ 0x9d49, 16, {0x50, 0xe5, 0x50, 0x70, 0x10, 0xaf, 0x4e, 0x7d, 0x01, 0xfb, 0x75, 0x5c, 0x80, 0x75, 0x5d, 0x40} }, +{ 0x9d59, 16, {0x12, 0x99, 0x35, 0x8f, 0x50, 0xe5, 0x50, 0x70, 0x10, 0xaf, 0x4e, 0x7d, 0x02, 0xfb, 0x75, 0x5c} }, +{ 0x9d69, 16, {0x10, 0x75, 0x5d, 0x20, 0x12, 0x99, 0x35, 0x8f, 0x50, 0xaf, 0x4e, 0x7d, 0x01, 0x12, 0x83, 0x5a} }, +{ 0x9d79, 16, {0xe5, 0x50, 0x60, 0x26, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0xe5, 0x4e, 0x04, 0xff, 0x05, 0x58, 0xe5} }, +{ 0x9d89, 16, {0x58, 0xac, 0x57, 0x70, 0x02, 0x05, 0x57, 0x14, 0xf5, 0x82, 0x8c, 0x83, 0xef, 0xf0, 0x85, 0x58} }, +{ 0x9d99, 16, {0x82, 0x85, 0x57, 0x83, 0xe5, 0x50, 0xf0, 0x02, 0x9e, 0x63, 0x05, 0x4e, 0xe5, 0x4e, 0xd3, 0x94} }, +{ 0x9da9, 16, {0x03, 0x50, 0x03, 0x02, 0x9c, 0xf9, 0x02, 0x9e, 0x63, 0xe4, 0x90, 0x03, 0x59, 0xf0, 0xa3, 0xf0} }, +{ 0x9db9, 16, {0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0x74, 0x9e, 0xf0, 0xa3, 0x74} }, +{ 0x9dc9, 16, {0x85, 0xf0, 0x7e, 0x03, 0x7f, 0x59, 0x12, 0x81, 0xd9, 0xef, 0x64, 0x08, 0x70, 0x03, 0x02, 0x9e} }, +{ 0x9dd9, 16, {0x63, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0x02, 0x9e, 0x63, 0xe4, 0x90, 0x03, 0x59, 0xf0, 0xa3, 0xf0} }, +{ 0x9de9, 16, {0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xa3, 0xe5, 0x57, 0xf0, 0xa3, 0xe5} }, +{ 0x9df9, 16, {0x58, 0xf0, 0x7e, 0x03, 0x7f, 0x59, 0x12, 0x19, 0xc1, 0xef, 0x64, 0x08, 0x60, 0x5c, 0xe4, 0x90} }, +{ 0x9e09, 16, {0x03, 0x38, 0xf0, 0x80, 0x55, 0xe5, 0x56, 0x24, 0x02, 0xff, 0xe4, 0x35, 0x55, 0xfa, 0xa9, 0x07} }, +{ 0x9e19, 16, {0x7b, 0x01, 0x7d, 0x10, 0x12, 0x98, 0x98, 0xef, 0x4e, 0x70, 0x32, 0x90, 0x03, 0x59, 0xf0, 0xa3} }, +{ 0x9e29, 16, {0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x10, 0xf0, 0xe5, 0x56, 0x24, 0x02, 0x90} }, +{ 0x9e39, 16, {0x03, 0x60, 0xf0, 0xe4, 0x35, 0x55, 0x90, 0x03, 0x5f, 0xf0, 0x7e, 0x03, 0x7f, 0x59, 0x12, 0x81} }, +{ 0x9e49, 16, {0xd9, 0xef, 0x64, 0x08, 0x60, 0x14, 0xe4, 0x90, 0x03, 0x38, 0xf0, 0x80, 0x0d, 0xe4, 0x90, 0x03} }, +{ 0x9e59, 16, {0x38, 0xf0, 0x80, 0x06, 0x90, 0x03, 0x38, 0x74, 0x01, 0xf0, 0x90, 0x01, 0xc0, 0xe4, 0xf0, 0xa3} }, +{ 0x9e69, 16, {0x74, 0x0a, 0xf0, 0x90, 0x01, 0xc0, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x70, 0xf6, 0x7e, 0x03, 0x7f} }, +{ 0x9e79, 11, {0x35, 0x7d, 0x24, 0x12, 0x91, 0x6a, 0xe4, 0x90, 0x02, 0xaf, 0xf0} }, +{ 0x9e84, 1, {0x22} }, +{ 0x9e85, 16, {0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f} }, +{ 0x9e95, 16, {0x00, 0x00, 0xc0, 0xc1, 0xc1, 0x81, 0x01, 0x40, 0xc3, 0x01, 0x03, 0xc0, 0x02, 0x80, 0xc2, 0x41} }, +{ 0x9ea5, 16, {0xc6, 0x01, 0x06, 0xc0, 0x07, 0x80, 0xc7, 0x41, 0x05, 0x00, 0xc5, 0xc1, 0xc4, 0x81, 0x04, 0x40} }, +{ 0x9eb5, 16, {0xcc, 0x01, 0x0c, 0xc0, 0x0d, 0x80, 0xcd, 0x41, 0x0f, 0x00, 0xcf, 0xc1, 0xce, 0x81, 0x0e, 0x40} }, +{ 0x9ec5, 16, {0x0a, 0x00, 0xca, 0xc1, 0xcb, 0x81, 0x0b, 0x40, 0xc9, 0x01, 0x09, 0xc0, 0x08, 0x80, 0xc8, 0x41} }, +{ 0x9ed5, 16, {0xd8, 0x01, 0x18, 0xc0, 0x19, 0x80, 0xd9, 0x41, 0x1b, 0x00, 0xdb, 0xc1, 0xda, 0x81, 0x1a, 0x40} }, +{ 0x9ee5, 16, {0x1e, 0x00, 0xde, 0xc1, 0xdf, 0x81, 0x1f, 0x40, 0xdd, 0x01, 0x1d, 0xc0, 0x1c, 0x80, 0xdc, 0x41} }, +{ 0x9ef5, 16, {0x14, 0x00, 0xd4, 0xc1, 0xd5, 0x81, 0x15, 0x40, 0xd7, 0x01, 0x17, 0xc0, 0x16, 0x80, 0xd6, 0x41} }, +{ 0x9f05, 16, {0xd2, 0x01, 0x12, 0xc0, 0x13, 0x80, 0xd3, 0x41, 0x11, 0x00, 0xd1, 0xc1, 0xd0, 0x81, 0x10, 0x40} }, +{ 0x9f15, 16, {0xf0, 0x01, 0x30, 0xc0, 0x31, 0x80, 0xf1, 0x41, 0x33, 0x00, 0xf3, 0xc1, 0xf2, 0x81, 0x32, 0x40} }, +{ 0x9f25, 16, {0x36, 0x00, 0xf6, 0xc1, 0xf7, 0x81, 0x37, 0x40, 0xf5, 0x01, 0x35, 0xc0, 0x34, 0x80, 0xf4, 0x41} }, +{ 0x9f35, 16, {0x3c, 0x00, 0xfc, 0xc1, 0xfd, 0x81, 0x3d, 0x40, 0xff, 0x01, 0x3f, 0xc0, 0x3e, 0x80, 0xfe, 0x41} }, +{ 0x9f45, 16, {0xfa, 0x01, 0x3a, 0xc0, 0x3b, 0x80, 0xfb, 0x41, 0x39, 0x00, 0xf9, 0xc1, 0xf8, 0x81, 0x38, 0x40} }, +{ 0x9f55, 16, {0x28, 0x00, 0xe8, 0xc1, 0xe9, 0x81, 0x29, 0x40, 0xeb, 0x01, 0x2b, 0xc0, 0x2a, 0x80, 0xea, 0x41} }, +{ 0x9f65, 16, {0xee, 0x01, 0x2e, 0xc0, 0x2f, 0x80, 0xef, 0x41, 0x2d, 0x00, 0xed, 0xc1, 0xec, 0x81, 0x2c, 0x40} }, +{ 0x9f75, 16, {0xe4, 0x01, 0x24, 0xc0, 0x25, 0x80, 0xe5, 0x41, 0x27, 0x00, 0xe7, 0xc1, 0xe6, 0x81, 0x26, 0x40} }, +{ 0x9f85, 16, {0x22, 0x00, 0xe2, 0xc1, 0xe3, 0x81, 0x23, 0x40, 0xe1, 0x01, 0x21, 0xc0, 0x20, 0x80, 0xe0, 0x41} }, +{ 0x9f95, 16, {0xa0, 0x01, 0x60, 0xc0, 0x61, 0x80, 0xa1, 0x41, 0x63, 0x00, 0xa3, 0xc1, 0xa2, 0x81, 0x62, 0x40} }, +{ 0x9fa5, 16, {0x66, 0x00, 0xa6, 0xc1, 0xa7, 0x81, 0x67, 0x40, 0xa5, 0x01, 0x65, 0xc0, 0x64, 0x80, 0xa4, 0x41} }, +{ 0x9fb5, 16, {0x6c, 0x00, 0xac, 0xc1, 0xad, 0x81, 0x6d, 0x40, 0xaf, 0x01, 0x6f, 0xc0, 0x6e, 0x80, 0xae, 0x41} }, +{ 0x9fc5, 16, {0xaa, 0x01, 0x6a, 0xc0, 0x6b, 0x80, 0xab, 0x41, 0x69, 0x00, 0xa9, 0xc1, 0xa8, 0x81, 0x68, 0x40} }, +{ 0x9fd5, 16, {0x78, 0x00, 0xb8, 0xc1, 0xb9, 0x81, 0x79, 0x40, 0xbb, 0x01, 0x7b, 0xc0, 0x7a, 0x80, 0xba, 0x41} }, +{ 0x9fe5, 16, {0xbe, 0x01, 0x7e, 0xc0, 0x7f, 0x80, 0xbf, 0x41, 0x7d, 0x00, 0xbd, 0xc1, 0xbc, 0x81, 0x7c, 0x40} }, +{ 0x9ff5, 16, {0xb4, 0x01, 0x74, 0xc0, 0x75, 0x80, 0xb5, 0x41, 0x77, 0x00, 0xb7, 0xc1, 0xb6, 0x81, 0x76, 0x40} }, +{ 0xa005, 16, {0x72, 0x00, 0xb2, 0xc1, 0xb3, 0x81, 0x73, 0x40, 0xb1, 0x01, 0x71, 0xc0, 0x70, 0x80, 0xb0, 0x41} }, +{ 0xa015, 16, {0x50, 0x00, 0x90, 0xc1, 0x91, 0x81, 0x51, 0x40, 0x93, 0x01, 0x53, 0xc0, 0x52, 0x80, 0x92, 0x41} }, +{ 0xa025, 16, {0x96, 0x01, 0x56, 0xc0, 0x57, 0x80, 0x97, 0x41, 0x55, 0x00, 0x95, 0xc1, 0x94, 0x81, 0x54, 0x40} }, +{ 0xa035, 16, {0x9c, 0x01, 0x5c, 0xc0, 0x5d, 0x80, 0x9d, 0x41, 0x5f, 0x00, 0x9f, 0xc1, 0x9e, 0x81, 0x5e, 0x40} }, +{ 0xa045, 16, {0x5a, 0x00, 0x9a, 0xc1, 0x9b, 0x81, 0x5b, 0x40, 0x99, 0x01, 0x59, 0xc0, 0x58, 0x80, 0x98, 0x41} }, +{ 0xa055, 16, {0x88, 0x01, 0x48, 0xc0, 0x49, 0x80, 0x89, 0x41, 0x4b, 0x00, 0x8b, 0xc1, 0x8a, 0x81, 0x4a, 0x40} }, +{ 0xa065, 16, {0x4e, 0x00, 0x8e, 0xc1, 0x8f, 0x81, 0x4f, 0x40, 0x8d, 0x01, 0x4d, 0xc0, 0x4c, 0x80, 0x8c, 0x41} }, +{ 0xa075, 16, {0x44, 0x00, 0x84, 0xc1, 0x85, 0x81, 0x45, 0x40, 0x87, 0x01, 0x47, 0xc0, 0x46, 0x80, 0x86, 0x41} }, +{ 0xa085, 16, {0x82, 0x01, 0x42, 0xc0, 0x43, 0x80, 0x83, 0x41, 0x41, 0x00, 0x81, 0xc1, 0x80, 0x81, 0x40, 0x40} }, +{ 0xa095, 16, {0xe4, 0xff, 0x74, 0xf8, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0x70, 0x03, 0x02} }, +{ 0xa0a5, 16, {0xa1, 0x38, 0x74, 0x3a, 0x2f, 0xf8, 0xe6, 0x20, 0xe5, 0x03, 0x02, 0xa1, 0x38, 0xef, 0x75, 0xf0} }, +{ 0xa0b5, 16, {0x08, 0xa4, 0x24, 0x00, 0xf5, 0x82, 0xe4, 0x34, 0x20, 0xad, 0x82, 0xfc, 0xf5, 0x83, 0xe5, 0x82} }, +{ 0xa0c5, 16, {0x24, 0x05, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe0, 0x54, 0x60, 0x64, 0x60, 0x70, 0x63} }, +{ 0xa0d5, 16, {0xef, 0x25, 0xe0, 0x24, 0xef, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe4, 0x75, 0xf0, 0x01} }, +{ 0xa0e5, 16, {0x12, 0xa2, 0x97, 0x85, 0xf0, 0x82, 0xf5, 0x83, 0xe0, 0x8d, 0x82, 0x8c, 0x83, 0xf0, 0x74, 0xf8} }, +{ 0xa0f5, 16, {0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0x14, 0xf0, 0x70, 0x36, 0xef, 0x25, 0xe0} }, +{ 0xa105, 16, {0x24, 0xc7, 0xf5, 0x82, 0xe4, 0x34, 0x7f, 0xf5, 0x83, 0xe4, 0xf0, 0xef, 0x25, 0xe0, 0xfe, 0xc3} }, +{ 0xa115, 16, {0x74, 0x0c, 0x9e, 0x75, 0xf0, 0x40, 0xa4, 0x24, 0x40, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x7b, 0xad} }, +{ 0xa125, 16, {0x82, 0xfc, 0xef, 0x25, 0xe0, 0x24, 0xef, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xec, 0xf0} }, +{ 0xa135, 12, {0xa3, 0xed, 0xf0, 0x0f, 0xef, 0x64, 0x04, 0x60, 0x03, 0x02, 0xa0, 0x97} }, +{ 0xa141, 1, {0x22} }, +{ 0xa142, 16, {0xe7, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x46, 0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x3e} }, +{ 0xa152, 16, {0x88, 0x82, 0x8c, 0x83, 0xe7, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x32, 0xe3, 0x09, 0xf6, 0x08} }, +{ 0xa162, 16, {0xdf, 0xfa, 0x80, 0x78, 0xe3, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x70, 0x88, 0x82, 0x8c, 0x83} }, +{ 0xa172, 16, {0xe3, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x64, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf6, 0x08} }, +{ 0xa182, 16, {0xdf, 0xfa, 0x80, 0x58, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x4c} }, +{ 0xa192, 16, {0x80, 0xd2, 0x80, 0xfa, 0x80, 0xc6, 0x80, 0xd4, 0x80, 0x69, 0x80, 0xf2, 0x80, 0x33, 0x80, 0x10} }, +{ 0xa1a2, 16, {0x80, 0xa6, 0x80, 0xea, 0x80, 0x9a, 0x80, 0xa8, 0x80, 0xda, 0x80, 0xe2, 0x80, 0xca, 0x80, 0x33} }, +{ 0xa1b2, 16, {0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83} }, +{ 0xa1c2, 16, {0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xe9, 0xde, 0xe7, 0x80} }, +{ 0xa1d2, 16, {0x0d, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf6, 0x08, 0xdf, 0xf9, 0xec, 0xfa, 0xa9, 0xf0} }, +{ 0xa1e2, 16, {0xed, 0xfb, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc} }, +{ 0xa1f2, 16, {0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xea, 0xde} }, +{ 0xa202, 16, {0xe8, 0x80, 0xdb, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf2, 0x08, 0xdf, 0xf9, 0x80, 0xcc} }, +{ 0xa212, 16, {0x88, 0xf0, 0xed, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xc2, 0xf5, 0x82, 0xeb, 0x24, 0x02, 0xb4} }, +{ 0xa222, 16, {0x04, 0x00, 0x50, 0xb8, 0x23, 0x23, 0x45, 0x82, 0xf5, 0x82, 0xef, 0x4e, 0x60, 0xae, 0xef, 0x60} }, +{ 0xa232, 9, {0x01, 0x0e, 0xe5, 0x82, 0x23, 0x90, 0xa1, 0x92, 0x73} }, +{ 0xa23b, 16, {0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02} }, +{ 0xa24b, 9, {0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22} }, +{ 0xa254, 16, {0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50} }, +{ 0xa264, 16, {0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22} }, +{ 0xa274, 13, {0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22} }, +{ 0xa281, 16, {0xc5, 0xf0, 0xf8, 0xa3, 0xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02} }, +{ 0xa291, 6, {0x15, 0x83, 0xe0, 0x38, 0xf0, 0x22} }, +{ 0xa297, 16, {0xa3, 0xf8, 0xe0, 0xc5, 0xf0, 0x25, 0xf0, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83} }, +{ 0xa2a7, 6, {0xe0, 0xc8, 0x38, 0xf0, 0xe8, 0x22} }, +{ 0xa2ad, 16, {0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0} }, +{ 0xa2bd, 16, {0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe} }, +{ 0xa2cd, 16, {0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83} }, +{ 0xa2dd, 8, {0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22} }, +{ 0xa2e5, 16, {0x75, 0xf0, 0x08, 0x75, 0x82, 0x00, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xcd, 0x33, 0xcd, 0xcc} }, +{ 0xa2f5, 16, {0x33, 0xcc, 0xc5, 0x82, 0x33, 0xc5, 0x82, 0x9b, 0xed, 0x9a, 0xec, 0x99, 0xe5, 0x82, 0x98, 0x40} }, +{ 0xa305, 16, {0x0c, 0xf5, 0x82, 0xee, 0x9b, 0xfe, 0xed, 0x9a, 0xfd, 0xec, 0x99, 0xfc, 0x0f, 0xd5, 0xf0, 0xd6} }, +{ 0xa315, 16, {0xe4, 0xce, 0xfb, 0xe4, 0xcd, 0xfa, 0xe4, 0xcc, 0xf9, 0xa8, 0x82, 0x22, 0xb8, 0x00, 0xc1, 0xb9} }, +{ 0xa325, 16, {0x00, 0x59, 0xba, 0x00, 0x2d, 0xec, 0x8b, 0xf0, 0x84, 0xcf, 0xce, 0xcd, 0xfc, 0xe5, 0xf0, 0xcb} }, +{ 0xa335, 16, {0xf9, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xeb} }, +{ 0xa345, 16, {0x33, 0xfb, 0x10, 0xd7, 0x03, 0x99, 0x40, 0x04, 0xeb, 0x99, 0xfb, 0x0f, 0xd8, 0xe5, 0xe4, 0xf9} }, +{ 0xa355, 16, {0xfa, 0x22, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc} }, +{ 0xa365, 16, {0xc9, 0x33, 0xc9, 0x10, 0xd7, 0x05, 0x9b, 0xe9, 0x9a, 0x40, 0x07, 0xec, 0x9b, 0xfc, 0xe9, 0x9a} }, +{ 0xa375, 16, {0xf9, 0x0f, 0xd8, 0xe0, 0xe4, 0xc9, 0xfa, 0xe4, 0xcc, 0xfb, 0x22, 0x75, 0xf0, 0x10, 0xef, 0x2f} }, +{ 0xa385, 16, {0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xcc, 0x33, 0xcc, 0xc8, 0x33, 0xc8, 0x10, 0xd7, 0x07} }, +{ 0xa395, 16, {0x9b, 0xec, 0x9a, 0xe8, 0x99, 0x40, 0x0a, 0xed, 0x9b, 0xfd, 0xec, 0x9a, 0xfc, 0xe8, 0x99, 0xf8} }, +{ 0xa3a5, 14, {0x0f, 0xd5, 0xf0, 0xda, 0xe4, 0xcd, 0xfb, 0xe4, 0xcc, 0xfa, 0xe4, 0xc8, 0xf9, 0x22} }, +{ 0xa3b3, 16, {0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0} }, +{ 0xa3c3, 1, {0x22} }, +{ 0xa3c4, 16, {0xe8, 0x60, 0x0f, 0xec, 0xc3, 0x13, 0xfc, 0xed, 0x13, 0xfd, 0xee, 0x13, 0xfe, 0xef, 0x13, 0xff} }, +{ 0xa3d4, 3, {0xd8, 0xf1, 0x22} }, +{ 0xa3d7, 16, {0x08, 0x08, 0x08, 0xe6, 0xcf, 0x2f, 0xf6, 0x18, 0xe6, 0xce, 0x3e, 0xf6, 0x18, 0xe6, 0xcd, 0x3d} }, +{ 0xa3e7, 7, {0xf6, 0x18, 0xe6, 0xcc, 0x3c, 0xf6, 0x22} }, +{ 0xa3ee, 12, {0xec, 0xf0, 0xa3, 0xed, 0xf0, 0xa3, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x22} }, +{ 0xa3fa, 16, {0xa8, 0x82, 0x85, 0x83, 0xf0, 0xd0, 0x83, 0xd0, 0x82, 0x12, 0xa4, 0x11, 0x12, 0xa4, 0x11, 0x12} }, +{ 0xa40a, 16, {0xa4, 0x11, 0x12, 0xa4, 0x11, 0xe4, 0x73, 0xe4, 0x93, 0xa3, 0xc5, 0x83, 0xc5, 0xf0, 0xc5, 0x83} }, +{ 0xa41a, 16, {0xc8, 0xc5, 0x82, 0xc8, 0xf0, 0xa3, 0xc5, 0x83, 0xc5, 0xf0, 0xc5, 0x83, 0xc8, 0xc5, 0x82, 0xc8} }, +{ 0xa42a, 1, {0x22} }, { 0xffff, 0, {0x00} } }; diff -Nru a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c --- a/drivers/usb/storage/shuttle_usbat.c Mon Oct 28 16:32:35 2002 +++ b/drivers/usb/storage/shuttle_usbat.c Mon Oct 28 16:32:35 2002 @@ -759,7 +759,7 @@ US_DEBUGP("INIT 15\n"); - return USB_STOR_TRANSPORT_ERROR; + return USB_STOR_TRANSPORT_GOOD; } /* diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c --- a/drivers/usb/storage/transport.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/storage/transport.c Mon Oct 28 16:32:36 2002 @@ -518,7 +518,10 @@ int usb_stor_clear_halt(struct us_data *us, unsigned int pipe) { int result; - int endp = usb_pipeendpoint(pipe) | (usb_pipein(pipe) << 7); + int endp = usb_pipeendpoint(pipe); + + if (usb_pipein (pipe)) + endp |= USB_DIR_IN; result = usb_stor_control_msg(us, us->send_ctrl_pipe, USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0, @@ -652,43 +655,107 @@ } /* + * Transfer a scatter-gather list via bulk transfer + * + * This function does basically the same thing as usb_stor_bulk_transfer_buf() + * above, but it uses the usbcore scatter-gather primitives + */ +int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe, + struct scatterlist *sg, int num_sg, unsigned int length, + unsigned int *act_len) +{ + int result; + int partial; + + /* initialize the scatter-gather request block */ + US_DEBUGP("usb_stor_bulk_transfer_sglist(): xfer %d bytes, " + "%d entires\n", length, num_sg); + result = usb_sg_init(us->current_sg, us->pusb_dev, pipe, 0, + sg, num_sg, length, SLAB_NOIO); + if (result) { + US_DEBUGP("usb_sg_init returned %d\n", result); + return USB_STOR_XFER_ERROR; + } + + /* since the block has been initialized successfully, it's now + * okay to cancel it */ + set_bit(US_FLIDX_CANCEL_SG, &us->flags); + + /* has the current command been aborted? */ + if (atomic_read(&us->sm_state) == US_STATE_ABORTING) { + + /* cancel the request, if it hasn't been cancelled already */ + if (test_and_clear_bit(US_FLIDX_CANCEL_SG, &us->flags)) { + US_DEBUGP("-- cancelling sg request\n"); + usb_sg_cancel(us->current_sg); + } + } + + usb_sg_wait(us->current_sg); + clear_bit(US_FLIDX_CANCEL_SG, &us->flags); + + result = us->current_sg->status; + partial = us->current_sg->bytes; + US_DEBUGP("usb_sg_wait() returned %d xferrerd %d/%d\n", + result, partial, length); + if (act_len) + *act_len = partial; + + /* if we stall, we need to clear it before we go on */ + if (result == -EPIPE) { + US_DEBUGP("clearing endpoint halt for pipe 0x%x," + "stalled at %d bytes\n", pipe, partial); + if (usb_stor_clear_halt(us, pipe) < 0) + return USB_STOR_XFER_ERROR; + return USB_STOR_XFER_STALLED; + } + + /* NAK - that means we've tried this a few times already */ + if (result == -ETIMEDOUT) { + US_DEBUGP("-- device NAKed\n"); + return USB_STOR_XFER_ERROR; + } + + /* the catch-all error case */ + if (result) { + US_DEBUGP("-- unknown error\n"); + return USB_STOR_XFER_ERROR; + } + + /* did we send all the data? */ + if (partial == length) { + US_DEBUGP("-- transfer complete\n"); + return USB_STOR_XFER_GOOD; + } + + /* no error code, so we must have transferred some data, + * just not all of it */ + US_DEBUGP("-- transferred only %d bytes\n", partial); + return USB_STOR_XFER_SHORT; +} + +/* * Transfer an entire SCSI command's worth of data payload over the bulk * pipe. * - * Note that this uses usb_stor_bulk_transfer_buf to achieve its goals -- - * this function simply determines if we're going to use scatter-gather or not, - * and acts appropriately. + * Nore that this uses the usb_stor_bulk_transfer_buf() and + * usb_stor_bulk_transfer_sglist() to achieve its goals -- + * this function simply determines whether we're going to use + * scatter-gather or not, and acts apropriately. */ int usb_stor_bulk_transfer_sg(struct us_data* us, unsigned int pipe, char *buf, unsigned int length_left, int use_sg, int *residual) { - int i; - int result = USB_STOR_XFER_ERROR; - struct scatterlist *sg; - unsigned int amount; + int result; unsigned int partial; /* are we scatter-gathering? */ if (use_sg) { - - /* loop over all the scatter gather structures and - * make the appropriate requests for each, until done - */ - sg = (struct scatterlist *) buf; - for (i = 0; (i < use_sg) && (length_left > 0); (i++, ++sg)) { - - /* transfer the lesser of the next buffer or the - * remaining data */ - amount = sg->length < length_left ? - sg->length : length_left; - result = usb_stor_bulk_transfer_buf(us, pipe, - sg_address(*sg), amount, &partial); - length_left -= partial; - - /* if we get an error, end the loop here */ - if (result != USB_STOR_XFER_GOOD) - break; - } + /* use the usb core scatter-gather primitives */ + result = usb_stor_bulk_transfer_sglist(us, pipe, + (struct scatterlist *) buf, use_sg, + length_left, &partial); + length_left -= partial; } else { /* no scatter-gather, just make the request */ result = usb_stor_bulk_transfer_buf(us, pipe, buf, @@ -923,6 +990,12 @@ usb_unlink_urb(us->current_urb); } + /* If we are waiting for a scatter-gather operation, cancel it. */ + if (test_and_clear_bit(US_FLIDX_CANCEL_SG, &us->flags)) { + US_DEBUGP("-- cancelling sg request\n"); + usb_sg_cancel(us->current_sg); + } + /* If we are waiting for an IRQ, simulate it */ if (test_bit(US_FLIDX_IP_WANTED, &us->flags)) { US_DEBUGP("-- simulating missing IRQ\n"); @@ -944,6 +1017,7 @@ void usb_stor_CBI_irq(struct urb *urb) { struct us_data *us = (struct us_data *)urb->context; + int status; US_DEBUGP("USB IRQ received for device on host %d\n", us->host_no); US_DEBUGP("-- IRQ data length is %d\n", urb->actual_length); @@ -957,13 +1031,13 @@ /* was this a wanted interrupt? */ if (!test_and_clear_bit(US_FLIDX_IP_WANTED, &us->flags)) { US_DEBUGP("ERROR: Unwanted interrupt received!\n"); - return; + goto exit; } US_DEBUGP("-- command aborted\n"); /* wake up the command thread */ up(&us->ip_waitq); - return; + goto exit; } /* is the device removed? */ @@ -985,19 +1059,19 @@ /* reject improper IRQs */ if (urb->actual_length != 2) { US_DEBUGP("-- IRQ too short\n"); - return; + goto exit; } /* was this a command-completion interrupt? */ if (us->irqbuf[0] && (us->subclass != US_SC_UFI)) { US_DEBUGP("-- not a command-completion IRQ\n"); - return; + goto exit; } /* was this a wanted interrupt? */ if (!test_and_clear_bit(US_FLIDX_IP_WANTED, &us->flags)) { US_DEBUGP("ERROR: Unwanted interrupt received!\n"); - return; + goto exit; } /* copy the valid data */ @@ -1006,6 +1080,13 @@ /* wake up the command thread */ up(&(us->ip_waitq)); + +exit: + /* resubmit the urb */ + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + err ("%s - usb_submit_urb failed with result %d", + __FUNCTION__, status); } int usb_stor_CBI_transport(Scsi_Cmnd *srb, struct us_data *us) diff -Nru a/drivers/usb/storage/transport.h b/drivers/usb/storage/transport.h --- a/drivers/usb/storage/transport.h Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/storage/transport.h Mon Oct 28 16:32:36 2002 @@ -164,6 +164,9 @@ void *data, u16 size); extern int usb_stor_bulk_transfer_buf(struct us_data *us, unsigned int pipe, char *buf, unsigned int length, unsigned int *act_len); +extern int usb_stor_bulk_transfer_sglist(struct us_data *us, unsigned int pipe, + struct scatterlist *sg, int num_sg, unsigned int length, + unsigned int *act_len); extern int usb_stor_bulk_transfer_sg(struct us_data *us, unsigned int pipe, char *buf, unsigned int length, int use_sg, int *residual); diff -Nru a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c --- a/drivers/usb/storage/usb.c Mon Oct 28 16:32:36 2002 +++ b/drivers/usb/storage/usb.c Mon Oct 28 16:32:36 2002 @@ -547,6 +547,13 @@ return 2; } + US_DEBUGP("Allocating scatter-gather request block\n"); + ss->current_sg = kmalloc(sizeof(*ss->current_sg), GFP_KERNEL); + if (!ss->current_sg) { + US_DEBUGP("allocation failed\n"); + return 5; + } + /* allocate the IRQ URB, if it is needed */ if (ss->protocol == US_PR_CBI) { US_DEBUGP("Allocating IRQ for CBI transport\n"); @@ -606,6 +613,12 @@ ss->irq_urb = NULL; } up(&(ss->irq_urb_sem)); + + /* free the scatter-gather request block */ + if (ss->current_sg) { + kfree(ss->current_sg); + ss->current_sg = NULL; + } /* free up the main URB for this device */ if (ss->current_urb) { diff -Nru a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h --- a/drivers/usb/storage/usb.h Mon Oct 28 16:32:37 2002 +++ b/drivers/usb/storage/usb.h Mon Oct 28 16:32:37 2002 @@ -107,6 +107,7 @@ #define US_FL_DEV_ATTACHED 0x00010000 /* is the device attached? */ #define US_FLIDX_IP_WANTED 17 /* 0x00020000 is an IRQ expected? */ #define US_FLIDX_CAN_CANCEL 18 /* 0x00040000 okay to cancel current_urb? */ +#define US_FLIDX_CANCEL_SG 19 /* 0x00080000 okay to cancel current_sg? */ /* processing state machine states */ @@ -184,6 +185,7 @@ /* control and bulk communications data */ struct urb *current_urb; /* non-int USB requests */ struct usb_ctrlrequest *dr; /* control requests */ + struct usb_sg_request *current_sg; /* scatter-gather USB */ /* the semaphore for sleeping the control thread */ struct semaphore sema; /* to sleep thread on */ diff -Nru a/fs/Config.help b/fs/Config.help --- a/fs/Config.help Mon Oct 28 16:32:37 2002 +++ b/fs/Config.help Mon Oct 28 16:32:37 2002 @@ -963,6 +963,28 @@ module, say M here and read . If unsure, say N. +CONFIG_BEFS_FS + The BeOS File System (BeFS) is the native file system of Be, Inc's + BeOS. Notable features include support for arbitrary attributes + on files and directories, and database-like indices on selected + attributes. (Also note that this driver doesn't make those features + available at this time). It is a 64 bit filesystem, so it supports + extreemly large volumes and files. + + If you use this filesystem, you should also say Y to at least one + of the NLS (native language support) options below. + + If you don't know what this is about, say N. + + If you want to compile this as a module ( = code which can be + inserted in and removed from the running kernel whenever you want), + say M here and read Documentation/modules.txt. The module will be + called befs.o. + +CONFIG_BEFS_DEBUG + If you say Y here, you can use the 'debug' mount option to enable + debugging output from the driver. + CIFS (Common Internet File System) support CONFIG_CIFS This is the client VFS module for the Common Internet File System diff -Nru a/fs/Config.in b/fs/Config.in --- a/fs/Config.in Mon Oct 28 16:32:37 2002 +++ b/fs/Config.in Mon Oct 28 16:32:37 2002 @@ -24,6 +24,9 @@ dep_tristate 'Apple Macintosh file system support (EXPERIMENTAL)' CONFIG_HFS_FS $CONFIG_EXPERIMENTAL +dep_tristate 'BeOS file systemv(BeFS) support (read only) (EXPERIMENTAL)' CONFIG_BEFS_FS $CONFIG_EXPERIMENTAL +dep_mbool ' Debug BeFS' CONFIG_BEFS_DEBUG $CONFIG_BEFS_FS + dep_tristate 'BFS file system support (EXPERIMENTAL)' CONFIG_BFS_FS $CONFIG_EXPERIMENTAL tristate 'Ext3 journalling file system support' CONFIG_EXT3_FS diff -Nru a/fs/Makefile b/fs/Makefile --- a/fs/Makefile Mon Oct 28 16:32:37 2002 +++ b/fs/Makefile Mon Oct 28 16:32:37 2002 @@ -87,5 +87,6 @@ obj-$(CONFIG_JFS_FS) += jfs/ obj-$(CONFIG_XFS_FS) += xfs/ obj-$(CONFIG_AFS_FS) += afs/ +obj-$(CONFIG_BEFS_FS) += befs/ include $(TOPDIR)/Rules.make diff -Nru a/fs/befs/ChangeLog b/fs/befs/ChangeLog --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/ChangeLog Mon Oct 28 16:32:38 2002 @@ -0,0 +1,417 @@ +Version 0.92 (2002-03-29) +========== +* Minor cleanup. Ran Lindent on the sources. + +Version 0.92 (2002-03-27) +========== +* Fixed module makefile problem. It was not compiling all the correct + source files! +* Removed duplicated function definition +* Fixed potential null pointer dereference when reporting an error + +Version 0.91 (2002-03-26) +========== +* Oy! Fixed stupid bug that would cause an unresolved symbol error. + Thanks to Laszlo Boszormenyi for pointing this out to me. + +Version 0.9 (2002-03-14) +========== +* Added Sergey S. Kostyliov's patch to eliminate memcpy() overhead + from b+tree operations. Changes the befs_read_datastream() interface. + +* Segregated the functions that interface directly with the linux vfs + interface into their own file called linuxvfs.c. [WD] + +Version 0.64 (2002-02-07) +========== +* Did the string comparision really right this time (btree.c) [WD] + +* Fixed up some places where I assumed that a long int could hold + a pointer value. (btree.c) [WD] + +* Andrew Farnham pointed out that the module + wouldn't work on older (<2.4.10) kernels due to an unresolved symbol. + This is bad, since 2.4.9 is still the current RedHat kernel. I added + a workaround for this problem (compatability.h) [WD] + +* Sergey S. Kostyliov made befs_find_key() use a binary search to find + keys within btree nodes, rather than the linear search we were using + before. (btree.c) [Sergey S. Kostyliov ] + +* Made a debian package of the source for use with kernel-package. [WD] + + +Version 0.63 (2002-01-31) +========== +* Fixed bug in befs_find_brun_indirect() that would result in the wrong + block being read. It was introduced when adding byteswapping in + 0.61. (datastream.c) [WD] + +* Fixed a longstanding bug in befs_find_key() that would result in it + finding the first key that is a substring of the string it is searching + for. For example, this would cause files in the same directory with + names like file1 and file2 to mysteriously be duplicates of each other + (because they have the same inode number). Many thanks to Pavel Roskin + for reporting this serious bug!!! + (btree.c) [WD] + +* Added support for long symlinks, after Axel Dorfler explained up how + they work. I had forgotten all about them. (inode.c, symlink.c) [WD] + +* Documentation improvements in source. [WD] + +* Makefile fix for independant module when CONFIG_MODVERSION is set in + kernel config [Pavel Roskin ] + +* Compile warning fix for namei.c. [Sergey S. Kostyliov ] + + +Version 0.62 +========== +* Fixed makefile for module install [WD] + + +Version 0.61 (2002-01-20) +========== +* Made functions in endian.h to do the correct byteswapping, no matter + the arch. [WD] + +* Abbandoned silly checks for a NULL superblock pointer in debug.c. [WD] + +* Misc code cleanups. Also cleanup of this changelog file. [WD] + +* Added byteswapping to all metadata reads from disk. + Uses the functions from endian.h [WD] + +* Remove the typedef of struct super_block to vfs_sb, as it offended + certain peoples' aesthetic sense. [WD] + +* Ditto with the befs_read_block() interface. [WD] + + +Version 0.6 (2001-12-15) +========== +* Cleanup of NLS functions (util.c) [WD] + +* Make directory lookup/read use the NLS if an iocharset is provided. [WD] + +* Fixed stupid bug where specifying the uid or gid mount options as '0' + would result in the filesystem using the on-disk uid and gid. [WD] + +* Added mount option to control debug printing. + The option is, simply enough, 'debug'. + (super.c, debug.c) [WD] + +* Removed notion of btree handle from btree.c. It was unessisary, as the + linux VFS doesn't allow us to keep any state between calls. Updated + dir.c, namei.c befs_fs.h to account for it. [WD] + +* Improved handleing of overflow nodes when listing directories. + Now works for overflow nodes hanging off of nodes other than the root + node. This is the cleaner solution to Brent Miszalaski's problem. [WD] + +* Added new debug/warning/error print functions in debug.c. + More flexible. Will soon be controllable at mount time + (see TODO). [WD] + +* Rewrote datastream positon lookups. + (datastream.c) [WD] + +* Moved the TODO list to it's own file. + + +Version 0.50 (2001-11-13) +========== +* Added workaround for mis-understanding of the nature of the b+trees used + in directories. A cleaner solution will come after I've thought about it + for a while. Thanks to Brent Miszalaski for finding and reporting this bug. + (btree.c) [WD] + +* Minor cleanups + +* Added test for "impossible" condition of empty internal nodes in + seekleaf() in btree.c [WD] + +* Implemented the abstracted read_block() in io.c [WD] + +* Cleaned up the inode validation in inode.c [WD] + +* Anton Altaparmakov figured out (by asking Linus :) ) what was causing the + hanging disk io problem. It turns out you need to have the sync_pages + callback defined in your address_space_ops, even if it just uses the + default linux-supplied implementation. Fixed. Works now. + (file.c) [WD] + +* Anton Altaparmakov and Christoph Hellwig alerted me to the fact that + filesystem code should be using GFP_NOFS instead of GFP_KERNEL as the + priority parameter to kmalloc(). Fixed. + (datastream.c, btree.c super.c inode.c) [WD] + +* Anton also told me that the blocksize is not allowed to be larger than + the page size in linux, which is 4k i386. Oops. Added a test for + (blocksize > PAGE_SIZE), and refuse to mount in that case. What this + practicaly means is that 8k blocksize volumes won't work without a major + restructuring of the driver (or an alpha or other 64bit hardware). [WD] + +* Cleaned up the befs_count_blocks() function. Much smarter now. + And somewhat smaller too. [WD] + +* Made inode allocations use a slab cache + (super.c inode.c) [WD] + +* Moved the freeing of the private inode section from put_inode() to + clear_inode(). This fixes a potential free twice type bug. Put_inode() + can be called multiple times for each inode struct. [WD] + +* Converted all non vfs-callback functions to use befs_sb_info as the + superblock type, rather than struct super_block. This is for + portablity. [WD] + +* Fixed a couple of compile warnings due to use of malloc.h, when slab.h + is the new way. (inode.c, super.c) [WD] + +* Fixed erronous includes of linux/befs_fs_i.h and linux/befs_fs_sb.h + in inode.c [WD] + +Version 0.45 (2001-10-29) +========== +* Added functions to get the private superblock and inode structures from + their enclosing public structures. Switched all references to the + private portions to use them. (many files) [WD] + +* Made read_super and read_inode allocate the private portions of those + structures into the generic pointer fields of the public structures + with kmalloc(). put_super and put_inode free them. This allows us not + to have to touch the definitions of the public structures in + include/linux/fs.h. Also, befs_inode_info is huge (becuase of the + symlink string). (super.c, inode.c, befs_fs.h) [WD] + +* Fixed a thinko that was corrupting file reads after the first block_run + is done being read. (datastream.c) [WD] + +* Removed fsync() hooks, since a read-only filesystem doesn't need them. + [Christoph Hellwig]. + +* Fixed befs_readlink() (symlink.c) [Christoph Hellwig]. + +* Removed all the Read-Write stuff. I'll redo it when it is time to add + write support (various files) [WD]. + +* Removed prototypes for functions who's definitions have been removed + (befs_fs.h) [WD]. + + +Version 0.4 (2001-10-28) +========== +* Made it an option to use the old non-pagecache befs_file_read() for + testing purposes. (fs/Config.in) + +* Fixed unused variable warnings when compiling without debugging. + +* Fixed a bug where the inode and super_block didn't get their blockbits + fields set (inode.c and super.c). + +* Release patch version 11. AKA befs-driver version 0.4. + +* Thats right. New versioning scheme. + I've done some serious testing on it now (on my box anyhow), and it + seems stable and not outragously slow. Existing features are more-or-less + correct (see TODO list). But it isn't 1.0 yet. I think 0.4 gives me some + headroom before the big 1.0. + + +2001-10-26 +========== +* Fixed date format in this file. Was I smoking crack? + +* Removed old datastream code from file.c, since it is nolonger used. + +* Generic_read_file() is now used to read regular file data. + It doesn't chew up the buffer cache (it does page io instead), and seems + to be about as fast (even though it has to look up each file block + indivdualy). And it knows about doing readahead, which is a major plus. + So it does i/o in much larger chunks. It is the correct linux way. It + uses befs_get_block() by way of befs_readpage() to find the disk offsets + of blocks, which in turn calls befs_fpos2brun() in datastream.c to do + the hard work of finding the disk block number. + +* Changed method of checking for a dirty filesystem in befs_read_super + (super.c). Now we check to see if log_start and log_end differ. If so, + the journal needs to be replayed, and the filesystem cannot be mounted. + +* Fixed an extra instance of MOD_DEC_USE_COUNT in super.c + +* Fixed a problem with reading the superblock on devices with large sector + sizes (such as cdroms) on linux 2.4.10 and up. + +2001-10-24 +========== +* Fix nasty bug in converting block numbers to struct befs_inode_addr. + Subtle, because the old version was only sometimes wrong. + Probably responsible for lots of problems. (inode.c) + +* Fix bug with reading an empty directory. (btree.c and dir.c) + +* This one looks good. Release patch version 10 + +2001-10-23 +========== +* Added btree searching function. + +* Use befs_btree_find in befs_lookup (namei.c) + +* Additional comments in btree.c + +2001-10-22 +========== +* Added B+tree reading functions (in btree.c). + Made befs_readdir() use them them instead of the cruft in index.c. + +2001-09-11 +========== +* Converted befs_read_file() to use the new datastream code. + +* Finally updated the README file. + +* Added many comments. + +* Posted version 6 + +* Removed byte-order conversion code. + I have no intention of supporting it, and it was very ugly. + Flow control with #ifdef (ugh). Maybe I'll redo it once + native byteorder works 100%. + +2001-09-10 +========== +* Finished implementing read_datastream() + +* made befs_read_brun() more general + Supports an offset to start at and a max bytes to read + Added a wrapper function to give the old call + +2001-09-30 +========== +* Discovered that the datastream handleing code in file.c is quite deficient + in several respects. For one thing, it doesn't deal with indirect blocks + +* Rewrote datastream handleing. + +* Created io.c, for io related functions. + Previously, the befs_bread() funtions lived in file.c + Created the befs_read_brun() function. + + +2001-09-07 +========== +* Made a function to actually count the number of fs blocks used by a file. + And helper functions. + (fs/befs/inode.c) + +2001-09-05 +========== +* Fixed a misunderstanding of the inode fields. + This fixed the problmem with wrong file sizes from du and others. + The i_blocks field of the inode struct is not the nuber of blocks for the + inode, it is the number of blocks for the file. Also, i_blksize is not + nessisarily the size of the inode, although in practice it works out. + Changed to blocksize of filesystem. + (fs/befs/inode.c) + +* Permanently removed code that had been provisionally ifdefed out of befs_fs.h + +* Since we don't support access time, make that field zero, instead of + copying m_time. + (fs/befs/inode.c) + +* Added sanity check for inode reading + Make sure inode we got was the one we asked for. + (fs/befs/inode.c) + +* Code cleanup + Local pointers to commonly used structures in inode.c. + Got rid of abominations befs_iaddr2inode() and befs_inode2ino(). + Replaced with single function iaddr2blockno(). + (fs/befs/super.c) (fs/befs/inode.c) + +2001-09-01 +========== +* Fixed the problem with statfs where it would always claim the disk was + half full, due to improper understanding of the statfs fields. + (fs/befs/super.c) + +* Posted verion 4 of the patch + +2001-09-01 +========== +* Changed the macros in befs_fs.h to inline functions. + More readable. Typesafe. Better + (include/linux/befs_fs.h) + +* Moved type definitions from befs_fs.h to a new file, befs_fs_types.h + Because befs_fs_i.h and befs_fs_sb.h were including befs_fs.h for the + typedefs, and they are inlcuded in , which has definitions + that I want the inline functions in befs_fs.h to be able to see. Nasty + circularity. + (include/linux/befs_fs.h) + +2001-08-30 +========== +* Cleaned up some wording. + +* Added additional consitency checks on mount + Check block_size agrees with block_shift + Check flags == BEFS_CLEAN + (fs/befs/super.c) + +* Tell the kernel to only mount befs read-only. + By setting the MS_RDONLY flag in befs_read_super(). + Not that it was possible to write before. But now the kernel won't even try. + (fs/befs/super.c) + +* Got rid of kernel warning on mount. + The kernel doesn't like it if you call set_blocksize() on a device when + you have some of its blocks open. Moved the second set_blocksize() to the + very end of befs_read_super(), after we are done with the disk superblock. + (fs/befs/super.c) + +* Fixed wrong number of args bug in befs_dump_inode + (fs/befs/debug.c) + +* Solved lots of type mismatches in kprint()s + (everwhere) + +2001-08-27 +========== +* Cleaned up the fs/Config.in entries a bit, now slightly more descriptive. + +* BeFS depends on NLS, so I made activating BeFS enable the NLS questions + (fs/nls/Config.in) + +* Added Configure.help entries for CONFIG_BEFS_FS and CONFIG_DEBUG_BEFS + (Documentation/Configure.help) + +2001-08-?? +========== +* Removed superblock locking calls in befs_read_super(). In 2.4, the VFS + hands us a super_block struct that is already locked. + +2001-08-13 +========== +* Will Dyson is now attempting to maintain this module + Makoto Kato is original author.Daniel Berlin + also did some work on it (fixing it up for the later 2.3.x kernels, IIRC). + +* Fixed compile errors on 2.4.1 kernel (WD) + Resolve rejected patches + Accomodate changed NLS interface (util.h) + Needed to include in most files + Makefile changes + fs/Config.in changes + +* Tried to niceify the code using the ext2 fs as a guide + Declare befs_fs_type using the DECLARE_FSTYPE_DEV() macro + +* Made it a configure option to turn on debugging (fs/Config.in) + +* Compiles on 2.4.7 diff -Nru a/fs/befs/Makefile b/fs/befs/Makefile --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/Makefile Mon Oct 28 16:32:38 2002 @@ -0,0 +1,15 @@ +# +# Makefile for the linux BeOS filesystem routines. +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (ie not a .c file). +# +# Note 2! The CFLAGS definitions are now in the main makefile... + + +obj-$(CONFIG_BEFS_FS) += befs.o + +befs-objs := datastream.o btree.o super.o inode.o debug.o io.o linuxvfs.o + +include $(TOPDIR)/Rules.make diff -Nru a/fs/befs/TODO b/fs/befs/TODO --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/TODO Mon Oct 28 16:32:38 2002 @@ -0,0 +1,14 @@ +TODO +========== + +* Convert comments to the Kernel-Doc format. + +* Befs_fs.h has gotten big and messy. No reason not to break it up into + smaller peices. + +* See if Alexander Viro's option parser made it into the kernel tree. + Use that if we can. (include/linux/parser.h) + +* See if we really need separate types for on-disk and in-memory + representations of the superblock and inode. + diff -Nru a/fs/befs/attribute.c b/fs/befs/attribute.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/attribute.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,117 @@ +/* + * linux/fs/befs/attribute.c + * + * Copyright (C) 2002 Will Dyson + * + * Many thanks to Dominic Giampaolo, author of "Practical File System + * Design with the Be File System", for such a helpful book. + * + */ + +#include +#include +#include + +#include "befs.h" +#include "endian.h" + +#define SD_DATA(sd)\ + (void*)((char*)sd + sizeof(*sd) + (sd->name_size - sizeof(sd->name))) + +#define SD_NEXT(sd)\ + (befs_small_data*)((char*)sd + sizeof(*sd) + (sd->name_size - \ + sizeof(sd->name) + sd->data_size)) + +int +list_small_data(struct super_block *sb, befs_inode * inode, filldir_t filldir); + +befs_small_data * +find_small_data(struct super_block *sb, befs_inode * inode, + const char *name); +int +read_small_data(struct super_block *sb, befs_inode * inode, + befs_small_data * sdata, void *buf, size_t bufsize); + +/** + * + * + * + * + * + */ +befs_small_data * +find_small_data(struct super_block *sb, befs_inode * inode, const char *name) +{ + befs_small_data *sdata = inode->small_data; + + while (sdata->type != 0) { + if (strcmp(name, sdata->name) != 0) { + return sdata; + } + sdata = SD_NEXT(sdata); + } + return NULL; +} + +/** + * + * + * + * + * + */ +int +read_small_data(struct super_block *sb, befs_inode * inode, + const char *name, void *buf, size_t bufsize) +{ + befs_small_data *sdata; + + sdata = find_small_data(sb, inode, name); + if (sdata == NULL) + return BEFS_ERR; + else if (sdata->data_size > bufsize) + return BEFS_ERR; + + memcpy(buf, SD_DATA(sdata), sdata->data_size); + + return BEFS_OK; +} + +/** + * + * + * + * + * + */ +int +list_small_data(struct super_block *sb, befs_inode * inode) +{ + +} + +/** + * + * + * + * + * + */ +int +list_attr(struct super_block *sb, befs_inode * inode) +{ + +} + +/** + * + * + * + * + * + */ +int +read_attr(struct super_block *sb, befs_inode * inode) +{ + +} diff -Nru a/fs/befs/befs.h b/fs/befs/befs.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/befs.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,158 @@ +/* + * befs.h + * + * Copyright (C) 2001-2002 Will Dyson + * Copyright (C) 1999 Makoto Kato (m_kato@ga2.so-net.ne.jp) + */ + +#ifndef _LINUX_BEFS_H +#define _LINUX_BEFS_H + +#include "befs_fs_types.h" + +/* used in debug.c */ +#define BEFS_VERSION "0.9.3" + + +/* Sector_t makes this sillyness obsolete */ +typedef u64 befs_blocknr_t; +typedef u32 vfs_blocknr_t; + +/* + * BeFS in memory structures + */ + +typedef struct befs_mount_options { + gid_t gid; + uid_t uid; + int use_gid; + int use_uid; + int debug; + char *iocharset; +} befs_mount_options; + +typedef struct befs_sb_info { + u32 magic1; + u32 block_size; + u32 block_shift; + int byte_order; + befs_off_t num_blocks; + befs_off_t used_blocks; + u32 inode_size; + u32 magic2; + + /* Allocation group information */ + u32 blocks_per_ag; + u32 ag_shift; + u32 num_ags; + + /* jornal log entry */ + befs_block_run log_blocks; + befs_off_t log_start; + befs_off_t log_end; + + befs_inode_addr root_dir; + befs_inode_addr indices; + u32 magic3; + + befs_mount_options mount_opts; + struct nls_table *nls; + +} befs_sb_info; + +typedef struct befs_inode_info { + u32 i_flags; + u32 i_type; + + befs_inode_addr i_inode_num; + befs_inode_addr i_parent; + befs_inode_addr i_attribute; + + union { + befs_data_stream ds; + char symlink[BEFS_SYMLINK_LEN]; + } i_data; + + struct inode vfs_inode; + +} befs_inode_info; + +enum befs_err { + BEFS_OK, + BEFS_ERR, + BEFS_BAD_INODE, + BEFS_BT_END, + BEFS_BT_EMPTY, + BEFS_BT_MATCH, + BEFS_BT_PARMATCH, + BEFS_BT_NOT_FOUND +}; + + +/****************************/ +/* debug.c */ +void befs_error(const struct super_block *sb, const char *fmt, ...); +void befs_warning(const struct super_block *sb, const char *fmt, ...); +void befs_debug(const struct super_block *sb, const char *fmt, ...); + +void befs_dump_super_block(const struct super_block *sb, befs_super_block *); +void befs_dump_inode(const struct super_block *sb, befs_inode *); +void befs_dump_index_entry(const struct super_block *sb, befs_btree_super *); +void befs_dump_index_node(const struct super_block *sb, befs_btree_nodehead *); +void befs_dump_inode_addr(const struct super_block *sb, befs_inode_addr); +/****************************/ + + +/* Gets a pointer to the private portion of the super_block + * structure from the public part + */ +static inline befs_sb_info * +BEFS_SB(const struct super_block *super) +{ + return (befs_sb_info *) super->s_fs_info; +} + +static inline befs_inode_info * +BEFS_I(const struct inode *inode) +{ + return list_entry(inode, struct befs_inode_info, vfs_inode); +} + +static inline befs_blocknr_t +iaddr2blockno(struct super_block *sb, befs_inode_addr * iaddr) +{ + return ((iaddr->allocation_group << BEFS_SB(sb)->ag_shift) + + iaddr->start); +} + +static inline befs_inode_addr +blockno2iaddr(struct super_block *sb, befs_blocknr_t blockno) +{ + befs_inode_addr iaddr; + iaddr.allocation_group = blockno >> BEFS_SB(sb)->ag_shift; + iaddr.start = + blockno - (iaddr.allocation_group << BEFS_SB(sb)->ag_shift); + iaddr.len = 1; + + return iaddr; +} + +static inline unsigned int +befs_iaddrs_per_block(struct super_block *sb) +{ + return BEFS_SB(sb)->block_size / sizeof (befs_inode_addr); +} + +static inline int +befs_iaddr_is_empty(befs_inode_addr * iaddr) +{ + return (!iaddr->allocation_group) && (!iaddr->start) && (!iaddr->len); +} + +static inline size_t +befs_brun_size(struct super_block *sb, befs_block_run run) +{ + return BEFS_SB(sb)->block_size * run.len; +} + +#endif /* _LINUX_BEFS_H */ diff -Nru a/fs/befs/befs_fs_types.h b/fs/befs/befs_fs_types.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/befs_fs_types.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,213 @@ +/* + * include/linux/befs_fs_types.h + * + * Copyright (C) 2001 Will Dyson (will@cs.earlham.edu) + * + * + * + * from linux/include/linux/befs_fs.h + * + * Copyright (C) 1999 Makoto Kato (m_kato@ga2.so-net.ne.jp) + * + */ + +#ifndef _LINUX_BEFS_FS_TYPES +#define _LINUX_BEFS_FS_TYPES + +#ifdef __KERNEL__ +#include +#endif /*__KERNEL__*/ + +#define PACKED __attribute__ ((__packed__)) + +/* + * Max name lengths of BFS + */ + +#define BEFS_NAME_LEN 255 + +#define BEFS_SYMLINK_LEN 144 +#define BEFS_NUM_DIRECT_BLOCKS 12 +#define B_OS_NAME_LENGTH 32 + +/* The datastream blocks mapped by the double-indirect + * block are always 4 fs blocks long. + * This eliminates the need for linear searches among + * the potentially huge number of indirect blocks + * + * Err. Should that be 4 fs blocks or 4k??? + * It matters on large blocksize volumes + */ +#define BEFS_DBLINDIR_BRUN_LEN 4 + +/* + * Flags of superblock + */ + +enum super_flags { + BEFS_BYTESEX_BE, + BEFS_BYTESEX_LE, + BEFS_CLEAN = 0x434c454e, + BEFS_DIRTY = 0x44495254, + BEFS_SUPER_MAGIC1 = 0x42465331, /* BFS1 */ + BEFS_SUPER_MAGIC2 = 0xdd121031, + BEFS_SUPER_MAGIC3 = 0x15b6830e, +}; + +#define BEFS_BYTEORDER_NATIVE 0x42494745 + +#define BEFS_SUPER_MAGIC BEFS_SUPER_MAGIC1 + +/* + * Flags of inode + */ + +#define BEFS_INODE_MAGIC1 0x3bbe0ad9 + +enum inode_flags { + BEFS_INODE_IN_USE = 0x00000001, + BEFS_ATTR_INODE = 0x00000004, + BEFS_INODE_LOGGED = 0x00000008, + BEFS_INODE_DELETED = 0x00000010, + BEFS_LONG_SYMLINK = 0x00000040, + BEFS_PERMANENT_FLAG = 0x0000ffff, + BEFS_INODE_NO_CREATE = 0x00010000, + BEFS_INODE_WAS_WRITTEN = 0x00020000, + BEFS_NO_TRANSACTION = 0x00040000, +}; +/* + * On-Disk datastructures of BeFS + */ + +typedef u64 befs_off_t; +typedef u64 befs_time_t; +typedef void befs_binode_etc; + +/* Block runs */ +typedef struct { + u32 allocation_group; + u16 start; + u16 len; +} PACKED befs_block_run; + +typedef befs_block_run befs_inode_addr; + +/* + * The Superblock Structure + */ +typedef struct { + char name[B_OS_NAME_LENGTH]; + u32 magic1; + u32 fs_byte_order; + + u32 block_size; + u32 block_shift; + + befs_off_t num_blocks; + befs_off_t used_blocks; + + u32 inode_size; + + u32 magic2; + u32 blocks_per_ag; + u32 ag_shift; + u32 num_ags; + + u32 flags; + + befs_block_run log_blocks; + befs_off_t log_start; + befs_off_t log_end; + + u32 magic3; + befs_inode_addr root_dir; + befs_inode_addr indices; + +} PACKED befs_super_block; + +/* + * Note: the indirect and dbl_indir block_runs may + * be longer than one block! + */ +typedef struct { + befs_block_run direct[BEFS_NUM_DIRECT_BLOCKS]; + befs_off_t max_direct_range; + befs_block_run indirect; + befs_off_t max_indirect_range; + befs_block_run double_indirect; + befs_off_t max_double_indirect_range; + befs_off_t size; +} PACKED befs_data_stream; + +/* Attribute */ +typedef struct { + u32 type; + u16 name_size; + u16 data_size; + char name[1]; +} PACKED befs_small_data; + +/* Inode structure */ +typedef struct { + u32 magic1; + befs_inode_addr inode_num; + u32 uid; + u32 gid; + u32 mode; + u32 flags; + befs_time_t create_time; + befs_time_t last_modified_time; + befs_inode_addr parent; + befs_inode_addr attributes; + u32 type; + + u32 inode_size; + u32 etc; /* not use */ + + union { + befs_data_stream datastream; + char symlink[BEFS_SYMLINK_LEN]; + } data; + + u32 pad[4]; /* not use */ + befs_small_data small_data[1]; +} PACKED befs_inode; + +/* + * B+tree superblock + */ + +#define BEFS_BTREE_MAGIC 0x69f6c2e8 + +enum btree_types { + BTREE_STRING_TYPE = 0, + BTREE_INT32_TYPE = 1, + BTREE_UINT32_TYPE = 2, + BTREE_INT64_TYPE = 3, + BTREE_UINT64_TYPE = 4, + BTREE_FLOAT_TYPE = 5, + BTREE_DOUBLE_TYPE = 6 +}; + +typedef struct { + u32 magic; + u32 node_size; + u32 max_depth; + u32 data_type; + befs_off_t root_node_ptr; + befs_off_t free_node_ptr; + befs_off_t max_size; +} PACKED befs_btree_super; + +/* + * Header stucture of each btree node + */ +typedef struct { + befs_off_t left; + befs_off_t right; + befs_off_t overflow; + u16 all_key_count; + u16 all_key_length; +} PACKED befs_btree_nodehead; + +#endif /* _LINUX_BEFS_FS_TYPES */ diff -Nru a/fs/befs/btree.c b/fs/befs/btree.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/btree.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,786 @@ +/* + * linux/fs/befs/btree.c + * + * Copyright (C) 2001-2002 Will Dyson + * + * Licensed under the GNU GPL. See the file COPYING for details. + * + * 2002-02-05: Sergey S. Kostyliov added binary search withing + * btree nodes. + * + * Many thanks to: + * + * Dominic Giampaolo, author of "Practical File System + * Design with the Be File System", for such a helpful book. + * + * Marcus J. Ranum, author of the b+tree package in + * comp.sources.misc volume 10. This code is not copied from that + * work, but it is partially based on it. + * + * Makoto Kato, author of the original BeFS for linux filesystem + * driver. + */ + +#include +#include +#include +#include +#include + +#include "befs.h" +#include "btree.h" +#include "datastream.h" +#include "endian.h" + +/* + * The btree functions in this file are built on top of the + * datastream.c interface, which is in turn built on top of the + * io.c interface. + */ + +/* Befs B+tree structure: + * + * The first thing in the tree is the tree superblock. It tells you + * all kinds of usefull things about the tree, like where the rootnode + * is located, and the size of the nodes (always 1024 with current version + * of BeOS). + * + * The rest of the tree consists of a series of nodes. Nodes contain a header + * (struct befs_btree_nodehead), the packed key data, an array of shorts + * containing the ending offsets for each of the keys, and an array of + * befs_off_t values. In interior nodes, the keys are the ending keys for + * the childnode they point to, and the values are offsets into the + * datastream containing the tree. + */ + +/* Note: + * + * The book states 2 confusing things about befs b+trees. First, + * it states that the overflow feild of node headers is used by internal nodes + * to point to another node that "effectivly continues this one". Here is what + * I belive that means. Each key in internal nodes points to another node that + * contains key values less than itself. Inspection reveals that the last key + * in the internal node is not the last key in the index. Keys that are + * greater than the last key in the internal node go into the overflow node. + * I imagine there is a performance reason for this. + * + * Second, it states that the header of a btree node is sufficient to + * distinguish internal nodes from leaf nodes. Without saying exactly how. + * After figuring out the first, it becomes obvious that internal nodes have + * overflow nodes and leafnodes do not. + */ + +/* + * Currently, this code is only good for directory B+trees. + * In order to be used for other BFS indexes, it needs to be extended to handle + * duplicate keys and non-string keytypes (int32, int64, float, double). + */ + +/* + * In memory structure of each btree node + */ +typedef struct { + befs_btree_nodehead head; /* head of node converted to cpu byteorder */ + struct buffer_head *bh; + befs_btree_nodehead *od_node; /* on disk node */ +} befs_btree_node; + +/* local constants */ +const static befs_off_t befs_bt_inval = 0xffffffffffffffff; + +/* local functions */ +static int befs_btree_seekleaf(struct super_block *sb, befs_data_stream * ds, + befs_btree_super * bt_super, + befs_btree_node * this_node, + befs_off_t * node_off); + +static int befs_bt_read_super(struct super_block *sb, befs_data_stream * ds, + befs_btree_super * sup); + +static int befs_bt_read_node(struct super_block *sb, befs_data_stream * ds, + befs_btree_node * node, befs_off_t node_off); + +static int befs_leafnode(befs_btree_node * node); + +static u16 *befs_bt_keylen_index(befs_btree_node * node); + +static befs_off_t *befs_bt_valarray(befs_btree_node * node); + +static char *befs_bt_keydata(befs_btree_node * node); + +static int befs_find_key(struct super_block *sb, befs_btree_node * node, + const char *findkey, befs_off_t * value); + +static char *befs_bt_get_key(struct super_block *sb, befs_btree_node * node, + int index, u16 * keylen); + +static int befs_compare_strings(const void *key1, int keylen1, + const void *key2, int keylen2); + +/** + * befs_bt_read_super - read in btree superblock convert to cpu byteorder + * @sb: Filesystem superblock + * @ds: Datastream to read from + * @sup: Buffer in which to place the btree superblock + * + * Calls befs_read_datastream to read in the btree superblock and + * makes sure it is in cpu byteorder, byteswapping if nessisary. + * + * On success, returns BEFS_OK and *@sup contains the btree superblock, + * in cpu byte order. + * + * On failure, BEFS_ERR is returned. + */ +static int +befs_bt_read_super(struct super_block *sb, befs_data_stream * ds, + befs_btree_super * sup) +{ + struct buffer_head *bh = NULL; + befs_btree_super *od_sup = NULL; + + befs_debug(sb, "---> befs_btree_read_super()"); + + bh = befs_read_datastream(sb, ds, 0, NULL); + + if (!bh) { + befs_error(sb, "Couldn't read index header."); + goto error; + } + od_sup = (befs_btree_super *) bh->b_data; + befs_dump_index_entry(sb, od_sup); + + sup->magic = fs32_to_cpu(sb, od_sup->magic); + sup->node_size = fs32_to_cpu(sb, od_sup->node_size); + sup->max_depth = fs32_to_cpu(sb, od_sup->max_depth); + sup->data_type = fs32_to_cpu(sb, od_sup->data_type); + sup->root_node_ptr = fs64_to_cpu(sb, od_sup->root_node_ptr); + sup->free_node_ptr = fs64_to_cpu(sb, od_sup->free_node_ptr); + sup->max_size = fs64_to_cpu(sb, od_sup->max_size); + + brelse(bh); + if (sup->magic != BEFS_BTREE_MAGIC) { + befs_error(sb, "Index header has bad magic."); + goto error; + } + + befs_debug(sb, "<--- befs_btree_read_super()"); + return BEFS_OK; + + error: + befs_debug(sb, "<--- befs_btree_read_super() ERROR"); + return BEFS_ERR; +} + +/** + * befs_bt_read_node - read in btree node and convert to cpu byteorder + * @sb: Filesystem superblock + * @ds: Datastream to read from + * @node: Buffer in which to place the btree node + * @node_off: Starting offset (in bytes) of the node in @ds + * + * Calls befs_read_datastream to read in the indicated btree node and + * makes sure its header feilds are in cpu byteorder, byteswapping if + * nessisary. + * Note: node->bh must be NULL when this function called first + * time. Don't forget brelse(node->bh) after last call. + * + * On success, returns BEFS_OK and *@node contains the btree node that + * starts at @node_off, with the node->head fields in cpu byte order. + * + * On failure, BEFS_ERR is returned. + */ + +static int +befs_bt_read_node(struct super_block *sb, befs_data_stream * ds, + befs_btree_node * node, befs_off_t node_off) +{ + uint off = 0; + + befs_debug(sb, "---> befs_bt_read_node()"); + + if (node->bh) + brelse(node->bh); + + node->bh = befs_read_datastream(sb, ds, node_off, &off); + if (!node->bh) { + befs_error(sb, "befs_bt_read_node() failed to read " + "node at %Lu", node_off); + befs_debug(sb, "<--- befs_bt_read_node() ERROR"); + + return BEFS_ERR; + } + node->od_node = + (befs_btree_nodehead *) ((void *) node->bh->b_data + off); + + befs_dump_index_node(sb, node->od_node); + + node->head.left = fs64_to_cpu(sb, node->od_node->left); + node->head.right = fs64_to_cpu(sb, node->od_node->right); + node->head.overflow = fs64_to_cpu(sb, node->od_node->overflow); + node->head.all_key_count = + fs16_to_cpu(sb, node->od_node->all_key_count); + node->head.all_key_length = + fs16_to_cpu(sb, node->od_node->all_key_length); + + befs_debug(sb, "<--- befs_btree_read_node()"); + return BEFS_OK; +} + +/** + * befs_btree_find - Find a key in a befs B+tree + * @sb: Filesystem superblock + * @ds: Datastream containing btree + * @key: Key string to lookup in btree + * @value: Value stored with @key + * + * On sucess, returns BEFS_OK and sets *@value to the value stored + * with @key (usually the disk block number of an inode). + * + * On failure, returns BEFS_ERR or BEFS_BT_NOT_FOUND. + * + * Algorithm: + * Read the superblock and rootnode of the b+tree. + * Drill down through the interior nodes using befs_find_key(). + * Once at the correct leaf node, use befs_find_key() again to get the + * actuall value stored with the key. + */ +int +befs_btree_find(struct super_block *sb, befs_data_stream * ds, + const char *key, befs_off_t * value) +{ + befs_btree_node *this_node = NULL; + befs_btree_super bt_super; + befs_off_t node_off; + int res; + + befs_debug(sb, "---> befs_btree_find() Key: %s", key); + + if (befs_bt_read_super(sb, ds, &bt_super) != BEFS_OK) { + befs_error(sb, + "befs_btree_find() failed to read index superblock"); + goto error; + } + + this_node = (befs_btree_node *) kmalloc(sizeof (befs_btree_node), + GFP_NOFS); + if (!this_node) { + befs_error(sb, "befs_btree_find() failed to allocate %u " + "bytes of memory", sizeof (befs_btree_node)); + goto error; + } + + this_node->bh = NULL; + + /* read in root node */ + node_off = bt_super.root_node_ptr; + if (befs_bt_read_node(sb, ds, this_node, node_off) != BEFS_OK) { + befs_error(sb, "befs_btree_find() failed to read " + "node at %Lu", node_off); + goto error_alloc; + } + + while (!befs_leafnode(this_node)) { + res = befs_find_key(sb, this_node, key, &node_off); + if (res == BEFS_BT_NOT_FOUND) + node_off = this_node->head.overflow; + /* if no match, go to overflow node */ + if (befs_bt_read_node(sb, ds, this_node, node_off) != BEFS_OK) { + befs_error(sb, "befs_btree_find() failed to read " + "node at %Lu", node_off); + goto error_alloc; + } + } + + /* at the correct leaf node now */ + + res = befs_find_key(sb, this_node, key, value); + + brelse(this_node->bh); + kfree(this_node); + + if (res != BEFS_BT_MATCH) { + befs_debug(sb, "<--- befs_btree_find() Key %s not found", key); + *value = 0; + return BEFS_BT_NOT_FOUND; + } + befs_debug(sb, "<--- befs_btree_find() Found key %s, value %Lu", + key, *value); + return BEFS_OK; + + error_alloc: + kfree(this_node); + error: + *value = 0; + befs_debug(sb, "<--- befs_btree_find() ERROR"); + return BEFS_ERR; +} + +/** + * befs_find_key - Search for a key within a node + * @sb: Filesystem superblock + * @node: Node to find the key within + * @key: Keystring to search for + * @value: If key is found, the value stored with the key is put here + * + * finds exact match if one exists, and returns BEFS_BT_MATCH + * If no exact match, finds first key in node that is greater + * (alpabeticly) than the search key and returns BEFS_BT_PARMATCH + * (for partial match, I guess). Can you think of something better to + * call it? + * + * If no key was a match or greater than the search key, return + * BEFS_BT_NOT_FOUND. + * + * Use binary search instead of a linear. + */ +static int +befs_find_key(struct super_block *sb, befs_btree_node * node, + const char *findkey, befs_off_t * value) +{ + int first, last, mid; + int eq; + u16 keylen; + int findkey_len; + char *thiskey; + befs_off_t *valarray; + + befs_debug(sb, "---> befs_find_key() %s", findkey); + + *value = 0; + + findkey_len = strlen(findkey); + + /* if node can not contain key, just skeep this node */ + last = node->head.all_key_count - 1; + thiskey = befs_bt_get_key(sb, node, last, &keylen); + + eq = befs_compare_strings(thiskey, keylen, findkey, findkey_len); + if (eq < 0) { + befs_debug(sb, "<--- befs_find_key() %s not found", findkey); + return BEFS_BT_NOT_FOUND; + } + + valarray = befs_bt_valarray(node); + + /* simple binary search */ + first = 0; + mid = 0; + while (last >= first) { + mid = (last + first) / 2; + befs_debug(sb, "first: %d, last: %d, mid: %d", first, last, + mid); + thiskey = befs_bt_get_key(sb, node, mid, &keylen); + eq = befs_compare_strings(thiskey, keylen, findkey, + findkey_len); + *value = fs64_to_cpu(sb, valarray[mid]); + + if (eq == 0) { + befs_debug(sb, "<--- befs_find_key() found %s at %d", + thiskey, mid); + + return BEFS_BT_MATCH; + } + if (eq > 0) + last = mid - 1; + else + first = mid + 1; + } + if (eq < 0) + *value = fs64_to_cpu(sb, valarray[mid + 1]); + befs_debug(sb, "<--- befs_find_key() found %s at %d", thiskey, mid); + return BEFS_BT_PARMATCH; +} + +/** + * befs_btree_read - Traverse leafnodes of a btree + * @sb: Filesystem superblock + * @ds: Datastream containing btree + * @key_no: Key number (alphabetical order) of key to read + * @bufsize: Size of the buffer to return key in + * @keybuf: Pointer to a buffer to put the key in + * @keysize: Length of the returned key + * @value: Value stored with the returned key + * + * Heres how it works: Key_no is the index of the key/value pair to + * retun in keybuf/value. + * Bufsize is the size of keybuf (BEFS_NAME_LEN+1 is a good size). Keysize is + * the number of charecters in the key (just a convience). + * + * Algorithm: + * Get the first leafnode of the tree. See if the requested key is in that + * node. If not, follow the node->right link to the next leafnode. Repeat + * until the (key_no)th key is found or the tree is out of keys. + */ +int +befs_btree_read(struct super_block *sb, befs_data_stream * ds, + loff_t key_no, size_t bufsize, char *keybuf, size_t * keysize, + befs_off_t * value) +{ + befs_btree_node *this_node; + befs_btree_super bt_super; + befs_off_t node_off = 0; + int cur_key; + befs_off_t *valarray; + char *keystart; + u16 keylen; + int res; + + uint key_sum = 0; + + befs_debug(sb, "---> befs_btree_read()"); + + if (befs_bt_read_super(sb, ds, &bt_super) != BEFS_OK) { + befs_error(sb, + "befs_btree_read() failed to read index superblock"); + goto error; + } + + if ((this_node = (befs_btree_node *) + kmalloc(sizeof (befs_btree_node), GFP_NOFS)) == NULL) { + befs_error(sb, "befs_btree_read() failed to allocate %u " + "bytes of memory", sizeof (befs_btree_node)); + goto error; + } + + node_off = bt_super.root_node_ptr; + this_node->bh = NULL; + + /* seeks down to first leafnode, reads it into this_node */ + res = befs_btree_seekleaf(sb, ds, &bt_super, this_node, &node_off); + if (res == BEFS_BT_EMPTY) { + brelse(this_node->bh); + kfree(this_node); + *value = 0; + *keysize = 0; + befs_debug(sb, "<--- befs_btree_read() Tree is EMPTY"); + return BEFS_BT_EMPTY; + } else if (res == BEFS_ERR) { + goto error_alloc; + } + + /* find the leaf node containing the key_no key */ + + while (key_sum + this_node->head.all_key_count <= key_no) { + + /* no more nodes to look in: key_no is too large */ + if (this_node->head.right == befs_bt_inval) { + *keysize = 0; + *value = 0; + befs_debug(sb, + "<--- befs_btree_read() END of keys at %Lu", + key_sum + this_node->head.all_key_count); + brelse(this_node->bh); + kfree(this_node); + return BEFS_BT_END; + } + + key_sum += this_node->head.all_key_count; + node_off = this_node->head.right; + + if (befs_bt_read_node(sb, ds, this_node, node_off) != BEFS_OK) { + befs_error(sb, "befs_btree_read() failed to read " + "node at %Lu", node_off); + goto error_alloc; + } + } + + /* how many keys into this_node is key_no */ + cur_key = key_no - key_sum; + + /* get pointers to datastructures within the node body */ + valarray = befs_bt_valarray(this_node); + + keystart = befs_bt_get_key(sb, this_node, cur_key, &keylen); + + befs_debug(sb, "Read [%Lu,%d]: keysize %d", node_off, cur_key, keylen); + + if (bufsize < keylen + 1) { + befs_error(sb, "befs_btree_read() keybuf too small (%u) " + "for key of size %d", bufsize, keylen); + brelse(this_node->bh); + goto error_alloc; + }; + + strncpy(keybuf, keystart, keylen); + *value = fs64_to_cpu(sb, valarray[cur_key]); + *keysize = keylen; + keybuf[keylen] = '\0'; + + befs_debug(sb, "Read [%Lu,%d]: Key \"%.*s\", Value %Lu", node_off, + cur_key, keylen, keybuf, *value); + + brelse(this_node->bh); + kfree(this_node); + + befs_debug(sb, "<--- befs_btree_read()"); + + return BEFS_OK; + + error_alloc: + kfree(this_node); + + error: + *keysize = 0; + *value = 0; + befs_debug(sb, "<--- befs_btree_read() ERROR"); + return BEFS_ERR; +} + +/** + * befs_btree_seekleaf - Find the first leafnode in the btree + * @sb: Filesystem superblock + * @ds: Datastream containing btree + * @bt_super: Pointer to the uperblock of the btree + * @this_node: Buffer to return the leafnode in + * @node_off: Pointer to offset of current node within datastream. Modified + * by the function. + * + * + * Helper function for btree traverse. Moves the current position to the + * start of the first leaf node. + * + * Also checks for an empty tree. If there are no keys, returns BEFS_BT_EMPTY. + */ +static int +befs_btree_seekleaf(struct super_block *sb, befs_data_stream * ds, + befs_btree_super * bt_super, befs_btree_node * this_node, + befs_off_t * node_off) +{ + + befs_debug(sb, "---> befs_btree_seekleaf()"); + + if (befs_bt_read_node(sb, ds, this_node, *node_off) != BEFS_OK) { + befs_error(sb, "befs_btree_seekleaf() failed to read " + "node at %Lu", *node_off); + goto error; + } + befs_debug(sb, "Seekleaf to root node %Lu", *node_off); + + if (this_node->head.all_key_count == 0 && befs_leafnode(this_node)) { + befs_debug(sb, "<--- befs_btree_seekleaf() Tree is EMPTY"); + return BEFS_BT_EMPTY; + } + + while (!befs_leafnode(this_node)) { + + if (this_node->head.all_key_count == 0) { + befs_debug(sb, "befs_btree_seekleaf() encountered " + "an empty interior node: %Lu. Using Overflow " + "node: %Lu", *node_off, + this_node->head.overflow); + *node_off = this_node->head.overflow; + } else { + befs_off_t *valarray = befs_bt_valarray(this_node); + *node_off = fs64_to_cpu(sb, valarray[0]); + } + if (befs_bt_read_node(sb, ds, this_node, *node_off) != BEFS_OK) { + befs_error(sb, "befs_btree_seekleaf() failed to read " + "node at %Lu", *node_off); + goto error; + } + + befs_debug(sb, "Seekleaf to child node %Lu", *node_off); + } + befs_debug(sb, "Node %Lu is a leaf node", *node_off); + + return BEFS_OK; + + error: + befs_debug(sb, "<--- befs_btree_seekleaf() ERROR"); + return BEFS_ERR; +} + +/** + * befs_leafnode - Determine if the btree node is a leaf node or an + * interior node + * @node: Pointer to node structure to test + * + * Return 1 if leaf, 0 if interior + */ +static int +befs_leafnode(befs_btree_node * node) +{ + /* all interior nodes (and only interior nodes) have an overflow node */ + if (node->head.overflow == befs_bt_inval) + return 1; + else + return 0; +} + +/** + * befs_bt_keylen_index - Finds start of keylen index in a node + * @node: Pointer to the node structure to find the keylen index within + * + * Returns a pointer to the start of the key length index array + * of the B+tree node *@node + * + * "The length of all the keys in the node is added to the size of the + * header and then rounded up to a multiple of four to get the begining + * of the key length index" (p.88, practical filesystem design). + * + * Exept that rounding up to 8 works, and rounding up to 4 doesn't. + */ +static u16 * +befs_bt_keylen_index(befs_btree_node * node) +{ + const int keylen_align = 8; + unsigned long int off = + (sizeof (befs_btree_nodehead) + node->head.all_key_length); + ulong tmp = off % keylen_align; + + if (tmp) + off += keylen_align - tmp; + + return (u16 *) ((void *) node->od_node + off); +} + +/** + * befs_bt_valarray - Finds the start of value array in a node + * @node: Pointer to the node structure to find the value array within + * + * Returns a pointer to the start of the value array + * of the node pointed to by the node header + */ +static befs_off_t * +befs_bt_valarray(befs_btree_node * node) +{ + void *keylen_index_start = (void *) befs_bt_keylen_index(node); + size_t keylen_index_size = node->head.all_key_count * sizeof (u16); + + return (befs_off_t *) (keylen_index_start + keylen_index_size); +} + +/** + * befs_bt_keydata - Finds start of keydata array in a node + * @node: Pointer to the node structure to find the keydata array within + * + * Returns a pointer to the start of the keydata array + * of the node pointed to by the node header + */ +static char * +befs_bt_keydata(befs_btree_node * node) +{ + return (char *) ((void *) node->od_node + sizeof (befs_btree_nodehead)); +} + +/** + * befs_bt_get_key - returns a pointer to the start of a key + * @sb: filesystem superblock + * @node: node in which to look for the key + * @index: the index of the key to get + * @keylen: modified to be the length of the key at @index + * + * Returns a valid pointer into @node on success. + * Returns NULL on failure (bad input) and sets *@keylen = 0 + */ +static char * +befs_bt_get_key(struct super_block *sb, befs_btree_node * node, + int index, u16 * keylen) +{ + int prev_key_end; + char *keystart; + u16 *keylen_index; + + if (index < 0 || index > node->head.all_key_count) { + *keylen = 0; + return NULL; + } + + keystart = befs_bt_keydata(node); + keylen_index = befs_bt_keylen_index(node); + + if (index == 0) + prev_key_end = 0; + else + prev_key_end = fs16_to_cpu(sb, keylen_index[index - 1]); + + *keylen = fs16_to_cpu(sb, keylen_index[index]) - prev_key_end; + + return keystart + prev_key_end; +} + +/** + * befs_compare_strings - compare two strings + * @key1: pointer to the first key to be compared + * @keylen1: length in bytes of key1 + * @key2: pointer to the second key to be compared + * @kelen2: lenght in bytes of key2 + * + * Returns 0 if @key1 and @key2 are equal. + * Returns >0 if @key1 is greater. + * Returns <0 if @key2 is greater.. + */ +static int +befs_compare_strings(const void *key1, int keylen1, + const void *key2, int keylen2) +{ + int len = min_t(int, keylen1, keylen2); + int result = strncmp(key1, key2, len); + if (result == 0) + result = keylen1 - keylen2; + return result; +} + +/* These will be used for non-string keyed btrees */ +#if 0 +static int +btree_compare_int32(cont void *key1, int keylen1, const void *key2, int keylen2) +{ + return *(int32_t *) key1 - *(int32_t *) key2; +} + +static int +btree_compare_uint32(cont void *key1, int keylen1, + const void *key2, int keylen2) +{ + if (*(u_int32_t *) key1 == *(u_int32_t *) key2) + return 0; + else if (*(u_int32_t *) key1 > *(u_int32_t *) key2) + return 1; + + return -1; +} +static int +btree_compare_int64(cont void *key1, int keylen1, const void *key2, int keylen2) +{ + if (*(int64_t *) key1 == *(int64_t *) key2) + return 0; + else if (*(int64_t *) key1 > *(int64_t *) key2) + return 1; + + return -1; +} + +static int +btree_compare_uint64(cont void *key1, int keylen1, + const void *key2, int keylen2) +{ + if (*(u_int64_t *) key1 == *(u_int64_t *) key2) + return 0; + else if (*(u_int64_t *) key1 > *(u_int64_t *) key2) + return 1; + + return -1; +} + +static int +btree_compare_float(cont void *key1, int keylen1, const void *key2, int keylen2) +{ + float result = *(float *) key1 - *(float *) key2; + if (result == 0.0f) + return 0; + + return (result < 0.0f) ? -1 : 1; +} + +static int +btree_compare_double(cont void *key1, int keylen1, + const void *key2, int keylen2) +{ + double result = *(double *) key1 - *(double *) key2; + if (result == 0.0) + return 0; + + return (result < 0.0) ? -1 : 1; +} +#endif //0 diff -Nru a/fs/befs/btree.h b/fs/befs/btree.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/btree.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,13 @@ +/* + * btree.h + * + */ + + +int befs_btree_find(struct super_block *sb, befs_data_stream * ds, + const char *key, befs_off_t * value); + +int befs_btree_read(struct super_block *sb, befs_data_stream * ds, + loff_t key_no, size_t bufsize, char *keybuf, + size_t * keysize, befs_off_t * value); + diff -Nru a/fs/befs/datastream.c b/fs/befs/datastream.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/datastream.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,528 @@ +/* + * linux/fs/befs/datastream.c + * + * Copyright (C) 2001 Will Dyson + * + * Based on portions of file.c by Makoto Kato + * + * Many thanks to Dominic Giampaolo, author of "Practical File System + * Design with the Be File System", for such a helpful book. + * + */ + +#include +#include +#include +#include + +#include "befs.h" +#include "datastream.h" +#include "io.h" +#include "endian.h" + +const befs_inode_addr BAD_IADDR = { 0, 0, 0 }; + +static int befs_find_brun_direct(struct super_block *sb, + befs_data_stream * data, + befs_blocknr_t blockno, befs_block_run * run); + +static int befs_find_brun_indirect(struct super_block *sb, + befs_data_stream * data, + befs_blocknr_t blockno, + befs_block_run * run); + +static int befs_find_brun_dblindirect(struct super_block *sb, + befs_data_stream * data, + befs_blocknr_t blockno, + befs_block_run * run); + +/** + * befs_read_datastream - get buffer_head containing data, starting from pos. + * @sb: Filesystem superblock + * @ds: datastrem to find data with + * @pos: start of data + * @off: offset of data in buffer_head->b_data + * + * Returns pointer to buffer_head containing data starting with offset @off, + * if you don't need to know offset just set @off = NULL. + */ +struct buffer_head * +befs_read_datastream(struct super_block *sb, befs_data_stream * ds, + befs_off_t pos, uint * off) +{ + struct buffer_head *bh = NULL; + befs_block_run run; + befs_blocknr_t block; /* block coresponding to pos */ + + befs_debug(sb, "---> befs_read_datastream() %Lu", pos); + block = pos >> BEFS_SB(sb)->block_shift; + if (off) + *off = pos - (block << BEFS_SB(sb)->block_shift); + + if (befs_fblock2brun(sb, ds, block, &run) != BEFS_OK) { + befs_error(sb, "BeFS: Error finding disk addr of block %lu", + block); + befs_debug(sb, "<--- befs_read_datastream() ERROR"); + return NULL; + } + bh = befs_bread_iaddr(sb, run); + if (!bh) { + befs_error(sb, "BeFS: Error reading block %lu from datastream", + block); + return NULL; + } + + befs_debug(sb, "<--- befs_read_datastream() read data, starting at %Lu", + pos); + + return bh; +} + +/* + * Takes a file position and gives back a brun who's starting block + * is block number fblock of the file. + * + * Returns BEFS_OK or BEFS_ERR. + * + * Calls specialized functions for each of the three possible + * datastream regions. + * + * 2001-11-15 Will Dyson + */ +int +befs_fblock2brun(struct super_block *sb, befs_data_stream * data, + befs_blocknr_t fblock, befs_block_run * run) +{ + int err; + befs_off_t pos = fblock << BEFS_SB(sb)->block_shift; + + if (pos < data->max_direct_range) { + err = befs_find_brun_direct(sb, data, fblock, run); + + } else if (pos < data->max_indirect_range) { + err = befs_find_brun_indirect(sb, data, fblock, run); + + } else if (pos < data->max_double_indirect_range) { + err = befs_find_brun_dblindirect(sb, data, fblock, run); + + } else { + befs_error(sb, + "befs_fblock2brun() was asked to find block %lu, " + "which is not mapped by the datastream\n", fblock); + err = BEFS_ERR; + } + return err; +} + +/** + * befs_read_lsmylink - read long symlink from datastream. + * @sb: Filesystem superblock + * @ds: Datastrem to read from + * @buf: Buffer in wich to place long symlink data + * @len: Length of the long symlink in bytes + * + * Returns the number of bytes read + */ +size_t +befs_read_lsymlink(struct super_block * sb, befs_data_stream * ds, void *buff, + befs_off_t len) +{ + befs_off_t bytes_read = 0; /* bytes readed */ + u16 plen; + struct buffer_head *bh = NULL; + befs_debug(sb, "---> befs_read_lsymlink() length: %Lu", len); + + while (bytes_read < len) { + bh = befs_read_datastream(sb, ds, bytes_read, NULL); + if (!bh) { + befs_error(sb, "BeFS: Error reading datastream block " + "starting from %Lu", bytes_read); + befs_debug(sb, "<--- befs_read_lsymlink() ERROR"); + return bytes_read; + + } + plen = ((bytes_read + BEFS_SB(sb)->block_size) < len) ? + BEFS_SB(sb)->block_size : len - bytes_read; + memcpy(buff + bytes_read, bh->b_data, plen); + brelse(bh); + bytes_read += plen; + } + + befs_debug(sb, "<--- befs_read_lsymlink() read %u bytes", bytes_read); + return bytes_read; +} + +/** + * befs_count_blocks - blocks used by a file + * @sb: Filesystem superblock + * @ds: Datastream of the file + * + * Counts the number of fs blocks that the file represented by + * inode occupies on the filesystem, counting both regular file + * data and filesystem metadata (and eventually attribute data + * when we support attributes) +*/ + +befs_blocknr_t +befs_count_blocks(struct super_block * sb, befs_data_stream * ds) +{ + befs_blocknr_t blocks; + befs_blocknr_t datablocks; /* File data blocks */ + befs_blocknr_t metablocks; /* FS metadata blocks */ + befs_sb_info *befs_sb = BEFS_SB(sb); + + befs_debug(sb, "---> befs_count_blocks()"); + + datablocks = ds->size >> befs_sb->block_shift; + if (ds->size & (befs_sb->block_size - 1)) + datablocks += 1; + + metablocks = 1; /* Start with 1 block for inode */ + + /* Size of indirect block */ + if (ds->size > ds->max_direct_range) + metablocks += ds->indirect.len; + + /* + Double indir block, plus all the indirect blocks it mapps + In the double-indirect range, all block runs of data are + BEFS_DBLINDIR_BRUN_LEN blocks long. Therefore, we know + how many data block runs are in the double-indirect region, + and from that we know how many indirect blocks it takes to + map them. We assume that the indirect blocks are also + BEFS_DBLINDIR_BRUN_LEN blocks long. + */ + if (ds->size > ds->max_indirect_range && ds->max_indirect_range != 0) { + uint dbl_bytes; + uint dbl_bruns; + uint indirblocks; + + dbl_bytes = + ds->max_double_indirect_range - ds->max_indirect_range; + dbl_bruns = + dbl_bytes / (befs_sb->block_size * BEFS_DBLINDIR_BRUN_LEN); + indirblocks = dbl_bruns / befs_iaddrs_per_block(sb); + + metablocks += ds->double_indirect.len; + metablocks += indirblocks; + } + + blocks = datablocks + metablocks; + befs_debug(sb, "<--- befs_count_blocks() %u blocks", blocks); + + return blocks; +} + +/* + Finds the block run that starts at file block number blockno + in the file represented by the datastream data, if that + blockno is in the direct region of the datastream. + + sb: the superblock + data: the datastream + blockno: the blocknumber to find + run: The found run is passed back through this pointer + + Return value is BEFS_OK if the blockrun is found, BEFS_ERR + otherwise. + + Algorithm: + Linear search. Checks each element of array[] to see if it + contains the blockno-th filesystem block. This is nessisary + because the block runs map variable amounts of data. Simply + keeps a count of the number of blocks searched so far (sum), + incrementing this by the length of each block run as we come + across it. Adds sum to *count before returning (this is so + you can search multiple arrays that are logicaly one array, + as in the indirect region code). + + When/if blockno is found, if blockno is inside of a block + run as stored on disk, we offset the start and lenght members + of the block run, so that blockno is the start and len is + still valid (the run ends in the same place). + + 2001-11-15 Will Dyson +*/ +static int +befs_find_brun_direct(struct super_block *sb, befs_data_stream * data, + befs_blocknr_t blockno, befs_block_run * run) +{ + int i; + befs_block_run *array = data->direct; + befs_blocknr_t sum; + befs_blocknr_t max_block = + data->max_direct_range >> BEFS_SB(sb)->block_shift; + + befs_debug(sb, "---> befs_find_brun_direct(), find %lu", blockno); + + if (blockno > max_block) { + befs_error(sb, "befs_find_brun_direct() passed block outside of" + "direct region"); + return BEFS_ERR; + } + + for (i = 0, sum = 0; i < BEFS_NUM_DIRECT_BLOCKS; + sum += array[i].len, i++) { + if (blockno >= sum && blockno < sum + (array[i].len)) { + int offset = blockno - sum; + run->allocation_group = array[i].allocation_group; + run->start = array[i].start + offset; + run->len = array[i].len - offset; + + befs_debug(sb, "---> befs_find_brun_direct(), " + "found %lu at direct[%d]", blockno, i); + return BEFS_OK; + } + } + + befs_debug(sb, "---> befs_find_brun_direct() ERROR"); + return BEFS_ERR; +} + +/* + Finds the block run that starts at file block number blockno + in the file represented by the datastream data, if that + blockno is in the indirect region of the datastream. + + sb: the superblock + data: the datastream + blockno: the blocknumber to find + run: The found run is passed back through this pointer + + Return value is BEFS_OK if the blockrun is found, BEFS_ERR + otherwise. + + Algorithm: + For each block in the indirect run of the datastream, read + it in and search through it for search_blk. + + XXX: + Really should check to make sure blockno is inside indirect + region. + + 2001-11-15 Will Dyson +*/ +static int +befs_find_brun_indirect(struct super_block *sb, + befs_data_stream * data, befs_blocknr_t blockno, + befs_block_run * run) +{ + int i, j; + befs_blocknr_t sum = 0; + befs_blocknr_t indir_start_blk; + befs_blocknr_t search_blk; + struct buffer_head *indirblock; + befs_block_run *array; + + befs_block_run indirect = data->indirect; + befs_blocknr_t indirblockno = iaddr2blockno(sb, &indirect); + int arraylen = befs_iaddrs_per_block(sb); + + befs_debug(sb, "---> befs_find_brun_indirect(), find %lu", blockno); + + indir_start_blk = data->max_direct_range >> BEFS_SB(sb)->block_shift; + search_blk = blockno - indir_start_blk; + + /* Examine blocks of the indirect run one at a time */ + for (i = 0; i < indirect.len; i++) { + indirblock = befs_bread(sb, indirblockno + i); + if (indirblock == NULL) { + befs_debug(sb, + "---> befs_find_brun_indirect() failed to " + "read disk block %lu from the indirect brun", + indirblockno + i); + return BEFS_ERR; + } + + array = (befs_block_run *) indirblock->b_data; + + for (j = 0; j < arraylen; ++j) { + int len = fs16_to_cpu(sb, array[j].len); + + if (search_blk >= sum && search_blk < sum + len) { + int offset = search_blk - sum; + run->allocation_group = + fs32_to_cpu(sb, array[j].allocation_group); + run->start = + fs16_to_cpu(sb, array[j].start) + offset; + run->len = + fs16_to_cpu(sb, array[j].len) - offset; + + brelse(indirblock); + befs_debug(sb, + "<--- befs_find_brun_indirect() found " + "file block %lu at indirect[%d]", + blockno, j + (i * arraylen)); + return BEFS_OK; + } + sum += len; + } + + brelse(indirblock); + } + + /* Only fallthrough is an error */ + befs_error(sb, "BeFS: befs_find_brun_indirect() failed to find " + "file block %lu", blockno); + + befs_debug(sb, "<--- befs_find_brun_indirect() ERROR"); + return BEFS_ERR; +} + +/* + Finds the block run that starts at file block number blockno + in the file represented by the datastream data, if that + blockno is in the double-indirect region of the datastream. + + sb: the superblock + data: the datastream + blockno: the blocknumber to find + run: The found run is passed back through this pointer + + Return value is BEFS_OK if the blockrun is found, BEFS_ERR + otherwise. + + Algorithm: + The block runs in the double-indirect region are different. + They are always allocated 4 fs blocks at a time, so each + block run maps a constant amount of file data. This means + that we can directly calculate how many block runs into the + double-indirect region we need to go to get to the one that + maps a particular filesystem block. + + We do this in two stages. First we calculate which of the + inode addresses in the double-indirect block will point us + to the indirect block that contains the mapping for the data, + then we calculate which of the inode addresses in that + indirect block maps the data block we are after. + + Oh, and once we've done that, we actually read in the blocks + that contain the inode addresses we calculated above. Even + though the double-indirect run may be several blocks long, + we can calculate which of those blocks will contain the index + we are after and only read that one. We then follow it to + the indirect block and perform a similar process to find + the actual block run that maps the data block we are interested + in. + + Then we offset the run as in befs_find_brun_array() and we are + done. + + 2001-11-15 Will Dyson +*/ +static int +befs_find_brun_dblindirect(struct super_block *sb, + befs_data_stream * data, befs_blocknr_t blockno, + befs_block_run * run) +{ + int dblindir_indx; + int indir_indx; + int offset; + int dbl_which_block; + int which_block; + int dbl_block_indx; + int block_indx; + off_t dblindir_leftover; + befs_blocknr_t blockno_at_run_start; + struct buffer_head *dbl_indir_block; + struct buffer_head *indir_block; + befs_block_run indir_run; + befs_inode_addr *iaddr_array = NULL; + befs_sb_info *befs_sb = BEFS_SB(sb); + + befs_blocknr_t indir_start_blk = + data->max_indirect_range >> befs_sb->block_shift; + + off_t dbl_indir_off = blockno - indir_start_blk; + + /* number of data blocks mapped by each of the iaddrs in + * the indirect block pointed to by the double indirect block + */ + size_t iblklen = BEFS_DBLINDIR_BRUN_LEN; + + /* number of data blocks mapped by each of the iaddrs in + * the double indirect block + */ + size_t diblklen = iblklen * befs_iaddrs_per_block(sb) + * BEFS_DBLINDIR_BRUN_LEN; + + befs_debug(sb, "---> befs_find_brun_dblindirect() find %lu", blockno); + + /* First, discover which of the double_indir->indir blocks + * contains pos. Then figure out how much of pos that + * accounted for. Then discover which of the iaddrs in + * the indirect block contains pos. + */ + + dblindir_indx = dbl_indir_off / diblklen; + dblindir_leftover = dbl_indir_off % diblklen; + indir_indx = dblindir_leftover / diblklen; + + /* Read double indirect block */ + dbl_which_block = dblindir_indx / befs_iaddrs_per_block(sb); + if (dbl_which_block > data->double_indirect.len) { + befs_error(sb, "The double-indirect index calculated by " + "befs_read_brun_dblindirect(), %d, is outside the range " + "of the double-indirect block", dblindir_indx); + return BEFS_ERR; + } + + dbl_indir_block = + befs_bread(sb, iaddr2blockno(sb, &data->double_indirect) + + dbl_which_block); + if (dbl_indir_block == NULL) { + befs_error(sb, "befs_read_brun_dblindirect() couldn't read the " + "double-indirect block at blockno %lu", + iaddr2blockno(sb, + &data->double_indirect) + + dbl_which_block); + brelse(dbl_indir_block); + return BEFS_ERR; + } + + dbl_block_indx = + dblindir_indx - (dbl_which_block * befs_iaddrs_per_block(sb)); + iaddr_array = (befs_inode_addr *) dbl_indir_block->b_data; + indir_run = fsrun_to_cpu(sb, iaddr_array[dbl_block_indx]); + brelse(dbl_indir_block); + iaddr_array = NULL; + + /* Read indirect block */ + which_block = indir_indx / befs_iaddrs_per_block(sb); + if (which_block > indir_run.len) { + befs_error(sb, "The indirect index calculated by " + "befs_read_brun_dblindirect(), %d, is outside the range " + "of the indirect block", indir_indx); + return BEFS_ERR; + } + + indir_block = + befs_bread(sb, iaddr2blockno(sb, &indir_run) + which_block); + if (indir_block == NULL) { + befs_error(sb, "befs_read_brun_dblindirect() couldn't read the " + "indirect block at blockno %lu", + iaddr2blockno(sb, &indir_run) + which_block); + brelse(indir_block); + return BEFS_ERR; + } + + block_indx = indir_indx - (which_block * befs_iaddrs_per_block(sb)); + iaddr_array = (befs_inode_addr *) indir_block->b_data; + *run = fsrun_to_cpu(sb, iaddr_array[block_indx]); + brelse(indir_block); + iaddr_array = NULL; + + blockno_at_run_start = indir_start_blk; + blockno_at_run_start += diblklen * dblindir_indx; + blockno_at_run_start += iblklen * indir_indx; + offset = blockno - blockno_at_run_start; + + run->start += offset; + run->len -= offset; + + befs_debug(sb, "Found file block %lu in double_indirect[%d][%d]," + " double_indirect_leftover = %lu", + blockno, dblindir_indx, indir_indx, dblindir_leftover); + + return BEFS_OK; +} diff -Nru a/fs/befs/datastream.h b/fs/befs/datastream.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/datastream.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,19 @@ +/* + * datastream.h + * + */ + +struct buffer_head *befs_read_datastream(struct super_block *sb, + befs_data_stream * ds, befs_off_t pos, + uint * off); + +int befs_fblock2brun(struct super_block *sb, befs_data_stream * data, + befs_blocknr_t fblock, befs_block_run * run); + +size_t befs_read_lsymlink(struct super_block *sb, befs_data_stream * data, + void *buff, befs_off_t len); + +befs_blocknr_t befs_count_blocks(struct super_block *sb, befs_data_stream * ds); + +extern const befs_inode_addr BAD_IADDR; + diff -Nru a/fs/befs/debug.c b/fs/befs/debug.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/debug.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,262 @@ +/* + * linux/fs/befs/debug.c + * + * Copyright (C) 2001 Will Dyson (will_dyson at pobox.com) + * + * With help from the ntfs-tng driver by Anton Altparmakov + * + * Copyright (C) 1999 Makoto Kato (m_kato@ga2.so-net.ne.jp) + * + * debug functions + */ + +#ifdef __KERNEL__ + +#include +#include +#include +#include +#include + +#endif /* __KERNEL__ */ + +#include "befs.h" +#include "endian.h" + +#define ERRBUFSIZE 1024 + +void +befs_error(const struct super_block *sb, const char *fmt, ...) +{ + va_list args; + char err_buf[ERRBUFSIZE]; + + va_start(args, fmt); + vsnprintf(err_buf, ERRBUFSIZE, fmt, args); + va_end(args); + + printk(KERN_ERR "BeFS(%s): %s\n", sb->s_id, err_buf); + + befs_debug(sb, err_buf); +} + +void +befs_warning(const struct super_block *sb, const char *fmt, ...) +{ + va_list args; + char err_buf[ERRBUFSIZE]; + + va_start(args, fmt); + vsnprintf(err_buf, ERRBUFSIZE, fmt, args); + va_end(args); + + printk(KERN_WARNING "BeFS(%s): %s\n", sb->s_id, err_buf); + + befs_debug(sb, err_buf); +} + +void +befs_debug(const struct super_block *sb, const char *fmt, ...) +{ +#ifdef CONFIG_BEFS_DEBUG + + va_list args; + char err_buf[ERRBUFSIZE]; + + if (BEFS_SB(sb)->mount_opts.debug) { + va_start(args, fmt); + vsnprintf(err_buf, ERRBUFSIZE, fmt, args); + va_end(args); + + printk(KERN_DEBUG "BeFS(%s): %s\n", sb->s_id, err_buf); + } +#endif //CONFIG_BEFS_DEBUG +} + +void +befs_dump_inode(const struct super_block *sb, befs_inode * inode) +{ +#ifdef CONFIG_BEFS_DEBUG + + befs_block_run tmp_run; + + befs_debug(sb, "befs_inode infomation"); + + befs_debug(sb, " magic1 %08x", fs32_to_cpu(sb, inode->magic1)); + + tmp_run = fsrun_to_cpu(sb, inode->inode_num); + befs_debug(sb, " inode_num %u, %hu, %hu", + tmp_run.allocation_group, tmp_run.start, tmp_run.len); + + befs_debug(sb, " uid %u", fs32_to_cpu(sb, inode->uid)); + befs_debug(sb, " gid %u", fs32_to_cpu(sb, inode->gid)); + befs_debug(sb, " mode %08x", fs32_to_cpu(sb, inode->mode)); + befs_debug(sb, " flags %08x", fs32_to_cpu(sb, inode->flags)); + befs_debug(sb, " create_time %Lu", + fs64_to_cpu(sb, inode->create_time)); + befs_debug(sb, " last_modified_time %Lu", + fs64_to_cpu(sb, inode->last_modified_time)); + + tmp_run = fsrun_to_cpu(sb, inode->parent); + befs_debug(sb, " parent [%u, %hu, %hu]", + tmp_run.allocation_group, tmp_run.start, tmp_run.len); + + tmp_run = fsrun_to_cpu(sb, inode->attributes); + befs_debug(sb, " attributes [%u, %hu, %hu]", + tmp_run.allocation_group, tmp_run.start, tmp_run.len); + + befs_debug(sb, " type %08x", fs32_to_cpu(sb, inode->type)); + befs_debug(sb, " inode_size %u", fs32_to_cpu(sb, inode->inode_size)); + + if (S_ISLNK(inode->mode)) { + befs_debug(sb, " Symbolic link [%s]", inode->data.symlink); + } else { + int i; + + for (i = 0; i < BEFS_NUM_DIRECT_BLOCKS; i++) { + tmp_run = + fsrun_to_cpu(sb, inode->data.datastream.direct[i]); + befs_debug(sb, " direct %d [%u, %hu, %hu]", i, + tmp_run.allocation_group, tmp_run.start, + tmp_run.len); + } + befs_debug(sb, " max_direct_range %Lu", + fs64_to_cpu(sb, + inode->data.datastream. + max_direct_range)); + + tmp_run = fsrun_to_cpu(sb, inode->data.datastream.indirect); + befs_debug(sb, " indirect [%u, %hu, %hu]", + tmp_run.allocation_group, + tmp_run.start, tmp_run.len); + + befs_debug(sb, " max_indirect_range %Lu", + fs64_to_cpu(sb, + inode->data.datastream. + max_indirect_range)); + + tmp_run = + fsrun_to_cpu(sb, inode->data.datastream.double_indirect); + befs_debug(sb, " double indirect [%u, %hu, %hu]", + tmp_run.allocation_group, tmp_run.start, + tmp_run.len); + + befs_debug(sb, " max_double_indirect_range %Lu", + fs64_to_cpu(sb, + inode->data.datastream. + max_double_indirect_range)); + + befs_debug(sb, " size %Lu", + fs64_to_cpu(sb, inode->data.datastream.size)); + } + +#endif //CONFIG_BEFS_DEBUG +} + +/* + * Display super block structure for debug. + */ + +void +befs_dump_super_block(const struct super_block *sb, befs_super_block * sup) +{ +#ifdef CONFIG_BEFS_DEBUG + + befs_block_run tmp_run; + + befs_debug(sb, "befs_super_block information"); + + befs_debug(sb, " name %s", sup->name); + befs_debug(sb, " magic1 %08x", fs32_to_cpu(sb, sup->magic1)); + befs_debug(sb, " fs_byte_order %08x", + fs32_to_cpu(sb, sup->fs_byte_order)); + + befs_debug(sb, " block_size %u", fs32_to_cpu(sb, sup->block_size)); + befs_debug(sb, " block_shift %u", fs32_to_cpu(sb, sup->block_shift)); + + befs_debug(sb, " num_blocks %Lu", fs64_to_cpu(sb, sup->num_blocks)); + befs_debug(sb, " used_blocks %Lu", fs64_to_cpu(sb, sup->used_blocks)); + + befs_debug(sb, " magic2 %08x", fs32_to_cpu(sb, sup->magic2)); + befs_debug(sb, " blocks_per_ag %u", + fs32_to_cpu(sb, sup->blocks_per_ag)); + befs_debug(sb, " ag_shift %u", fs32_to_cpu(sb, sup->ag_shift)); + befs_debug(sb, " num_ags %u", fs32_to_cpu(sb, sup->num_ags)); + + befs_debug(sb, " flags %08x", fs32_to_cpu(sb, sup->flags)); + + tmp_run = fsrun_to_cpu(sb, sup->log_blocks); + befs_debug(sb, " log_blocks %u, %hu, %hu", + tmp_run.allocation_group, tmp_run.start, tmp_run.len); + + befs_debug(sb, " log_start %Ld", fs64_to_cpu(sb, sup->log_start)); + befs_debug(sb, " log_end %Ld", fs64_to_cpu(sb, sup->log_end)); + + befs_debug(sb, " magic3 %08x", fs32_to_cpu(sb, sup->magic3)); + + tmp_run = fsrun_to_cpu(sb, sup->root_dir); + befs_debug(sb, " root_dir %u, %hu, %hu", + tmp_run.allocation_group, tmp_run.start, tmp_run.len); + + tmp_run = fsrun_to_cpu(sb, sup->indices); + befs_debug(sb, " indices %u, %hu, %hu", + tmp_run.allocation_group, tmp_run.start, tmp_run.len); + +#endif //CONFIG_BEFS_DEBUG +} + +void +befs_dump_small_data(const struct super_block *sb, befs_small_data * sd) +{ +} + +void +befs_dump_run(const struct super_block *sb, befs_block_run run) +{ +#ifdef CONFIG_BEFS_DEBUG + + run = fsrun_to_cpu(sb, run); + + befs_debug(sb, "[%u, %hu, %hu]", + run.allocation_group, run.start, run.len); + +#endif //CONFIG_BEFS_DEBUG +} + +void +befs_dump_index_entry(const struct super_block *sb, befs_btree_super * super) +{ +#ifdef CONFIG_BEFS_DEBUG + + befs_debug(sb, "Btree super structure"); + befs_debug(sb, " magic %08x", fs32_to_cpu(sb, super->magic)); + befs_debug(sb, " node_size %u", fs32_to_cpu(sb, super->node_size)); + befs_debug(sb, " max_depth %08x", fs32_to_cpu(sb, super->max_depth)); + + befs_debug(sb, " data_type %08x", fs32_to_cpu(sb, super->data_type)); + befs_debug(sb, " root_node_pointer %016LX", + fs64_to_cpu(sb, super->root_node_ptr)); + befs_debug(sb, " free_node_pointer %016LX", + fs64_to_cpu(sb, super->free_node_ptr)); + befs_debug(sb, " maximum size %016LX", + fs64_to_cpu(sb, super->max_size)); + +#endif //CONFIG_BEFS_DEBUG +} + +void +befs_dump_index_node(const struct super_block *sb, befs_btree_nodehead * node) +{ +#ifdef CONFIG_BEFS_DEBUG + + befs_debug(sb, "Btree node structure"); + befs_debug(sb, " left %016LX", fs64_to_cpu(sb, node->left)); + befs_debug(sb, " right %016LX", fs64_to_cpu(sb, node->right)); + befs_debug(sb, " overflow %016LX", fs64_to_cpu(sb, node->overflow)); + befs_debug(sb, " all_key_count %hu", + fs16_to_cpu(sb, node->all_key_count)); + befs_debug(sb, " all_key_length %hu", + fs16_to_cpu(sb, node->all_key_length)); + +#endif //CONFIG_BEFS_DEBUG +} diff -Nru a/fs/befs/endian.h b/fs/befs/endian.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/endian.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,126 @@ +/* + * linux/fs/befs/endian.h + * + * Copyright (C) 2001 Will Dyson + * + * Partially based on similar funtions in the sysv driver. + */ + +#ifndef LINUX_BEFS_ENDIAN +#define LINUX_BEFS_ENDIAN + +#include +#include "befs.h" + +static inline u64 +fs64_to_cpu(const struct super_block *sb, u64 n) +{ + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) + return le64_to_cpu(n); + else + return be64_to_cpu(n); +} + +static inline u64 +cpu_to_fs64(const struct super_block *sb, u64 n) +{ + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) + return cpu_to_le64(n); + else + return cpu_to_be64(n); +} + +static inline u32 +fs32_to_cpu(const struct super_block *sb, u32 n) +{ + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) + return le32_to_cpu(n); + else + return be32_to_cpu(n); +} + +static inline u32 +cpu_to_fs32(const struct super_block *sb, u32 n) +{ + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) + return cpu_to_le32(n); + else + return cpu_to_be32(n); +} + +static inline u16 +fs16_to_cpu(const struct super_block *sb, u16 n) +{ + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) + return le16_to_cpu(n); + else + return be16_to_cpu(n); +} + +static inline u16 +cpu_to_fs16(const struct super_block *sb, u16 n) +{ + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) + return cpu_to_le16(n); + else + return cpu_to_be16(n); +} + +/* Composite types below here */ + +static inline befs_block_run +fsrun_to_cpu(const struct super_block *sb, befs_block_run n) +{ + befs_block_run run; + + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) { + run.allocation_group = le32_to_cpu(n.allocation_group); + run.start = le16_to_cpu(n.start); + run.len = le16_to_cpu(n.len); + } else { + run.allocation_group = be32_to_cpu(n.allocation_group); + run.start = be16_to_cpu(n.start); + run.len = be16_to_cpu(n.len); + } + return run; +} + +static inline befs_block_run +cpu_to_fsrun(const struct super_block *sb, befs_block_run n) +{ + befs_block_run run; + + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) { + run.allocation_group = cpu_to_le32(n.allocation_group); + run.start = cpu_to_le16(n.start); + run.len = cpu_to_le16(n.len); + } else { + run.allocation_group = cpu_to_be32(n.allocation_group); + run.start = cpu_to_be16(n.start); + run.len = cpu_to_be16(n.len); + } + return run; +} + +static inline befs_data_stream +fsds_to_cpu(const struct super_block *sb, befs_data_stream n) +{ + befs_data_stream data; + int i; + + for (i = 0; i < BEFS_NUM_DIRECT_BLOCKS; ++i) + data.direct[i] = fsrun_to_cpu(sb, n.direct[i]); + + data.max_direct_range = fs64_to_cpu(sb, n.max_direct_range); + data.indirect = fsrun_to_cpu(sb, n.indirect); + data.max_indirect_range = fs64_to_cpu(sb, n.max_indirect_range); + data.double_indirect = fsrun_to_cpu(sb, n.double_indirect); + data.max_double_indirect_range = fs64_to_cpu(sb, + n. + max_double_indirect_range); + data.size = fs64_to_cpu(sb, n.size); + + return data; +} + +#endif //LINUX_BEFS_ENDIAN diff -Nru a/fs/befs/inode.c b/fs/befs/inode.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/inode.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,53 @@ +/* + * inode.c + * + * Copyright (C) 2001 Will Dyson + */ + +#include + +#include "befs.h" +#include "inode.h" +#include "endian.h" + +/* + Validates the correctness of the befs inode + Returns BEFS_OK if the inode should be used, otherwise + returns BEFS_BAD_INODE +*/ +int +befs_check_inode(struct super_block *sb, befs_inode * raw_inode, + befs_blocknr_t inode) +{ + u32 magic1 = fs32_to_cpu(sb, raw_inode->magic1); + befs_inode_addr ino_num = fsrun_to_cpu(sb, raw_inode->inode_num); + u32 flags = fs32_to_cpu(sb, raw_inode->flags); + + /* check magic header. */ + if (magic1 != BEFS_INODE_MAGIC1) { + befs_error(sb, + "Inode has a bad magic header - inode = %lu", inode); + return BEFS_BAD_INODE; + } + + /* + * Sanity check2: inodes store their own block address. Check it. + */ + if (inode != iaddr2blockno(sb, &ino_num)) { + befs_error(sb, "inode blocknr field disagrees with vfs " + "VFS: %lu, Inode %lu", + inode, iaddr2blockno(sb, &ino_num)); + return BEFS_BAD_INODE; + } + + /* + * check flag + */ + + if (!(flags & BEFS_INODE_IN_USE)) { + befs_error(sb, "inode is not used - inode = %lu", inode); + return BEFS_BAD_INODE; + } + + return BEFS_OK; +} diff -Nru a/fs/befs/inode.h b/fs/befs/inode.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/inode.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,8 @@ +/* + * inode.h + * + */ + +int befs_check_inode(struct super_block *sb, befs_inode * raw_inode, + befs_blocknr_t inode); + diff -Nru a/fs/befs/io.c b/fs/befs/io.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/io.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,98 @@ +/* + * linux/fs/befs/io.c + * + * Copyright (C) 2001 Will Dyson + +#include "befs.h" +#include "io.h" + +/* + * Converts befs notion of disk addr to a disk offset and uses + * linux kernel function sb_bread() to get the buffer containing + * the offset. -Will Dyson + * + */ + +struct buffer_head * +befs_bread_iaddr(struct super_block *sb, befs_inode_addr iaddr) +{ + struct buffer_head *bh = NULL; + befs_blocknr_t block = 0; + vfs_blocknr_t vfs_block = 0; + befs_sb_info *befs_sb = BEFS_SB(sb); + + befs_debug(sb, "---> Enter befs_read_iaddr() " + "[%u, %hu, %hu]", + iaddr.allocation_group, iaddr.start, iaddr.len); + + if (iaddr.allocation_group > befs_sb->num_ags) { + befs_error(sb, "BEFS: Invalid allocation group %u, max is %u", + iaddr.allocation_group, befs_sb->num_ags); + goto error; + } + + block = iaddr2blockno(sb, &iaddr); + vfs_block = (vfs_blocknr_t) block; + + if (vfs_block != block) { + befs_error(sb, "Error converting to host blocknr_t. %Lu " + "is larger than the host can use", block); + goto error; + } + + befs_debug(sb, "befs_read_iaddr: offset = %lu", block); + + bh = sb_bread(sb, vfs_block); + + if (bh == NULL) { + befs_error(sb, "Failed to read block %lu", block); + goto error; + } + + befs_debug(sb, "<--- befs_read_iaddr()"); + return bh; + + error: + befs_debug(sb, "<--- befs_read_iaddr() ERROR"); + return NULL; +} + +struct buffer_head * +befs_bread(struct super_block *sb, befs_blocknr_t block) +{ + struct buffer_head *bh = NULL; + vfs_blocknr_t vfs_block = (vfs_blocknr_t) block; + + befs_debug(sb, "---> Enter befs_read() %Lu", block); + + if (vfs_block != block) { + befs_error(sb, "Error converting to host blocknr_t. %Lu " + "is larger than the host can use", block); + goto error; + } + + bh = sb_bread(sb, vfs_block); + + if (bh == NULL) { + befs_error(sb, "Failed to read block %lu", vfs_block); + goto error; + } + + befs_debug(sb, "<--- befs_read()"); + + return bh; + + error: + befs_debug(sb, "<--- befs_read() ERROR"); + return NULL; +} diff -Nru a/fs/befs/io.h b/fs/befs/io.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/io.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,9 @@ +/* + * io.h + */ + +struct buffer_head *befs_bread_iaddr(struct super_block *sb, + befs_inode_addr iaddr); + +struct buffer_head *befs_bread(struct super_block *sb, befs_blocknr_t block); + diff -Nru a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/linuxvfs.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,956 @@ +/* + * linux/fs/befs/linuxvfs.c + * + * Copyright (C) 2001 Will Dyson +#include +#include +#include +#include +#include +#include + +#include "befs.h" +#include "btree.h" +#include "inode.h" +#include "datastream.h" +#include "super.h" +#include "io.h" +#include "endian.h" + +EXPORT_NO_SYMBOLS; +MODULE_DESCRIPTION("BeOS File System (BeFS) driver"); +MODULE_AUTHOR("Will Dyson"); +MODULE_LICENSE("GPL"); + +/* The units the vfs expects inode->i_blocks to be in */ +#define VFS_BLOCK_SIZE 512 + +static int befs_readdir(struct file *, void *, filldir_t); +static int befs_get_block(struct inode *, sector_t, struct buffer_head *, int); +static int befs_readpage(struct file *file, struct page *page); +static sector_t befs_bmap(struct address_space *mapping, sector_t block); +static struct dentry *befs_lookup(struct inode *, struct dentry *); +static void befs_read_inode(struct inode *ino); +static struct inode *befs_alloc_inode(struct super_block *sb); +static void befs_destroy_inode(struct inode *inode); +static int befs_init_inodecache(void); +static void befs_destroy_inodecache(void); +static int befs_readlink(struct dentry *, char *, int); +static int befs_follow_link(struct dentry *, struct nameidata *nd); +static int befs_utf2nls(struct super_block *sb, const char *in, int in_len, + char **out, int *out_len); +static int befs_nls2utf(struct super_block *sb, const char *in, int in_len, + char **out, int *out_len); +static void befs_put_super(struct super_block *); +static int befs_remount(struct super_block *, int *, char *); +static int befs_statfs(struct super_block *, struct statfs *); +static int parse_options(char *, befs_mount_options *); + +static const struct super_operations befs_sops = { + .read_inode = befs_read_inode, /* initialize & read inode */ + .alloc_inode = befs_alloc_inode, /* allocate a new inode */ + .destroy_inode = befs_destroy_inode, /* deallocate an inode */ + .put_super = befs_put_super, /* uninit super */ + .statfs = befs_statfs, /* statfs */ + .remount_fs = befs_remount, +}; + +/* slab cache for befs_inode_info objects */ +static kmem_cache_t *befs_inode_cachep; + +struct file_operations befs_dir_operations = { + .read = generic_read_dir, + .readdir = befs_readdir, +}; + +struct inode_operations befs_dir_inode_operations = { + .lookup = befs_lookup, +}; + +struct file_operations befs_file_operations = { + .llseek = default_llseek, + .read = generic_file_read, + .mmap = generic_file_mmap, +}; + +struct address_space_operations befs_aops = { + .readpage = befs_readpage, + .sync_page = block_sync_page, + .bmap = befs_bmap, +}; + +static struct inode_operations befs_symlink_inode_operations = { + .readlink = befs_readlink, + .follow_link = befs_follow_link, +}; + +/* + * Called by generic_file_read() to read a page of data + * + * In turn, simply calls a generic block read function and + * passes it the address of befs_get_block, for mapping file + * positions to disk blocks. + */ +static int +befs_readpage(struct file *file, struct page *page) +{ + return block_read_full_page(page, befs_get_block); +} + +static sector_t +befs_bmap(struct address_space *mapping, sector_t block) +{ + return generic_block_bmap(mapping, block, befs_get_block); +} + +/* + * Generic function to map a file position (block) to a + * disk offset (passed back in bh_result). + * + * Used by many higher level functions. + * + * Calls befs_fblock2brun() in datastream.c to do the real work. + * + * -WD 10-26-01 + */ + +static int +befs_get_block(struct inode *inode, sector_t block, + struct buffer_head *bh_result, int create) +{ + struct super_block *sb = inode->i_sb; + befs_data_stream *ds = &BEFS_I(inode)->i_data.ds; + befs_block_run run = BAD_IADDR; + int res = 0; + ulong disk_off; + + befs_debug(sb, "---> befs_get_block() for inode %lu, block %ld", + inode->i_ino, block); + + if (block < 0) { + befs_error(sb, "befs_get_block() was asked for a block " + "number less than zero: block %ld in inode %lu", + block, inode->i_ino); + return -EIO; + } + + if (create) { + befs_error(sb, "befs_get_block() was asked to write to " + "block %ld in inode %lu", block, inode->i_ino); + return -EPERM; + } + + res = befs_fblock2brun(sb, ds, block, &run); + if (res != BEFS_OK) { + befs_error(sb, + "<--- befs_get_block() for inode %lu, block " + "%ld ERROR", inode->i_ino, block); + return -EFBIG; + } + + disk_off = (ulong) iaddr2blockno(sb, &run); + + map_bh(bh_result, inode->i_sb, disk_off); + + befs_debug(sb, "<--- befs_get_block() for inode %lu, block %ld, " + "disk address %lu", inode->i_ino, block, disk_off); + + return 0; +} + +static struct dentry * +befs_lookup(struct inode *dir, struct dentry *dentry) +{ + struct inode *inode = NULL; + struct super_block *sb = dir->i_sb; + befs_data_stream *ds = &BEFS_I(dir)->i_data.ds; + befs_off_t offset; + int ret; + int utfnamelen; + char *utfname; + const char *name = dentry->d_name.name; + + befs_debug(sb, "---> befs_lookup() " + "name %s inode %ld", dentry->d_name.name, dir->i_ino); + + /* Convert to UTF-8 */ + if (BEFS_SB(sb)->nls) { + ret = + befs_nls2utf(sb, name, strlen(name), &utfname, &utfnamelen); + if (ret < 0) { + befs_debug(sb, "<--- befs_lookup() ERROR"); + return ERR_PTR(ret); + } + ret = befs_btree_find(sb, ds, utfname, &offset); + kfree(utfname); + + } else { + ret = befs_btree_find(sb, ds, dentry->d_name.name, &offset); + } + + if (ret == BEFS_BT_NOT_FOUND) { + befs_debug(sb, "<--- befs_lookup() %s not found", + dentry->d_name.name); + return ERR_PTR(-ENOENT); + + } else if (ret != BEFS_OK || offset == 0) { + befs_warning(sb, "<--- befs_lookup() Error"); + return ERR_PTR(-ENODATA); + } + + inode = iget(dir->i_sb, (ino_t) offset); + if (!inode) + return ERR_PTR(-EACCES); + + d_add(dentry, inode); + + befs_debug(sb, "<--- befs_lookup()"); + + return NULL; +} + +static int +befs_readdir(struct file *filp, void *dirent, filldir_t filldir) +{ + struct inode *inode = filp->f_dentry->d_inode; + struct super_block *sb = inode->i_sb; + befs_data_stream *ds = &BEFS_I(inode)->i_data.ds; + befs_off_t value; + int result; + size_t keysize; + unsigned char d_type; + char keybuf[BEFS_NAME_LEN + 1]; + char *nlsname; + int nlsnamelen; + const char *dirname = filp->f_dentry->d_name.name; + + befs_debug(sb, "---> befs_readdir() " + "name %s, inode %ld, filp->f_pos %Ld", + dirname, inode->i_ino, filp->f_pos); + + result = befs_btree_read(sb, ds, filp->f_pos, BEFS_NAME_LEN + 1, + keybuf, &keysize, &value); + + if (result == BEFS_ERR) { + befs_debug(sb, "<--- befs_readdir() ERROR"); + befs_error(sb, "IO error reading %s (inode %lu)", + dirname, inode->i_ino); + return -EIO; + + } else if (result == BEFS_BT_END) { + befs_debug(sb, "<--- befs_readdir() END"); + return 0; + + } else if (result == BEFS_BT_EMPTY) { + befs_debug(sb, "<--- befs_readdir() Empty directory"); + return 0; + } + + d_type = DT_UNKNOWN; + + /* Convert to NLS */ + if (BEFS_SB(sb)->nls) { + result = + befs_utf2nls(sb, keybuf, keysize, &nlsname, &nlsnamelen); + if (result < 0) { + befs_debug(sb, "<--- befs_readdir() ERROR"); + return result; + } + result = filldir(dirent, nlsname, nlsnamelen, filp->f_pos, + (ino_t) value, d_type); + kfree(nlsname); + + } else { + result = filldir(dirent, keybuf, keysize, filp->f_pos, + (ino_t) value, d_type); + } + + filp->f_pos++; + + befs_debug(sb, "<--- befs_readdir() filp->f_pos %Ld", filp->f_pos); + + return 0; +} + +static struct inode * +befs_alloc_inode(struct super_block *sb) +{ + struct befs_inode_info *bi; + bi = (struct befs_inode_info *)kmem_cache_alloc(befs_inode_cachep, + SLAB_KERNEL); + if (!bi) + return NULL; + return &bi->vfs_inode; +} + +static void +befs_destroy_inode(struct inode *inode) +{ + kmem_cache_free(befs_inode_cachep, BEFS_I(inode)); +} + +static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags) +{ + struct befs_inode_info *bi = (struct befs_inode_info *) foo; + + if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) == + SLAB_CTOR_CONSTRUCTOR) { + inode_init_once(&bi->vfs_inode); + } +} + +static void +befs_read_inode(struct inode *inode) +{ + struct buffer_head *bh = NULL; + befs_inode *raw_inode = NULL; + + struct super_block *sb = inode->i_sb; + befs_sb_info *befs_sb = BEFS_SB(sb); + befs_inode_info *befs_ino = NULL; + + befs_debug(sb, "---> befs_read_inode() " "inode = %lu", inode->i_ino); + + befs_ino = BEFS_I(inode); + + /* convert from vfs's inode number to befs's inode number */ + befs_ino->i_inode_num = blockno2iaddr(sb, inode->i_ino); + + befs_debug(sb, " real inode number [%u, %hu, %hu]", + befs_ino->i_inode_num.allocation_group, + befs_ino->i_inode_num.start, befs_ino->i_inode_num.len); + + bh = befs_bread_iaddr(sb, befs_ino->i_inode_num); + if (!bh) { + befs_error(sb, "unable to read inode block - " + "inode = %lu", inode->i_ino); + goto unaquire_none; + } + + raw_inode = (befs_inode *) bh->b_data; + + befs_dump_inode(sb, raw_inode); + + if (befs_check_inode(sb, raw_inode, inode->i_ino) != BEFS_OK) { + befs_error(sb, "Bad inode: %lu", inode->i_ino); + goto unaquire_bh; + } + + inode->i_mode = (umode_t) fs32_to_cpu(sb, raw_inode->mode); + + /* + * set uid and gid. But since current BeOS is single user OS, so + * you can change by "uid" or "gid" options. + */ + + inode->i_uid = befs_sb->mount_opts.use_uid ? + befs_sb->mount_opts.uid : (uid_t) fs32_to_cpu(sb, raw_inode->uid); + inode->i_gid = befs_sb->mount_opts.use_gid ? + befs_sb->mount_opts.gid : (gid_t) fs32_to_cpu(sb, raw_inode->gid); + + inode->i_nlink = 1; + + /* + * BEFS's time is 64 bits, but current VFS is 32 bits... + * BEFS don't have access time. Nor inode change time. VFS + * doesn't have creation time. + */ + + inode->i_mtime = + (time_t) (fs64_to_cpu(sb, raw_inode->last_modified_time) >> 16); + inode->i_ctime = inode->i_mtime; + inode->i_atime = inode->i_mtime; + inode->i_blksize = befs_sb->block_size; + + befs_ino->i_inode_num = fsrun_to_cpu(sb, raw_inode->inode_num); + befs_ino->i_parent = fsrun_to_cpu(sb, raw_inode->parent); + befs_ino->i_attribute = fsrun_to_cpu(sb, raw_inode->attributes); + befs_ino->i_flags = fs32_to_cpu(sb, raw_inode->flags); + + if (S_ISLNK(inode->i_mode) && !(inode->i_flags & BEFS_LONG_SYMLINK)) { + inode->i_size = 0; + inode->i_blocks = befs_sb->block_size / VFS_BLOCK_SIZE; + strncpy(befs_ino->i_data.symlink, raw_inode->data.symlink, + BEFS_SYMLINK_LEN); + } else { + int num_blks; + + befs_ino->i_data.ds = + fsds_to_cpu(sb, raw_inode->data.datastream); + + num_blks = befs_count_blocks(sb, &befs_ino->i_data.ds); + inode->i_blocks = + num_blks * (befs_sb->block_size / VFS_BLOCK_SIZE); + inode->i_size = befs_ino->i_data.ds.size; + } + + inode->i_mapping->a_ops = &befs_aops; + + if (S_ISREG(inode->i_mode)) { + inode->i_fop = &befs_file_operations; + } else if (S_ISDIR(inode->i_mode)) { + inode->i_op = &befs_dir_inode_operations; + inode->i_fop = &befs_dir_operations; + } else if (S_ISLNK(inode->i_mode)) { + inode->i_op = &befs_symlink_inode_operations; + } else { + befs_error(sb, "Inode %lu is not a regular file, " + "directory or symlink. THAT IS WRONG! BeFS has no " + "on disk special files", inode->i_ino); + goto unaquire_bh; + } + + brelse(bh); + befs_debug(sb, "<--- befs_read_inode()"); + return; + + unaquire_bh: + brelse(bh); + + unaquire_none: + make_bad_inode(inode); + befs_debug(sb, "<--- befs_read_inode() - Bad inode"); + return; +} + +/* Initialize the inode cache. Called at fs setup. + * + * Taken from NFS implementation by Al Viro. + */ +static int +befs_init_inodecache(void) +{ + befs_inode_cachep = kmem_cache_create("befs_inode_cache", + sizeof (struct befs_inode_info), + 0, SLAB_HWCACHE_ALIGN, + init_once, NULL); + if (befs_inode_cachep == NULL) { + printk(KERN_ERR "befs_init_inodecache: " + "Couldn't initalize inode slabcache\n"); + return -ENOMEM; + } + + return 0; +} + +/* Called at fs teardown. + * + * Taken from NFS implementation by Al Viro. + */ +static void +befs_destroy_inodecache(void) +{ + if (kmem_cache_destroy(befs_inode_cachep)) + printk(KERN_ERR "befs_destroy_inodecache: " + "not all structures were freed\n"); +} + +/* + * The inode of symbolic link is different to data stream. + * The data stream become link name. Unless the LONG_SYMLINK + * flag is set. + */ +static int +befs_follow_link(struct dentry *dentry, struct nameidata *nd) +{ + struct super_block *sb = dentry->d_sb; + befs_inode_info *befs_ino = BEFS_I(dentry->d_inode); + char *link; + int res; + + if (befs_ino->i_flags & BEFS_LONG_SYMLINK) { + befs_data_stream *data = &befs_ino->i_data.ds; + befs_off_t linklen = data->size; + + befs_debug(sb, "Follow long symlink"); + + link = kmalloc(linklen, GFP_NOFS); + if (link == NULL) + return -ENOMEM; + + if (befs_read_lsymlink(sb, data, link, linklen) != linklen) { + kfree(link); + befs_error(sb, "Failed to read entire long symlink"); + return -EIO; + } + + res = vfs_follow_link(nd, link); + + kfree(link); + } else { + link = befs_ino->i_data.symlink; + res = vfs_follow_link(nd, link); + } + + return res; +} + +static int +befs_readlink(struct dentry *dentry, char *buffer, int buflen) +{ + struct super_block *sb = dentry->d_sb; + befs_inode_info *befs_ino = BEFS_I(dentry->d_inode); + char *link; + int res; + + if (befs_ino->i_flags & BEFS_LONG_SYMLINK) { + befs_data_stream *data = &befs_ino->i_data.ds; + befs_off_t linklen = data->size; + + befs_debug(sb, "Read long symlink"); + + link = kmalloc(linklen, GFP_NOFS); + if (link == NULL) + return -ENOMEM; + + if (befs_read_lsymlink(sb, data, link, linklen) != linklen) { + kfree(link); + befs_error(sb, "Failed to read entire long symlink"); + return -EIO; + } + + res = vfs_readlink(dentry, buffer, buflen, link); + + kfree(link); + } else { + link = befs_ino->i_data.symlink; + res = vfs_readlink(dentry, buffer, buflen, link); + } + + return res; +} + +/* + * UTF-8 to NLS charset convert routine + * + * Changed 8/10/01 by Will Dyson. Now use uni2char() / char2uni() rather than + * the nls tables directly + */ + +static int +befs_utf2nls(struct super_block *sb, const char *in, + int in_len, char **out, int *out_len) +{ + struct nls_table *nls = BEFS_SB(sb)->nls; + int i, o; + wchar_t uni; + int unilen, utflen; + char *result; + int maxlen = in_len; /* The utf8->nls conversion cant make more chars */ + + befs_debug(sb, "---> utf2nls()"); + + if (!nls) { + befs_error(sb, "befs_utf2nls called with no NLS table loaded"); + return -EINVAL; + } + + *out = result = kmalloc(maxlen, GFP_NOFS); + if (!*out) { + befs_error(sb, "befs_utf2nls() cannot allocate memory"); + *out_len = 0; + return -ENOMEM; + } + + for (i = o = 0; i < in_len; i += utflen, o += unilen) { + + /* convert from UTF-8 to Unicode */ + utflen = utf8_mbtowc(&uni, &in[i], in_len - i); + if (utflen < 0) { + goto conv_err; + } + + /* convert from Unicode to nls */ + unilen = nls->uni2char(uni, &result[o], 1); + if (unilen < 0) { + goto conv_err; + } + } + result[o] = '\0'; + + befs_debug(sb, "<--- utf2nls()"); + + return o; + *out_len = o; + + conv_err: + befs_error(sb, "Name using charecter set %s contains a charecter that " + "cannot be converted to unicode.", nls->charset); + befs_debug(sb, "<--- utf2nls()"); + kfree(result); + return -EILSEQ; +} + +/** + * befs_nls2utf - Convert NLS string to utf8 encodeing + * @sb: Superblock + * @src: Input string buffer in NLS format + * @srclen: Length of input string in bytes + * @dest: The output string in UTF8 format + * @destlen: Length of the output buffer + * + * Converts input string @src, which is in the format of the loaded NLS map, + * into a utf8 string. + * + * The destination string @dest is allocated by this function and the caller is + * responsible for freeing it with kfree() + * + * On return, *@destlen is the length of @dest in bytes. + * + * On success, the return value is the number of utf8 charecters written to + * the ouput buffer @dest. + * + * On Failure, a negative number coresponding to the error code is returned. + */ + +static int +befs_nls2utf(struct super_block *sb, const char *in, + int in_len, char **out, int *out_len) +{ + struct nls_table *nls = BEFS_SB(sb)->nls; + int i, o; + wchar_t uni; + int unilen, utflen; + char *result; + int maxlen = 3 * in_len; + + befs_debug(sb, "---> nls2utf()\n"); + + if (!nls) { + befs_error(sb, "befs_nls2utf called with no NLS table loaded."); + return -EINVAL; + } + + *out = result = kmalloc(maxlen, GFP_NOFS); + if (!*out) { + befs_error(sb, "befs_nls2utf() cannot allocate memory"); + *out_len = 0; + return -ENOMEM; + } + + for (i = o = 0; i < in_len; i += unilen, o += utflen) { + + /* convert from nls to unicode */ + unilen = nls->char2uni(&in[i], in_len - i, &uni); + if (unilen < 0) { + goto conv_err; + } + + /* convert from unicode to UTF-8 */ + utflen = utf8_wctomb(&result[o], uni, 3); + if (utflen <= 0) { + goto conv_err; + } + } + + result[o] = '\0'; + *out_len = o; + + befs_debug(sb, "<--- nls2utf()"); + + return i; + + conv_err: + befs_error(sb, "Name using charecter set %s contains a charecter that " + "cannot be converted to unicode.", nls->charset); + befs_debug(sb, "<--- nls2utf()"); + kfree(result); + return -EILSEQ; +} + +static int +parse_options(char *options, befs_mount_options * opts) +{ + char *this_char; + char *value; + int ret = 1; + + /* Initialize options */ + opts->uid = 0; + opts->gid = 0; + opts->use_uid = 0; + opts->use_gid = 0; + opts->iocharset = NULL; + opts->debug = 0; + + if (!options) + return ret; + + while ((this_char = strsep(&options, ",")) != NULL) { + + if ((value = strchr(this_char, '=')) != NULL) + *value++ = 0; + + if (!strcmp(this_char, "uid")) { + if (!value || !*value) { + ret = 0; + } else { + opts->uid = simple_strtoul(value, &value, 0); + opts->use_uid = 1; + if (*value) { + printk(KERN_ERR "BEFS: Invalid uid " + "option: %s\n", value); + ret = 0; + } + } + } else if (!strcmp(this_char, "gid")) { + if (!value || !*value) + ret = 0; + else { + opts->gid = simple_strtoul(value, &value, 0); + opts->use_gid = 1; + if (*value) { + printk(KERN_ERR + "BEFS: Invalid gid option: " + "%s\n", value); + ret = 0; + } + } + } else if (!strcmp(this_char, "iocharset") && value) { + char *p = value; + int len; + + while (*value && *value != ',') + value++; + len = value - p; + if (len) { + char *buffer = kmalloc(len + 1, GFP_NOFS); + if (buffer) { + opts->iocharset = buffer; + memcpy(buffer, p, len); + buffer[len] = 0; + + } else { + printk(KERN_ERR "BEFS: " + "cannot allocate memory\n"); + ret = 0; + } + } + } else if (!strcmp(this_char, "debug")) { + opts->debug = 1; + } + } + + return ret; +} + +/* This function has the responsibiltiy of getting the + * filesystem ready for unmounting. + * Basicly, we free everything that we allocated in + * befs_read_inode + */ +static void +befs_put_super(struct super_block *sb) +{ + if (BEFS_SB(sb)->mount_opts.iocharset) { + kfree(BEFS_SB(sb)->mount_opts.iocharset); + BEFS_SB(sb)->mount_opts.iocharset = NULL; + } + + if (BEFS_SB(sb)->nls) { + unload_nls(BEFS_SB(sb)->nls); + BEFS_SB(sb)->nls = NULL; + } + + if (sb->s_fs_info) { + kfree(sb->s_fs_info); + sb->s_fs_info = NULL; + } + return; +} + +/* Allocate private field of the superblock, fill it. + * + * Finish filling the public superblock fields + * Make the root directory + * Load a set of NLS translations if needed. + */ +static int +befs_fill_super(struct super_block *sb, void *data, int silent) +{ + struct buffer_head *bh; + befs_sb_info *befs_sb; + befs_super_block *disk_sb; + + const unsigned long sb_block = 0; + const off_t x86_sb_off = 512; + + sb->s_fs_info = kmalloc(sizeof (*befs_sb), GFP_KERNEL); + if (sb->s_fs_info == NULL) { + printk(KERN_ERR + "BeFS(%s): Unable to allocate memory for private " + "portion of superblock. Bailing.\n", sb->s_id); + goto unaquire_none; + } + befs_sb = BEFS_SB(sb); + memset(befs_sb, 0, sizeof(befs_sb_info)); + + if (!parse_options((char *) data, &befs_sb->mount_opts)) { + befs_error(sb, "cannot parse mount options"); + goto unaquire_priv_sbp; + } + + befs_debug(sb, "---> befs_fill_super()"); + +#ifndef CONFIG_BEFS_RW + if (!(sb->s_flags & MS_RDONLY)) { + befs_warning(sb, + "No write support. Marking filesystem read-only"); + sb->s_flags |= MS_RDONLY; + } +#endif /* CONFIG_BEFS_RW */ + + /* + * Set dummy blocksize to read super block. + * Will be set to real fs blocksize later. + * + * Linux 2.4.10 and later refuse to read blocks smaller than + * the hardsect size for the device. But we also need to read at + * least 1k to get the second 512 bytes of the volume. + * -WD 10-26-01 + */ + sb_min_blocksize(sb, 1024); + + if (!(bh = sb_bread(sb, sb_block))) { + befs_error(sb, "unable to read superblock"); + goto unaquire_priv_sbp; + } + + /* account for offset of super block on x86 */ + disk_sb = (befs_super_block *) bh->b_data; + if ((le32_to_cpu(disk_sb->magic1) == BEFS_SUPER_MAGIC1) || + (be32_to_cpu(disk_sb->magic1) == BEFS_SUPER_MAGIC1)) { + befs_debug(sb, "Using PPC superblock location"); + } else { + befs_debug(sb, "Using x86 superblock location"); + disk_sb = + (befs_super_block *) ((void *) bh->b_data + x86_sb_off); + } + + if (befs_load_sb(sb, disk_sb) != BEFS_OK) + goto unaquire_bh; + + befs_dump_super_block(sb, disk_sb); + + brelse(bh); + + if (befs_check_sb(sb) != BEFS_OK) + goto unaquire_priv_sbp; + + /* + * set up enough so that it can read an inode + * Fill in kernel superblock fields from private sb + */ + sb->s_magic = BEFS_SUPER_MAGIC; + /* Set real blocksize of fs */ + sb_set_blocksize(sb, (ulong) befs_sb->block_size); + sb->s_op = (struct super_operations *) &befs_sops; + sb->s_root = + d_alloc_root(iget(sb, iaddr2blockno(sb, &(befs_sb->root_dir)))); + if (!sb->s_root) { + befs_error(sb, "get root inode failed"); + goto unaquire_priv_sbp; + } + + /* load nls library */ + if (befs_sb->mount_opts.iocharset) { + befs_debug(sb, "Loading nls: %s", + befs_sb->mount_opts.iocharset); + befs_sb->nls = load_nls(befs_sb->mount_opts.iocharset); + if (!befs_sb->nls) { + befs_warning(sb, "Cannot load nls %s" + "loding default nls", + befs_sb->mount_opts.iocharset); + befs_sb->nls = load_nls_default(); + } + } + + return 0; +/*****************/ + unaquire_bh: + brelse(bh); + + unaquire_priv_sbp: + kfree(sb->s_fs_info); + + unaquire_none: + sb->s_fs_info = NULL; + return -EINVAL; +} + +static int +befs_remount(struct super_block *sb, int *flags, char *data) +{ + if (!(*flags & MS_RDONLY)) + return -EINVAL; + return 0; +} + +static int +befs_statfs(struct super_block *sb, struct statfs *buf) +{ + + befs_debug(sb, "---> befs_statfs()"); + + buf->f_type = BEFS_SUPER_MAGIC; + buf->f_bsize = sb->s_blocksize; + buf->f_blocks = BEFS_SB(sb)->num_blocks; + buf->f_bfree = BEFS_SB(sb)->num_blocks - BEFS_SB(sb)->used_blocks; + buf->f_bavail = buf->f_bfree; + buf->f_files = 0; /* UNKNOWN */ + buf->f_ffree = 0; /* UNKNOWN */ + buf->f_namelen = BEFS_NAME_LEN; + + befs_debug(sb, "<--- befs_statfs()"); + + return 0; +} + +static struct super_block * +befs_get_sb(struct file_system_type *fs_type, int flags, char *dev_name, + void *data) +{ + return get_sb_bdev(fs_type, flags, dev_name, data, befs_fill_super); +} + +static struct file_system_type befs_fs_type = { + .owner = THIS_MODULE, + .name = "befs", + .get_sb = befs_get_sb, + .kill_sb = kill_block_super, + .fs_flags = FS_REQUIRES_DEV, +}; + +static int __init +init_befs_fs(void) +{ + int err; + + printk(KERN_INFO "BeFS version: %s\n", BEFS_VERSION); + + err = befs_init_inodecache(); + if (err) + return err; + + return register_filesystem(&befs_fs_type); +} + +static void __exit +exit_befs_fs(void) +{ + befs_destroy_inodecache(); + + unregister_filesystem(&befs_fs_type); +} + +/* +Macros that typecheck the init and exit functions, +ensures that they are called at init and cleanup, +and eliminates warnings about unused functions. +*/ +module_init(init_befs_fs) +module_exit(exit_befs_fs) diff -Nru a/fs/befs/super.c b/fs/befs/super.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/super.c Mon Oct 28 16:32:38 2002 @@ -0,0 +1,112 @@ +/* + * super.c + * + * Copyright (C) 2001-2002 Will Dyson + * + * Licensed under the GNU GPL. See the file COPYING for details. + * + */ + +#include + +#include "befs.h" +#include "super.h" +#include "endian.h" + +/** + * load_befs_sb -- Read from disk and properly byteswap all the fields + * of the befs superblock + * + * + * + * + */ +int +befs_load_sb(struct super_block *sb, befs_super_block * disk_sb) +{ + befs_sb_info *befs_sb = BEFS_SB(sb); + + /* Check the byte order of the filesystem */ + if (le32_to_cpu(disk_sb->fs_byte_order) == BEFS_BYTEORDER_NATIVE) + befs_sb->byte_order = BEFS_BYTESEX_LE; + else if (be32_to_cpu(disk_sb->fs_byte_order) == BEFS_BYTEORDER_NATIVE) + befs_sb->byte_order = BEFS_BYTESEX_BE; + + befs_sb->magic1 = fs32_to_cpu(sb, disk_sb->magic1); + befs_sb->magic2 = fs32_to_cpu(sb, disk_sb->magic2); + befs_sb->magic3 = fs32_to_cpu(sb, disk_sb->magic3); + befs_sb->block_size = fs32_to_cpu(sb, disk_sb->block_size); + befs_sb->block_shift = fs32_to_cpu(sb, disk_sb->block_shift); + befs_sb->num_blocks = fs64_to_cpu(sb, disk_sb->num_blocks); + befs_sb->used_blocks = fs64_to_cpu(sb, disk_sb->used_blocks); + befs_sb->inode_size = fs32_to_cpu(sb, disk_sb->inode_size); + + befs_sb->blocks_per_ag = fs32_to_cpu(sb, disk_sb->blocks_per_ag); + befs_sb->ag_shift = fs32_to_cpu(sb, disk_sb->ag_shift); + befs_sb->num_ags = fs32_to_cpu(sb, disk_sb->num_ags); + + befs_sb->log_blocks = fsrun_to_cpu(sb, disk_sb->log_blocks); + befs_sb->log_start = fs64_to_cpu(sb, disk_sb->log_start); + befs_sb->log_end = fs64_to_cpu(sb, disk_sb->log_end); + + befs_sb->root_dir = fsrun_to_cpu(sb, disk_sb->root_dir); + befs_sb->indices = fsrun_to_cpu(sb, disk_sb->indices); + befs_sb->nls = NULL; + + return BEFS_OK; +} + +int +befs_check_sb(struct super_block *sb) +{ + befs_sb_info *befs_sb = BEFS_SB(sb); + + /* Check magic headers of super block */ + if ((befs_sb->magic1 != BEFS_SUPER_MAGIC1) + || (befs_sb->magic2 != BEFS_SUPER_MAGIC2) + || (befs_sb->magic3 != BEFS_SUPER_MAGIC3)) { + befs_error(sb, "invalid magic header"); + return BEFS_ERR; + } + + /* + * Check blocksize of BEFS. + * + * Blocksize of BEFS is 1024, 2048, 4096 or 8192. + */ + + if ((befs_sb->block_size != 1024) + && (befs_sb->block_size != 2048) + && (befs_sb->block_size != 4096) + && (befs_sb->block_size != 8192)) { + befs_error(sb, "invalid blocksize: %u", befs_sb->block_size); + return BEFS_ERR; + } + + if (befs_sb->block_size > PAGE_SIZE) { + befs_error(sb, "blocksize(%u) cannot be larger" + "than system pagesize(%lu)", befs_sb->block_size, + PAGE_SIZE); + return BEFS_ERR; + } + + /* + * block_shift and block_size encode the same information + * in different ways as a consistency check. + */ + + if ((1 << befs_sb->block_shift) != befs_sb->block_size) { + befs_error(sb, "block_shift disagrees with block_size. " + "Corruption likely."); + return BEFS_ERR; + } + + if (befs_sb->log_start != befs_sb->log_end) { + befs_error(sb, "Filesystem not clean! There are blocks in the " + "journal. You must boot into BeOS and mount this volume " + "to make it clean."); + return BEFS_ERR; + } + + return BEFS_OK; +} diff -Nru a/fs/befs/super.h b/fs/befs/super.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/fs/befs/super.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,8 @@ +/* + * super.h + */ + +int befs_load_sb(struct super_block *sb, befs_super_block * disk_sb); + +int befs_check_sb(struct super_block *sb); + diff -Nru a/fs/bio.c b/fs/bio.c --- a/fs/bio.c Mon Oct 28 16:32:37 2002 +++ b/fs/bio.c Mon Oct 28 16:32:37 2002 @@ -122,6 +122,7 @@ bio->bi_max_vecs = 0; bio->bi_end_io = NULL; atomic_set(&bio->bi_cnt, 1); + bio->bi_private = NULL; } /** @@ -354,7 +355,7 @@ request_queue_t *q = bdev_get_queue(bdev); int nr_pages; - nr_pages = q->max_sectors >> (PAGE_SHIFT - 9); + nr_pages = ((q->max_sectors << 9) + PAGE_SIZE - 1) >> PAGE_SHIFT; if (nr_pages > q->max_phys_segments) nr_pages = q->max_phys_segments; if (nr_pages > q->max_hw_segments) @@ -385,13 +386,13 @@ * cloned bio must not modify vec list */ if (unlikely(bio_flagged(bio, BIO_CLONED))) - return 1; + return 0; if (bio->bi_vcnt >= bio->bi_max_vecs) - return 1; + return 0; if (((bio->bi_size + len) >> 9) > q->max_sectors) - return 1; + return 0; /* * we might loose a segment or two here, but rather that than @@ -404,7 +405,7 @@ if (fail_segments) { if (retried_segments) - return 1; + return 0; bio->bi_flags &= ~(1 << BIO_SEG_VALID); retried_segments = 1; @@ -425,35 +426,167 @@ * depending on offset), it can specify a merge_bvec_fn in the * queue to get further control */ - if (q->merge_bvec_fn && q->merge_bvec_fn(q, bio, bvec)) { - bvec->bv_page = NULL; - bvec->bv_len = 0; - bvec->bv_offset = 0; - return 1; + if (q->merge_bvec_fn) { + /* + * merge_bvec_fn() returns number of bytes it can accept + * at this offset + */ + if (q->merge_bvec_fn(q, bio, bvec) < len) { + bvec->bv_page = NULL; + bvec->bv_len = 0; + bvec->bv_offset = 0; + return 0; + } } bio->bi_vcnt++; bio->bi_phys_segments++; bio->bi_hw_segments++; bio->bi_size += len; - return 0; + return len; } /** + * bio_map_user - map user address into bio + * @bdev: destination block device + * @uaddr: start of user address + * @len: length in bytes + * @write_to_vm: bool indicating writing to pages or not + * + * Map the user space address into a bio suitable for io to a block + * device. Caller should check the size of the returned bio, we might + * not have mapped the entire range specified. + */ +struct bio *bio_map_user(struct block_device *bdev, unsigned long uaddr, + unsigned int len, int write_to_vm) +{ + unsigned long end = (uaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT; + unsigned long start = uaddr >> PAGE_SHIFT; + const int nr_pages = end - start; + request_queue_t *q = bdev_get_queue(bdev); + int ret, offset, i; + struct page **pages; + struct bio *bio; + + /* + * transfer and buffer must be aligned to at least hardsector + * size for now, in the future we can relax this restriction + */ + if ((uaddr & queue_dma_alignment(q)) || (len & queue_dma_alignment(q))) + return NULL; + + bio = bio_alloc(GFP_KERNEL, nr_pages); + if (!bio) + return NULL; + + pages = kmalloc(nr_pages * sizeof(struct page *), GFP_KERNEL); + if (!pages) + goto out; + + down_read(¤t->mm->mmap_sem); + ret = get_user_pages(current, current->mm, uaddr, nr_pages, + write_to_vm, 0, pages, NULL); + up_read(¤t->mm->mmap_sem); + + if (ret < nr_pages) + goto out; + + bio->bi_bdev = bdev; + + offset = uaddr & ~PAGE_MASK; + for (i = 0; i < nr_pages; i++) { + unsigned int bytes = PAGE_SIZE - offset; + + if (len <= 0) + break; + + if (bytes > len) + bytes = len; + + /* + * sorry... + */ + if (bio_add_page(bio, pages[i], bytes, offset) < bytes) + break; + + len -= bytes; + offset = 0; + } + + /* + * release the pages we didn't map into the bio, if any + */ + while (i < nr_pages) + page_cache_release(pages[i++]); + + kfree(pages); + + /* + * check if the mapped pages need bouncing for an isa host. + */ + blk_queue_bounce(q, &bio); + return bio; +out: + kfree(pages); + bio_put(bio); + return NULL; +} + +/** + * bio_unmap_user - unmap a bio + * @bio: the bio being unmapped + * @write_to_vm: bool indicating whether pages were written to + * + * Unmap a bio previously mapped by bio_map_user(). The @write_to_vm + * must be the same as passed into bio_map_user(). Must be called with + * a process context. + */ +void bio_unmap_user(struct bio *bio, int write_to_vm) +{ + struct bio_vec *bvec; + int i; + + /* + * find original bio if it was bounced + */ + if (bio->bi_private) { + /* + * someone stole our bio, must not happen + */ + BUG_ON(!bio_flagged(bio, BIO_BOUNCED)); + + bio = bio->bi_private; + } + + /* + * make sure we dirty pages we wrote to + */ + __bio_for_each_segment(bvec, bio, i, 0) { + if (write_to_vm) + set_page_dirty(bvec->bv_page); + + page_cache_release(bvec->bv_page); + } + + bio_put(bio); + } + +/** * bio_endio - end I/O on a bio * @bio: bio * @bytes_done: number of bytes completed * @error: error, if any * * Description: - * bio_endio() will end I/O @bytes_done number of bytes. This may be just - * a partial part of the bio, or it may be the whole bio. bio_endio() is - * the preferred way to end I/O on a bio, it takes care of decrementing + * bio_endio() will end I/O on @bytes_done number of bytes. This may be + * just a partial part of the bio, or it may be the whole bio. bio_endio() + * is the preferred way to end I/O on a bio, it takes care of decrementing * bi_size and clearing BIO_UPTODATE on error. @error is 0 on success, and * and one of the established -Exxxx (-EIO, for instance) error values in - * case something went wrong. + * case something went wrong. Noone should call bi_end_io() directly on + * a bio unless they own it and thus know that it has an end_io function. **/ -int bio_endio(struct bio *bio, unsigned int bytes_done, int error) +void bio_endio(struct bio *bio, unsigned int bytes_done, int error) { if (error) clear_bit(BIO_UPTODATE, &bio->bi_flags); @@ -465,7 +598,9 @@ } bio->bi_size -= bytes_done; - return bio->bi_end_io(bio, bytes_done, error); + + if (bio->bi_end_io) + bio->bi_end_io(bio, bytes_done, error); } static void __init biovec_init_pools(void) @@ -537,7 +672,7 @@ return 0; } -module_init(init_bio); +subsys_initcall(init_bio); EXPORT_SYMBOL(bio_alloc); EXPORT_SYMBOL(bio_put); @@ -550,3 +685,5 @@ EXPORT_SYMBOL(bio_hw_segments); EXPORT_SYMBOL(bio_add_page); EXPORT_SYMBOL(bio_get_nr_vecs); +EXPORT_SYMBOL(bio_map_user); +EXPORT_SYMBOL(bio_unmap_user); diff -Nru a/fs/direct-io.c b/fs/direct-io.c --- a/fs/direct-io.c Mon Oct 28 16:32:37 2002 +++ b/fs/direct-io.c Mon Oct 28 16:32:37 2002 @@ -417,12 +417,12 @@ /* Take a ref against the page each time it is placed into a BIO */ page_cache_get(page); - if (bio_add_page(dio->bio, page, bv_len, bv_offset)) { + if (bio_add_page(dio->bio, page, bv_len, bv_offset) < bv_len) { dio_bio_submit(dio); ret = dio_new_bio(dio, blkno); if (ret == 0) { ret = bio_add_page(dio->bio, page, bv_len, bv_offset); - BUG_ON(ret != 0); + BUG_ON(ret < bv_len); } else { /* The page didn't make it into a BIO */ page_cache_release(page); diff -Nru a/fs/mpage.c b/fs/mpage.c --- a/fs/mpage.c Mon Oct 28 16:32:36 2002 +++ b/fs/mpage.c Mon Oct 28 16:32:36 2002 @@ -176,6 +176,7 @@ unsigned first_hole = blocks_per_page; struct block_device *bdev = NULL; struct buffer_head bh; + int length; if (page_has_buffers(page)) goto confused; @@ -233,7 +234,8 @@ goto confused; } - if (bio_add_page(bio, page, first_hole << blkbits, 0)) { + length = first_hole << blkbits; + if (bio_add_page(bio, page, length, 0) < length) { bio = mpage_bio_submit(READ, bio); goto alloc_new; } @@ -334,6 +336,7 @@ int boundary = 0; sector_t boundary_block = 0; struct block_device *boundary_bdev = NULL; + int length; if (page_has_buffers(page)) { struct buffer_head *head = page_buffers(page); @@ -467,7 +470,8 @@ try_to_free_buffers(page); } - if (bio_add_page(bio, page, first_unmapped << blkbits, 0)) { + length = first_unmapped << blkbits; + if (bio_add_page(bio, page, length, 0) < length) { bio = mpage_bio_submit(WRITE, bio); goto alloc_new; } @@ -591,6 +595,10 @@ test_clear_page_dirty(page)) { if (writepage) { ret = (*writepage)(page); + if (ret == -EAGAIN) { + __set_page_dirty_nobuffers(page); + ret = 0; + } } else { bio = mpage_writepage(bio, page, get_block, &last_block_in_bio, &ret); @@ -600,10 +608,6 @@ if (!pagevec_add(&pvec, page)) pagevec_deactivate_inactive(&pvec); page = NULL; - } - if (ret == -EAGAIN && page) { - __set_page_dirty_nobuffers(page); - ret = 0; } if (ret || (--(wbc->nr_to_write) <= 0)) done = 1; diff -Nru a/fs/nls/Config.in b/fs/nls/Config.in --- a/fs/nls/Config.in Mon Oct 28 16:32:36 2002 +++ b/fs/nls/Config.in Mon Oct 28 16:32:36 2002 @@ -12,7 +12,8 @@ # msdos and Joliet want NLS if [ "$CONFIG_JOLIET" = "y" -o "$CONFIG_FAT_FS" != "n" \ -o "$CONFIG_NTFS_FS" != "n" -o "$CONFIG_NCPFS_NLS" = "y" \ - -o "$CONFIG_SMB_NLS" = "y" -o "$CONFIG_JFS_FS" != "n" -o "$CONFIG_CIFS" != "n" ]; then + -o "$CONFIG_SMB_NLS" = "y" -o "$CONFIG_JFS_FS" != "n" \ + -o "$CONFIG_CIFS" != "n" -o "$CONFIG_BEFS_FS" != "n" ]; then define_bool CONFIG_NLS y else define_bool CONFIG_NLS n diff -Nru a/fs/pipe.c b/fs/pipe.c --- a/fs/pipe.c Mon Oct 28 16:32:37 2002 +++ b/fs/pipe.c Mon Oct 28 16:32:37 2002 @@ -109,7 +109,7 @@ break; } if (do_wakeup) { - wake_up_interruptible(PIPE_WAIT(*inode)); + wake_up_interruptible_sync(PIPE_WAIT(*inode)); kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT); } pipe_wait(inode); @@ -117,7 +117,7 @@ up(PIPE_SEM(*inode)); /* Signal writers asynchronously that there is more room. */ if (do_wakeup) { - wake_up_interruptible_sync(PIPE_WAIT(*inode)); + wake_up_interruptible(PIPE_WAIT(*inode)); kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT); } if (ret > 0) diff -Nru a/fs/proc/kcore.c b/fs/proc/kcore.c --- a/fs/proc/kcore.c Mon Oct 28 16:32:37 2002 +++ b/fs/proc/kcore.c Mon Oct 28 16:32:37 2002 @@ -99,6 +99,12 @@ } #else /* CONFIG_KCORE_AOUT */ +#if VMALLOC_START < PAGE_OFFSET +#define KCORE_BASE VMALLOC_START +#else +#define KCORE_BASE PAGE_OFFSET +#endif + #define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) /* An ELF note in memory */ @@ -118,7 +124,7 @@ struct vm_struct *m; *num_vma = 0; - size = ((size_t)high_memory - PAGE_OFFSET + PAGE_SIZE); + size = ((size_t)high_memory - KCORE_BASE + PAGE_SIZE); if (!vmlist) { *elf_buflen = PAGE_SIZE; return (size); @@ -126,15 +132,15 @@ for (m=vmlist; m; m=m->next) { try = (size_t)m->addr + m->size; - if (try > size) - size = try; + if (try > KCORE_BASE + size) + size = try - KCORE_BASE; *num_vma = *num_vma + 1; } *elf_buflen = sizeof(struct elfhdr) + (*num_vma + 2)*sizeof(struct elf_phdr) + 3 * sizeof(struct memelfnote); *elf_buflen = PAGE_ALIGN(*elf_buflen); - return (size - PAGE_OFFSET + *elf_buflen); + return size + *elf_buflen; } @@ -237,7 +243,7 @@ offset += sizeof(struct elf_phdr); phdr->p_type = PT_LOAD; phdr->p_flags = PF_R|PF_W|PF_X; - phdr->p_offset = dataoff; + phdr->p_offset = PAGE_OFFSET - KCORE_BASE + dataoff; phdr->p_vaddr = PAGE_OFFSET; phdr->p_paddr = __pa(PAGE_OFFSET); phdr->p_filesz = phdr->p_memsz = ((unsigned long)high_memory - PAGE_OFFSET); @@ -254,7 +260,7 @@ phdr->p_type = PT_LOAD; phdr->p_flags = PF_R|PF_W|PF_X; - phdr->p_offset = (size_t)m->addr - PAGE_OFFSET + dataoff; + phdr->p_offset = (size_t)m->addr - KCORE_BASE + dataoff; phdr->p_vaddr = (size_t)m->addr; phdr->p_paddr = __pa(m->addr); phdr->p_filesz = phdr->p_memsz = m->size; @@ -385,9 +391,9 @@ /* * Fill the remainder of the buffer from kernel VM space. * We said in the ELF header that the data which starts - * at 'elf_buflen' is virtual address PAGE_OFFSET. --rmk + * at 'elf_buflen' is virtual address KCORE_BASE. --rmk */ - start = PAGE_OFFSET + (*fpos - elf_buflen); + start = KCORE_BASE + (*fpos - elf_buflen); if ((tsz = (PAGE_SIZE - (start & ~PAGE_MASK))) > buflen) tsz = buflen; diff -Nru a/fs/xfs/pagebuf/page_buf.c b/fs/xfs/pagebuf/page_buf.c --- a/fs/xfs/pagebuf/page_buf.c Mon Oct 28 16:32:35 2002 +++ b/fs/xfs/pagebuf/page_buf.c Mon Oct 28 16:32:35 2002 @@ -1448,7 +1448,7 @@ if (nbytes > size) nbytes = size; - if (bio_add_page(bio, pb->pb_pages[map_i], nbytes, offset)) + if (bio_add_page(bio, pb->pb_pages[map_i], nbytes, offset) < nbytes) break; offset = 0; diff -Nru a/include/asm-i386/ide.h b/include/asm-i386/ide.h --- a/include/asm-i386/ide.h Mon Oct 28 16:32:35 2002 +++ b/include/asm-i386/ide.h Mon Oct 28 16:32:35 2002 @@ -70,6 +70,7 @@ int index; for(index = 0; index < MAX_HWIFS; index++) { + memset(&hw, 0, sizeof hw); ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL); hw.irq = ide_default_irq(ide_default_io_base(index)); ide_register_hw(&hw, NULL); diff -Nru a/include/asm-i386/io.h b/include/asm-i386/io.h --- a/include/asm-i386/io.h Mon Oct 28 16:32:38 2002 +++ b/include/asm-i386/io.h Mon Oct 28 16:32:38 2002 @@ -370,6 +370,6 @@ BUILDIO(b,b,char) BUILDIO(w,w,short) -BUILDIO(l,,long) +BUILDIO(l,,int) #endif diff -Nru a/include/asm-i386/voyager.h b/include/asm-i386/voyager.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/asm-i386/voyager.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,522 @@ +/* Copyright (C) 1999,2001 + * + * Author: J.E.J.Bottomley@HansenPartnership.com + * + * Standard include definitions for the NCR Voyager system */ + +#undef VOYAGER_DEBUG +#undef VOYAGER_CAT_DEBUG + +#ifdef VOYAGER_DEBUG +#define VDEBUG(x) printk x +#else +#define VDEBUG(x) +#endif + +/* There are three levels of voyager machine: 3,4 and 5. The rule is + * if it's less than 3435 it's a Level 3 except for a 3360 which is + * a level 4. A 3435 or above is a Level 5 */ +#define VOYAGER_LEVEL5_AND_ABOVE 0x3435 +#define VOYAGER_LEVEL4 0x3360 + +/* The L4 DINO ASIC */ +#define VOYAGER_DINO 0x43 + +/* voyager ports in standard I/O space */ +#define VOYAGER_MC_SETUP 0x96 + + +#define VOYAGER_CAT_CONFIG_PORT 0x97 +# define VOYAGER_CAT_DESELECT 0xff +#define VOYAGER_SSPB_RELOCATION_PORT 0x98 + +/* Valid CAT controller commands */ +/* start instruction register cycle */ +#define VOYAGER_CAT_IRCYC 0x01 +/* start data register cycle */ +#define VOYAGER_CAT_DRCYC 0x02 +/* move to execute state */ +#define VOYAGER_CAT_RUN 0x0F +/* end operation */ +#define VOYAGER_CAT_END 0x80 +/* hold in idle state */ +#define VOYAGER_CAT_HOLD 0x90 +/* single step an "intest" vector */ +#define VOYAGER_CAT_STEP 0xE0 +/* return cat controller to CLEMSON mode */ +#define VOYAGER_CAT_CLEMSON 0xFF + +/* the default cat command header */ +#define VOYAGER_CAT_HEADER 0x7F + +/* the range of possible CAT module ids in the system */ +#define VOYAGER_MIN_MODULE 0x10 +#define VOYAGER_MAX_MODULE 0x1f + +/* The voyager registers per asic */ +#define VOYAGER_ASIC_ID_REG 0x00 +#define VOYAGER_ASIC_TYPE_REG 0x01 +/* the sub address registers can be made auto incrementing on reads */ +#define VOYAGER_AUTO_INC_REG 0x02 +# define VOYAGER_AUTO_INC 0x04 +# define VOYAGER_NO_AUTO_INC 0xfb +#define VOYAGER_SUBADDRDATA 0x03 +#define VOYAGER_SCANPATH 0x05 +# define VOYAGER_CONNECT_ASIC 0x01 +# define VOYAGER_DISCONNECT_ASIC 0xfe +#define VOYAGER_SUBADDRLO 0x06 +#define VOYAGER_SUBADDRHI 0x07 +#define VOYAGER_SUBMODSELECT 0x08 +#define VOYAGER_SUBMODPRESENT 0x09 + +#define VOYAGER_SUBADDR_LO 0xff +#define VOYAGER_SUBADDR_HI 0xffff + +/* the maximum size of a scan path -- used to form instructions */ +#define VOYAGER_MAX_SCAN_PATH 0x100 +/* the biggest possible register size (in bytes) */ +#define VOYAGER_MAX_REG_SIZE 4 + +/* Total number of possible modules (including submodules) */ +#define VOYAGER_MAX_MODULES 16 +/* Largest number of asics per module */ +#define VOYAGER_MAX_ASICS_PER_MODULE 7 + +/* the CAT asic of each module is always the first one */ +#define VOYAGER_CAT_ID 0 +#define VOYAGER_PSI 0x1a + +/* voyager instruction operations and registers */ +#define VOYAGER_READ_CONFIG 0x1 +#define VOYAGER_WRITE_CONFIG 0x2 +#define VOYAGER_BYPASS 0xff + +typedef struct voyager_asic +{ + __u8 asic_addr; /* ASIC address; Level 4 */ + __u8 asic_type; /* ASIC type */ + __u8 asic_id; /* ASIC id */ + __u8 jtag_id[4]; /* JTAG id */ + __u8 asic_location; /* Location within scan path; start w/ 0 */ + __u8 bit_location; /* Location within bit stream; start w/ 0 */ + __u8 ireg_length; /* Instruction register length */ + __u16 subaddr; /* Amount of sub address space */ + struct voyager_asic *next; /* Next asic in linked list */ +} voyager_asic_t; + +typedef struct voyager_module { + __u8 module_addr; /* Module address */ + __u8 scan_path_connected; /* Scan path connected */ + __u16 ee_size; /* Size of the EEPROM */ + __u16 num_asics; /* Number of Asics */ + __u16 inst_bits; /* Instruction bits in the scan path */ + __u16 largest_reg; /* Largest register in the scan path */ + __u16 smallest_reg; /* Smallest register in the scan path */ + voyager_asic_t *asic; /* First ASIC in scan path (CAT_I) */ + struct voyager_module *submodule; /* Submodule pointer */ + struct voyager_module *next; /* Next module in linked list */ +} voyager_module_t; + +typedef struct voyager_eeprom_hdr { + __u8 module_id[4] __attribute__((packed)); + __u8 version_id __attribute__((packed)); + __u8 config_id __attribute__((packed)); + __u16 boundry_id __attribute__((packed)); /* boundary scan id */ + __u16 ee_size __attribute__((packed)); /* size of EEPROM */ + __u8 assembly[11] __attribute__((packed)); /* assembly # */ + __u8 assembly_rev __attribute__((packed)); /* assembly rev */ + __u8 tracer[4] __attribute__((packed)); /* tracer number */ + __u16 assembly_cksum __attribute__((packed)); /* asm checksum */ + __u16 power_consump __attribute__((packed)); /* pwr requirements */ + __u16 num_asics __attribute__((packed)); /* number of asics */ + __u16 bist_time __attribute__((packed)); /* min. bist time */ + __u16 err_log_offset __attribute__((packed)); /* error log offset */ + __u16 scan_path_offset __attribute__((packed));/* scan path offset */ + __u16 cct_offset __attribute__((packed)); + __u16 log_length __attribute__((packed)); /* length of err log */ + __u16 xsum_end __attribute__((packed)); /* offset to end of + checksum */ + __u8 reserved[4] __attribute__((packed)); + __u8 sflag __attribute__((packed)); /* starting sentinal */ + __u8 part_number[13] __attribute__((packed)); /* prom part number */ + __u8 version[10] __attribute__((packed)); /* version number */ + __u8 signature[8] __attribute__((packed)); + __u16 eeprom_chksum __attribute__((packed)); + __u32 data_stamp_offset __attribute__((packed)); + __u8 eflag __attribute__((packed)); /* ending sentinal */ +} voyager_eprom_hdr_t; + + + +#define VOYAGER_EPROM_SIZE_OFFSET ((__u16)(&(((voyager_eprom_hdr_t *)0)->ee_size))) +#define VOYAGER_XSUM_END_OFFSET 0x2a + +/* the following three definitions are for internal table layouts + * in the module EPROMs. We really only care about the IDs and + * offsets */ +typedef struct voyager_sp_table { + __u8 asic_id __attribute__((packed)); + __u8 bypass_flag __attribute__((packed)); + __u16 asic_data_offset __attribute__((packed)); + __u16 config_data_offset __attribute__((packed)); +} voyager_sp_table_t; + +typedef struct voyager_jtag_table { + __u8 icode[4] __attribute__((packed)); + __u8 runbist[4] __attribute__((packed)); + __u8 intest[4] __attribute__((packed)); + __u8 samp_preld[4] __attribute__((packed)); + __u8 ireg_len __attribute__((packed)); +} voyager_jtt_t; + +typedef struct voyager_asic_data_table { + __u8 jtag_id[4] __attribute__((packed)); + __u16 length_bsr __attribute__((packed)); + __u16 length_bist_reg __attribute__((packed)); + __u32 bist_clk __attribute__((packed)); + __u16 subaddr_bits __attribute__((packed)); + __u16 seed_bits __attribute__((packed)); + __u16 sig_bits __attribute__((packed)); + __u16 jtag_offset __attribute__((packed)); +} voyager_at_t; + +/* Voyager Interrupt Controller (VIC) registers */ + +/* Base to add to Cross Processor Interrupts (CPIs) when triggering + * the CPU IRQ line */ +/* register defines for the WCBICs (one per processor) */ +#define VOYAGER_WCBIC0 0x41 /* bus A node P1 processor 0 */ +#define VOYAGER_WCBIC1 0x49 /* bus A node P1 processor 1 */ +#define VOYAGER_WCBIC2 0x51 /* bus A node P2 processor 0 */ +#define VOYAGER_WCBIC3 0x59 /* bus A node P2 processor 1 */ +#define VOYAGER_WCBIC4 0x61 /* bus B node P1 processor 0 */ +#define VOYAGER_WCBIC5 0x69 /* bus B node P1 processor 1 */ +#define VOYAGER_WCBIC6 0x71 /* bus B node P2 processor 0 */ +#define VOYAGER_WCBIC7 0x79 /* bus B node P2 processor 1 */ + + +/* top of memory registers */ +#define VOYAGER_WCBIC_TOM_L 0x4 +#define VOYAGER_WCBIC_TOM_H 0x5 + +/* register defines for Voyager Memory Contol (VMC) + * these are present on L4 machines only */ +#define VOYAGER_VMC1 0x81 +#define VOYAGER_VMC2 0x91 +#define VOYAGER_VMC3 0xa1 +#define VOYAGER_VMC4 0xb1 + +/* VMC Ports */ +#define VOYAGER_VMC_MEMORY_SETUP 0x9 +# define VMC_Interleaving 0x01 +# define VMC_4Way 0x02 +# define VMC_EvenCacheLines 0x04 +# define VMC_HighLine 0x08 +# define VMC_Start0_Enable 0x20 +# define VMC_Start1_Enable 0x40 +# define VMC_Vremap 0x80 +#define VOYAGER_VMC_BANK_DENSITY 0xa +# define VMC_BANK_EMPTY 0 +# define VMC_BANK_4MB 1 +# define VMC_BANK_16MB 2 +# define VMC_BANK_64MB 3 +# define VMC_BANK0_MASK 0x03 +# define VMC_BANK1_MASK 0x0C +# define VMC_BANK2_MASK 0x30 +# define VMC_BANK3_MASK 0xC0 + +/* Magellan Memory Controller (MMC) defines - present on L5 */ +#define VOYAGER_MMC_ASIC_ID 1 +/* the two memory modules corresponding to memory cards in the system */ +#define VOYAGER_MMC_MEMORY0_MODULE 0x14 +#define VOYAGER_MMC_MEMORY1_MODULE 0x15 +/* the Magellan Memory Address (MMA) defines */ +#define VOYAGER_MMA_ASIC_ID 2 + +/* Submodule number for the Quad Baseboard */ +#define VOYAGER_QUAD_BASEBOARD 1 + +/* ASIC defines for the Quad Baseboard */ +#define VOYAGER_QUAD_QDATA0 1 +#define VOYAGER_QUAD_QDATA1 2 +#define VOYAGER_QUAD_QABC 3 + +/* Useful areas in extended CMOS */ +#define VOYAGER_PROCESSOR_PRESENT_MASK 0x88a +#define VOYAGER_MEMORY_CLICKMAP 0xa23 +#define VOYAGER_DUMP_LOCATION 0xb1a + +/* SUS In Control bit - used to tell SUS that we don't need to be + * babysat anymore */ +#define VOYAGER_SUS_IN_CONTROL_PORT 0x3ff +# define VOYAGER_IN_CONTROL_FLAG 0x80 + +/* Voyager PSI defines */ +#define VOYAGER_PSI_STATUS_REG 0x08 +# define PSI_DC_FAIL 0x01 +# define PSI_MON 0x02 +# define PSI_FAULT 0x04 +# define PSI_ALARM 0x08 +# define PSI_CURRENT 0x10 +# define PSI_DVM 0x20 +# define PSI_PSCFAULT 0x40 +# define PSI_STAT_CHG 0x80 + +#define VOYAGER_PSI_SUPPLY_REG 0x8000 + /* read */ +# define PSI_FAIL_DC 0x01 +# define PSI_FAIL_AC 0x02 +# define PSI_MON_INT 0x04 +# define PSI_SWITCH_OFF 0x08 +# define PSI_HX_OFF 0x10 +# define PSI_SECURITY 0x20 +# define PSI_CMOS_BATT_LOW 0x40 +# define PSI_CMOS_BATT_FAIL 0x80 + /* write */ +# define PSI_CLR_SWITCH_OFF 0x13 +# define PSI_CLR_HX_OFF 0x14 +# define PSI_CLR_CMOS_BATT_FAIL 0x17 + +#define VOYAGER_PSI_MASK 0x8001 +# define PSI_MASK_MASK 0x10 + +#define VOYAGER_PSI_AC_FAIL_REG 0x8004 +#define AC_FAIL_STAT_CHANGE 0x80 + +#define VOYAGER_PSI_GENERAL_REG 0x8007 + /* read */ +# define PSI_SWITCH_ON 0x01 +# define PSI_SWITCH_ENABLED 0x02 +# define PSI_ALARM_ENABLED 0x08 +# define PSI_SECURE_ENABLED 0x10 +# define PSI_COLD_RESET 0x20 +# define PSI_COLD_START 0x80 + /* write */ +# define PSI_POWER_DOWN 0x10 +# define PSI_SWITCH_DISABLE 0x01 +# define PSI_SWITCH_ENABLE 0x11 +# define PSI_CLEAR 0x12 +# define PSI_ALARM_DISABLE 0x03 +# define PSI_ALARM_ENABLE 0x13 +# define PSI_CLEAR_COLD_RESET 0x05 +# define PSI_SET_COLD_RESET 0x15 +# define PSI_CLEAR_COLD_START 0x07 +# define PSI_SET_COLD_START 0x17 + + + +struct voyager_bios_info { + __u8 len; + __u8 major; + __u8 minor; + __u8 debug; + __u8 num_classes; + __u8 class_1; + __u8 class_2; +}; + +/* The following structures and definitions are for the Kernel/SUS + * interface these are needed to find out how SUS initialised any Quad + * boards in the system */ + +#define NUMBER_OF_MC_BUSSES 2 +#define SLOTS_PER_MC_BUS 8 +#define MAX_CPUS 16 /* 16 way CPU system */ +#define MAX_PROCESSOR_BOARDS 4 /* 4 processor slot system */ +#define MAX_CACHE_LEVELS 4 /* # of cache levels supported */ +#define MAX_SHARED_CPUS 4 /* # of CPUs that can share a LARC */ +#define NUMBER_OF_POS_REGS 8 + +typedef struct { + __u8 MC_Slot __attribute__((packed)); + __u8 POS_Values[NUMBER_OF_POS_REGS] __attribute__((packed)); +} MC_SlotInformation_t; + +struct QuadDescription { + __u8 Type __attribute__((packed)); /* for type 0 (DYADIC or MONADIC) all fields + * will be zero except for slot */ + __u8 StructureVersion __attribute__((packed)); + __u32 CPI_BaseAddress __attribute__((packed)); + __u32 LARC_BankSize __attribute__((packed)); + __u32 LocalMemoryStateBits __attribute__((packed)); + __u8 Slot __attribute__((packed)); /* Processor slots 1 - 4 */ +}; + +struct ProcBoardInfo { + __u8 Type __attribute__((packed)); + __u8 StructureVersion __attribute__((packed)); + __u8 NumberOfBoards __attribute__((packed)); + struct QuadDescription QuadData[MAX_PROCESSOR_BOARDS] __attribute__((packed)); +}; + +struct CacheDescription { + __u8 Level __attribute__((packed)); + __u32 TotalSize __attribute__((packed)); + __u16 LineSize __attribute__((packed)); + __u8 Associativity __attribute__((packed)); + __u8 CacheType __attribute__((packed)); + __u8 WriteType __attribute__((packed)); + __u8 Number_CPUs_SharedBy __attribute__((packed)); + __u8 Shared_CPUs_Hardware_IDs[MAX_SHARED_CPUS] __attribute__((packed)); + +}; + +struct CPU_Description { + __u8 CPU_HardwareId __attribute__((packed)); + char *FRU_String __attribute__((packed)); + __u8 NumberOfCacheLevels __attribute__((packed)); + struct CacheDescription CacheLevelData[MAX_CACHE_LEVELS] __attribute__((packed)); +}; + +struct CPU_Info { + __u8 Type __attribute__((packed)); + __u8 StructureVersion __attribute__((packed)); + __u8 NumberOf_CPUs __attribute__((packed)); + struct CPU_Description CPU_Data[MAX_CPUS] __attribute__((packed)); +}; + + +/* + * This structure will be used by SUS and the OS. + * The assumption about this structure is that no blank space is + * packed in it by our friend the compiler. + */ +typedef struct { + __u8 Mailbox_SUS; /* Written to by SUS to give commands/response to the OS */ + __u8 Mailbox_OS; /* Written to by the OS to give commands/response to SUS */ + __u8 SUS_MailboxVersion; /* Tells the OS which iteration of the interface SUS supports */ + __u8 OS_MailboxVersion; /* Tells SUS which iteration of the interface the OS supports */ + __u32 OS_Flags; /* Flags set by the OS as info for SUS */ + __u32 SUS_Flags; /* Flags set by SUS as info for the OS */ + __u32 WatchDogPeriod; /* Watchdog period (in seconds) which the DP uses to see if the OS is dead */ + __u32 WatchDogCount; /* Updated by the OS on every tic. */ + __u32 MemoryFor_SUS_ErrorLog; /* Flat 32 bit address which tells SUS where to stuff the SUS error log on a dump */ + MC_SlotInformation_t MC_SlotInfo[NUMBER_OF_MC_BUSSES*SLOTS_PER_MC_BUS]; /* Storage for MCA POS data */ + /* All new SECOND_PASS_INTERFACE fields added from this point */ + struct ProcBoardInfo *BoardData; + struct CPU_Info *CPU_Data; + /* All new fields must be added from this point */ +} Voyager_KernelSUS_Mbox_t; + +/* structure for finding the right memory address to send a QIC CPI to */ +struct voyager_qic_cpi { + /* Each cache line (32 bytes) can trigger a cpi. The cpi + * read/write may occur anywhere in the cache line---pick the + * middle to be safe */ + struct { + __u32 pad1[3]; + __u32 cpi; + __u32 pad2[4]; + } qic_cpi[8]; +}; + +struct voyager_status { + __u32 power_fail:1; + __u32 switch_off:1; + __u32 request_from_kernel:1; +}; + +struct voyager_psi_regs { + __u8 cat_id; + __u8 cat_dev; + __u8 cat_control; + __u8 subaddr; + __u8 dummy4; + __u8 checkbit; + __u8 subaddr_low; + __u8 subaddr_high; + __u8 intstatus; + __u8 stat1; + __u8 stat3; + __u8 fault; + __u8 tms; + __u8 gen; + __u8 sysconf; + __u8 dummy15; +}; + +struct voyager_psi_subregs { + __u8 supply; + __u8 mask; + __u8 present; + __u8 DCfail; + __u8 ACfail; + __u8 fail; + __u8 UPSfail; + __u8 genstatus; +}; + +struct voyager_psi { + struct voyager_psi_regs regs; + struct voyager_psi_subregs subregs; +}; + +struct voyager_SUS { +#define VOYAGER_DUMP_BUTTON_NMI 0x1 +#define VOYAGER_SUS_VALID 0x2 +#define VOYAGER_SYSINT_COMPLETE 0x3 + __u8 SUS_mbox; +#define VOYAGER_NO_COMMAND 0x0 +#define VOYAGER_IGNORE_DUMP 0x1 +#define VOYAGER_DO_DUMP 0x2 +#define VOYAGER_SYSINT_HANDSHAKE 0x3 +#define VOYAGER_DO_MEM_DUMP 0x4 +#define VOYAGER_SYSINT_WAS_RECOVERED 0x5 + __u8 kernel_mbox; +#define VOYAGER_MAILBOX_VERSION 0x10 + __u8 SUS_version; + __u8 kernel_version; +#define VOYAGER_OS_HAS_SYSINT 0x1 +#define VOYAGER_OS_IN_PROGRESS 0x2 +#define VOYAGER_UPDATING_WDPERIOD 0x4 + __u32 kernel_flags; +#define VOYAGER_SUS_BOOTING 0x1 +#define VOYAGER_SUS_IN_PROGRESS 0x2 + __u32 SUS_flags; + __u32 watchdog_period; + __u32 watchdog_count; + __u32 SUS_errorlog; + /* lots of system configuration stuff under here */ +}; + +/* Variables exported by voyager_smp */ +extern __u32 voyager_extended_vic_processors; +extern __u32 voyager_allowed_boot_processors; +extern __u32 voyager_quad_processors; +extern struct voyager_qic_cpi *voyager_quad_cpi_addr[NR_CPUS]; +extern struct voyager_SUS *voyager_SUS; + +/* variables exported always */ +extern int voyager_level; +extern int kvoyagerd_running; +extern struct semaphore kvoyagerd_sem; +extern struct voyager_status voyager_status; + + + +/* functions exported by the voyager and voyager_smp modules */ + +extern int voyager_cat_readb(__u8 module, __u8 asic, int reg); +extern void voyager_cat_init(void); +extern void voyager_detect(struct voyager_bios_info *); +extern void voyager_trap_init(void); +extern void voyager_setup_irqs(void); +extern int voyager_memory_detect(int region, __u32 *addr, __u32 *length); +extern void voyager_smp_intr_init(void); +extern __u8 voyager_extended_cmos_read(__u16 cmos_address); +extern void voyager_dump(void); +extern void voyager_smp_dump(void); +extern void voyager_timer_interrupt(struct pt_regs *regs); +extern void smp_local_timer_interrupt(struct pt_regs * regs); +extern void voyager_power_off(void); +extern void smp_voyager_power_off(void *dummy); +extern void voyager_restart(void); +extern void voyager_cat_power_off(void); +extern void voyager_cat_do_common_interrupt(void); +extern void voyager_handle_nmi(void); +/* Commands for the following are */ +#define VOYAGER_PSI_READ 0 +#define VOYAGER_PSI_WRITE 1 +#define VOYAGER_PSI_SUBREAD 2 +#define VOYAGER_PSI_SUBWRITE 3 +extern void voyager_cat_psi(__u8, __u16, __u8 *); diff -Nru a/include/asm-ia64/acpi.h b/include/asm-ia64/acpi.h --- a/include/asm-ia64/acpi.h Mon Oct 28 16:32:37 2002 +++ b/include/asm-ia64/acpi.h Mon Oct 28 16:32:37 2002 @@ -97,17 +97,18 @@ } while (0) const char *acpi_get_sysname (void); -int acpi_boot_init (char *cdline); int acpi_request_vector (u32 int_type); int acpi_get_prt (struct pci_vector_struct **vectors, int *count); int acpi_get_interrupt_model (int *type); int acpi_irq_to_vector (u32 irq); -#ifdef CONFIG_DISCONTIGMEM -#define NODE_ARRAY_INDEX(x) ((x) / 8) /* 8 bits/char */ -#define NODE_ARRAY_OFFSET(x) ((x) % 8) /* 8 bits/char */ -#define MAX_PXM_DOMAINS (256) -#endif /* CONFIG_DISCONTIGMEM */ +#ifdef CONFIG_ACPI_NUMA +#include +/* Proximity bitmap length; _PXM is at most 255 (8 bit)*/ +#define MAX_PXM_DOMAINS (256) +extern int __initdata pxm_to_nid_map[MAX_PXM_DOMAINS]; +extern int __initdata nid_to_pxm_map[NR_NODES]; +#endif #endif /*__KERNEL__*/ diff -Nru a/include/asm-ia64/ia32.h b/include/asm-ia64/ia32.h --- a/include/asm-ia64/ia32.h Mon Oct 28 16:32:38 2002 +++ b/include/asm-ia64/ia32.h Mon Oct 28 16:32:38 2002 @@ -73,6 +73,17 @@ unsigned short exponent; }; +struct _fpxreg_ia32 { + unsigned short significand[4]; + unsigned short exponent; + unsigned short padding[3]; +}; + +struct _xmmreg_ia32 { + unsigned int element[4]; +}; + + struct _fpstate_ia32 { unsigned int cw, sw, @@ -82,7 +93,16 @@ dataoff, datasel; struct _fpreg_ia32 _st[8]; - unsigned int status; + unsigned short status; + unsigned short magic; /* 0xffff = regular FPU data only */ + + /* FXSR FPU environment */ + unsigned int _fxsr_env[6]; /* FXSR FPU env is ignored */ + unsigned int mxcsr; + unsigned int reserved; + struct _fpxreg_ia32 _fxsr_st[8]; /* FXSR FPU reg data is ignored */ + struct _xmmreg_ia32 _xmm[8]; + unsigned int padding[56]; }; struct sigcontext_ia32 { @@ -485,6 +505,18 @@ extern int ia32_intercept (struct pt_regs *regs, unsigned long isr); extern unsigned long ia32_do_mmap (struct file *, unsigned long, unsigned long, int, int, loff_t); extern void ia32_load_segment_descriptors (struct task_struct *task); + +#define ia32f2ia64f(dst,src) \ + do { \ + register double f6 asm ("f6"); \ + asm volatile ("ldfe f6=[%2];; stf.spill [%1]=f6" : "=f"(f6): "r"(dst), "r"(src) : "memory"); \ + } while(0) + +#define ia64f2ia32f(dst,src) \ + do { \ + register double f6 asm ("f6"); \ + asm volatile ("ldf.fill f6=[%2];; stfe [%1]=f6" : "=f"(f6): "r"(dst), "r"(src) : "memory"); \ + } while(0) #endif /* !CONFIG_IA32_SUPPORT */ diff -Nru a/include/asm-ia64/iosapic.h b/include/asm-ia64/iosapic.h --- a/include/asm-ia64/iosapic.h Mon Oct 28 16:32:37 2002 +++ b/include/asm-ia64/iosapic.h Mon Oct 28 16:32:37 2002 @@ -55,6 +55,8 @@ unsigned int gsi_base, int pcat_compat); extern int gsi_to_vector (unsigned int gsi); +extern int gsi_to_irq (unsigned int gsi); +extern void iosapic_parse_prt (void); extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity, unsigned long edge_triggered, u32 gsi_base, char *iosapic_address); diff -Nru a/include/asm-ia64/mmzone.h b/include/asm-ia64/mmzone.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/asm-ia64/mmzone.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,130 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (c) 2000 Silicon Graphics, Inc. All rights reserved. + * Copyright (c) 2002 NEC Corp. + * Copyright (c) 2002 Erich Focht + * Copyright (c) 2002 Kimio Suganuma + */ +#ifndef _ASM_IA64_MMZONE_H +#define _ASM_IA64_MMZONE_H + +#include +#include + +/* + * Given a kaddr, find the base mem_map address for the start of the mem_map + * entries for the bank containing the kaddr. + */ +#define BANK_MEM_MAP_BASE(kaddr) local_node_data->bank_mem_map_base[BANK_MEM_MAP_INDEX(kaddr)] + +/* + * Given a kaddr, this macro return the relative map number + * within the bank. + */ +#define BANK_MAP_NR(kaddr) (BANK_OFFSET(kaddr) >> PAGE_SHIFT) + +/* + * Given a pte, this macro returns a pointer to the page struct for the pte. + */ +#define pte_page(pte) virt_to_page(PAGE_OFFSET | (pte_val(pte)&_PFN_MASK)) + +/* + * Determine if a kaddr is a valid memory address of memory that + * actually exists. + * + * The check consists of 2 parts: + * - verify that the address is a region 7 address & does not + * contain any bits that preclude it from being a valid platform + * memory address + * - verify that the chunk actually exists. + * + * Note that IO addresses are NOT considered valid addresses. + * + * Note, many platforms can simply check if kaddr exceeds a specific size. + * (However, this wont work on SGI platforms since IO space is embedded + * within the range of valid memory addresses & nodes have holes in the + * address range between banks). + */ +#define kern_addr_valid(kaddr) ({long _kav=(long)(kaddr); \ + VALID_MEM_KADDR(_kav);}) + +/* + * Given a kaddr, return a pointer to the page struct for the page. + * If the kaddr does not represent RAM memory that potentially exists, return + * a pointer the page struct for max_mapnr. IO addresses will + * return the page for max_nr. Addresses in unpopulated RAM banks may + * return undefined results OR may panic the system. + * + */ +#define virt_to_page(kaddr) ({long _kvtp=(long)(kaddr); \ + (VALID_MEM_KADDR(_kvtp)) \ + ? BANK_MEM_MAP_BASE(_kvtp) + BANK_MAP_NR(_kvtp) \ + : NULL;}) + +/* + * Given a page struct entry, return the physical address that the page struct represents. + * Since IA64 has all memory in the DMA zone, the following works: + */ +#define page_to_phys(page) __pa(page_address(page)) + +#define node_mem_map(nid) (NODE_DATA(nid)->node_mem_map) + +#define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn) + +#define pfn_to_page(pfn) (struct page *)(node_mem_map(pfn_to_nid(pfn)) + node_localnr(pfn, pfn_to_nid(pfn))) + +#define pfn_to_nid(pfn) local_node_data->node_id_map[(pfn << PAGE_SHIFT) >> DIG_BANKSHIFT] + +#define page_to_pfn(page) (long)((page - page_zone(page)->zone_mem_map) + page_zone(page)->zone_start_pfn) + + +/* + * pfn_valid should be made as fast as possible, and the current definition + * is valid for machines that are NUMA, but still contiguous, which is what + * is currently supported. A more generalised, but slower definition would + * be something like this - mbligh: + * ( pfn_to_pgdat(pfn) && (pfn < node_end_pfn(pfn_to_nid(pfn))) ) + */ +#define pfn_valid(pfn) (pfn < max_low_pfn) +extern unsigned long max_low_pfn; + + +#ifdef CONFIG_IA64_DIG + +/* + * Platform definitions for DIG platform with contiguous memory. + */ +#define MAX_PHYSNODE_ID 8 /* Maximum node number +1 */ +#define NR_NODES 8 /* Maximum number of nodes in SSI */ + +#define MAX_PHYS_MEMORY (1UL << 40) /* 1 TB */ + +/* + * Bank definitions. + * Current settings for DIG: 512MB/bank, 16GB/node. + */ +#define NR_BANKS_PER_NODE 32 +#define BANK_OFFSET(addr) ((unsigned long)(addr) & (BANKSIZE-1)) +#define DIG_BANKSHIFT 29 +#define BANKSIZE (1UL << DIG_BANKSHIFT) +#define NR_BANKS (NR_BANKS_PER_NODE * NR_NODES) + +/* + * VALID_MEM_KADDR returns a boolean to indicate if a kaddr is + * potentially a valid cacheable identity mapped RAM memory address. + * Note that the RAM may or may not actually be present!! + */ +#define VALID_MEM_KADDR(kaddr) 1 + +/* + * Given a nodeid & a bank number, find the address of the mem_map + * entry for the first page of the bank. + */ +#define BANK_MEM_MAP_INDEX(kaddr) \ + (((unsigned long)(kaddr) & (MAX_PHYS_MEMORY-1)) >> DIG_BANKSHIFT) + +#endif /* CONFIG_IA64_DIG */ +#endif /* _ASM_IA64_MMZONE_H */ diff -Nru a/include/asm-ia64/nodedata.h b/include/asm-ia64/nodedata.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/asm-ia64/nodedata.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,75 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (c) 2000 Silicon Graphics, Inc. All rights reserved. + * Copyright (c) 2002 NEC Corp. + * Copyright (c) 2002 Erich Focht + * Copyright (c) 2002 Kimio Suganuma + */ + + +#ifndef _ASM_IA64_NODEDATA_H +#define _ASM_IA64_NODEDATA_H + + +#include + +/* + * Node Data. One of these structures is located on each node of a NUMA system. + */ + +struct pglist_data; +struct ia64_node_data { + short node; + struct pglist_data *pg_data_ptrs[NR_NODES]; + struct page *bank_mem_map_base[NR_BANKS]; + struct ia64_node_data *node_data_ptrs[NR_NODES]; + short node_id_map[NR_BANKS]; +}; + + +/* + * Return a pointer to the node_data structure for the executing cpu. + */ +#define local_node_data (local_cpu_data->node_data) + + +/* + * Return a pointer to the node_data structure for the specified node. + */ +#define node_data(node) (local_node_data->node_data_ptrs[node]) + +/* + * Get a pointer to the node_id/node_data for the current cpu. + * (boot time only) + */ +extern int boot_get_local_nodeid(void); +extern struct ia64_node_data *get_node_data_ptr(void); + +/* + * Given a node id, return a pointer to the pg_data_t for the node. + * The following 2 macros are similar. + * + * NODE_DATA - should be used in all code not related to system + * initialization. It uses pernode data structures to minimize + * offnode memory references. However, these structure are not + * present during boot. This macro can be used once cpu_init + * completes. + * + * BOOT_NODE_DATA + * - should be used during system initialization + * prior to freeing __initdata. It does not depend on the percpu + * area being present. + * + * NOTE: The names of these macros are misleading but are difficult to change + * since they are used in generic linux & on other architecures. + */ +#define NODE_DATA(nid) (local_node_data->pg_data_ptrs[nid]) +#define BOOT_NODE_DATA(nid) boot_get_pg_data_ptr((long)(nid)) + +struct pglist_data; +extern struct pglist_data * __init boot_get_pg_data_ptr(long); + +#endif /* _ASM_IA64_NODEDATA_H */ diff -Nru a/include/asm-ia64/numa.h b/include/asm-ia64/numa.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/asm-ia64/numa.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,65 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * This file contains NUMA specific prototypes and definitions. + * + * 2002/08/05 Erich Focht + * + */ +#ifndef _ASM_IA64_NUMA_H +#define _ASM_IA64_NUMA_H + +#ifdef CONFIG_NUMA + +#ifdef CONFIG_DISCONTIGMEM +# include +# define NR_MEMBLKS (NR_BANKS) +#else +# define NR_NODES (8) +# define NR_MEMBLKS (NR_NODES * 8) +#endif + +extern char cpu_to_node_map[NR_CPUS] __cacheline_aligned; + +/* Stuff below this line could be architecture independent */ + +extern int num_memblks; /* total number of memory chunks */ + +/* + * List of node memory chunks. Filled when parsing SRAT table to + * obtain information about memory nodes. +*/ + +struct node_memblk_s { + unsigned long start_paddr; + unsigned long size; + int nid; /* which logical node contains this chunk? */ + int bank; /* which mem bank on this node */ +}; + +struct node_cpuid_s { + u16 phys_id; /* id << 8 | eid */ + int nid; /* logical node containing this CPU */ +}; + +extern struct node_memblk_s node_memblk[NR_MEMBLKS]; +extern struct node_cpuid_s node_cpuid[NR_CPUS]; + +/* + * ACPI 2.0 SLIT (System Locality Information Table) + * http://devresource.hp.com/devresource/Docs/TechPapers/IA64/slit.pdf + * + * This is a matrix with "distances" between nodes, they should be + * proportional to the memory access latency ratios. + */ + +extern u8 numa_slit[NR_NODES * NR_NODES]; +#define node_distance(from,to) (numa_slit[from * numnodes + to]) + +extern int paddr_to_nid(unsigned long paddr); + +#endif /* CONFIG_NUMA */ + +#endif /* _ASM_IA64_NUMA_H */ diff -Nru a/include/asm-ia64/numnodes.h b/include/asm-ia64/numnodes.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/asm-ia64/numnodes.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,7 @@ +#ifndef _ASM_MAX_NUMNODES_H +#define _ASM_MAX_NUMNODES_H + +#include +#define MAX_NUMNODES NR_NODES + +#endif /* _ASM_MAX_NUMNODES_H */ diff -Nru a/include/asm-ia64/page.h b/include/asm-ia64/page.h --- a/include/asm-ia64/page.h Mon Oct 28 16:32:35 2002 +++ b/include/asm-ia64/page.h Mon Oct 28 16:32:35 2002 @@ -82,12 +82,15 @@ flush_dcache_page(page); \ } while (0) -#define pfn_valid(pfn) ((pfn) < max_mapnr) #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) + +#ifndef CONFIG_DISCONTIGMEM +#define pfn_valid(pfn) ((pfn) < max_mapnr) #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) #define page_to_pfn(page) ((unsigned long) (page - mem_map)) #define pfn_to_page(pfn) (mem_map + (pfn)) #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) +#endif typedef union ia64_va { struct { diff -Nru a/include/asm-ia64/perfmon.h b/include/asm-ia64/perfmon.h --- a/include/asm-ia64/perfmon.h Mon Oct 28 16:32:37 2002 +++ b/include/asm-ia64/perfmon.h Mon Oct 28 16:32:37 2002 @@ -123,7 +123,7 @@ * Define the version numbers for both perfmon as a whole and the sampling buffer format. */ #define PFM_VERSION_MAJ 1U -#define PFM_VERSION_MIN 0U +#define PFM_VERSION_MIN 1U #define PFM_VERSION (((PFM_VERSION_MAJ&0xffff)<<16)|(PFM_VERSION_MIN & 0xffff)) #define PFM_SMPL_VERSION_MAJ 1U diff -Nru a/include/asm-ia64/processor.h b/include/asm-ia64/processor.h --- a/include/asm-ia64/processor.h Mon Oct 28 16:32:36 2002 +++ b/include/asm-ia64/processor.h Mon Oct 28 16:32:36 2002 @@ -89,6 +89,9 @@ #include #include #include +#ifdef CONFIG_NUMA +#include +#endif /* like above but expressed as bitfields for more efficient access: */ struct ia64_psr { @@ -174,6 +177,10 @@ __u64 prof_counter; __u64 prof_multiplier; #endif +#ifdef CONFIG_NUMA + struct ia64_node_data *node_data; + int nodeid; +#endif }; DECLARE_PER_CPU(struct cpuinfo_ia64, cpu_info); @@ -184,6 +191,10 @@ */ #define local_cpu_data (&__get_cpu_var(cpu_info)) #define cpu_data(cpu) (&per_cpu(cpu_info, cpu)) + +#ifdef CONFIG_NUMA +#define numa_node_id() (local_cpu_data->nodeid) +#endif extern void identify_cpu (struct cpuinfo_ia64 *); extern void print_cpu_info (struct cpuinfo_ia64 *); diff -Nru a/include/asm-ia64/siginfo.h b/include/asm-ia64/siginfo.h --- a/include/asm-ia64/siginfo.h Mon Oct 28 16:32:37 2002 +++ b/include/asm-ia64/siginfo.h Mon Oct 28 16:32:37 2002 @@ -148,8 +148,8 @@ if (from->si_code < 0) memcpy(to, from, sizeof(siginfo_t)); else - /* _sigchld is currently the largest know union member */ - memcpy(to, from, 4*sizeof(int) + sizeof(from->_sifields._sigchld)); + /* _sigprof is currently the largest know union member */ + memcpy(to, from, 4*sizeof(int) + sizeof(from->_sifields._sigprof)); } extern int copy_siginfo_from_user(siginfo_t *to, siginfo_t *from); diff -Nru a/include/asm-ia64/sn/bte_copy.h b/include/asm-ia64/sn/bte_copy.h --- a/include/asm-ia64/sn/bte_copy.h Mon Oct 28 16:32:37 2002 +++ b/include/asm-ia64/sn/bte_copy.h Mon Oct 28 16:32:37 2002 @@ -250,7 +250,7 @@ * status register into the notification area. * This fakes the shub performing the copy. */ - if (jiffies > bte->idealTransferTimeout) { + if (time_after(jiffies, bte->idealTransferTimeout)) { bte->notify = HUB_L(bte->bte_base_addr); bte->idealTransferTimeoutReached++; bte->idealTransferTimeout = jiffies + diff -Nru a/include/asm-ia64/thread_info.h b/include/asm-ia64/thread_info.h --- a/include/asm-ia64/thread_info.h Mon Oct 28 16:32:38 2002 +++ b/include/asm-ia64/thread_info.h Mon Oct 28 16:32:38 2002 @@ -37,11 +37,11 @@ #define INIT_THREAD_INFO(ti) \ { \ - exec_domain: &default_exec_domain, \ - flags: 0, \ - cpu: 0, \ - addr_limit: KERNEL_DS, \ - preempt_count: 0, \ + .exec_domain = &default_exec_domain, \ + .flags = 0, \ + .cpu = 0, \ + .addr_limit = KERNEL_DS, \ + .preempt_count = 0, \ } /* how to get the thread information struct from C */ diff -Nru a/include/asm-ia64/tlb.h b/include/asm-ia64/tlb.h --- a/include/asm-ia64/tlb.h Mon Oct 28 16:32:36 2002 +++ b/include/asm-ia64/tlb.h Mon Oct 28 16:32:36 2002 @@ -53,9 +53,10 @@ typedef struct { struct mm_struct *mm; - unsigned int nr; /* == ~0U => fast mode */ - unsigned int fullmm; /* non-zero means full mm flush */ - unsigned long freed; /* number of pages freed */ + unsigned int nr; /* == ~0U => fast mode */ + unsigned char fullmm; /* non-zero means full mm flush */ + unsigned char need_flush; /* really unmapped some PTEs? */ + unsigned long freed; /* number of pages freed */ unsigned long start_addr; unsigned long end_addr; struct page *pages[FREE_PTE_NR]; @@ -73,6 +74,10 @@ { unsigned int nr; + if (!tlb->need_flush) + return; + tlb->need_flush = 0; + if (tlb->fullmm) { /* * Tearing down the entire address space. This happens both as a result @@ -168,18 +173,6 @@ } /* - * Remove TLB entry for PTE mapped at virtual address ADDRESS. This is called for any - * PTE, not just those pointing to (normal) physical memory. - */ -static inline void -__tlb_remove_tlb_entry (mmu_gather_t *tlb, pte_t *ptep, unsigned long address) -{ - if (tlb->start_addr == ~0UL) - tlb->start_addr = address; - tlb->end_addr = address + PAGE_SIZE; -} - -/* * Logically, this routine frees PAGE. On MP machines, the actual freeing of the page * must be delayed until after the TLB has been flushed (see comments at the beginning of * this file). @@ -187,6 +180,8 @@ static inline void tlb_remove_page (mmu_gather_t *tlb, struct page *page) { + tlb->need_flush = 1; + if (tlb_fast_mode(tlb)) { free_page_and_swap_cache(page); return; @@ -196,11 +191,37 @@ ia64_tlb_flush_mmu(tlb, tlb->start_addr, tlb->end_addr); } +/* + * Remove TLB entry for PTE mapped at virtual address ADDRESS. This is called for any + * PTE, not just those pointing to (normal) physical memory. + */ +static inline void +__tlb_remove_tlb_entry (mmu_gather_t *tlb, pte_t *ptep, unsigned long address) +{ + if (tlb->start_addr == ~0UL) + tlb->start_addr = address; + tlb->end_addr = address + PAGE_SIZE; +} + #define tlb_start_vma(tlb, vma) do { } while (0) #define tlb_end_vma(tlb, vma) do { } while (0) -#define tlb_remove_tlb_entry(tlb, ptep, addr) __tlb_remove_tlb_entry(tlb, ptep, addr) -#define pte_free_tlb(tlb, ptep) __pte_free_tlb(tlb, ptep) -#define pmd_free_tlb(tlb, ptep) __pmd_free_tlb(tlb, ptep) +#define tlb_remove_tlb_entry(tlb, ptep, addr) \ +do { \ + tlb->need_flush = 1; \ + __tlb_remove_tlb_entry(tlb, ptep, addr); \ +} while (0) + +#define pte_free_tlb(tlb, ptep) \ +do { \ + tlb->need_flush = 1; \ + __pte_free_tlb(tlb, ptep); \ +} while (0) + +#define pmd_free_tlb(tlb, ptep) \ +do { \ + tlb->need_flush = 1; \ + __pmd_free_tlb(tlb, ptep); \ +} while (0) #endif /* _ASM_IA64_TLB_H */ diff -Nru a/include/asm-ia64/topology.h b/include/asm-ia64/topology.h --- a/include/asm-ia64/topology.h Mon Oct 28 16:32:35 2002 +++ b/include/asm-ia64/topology.h Mon Oct 28 16:32:35 2002 @@ -1,6 +1,79 @@ +/* + * linux/include/asm-ia64/topology.h + * + * Copyright (C) 2002, Erich Focht, NEC + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ #ifndef _ASM_IA64_TOPOLOGY_H #define _ASM_IA64_TOPOLOGY_H -#include +#include +#include + +/* Returns the number of the node containing CPU 'cpu' */ +#ifdef CONFIG_NUMA +#define __cpu_to_node(cpu) cpu_to_node_map[cpu] +#else +#define __cpu_to_node(cpu) (0) +#endif + +/* + * Returns the number of the node containing MemBlk 'memblk' + */ +#ifdef CONFIG_ACPI_NUMA +#define __memblk_to_node(memblk) (node_memblk[memblk].nid) +#else +#define __memblk_to_node(memblk) (memblk) +#endif + +/* + * Returns the number of the node containing Node 'nid'. + * Not implemented here. Multi-level hierarchies detected with + * the help of node_distance(). + */ +#define __parent_node(nid) (nid) + +/* + * Returns the number of the first CPU on Node 'node'. + * Slow in the current implementation. + * Who needs this? + */ +/* #define __node_to_first_cpu(node) pool_cpus[pool_ptr[node]] */ +static inline int __node_to_first_cpu(int node) +{ + int i; + + for (i=0; ibi_flags & (1 << (flag))) /* @@ -131,6 +132,7 @@ #define bio_page(bio) bio_iovec((bio))->bv_page #define bio_offset(bio) bio_iovec((bio))->bv_offset #define bio_sectors(bio) ((bio)->bi_size >> 9) +#define bio_cur_sectors(bio) (bio_iovec(bio)->bv_len >> 9) #define bio_data(bio) (page_address(bio_page((bio))) + bio_offset((bio))) #define bio_barrier(bio) ((bio)->bi_rw & (1 << BIO_RW_BARRIER)) @@ -201,7 +203,7 @@ extern struct bio *bio_alloc(int, int); extern void bio_put(struct bio *); -extern int bio_endio(struct bio *, unsigned int, int); +extern void bio_endio(struct bio *, unsigned int, int); struct request_queue; extern inline int bio_phys_segments(struct request_queue *, struct bio *); extern inline int bio_hw_segments(struct request_queue *, struct bio *); @@ -214,6 +216,9 @@ extern int bio_add_page(struct bio *, struct page *, unsigned int,unsigned int); extern int bio_get_nr_vecs(struct block_device *); +extern struct bio *bio_map_user(struct block_device *, unsigned long, + unsigned int, int); +extern void bio_unmap_user(struct bio *, int); #ifdef CONFIG_HIGHMEM /* diff -Nru a/include/linux/blk.h b/include/linux/blk.h --- a/include/linux/blk.h Mon Oct 28 16:32:37 2002 +++ b/include/linux/blk.h Mon Oct 28 16:32:37 2002 @@ -39,32 +39,19 @@ */ extern int end_that_request_first(struct request *, int, int); +extern int end_that_request_chunk(struct request *, int, int); extern void end_that_request_last(struct request *); struct request *elv_next_request(request_queue_t *q); static inline void blkdev_dequeue_request(struct request *req) { - list_del(&req->queuelist); + BUG_ON(list_empty(&req->queuelist)); + + list_del_init(&req->queuelist); if (req->q) elv_remove_request(req->q, req); } - -#define _elv_add_request_core(q, rq, where, plug) \ - do { \ - if ((plug)) \ - blk_plug_device((q)); \ - (q)->elevator.elevator_add_req_fn((q), (rq), (where)); \ - } while (0) - -#define _elv_add_request(q, rq, back, p) do { \ - if ((back)) \ - _elv_add_request_core((q), (rq), (q)->queue_head.prev, (p)); \ - else \ - _elv_add_request_core((q), (rq), &(q)->queue_head, (p)); \ -} while (0) - -#define elv_add_request(q, rq, back) _elv_add_request((q), (rq), (back), 1) #if defined(MAJOR_NR) || defined(IDE_DRIVER) #if (MAJOR_NR != SCSI_TAPE_MAJOR) && (MAJOR_NR != OSST_MAJOR) diff -Nru a/include/linux/blkdev.h b/include/linux/blkdev.h --- a/include/linux/blkdev.h Mon Oct 28 16:32:36 2002 +++ b/include/linux/blkdev.h Mon Oct 28 16:32:36 2002 @@ -26,6 +26,8 @@ struct list_head queuelist; /* looking for ->queue? you must _not_ * access it directly, use * blkdev_dequeue_request! */ + int ref_count; + void *elevator_private; unsigned char cmd[16]; @@ -64,7 +66,10 @@ /* For packet commands */ unsigned int data_len; - void *data, *sense; + void *data; + + unsigned int sense_len; + void *sense; unsigned int timeout; struct completion *waiting; @@ -150,12 +155,6 @@ int max_depth; }; -/* - * Default nr free requests per queue, ll_rw_blk will scale it down - * according to available RAM at init time - */ -#define QUEUE_NR_REQUESTS 8192 - struct request_queue { /* @@ -215,10 +214,17 @@ unsigned int max_segment_size; unsigned long seg_boundary_mask; + unsigned int dma_alignment; wait_queue_head_t queue_wait; struct blk_queue_tag *queue_tags; + + /* + * sg stuff + */ + unsigned int sg_timeout; + unsigned int sg_reserved_size; }; #define RQ_INACTIVE (-1) @@ -254,6 +260,13 @@ */ #define blk_queue_headactive(q, head_active) +/* + * q->prep_rq_fn return values + */ +#define BLKPREP_OK 0 /* serve it */ +#define BLKPREP_KILL 1 /* fatal error, kill */ +#define BLKPREP_DEFER 2 /* leave on queue */ + extern unsigned long blk_max_low_pfn, blk_max_pfn; /* @@ -268,7 +281,7 @@ #define BLK_BOUNCE_ISA (ISA_DMA_THRESHOLD) extern int init_emergency_isa_pool(void); -void blk_queue_bounce(request_queue_t *q, struct bio **bio); +inline void blk_queue_bounce(request_queue_t *q, struct bio **bio); #define rq_for_each_bio(bio, rq) \ if ((rq->bio)) \ @@ -339,6 +352,7 @@ extern void blk_queue_assign_lock(request_queue_t *, spinlock_t *); extern void blk_queue_prep_rq(request_queue_t *, prep_rq_fn *pfn); extern void blk_queue_merge_bvec(request_queue_t *, merge_bvec_fn *); +extern void blk_queue_dma_alignment(request_queue_t *, int); extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); extern int blk_rq_map_sg(request_queue_t *, struct request *, struct scatterlist *); @@ -383,6 +397,21 @@ static inline int bdev_hardsect_size(struct block_device *bdev) { return queue_hardsect_size(bdev_get_queue(bdev)); +} + +static inline int queue_dma_alignment(request_queue_t *q) +{ + int retval = 511; + + if (q && q->dma_alignment) + retval = q->dma_alignment; + + return retval; +} + +static inline int bdev_dma_aligment(struct block_device *bdev) +{ + return queue_dma_alignment(bdev_get_queue(bdev)); } #define blk_finished_io(nsects) do { } while (0) diff -Nru a/include/linux/device-mapper.h b/include/linux/device-mapper.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/linux/device-mapper.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2001 Sistina Software (UK) Limited. + * + * This file is released under the LGPL. + */ + +#ifndef _LINUX_DEVICE_MAPPER_H +#define _LINUX_DEVICE_MAPPER_H + +#define DM_DIR "mapper" /* Slashes not supported */ +#define DM_MAX_TYPE_NAME 16 +#define DM_NAME_LEN 128 +#define DM_UUID_LEN 129 + +#ifdef __KERNEL__ + +struct dm_target; +struct dm_table; +struct dm_dev; + +typedef enum { STATUSTYPE_INFO, STATUSTYPE_TABLE } status_type_t; + +/* + * In the constructor the target parameter will already have the + * table, type, begin and len fields filled in. + */ +typedef int (*dm_ctr_fn) (struct dm_target *target, int argc, char **argv); + +/* + * The destructor doesn't need to free the dm_target, just + * anything hidden ti->private. + */ +typedef void (*dm_dtr_fn) (struct dm_target *ti); + +/* + * The map function must return: + * < 0: error + * = 0: The target will handle the io by resubmitting it later + * > 0: simple remap complete + */ +typedef int (*dm_map_fn) (struct dm_target *ti, struct bio *bio); +typedef int (*dm_status_fn) (struct dm_target *ti, status_type_t status_type, + char *result, int maxlen); + +void dm_error(const char *message); + +/* + * Constructors should call these functions to ensure destination devices + * are opened/closed correctly. + * FIXME: too many arguments. + */ +int dm_get_device(struct dm_target *ti, const char *path, sector_t start, + sector_t len, int mode, struct dm_dev **result); +void dm_put_device(struct dm_target *ti, struct dm_dev *d); + +/* + * Information about a target type + */ +struct target_type { + const char *name; + struct module *module; + dm_ctr_fn ctr; + dm_dtr_fn dtr; + dm_map_fn map; + dm_status_fn status; +}; + +struct io_restrictions { + unsigned short max_sectors; + unsigned short max_phys_segments; + unsigned short max_hw_segments; + unsigned short hardsect_size; + unsigned int max_segment_size; + unsigned long seg_boundary_mask; +}; + +struct dm_target { + struct dm_table *table; + struct target_type *type; + + /* target limits */ + sector_t begin; + sector_t len; + + /* FIXME: turn this into a mask, and merge with io_restrictions */ + sector_t split_io; + + /* + * These are automaticall filled in by + * dm_table_get_device. + */ + struct io_restrictions limits; + + /* target specific data */ + void *private; + + /* Used to provide an error string from the ctr */ + char *error; +}; + +int dm_register_target(struct target_type *t); +int dm_unregister_target(struct target_type *t); + +#endif /* __KERNEL__ */ + +#endif /* _LINUX_DEVICE_MAPPER_H */ diff -Nru a/include/linux/device.h b/include/linux/device.h --- a/include/linux/device.h Mon Oct 28 16:32:37 2002 +++ b/include/linux/device.h Mon Oct 28 16:32:37 2002 @@ -187,6 +187,8 @@ int (*add_device)(struct device *); void (*remove_device)(struct device *); + int (*hotplug)(struct device *dev, char **envp, + int num_envp, char *buffer, int buffer_size); }; extern int devclass_register(struct device_class *); diff -Nru a/include/linux/dm-ioctl.h b/include/linux/dm-ioctl.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/linux/dm-ioctl.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2001 Sistina Software (UK) Limited. + * + * This file is released under the LGPL. + */ + +#ifndef _LINUX_DM_IOCTL_H +#define _LINUX_DM_IOCTL_H + +#include +#include + +/* + * Implements a traditional ioctl interface to the device mapper. + */ + +/* + * All ioctl arguments consist of a single chunk of memory, with + * this structure at the start. If a uuid is specified any + * lookup (eg. for a DM_INFO) will be done on that, *not* the + * name. + */ +struct dm_ioctl { + /* + * The version number is made up of three parts: + * major - no backward or forward compatibility, + * minor - only backwards compatible, + * patch - both backwards and forwards compatible. + * + * All clients of the ioctl interface should fill in the + * version number of the interface that they were + * compiled with. + * + * All recognised ioctl commands (ie. those that don't + * return -ENOTTY) fill out this field, even if the + * command failed. + */ + uint32_t version[3]; /* in/out */ + uint32_t data_size; /* total size of data passed in + * including this struct */ + + uint32_t data_start; /* offset to start of data + * relative to start of this struct */ + + uint32_t target_count; /* in/out */ + uint32_t open_count; /* out */ + uint32_t flags; /* in/out */ + + __kernel_dev_t dev; /* in/out */ + + char name[DM_NAME_LEN]; /* device name */ + char uuid[DM_UUID_LEN]; /* unique identifier for + * the block device */ +}; + +/* + * Used to specify tables. These structures appear after the + * dm_ioctl. + */ +struct dm_target_spec { + int32_t status; /* used when reading from kernel only */ + uint64_t sector_start; + uint32_t length; + + /* + * Offset in bytes (from the start of this struct) to + * next target_spec. + */ + uint32_t next; + + char target_type[DM_MAX_TYPE_NAME]; + + /* + * Parameter string starts immediately after this object. + * Be careful to add padding after string to ensure correct + * alignment of subsequent dm_target_spec. + */ +}; + +/* + * Used to retrieve the target dependencies. + */ +struct dm_target_deps { + uint32_t count; + + __kernel_dev_t dev[0]; /* out */ +}; + +/* + * If you change this make sure you make the corresponding change + * to dm-ioctl.c:lookup_ioctl() + */ +enum { + /* Top level cmds */ + DM_VERSION_CMD = 0, + DM_REMOVE_ALL_CMD, + + /* device level cmds */ + DM_DEV_CREATE_CMD, + DM_DEV_REMOVE_CMD, + DM_DEV_RELOAD_CMD, + DM_DEV_RENAME_CMD, + DM_DEV_SUSPEND_CMD, + DM_DEV_DEPS_CMD, + DM_DEV_STATUS_CMD, + + /* target level cmds */ + DM_TARGET_STATUS_CMD, + DM_TARGET_WAIT_CMD +}; + +#define DM_IOCTL 0xfd + +#define DM_VERSION _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl) +#define DM_REMOVE_ALL _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl) + +#define DM_DEV_CREATE _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl) +#define DM_DEV_REMOVE _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl) +#define DM_DEV_RELOAD _IOWR(DM_IOCTL, DM_DEV_RELOAD_CMD, struct dm_ioctl) +#define DM_DEV_SUSPEND _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl) +#define DM_DEV_RENAME _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl) +#define DM_DEV_DEPS _IOWR(DM_IOCTL, DM_DEV_DEPS_CMD, struct dm_ioctl) +#define DM_DEV_STATUS _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl) + +#define DM_TARGET_STATUS _IOWR(DM_IOCTL, DM_TARGET_STATUS_CMD, struct dm_ioctl) +#define DM_TARGET_WAIT _IOWR(DM_IOCTL, DM_TARGET_WAIT_CMD, struct dm_ioctl) + +#define DM_VERSION_MAJOR 1 +#define DM_VERSION_MINOR 0 +#define DM_VERSION_PATCHLEVEL 6 +#define DM_VERSION_EXTRA "-ioctl (2002-10-15)" + +/* Status bits */ +#define DM_READONLY_FLAG 0x00000001 +#define DM_SUSPEND_FLAG 0x00000002 +#define DM_EXISTS_FLAG 0x00000004 +#define DM_PERSISTENT_DEV_FLAG 0x00000008 + +/* + * Flag passed into ioctl STATUS command to get table information + * rather than current status. + */ +#define DM_STATUS_TABLE_FLAG 0x00000010 + +#endif /* _LINUX_DM_IOCTL_H */ diff -Nru a/include/linux/dvb/audio.h b/include/linux/dvb/audio.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/linux/dvb/audio.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,124 @@ +/* + * audio.h + * + * Copyright (C) 2000 Ralph Metzler + * & Marcus Metzler + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Lesser Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVBAUDIO_H_ +#define _DVBAUDIO_H_ + +#ifdef __KERNEL__ +#include +#else +#include +#endif + + +typedef enum { + AUDIO_SOURCE_DEMUX, /* Select the demux as the main source */ + AUDIO_SOURCE_MEMORY /* Select internal memory as the main source */ +} audio_stream_source_t; + + +typedef enum { + AUDIO_STOPPED, /* Device is stopped */ + AUDIO_PLAYING, /* Device is currently playing */ + AUDIO_PAUSED /* Device is paused */ +} audio_play_state_t; + + +typedef enum { + AUDIO_STEREO, + AUDIO_MONO_LEFT, + AUDIO_MONO_RIGHT, +} audio_channel_select_t; + + +typedef struct audio_status { + int AV_sync_state; /* sync audio and video? */ + int mute_state; /* audio is muted */ + audio_play_state_t play_state; /* current playback state */ + audio_stream_source_t stream_source; /* current stream source */ + audio_channel_select_t channel_select; /* currently selected channel */ + int bypass_mode; /* pass on audio data to */ +} audio_status_t; /* separate decoder hardware */ + + +typedef struct audio_mixer { + unsigned int volume_left; + unsigned int volume_right; + // what else do we need? bass, pass-through, ... +} audio_mixer_t; + + +typedef +struct audio_karaoke{ /* if Vocal1 or Vocal2 are non-zero, they get mixed */ + int vocal1; /* into left and right t at 70% each */ + int vocal2; /* if both, Vocal1 and Vocal2 are non-zero, Vocal1 gets*/ + int melody; /* mixed into the left channel and */ + /* Vocal2 into the right channel at 100% each. */ + /* if Melody is non-zero, the melody channel gets mixed*/ +} audio_karaoke_t; /* into left and right */ + + +typedef uint16_t audio_attributes_t; +/* bits: descr. */ +/* 15-13 audio coding mode (0=ac3, 2=mpeg1, 3=mpeg2ext, 4=LPCM, 6=DTS, */ +/* 12 multichannel extension */ +/* 11-10 audio type (0=not spec, 1=language included) */ +/* 9- 8 audio application mode (0=not spec, 1=karaoke, 2=surround) */ +/* 7- 6 Quantization / DRC (mpeg audio: 1=DRC exists)(lpcm: 0=16bit, */ +/* 5- 4 Sample frequency fs (0=48kHz, 1=96kHz) */ +/* 2- 0 number of audio channels (n+1 channels) */ + + +/* for GET_CAPABILITIES and SET_FORMAT, the latter should only set one bit */ +#define AUDIO_CAP_DTS 1 +#define AUDIO_CAP_LPCM 2 +#define AUDIO_CAP_MP1 4 +#define AUDIO_CAP_MP2 8 +#define AUDIO_CAP_MP3 16 +#define AUDIO_CAP_AAC 32 +#define AUDIO_CAP_OGG 64 +#define AUDIO_CAP_SDDS 128 +#define AUDIO_CAP_AC3 256 + +#define AUDIO_STOP _IO('o', 1) +#define AUDIO_PLAY _IO('o', 2) +#define AUDIO_PAUSE _IO('o', 3) +#define AUDIO_CONTINUE _IO('o', 4) +#define AUDIO_SELECT_SOURCE _IO('o', 5) +#define AUDIO_SET_MUTE _IO('o', 6) +#define AUDIO_SET_AV_SYNC _IO('o', 7) +#define AUDIO_SET_BYPASS_MODE _IO('o', 8) +#define AUDIO_CHANNEL_SELECT _IO('o', 9) +#define AUDIO_GET_STATUS _IOR('o', 10, audio_status_t) + +#define AUDIO_GET_CAPABILITIES _IOR('o', 11, unsigned int) +#define AUDIO_CLEAR_BUFFER _IO('o', 12) +#define AUDIO_SET_ID _IO('o', 13) +#define AUDIO_SET_MIXER _IOW('o', 14, audio_mixer_t) +#define AUDIO_SET_STREAMTYPE _IO('o', 15) +#define AUDIO_SET_EXT_ID _IO('o', 16) +#define AUDIO_SET_ATTRIBUTES _IOW('o', 17, audio_attributes_t) +#define AUDIO_SET_KARAOKE _IOW('o', 18, audio_karaoke_t) + +#endif /* _DVBAUDIO_H_ */ + diff -Nru a/include/linux/dvb/ca.h b/include/linux/dvb/ca.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/linux/dvb/ca.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,84 @@ +/* + * ca.h + * + * Copyright (C) 2000 Ralph Metzler + * & Marcus Metzler + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Lesser Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _CA_H_ +#define _CA_H_ + +/* slot interface types and info */ + +typedef struct ca_slot_info_s { + int num; /* slot number */ + + int type; /* CA interface this slot supports */ +#define CA_CI 1 /* CI high level interface */ +#define CA_CI_LINK 2 /* CI link layer level interface */ +#define CA_CI_PHYS 4 /* CI physical layer level interface */ +#define CA_SC 128 /* simple smart card interface */ + + unsigned int flags; +#define CA_CI_MODULE_PRESENT 1 /* module (or card) inserted */ +#define CA_CI_MODULE_READY 2 +} ca_slot_info_t; + + +/* descrambler types and info */ + +typedef struct ca_descr_info_s { + unsigned int num; /* number of available descramblers (keys) */ + unsigned int type; /* type of supported scrambling system */ +#define CA_ECD 1 +#define CA_NDS 2 +#define CA_DSS 4 +} ca_descr_info_t; + +typedef struct ca_cap_s { + unsigned int slot_num; /* total number of CA card and module slots */ + unsigned int slot_type; /* OR of all supported types */ + unsigned int descr_num; /* total number of descrambler slots (keys) */ + unsigned int descr_type; /* OR of all supported types */ +} ca_cap_t; + +/* a message to/from a CI-CAM */ +typedef struct ca_msg_s { + unsigned int index; + unsigned int type; + unsigned int length; + unsigned char msg[256]; +} ca_msg_t; + +typedef struct ca_descr_s { + unsigned int index; + unsigned int parity; + unsigned char cw[8]; +} ca_descr_t; + +#define CA_RESET _IO('o', 128) +#define CA_GET_CAP _IOR('o', 129, ca_cap_t) +#define CA_GET_SLOT_INFO _IOR('o', 130, ca_slot_info_t) +#define CA_GET_DESCR_INFO _IOR('o', 131, ca_descr_info_t) +#define CA_GET_MSG _IOR('o', 132, ca_msg_t) +#define CA_SEND_MSG _IOW('o', 133, ca_msg_t) +#define CA_SET_DESCR _IOW('o', 134, ca_descr_t) + +#endif + diff -Nru a/include/linux/dvb/dmx.h b/include/linux/dvb/dmx.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/linux/dvb/dmx.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,172 @@ +/* + * dmx.h + * + * Copyright (C) 2000 Marcus Metzler + * & Ralph Metzler + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DMX_H_ +#define _DMX_H_ + +#ifdef __KERNEL__ +#include +#else +#include +#endif + +#define DMX_FILTER_SIZE 16 + +typedef enum +{ + DMX_OUT_DECODER, /* Streaming directly to decoder. */ + DMX_OUT_TAP, /* Output going to a memory buffer */ + /* (to be retrieved via the read command).*/ + DMX_OUT_TS_TAP /* Output multiplexed into a new TS */ + /* (to be retrieved by reading from the */ + /* logical DVR device). */ +} dmx_output_t; + + +typedef enum +{ + DMX_IN_FRONTEND, /* Input from a front-end device. */ + DMX_IN_DVR /* Input from the logical DVR device. */ +} dmx_input_t; + + +typedef enum +{ + DMX_PES_AUDIO0, + DMX_PES_VIDEO0, + DMX_PES_TELETEXT0, + DMX_PES_SUBTITLE0, + DMX_PES_PCR0, + + DMX_PES_AUDIO1, + DMX_PES_VIDEO1, + DMX_PES_TELETEXT1, + DMX_PES_SUBTITLE1, + DMX_PES_PCR1, + + DMX_PES_AUDIO2, + DMX_PES_VIDEO2, + DMX_PES_TELETEXT2, + DMX_PES_SUBTITLE2, + DMX_PES_PCR2, + + DMX_PES_AUDIO3, + DMX_PES_VIDEO3, + DMX_PES_TELETEXT3, + DMX_PES_SUBTITLE3, + DMX_PES_PCR3, + + DMX_PES_OTHER +} dmx_pes_type_t; + +#define DMX_PES_AUDIO DMX_PES_AUDIO0 +#define DMX_PES_VIDEO DMX_PES_VIDEO0 +#define DMX_PES_TELETEXT DMX_PES_TELETEXT0 +#define DMX_PES_SUBTITLE DMX_PES_SUBTITLE0 +#define DMX_PES_PCR DMX_PES_PCR0 + + +typedef enum +{ + DMX_SCRAMBLING_EV, + DMX_FRONTEND_EV +} dmx_event_t; + + +typedef enum +{ + DMX_SCRAMBLING_OFF, + DMX_SCRAMBLING_ON +} dmx_scrambling_status_t; + + +typedef struct dmx_filter +{ + uint8_t filter[DMX_FILTER_SIZE]; + uint8_t mask[DMX_FILTER_SIZE]; + uint8_t mode[DMX_FILTER_SIZE]; +} dmx_filter_t; + + +struct dmx_sct_filter_params +{ + uint16_t pid; + dmx_filter_t filter; + uint32_t timeout; + uint32_t flags; +#define DMX_CHECK_CRC 1 +#define DMX_ONESHOT 2 +#define DMX_IMMEDIATE_START 4 +#define DMX_KERNEL_CLIENT 0x8000 +}; + + +struct dmx_pes_filter_params +{ + uint16_t pid; + dmx_input_t input; + dmx_output_t output; + dmx_pes_type_t pes_type; + uint32_t flags; +}; + + +struct dmx_event +{ + dmx_event_t event; + time_t timeStamp; + union + { + dmx_scrambling_status_t scrambling; + } u; +}; + +typedef struct dmx_caps { + uint32_t caps; + int num_decoders; +} dmx_caps_t; + +typedef enum { + DMX_SOURCE_FRONT0 = 0, + DMX_SOURCE_FRONT1, + DMX_SOURCE_FRONT2, + DMX_SOURCE_FRONT3, + DMX_SOURCE_DVR0 = 16, + DMX_SOURCE_DVR1, + DMX_SOURCE_DVR2, + DMX_SOURCE_DVR3, +} dmx_source_t; + + +#define DMX_START _IO('o',41) +#define DMX_STOP _IO('o',42) +#define DMX_SET_FILTER _IOW('o',43,struct dmx_sct_filter_params) +#define DMX_SET_PES_FILTER _IOW('o',44,struct dmx_pes_filter_params) +#define DMX_SET_BUFFER_SIZE _IO('o',45) +#define DMX_GET_EVENT _IOR('o',46,struct dmx_event) +#define DMX_GET_PES_PIDS _IOR('o',47,uint16_t) +#define DMX_GET_CAPS _IOR('o',48,dmx_caps_t) +#define DMX_SET_SOURCE _IOW('o',49,dmx_source_t) + +#endif /*_DMX_H_*/ + diff -Nru a/include/linux/dvb/frontend.h b/include/linux/dvb/frontend.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/linux/dvb/frontend.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,261 @@ +/* + * frontend.h + * + * Copyright (C) 2000 Marcus Metzler + * Ralph Metzler + * Holger Waechtler + * Andre Draszik + * for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _FRONTEND_H_ +#define _FRONTEND_H_ + +#ifdef __KERNEL__ +#include +#else +#include +#endif + + +typedef enum { + FE_QPSK, + FE_QAM, + FE_OFDM +} fe_type_t; + + +typedef enum { + FE_IS_STUPID = 0, + FE_CAN_INVERSION_AUTO = 0x1, + FE_CAN_FEC_1_2 = 0x2, + FE_CAN_FEC_2_3 = 0x4, + FE_CAN_FEC_3_4 = 0x8, + FE_CAN_FEC_4_5 = 0x10, + FE_CAN_FEC_5_6 = 0x20, + FE_CAN_FEC_6_7 = 0x40, + FE_CAN_FEC_7_8 = 0x80, + FE_CAN_FEC_8_9 = 0x100, + FE_CAN_FEC_AUTO = 0x200, + FE_CAN_QPSK = 0x400, + FE_CAN_QAM_16 = 0x800, + FE_CAN_QAM_32 = 0x1000, + FE_CAN_QAM_64 = 0x2000, + FE_CAN_QAM_128 = 0x4000, + FE_CAN_QAM_256 = 0x8000, + FE_CAN_QAM_AUTO = 0x10000, + FE_CAN_TRANSMISSION_MODE_AUTO = 0x20000, + FE_CAN_BANDWIDTH_AUTO = 0x40000, + FE_CAN_GUARD_INTERVAL_AUTO = 0x80000, + FE_CAN_HIERARCHY_AUTO = 0x100000, + FE_CAN_MUTE_TS = 0x80000000 +} fe_caps_t; + + +struct dvb_frontend_info { + char name[128]; + fe_type_t type; + uint32_t frequency_min; + uint32_t frequency_max; + uint32_t frequency_stepsize; + uint32_t frequency_tolerance; + uint32_t symbol_rate_min; + uint32_t symbol_rate_max; + uint32_t symbol_rate_tolerance; /* ppm */ + uint32_t notifier_delay; /* ms */ + fe_caps_t caps; +}; + + +/** + * Check out the DiSEqC bus spec available on http://www.eutelsat.org/ for + * the meaning of this struct... + */ +struct dvb_diseqc_master_cmd { + uint8_t msg [6]; /* { framing, address, command, data [3] } */ + uint8_t msg_len; /* valid values are 3...6 */ +}; + + +struct dvb_diseqc_slave_reply { + uint8_t msg [4]; /* { framing, data [3] } */ + uint8_t msg_len; /* valid values are 0...4, 0 means no msg */ + int timeout; /* return from ioctl after timeout ms with */ +}; /* errorcode when no message was received */ + + +typedef enum { + SEC_VOLTAGE_13, + SEC_VOLTAGE_18 +} fe_sec_voltage_t; + + +typedef enum { + SEC_TONE_ON, + SEC_TONE_OFF +} fe_sec_tone_mode_t; + + +typedef enum { + SEC_MINI_A, + SEC_MINI_B +} fe_sec_mini_cmd_t; + + +typedef enum { + FE_HAS_SIGNAL = 0x01, /* found something above the noise level */ + FE_HAS_CARRIER = 0x02, /* found a DVB signal */ + FE_HAS_VITERBI = 0x04, /* FEC is stable */ + FE_HAS_SYNC = 0x08, /* found sync bytes */ + FE_HAS_LOCK = 0x10, /* everything's working... */ + FE_TIMEDOUT = 0x20, /* no lock within the last ~2 seconds */ + FE_REINIT = 0x40 /* frontend was reinitialized, */ +} fe_status_t; /* application is recommned to reset */ + /* DiSEqC, tone and parameters */ + +typedef enum { + INVERSION_OFF, + INVERSION_ON, + INVERSION_AUTO +} fe_spectral_inversion_t; + + +typedef enum { + FEC_NONE = 0, + FEC_1_2, + FEC_2_3, + FEC_3_4, + FEC_4_5, + FEC_5_6, + FEC_6_7, + FEC_7_8, + FEC_8_9, + FEC_AUTO +} fe_code_rate_t; + + +typedef enum { + QPSK, + QAM_16, + QAM_32, + QAM_64, + QAM_128, + QAM_256, + QAM_AUTO +} fe_modulation_t; + + +typedef enum { + TRANSMISSION_MODE_2K, + TRANSMISSION_MODE_8K, + TRANSMISSION_MODE_AUTO +} fe_transmit_mode_t; + +typedef enum { + BANDWIDTH_8_MHZ, + BANDWIDTH_7_MHZ, + BANDWIDTH_6_MHZ, + BANDWIDTH_AUTO +} fe_bandwidth_t; + + +typedef enum { + GUARD_INTERVAL_1_32, + GUARD_INTERVAL_1_16, + GUARD_INTERVAL_1_8, + GUARD_INTERVAL_1_4, + GUARD_INTERVAL_AUTO +} fe_guard_interval_t; + + +typedef enum { + HIERARCHY_NONE, + HIERARCHY_1, + HIERARCHY_2, + HIERARCHY_4, + HIERARCHY_AUTO +} fe_hierarchy_t; + + +struct dvb_qpsk_parameters { + uint32_t symbol_rate; /* symbol rate in Symbols per second */ + fe_code_rate_t fec_inner; /* forward error correction (see above) */ +}; + + +struct dvb_qam_parameters { + uint32_t symbol_rate; /* symbol rate in Symbols per second */ + fe_code_rate_t fec_inner; /* forward error correction (see above) */ + fe_modulation_t modulation; /* modulation type (see above) */ +}; + + +struct dvb_ofdm_parameters { + fe_bandwidth_t bandwidth; + fe_code_rate_t code_rate_HP; /* high priority stream code rate */ + fe_code_rate_t code_rate_LP; /* low priority stream code rate */ + fe_modulation_t constellation; /* modulation type (see above) */ + fe_transmit_mode_t transmission_mode; + fe_guard_interval_t guard_interval; + fe_hierarchy_t hierarchy_information; +}; + + +struct dvb_frontend_parameters { + uint32_t frequency; /* (absolute) frequency in Hz for QAM/OFDM */ + /* intermediate frequency in kHz for QPSK */ + fe_spectral_inversion_t inversion; + union { + struct dvb_qpsk_parameters qpsk; + struct dvb_qam_parameters qam; + struct dvb_ofdm_parameters ofdm; + } u; +}; + + +struct dvb_frontend_event { + fe_status_t status; + struct dvb_frontend_parameters parameters; +}; + + + +#define FE_GET_INFO _IOR('o', 61, struct dvb_frontend_info) + +#define FE_DISEQC_RESET_OVERLOAD _IO('o', 62) +#define FE_DISEQC_SEND_MASTER_CMD _IOW('o', 63, struct dvb_diseqc_master_cmd) +#define FE_DISEQC_RECV_SLAVE_REPLY _IOR('o', 64, struct dvb_diseqc_slave_reply) +#define FE_DISEQC_SEND_BURST _IO('o', 65) /* fe_sec_mini_cmd_t */ + +#define FE_SET_TONE _IO('o', 66) /* fe_sec_tone_mode_t */ +#define FE_SET_VOLTAGE _IO('o', 67) /* fe_sec_voltage_t */ +#define FE_ENABLE_HIGH_LNB_VOLTAGE _IO('o', 68) /* int */ + +#define FE_READ_STATUS _IOR('o', 69, fe_status_t) +#define FE_READ_BER _IOR('o', 70, uint32_t) +#define FE_READ_SIGNAL_STRENGTH _IOR('o', 71, uint16_t) +#define FE_READ_SNR _IOR('o', 72, uint16_t) +#define FE_READ_UNCORRECTED_BLOCKS _IOR('o', 73, uint32_t) + +#define FE_SET_FRONTEND _IOW('o', 76, struct dvb_frontend_parameters) +#define FE_GET_FRONTEND _IOR('o', 77, struct dvb_frontend_parameters) +#define FE_GET_EVENT _IOR('o', 78, struct dvb_frontend_event) + + +#endif /*_FRONTEND_H_*/ + diff -Nru a/include/linux/dvb/net.h b/include/linux/dvb/net.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/linux/dvb/net.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,44 @@ +/* + * net.h + * + * Copyright (C) 2000 Marcus Metzler + * & Ralph Metzler + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVBNET_H_ +#define _DVBNET_H_ + +#ifdef __KERNEL__ +#include +#else +#include +#endif + + +struct dvb_net_if { + uint16_t pid; + uint16_t if_num; +}; + + +#define NET_ADD_IF _IOWR('o', 52, struct dvb_net_if) +#define NET_REMOVE_IF _IO('o', 53) + +#endif /*_DVBNET_H_*/ + diff -Nru a/include/linux/dvb/osd.h b/include/linux/dvb/osd.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/linux/dvb/osd.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,110 @@ +/* + * osd.h + * + * Copyright (C) 2001 Ralph Metzler + * & Marcus Metzler + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Lesser Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVBOSD_H_ +#define _DVBOSD_H_ + +typedef enum { + // All functions return -2 on "not open" + OSD_Close = 1, // () + // Disables OSD and releases the buffers + // returns 0 on success + OSD_Open, // (x0,y0,x1,y1,BitPerPixel[2/4/8](color&0x0F),mix[0..15](color&0xF0)) + // Opens OSD with this size and bit depth + // returns 0 on success, -1 on DRAM allocation error, -2 on "already open" + OSD_Show, // () + // enables OSD mode + // returns 0 on success + OSD_Hide, // () + // disables OSD mode + // returns 0 on success + OSD_Clear, // () + // Sets all pixel to color 0 + // returns 0 on success + OSD_Fill, // (color) + // Sets all pixel to color + // returns 0 on success + OSD_SetColor, // (color,R{x0},G{y0},B{x1},opacity{y1}) + // set palette entry to , and apply + // R,G,B: 0..255 + // R=Red, G=Green, B=Blue + // opacity=0: pixel opacity 0% (only video pixel shows) + // opacity=1..254: pixel opacity as specified in header + // opacity=255: pixel opacity 100% (only OSD pixel shows) + // returns 0 on success, -1 on error + OSD_SetPalette, // (firstcolor{color},lastcolor{x0},data) + // Set a number of entries in the palette + // sets the entries "firstcolor" through "lastcolor" from the array "data" + // data has 4 byte for each color: + // R,G,B, and a opacity value: 0->transparent, 1..254->mix, 255->pixel + OSD_SetTrans, // (transparency{color}) + // Sets transparency of mixed pixel (0..15) + // returns 0 on success + OSD_SetPixel, // (x0,y0,color) + // sets pixel , to color number + // returns 0 on success, -1 on error + OSD_GetPixel, // (x0,y0) + // returns color number of pixel ,, or -1 + OSD_SetRow, // (x0,y0,x1,data) + // fills pixels x0,y through x1,y with the content of data[] + // returns 0 on success, -1 on clipping all pixel (no pixel drawn) + OSD_SetBlock, // (x0,y0,x1,y1,increment{color},data) + // fills pixels x0,y0 through x1,y1 with the content of data[] + // inc contains the width of one line in the data block, + // inc<=0 uses blockwidth as linewidth + // returns 0 on success, -1 on clipping all pixel + OSD_FillRow, // (x0,y0,x1,color) + // fills pixels x0,y through x1,y with the color + // returns 0 on success, -1 on clipping all pixel + OSD_FillBlock, // (x0,y0,x1,y1,color) + // fills pixels x0,y0 through x1,y1 with the color + // returns 0 on success, -1 on clipping all pixel + OSD_Line, // (x0,y0,x1,y1,color) + // draw a line from x0,y0 to x1,y1 with the color + // returns 0 on success + OSD_Query, // (x0,y0,x1,y1,xasp{color}}), yasp=11 + // fills parameters with the picture dimensions and the pixel aspect ratio + // returns 0 on success + OSD_Test, // () + // draws a test picture. for debugging purposes only + // returns 0 on success +// TODO: remove "test" in final version + OSD_Text, // (x0,y0,size,color,text) + OSD_SetWindow, // (x0) set window with number 0 + * & Ralph Metzler + for convergence integrated media GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _DVBVIDEO_H_ +#define _DVBVIDEO_H_ + +#ifdef __KERNEL__ +#include +#else +#include +#endif + + +typedef enum { + VIDEO_FORMAT_4_3, /* Select 4:3 format */ + VIDEO_FORMAT_16_9 /* Select 16:9 format. */ +} video_format_t; + + +typedef enum { + VIDEO_SYSTEM_PAL, + VIDEO_SYSTEM_NTSC, + VIDEO_SYSTEM_PALN, + VIDEO_SYSTEM_PALNc, + VIDEO_SYSTEM_PALM, + VIDEO_SYSTEM_NTSC60, + VIDEO_SYSTEM_PAL60, + VIDEO_SYSTEM_PALM60 +} video_system_t; + + +typedef enum { + VIDEO_PAN_SCAN, /* use pan and scan format */ + VIDEO_LETTER_BOX, /* use letterbox format */ + VIDEO_CENTER_CUT_OUT /* use center cut out format */ +} video_displayformat_t; + + +typedef enum { + VIDEO_SOURCE_DEMUX, /* Select the demux as the main source */ + VIDEO_SOURCE_MEMORY /* If this source is selected, the stream + comes from the user through the write + system call */ +} video_stream_source_t; + + +typedef enum { + VIDEO_STOPPED, /* Video is stopped */ + VIDEO_PLAYING, /* Video is currently playing */ + VIDEO_FREEZED /* Video is freezed */ +} video_play_state_t; + + +struct video_event { + int32_t type; + time_t timestamp; + union { + video_format_t video_format; + } u; +}; + + +struct video_status { + int video_blank; /* blank video on freeze? */ + video_play_state_t play_state; /* current state of playback */ + video_stream_source_t stream_source; /* current source (demux/memory) */ + video_format_t video_format; /* current aspect ratio of stream*/ + video_displayformat_t display_format;/* selected cropping mode */ +}; + + +struct video_still_picture { + char *iFrame; /* pointer to a single iframe in memory */ + int32_t size; +}; + + +typedef +struct video_highlight { + int active; /* 1=show highlight, 0=hide highlight */ + uint8_t contrast1; /* 7- 4 Pattern pixel contrast */ + /* 3- 0 Background pixel contrast */ + uint8_t contrast2; /* 7- 4 Emphasis pixel-2 contrast */ + /* 3- 0 Emphasis pixel-1 contrast */ + uint8_t color1; /* 7- 4 Pattern pixel color */ + /* 3- 0 Background pixel color */ + uint8_t color2; /* 7- 4 Emphasis pixel-2 color */ + /* 3- 0 Emphasis pixel-1 color */ + uint32_t ypos; /* 23-22 auto action mode */ + /* 21-12 start y */ + /* 9- 0 end y */ + uint32_t xpos; /* 23-22 button color number */ + /* 21-12 start x */ + /* 9- 0 end x */ +} video_highlight_t; + + +typedef struct video_spu { + int active; + int stream_id; +} video_spu_t; + + +typedef struct video_spu_palette { /* SPU Palette information */ + int length; + uint8_t *palette; +} video_spu_palette_t; + + +typedef struct video_navi_pack { + int length; /* 0 ... 1024 */ + uint8_t data[1024]; +} video_navi_pack_t; + + +typedef uint16_t video_attributes_t; +/* bits: descr. */ +/* 15-14 Video compression mode (0=MPEG-1, 1=MPEG-2) */ +/* 13-12 TV system (0=525/60, 1=625/50) */ +/* 11-10 Aspect ratio (0=4:3, 3=16:9) */ +/* 9- 8 permitted display mode on 4:3 monitor (0=both, 1=only pan-sca */ +/* 7 line 21-1 data present in GOP (1=yes, 0=no) */ +/* 6 line 21-2 data present in GOP (1=yes, 0=no) */ +/* 5- 3 source resolution (0=720x480/576, 1=704x480/576, 2=352x480/57 */ +/* 2 source letterboxed (1=yes, 0=no) */ +/* 0 film/camera mode (0=camera, 1=film (625/50 only)) */ + + +/* bit definitions for capabilities: */ +/* can the hardware decode MPEG1 and/or MPEG2? */ +#define VIDEO_CAP_MPEG1 1 +#define VIDEO_CAP_MPEG2 2 +/* can you send a system and/or program stream to video device? + (you still have to open the video and the audio device but only + send the stream to the video device) */ +#define VIDEO_CAP_SYS 4 +#define VIDEO_CAP_PROG 8 +/* can the driver also handle SPU, NAVI and CSS encoded data? + (CSS API is not present yet) */ +#define VIDEO_CAP_SPU 16 +#define VIDEO_CAP_NAVI 32 +#define VIDEO_CAP_CSS 64 + + +#define VIDEO_STOP _IO('o', 21) +#define VIDEO_PLAY _IO('o', 22) +#define VIDEO_FREEZE _IO('o', 23) +#define VIDEO_CONTINUE _IO('o', 24) +#define VIDEO_SELECT_SOURCE _IO('o', 25) +#define VIDEO_SET_BLANK _IO('o', 26) +#define VIDEO_GET_STATUS _IOR('o', 27, struct video_status) +#define VIDEO_GET_EVENT _IOR('o', 28, struct video_event) +#define VIDEO_SET_DISPLAY_FORMAT _IO('o', 29) +#define VIDEO_STILLPICTURE _IOW('o', 30, struct video_still_picture) +#define VIDEO_FAST_FORWARD _IO('o', 31) +#define VIDEO_SLOWMOTION _IO('o', 32) +#define VIDEO_GET_CAPABILITIES _IOR('o', 33, unsigned int) +#define VIDEO_CLEAR_BUFFER _IO('o', 34) +#define VIDEO_SET_ID _IO('o', 35) +#define VIDEO_SET_STREAMTYPE _IO('o', 36) +#define VIDEO_SET_FORMAT _IO('o', 37) +#define VIDEO_SET_SYSTEM _IO('o', 38) +#define VIDEO_SET_HIGHLIGHT _IOW('o', 39, video_highlight_t) +#define VIDEO_SET_SPU _IOW('o', 50, video_spu_t) +#define VIDEO_SET_SPU_PALETTE _IOW('o', 51, video_spu_palette_t) +#define VIDEO_GET_NAVI _IOR('o', 52, video_navi_pack_t) +#define VIDEO_SET_ATTRIBUTES _IO('o', 53) + +#endif /*_DVBVIDEO_H_*/ + diff -Nru a/include/linux/elevator.h b/include/linux/elevator.h --- a/include/linux/elevator.h Mon Oct 28 16:32:35 2002 +++ b/include/linux/elevator.h Mon Oct 28 16:32:35 2002 @@ -40,8 +40,8 @@ /* * block elevator interface */ -extern void __elv_add_request(request_queue_t *, struct request *, - struct list_head *); +extern void elv_add_request(request_queue_t *, struct request *, int, int); +extern void __elv_add_request(request_queue_t *, struct request *, int, int); extern int elv_merge(request_queue_t *, struct list_head **, struct bio *); extern void elv_merge_requests(request_queue_t *, struct request *, struct request *); @@ -49,6 +49,9 @@ extern void elv_remove_request(request_queue_t *, struct request *); extern int elv_queue_empty(request_queue_t *); extern inline struct list_head *elv_get_sort_head(request_queue_t *, struct request *); + +#define __elv_add_request_pos(q, rq, pos) \ + (q)->elevator.elevator_add_req_fn((q), (rq), (pos)) /* * noop I/O scheduler. always merges, always inserts new request at tail diff -Nru a/include/linux/hdlc.h b/include/linux/hdlc.h --- a/include/linux/hdlc.h Mon Oct 28 16:32:38 2002 +++ b/include/linux/hdlc.h Mon Oct 28 16:32:38 2002 @@ -12,7 +12,7 @@ #ifndef __HDLC_H #define __HDLC_H -#define GENERIC_HDLC_VERSION 3 /* For synchronization with sethdlc utility */ +#define GENERIC_HDLC_VERSION 4 /* For synchronization with sethdlc utility */ #define CLOCK_DEFAULT 0 /* Default setting */ #define CLOCK_EXT 1 /* External TX and RX clock - DTE */ diff -Nru a/include/linux/hdreg.h b/include/linux/hdreg.h --- a/include/linux/hdreg.h Mon Oct 28 16:32:36 2002 +++ b/include/linux/hdreg.h Mon Oct 28 16:32:36 2002 @@ -707,9 +707,9 @@ * 12 * 11:0 */ - unsigned short words161_175[14];/* Reserved for CFA */ - unsigned short words176_205[31];/* Current Media Serial Number */ - unsigned short words206_254[48];/* reserved words 206-254 */ + unsigned short words161_175[15];/* Reserved for CFA */ + unsigned short words176_205[30];/* Current Media Serial Number */ + unsigned short words206_254[49];/* reserved words 206-254 */ unsigned short integrity_word; /* (word 255) * 15:8 Checksum * 7:0 Signature diff -Nru a/include/linux/if.h b/include/linux/if.h --- a/include/linux/if.h Mon Oct 28 16:32:36 2002 +++ b/include/linux/if.h Mon Oct 28 16:32:36 2002 @@ -96,16 +96,20 @@ struct if_settings { unsigned int type; /* Type of physical device or protocol */ + unsigned int size; /* Size of the data allocated by the caller */ union { /* {atm/eth/dsl}_settings anyone ? */ - union hdlc_settings ifsu_hdlc; - union line_settings ifsu_line; + raw_hdlc_proto *raw_hdlc; + cisco_proto *cisco; + fr_proto *fr; + fr_proto_pvc *fr_pvc; + + /* interface settings */ + sync_serial_settings *sync; + te1_settings *te1; } ifs_ifsu; }; -#define ifs_hdlc ifs_ifsu.ifsu_hdlc -#define ifs_line ifs_ifsu.ifsu_line - /* * Interface request structure used for socket * ioctl's. All interface ioctl's must have parameter @@ -135,7 +139,7 @@ char ifru_slave[IFNAMSIZ]; /* Just fits the size */ char ifru_newname[IFNAMSIZ]; char * ifru_data; - struct if_settings *ifru_settings; + struct if_settings ifru_settings; } ifr_ifru; }; diff -Nru a/include/linux/mempool.h b/include/linux/mempool.h --- a/include/linux/mempool.h Mon Oct 28 16:32:35 2002 +++ b/include/linux/mempool.h Mon Oct 28 16:32:35 2002 @@ -27,4 +27,11 @@ extern void * mempool_alloc(mempool_t *pool, int gfp_mask); extern void mempool_free(void *element, mempool_t *pool); +/* + * A mempool_alloc_t and mempool_free_t that get the memory from + * a slab that is passed in through pool_data. + */ +void *mempool_alloc_slab(int gfp_mask, void *pool_data); +void mempool_free_slab(void *element, void *pool_data); + #endif /* _LINUX_MEMPOOL_H */ diff -Nru a/include/linux/usb.h b/include/linux/usb.h --- a/include/linux/usb.h Mon Oct 28 16:32:36 2002 +++ b/include/linux/usb.h Mon Oct 28 16:32:36 2002 @@ -1,76 +1,7 @@ #ifndef __LINUX_USB_H #define __LINUX_USB_H -/* USB constants */ - -/* - * Device and/or Interface Class codes - */ -#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ -#define USB_CLASS_AUDIO 1 -#define USB_CLASS_COMM 2 -#define USB_CLASS_HID 3 -#define USB_CLASS_PHYSICAL 5 -#define USB_CLASS_STILL_IMAGE 6 -#define USB_CLASS_PRINTER 7 -#define USB_CLASS_MASS_STORAGE 8 -#define USB_CLASS_HUB 9 -#define USB_CLASS_CDC_DATA 0x0a -#define USB_CLASS_CSCID 0x0b /* chip+ smart card */ -#define USB_CLASS_CONTENT_SEC 0x0d /* content security */ -#define USB_CLASS_APP_SPEC 0xfe -#define USB_CLASS_VENDOR_SPEC 0xff - -/* - * USB types - */ -#define USB_TYPE_MASK (0x03 << 5) -#define USB_TYPE_STANDARD (0x00 << 5) -#define USB_TYPE_CLASS (0x01 << 5) -#define USB_TYPE_VENDOR (0x02 << 5) -#define USB_TYPE_RESERVED (0x03 << 5) - -/* - * USB recipients - */ -#define USB_RECIP_MASK 0x1f -#define USB_RECIP_DEVICE 0x00 -#define USB_RECIP_INTERFACE 0x01 -#define USB_RECIP_ENDPOINT 0x02 -#define USB_RECIP_OTHER 0x03 - -/* - * USB directions - */ -#define USB_DIR_OUT 0 /* to device */ -#define USB_DIR_IN 0x80 /* to host */ - -/* - * Endpoints - */ -#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ -#define USB_ENDPOINT_DIR_MASK 0x80 - -#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ -#define USB_ENDPOINT_XFER_CONTROL 0 -#define USB_ENDPOINT_XFER_ISOC 1 -#define USB_ENDPOINT_XFER_BULK 2 -#define USB_ENDPOINT_XFER_INT 3 - -/* - * Standard requests - */ -#define USB_REQ_GET_STATUS 0x00 -#define USB_REQ_CLEAR_FEATURE 0x01 -#define USB_REQ_SET_FEATURE 0x03 -#define USB_REQ_SET_ADDRESS 0x05 -#define USB_REQ_GET_DESCRIPTOR 0x06 -#define USB_REQ_SET_DESCRIPTOR 0x07 -#define USB_REQ_GET_CONFIGURATION 0x08 -#define USB_REQ_SET_CONFIGURATION 0x09 -#define USB_REQ_GET_INTERFACE 0x0A -#define USB_REQ_SET_INTERFACE 0x0B -#define USB_REQ_SYNCH_FRAME 0x0C +#include #define USB_MAJOR 180 @@ -97,27 +28,6 @@ mdelay(ms); } -/** - * struct usb_ctrlrequest - structure used to make USB device control requests easier to create and decode - * @bRequestType: matches the USB bmRequestType field - * @bRequest: matches the USB bRequest field - * @wValue: matches the USB wValue field - * @wIndex: matches the USB wIndex field - * @wLength: matches the USB wLength field - * - * This structure is used to send control requests to a USB device. It matches - * the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the - * USB spec for a fuller description of the different fields, and what they are - * used for. - */ -struct usb_ctrlrequest { - __u8 bRequestType; - __u8 bRequest; - __u16 wValue; - __u16 wIndex; - __u16 wLength; -} __attribute__ ((packed)); - /* * USB device number allocation bitmap. There's one bitmap * per USB tree. @@ -136,18 +46,6 @@ */ /* - * Descriptor types ... USB 2.0 spec table 9.5 - */ -#define USB_DT_DEVICE 0x01 -#define USB_DT_CONFIG 0x02 -#define USB_DT_STRING 0x03 -#define USB_DT_INTERFACE 0x04 -#define USB_DT_ENDPOINT 0x05 -#define USB_DT_DEVICE_QUALIFIER 0x06 -#define USB_DT_OTHER_SPEED_CONFIG 0x07 -#define USB_DT_INTERFACE_POWER 0x08 - -/* * Descriptor sizes per descriptor type */ #define USB_DT_DEVICE_SIZE 18 @@ -163,30 +61,6 @@ #define USB_MAXINTERFACES 32 #define USB_MAXENDPOINTS 32 /* Hard limit */ -/* All standard descriptors have these 2 fields in common */ -struct usb_descriptor_header { - __u8 bLength; - __u8 bDescriptorType; -} __attribute__ ((packed)); - -/* USB_DT_DEVICE: Device descriptor */ -struct usb_device_descriptor { - __u8 bLength; - __u8 bDescriptorType; - __u16 bcdUSB; - __u8 bDeviceClass; - __u8 bDeviceSubClass; - __u8 bDeviceProtocol; - __u8 bMaxPacketSize0; - __u16 idVendor; - __u16 idProduct; - __u16 bcdDevice; - __u8 iManufacturer; - __u8 iProduct; - __u8 iSerialNumber; - __u8 bNumConfigurations; -} __attribute__ ((packed)); - /* USB_DT_ENDPOINT: Endpoint descriptor */ struct usb_endpoint_descriptor { __u8 bLength __attribute__ ((packed)); @@ -291,26 +165,6 @@ int extralen; }; -/* USB_DT_STRING: String descriptor */ -struct usb_string_descriptor { - __u8 bLength; - __u8 bDescriptorType; - __u16 wData[1]; /* UTF-16LE encoded */ -} __attribute__ ((packed)); - -/* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */ -struct usb_qualifier_descriptor { - __u8 bLength; - __u8 bDescriptorType; - __u16 bcdUSB; - __u8 bDeviceClass; - __u8 bDeviceSubClass; - __u8 bDeviceProtocol; - __u8 bMaxPacketSize0; - __u8 bNumConfigurations; - __u8 bRESERVED; -} __attribute__ ((packed)); - // FIXME remove; exported only for drivers/usb/misc/auserwald.c // prefer usb_device->epnum[0..31] extern struct usb_endpoint_descriptor * @@ -374,11 +228,7 @@ int devnum; /* Address on USB bus */ char devpath [16]; /* Use in messages: /port/port/... */ - enum { - USB_SPEED_UNKNOWN = 0, /* enumerating */ - USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */ - USB_SPEED_HIGH /* usb 2.0 */ - } speed; + enum usb_device_speed speed; /* high/full/low (or error) */ struct usb_tt *tt; /* low/full speed dev, highspeed hub */ int ttport; /* device port on that tt hub */ @@ -791,8 +641,7 @@ * @context: For use in completion functions. This normally points to * request-specific driver context. * @complete: Completion handler. This URB is passed as the parameter to the - * completion function. Except for interrupt or isochronous transfers - * that aren't being unlinked, the completion function may then do what + * completion function. The completion function may then do what * it likes with the URB, including resubmitting or freeing it. * @iso_frame_desc: Used to provide arrays of ISO transfer buffers and to * collect the transfer status for each buffer. @@ -884,11 +733,6 @@ * * When completion callback is invoked for non-isochronous URBs, the * actual_length field tells how many bytes were transferred. - * - * For interrupt URBs, the URB provided to the callback - * function is still "owned" by the USB core subsystem unless the status - * indicates that the URB has been unlinked. Completion handlers should - * not modify such URBs until they have been unlinked. * * ISO transfer status is reported in the status and actual_length fields * of the iso_frame_desc array, and the number of errors is reported in diff -Nru a/include/linux/usb_ch9.h b/include/linux/usb_ch9.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/linux/usb_ch9.h Mon Oct 28 16:32:38 2002 @@ -0,0 +1,215 @@ +/* + * This file holds USB constants and structures that are needed for USB + * device APIs. These are used by the USB device model, which is defined + * in chapter 9 of the USB 2.0 specification. Linux has several APIs in C + * that need these: + * + * - the master/host side Linux-USB kernel driver API; + * - the "usbfs" user space API; and + * - (eventually) a Linux slave/device side driver API. + * + * USB 2.0 adds an additional "On The Go" (OTG) mode, which lets systems + * act either as a USB master/host or as a USB slave/device. That means + * the master and slave side APIs will benefit from working well together. + */ + +#ifndef __LINUX_USB_CH9_H +#define __LINUX_USB_CH9_H + +#include /* __u8 etc */ + +/*-------------------------------------------------------------------------*/ + +/* CONTROL REQUEST SUPPORT */ + +/* + * USB directions + * + * This bit flag is used in endpoint descriptors' bEndpointAddress field. + * It's also one of three fields in control requests bRequestType. + */ +#define USB_DIR_OUT 0 /* to device */ +#define USB_DIR_IN 0x80 /* to host */ + +/* + * USB types, the second of three bRequestType fields + */ +#define USB_TYPE_MASK (0x03 << 5) +#define USB_TYPE_STANDARD (0x00 << 5) +#define USB_TYPE_CLASS (0x01 << 5) +#define USB_TYPE_VENDOR (0x02 << 5) +#define USB_TYPE_RESERVED (0x03 << 5) + +/* + * USB recipients, the third of three bRequestType fields + */ +#define USB_RECIP_MASK 0x1f +#define USB_RECIP_DEVICE 0x00 +#define USB_RECIP_INTERFACE 0x01 +#define USB_RECIP_ENDPOINT 0x02 +#define USB_RECIP_OTHER 0x03 + +/* + * Standard requests, for the bRequest field of a SETUP packet. + * + * These are qualified by the bRequestType field, so that for example + * TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved + * by a GET_STATUS request. + */ +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +#define USB_REQ_SET_FEATURE 0x03 +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + + +/** + * struct usb_ctrlrequest - SETUP data for a USB device control request + * @bRequestType: matches the USB bmRequestType field + * @bRequest: matches the USB bRequest field + * @wValue: matches the USB wValue field (le16 byte order) + * @wIndex: matches the USB wIndex field (le16 byte order) + * @wLength: matches the USB wLength field (le16 byte order) + * + * This structure is used to send control requests to a USB device. It matches + * the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the + * USB spec for a fuller description of the different fields, and what they are + * used for. + * + * Note that the driver for any interface can issue control requests. + * For most devices, interfaces don't coordinate with each other, so + * such requests may be made at any time. + */ +struct usb_ctrlrequest { + __u8 bRequestType; + __u8 bRequest; + __u16 wValue; + __u16 wIndex; + __u16 wLength; +} __attribute__ ((packed)); + +/*-------------------------------------------------------------------------*/ + +/* + * STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or + * (rarely) accepted by SET_DESCRIPTOR. + * + * Note that all multi-byte values here are encoded in little endian + * byte order. + */ + +/* + * Descriptor types ... USB 2.0 spec table 9.5 + */ +#define USB_DT_DEVICE 0x01 +#define USB_DT_CONFIG 0x02 +#define USB_DT_STRING 0x03 +#define USB_DT_INTERFACE 0x04 +#define USB_DT_ENDPOINT 0x05 +#define USB_DT_DEVICE_QUALIFIER 0x06 +#define USB_DT_OTHER_SPEED_CONFIG 0x07 +#define USB_DT_INTERFACE_POWER 0x08 + +/* All standard descriptors have these 2 fields at the beginning */ +struct usb_descriptor_header { + __u8 bLength; + __u8 bDescriptorType; +} __attribute__ ((packed)); + + +/* USB_DT_DEVICE: Device descriptor */ +struct usb_device_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u16 bcdUSB; + __u8 bDeviceClass; + __u8 bDeviceSubClass; + __u8 bDeviceProtocol; + __u8 bMaxPacketSize0; + __u16 idVendor; + __u16 idProduct; + __u16 bcdDevice; + __u8 iManufacturer; + __u8 iProduct; + __u8 iSerialNumber; + __u8 bNumConfigurations; +} __attribute__ ((packed)); + + +/* + * Device and/or Interface Class codes + * as found in device and interface descriptors + * and defined by www.usb.org documents + */ +#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ +#define USB_CLASS_AUDIO 1 +#define USB_CLASS_COMM 2 +#define USB_CLASS_HID 3 +#define USB_CLASS_PHYSICAL 5 +#define USB_CLASS_STILL_IMAGE 6 +#define USB_CLASS_PRINTER 7 +#define USB_CLASS_MASS_STORAGE 8 +#define USB_CLASS_HUB 9 +#define USB_CLASS_CDC_DATA 0x0a +#define USB_CLASS_CSCID 0x0b /* chip+ smart card */ +#define USB_CLASS_CONTENT_SEC 0x0d /* content security */ +#define USB_CLASS_APP_SPEC 0xfe +#define USB_CLASS_VENDOR_SPEC 0xff + +// FIXME include struct usb_config_descriptor + +/* USB_DT_STRING: String descriptor */ +struct usb_string_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u16 wData[1]; /* UTF-16LE encoded */ +} __attribute__ ((packed)); + +// FIXME include struct usb_interface_descriptor + +// FIXME include struct usb_endpoint_descriptor + +/* + * Endpoints + */ +#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ +#define USB_ENDPOINT_DIR_MASK 0x80 + +#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ +#define USB_ENDPOINT_XFER_CONTROL 0 +#define USB_ENDPOINT_XFER_ISOC 1 +#define USB_ENDPOINT_XFER_BULK 2 +#define USB_ENDPOINT_XFER_INT 3 + + +/* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */ +struct usb_qualifier_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u16 bcdUSB; + __u8 bDeviceClass; + __u8 bDeviceSubClass; + __u8 bDeviceProtocol; + __u8 bMaxPacketSize0; + __u8 bNumConfigurations; + __u8 bRESERVED; +} __attribute__ ((packed)); + + +/*-------------------------------------------------------------------------*/ + +/* USB 2.0 defines three speeds, here's how Linux identifies them */ + +enum usb_device_speed { + USB_SPEED_UNKNOWN = 0, /* enumerating */ + USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */ + USB_SPEED_HIGH /* usb 2.0 */ +}; + +#endif /* __LINUX_USB_CH9_H */ diff -Nru a/init/Makefile b/init/Makefile --- a/init/Makefile Mon Oct 28 16:32:36 2002 +++ b/init/Makefile Mon Oct 28 16:32:36 2002 @@ -11,13 +11,13 @@ # dependencies on generated files need to be listed explicitly -$(obj)/version.o: $(obj)/../include/linux/compile.h +$(obj)/version.o: include/linux/compile.h # compile.h changes depending on hostname, generation number, etc, # so we regenerate it always. # mkcompile_h will make sure to only update the # actual file if its content has changed. -$(obj)/../include/linux/compile.h: FORCE - @echo -n ' Generating $(echo_target)' - @sh $(srctree)/scripts/mkcompile_h $@ "$(ARCH)" "$(CONFIG_SMP)" "$(CC) $(CFLAGS)" +include/linux/compile.h: FORCE + @echo -n ' Generating $@' + @sh $(srctree)/scripts/mkcompile_h $@ "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CC) $(CFLAGS)" diff -Nru a/kernel/rcupdate.c b/kernel/rcupdate.c --- a/kernel/rcupdate.c Mon Oct 28 16:32:35 2002 +++ b/kernel/rcupdate.c Mon Oct 28 16:32:35 2002 @@ -192,7 +192,8 @@ void rcu_check_callbacks(int cpu, int user) { if (user || - (idle_cpu(cpu) && !in_softirq() && hardirq_count() <= 1)) + (idle_cpu(cpu) && !in_softirq() && + hardirq_count() <= (1 << HARDIRQ_SHIFT))) RCU_qsctr(cpu)++; tasklet_schedule(&RCU_tasklet(cpu)); } diff -Nru a/mm/highmem.c b/mm/highmem.c --- a/mm/highmem.c Mon Oct 28 16:32:37 2002 +++ b/mm/highmem.c Mon Oct 28 16:32:37 2002 @@ -366,34 +366,13 @@ return 0; } -void blk_queue_bounce(request_queue_t *q, struct bio **bio_orig) +void __blk_queue_bounce(request_queue_t *q, struct bio **bio_orig, int bio_gfp, + mempool_t *pool) { struct page *page; struct bio *bio = NULL; - int i, rw = bio_data_dir(*bio_orig), bio_gfp; + int i, rw = bio_data_dir(*bio_orig); struct bio_vec *to, *from; - mempool_t *pool; - unsigned long pfn = q->bounce_pfn; - int gfp = q->bounce_gfp; - - BUG_ON((*bio_orig)->bi_idx); - - /* - * for non-isa bounce case, just check if the bounce pfn is equal - * to or bigger than the highest pfn in the system -- in that case, - * don't waste time iterating over bio segments - */ - if (!(gfp & GFP_DMA)) { - if (pfn >= blk_max_pfn) - return; - - bio_gfp = GFP_NOHIGHIO; - pool = page_pool; - } else { - BUG_ON(!isa_page_pool); - bio_gfp = GFP_NOIO; - pool = isa_page_pool; - } bio_for_each_segment(from, *bio_orig, i) { page = from->bv_page; @@ -401,7 +380,7 @@ /* * is destination page below bounce pfn? */ - if ((page - page_zone(page)->zone_mem_map) + (page_zone(page)->zone_start_pfn) < pfn) + if ((page - page_zone(page)->zone_mem_map) + (page_zone(page)->zone_start_pfn) < q->bounce_pfn) continue; /* @@ -412,11 +391,11 @@ to = bio->bi_io_vec + i; - to->bv_page = mempool_alloc(pool, gfp); + to->bv_page = mempool_alloc(pool, q->bounce_gfp); to->bv_len = from->bv_len; to->bv_offset = from->bv_offset; - if (rw & WRITE) { + if (rw == WRITE) { char *vto, *vfrom; vto = page_address(to->bv_page) + to->bv_offset; @@ -437,15 +416,16 @@ * pages */ bio_for_each_segment(from, *bio_orig, i) { - to = &bio->bi_io_vec[i]; + to = bio_iovec_idx(bio, i); if (!to->bv_page) { to->bv_page = from->bv_page; to->bv_len = from->bv_len; - to->bv_offset = to->bv_offset; + to->bv_offset = from->bv_offset; } } bio->bi_bdev = (*bio_orig)->bi_bdev; + bio->bi_flags |= (1 << BIO_BOUNCED); bio->bi_sector = (*bio_orig)->bi_sector; bio->bi_rw = (*bio_orig)->bi_rw; @@ -454,19 +434,48 @@ bio->bi_size = (*bio_orig)->bi_size; if (pool == page_pool) { - if (rw & WRITE) - bio->bi_end_io = bounce_end_io_write; - else + bio->bi_end_io = bounce_end_io_write; + if (rw == READ) bio->bi_end_io = bounce_end_io_read; } else { - if (rw & WRITE) - bio->bi_end_io = bounce_end_io_write_isa; - else + bio->bi_end_io = bounce_end_io_write_isa; + if (rw == READ) bio->bi_end_io = bounce_end_io_read_isa; } bio->bi_private = *bio_orig; *bio_orig = bio; +} + +inline void blk_queue_bounce(request_queue_t *q, struct bio **bio_orig) +{ + mempool_t *pool; + int bio_gfp; + + BUG_ON((*bio_orig)->bi_idx); + + /* + * for non-isa bounce case, just check if the bounce pfn is equal + * to or bigger than the highest pfn in the system -- in that case, + * don't waste time iterating over bio segments + */ + if (!(q->bounce_gfp & GFP_DMA)) { + if (q->bounce_pfn >= blk_max_pfn) + return; + + bio_gfp = GFP_NOHIGHIO; + pool = page_pool; + } else { + BUG_ON(!isa_page_pool); + + bio_gfp = GFP_NOIO; + pool = isa_page_pool; + } + + /* + * slow path + */ + __blk_queue_bounce(q, bio_orig, bio_gfp, pool); } #if defined(CONFIG_DEBUG_HIGHMEM) && defined(CONFIG_HIGHMEM) diff -Nru a/mm/mempool.c b/mm/mempool.c --- a/mm/mempool.c Mon Oct 28 16:32:37 2002 +++ b/mm/mempool.c Mon Oct 28 16:32:37 2002 @@ -259,8 +259,25 @@ pool->free(element, pool->pool_data); } +/* + * A commonly used alloc and free fn. + */ +void *mempool_alloc_slab(int gfp_mask, void *pool_data) +{ + kmem_cache_t *mem = (kmem_cache_t *) pool_data; + return kmem_cache_alloc(mem, gfp_mask); +} + +void mempool_free_slab(void *element, void *pool_data) +{ + kmem_cache_t *mem = (kmem_cache_t *) pool_data; + kmem_cache_free(mem, element); +} + EXPORT_SYMBOL(mempool_create); EXPORT_SYMBOL(mempool_resize); EXPORT_SYMBOL(mempool_destroy); EXPORT_SYMBOL(mempool_alloc); EXPORT_SYMBOL(mempool_free); +EXPORT_SYMBOL(mempool_alloc_slab); +EXPORT_SYMBOL(mempool_free_slab); diff -Nru a/net/appletalk/Makefile b/net/appletalk/Makefile --- a/net/appletalk/Makefile Mon Oct 28 16:32:37 2002 +++ b/net/appletalk/Makefile Mon Oct 28 16:32:37 2002 @@ -8,7 +8,6 @@ appletalk-y := aarp.o ddp.o atalk_proc.o appletalk-$(CONFIG_SYSCTL) += sysctl_net_atalk.o -appletalk-objs := $(appletalk-y) include $(TOPDIR)/Rules.make diff -Nru a/net/ax25/Makefile b/net/ax25/Makefile --- a/net/ax25/Makefile Mon Oct 28 16:32:35 2002 +++ b/net/ax25/Makefile Mon Oct 28 16:32:35 2002 @@ -11,7 +11,6 @@ ax25_subr.o ax25_timer.o ax25_uid.o af_ax25.o ax25-$(CONFIG_AX25_DAMA_SLAVE) += ax25_ds_in.o ax25_ds_subr.o ax25_ds_timer.o ax25-$(CONFIG_SYSCTL) += sysctl_net_ax25.o -ax25-objs := $(ax25-y) include $(TOPDIR)/Rules.make diff -Nru a/net/bluetooth/rfcomm/Makefile b/net/bluetooth/rfcomm/Makefile --- a/net/bluetooth/rfcomm/Makefile Mon Oct 28 16:32:37 2002 +++ b/net/bluetooth/rfcomm/Makefile Mon Oct 28 16:32:37 2002 @@ -4,8 +4,7 @@ obj-$(CONFIG_BT_RFCOMM) += rfcomm.o -rfcomm-y := core.o sock.o crc.o +rfcomm-y := core.o sock.o crc.o rfcomm-$(CONFIG_BT_RFCOMM_TTY) += tty.o -rfcomm-objs := $(rfcomm-y) include $(TOPDIR)/Rules.make diff -Nru a/net/decnet/Makefile b/net/decnet/Makefile --- a/net/decnet/Makefile Mon Oct 28 16:32:36 2002 +++ b/net/decnet/Makefile Mon Oct 28 16:32:36 2002 @@ -5,7 +5,6 @@ decnet-$(CONFIG_DECNET_ROUTER) += dn_fib.o dn_rules.o dn_table.o decnet-$(CONFIG_DECNET_FW) += dn_fw.o decnet-y += sysctl_net_decnet.o -decnet-objs := $(decnet-y) include $(TOPDIR)/Rules.make diff -Nru a/net/ipx/Makefile b/net/ipx/Makefile --- a/net/ipx/Makefile Mon Oct 28 16:32:37 2002 +++ b/net/ipx/Makefile Mon Oct 28 16:32:37 2002 @@ -6,6 +6,5 @@ ipx-y := af_ipx.o ipx_proc.o ipx-$(CONFIG_SYSCTL) += sysctl_net_ipx.o -ipx-objs := $(ipx-y) include $(TOPDIR)/Rules.make diff -Nru a/net/irda/Makefile b/net/irda/Makefile --- a/net/irda/Makefile Mon Oct 28 16:32:37 2002 +++ b/net/irda/Makefile Mon Oct 28 16:32:37 2002 @@ -15,6 +15,5 @@ discovery.o parameters.o irsyms.o irda-$(CONFIG_PROC_FS) += irproc.o irda-$(CONFIG_SYSCTL) += irsysctl.o -irda-objs := $(irda-y) include $(TOPDIR)/Rules.make diff -Nru a/net/llc/Makefile b/net/llc/Makefile --- a/net/llc/Makefile Mon Oct 28 16:32:37 2002 +++ b/net/llc/Makefile Mon Oct 28 16:32:37 2002 @@ -18,7 +18,6 @@ llc_main.o llc_s_ac.o llc_conn.o llc_c_st.o llc_stat.o llc_actn.o \ llc_s_ev.o llc_evnt.o llc_pdu.o llc_proc.o llc-$(CONFIG_LLC_UI) += af_llc.o -llc-objs := $(llc-y) # Objects that export symbols. export-objs := llc_if.o diff -Nru a/net/netrom/Makefile b/net/netrom/Makefile --- a/net/netrom/Makefile Mon Oct 28 16:32:37 2002 +++ b/net/netrom/Makefile Mon Oct 28 16:32:37 2002 @@ -7,7 +7,6 @@ netrom-y := af_netrom.o nr_dev.o nr_in.o nr_loopback.o \ nr_out.o nr_route.o nr_subr.o nr_timer.o netrom-$(CONFIG_SYSCTL) += sysctl_net_netrom.o -netrom-objs := $(netrom-y) include $(TOPDIR)/Rules.make diff -Nru a/net/rose/Makefile b/net/rose/Makefile --- a/net/rose/Makefile Mon Oct 28 16:32:37 2002 +++ b/net/rose/Makefile Mon Oct 28 16:32:37 2002 @@ -7,7 +7,6 @@ rose-y := af_rose.o rose_dev.o rose_in.o rose_link.o rose_loopback.o \ rose_out.o rose_route.o rose_subr.o rose_timer.o rose-$(CONFIG_SYSCTL) += sysctl_net_rose.o -rose-objs := $(rose-y) include $(TOPDIR)/Rules.make diff -Nru a/net/sctp/Makefile b/net/sctp/Makefile --- a/net/sctp/Makefile Mon Oct 28 16:32:38 2002 +++ b/net/sctp/Makefile Mon Oct 28 16:32:38 2002 @@ -23,6 +23,4 @@ sctp-$(subst m,y,$(CONFIG_IPV6)) += ipv6.o -sctp-objs := $(sctp-y) - include $(TOPDIR)/Rules.make diff -Nru a/net/sunrpc/Makefile b/net/sunrpc/Makefile --- a/net/sunrpc/Makefile Mon Oct 28 16:32:35 2002 +++ b/net/sunrpc/Makefile Mon Oct 28 16:32:35 2002 @@ -13,6 +13,5 @@ sunrpc_syms.o cache.o sunrpc-$(CONFIG_PROC_FS) += stats.o sunrpc-$(CONFIG_SYSCTL) += sysctl.o -sunrpc-objs := $(sunrpc-y) include $(TOPDIR)/Rules.make diff -Nru a/net/unix/Makefile b/net/unix/Makefile --- a/net/unix/Makefile Mon Oct 28 16:32:36 2002 +++ b/net/unix/Makefile Mon Oct 28 16:32:36 2002 @@ -6,7 +6,6 @@ unix-y := af_unix.o garbage.o unix-$(CONFIG_SYSCTL) += sysctl_net_unix.o -unix-objs := $(unix-y) include $(TOPDIR)/Rules.make diff -Nru a/net/x25/Makefile b/net/x25/Makefile --- a/net/x25/Makefile Mon Oct 28 16:32:35 2002 +++ b/net/x25/Makefile Mon Oct 28 16:32:35 2002 @@ -8,7 +8,6 @@ x25_link.o x25_out.o x25_route.o x25_subr.o \ x25_timer.o x25_proc.o x25-$(CONFIG_SYSCTL) += sysctl_net_x25.o -x25-objs := $(x25-y) include $(TOPDIR)/Rules.make diff -Nru a/scripts/Makefile.build b/scripts/Makefile.build --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/scripts/Makefile.build Mon Oct 28 16:32:38 2002 @@ -0,0 +1,223 @@ +# ========================================================================== +# Building +# ========================================================================== + +src := $(obj) + +.PHONY: __build +__build: + +include .config + +include $(obj)/Makefile + +include scripts/Makefile.lib + +ifdef O_TARGET +$(error kbuild: $(obj)/Makefile - Usage of O_TARGET := $(O_TARGET) is obsolete in 2.5. Please fix!) +endif + +ifdef L_TARGET +ifneq ($(L_TARGET),lib.a) +$(warning kbuild: $(obj)/Makefile - L_TARGET := $(L_TARGET) target shall be renamed to lib.a. Please fix!) +endif +endif + +ifdef list-multi +$(warning kbuild: $(obj)/Makefile - list-multi := $(list-multi) is obsolete in 2.5. Please fix!) +endif + +ifndef obj +$(warning kbuild: Makefile.build is included improperly) +endif + +# =========================================================================== + +# If a Makefile does not define a L_TARGET, link an object called "built-in.o" + +ifdef L_TARGET +L_TARGET := $(obj)/$(L_TARGET) +else +O_TARGET := $(obj)/built-in.o +endif + +__build: $(if $(KBUILD_BUILTIN),$(O_TARGET) $(L_TARGET) $(EXTRA_TARGETS)) \ + $(if $(KBUILD_MODULES),$(obj-m)) \ + $(subdir-ym) + @: + +# Compile C sources (.c) +# --------------------------------------------------------------------------- + +# Default is built-in, unless we know otherwise +modkern_cflags := $(CFLAGS_KERNEL) + +$(real-objs-m) : modkern_cflags := $(CFLAGS_MODULE) +$(real-objs-m:.o=.i) : modkern_cflags := $(CFLAGS_MODULE) +$(real-objs-m:.o=.lst): modkern_cflags := $(CFLAGS_MODULE) + +$(export-objs) : export_flags := $(EXPORT_FLAGS) +$(export-objs:.o=.i) : export_flags := $(EXPORT_FLAGS) +$(export-objs:.o=.s) : export_flags := $(EXPORT_FLAGS) +$(export-objs:.o=.lst): export_flags := $(EXPORT_FLAGS) + +c_flags = -Wp,-MD,$(depfile) $(CFLAGS) $(NOSTDINC_FLAGS) \ + $(modkern_cflags) $(EXTRA_CFLAGS) $(CFLAGS_$(*F).o) \ + -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) \ + $(export_flags) + +quiet_cmd_cc_s_c = CC $@ +cmd_cc_s_c = $(CC) $(c_flags) -S -o $@ $< + +%.s: %.c FORCE + $(call if_changed_dep,cc_s_c) + +quiet_cmd_cc_i_c = CPP $@ +cmd_cc_i_c = $(CPP) $(c_flags) -o $@ $< + +%.i: %.c FORCE + $(call if_changed_dep,cc_i_c) + +quiet_cmd_cc_o_c = CC $@ +cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< + +%.o: %.c FORCE + $(call if_changed_dep,cc_o_c) + +quiet_cmd_cc_lst_c = MKLST $@ +cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && sh scripts/makelst $*.o System.map $(OBJDUMP) > $@ + +%.lst: %.c FORCE + $(call if_changed_dep,cc_lst_c) + +# Compile assembler sources (.S) +# --------------------------------------------------------------------------- + +modkern_aflags := $(AFLAGS_KERNEL) + +$(real-objs-m) : modkern_aflags := $(AFLAGS_MODULE) +$(real-objs-m:.o=.s): modkern_aflags := $(AFLAGS_MODULE) + +a_flags = -Wp,-MD,$(depfile) $(AFLAGS) $(NOSTDINC_FLAGS) \ + $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(*F).o) + +quiet_cmd_as_s_S = CPP $@ +cmd_as_s_S = $(CPP) $(a_flags) -o $@ $< + +%.s: %.S FORCE + $(call if_changed_dep,as_s_S) + +quiet_cmd_as_o_S = AS $@ +cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< + +%.o: %.S FORCE + $(call if_changed_dep,as_o_S) + +targets += $(real-objs-y) $(real-objs-m) $(EXTRA_TARGETS) $(MAKECMDGOALS) + +# Build the compiled-in targets +# --------------------------------------------------------------------------- + +# To build objects in subdirs, we need to descend into the directories +$(sort $(subdir-obj-y)): $(subdir-ym) ; + +# +# Rule to compile a set of .o files into one .o file +# +ifdef O_TARGET +quiet_cmd_link_o_target = LD $@ +# If the list of objects to link is empty, just create an empty O_TARGET +cmd_link_o_target = $(if $(strip $(obj-y)),\ + $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) -r -o $@ $(filter $(obj-y), $^),\ + rm -f $@; $(AR) rcs $@) + +$(O_TARGET): $(obj-y) FORCE + $(call if_changed,link_o_target) + +targets += $(O_TARGET) +endif # O_TARGET + +# +# Rule to compile a set of .o files into one .a file +# +ifdef L_TARGET +quiet_cmd_link_l_target = AR $@ +cmd_link_l_target = rm -f $@; $(AR) $(EXTRA_ARFLAGS) rcs $@ $(obj-y) + +$(L_TARGET): $(obj-y) FORCE + $(call if_changed,link_l_target) + +targets += $(L_TARGET) +endif + +# +# Rule to link composite objects +# + +quiet_cmd_link_multi = LD $@ +cmd_link_multi = $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) -r -o $@ $(filter $(addprefix $(obj)/,$($(subst $(obj)/,,$(@:.o=-objs))) $($(subst $(obj)/,,$(@:.o=-y)))),$^) + +# We would rather have a list of rules like +# foo.o: $(foo-objs) +# but that's not so easy, so we rather make all composite objects depend +# on the set of all their parts +$(multi-used-y) : %.o: $(multi-objs-y) FORCE + $(call if_changed,link_multi) + +$(multi-used-m) : %.o: $(multi-objs-m) FORCE + $(call if_changed,link_multi) + +targets += $(multi-used-y) $(multi-used-m) + +# Compile programs on the host +# =========================================================================== + +quiet_cmd_host_cc__c = HOSTCC $@ +cmd_host_cc__c = $(HOSTCC) -Wp,-MD,$(depfile) \ + $(HOSTCFLAGS) $(HOST_EXTRACFLAGS) \ + $(HOST_LOADLIBES) -o $@ $< + +$(host-progs-single): %: %.c FORCE + $(call if_changed_dep,host_cc__c) + +quiet_cmd_host_cc_o_c = HOSTCC $@ +cmd_host_cc_o_c = $(HOSTCC) -Wp,-MD,$(depfile) \ + $(HOSTCFLAGS) $(HOST_EXTRACFLAGS) -c -o $@ $< + +$(host-progs-multi-objs): %.o: %.c FORCE + $(call if_changed_dep,host_cc_o_c) + +quiet_cmd_host_cc__o = HOSTLD $@ +cmd_host_cc__o = $(HOSTCC) $(HOSTLDFLAGS) -o $@ $(addprefix $(obj)/,$($(subst $(obj)/,,$@)-objs)) \ + $(HOST_LOADLIBES) + +$(host-progs-multi): %: $(host-progs-multi-objs) FORCE + $(call if_changed,host_cc__o) + +targets += $(host-progs-single) $(host-progs-multi-objs) $(host-progs-multi) + +# Descending +# --------------------------------------------------------------------------- + +.PHONY: $(subdir-ym) +$(subdir-ym): + $(Q)$(MAKE) -f scripts/Makefile.build obj=$@ + +# Add FORCE to the prequisites of a target to force it to be always rebuilt. +# --------------------------------------------------------------------------- + +.PHONY: FORCE + +FORCE: + +# Read all saved command lines and dependencies for the $(targets) we +# may be building above, using $(if_changed{,_dep}). As an +# optimization, we don't need to read them if the target does not +# exist, we will rebuild anyway in that case. + +targets := $(wildcard $(sort $(targets))) +cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) + +ifneq ($(cmd_files),) + include $(cmd_files) +endif diff -Nru a/scripts/Makefile.clean b/scripts/Makefile.clean --- a/scripts/Makefile.clean Mon Oct 28 16:32:35 2002 +++ b/scripts/Makefile.clean Mon Oct 28 16:32:35 2002 @@ -1,13 +1,17 @@ +# ========================================================================== +# Cleaning up +# ========================================================================== src := $(obj) -no-rules.make := 1 - .PHONY: __clean __clean: include $(obj)/Makefile +# Figure out what we need to build from the various variables +# ========================================================================== + __subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y))) subdir-y += $(__subdir-y) __subdir-m := $(patsubst %/,%,$(filter %/, $(obj-m))) @@ -17,26 +21,43 @@ __subdir- := $(patsubst %/,%,$(filter %/, $(obj-))) subdir- += $(__subdir-) +# Subdirectories we need to descend into + subdir-ym := $(sort $(subdir-y) $(subdir-m)) subdir-ymn := $(sort $(subdir-ym) $(subdir-n) $(subdir-)) +# Add subdir path + EXTRA_TARGETS := $(addprefix $(obj)/,$(EXTRA_TARGETS)) clean-files := $(addprefix $(obj)/,$(clean-files)) host-progs := $(addprefix $(obj)/,$(host-progs)) subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn)) +# ========================================================================== + __clean-files := $(wildcard $(EXTRA_TARGETS) $(host-progs) $(clean-files)) +quiet_cmd_clean = CLEAN $(obj) + cmd_clean = rm -f $(__clean-files); $(clean-rule) + __clean: $(subdir-ymn) ifneq ($(strip $(__clean-files) $(clean-rule)),) - rm -f $(__clean-files) - $(clean-rule) + +$(call cmd,clean) else @: endif -.PHONY: $(subdir-ymn) +# =========================================================================== +# Generic stuff +# =========================================================================== + +# Descending +# --------------------------------------------------------------------------- +.PHONY: $(subdir-ymn) $(subdir-ymn): - $(MAKE) -rR -f scripts/Makefile.clean obj=$@ + $(Q)$(MAKE) -f scripts/Makefile.clean obj=$@ + +# If quiet is set, only print short version of command +cmd = @$(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))' &&) $(cmd_$(1)) diff -Nru a/scripts/Makefile.lib b/scripts/Makefile.lib --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/scripts/Makefile.lib Mon Oct 28 16:32:38 2002 @@ -0,0 +1,190 @@ +# =========================================================================== +# kbuild: Generic definitions +# =========================================================================== + +# Standard vars + +comma := , + +# Figure out what we need to build from the various variables +# =========================================================================== + +# When an object is listed to be built compiled-in and modular, +# only build the compiled-in version + +obj-m := $(filter-out $(obj-y),$(obj-m)) + +# Handle objects in subdirs +# --------------------------------------------------------------------------- +# o if we encounter foo/ in $(obj-y), replace it by foo/built-in.o +# and add the directory to the list of dirs to descend into: $(subdir-y) +# o if we encounter foo/ in $(obj-m), remove it from $(obj-m) +# and add the directory to the list of dirs to descend into: $(subdir-m) + +__subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y))) +subdir-y += $(__subdir-y) +__subdir-m := $(patsubst %/,%,$(filter %/, $(obj-m))) +subdir-m += $(__subdir-m) +obj-y := $(patsubst %/, %/built-in.o, $(obj-y)) +obj-m := $(filter-out %/, $(obj-m)) + +# Subdirectories we need to descend into + +subdir-ym := $(sort $(subdir-y) $(subdir-m)) + +# export.o is never a composite object, since $(export-objs) has a +# fixed meaning (== objects which EXPORT_SYMBOL()) +__obj-y = $(filter-out export.o,$(obj-y)) +__obj-m = $(filter-out export.o,$(obj-m)) + +# if $(foo-objs) exists, foo.o is a composite object +multi-used-y := $(sort $(foreach m,$(__obj-y), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))), $(m)))) +multi-used-m := $(sort $(foreach m,$(__obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))), $(m)))) + +# Build list of the parts of our composite objects, our composite +# objects depend on those (obviously) +multi-objs-y := $(foreach m, $(multi-used-y), $($(m:.o=-objs)) $($(m:.o=-y))) +multi-objs-m := $(foreach m, $(multi-used-m), $($(m:.o=-objs)) $($(m:.o=-y))) + +# $(subdir-obj-y) is the list of objects in $(obj-y) which do not live +# in the local directory +subdir-obj-y := $(foreach o,$(obj-y),$(if $(filter-out $(o),$(notdir $(o))),$(o))) + +# Replace multi-part objects by their individual parts, look at local dir only +real-objs-y := $(foreach m, $(filter-out $(subdir-obj-y), $(obj-y)), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))),$($(m:.o=-objs)) $($(m:.o=-y)),$(m))) $(EXTRA_TARGETS) +real-objs-m := $(foreach m, $(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))),$($(m:.o=-objs)) $($(m:.o=-y)),$(m))) + +# Only build module versions for files which are selected to be built +export-objs := $(filter $(export-objs),$(real-objs-y) $(real-objs-m)) + +host-progs-single := $(foreach m,$(host-progs),$(if $($(m)-objs),,$(m))) +host-progs-multi := $(foreach m,$(host-progs),$(if $($(m)-objs),$(m))) +host-progs-multi-objs := $(foreach m,$(host-progs-multi),$($(m)-objs)) + +# Add subdir path + +EXTRA_TARGETS := $(addprefix $(obj)/,$(EXTRA_TARGETS)) +obj-y := $(addprefix $(obj)/,$(obj-y)) +obj-m := $(addprefix $(obj)/,$(obj-m)) +export-objs := $(addprefix $(obj)/,$(export-objs)) +subdir-obj-y := $(addprefix $(obj)/,$(subdir-obj-y)) +real-objs-y := $(addprefix $(obj)/,$(real-objs-y)) +real-objs-m := $(addprefix $(obj)/,$(real-objs-m)) +multi-used-y := $(addprefix $(obj)/,$(multi-used-y)) +multi-used-m := $(addprefix $(obj)/,$(multi-used-m)) +multi-objs-y := $(addprefix $(obj)/,$(multi-objs-y)) +multi-objs-m := $(addprefix $(obj)/,$(multi-objs-m)) +subdir-ym := $(addprefix $(obj)/,$(subdir-ym)) +host-progs := $(addprefix $(obj)/,$(host-progs)) +host-progs-single := $(addprefix $(obj)/,$(host-progs-single)) +host-progs-multi := $(addprefix $(obj)/,$(host-progs-multi)) +host-progs-multi-objs := $(addprefix $(obj)/,$(host-progs-multi-objs)) + +# The temporary file to save gcc -MD generated dependencies must not +# contain a comma +depfile = $(subst $(comma),_,$(@D)/.$(@F).d) + +# Shipped files +# =========================================================================== + +quiet_cmd_shipped = SHIPPED $@ +cmd_shipped = cat $< > $@ + +%:: %_shipped + $(call cmd,shipped) + +# Commands useful for building a boot image +# =========================================================================== +# +# Use as following: +# +# target: source(s) FORCE +# $(if_changed,ld/objcopy/gzip) +# +# and add target to EXTRA_TARGETS so that we know we have to +# read in the saved command line + +# Linking +# --------------------------------------------------------------------------- + +quiet_cmd_ld = LD $@ +cmd_ld = $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) $(LDFLAGS_$(@F)) \ + $(filter-out FORCE,$^) -o $@ + +# Objcopy +# --------------------------------------------------------------------------- + +quiet_cmd_objcopy = OBJCOPY $@ +cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ + +# Gzip +# --------------------------------------------------------------------------- + +quiet_cmd_gzip = GZIP $@ +cmd_gzip = gzip -f -9 < $< > $@ + +# =========================================================================== +# Generic stuff +# =========================================================================== + +# function to only execute the passed command if necessary + +if_changed = $(if $(strip $? \ + $(filter-out $(cmd_$(1)),$(cmd_$@))\ + $(filter-out $(cmd_$@),$(cmd_$(1)))),\ + @set -e; \ + $(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))';) \ + $(cmd_$(1)); \ + echo 'cmd_$@ := $(cmd_$(1))' > $(@D)/.$(@F).cmd) + + +# execute the command and also postprocess generated .d dependencies +# file + +if_changed_dep = $(if $(strip $? $(filter-out FORCE $(wildcard $^),$^)\ + $(filter-out $(cmd_$(1)),$(cmd_$@))\ + $(filter-out $(cmd_$@),$(cmd_$(1)))),\ + @set -e; \ + $(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))';) \ + $(cmd_$(1)); \ + scripts/fixdep $(depfile) $@ '$(cmd_$(1))' > $(@D)/.$(@F).tmp; \ + rm -f $(depfile); \ + mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd) + +# Usage: $(call if_changed_rule,foo) +# will check if $(cmd_foo) changed, or any of the prequisites changed, +# and if so will execute $(rule_foo) + +if_changed_rule = $(if $(strip $? \ + $(filter-out $(cmd_$(1)),$(cmd_$@))\ + $(filter-out $(cmd_$@),$(cmd_$(1)))),\ + @set -e; \ + mkdir -p $(dir $@); \ + $(rule_$(1))) + +# If quiet is set, only print short version of command + +cmd = @$(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))' &&) $(cmd_$(1)) + +# do_cmd is a shorthand used to support both compressed, verbose +# and silent output in a single line. +# Compared to cmd described avobe, do_cmd does no rely on any variables +# previously assigned a value. +# +# Usage $(call do_cmd,CMD $@,cmd_to_execute bla bla) +# Example: +# $(call do_cmd,CP $@,cp -b $< $@) +# make -s => nothing will be printed +# make KBUILD_VERBOSE=1 => cp -b path/to/src.file path/to/dest.file +# make KBUILD_VERBOSE=0 => CP path/to/dest.file +define do_cmd + @$(if $(filter quiet_,$(quiet)), echo ' $(1)' &&, + $(if $(filter silent_,$(quiet)),, + echo "$(2)" &&)) \ + $(2) +endef + +# $(call descend,,) +# Recursively call a sub-make in with target + +descend = $(Q)$(MAKE) -f scripts/Makefile.build obj=$(1) $(2) diff -Nru a/scripts/Makefile.modinst b/scripts/Makefile.modinst --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/scripts/Makefile.modinst Mon Oct 28 16:32:38 2002 @@ -0,0 +1,34 @@ +# ========================================================================== +# Installing modules +# ========================================================================== + +src := $(obj) + +.PHONY: modules_install +modules_install: + +include .config + +include $(obj)/Makefile + +include scripts/Makefile.lib + +# ========================================================================== + +quiet_cmd_modules_install = INSTALL $(obj-m) + cmd_modules_install = mkdir -p $(MODLIB)/kernel/$(obj); \ + cp $(obj-m) $(MODLIB)/kernel/$(obj) + +modules_install: $(subdir-ym) +ifneq ($(obj-m),) + $(call cmd,modules_install) +else + @: +endif + +# Descending +# --------------------------------------------------------------------------- + +.PHONY: $(subdir-ym) +$(subdir-ym): + $(Q)$(MAKE) -rR -f scripts/Makefile.modinst obj=$@ diff -Nru a/scripts/Makefile.modver b/scripts/Makefile.modver --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/scripts/Makefile.modver Mon Oct 28 16:32:38 2002 @@ -0,0 +1,123 @@ +# =========================================================================== +# Module versions +# =========================================================================== + +src := $(obj) + +.PHONY: modver +modver: + +include .config + +include $(obj)/Makefile + +include scripts/Makefile.lib + +# =========================================================================== + +ifeq ($(strip $(export-objs)),) + +# If we don't export any symbols in this dir, just descend +# --------------------------------------------------------------------------- + +modver: $(subdir-ym) + @: + +else + +# This sets version suffixes on exported symbols +# --------------------------------------------------------------------------- + +MODVERDIR := include/linux/modules + +# +# Added the SMP separator to stop module accidents between uniprocessor +# and SMP Intel boxes - AC - from bits by Michael Chastain +# + +ifdef CONFIG_SMP + genksyms_smp_prefix := -p smp_ +else + genksyms_smp_prefix := +endif + +# Don't include modversions.h, we're just about to generate it here. + +CFLAGS_MODULE := $(filter-out -include include/linux/modversions.h,$(CFLAGS_MODULE)) + +$(addprefix $(MODVERDIR)/,$(real-objs-y:.o=.ver)): modkern_cflags := $(CFLAGS_KERNEL) +$(addprefix $(MODVERDIR)/,$(real-objs-m:.o=.ver)): modkern_cflags := $(CFLAGS_MODULE) +$(addprefix $(MODVERDIR)/,$(export-objs:.o=.ver)): export_flags := -D__GENKSYMS__ + +c_flags = -Wp,-MD,$(depfile) $(CFLAGS) $(NOSTDINC_FLAGS) \ + $(modkern_cflags) $(EXTRA_CFLAGS) $(CFLAGS_$(*F).o) \ + -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) \ + $(export_flags) + +# Our objects only depend on modversions.h, not on the individual .ver +# files (fix-dep filters them), so touch modversions.h if any of the .ver +# files changes + +quiet_cmd_cc_ver_c = MKVER include/linux/modules/$*.ver +cmd_cc_ver_c = $(CPP) $(c_flags) $< | $(GENKSYMS) $(genksyms_smp_prefix) \ + -k $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) > $@.tmp + +# Okay, let's explain what's happening in rule_make_cc_ver_c: +# o echo the command +# o execute the command +# o If the $(CPP) fails, we won't notice because it's output is piped +# to $(GENKSYMS) which does not fail. We recognize this case by +# looking if the generated $(depfile) exists, though. +# o If the .ver file changed, touch modversions.h, which is our marker +# of any changed .ver files. +# o Move command line and deps into their normal .*.cmd place. + +define rule_cc_ver_c + $(if $($(quiet)cmd_cc_ver_c),echo ' $($(quiet)cmd_cc_ver_c)';) \ + $(cmd_cc_ver_c); \ + if [ ! -r $(depfile) ]; then exit 1; fi; \ + scripts/fixdep $(depfile) $@ '$(cmd_cc_ver_c)' > $(@D)/.$(@F).tmp; \ + rm -f $(depfile); \ + if [ ! -r $@ ] || cmp -s $@ $@.tmp; then \ + touch include/linux/modversions.h; \ + fi; \ + mv -f $@.tmp $@ + mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd +endef + +targets := $(addprefix $(MODVERDIR)/,$(export-objs:.o=.ver)) + +$(MODVERDIR)/%.ver: %.c FORCE + @$(call if_changed_rule,cc_ver_c) + +modver: $(targets) $(subdir-ym) + @mkdir -p $(dir $(addprefix .tmp_export-objs/modules/,$(export-objs:.o=.ver))) + @touch $(addprefix .tmp_export-objs/modules/,$(export-objs:.o=.ver)) + +endif # export-objs + +# Descending +# --------------------------------------------------------------------------- + +.PHONY: $(subdir-ym) +$(subdir-ym): + $(Q)$(MAKE) -f scripts/Makefile.modver obj=$@ + +# Add FORCE to the prequisites of a target to force it to be always rebuilt. +# --------------------------------------------------------------------------- + +.PHONY: FORCE + +FORCE: + +# Read all saved command lines and dependencies for the $(targets) we +# may be building above, using $(if_changed{,_dep}). As an +# optimization, we don't need to read them if the target does not +# exist, we will rebuild anyway in that case. + +targets := $(wildcard $(sort $(targets))) +cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) + +ifneq ($(cmd_files),) + include $(cmd_files) +endif diff -Nru a/scripts/ver_linux b/scripts/ver_linux --- a/scripts/ver_linux Mon Oct 28 16:32:37 2002 +++ b/scripts/ver_linux Mon Oct 28 16:32:37 2002 @@ -4,7 +4,7 @@ # /bin /sbin /usr/bin /usr/sbin /usr/local/bin, but it may # differ on your system. # -PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH +PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:$PATH echo 'If some fields are empty or look unusual you may have an old version.' echo 'Compare to the current minimal requirements in Documentation/Changes.' echo ' ' @@ -12,7 +12,11 @@ uname -a echo ' ' -echo "Gnu C " `gcc --version` +gcc --version 2>&1| head -n 1 | grep -v gcc | awk \ +'NR==1{print "Gnu C ", $1}' + +gcc --version 2>&1| grep gcc | awk \ +'NR==1{print "Gnu C ", $3}' make --version 2>&1 | awk -F, '{print $1}' | awk \ '/GNU Make/{print "Gnu make ",$NF}' @@ -29,8 +33,14 @@ tune2fs 2>&1 | grep "^tune2fs" | sed 's/,//' | awk \ 'NR==1 {print "e2fsprogs ", $2}' -reiserfsck 2>&1 | grep reiserfsprogs | awk \ +fsck.jfs -V 2>&1 | grep version | sed 's/,//' | awk \ +'NR==1 {print "jfsutils ", $3}' + +reiserfsck -V 2>&1 | grep reiserfsprogs | awk \ 'NR==1{print "reiserfsprogs ", $NF}' + +xfs_db -V 2>&1 | grep version | awk \ +'NR==1{print "xfsprogs ", $3}' cardmgr -V 2>&1| grep version | awk \ 'NR==1{print "pcmcia-cs ", $3}'